diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..209bd2606d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +## Editor configuration, see http://editorconfig.org +# Syntax at: https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.java] +indent_size = 4 + +[*.js] +indent_size = 3 + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..8dbdd4288b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# Shell scripts require LF +*.sh text eol=lf +Dockerfile text eol=lf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..6cfd3decee --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,399 @@ +name: alfresco_enterprise_share + +on: + push: + branches: + - master + - "fix/**" + - "feature/**" + - "release/**" + pull_request: + branches: + - master + - "release/**" + workflow_call: + workflow_dispatch: + inputs: + commitMessage: + description: Enter the Commit Message + required: true +env: + SYNC_TAG_NAME: 3.4.0-A1 + HOSTED_ZONE: dev.envalfresco.com + KEEP_ENV: false + TAS_SCRIPTS: ../alfresco-community-repo/packaging/tests/scripts + TAS_ENVIRONMENT: ./packaging/tests/environment + MAVEN_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} + MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} + QUAY_PASSWORD: ${{ secrets.QUAY_PASSWORD }} + QUAY_USERNAME: ${{ secrets.QUAY_USERNAME }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} + BRANCH_NAME: ${{ github.ref_name }} + GIT_PASSWORD: ${{ secrets.BOT_GITHUB_TOKEN }} + GIT_EMAIL: ${{ secrets.BOT_GITHUB_EMAIL }} + GIT_USERNAME: ${{ secrets.BOT_GITHUB_USERNAME }} + S3_BUCKET_REGION: "us-east-1" + S3_BUCKET2_NAME: "travis-ags-worm-b2" + ALFRESCO_URL: "http://localhost:8080/alfresco/" + SHARE_URL: "http://localhost:8181/share" + DISPLAY: :99.0 + WEBDRIVER_ARGUMENTS: '-Dwebdriver.local.grid=true -Dwebdriver.browser=RemoteFireFox -Dwebdriver.localGrid=false -Dorg.alfresco.rm.timeout_seconds.MEDIUM=30' + ALF_PWD: ${{ secrets.ALF_PWD }} + ARTIFACTS_BUCKET: ${{ secrets.ARTIFACTS_BUCKET }} + ARTIFACTS_KEY: ${{ secrets.ARTIFACTS_KEY }} + ARTIFACTS_SECRET: ${{ secrets.ARTIFACTS_SECRET }} + MASTER_URL: ${{ secrets.MASTER_URL }} + SSL_CERT: ${{ secrets.SSL_CERT }} + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' + CLUSTER_NAME: "acs-cluster" + RANCHER2_URL: ${{ secrets.RANCHER2_URL }} + RANCHER2_ACCESS_KEY: ${{ secrets.RANCHER2_ACCESS_KEY }} + RANCHER2_SECRET_KEY: ${{ secrets.RANCHER2_SECRET_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + ACS_CLUSTER_AWS_ACCESS_KEY_ID: ${{ secrets.ACS_CLUSTER_AWS_ACCESS_KEY_ID }} + ACS_CLUSTER_AWS_SECRET_ACCESS_KEY: ${{ secrets.ACS_CLUSTER_AWS_SECRET_ACCESS_KEY }} + AGS_AWS_ACCESS_KEY_ID: ${{ secrets.AGS_AWS_ACCESS_KEY_ID }} + AGS_AWS_SECRET_ACCESS_KEY: ${{ secrets.AGS_AWS_SECRET_ACCESS_KEY }} + GITHUB_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + GITHUB_ACTIONS_DEPLOY_TIMEOUT: 90 + SRCCLR_API_TOKEN: ${{ secrets.SRCCLR_API_TOKEN }} + +jobs: + lint: + if: (!contains(github.event.head_commit.message, '[no lint]') && inputs.commitMessage != '[no lint]') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/pre-commit@v1.4.0 + + build: + runs-on: ubuntu-latest + if: > + !contains(github.event.head_commit.message, '[no build]') && + inputs.commitMessage != '[no build]' && + !contains(github.event.head_commit.message, '[force]') && + inputs.commitMessage != '[force]' + needs: lint + strategy: + matrix: + stage: [ source_clear ] + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: "Init" + run: bash scripts/travis/init.sh + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Prepare before Test" + run: | + export TAG_NAME="$(echo "${BRANCH_NAME}" | tr / - )" + export NAMESPACE="travis-share-$GITHUB_RUN_NUMBER" + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - name: "Build" + timeout-minutes: ${{ fromJSON(env.GITHUB_ACTIONS_DEPLOY_TIMEOUT) }} + run: bash scripts/travis/build.sh + - name: Run ${{ matrix.stage }} + if: ${{ ( matrix.stage != 'source_clear' && github.ref_name != 'company_release') || matrix.stage == 'source_clear' }} + run: | + bash scripts/travis/${{ matrix.stage }}.sh + + deploy: + runs-on: ubuntu-latest + needs: build + if: > + ((!contains(github.event.head_commit.message, '[skip tests]') + && inputs.commitMessage != '[skip tests]') || (contains(github.event.head_commit.message, '[delete env]') || + inputs.commitMessage == '[delete env]')) + && + ((contains(github.event.head_commit.message, '[create env]') || + inputs.commitMessage == '[create env]')) + && + ((!contains(github.event.head_commit.message, '[force]') + && inputs.commitMessage != '[force]')) + && + (github.event.repository.fork==false) + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - uses: azure/setup-kubectl@v2.0 + - name: "Configure AWS credentials for Cluster" + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.ACS_CLUSTER_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.ACS_CLUSTER_AWS_SECRET_ACCESS_KEY }} + aws-region: eu-west-1 + - name: "Init" + run: bash scripts/travis/init.sh + - name: show namespaces statuses + run: kubectl get all --all-namespaces + - name: "Deploy on K8s" + timeout-minutes: ${{ fromJSON(env.GITHUB_ACTIONS_DEPLOY_TIMEOUT) }} + run: bash scripts/travis/deploy_k8s.sh + + test: + runs-on: ubuntu-latest + needs: build + if: > + !contains(github.event.head_commit.message, '[skip tests]') && + inputs.commitMessage != '[skip tests]' && + !contains(github.event.head_commit.message, '[force]') && + inputs.commitMessage != '[force]' + && + github.event.repository.fork==false + strategy: + fail-fast: false + matrix: + test: [ user, user-and-site-dashboard, admin-tools, content-actions, content-filters ] + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Init" + run: bash scripts/travis/init.sh + - name: "Prepare before Test" + run: | + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - name: Build Docker image + run: | + export TAG_NAME="latest" + bash scripts/travis/create_swap.sh "5" + bash scripts/travis/build.sh + - name: Start Alfresco + run: bash amps/ags/travis/scripts/startAlfresco.sh packaging/docker/docker-compose + - name: Wait for Alfresco to start + run: | + bash amps/ags/travis/scripts/waitForAlfrescoToStart.sh + sudo free -m -t + - name: Run ${{ matrix.test }} Test + uses: nick-fields/retry@v2 + with: + timeout_minutes: ${{ fromJSON(env.GITHUB_ACTIONS_DEPLOY_TIMEOUT) }} + max_attempts: 3 + retry_wait_seconds: 60 + retry_on: error + command: sudo --preserve-env bash scripts/travis/execute_share_web_docker.sh "${{ matrix.test }}-tests.xml" + - name: "Upload artifacts" + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.test }}-tests + path: alfresco-tas-share-test/target/surefire-reports alfresco-tas-share-test/target/reports + target-path: share/${{ env.GITHUB_RUN_NUMBER }}/content-actions-tests + + community_shared_UI_configuration: + runs-on: ubuntu-latest + if: > + !contains(github.event.head_commit.message, '[skip tests]') && + inputs.commitMessage != '[skip tests]' && + !contains(github.event.head_commit.message, '[force]') && + inputs.commitMessage != '[force]' + && + github.event.repository.fork == false + && + (!contains(github.event.head_commit.message, '[skip ags]') && + inputs.commitMessage != '[skip ags]') + && + (contains(github.event.head_commit.message, '[community ags]') || + inputs.commitMessage == '[community ags]') + needs: build + strategy: + fail-fast: false + matrix: + test: [communitySmokeRMSite, communityLevel2Tests, communityL2AuditRulesDashboardNodeBrowserTests] + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Init" + run: bash scripts/travis/init.sh + - name: "Prepare before Test" + run: | + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - name: Build Docker image + run: | + export TAG_NAME="latest" + bash scripts/travis/create_swap.sh "5" + bash scripts/travis/build.sh + - name: Tag Docker image + run: | + docker images + docker image tag alfresco/alfresco-governance-repository-community-base:$(docker images | grep '^alfresco/alfresco-governance-repository-community-base ' | head -1 | awk '{print $2}') alfresco/alfresco-governance-repository-community-base:latest + docker images + - name: "Install Firefox 43.0.1" + run: | + sudo apt-get install libgtk2.0-0 + wget https://ftp.mozilla.org/pub/firefox/releases/43.0.1/linux-x86_64/en-GB/firefox-43.0.1.tar.bz2 + tar xvf firefox-43.0.1.tar.bz2 + sudo rm -rf /opt/firefox* + sudo mv firefox /opt/firefox + sudo ln -sf /opt/firefox/firefox /usr/bin/firefox + export PATH=/opt/firefox/firefox:$PATH + firefox --version + - name: Start Alfresco + run: | + bash amps/ags/travis/scripts/startAlfresco.sh amps/ags/rm-community/rm-community-share + bash amps/ags/travis/scripts/waitForAlfrescoToStart.sh + sudo free -m -t + - name: Run tests + uses: nick-fields/retry@v2 + with: + timeout_minutes: ${{ fromJSON(env.GITHUB_ACTIONS_DEPLOY_TIMEOUT) }} + max_attempts: 3 + retry_wait_seconds: 60 + retry_on: error + command: xvfb-run --server-args="-screen 0 1920x1080x24" mvn -B test -pl :alfresco-governance-services-automation-ui -Pags -Dskip.automationtests=false -DsuiteXmlFile=${{ matrix.test }}.xml -Dshare.url=$SHARE_URL -Dalfresco.url=$ALFRESCO_URL $WEBDRIVER_ARGUMENTS + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: ags/${GITHUB_RUN_NUMBER}/${JOB_NAME} + path: + amps/ags/rm-automation/rm-automation-ui/target/surefire-reports + amps/ags/rm-automation/rm-automation-ui/target/reports + amps/ags/rm-automation/rm-automation-ui/target/screenshots + alfresco.log + solr.log + share.log + - name: Get logs + run: bash amps/ags/scripts/getLogs.sh + + enterprise_shared_UI_configuration: + runs-on: ubuntu-latest + if: > + (!contains(github.event.head_commit.message, '[skip tests]') && + inputs.commitMessage != '[skip tests]') && + (!contains(github.event.head_commit.message, '[force]') && + inputs.commitMessage != '[force]') + && + (github.event.repository.fork==false) + && + (((github.ref_name == 'master' || startsWith(github.ref_name, 'release/')) && + (!contains(github.event.head_commit.message, '[skip ags]') + && inputs.commitMessage != '[skip ags]')) || (contains(github.event.head_commit.message, '[ags]') + || inputs.commitMessage == '[ags]')) + || + (github.event_name == 'pull_request' && (github.base_ref == 'master' || startsWith(github.base_ref, 'release/'))) + needs: build + strategy: + fail-fast: false + matrix: + test: [communityLevel2Tests, communityL2AuditRulesDashboardNodeBrowserTests, enterpriseLevel2Tests, enterpriseLevel2ClassificationTests, enterpriseRecordsClassificationTests, enterpriseFoldersClassificationTests, enterpriseDocumentsClassificationTests, enterpriseSecurityMarksTests, enterpriseConsoleGuidesAndConfiguration, wormTestSuite] + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Init" + run: bash scripts/travis/init.sh + - name: "Prepare before Test" + run: | + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - name: "Install Firefox 43.0.1" + run: | + sudo apt-get install libgtk2.0-0 + wget https://ftp.mozilla.org/pub/firefox/releases/43.0.1/linux-x86_64/en-GB/firefox-43.0.1.tar.bz2 + tar xvf firefox-43.0.1.tar.bz2 + sudo rm -rf /opt/firefox* + sudo mv firefox /opt/firefox + sudo ln -sf /opt/firefox/firefox /usr/bin/firefox + export PATH=/opt/firefox/firefox:$PATH + firefox --version + - name: Set S3_BUCKET_NAME + env: + VERSION: ${{ github.run_number }} + run: | + echo "S3_BUCKET_NAME=travis-ags-$VERSION" >> $GITHUB_ENV + echo $S3_BUCKET_NAME + - name: Build Docker image + run: | + firefox --version + echo $S3_BUCKET_NAME + export TAG_NAME="latest" + bash scripts/travis/create_swap.sh "5" + bash scripts/travis/build.sh + - name: Tag Docker image + run: | + docker images + docker image tag alfresco/alfresco-governance-repository-enterprise-base:$(docker images | grep '^alfresco/alfresco-governance-repository-enterprise-base ' | head -1 | awk '{print $2}') alfresco/alfresco-governance-repository-enterprise-base:latest + docker images + - name: Start Alfresco + if: ${{ matrix.test != 'wormTestSuite'}} + run: | + bash amps/ags/travis/scripts/startAlfresco.sh amps/ags/rm-enterprise/rm-enterprise-share + bash amps/ags/travis/scripts/waitForAlfrescoToStart.sh + - name: Start Alfresco for Worm + if: ${{ matrix.test == 'wormTestSuite'}} + run: | + bash amps/ags/travis/scripts/create-worm-bucket.sh + bash amps/ags/travis/scripts/start-compose.sh amps/ags/rm-enterprise/rm-enterprise-share/docker-compose-worm-support-ui.yml + bash amps/ags/travis/scripts/waitForAlfrescoToStart.sh + sudo free -m -t + - name: Run tests + uses: nick-fields/retry@v2 + with: + timeout_minutes: ${{ fromJSON(env.GITHUB_ACTIONS_DEPLOY_TIMEOUT) }} + max_attempts: 3 + retry_wait_seconds: 60 + retry_on: error + command: xvfb-run --server-args="-screen 0 1920x1080x24" mvn -B test -pl :alfresco-governance-services-automation-ui -Pags -Dskip.automationtests=false -DsuiteXmlFile=${{ matrix.test }}.xml -Dshare.url=$SHARE_URL -Dalfresco.url=$ALFRESCO_URL $WEBDRIVER_ARGUMENTS + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: ags/${GITHUB_RUN_NUMBER}/${JOB_NAME} + path: + amps/ags/rm-automation/rm-automation-ui/target/surefire-reports + amps/ags/rm-automation/rm-automation-ui/target/reports + amps/ags/rm-automation/rm-automation-ui/target/screenshots + alfresco.log + solr.log + share.log + - name: Get logs + run: bash amps/ags/travis/scripts/getLogs.sh + + teardown: + runs-on: ubuntu-latest + needs: test + if: > + ((!contains(github.event.head_commit.message, '[skip tests]') + && inputs.commitMessage != '[skip tests]') || (contains(github.event.head_commit.message, '[delete env]') || + inputs.commitMessage == '[delete env]')) + && + ((contains(github.event.head_commit.message, '[create env]') || + inputs.commitMessage == '[create env]')) + && + ((!contains(github.event.head_commit.message, '[force]') + && inputs.commitMessage != '[force]')) + && + github.event.repository.fork == false + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - uses: azure/setup-kubectl@v2.0 + - name: "Configure AWS credentials for Cluster" + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.ACS_CLUSTER_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.ACS_CLUSTER_AWS_SECRET_ACCESS_KEY }} + aws-region: eu-west-1 + - name: "Init" + run: bash scripts/travis/init.sh + - name: Delete Enviornment + timeout-minutes: ${{ fromJSON(env.GITHUB_ACTIONS_DEPLOY_TIMEOUT) }} + run: bash scripts/travis/delete-env.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..62875eb459 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,163 @@ +name: release + +# Only trigger, when the build workflow succeeded +on: + push: + branches: + - master + - release/** + +env: + SYNC_TAG_NAME: 3.4.0-A1 + HOSTED_ZONE: dev.envalfresco.com + KEEP_ENV: false + TAS_SCRIPTS: ../alfresco-community-repo/packaging/tests/scripts + TAS_ENVIRONMENT: ./packaging/tests/environment + MAVEN_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} + MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} + QUAY_PASSWORD: ${{ secrets.QUAY_PASSWORD }} + QUAY_USERNAME: ${{ secrets.QUAY_USERNAME }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} + BRANCH_NAME: ${{ github.ref_name }} + GIT_PASSWORD: ${{ secrets.BOT_GITHUB_TOKEN }} + GIT_EMAIL: ${{ secrets.BOT_GITHUB_EMAIL }} + GIT_USERNAME: ${{ secrets.BOT_GITHUB_USERNAME }} + S3_BUCKET_REGION: "us-east-1" + S3_BUCKET2_NAME: "travis-ags-worm-b2" + ALFRESCO_URL: "http://localhost:8080/alfresco/" + SHARE_URL: "http://localhost:8181/share" + DISPLAY: :99.0 + WEBDRIVER_ARGUMENTS: '-Dwebdriver.local.grid=true -Dwebdriver.browser=RemoteFireFox -Dwebdriver.localGrid=false -Dorg.alfresco.rm.timeout_seconds.MEDIUM=30' + ALF_PWD: ${{ secrets.ALF_PWD }} + ARTIFACTS_BUCKET: ${{ secrets.ARTIFACTS_BUCKET }} + ARTIFACTS_KEY: ${{ secrets.ARTIFACTS_KEY }} + ARTIFACTS_SECRET: ${{ secrets.ARTIFACTS_SECRET }} + MASTER_URL: ${{ secrets.MASTER_URL }} + SSL_CERT: ${{ secrets.SSL_CERT }} + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' + CLUSTER_NAME: "acs-cluster" + RANCHER2_URL: ${{ secrets.RANCHER2_URL }} + RANCHER2_ACCESS_KEY: ${{ secrets.RANCHER2_ACCESS_KEY }} + RANCHER2_SECRET_KEY: ${{ secrets.RANCHER2_SECRET_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + ACS_CLUSTER_AWS_ACCESS_KEY_ID: ${{ secrets.ACS_CLUSTER_AWS_ACCESS_KEY_ID }} + ACS_CLUSTER_AWS_SECRET_ACCESS_KEY: ${{ secrets.ACS_CLUSTER_AWS_SECRET_ACCESS_KEY }} + AGS_AWS_ACCESS_KEY_ID: ${{ secrets.AGS_AWS_ACCESS_KEY_ID }} + AGS_AWS_SECRET_ACCESS_KEY: ${{ secrets.AGS_AWS_SECRET_ACCESS_KEY }} + GITHUB_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + GITHUB_ACTIONS_DEPLOY_TIMEOUT: 90 + +jobs: + alfresco_enterprise_share: + uses: ./.github/workflows/build.yml + secrets: inherit + + release: + runs-on: ubuntu-latest + needs: [alfresco_enterprise_share] + if: > + (!contains(github.event.head_commit.message, '[no release]') + && inputs.commitMessage != '[no release]') + && + (github.ref_name == 'master' || startsWith(github.ref_name, 'release/')) + && + github.event_name != 'pull_request' + && + github.event.repository.fork == false + && + !failure() + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Init" + run: bash scripts/travis/init.sh + - name: "Prepare before Test" + run: | + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - name: Install dependencies + run: mvn -B -V install -DskipTests=true -Dmaven.javadoc.skip=true + - name: Verify release tag + run: bash scripts/travis/verify_release_tag.sh + - name: Get branch name + uses: Alfresco/alfresco-build-tools/.github/actions/get-branch-name@v1.23.0 + - name: Release to Nexus + run: bash scripts/travis/maven_release.sh + + update_downstream: + runs-on: ubuntu-latest + needs: release + if: > + (!contains(github.event.head_commit.message, '[no downstream]') + && inputs.commitMessage != '[no downstream]') + && + (github.ref_name == 'master' || startsWith(github.ref_name, 'release/')) + && + github.event_name != 'pull_request' + && + github.event.repository.fork == false + && + !failure() + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Init" + run: bash scripts/travis/init.sh + - name: "Prepare before Test" + run: | + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - name: Get branch name + uses: Alfresco/alfresco-build-tools/.github/actions/get-branch-name@v1.23.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/configure-git-author@v1.34.0 + with: + username: ${{ env.GIT_USERNAME }} + email: ${{ env.GIT_EMAIL }} + global: true + - name: Execute update-downstream script + run: bash scripts/travis/update_downstream.sh + + mirroring: + runs-on: ubuntu-latest + needs: update_downstream + if: > + (!contains(github.event.head_commit.message, '[no mirror]') + && inputs.commitMessage != '[no mirror]') + && + (github.ref_name == 'master' || startsWith(github.ref_name, 'release/')) + && + github.event_name != 'pull_request' + && + github.event.repository.fork == false + && + !failure() + steps: + - uses: actions/checkout@v3 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-java-build@v1.34.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/get-build-info@v1.34.0 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: "Init" + run: bash scripts/travis/init.sh + - name: "Prepare before Test" + run: | + pip3 install requests pytest==6.2.4 pytest-testinfra==6.3.0 jmespath==0.10.0 + - uses: Alfresco/alfresco-build-tools/.github/actions/configure-git-author@v1.34.0 + with: + username: ${{ env.GIT_USERNAME }} + email: ${{ env.GIT_EMAIL }} + global: true + - name: Mirror to community repository + run: bash scripts/travis/mirror-community-repo.sh "https://github.com/Alfresco/alfresco-community-share.git" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..f5116f8467 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +*.class + +# Eclipse +.classpath +.settings +.project +.classpath +.gradle + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# Maven +target +tomcat +runtime +*.log +*.log.* + +# Mobile Tools for Java (J2ME) + +.mtj +.tmp/ + +# Package Files # + +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +hs_err_pid* + +# AGS +amps/ags/rm-automation/src/test/resources/webdriver.properties + +# Maven shade plugin auto-generated file +dependency-reduced-pom.xml \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..954c688e76 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,34 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.1.0 + hooks: + - id: check-yaml + args: [--allow-multiple-documents] + exclude: helm/.*/templates + - id: check-json + - id: check-merge-conflict + - id: fix-byte-order-marker + files: '\.yml$' + - id: mixed-line-ending + args: ['--fix=lf'] + files: '\.yml$' + - id: end-of-file-fixer + files: '\.yml$' + - id: trailing-whitespace + files: '\.yml$' + - repo: local + hooks: + - id: docker-compose-check + name: Check validity of docker-compose files + entry: ./scripts/pre-commit/docker-compose-check.sh + language: script + verbose: true + files: docker-compose.y[a]{0,1}ml$ + - repo: https://github.com/sirosen/check-jsonschema + rev: 0.14.0 + hooks: + - id: check-travis + - repo: https://github.com/Alfresco/alfresco-build-tools + rev: v1.2.0 + hooks: + - id: travis-yml-lint diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..1d28cfca10 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,47 @@ +# Contributing guidelines + +We are happy to accept your patches! This document explains what you have to do to contribute to Share's code. + +If you are interested in making a large contribution, please reach out to us before starting work so that we can discuss the likelihood of our accepting the contribution. + +Share is made available under the terms of LGPLv3. + +## Get Share ready for patching +1. Fork the project. +2. Clone the project to your local machine using: `git clone git@github.com:Alfresco/alfresco-enterprise-share.git` and add a new remote for the original repository (upstream). +3. Setup your environment by installing the following: jdk 1.8, maven 3.5, postgreSQL 9.6. Don't forget to edit your environment variables: JAVA_HOME and path. +4. To check that your environment is functional, build and run Share by following these instructions: + * Build Share by running this command in the folder where the project resides: `mvn clean install -Penterprise`; + * Create a database named `alfresco` and a database user named `alfresco`; + * Run the Content Repository by running this command from the `alfresco` subfolder: `mvn install -Prun`; + * Run the Share web application by running this command from the `share` subfolder: `mvn install -Prun`. + +## Make your change +For consistency, please follow these guidelines. + +1. Raise a ticket in the [ALF project at issues.alfresco.com](https://issues.alfresco.com/jira/projects/ALF/issues/ALF-21766?filter=allopenissues) for the issue that you want to address (whether a contribution or a bug). As part of raising a ticket, you will have to accept the [Alfresco Contribution Agreement](https://community.alfresco.com/docs/DOC-7070-alfresco-contribution-agreement). Make sure that the ticket is well documented according to its type and it has all the information that is required. There is more information about reporting an ALF issue [here](https://community.alfresco.com/docs/DOC-6263-reporting-an-issue). +2. Create a new branch for the work that you're about to do. If you're fixing a bug, we recommend that you name your branch following the pattern: `fix/_`. The pattern for adding a new feature is: `feature/_`. +3. When writing your code, be sure to follow the [Coding Standards for Alfresco Content Services](https://community.alfresco.com/docs/DOC-4658-coding-standards). The `ide-config` folder in this project contains files that can be uploaded into your IDE to standardize the formatting. You must use Windows line ending characters (CRLF). +4. Make sure that the licenses of any libraries that you use in your implementation are compatible with LGPLv3. +5. When committing your work, please add a clear commit message (e.g. [Pull Request Commit Messages](https://community.alfresco.com/docs/DOC-6269-submitting-contributions#jive_content_id_Pull_Request_Commit_Messages)). +6. Include basic and clear documentation for your contribution. +7. Modify or add unit tests to cover your contribution. When writing the unit tests be very careful to respect the following: + * keep the test short (it should finish in less than 2 seconds); + * use mocks to ensure good performance; + * if a test requires an application context, do not use static references. Instead, use instance variables for the application context, then get the desired context reference in the setup method of the test with the following:
+ ``` + applicationContext = ApplicationContextHelper.getApplicationContect(); + ``` + * clean up after the tests, and ensure that the cleanup happens even if the test fails; + * don't use the `sleep()` method; + * consider side effects on other tests and test classes; + * keep the tests classes and methods focused on testing a specific functionality in a similar manner; + * keep/add proper tests in the correct project so that it is not necessary to run another project's tests to validate the code or functionality. +7. After you finish working, run all the tests and make sure that they all pass. +8. If you change a string that appears in the user interface, highlight it in your merge request. We will have our UX team review it and we will take care of the localization. + +## Share your contribution +1. Create a pull request against the original repository (upstream) on GitHub. Give the pull request a name that respects the pattern: `[] - `. In the pull request description, include what the code does and the link to the ALF project ticket. +2. Keep track of your ALF project ticket and pull request in case further discussion is required. +3. In our next triage session, we will schedule a time to review your contribution. If we accept your contribution, we will merged it into the main repository. +4. Finally, let everyone know you're an Alfresco Contributor by listing your contribution on the [Featured Contributions](https://community.alfresco.com/docs/DOC-5279-featured-contributions) page. diff --git a/Install_Allure.md b/Install_Allure.md new file mode 100644 index 0000000000..c449bf3420 --- /dev/null +++ b/Install_Allure.md @@ -0,0 +1,75 @@ +#Allure Test Report +Represents a concise test reporting framework +> https://docs.qameta.io/allure/ + +The following guide helps to enable and include Allure within a Travis pipeline context. + +The extension is developed in the following way: +> - Wait for tests to be executed +> - Collect the tests artifacts on a specific S3 bucket + +On the report generation side, a new Travis stage is added "Generate tests report" and is developed in the following way: +> - Download all the tests artifacts from the specified S3 bucket +> - Run the Allure command to generate an aggregated report for all the previous tests executed +> - Upload the generated report inside an S3 bucket + +##Allure installation: +1. Set travis aws environment variables or override the existing ones inside your `travis.yaml` file in order to point to the desired bucket: + + ARTIFACTS_BUCKET = + ARTIFACTS_KEY = + ARTIFACTS_SECRET = + ARTIFACTS_REGION = + +2. Open travis.yml file and add below commands line in your `before_install` instructions: + + sudo add-apt-repository ppa:qameta/allure -y + sudo apt-get updated + sudo apt-get install allure + +3. On your test stage activate the addon from Travis in order to upload test artifacts in your bucket: + + addons: + artifacts: + paths: + - {PROJECT-LOCATION}/target/surefire-reports + - {PROJECT-LOCATION}/target/reports + target_paths: $TRAVIS_BUILD_NUMBER/content-filters-tests + +4. Add the script `upload_test_artifacts.sh` in your scripts folder: + + # uploads all the artifacts generated by maven surefire to amazon s3 storage based on travis build number + aws s3 sync s3://test-report-allure/$TRAVIS_BUILD_NUMBER reports/$TRAVIS_BUILD_NUMBER + + # change directory and list all artifacts in reports folder + cd reports/$TRAVIS_BUILD_NUMBER + export ARTIFACTS_LIST=$(ls) + + # print out list of artifacts + echo $ARTIFACTS_LIST + + # allure generates report after clear list of artifacts and set output directory in S3 based on travis build number + allure generate -c $ARTIFACTS_LIST -o allure/$TRAVIS_BUILD_NUMBER + + # upload and aggregate one single allure report to amazon s3 storage, in the final-report folder, + # which will contain all test suites results + aws s3 sync allure/$TRAVIS_BUILD_NUMBER s3://test-report-allure/final-report/$TRAVIS_BUILD_NUMBER + + +5. Add a new build stage called report: + + name: "Generate tests report" + stage: report + install: skip + script: + - bash scripts/travis/upload_test_artifacts.sh + +##Allure report visualization: +1. Navigate to https://s3.console.aws.amazon.com/ +2. Login with your aws credentials account +3. Search your bucket where tests artifacts are stored +4. Open folder with aggregated test report, e.g. `final-report` +> - Make sure that above folder is public in order to be able to view the report +5. Open folder which corresponding to travis build number +6. Access `index.html` url + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..65c5ca88a6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..ee78529e3f --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Share + +Alfresco Share (share.war) is a web application that runs on the Java Platform. In a development environment it is usually deployed and run on top of Apache Tomcat. +Share is an option for the front end of the Alfresco Content Service offering. + +Share is built up of a main menu that leads to pages, which is similar to most other web applications that you might come across. However, there is one special page type called Dashboard that contains Dashlets. A Dashboard page can be configured by the end-user, who can add, remove, and organize the Dashlets on the page. + +More about Share: http://docs.alfresco.com/community/concepts/dev-extensions-share-architecture-extension-points.html diff --git a/STOPPED.github/dependabot.yml b/STOPPED.github/dependabot.yml new file mode 100644 index 0000000000..bfdcebcdb9 --- /dev/null +++ b/STOPPED.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "maven" + directory: "../" + schedule: + interval: "weekly" + day: "sunday" + # Use Romania Standard Time (UTC +02:00) + timezone: "Europe/Bucharest" + open-pull-requests-limit: 5 diff --git a/alfresco-tas-share-test/acs/docker-compose.yml b/alfresco-tas-share-test/acs/docker-compose.yml index 59de28a95b..69c163a242 100644 --- a/alfresco-tas-share-test/acs/docker-compose.yml +++ b/alfresco-tas-share-test/acs/docker-compose.yml @@ -21,7 +21,7 @@ services: ports: - "7203:7203" #JMX connect via service:jmx:rmi:///jndi/rmi://localhost:7203/jmxrmi - "5005:5005" #Java debugging - - "8081:8080" #Browser port for Alfresco + - "8081:8080" #Browser port for Alfresco share: image: ${SHARE_IMAGE}:${SHARE_TAG} @@ -29,7 +29,7 @@ services: - REPO_HOST=alfresco - REPO_PORT=8080 ports: - - 8082:8080 #Browser port for Share + - 8082:8080 #Browser port for Share postgres: image: ${POSTGRES_IMAGE}:${POSTGRES_TAG} @@ -52,7 +52,7 @@ services: #Create the default alfresco and archive cores - SOLR_CREATE_ALFRESCO_DEFAULTS=alfresco,archive ports: - - 8083:8983 #Browser port + - 8083:8983 #Browser port activemq: image: ${ACTIVEMQ_IMAGE}:${ACTIVEMQ_TAG} diff --git a/alfresco-tas-share-test/pom.xml b/alfresco-tas-share-test/pom.xml index 1057d7c303..1989fedb0e 100644 --- a/alfresco-tas-share-test/pom.xml +++ b/alfresco-tas-share-test/pom.xml @@ -1,181 +1,219 @@ - - - 4.0.0 - - org.alfresco.tas - share-test - 6.2.0.0-SNAPSHOT - jar - - - - alfresco-internal-snapshots - - https://nexus.alfresco.com/nexus/contecheckAlfrescoOneLogoInVersiondialognt/repositories/internal-snapshots/ - - - - alfresco-internal - https://nexus.alfresco.com/nexus/content/repositories/internal-releases/ - - - - - UTF-8 - UTF-8 - 3.8.0 - 1.6.0 - 3.1.0 - src/test/resources/test-suites - - 3.0.44 - 1.13 - 1.43 - 4.1.2 - 11 - - - - - io.github.bonigarcia - webdrivermanager - 4.2.2 - - - - org.projectlombok - lombok - 1.18.12 - provided - - - - commons-net - commons-net - 3.6 - - - - org.alfresco.tas - utility - ${tas.utility.version} - - - - org.uncommons - reportng - 1.1.2 - test - - - org.testng - testng - - - seleniumhq.selenium - selenium-java - - - - - - commons-collections - commons-collections - 3.2.2 - - - - org.alfresco.tas - cmis - ${tas.cmis.version} - - - - org.alfresco.tas - restapi - ${tas.restapi.version} - - - - - - - - - maven-remote-resources-plugin - ${maven-remote-resources.version} - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - test-jar - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - true - true - - - - - maven-deploy-plugin - 3.0.0-M1 - - - default-deploy - deploy - - deploy - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0-M5 - - 2 - true - ${suite-name} - - ${suiteXmlFile} - - - - - - org.apache.maven.plugins - maven-remote-resources-plugin - - - org.alfresco.tas:utility:${tas.utility.version} - - - - - - process - - - - - - - + + + 4.0.0 + + + org.alfresco + alfresco-share-parent + 23.1.0.156-SNAPSHOT + + + org.alfresco.tas + share-test + jar + + + + alfresco-internal-snapshots + + https://nexus.alfresco.com/nexus/contecheckAlfrescoOneLogoInVersiondialognt/repositories/internal-snapshots/ + + + + alfresco-internal + https://nexus.alfresco.com/nexus/content/repositories/internal-releases/ + + + + + UTF-8 + UTF-8 + 3.8.0 + 1.6.0 + 3.1.0 + src/test/resources/test-suites + + 4.0.0 + 4.1.2 + 17 + + + + + io.github.bonigarcia + webdrivermanager + 4.2.2 + + + org.projectlombok + lombok + 1.18.22 + provided + + + + commons-net + commons-net + 3.6 + + + + org.alfresco.tas + utility + ${tas.utility.version} + + + + org.uncommons + reportng + 1.1.2 + test + + + org.testng + testng + + + seleniumhq.selenium + selenium-java + + + + + + commons-collections + commons-collections + 3.2.2 + + + + org.alfresco.tas + cmis + ${dependency.alfresco-community-repo.version} + + + + org.alfresco.tas + restapi + ${dependency.alfresco-community-repo.version} + + + + org.apache.logging.log4j + log4j-slf4j2-impl + + + + org.apache.logging.log4j + log4j-core + + + mysql + mysql-connector-java + 8.0.33 + + + org.xerial + sqlite-jdbc + 3.41.2.2 + + + org.testng + testng + 7.7.0 + + + org.postgresql + postgresql + 42.2.27.jre7 + + + org.jsoup + jsoup + 1.15.3 + + + org.freemarker + freemarker + 2.3.30 + + + org.apache.commons + commons-compress + 1.21 + + + com.google.code.gson + gson + 2.8.9 + + + + + + + + maven-remote-resources-plugin + ${maven-remote-resources.version} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + true + true + + + + + maven-deploy-plugin + 3.0.0-M1 + + + default-deploy + deploy + + deploy + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M7 + + 2 + true + ${suite-name} + + ${suiteXmlFile} + + + + + + org.apache.maven.plugins + maven-remote-resources-plugin + + + org.alfresco.tas:utility:${tas.utility.version} + + + + + + process + + + + + + + diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/common/Language.java b/alfresco-tas-share-test/src/main/java/org/alfresco/common/Language.java index f51d545120..74c305f7b9 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/common/Language.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/common/Language.java @@ -1,6 +1,6 @@ /* * Copyright 2005-2020 Alfresco Software, Ltd. All rights reserved. - * + * * License rights for this program may be obtained from Alfresco Software, Ltd. * pursuant to a written agreement and any use of this program without such an * agreement is prohibited. @@ -60,4 +60,15 @@ public String translate(String key) return '!' + key + '!'; } } + public String newTranslate(String key) + { + try + { + return resourceBundle.getString(key); + } + catch (MissingResourceException e) + { + return key; + } + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/common/Utils.java b/alfresco-tas-share-test/src/main/java/org/alfresco/common/Utils.java index 55692ef65e..03f6a847b3 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/common/Utils.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/common/Utils.java @@ -12,6 +12,7 @@ import java.util.function.Supplier; import org.alfresco.utility.Utility; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; import org.openqa.selenium.Keys; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; @@ -27,8 +28,9 @@ public final class Utils { protected static final Logger LOG = LoggerFactory.getLogger(Utils.class); - public static String srcRoot = System.getProperty("user.dir") + File.separator; + public static String srcRoot = StringUtils.substringBeforeLast(System.getProperty("user.dir"), File.separator + "target") + File.separator; public static String testDataFolder = srcRoot + "testdata" + File.separator; + public static File screenshotFolder = new File("./target/reports/screenshots"); /** @@ -172,7 +174,7 @@ public static boolean isFileInDirectory(String fileName, String extension) { fileName = fileName + extension; } - String filePath = testDataFolder + File.separator + fileName; + String filePath = "testdata" + File.separator + fileName; while (retry <= seconds && !Files.exists(Paths.get(filePath))) { retry++; diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/common/WebElementInteraction.java b/alfresco-tas-share-test/src/main/java/org/alfresco/common/WebElementInteraction.java index dc43d6f670..0018f9f515 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/common/WebElementInteraction.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/common/WebElementInteraction.java @@ -42,7 +42,6 @@ protected WebElementInteraction(ThreadLocal webDriver) { this.webDriver = webDriver; } - protected final DefaultProperties getDefaultProperties() { return defaultProperties; @@ -1130,7 +1129,7 @@ protected List findElements(By locator) } } - protected String getCurrentUrl() + public String getCurrentUrl() { return getWebDriver().getCurrentUrl(); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/LoginPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/LoginPage.java index f62f99d68c..79132d3bf9 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/LoginPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/LoginPage.java @@ -112,6 +112,7 @@ public CommonLoginPage assertAuthenticationErrorMessageIsCorrect() public boolean isAuthenticationErrorDisplayed() { + waitInSeconds(3); return isElementDisplayed(errorLogin); } @@ -146,7 +147,6 @@ public boolean isLogoDisplayed() { return isElementDisplayed(alfrescoLogo); } - @Override public CommonLoginPage assertLoginPageTitleIsCorrect() { @@ -154,4 +154,4 @@ public CommonLoginPage assertLoginPageTitleIsCorrect() assertEquals(getPageTitle(), language.translate("login.pageTitle"), "Login page title is correct"); return this; } -} \ No newline at end of file +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/MyFilesPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/MyFilesPage.java index 5f3cdba39d..130a9970d1 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/MyFilesPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/MyFilesPage.java @@ -2,17 +2,21 @@ import static org.alfresco.common.Wait.WAIT_3; import static org.alfresco.common.Wait.WAIT_40; -import static org.testng.Assert.*; - +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; import lombok.extern.slf4j.Slf4j; import org.alfresco.common.Utils; -import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; -import org.alfresco.po.share.alfrescoContent.organizingContent.CopyMoveUnzipToDialog; import org.alfresco.po.share.navigation.AccessibleByMenuBar; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; import org.alfresco.po.share.toolbar.Toolbar; -import org.openqa.selenium.*; +import org.alfresco.utility.model.FileModel; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.Keys; import java.text.MessageFormat; @@ -38,6 +42,9 @@ public String getRelativePath() private By moreActionsMenu = By.cssSelector("div[id*='default-actions']:not([class*='hidden'])>.action-set>.more-actions"); private final By message = By.cssSelector("#prompt_h + div.bd"); private By documentLibraryItemsList = By.cssSelector("div[id$='default-documents'] tbody[class$='data'] tr"); + private final String templateName = "//a[@class='yuimenuitemlabel']//span[text()='%s']"; + private final By createFileFromTemplate = By.cssSelector("div[id$='createContent-menu']>div>ul:nth-of-type(2)>li:nth-of-type(1) span"); + private By editTagInputField_ = By.cssSelector(".inlineTagEditAutoCompleteWrapper input"); @Override public MyFilesPage navigateByMenuBar() { @@ -56,6 +63,21 @@ public MyFilesPage click_CreateButton() waitUntilElementIsVisible(By.cssSelector("div[id$='_default-createContent-menu'][style*='visible']")); return this; } + public MyFilesPage click_CreateFromTemplateOption(CreateMenuOption option) + { + clickElement(option.getLocator()); + return new MyFilesPage(webDriver); + } + public void create_FileFromTemplate(FileModel templateFile) + { + log.info("Create new file from template {}", templateFile); + mouseOver(findElement(createButton)); + mouseOver(findElement(createFileFromTemplate)); + clickElement(createFileFromTemplate); + clickElement(By.xpath(String.format(templateName, templateFile.getName()))); + waitUntilNotificationMessageDisappears(); + + } public MyFilesPage click_FolderLink() { clickElement(CreateMenuOption.FOLDER.getLocator()); @@ -79,6 +101,7 @@ public String getMessage() public MyFilesPage assertIsContantNameDisplayed(String contantName) { log.info("Verify file/folder name displayed {}", contantName); + waitInSeconds(3); assertTrue(isContentNameDisplayed(contantName), String.format("file/folder name not matched with %s ", contantName)); return this; } @@ -94,6 +117,7 @@ public String getDialogTitle() } public MyFilesPage select_ItemAction(String contentItem, ItemActions action) { + waitInSeconds(WAIT_3.getValue()); WebElement libraryItem = mouseOverContentItem(contentItem); By actionSelector = By.cssSelector(MessageFormat.format(ACTION_SELECTOR, action.getActionLocator())); WebElement actionElement; @@ -141,4 +165,18 @@ public boolean isContentAvailable(String contentNameInList) } return false; } -} \ No newline at end of file + public MyFilesPage assertIsFolderPresentInList(String folderName) + { + log.info("Verify that the folder is present in the list."); + assertTrue(getFoldersList().contains(folderName), "Folder is not present in the list."); + return this; + } + public void type_TagName(String tagName) + { + waitInSeconds(3); + Utils.clearAndType(waitUntilElementIsVisible(findElement(editTagInputField_)), tagName); + findElement(editTagInputField_).sendKeys(Keys.ENTER); + waitInSeconds(2); + findElement(editTagInputField_).sendKeys(Keys.ENTER); + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PageNotification.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PageNotification.java new file mode 100644 index 0000000000..0a0fc187c2 --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PageNotification.java @@ -0,0 +1,21 @@ +package org.alfresco.po.share; +import org.alfresco.po.share.site.DocumentLibraryPage; +import org.alfresco.utility.web.HtmlPage; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class PageNotification extends DocumentLibraryPage { + public PageNotification(ThreadLocal webDriver) + { + super(webDriver); + } + + private By notification = By.cssSelector("div.bd span.message"); + + public String getDisplayedNotification() { + + return findElement(notification).getText(); + + + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PeopleFinderPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PeopleFinderPage.java index d2d37bdcc0..26f6b8a8e4 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PeopleFinderPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/PeopleFinderPage.java @@ -12,6 +12,12 @@ public class PeopleFinderPage extends SharePage2 implements AccessibleByMenuBar { private final By searchResultsList = By.cssSelector("tbody[class='yui-dt-data'] tr"); + private final By pageTitle = By.xpath("//h1[@class = 'alfresco-header-Title']"); + + private final By notification = By.cssSelector("div.bd span.message"); + private final By peopleFinderPage = By.cssSelector("span[id='HEADER_PEOPLE_text']"); + + private final By searchInputField = By.cssSelector("input[id$='default-search-text']"); private final By searchButton = By.cssSelector("button[id$='default-search-button-button']"); private final By searchHelpMessage = By.cssSelector("[id*='default-help']"); @@ -52,10 +58,27 @@ public void clickSearch() { clickElement(searchButton); } + public PeopleFinderPage navigateToPeopleFinderPage() + { + clickElement(peopleFinderPage); + return this; + } + + public PeopleFinderPage getNotification() + { + findElement(notification).getText(); + return this; + } + + public String getPageTitle() + { + return getElementText(pageTitle); + } public void clickSearchAndWaitForResults() { clickElement(searchButton); + waitInSeconds(3); } public void search(String searchInput) @@ -121,7 +144,7 @@ public boolean isUserAvatarDisplayed(String username) public UserProfilePage clickUserLink(String username) { - selectUser(username).findElement(By.cssSelector("a")); + selectUser(username).findElement(By.cssSelector("a")).click(); return new UserProfilePage(webDriver); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/SiteFinderPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/SiteFinderPage.java index 7d6fccd082..1847dfee17 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/SiteFinderPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/SiteFinderPage.java @@ -1,9 +1,11 @@ package org.alfresco.po.share; +import static org.alfresco.common.RetryTime.RETRY_TIME_10; import static org.alfresco.common.RetryTime.RETRY_TIME_80; import static org.alfresco.common.Wait.WAIT_2; import static org.alfresco.common.Wait.WAIT_3; import static org.alfresco.utility.Utility.waitToLoopTime; +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import java.util.List; @@ -21,6 +23,7 @@ public class SiteFinderPage extends SharePage2 implements Access { private final By siteRowList = By.cssSelector("div[id$='default-sites'] tr[class*='yui-dt-rec']"); private final By searchSiteButton = By.cssSelector("div[class$=search-button] button"); + private final By findSearchDetails = By.xpath("//h3[@class=\"sitename\"]"); private final By searchSiteInput = By.cssSelector("div[class$=search-text] input"); private final By searchMessage = By.cssSelector("tbody[class*='message'] div"); private final By siteDescriptionList = By.cssSelector("div[class='sitedescription']"); @@ -29,7 +32,7 @@ public class SiteFinderPage extends SharePage2 implements Access private final By requestToJoinButton = By.xpath(".//button[text()='Request to Join']"); private final String siteNamePath = "//tr[contains(@class, 'yui-dt-even')]//a[text()='%s']/../../../.."; - + private By notification = By.cssSelector("div.bd span.message"); public SiteFinderPage(ThreadLocal webDriver) { super(webDriver); @@ -58,6 +61,53 @@ public boolean isSiteNameDisplayed(String siteName) { return isElementDisplayed(By.xpath(String.format(siteNamePath, siteName))); } + public WebDriver getWebDriver() + { + return webDriver.get(); + } + public String getPageTitle() + { + return getTitle(); + } + + public SiteFinderPage searchSiteName(String siteName) + { + WebElement searchInput = findElement(searchSiteInput); + clearAndType(searchInput, siteName); + searchSiteNameWithRetry(siteName); + return this; + } + public boolean checkSiteWasFound(String siteName) + { + + for (WebElement searchResults :findElements(findSearchDetails)) + { + if (searchResults.getText().equals(siteName)) + { + return true; + } + } + + return false; + } + + public SiteFinderPage assertSiteWasFound(String siteName){ + assertTrue(checkSiteWasFound(siteName), "Check "+ siteName); + return this; + } + + public void searchSiteNameWithRetry(String siteName) + { + int retryCounter = 0; + while (!isSiteNameDisplayed(siteName) && retryCounter < RETRY_TIME_10.getValue()) + { + log.warn("Site {} not displayed - retry: {}", siteName, retryCounter); + clickElement(searchSiteButton); + waitToLoopTime(WAIT_3.getValue()); + retryCounter++; + } + + } private WebElement getSiteRow(String siteName) { @@ -121,6 +171,11 @@ public boolean isButtonDisplayedForSite(String siteName, String buttonName) return false; } + public SiteFinderPage assertIsButtonDisplayedForSite(String siteName, String buttonName){ + assertTrue(isButtonDisplayedForSite(siteName,buttonName),"Check Button name for "+ siteName); + return this; + } + public void clickSiteButton(String siteName, String buttonName) { waitUntilElementsAreVisible(getTheButtonsForSite(siteName)); @@ -147,7 +202,7 @@ public void requestToJoinSite(String siteName) public SiteDashboardPage accessSite(String siteName) { - selectSite(siteName).findElement(siteNameLink); + selectSite(siteName).findElement(siteNameLink).click(); return new SiteDashboardPage(webDriver); } @@ -190,4 +245,10 @@ public String getVisibilityLabel() { return waitUntilElementIsVisible(siteVisibility).getText(); } + public SiteFinderPage assertVerifyDisplayedNotification(String expectedMessage) + { + waitInSeconds(2); + assertEquals(findElement(notification).getText(), expectedMessage,"Check Notification message"); + return this; + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/TinyMce/TinyMceEditor.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/TinyMce/TinyMceEditor.java index 3a25342dd1..9c6ff75715 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/TinyMce/TinyMceEditor.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/TinyMce/TinyMceEditor.java @@ -29,6 +29,8 @@ public class TinyMceEditor extends BasePage private String TINY_MCE_SELECT_ALL_COMMAND = "tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.getBody(),true);"; private String frameId = null; private FormatType formatType; + private final By boldText = By.xpath("//*[@id=\"tinymce\"]/p/strong"); + private final By italicText = By.xpath("//*[@id=\"tinymce\"]/p/em"); public TinyMceEditor(ThreadLocal webDriver) { @@ -92,7 +94,7 @@ public void setTinyMce(String frameId) setFrameId(frameId); } - public void addContent(String txt) + public TinyMceEditor addContent(String txt) { try { @@ -102,6 +104,7 @@ public void addContent(String txt) { log.error("Element : " + txt + " is not present", noSuchElementExp); } + return this; } public void clickTextFormatter(FormatType formatType) @@ -163,4 +166,20 @@ public void setText(String text) setCommentJs = String.format("tinyMCE.activeEditor.setContent('%s');", text); executeJavaScript(setCommentJs); } + public boolean verifyBoldText () + { + String boldFontWeightValue = "700"; + switchToFrame("template_x002e_comments_x002e_document-details_x0023_default-add-content_ifr"); + String fontWeight = findElement(boldText).getCssValue("font-weight"); + boolean isBold = boldFontWeightValue.equals(fontWeight); + return isBold; + } + public boolean verifyItalicText () + { + String boldFontStyle = "italic"; + switchToFrame("template_x002e_comments_x002e_document-details_x0023_default-add-content_ifr"); + String fontStyle = findElement(italicText).getCssValue("font-style"); + boolean italicText = boldFontStyle.equals(fontStyle); + return italicText; + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/UploadFileDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/UploadFileDialog.java index caaa6cb58d..d99b7324e9 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/UploadFileDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/UploadFileDialog.java @@ -39,7 +39,6 @@ public T uploadFile(String location, SharePage2 page) log.info("Upload file from {}", location); uploadFile(location); waitUntilElementDisappears(dialogBody); - return (T) this; } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/RepositoryPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/RepositoryPage.java index d3ab053e2f..4112edb688 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/RepositoryPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/RepositoryPage.java @@ -1,14 +1,36 @@ package org.alfresco.po.share.alfrescoContent; +import static org.alfresco.common.Wait.WAIT_1; +import static org.alfresco.common.Wait.WAIT_5; +import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.navigation.AccessibleByMenuBar; import org.alfresco.po.share.site.DocumentLibraryPage; +import org.alfresco.po.share.site.ItemActions; import org.alfresco.po.share.toolbar.Toolbar; +import org.openqa.selenium.By; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import java.text.MessageFormat; +import java.util.List; +@Slf4j public class RepositoryPage extends DocumentLibraryPage implements AccessibleByMenuBar { + private By createButton = By.cssSelector("button[id*='createContent']"); + private By likeButton = By.cssSelector("a.like-action"); + private By repositoryFilesItemsList = By.cssSelector("div[id$='default-documents'] tbody[class$='data'] tr"); + private static final String ACTION_SELECTOR = "div[id*='default-actions']:not([class*='hidden'])>.action-set .{0}>a"; + private static final String ACTION_SELECTOR_MORE = "div[id*='default-actions']:not([class*='hidden']) div.more-actions>.{0}>a"; + private By moreSelector = By.cssSelector("div[id*='default-actions']:not([class*='hidden']) a.show-more"); + private By moreMenuSelector = By.cssSelector("div[class='action-set detailed'] div[id*='onActionShowMore'] a span"); + private By contentNameSelector = By.cssSelector(".filename a"); + private By actionsSet = By.cssSelector(".action-set a span"); public RepositoryPage(ThreadLocal webDriver) { super(webDriver); @@ -32,4 +54,165 @@ public RepositoryPage assertRepositoryPageIsOpened() assertTrue(getCurrentUrl().contains(getRelativePath()), "Repository page is opened"); return this; } + public RepositoryPage click_FolderName(String folderName) + { + waitInSeconds(5); + List folderList = findElements(contentNameSelector); + for (WebElement webElement : folderList) + { + if (webElement.getText().contains(folderName)) + { + webElement.click(); + } + } + return this; + } + public boolean isFileNameDisplayed(String fileName) + { + waitInSeconds(3); + if (selectDocumentLibraryItemRow(fileName) != null) + { + return true; + } + else + { + refresh(); + waitInSeconds(WAIT_5.getValue()); + if (selectDocumentLibraryItemRow(fileName) != null) + { + return true; + } + else + { + return false; + } + } + } + public RepositoryPage select_ItemsAction(String contentItem, ItemActions action) + { + waitInSeconds(3); + WebElement libraryItem = mouseOverContentItem(contentItem); + By actionSelector = By.cssSelector(MessageFormat.format(ACTION_SELECTOR, action.getActionLocator())); + WebElement actionElement; + if (isActionInMoreActionsContainer(action)) + { + clickOnMoreActions(libraryItem); + } + try + { + actionElement = waitUntilElementIsVisible(actionSelector); + } + catch (TimeoutException timeoutException) + { + throw new TimeoutException( + "The action " + action.getActionName() + " could not be found for list item " + contentItem); + } + mouseOver(actionElement); + clickElement(actionElement); + return this; + } + + private boolean isActionInMoreActionsContainer(ItemActions action) + { + By actionSelector = By.cssSelector(MessageFormat.format(ACTION_SELECTOR_MORE, action.getActionLocator())); + WebElement actionElement = waitUntilElementIsPresent(actionSelector); + return actionElement != null; + } + private void clickOnMoreActions(WebElement libraryItem) + { + WebElement moreAction = waitUntilChildElementIsPresent(libraryItem, moreSelector); + mouseOver(moreAction); + clickElement(moreAction); + } + public RepositoryPage assertFileIsDisplayed(String fileName) + { + log.info("Assert file is displayed in Repository Browser {}", fileName); + assertTrue(isFileNameDisplayed(fileName), fileName + " is not displayed"); + return this; + } + public WebElement selectDocumentLibraryItemRow(String documentItem) + { + waitInSeconds(2); + List itemsList = findElements(repositoryFilesItemsList); + return findFirstElementWithValue(itemsList, documentItem); + } + public RepositoryPage assertIsLikeButtonDisplayed(String fileName) + { + log.info("Assert Like Button is displayed for Repository Browser Files/Folders {}", fileName); + assertTrue(isElementDisplayed(selectDocumentLibraryItemRow(fileName), likeButton),"Like Button is Not Displayed"); + return this; + } +// public RepositoryPage refreshpage() +// { +// waitInSeconds(2); +// getWebDriver().navigate().refresh(); +// waitUntilDomReadyStateIsComplete(); +// return this; +// } + public boolean isActionItemAvailableInTheRepositoryLibraryItems(String content, ItemActions actionItem) + { + + boolean actionAvailable; + if (isMoreMenuDisplayed(content)) + { + actionAvailable = isActionAvailableForLibraryItem(content, actionItem); + }else + { + actionAvailable = false; + } + return actionAvailable; + } + public RepositoryPage assertActionItem_Not_AvailableInTheRepositoryLibraryItems(String content, ItemActions actionItem) + { + log.info("Verify that the Action Item is Available in the list for the Document Library Itme {}", content ); + assertFalse(isActionItemAvailableInTheRepositoryLibraryItems(content, actionItem), "Action is available"); + return this; + } + public RepositoryPage assertActionItem_AvailableInTheRepositoryLibraryItems(String content, ItemActions actionItem) + { + log.info("Verify that the Action Item is Available in the list for the Document Library Itme {}", content ); + assertTrue(isActionItemAvailableInTheRepositoryLibraryItems(content, actionItem),"Action is Not Available"); + return this; + } + public RepositoryPage clickOnFolderName(String folderName) + { + waitInSeconds(WAIT_1.getValue()); + WebElement folderElement = selectDocumentLibraryItemRow(folderName); + clickElement(folderElement.findElement(contentNameSelector)); + return this; + } + public RepositoryPage click_FolderLink() + { + clickElement(CreateMenuOption.FOLDER.getLocator()); + return this; + } + public RepositoryPage click_CreateButton() + { + clickElement(createButton); + waitUntilElementIsVisible(By.cssSelector("div[id$='_default-createContent-menu'][style*='visible']")); + return this; + } + public RepositoryPage click_PlainTextLink() + { + clickElement(CreateMenuOption.PLAIN_TEXT.getLocator()); + return this; + } + public RepositoryPage assertFileIsNotDisplayed(String fileName) + { + log.info("Assert file is not displayed in Document Library {}", fileName); + assertFalse(isFileNameDisplayed(fileName), fileName + " is displayed in Document Library"); + return this; + } + public RepositoryPage assertIsMoreMenuDisplayed(String filename) + { + log.info("Verify More Menu is Displaying"); + assertTrue(isMoreMenuDisplayed(filename), "More Menu is not displayed"); + return this; + } + public RepositoryPage assertIsMoreMenuNotDisplayed(String filename) + { + log.info("Verify More Menu is Not Displaying"); + assertFalse(isMoreMenuDisplayed(filename), "More Menu is displayed"); + return this; + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/SharedFilesPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/SharedFilesPage.java index 029521d902..929015ac77 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/SharedFilesPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/SharedFilesPage.java @@ -4,6 +4,7 @@ import static org.testng.Assert.assertTrue; import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.navigation.AccessibleByMenuBar; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; @@ -52,4 +53,31 @@ public void assertIsActionAvailableForLibraryItem(String libraryItem, ItemAction assertTrue(isElementDisplayed( findFirstElementWithExactValue(getAvailableActions_(libraryItem),action.getActionName())),"Shared Files List "); } + public SharedFilesPage assertIsFolderPresentInList(String folderName) + { + log.info("Verify that the folder is present in the list."); + assertTrue(getFoldersList().contains(folderName), "Folder is not present in the list."); + return this; + } + public SharedFilesPage assertExplorerPanelDocuments(String folderName) + { + log.info("Verify that the Folder is present in ExplorerPanel"); + assertTrue(getExplorerPanelDocuments().contains(folderName), "Subfolder not found in Documents explorer panel"); + return this; + } + public WebDriver getWebDriver() + { + return webDriver.get(); + } + public SharedFilesPage refreshSharedFilesPage() + { + getWebDriver().navigate().refresh(); + waitUntilDomReadyStateIsComplete(); + return this; + } + public SharedFilesPage assertIsFileDisplayed(String fileName) { + log.info("Verify that the File is Displayed"); + assertTrue(getFilesList().toString().contains(fileName), "File is Not Displayed"); + return this; + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/aspects/AspectsForm.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/aspects/AspectsForm.java index 2a28b3435b..bd30e8427d 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/aspects/AspectsForm.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/aspects/AspectsForm.java @@ -60,6 +60,7 @@ public boolean areRemoveButtonsDisplayed() public boolean isAspectsFormTitleDisplayed() { + waitInSeconds(3); return isElementDisplayed(aspectsFormTitle); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/buildingContent/NewFolderDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/buildingContent/NewFolderDialog.java index 95b78373b5..ebd7576fc1 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/buildingContent/NewFolderDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/buildingContent/NewFolderDialog.java @@ -95,6 +95,19 @@ public NewFolderDialog typeName(String name) return this; } + public NewFolderDialog typeTitle(String name) + { + log.info("Type name {}", name); + clearAndType(titleField, name); + return this; + } + public NewFolderDialog typeDescription(String name) + { + log.info("Type name {}", name); + clearAndType(descriptionField, name); + return this; + } + public NewFolderDialog fillInDetails(String name, String title, String description) { log.info("Set name, title and description"); @@ -129,4 +142,10 @@ public NewFolderDialog assertNameInputContainsIllegalCharactersMessageIsDisplaye findElement(nameField).getAttribute("title")); return this; } + public NewFolderDialog assertIsNameFieldValueEquals(String templateName) + { + log.info("Verify the Name field value matched with template name {} ", templateName); + assertEquals(getNameFieldValue(), templateName, "Name field not matched"); + return this; + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/DocumentDetailsPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/DocumentDetailsPage.java index ab336fb241..2a607e5aab 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/DocumentDetailsPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/DocumentDetailsPage.java @@ -81,6 +81,9 @@ public class DocumentDetailsPage extends SharePage2 private final By editCommentBoxTitle = By.xpath("//h2[text()= 'Edit Comment...']"); private final By saveButtonEditComment = By.xpath("//button[text()='Save']"); private final By contentText = By.cssSelector("div[class ='textLayer']>div"); + private final By noContentText = By.cssSelector("div[class ='message']"); + private final By contentTittle = By.xpath("(//span[@class='viewmode-value'])[2]"); + private final By contentDescription = By.xpath("(//span[@class='viewmode-value'])[3]"); private final By downloadPreviousVersion = By.cssSelector("div[id$='_default-olderVersions'] div.version-panel-right a.download"); private final By revertButton = By.cssSelector("div[id$='_default-olderVersions'] div.version-panel-right a[class$='_default revert']"); private final By commentTextArea = By.cssSelector("iframe[id*='comments']"); @@ -90,6 +93,8 @@ public class DocumentDetailsPage extends SharePage2 private final By commentsIframe = By.cssSelector("iframe[id$='default-add-content_ifr']"); private final By copyToAction = By.cssSelector("#onActionCopyTo > a"); private final By documentsLink = By.xpath("//span[@class = 'folder-link']//a"); + private final By folderOpenedLink = By.xpath("//span[@class='folder-link folder-open']"); + private final By googleDocsEdit = By.xpath("//span[contains(text(), 'Edit in Google Docsâ„¢')]"); private final By commentContentIframe = By.xpath("//iframe[contains(@title,'Rich Text Area')]"); private final By editComment = By.cssSelector("[class*=edit-comment]"); @@ -159,6 +164,11 @@ public void clickOnLikeUnlike() waitUntilElementIsVisible(likeUnlikeAction); clickElement(likeUnlikeAction); } + public void clickOpenedFloder() + { + waitUntilElementIsVisible(folderOpenedLink); + clickElement(folderOpenedLink); + } public int getLikesNo() { @@ -620,6 +630,18 @@ public String getContentText() { return getElementText(contentText).trim(); } + public String getNoContentMassageText() + { + return getElementText(noContentText).trim(); + } + public String getContentTitle() + { + return getElementText(contentTittle).trim(); + } + public String getContentDescription() + { + return getElementText(contentDescription).trim(); + } public DocumentDetailsPage assertFileContentEquals(String expectedContent) { @@ -627,6 +649,18 @@ public DocumentDetailsPage assertFileContentEquals(String expectedContent) assertEquals(getContentText(), expectedContent, "File content is correct"); return this; } + public DocumentDetailsPage assertFileContentContains(String expectedContent) + { + log.info("Assert file has content {}", expectedContent); + assertTrue(getContentText().contains(expectedContent)); + return this; + } + public DocumentDetailsPage assertDacumentNOContent() + { + log.info("Assert file has content {}"); + assertEquals(getNoContentMassageText(), "This document has no content.", "File content is correct"); + return this; + } public DocumentDetailsPage assertContentNameEquals(String contentName) { @@ -634,10 +668,22 @@ public DocumentDetailsPage assertContentNameEquals(String contentName) assertEquals(getFileName(), contentName, "File name is not correct"); return this; } - + public DocumentDetailsPage assertContentTittleEquals(String contentName) + { + log.info("Assert file/folder Tittle is {}", contentName); + assertEquals(getContentTitle(), contentName, "Content Title is not correct"); + return this; + } + public DocumentDetailsPage assert_ContentDescriptionEquals(String contentName) + { + log.info("Assert file/folder Tittle is {}", contentName); + assertEquals(getContentDescription(), contentName, "Content Description is not correct"); + return this; + } public DocumentDetailsPage assertPageTitleEquals(String pageTitle) { log.info("Verify that the page title is {}", pageTitle); + waitInSeconds(3); assertEquals(getPageTitle(), pageTitle, "Page title is not matched with [%s]" +pageTitle); return this; } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/FileActionsPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/FileActionsPage.java index 22348c1002..77fae0c741 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/FileActionsPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/FileActionsPage.java @@ -285,7 +285,6 @@ public FileActionsPage assertIsVersionHistoryBlockDisplayed() assertTrue(isVersionHistoryBlockDisplayed(), "Version History Block is not displayed"); return this; } - public FileActionsPage assertVerifyShareLink(String linkText) { log.info("Verify the share link text"); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/GoogleDocsLogIn.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/GoogleDocsLogIn.java new file mode 100644 index 0000000000..8a763003c3 --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/GoogleDocsLogIn.java @@ -0,0 +1,165 @@ +package org.alfresco.po.share.alfrescoContent.document; + +import lombok.extern.slf4j.Slf4j; +import org.alfresco.common.WebElementInteraction; +import org.alfresco.utility.web.common.Parameter; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.Assert; + +@Slf4j +public class GoogleDocsLogIn extends WebElementInteraction +{ + protected String googleDocsLoginUrl = "https://accounts.google.com/ServiceLogin#identifier"; + + + private final By reauthEmail = By.xpath("//*[@id='profileIdentifier']|//*[@id='reauthEmail']"); + + private final By googleDocagainEmailId = By.xpath("//input[@aria-label='Email Address']"); + private final By googleDocsPassword = By.xpath("//*[@name='password']|//*[@name='Passwd']"); + private final By googleDocEmailId =By.xpath("//*[@id='identifierId']|//*[@id='Email']"); + + + private final By useAnothorAc = By.xpath("//div[text()='Use another account']"); + private final By okButtonPopUp = By.xpath("//*[contains(text(), 'OK')]"); + + private final By lockedIcon = By.xpath("//img[contains(@title,'Locked by you')]"); + private final By lockedDocumentMessage = By.xpath("//div[contains(text(), 'This document is locked by you')]"); + + private final By googleDriveIcon = By.xpath("//img[contains(@title,'Editing in Google Docs')]"); + + private final By checkInGoogleDoc = By.xpath("//span[contains(text(), 'Check In Google Docâ„¢')]"); + private final By googleDocsTitle = By.cssSelector(".docs-title-input"); + + private final By addLinkInGoogleDoc = By.id("insertLinkButton"); + + private final By inputTextForLinkInGoogleDoc = By.xpath("//input[contains(@class, 'docs-link-smartinsertlinkbubble-text jfk-textinput')]"); + + private final By inputLinkInGoogleDoc = By.xpath("//input[contains(@class, 'docs-link-searchinput-search')]"); + + private final By submitEmails = By.xpath("//*[@id='identifierNext']|//*[@id='next']"); + private final By nextButton = By.xpath("//div[@id='login-parent']//div/button[text()='Next']"); + private final By passwordNextButton = By.xpath("//div[@id='passwordNext']//button"); + + private final By signInToGoogleDocsButton = By.xpath("//*[@id='passwordNext']|//*[@id='signIn']"); + private final By logInToGoogleDocsButton = By.xpath("//button[text()='Log in']"); + private final By continueGoogleDocsButton = By.xpath("//div[@data-primary-action-label='Continue']//div[@jsname='k77Iif']//button"); + protected String googleDocsTestEmail = "alfrescotest65@gmail.com"; + protected String googleDocsTestPassword = "Alfresco@65"; + public GoogleDocsLogIn(ThreadLocal webDriver) { + super(webDriver); + } + + + + public void clickOkButton() + { + Parameter.checkIsMandotary("OK button on version popup", okButtonPopUp); + waitUntilElementIsVisible(okButtonPopUp).click(); + } + public void changeGoogleDocsTitle(String newGoogleDocsTitle) + { + waitUntilElementIsDisplayedWithRetry(By.cssSelector(".docs-title-input")); + waitUntilElementIsVisible(googleDocsTitle).clear(); + waitUntilElementIsVisible(googleDocsTitle).sendKeys(newGoogleDocsTitle); + waitUntilElementIsVisible(googleDocsTitle).sendKeys(Keys.ENTER); + } + public void editGoogleDocsContent(String content) + { + waitUntilElementIsDisplayedWithRetry(By.id("insertLinkButton")); + waitUntilElementIsVisible(addLinkInGoogleDoc).click(); + waitUntilElementIsVisible(inputTextForLinkInGoogleDoc).sendKeys(content); + waitUntilElementIsVisible(inputLinkInGoogleDoc).sendKeys("test"); + waitUntilElementIsVisible(inputLinkInGoogleDoc).sendKeys(Keys.ENTER); + waitInSeconds(5); + } + public void switchToGoogleDocsWindowandAndEditContent(String title, String content) + { + waitInSeconds(20); + switchWindow(1); + waitInSeconds(8); + changeGoogleDocsTitle(title); + editGoogleDocsContent(content); + closeWindowAndSwitchBack(); + } + public void loginToGoogleDocs() { + log.info("Navigate to Login Page"); + + String currentWindow = webDriver.get().getCurrentUrl(); + + webDriver.get().get(googleDocsLoginUrl); + waitInSeconds(5); + + if(isElementDisplayed(googleDocEmailId)) { + waitUntilElementIsVisible(googleDocEmailId).sendKeys(googleDocsTestEmail); + waitUntilElementIsVisible(submitEmails).click(); + waitInSeconds(5); + if(isElementDisplayed(googleDocagainEmailId)) { + waitUntilElementIsVisible(googleDocagainEmailId).sendKeys(googleDocsTestEmail); + waitUntilElementIsVisible(nextButton).click(); + waitInSeconds(5); + waitUntilElementIsVisible(googleDocsPassword).sendKeys(googleDocsTestPassword); + waitUntilElementIsVisible(logInToGoogleDocsButton).click(); + waitInSeconds(10); + waitUntilElementIsVisible(continueGoogleDocsButton).click(); + waitInSeconds(5); + + }else + { + waitUntilElementIsVisible(googleDocsPassword).sendKeys(googleDocsTestPassword); + waitUntilElementIsVisible(passwordNextButton).click(); + waitInSeconds(10); + } + } + + waitInSeconds(2); + webDriver.get().get(currentWindow); + + } + + + + public boolean isLockedIconDisplayed() + { + return isElementDisplayed(lockedIcon); + } + + public boolean isLockedDocumentMessageDisplayed() + { + return isElementDisplayed(lockedDocumentMessage); + } + public boolean isGoogleDriveIconDisplayed() + { + return isElementDisplayed(googleDriveIcon); + } + public void assertisLockedIconDisplayed() + { + Assert.assertTrue(isLockedIconDisplayed(), "Locked Icon is not displayed"); + } + public void assertisLockedDocumentMessageDisplayed() + { + Assert.assertTrue(isLockedDocumentMessageDisplayed(), "Locked Icon is not displayed"); + } + public void assertisGoogleDriveIconDisplayed() + { + Assert.assertTrue(isGoogleDriveIconDisplayed(), "Locked Icon is not displayed"); + } + + public void checkInGoogleDoc(String file) + { + String fileLocator = "//a[contains(text(), '" + file + "')]"; + + waitUntilElementIsVisible(By.xpath(fileLocator)); + WebElement fileLink = findElement(By.xpath(fileLocator)); + + mouseOver(fileLink); + waitUntilElementIsVisible(checkInGoogleDoc).click(); + + waitUntilWebElementIsDisplayedWithRetry(fileLink); + + } + + +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/SocialFeatures.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/SocialFeatures.java index c5f960aa9a..7539218bb6 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/SocialFeatures.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/SocialFeatures.java @@ -25,7 +25,7 @@ public class SocialFeatures extends DocumentLibraryPage protected String password = "alfresco123!"; protected String gEmail = "test.alfresco5@gmail.com"; protected String gPassword = "Ness2015*"; - + private final By commentContent = By.cssSelector("[class=comment-content]"); @FindBy (css = ".section input[id*='input']") private WebElement publicLinkInputField; @FindBy (css = "a.quickshare-action-view") @@ -60,6 +60,8 @@ public class SocialFeatures extends DocumentLibraryPage private By commentCounterSelector = By.cssSelector(".comment-count"); private By shareButton = By.cssSelector("a.quickshare-action"); private By likesCount = By.cssSelector("span.likes-count"); + private By publicLink_InputField = By.cssSelector(".section input[id*='input']"); + private By enabled_ShareButton = By.xpath("//a[@class='quickshare-action enabled']"); public SocialFeatures(ThreadLocal webDriver) { @@ -78,36 +80,64 @@ public String getLikeButtonMessage(String fileName) return selectDocumentLibraryItemRow(fileName).findElement(likeButton).getAttribute("title"); } + public String getCommentButtonMessage(String fileName) + { + return selectDocumentLibraryItemRow(fileName).findElement(commentButton).getAttribute("title"); + } + public String getCommentContent() + { + return getElementText(commentContent); + } public int getNumberOfLikes(String fileName) { + waitInSeconds(2); String likesNo = selectDocumentLibraryItemRow(fileName).findElement(likesCount).getText(); return Integer.parseInt(likesNo); } - public void clickLikeButton(String fileName) + public SocialFeatures clickLikeButton(String fileName) { selectDocumentLibraryItemRow(fileName).findElement(likeButton).click(); waitUntilElementIsVisible(enabledLikeButton); + return this; } public boolean isLikeButtonEnabled(String fileName) { + waitInSeconds(3); return isElementDisplayed(selectDocumentLibraryItemRow(fileName), enabledLikeButton); } + public SocialFeatures assertCommentButtonMessage(String fileName, String message) + { + log.info("Assert Comment button message {}"); + waitInSeconds(2); + assertEquals(getCommentButtonMessage(fileName), message, String.format("Comment Button Message not equal %s ", message)); + return this; + } + public SocialFeatures assertCommentContent(String comment) + { + log.info("Assert Commented text {}"); + waitInSeconds(2); + assertEquals(getCommentContent(), comment, "Comment text is not correct"); + return this; + } public String getLikeButtonEnabledText(String fileName) { + waitInSeconds(3); return selectDocumentLibraryItemRow(fileName).findElement(enabledLikeButton).getAttribute("title"); } - public void clickUnlike(String fileName) + public SocialFeatures clickUnlike(String fileName) { waitUntilElementIsVisible(enabledLikeButton); selectDocumentLibraryItemRow(fileName).findElement(enabledLikeButton).click(); + return this; } public DocumentDetailsPage clickCommentLink(String contentName) { + waitInSeconds(2); selectDocumentLibraryItemRow(contentName).findElement(commentLinkSelector).click(); return new DocumentDetailsPage(webDriver); } @@ -215,7 +245,7 @@ public boolean checkShareButtonAvailability() public boolean isPublicLinkInputFieldDisplayed() { - return isElementDisplayed(publicLinkInputField); + return isElementDisplayed(publicLink_InputField); } public void clickPublicLinkViewButton() @@ -287,4 +317,19 @@ public SocialFeatures assertIsLikeButtonEnabled(String fileName) assertTrue(isLikeButtonEnabled(fileName), "Like button is not enabled for File/Folder"); return this; } + public SocialFeatures assertIsShareButtonAvailable() + { + assertTrue(isElementDisplayed(shareButton), "Share Button is not Available"); + return this; + } + public SocialFeatures assertIsPublicLinkInputFieldDisplayed() + { + assertTrue(isPublicLinkInputFieldDisplayed(), "Share Button is not Available"); + return this; + } + public SocialFeatures assertShareButtonEnabled(String fileName) + { + assertTrue(isElementDisplayed(selectDocumentLibraryItemRow(fileName), enabled_ShareButton), "Share Button is not Enabled"); + return this; + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/UploadContent.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/UploadContent.java index 3a65dd4203..7cd7a07878 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/UploadContent.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/document/UploadContent.java @@ -90,6 +90,7 @@ public void uploadContent(String filePath, String contentsOfFile) public void uploadContent(String filePath) { + waitInSeconds(3); uploadContent(filePath, "contents"); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/CopyMoveUnzipToDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/CopyMoveUnzipToDialog.java index e17896e741..a455a3abca 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/CopyMoveUnzipToDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/CopyMoveUnzipToDialog.java @@ -26,16 +26,21 @@ public class CopyMoveUnzipToDialog extends BaseDialogComponent private final By dialogTitle = By.cssSelector("div[id*='title']"); private final By unzipCopyMoveButton = By.cssSelector("button[id$='_default-copyMoveTo-ok-button']"); private final By cancelButton = By.cssSelector("button[id$='_default-copyMoveTo-cancel-button']"); + private final By copyButton = By.xpath("//span[text()=\"Copy\"]"); + private final By moveButton = By.xpath("//span[text()=\"Move\"]"); private final By recentSitesDestination = By.cssSelector("button[id$='copyMoveTo-recentsites-button']"); private final By sharedFilesDestination = By.cssSelector("span[id$='default-copyMoveTo-shared']"); private final By myFilesDestination = By.cssSelector("button[id$='copyMoveTo-myfiles-button']"); private final By allSitesDestination = By.cssSelector("button[id$='copyMoveTo-site-button']"); private final By folderPathsArea = By.cssSelector("div[id$='default-copyMoveTo-treeview']"); private final By sitePickerArea = By.cssSelector(".site-picker"); + private final By allSites = By.xpath("(//span[@class=\"alf-menu-bar-label-node\"])[9]"); + private final By site_PickerArea = By.xpath("//div[@class=\"alfresco-pickers-SingleItemPicker\"]"); private final By dialogBody = By.cssSelector("div[id$='default-copyMoveTo-dialog']"); + private final By documentLibraryPath = By.xpath("//div[@class=\"alfresco-navigation-Tree \"]//span[text()=\"documentLibrary\"]"); private final By documentsRootPath = By.cssSelector("div[id$='default-copyMoveTo-treeview'] div[class='ygtvitem selected']>table span"); - private final String siteToSelect = "//h4[text()='%s']"; + private final String site_ToSelect = "//span[text()='%s']"; private final String folderElementToSelect = "//span[@class='ygtvlabel' and text()='%s']"; private final String folderElementToSelectRow = "//span[@class='ygtvlabel' and text()='%s']/../../../../.."; private final String destinationChecked = "yui-radio-button-checked"; @@ -84,6 +89,12 @@ public CopyMoveUnzipToDialog selectAllSitesDestination() waitUntilElementIsVisible(sitePickerArea); return this; } + public CopyMoveUnzipToDialog select_AllSitesDestination() + { + log.info("Select Shared Files destination"); + clickElement(allSites); + return this; + } public CopyMoveUnzipToDialog selectSite(SiteModel site) { @@ -97,6 +108,16 @@ public CopyMoveUnzipToDialog selectSite(SiteModel site) return this; } + public CopyMoveUnzipToDialog select_Site(SiteModel site) + { + log.info("Select site {}", site.getTitle()); + WebElement sitePicker = waitUntilElementIsVisible(site_PickerArea); + WebElement siteElement = waitUntilChildElementIsPresent(sitePicker, By.xpath(String.format(site_ToSelect, site.getTitle()))); + clickElement(siteElement); + waitInSeconds(5); + + return this; + } private void waitForDocumentsPathAndClick() { @@ -208,4 +229,26 @@ public void clickMoveButton() waitUntilElementDisappears(dialogBody); waitUntilNotificationMessageDisappears(); } -} \ No newline at end of file + public CopyMoveUnzipToDialog clickDocumentsFolder() + { + log.info("Click Documents Folder"); + clickElement(documentLibraryPath); + return this; + } + public CopyMoveUnzipToDialog clickCopyButton() + { + log.info("Click Documents Folder"); + waitInSeconds(3); + clickElement(copyButton); + waitUntilNotificationMessageDisappears(); + return this; + } + public CopyMoveUnzipToDialog click_MoveButton() + { + log.info("Click Documents Folder"); + waitInSeconds(3); + clickElement(moveButton); + waitUntilNotificationMessageDisappears(); + return this; + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/SelectDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/SelectDialog.java index 75ce01e636..b824492dea 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/SelectDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/SelectDialog.java @@ -22,6 +22,7 @@ public class SelectDialog extends BaseDialogComponent private final By resultsPicker = By.cssSelector("div.yui-dialog[style*='visibility: visible'] div[id$='cntrl-picker-results'] .yui-dt-data"); private final By selectedItemsPicker = By.cssSelector("div.yui-dialog[style*='visibility: visible'] div[id$='cntrl-picker-selectedItems'] tbody.yui-dt-data"); private final By okButton = By.cssSelector("div.yui-dialog[style*='visibility: visible'] button[id$='cntrl-ok-button']"); + private final By selectButton = By.xpath(" //button[text()='Select']"); private final By cancelButton = By.cssSelector("div.yui-dialog[style*='visibility: visible'] button[id$='cntrl-cancel-button']"); private final By itemsRows = By.cssSelector("tr.yui-dt-rec:not(.create-new-row)"); private final By addIcon = By.cssSelector("a[class^='add-item']"); @@ -185,4 +186,10 @@ public SelectDialog clickCreateNewIcon() return this; } + + public SelectDialog clickSelectButton() { + waitInSeconds(2); + clickElement(selectButton); + return this; + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/DocumentsFilters.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/DocumentsFilters.java index 0b1931e91a..e72dfd0ab5 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/DocumentsFilters.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/DocumentsFilters.java @@ -10,9 +10,23 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindAll; import org.openqa.selenium.support.FindBy; - +import static org.testng.Assert.assertTrue; public class DocumentsFilters extends SiteCommon { + private By documents_DropDown = By.cssSelector("h2[class ='alfresco-twister alfresco-twister-open']"); + private By all_DocumentsFilter = By.cssSelector("span.all a"); + private By im_EditingFilter = By.cssSelector("span.editingMe a"); + private By others_AreEditingFilter =By.cssSelector("span.editingOthers a"); + private By recently_ModifiedFilter = By.cssSelector("span.recentlyModified a"); + private By recently_AddedFiler = By.cssSelector("span.recentlyAdded a"); + private By my_FavouritesFilter = By.cssSelector("span.favourites a"); + private By documents_Link = By.cssSelector(" td[id='ygtvcontentel1'] span[id*='ygtvlabelel'] "); + private By library_Filter = By.cssSelector("div[class ='treeview filter']"); + private By categories_Filter = By.cssSelector("div[class ='categoryview filter']"); + private By categories_Root = By.cssSelector("td[id ='ygtvcontentel3'] span[id ='ygtvlabelel3']"); + private By tag_Filter = By.xpath("//div[@class='filter']"); + + int counter = 0; @FindBy (css = "h2[class ='alfresco-twister alfresco-twister-open']") private WebElement documentsDropDown; @@ -54,7 +68,7 @@ public class DocumentsFilters extends SiteCommon private WebElement headerAfterFilter; @FindAll (@FindBy (css = ".filter .tag-link")) private List tagsFromFilter; - + private By sideBarFilterOptions = By.cssSelector(".alfresco-twister"); public DocumentsFilters(ThreadLocal webDriver) { super(webDriver); @@ -66,7 +80,8 @@ public DocumentsFilters(ThreadLocal webDriver) public ArrayList getSidebarFilters() { ArrayList sidebarText = new ArrayList<>(); - for (WebElement aSidebarFiltersList : sidebarFiltersList) + List filterOptions = findElements(sideBarFilterOptions); + for (WebElement aSidebarFiltersList : filterOptions) { sidebarText.add(aSidebarFiltersList.getText()); } @@ -92,7 +107,7 @@ public String getRelativePath() public boolean isDocumentsDropDownDisplayed() { - return documentsDropDown.isDisplayed(); + return isElementDisplayed(documents_DropDown); } public void clickAllDocumentsFilter() @@ -137,7 +152,7 @@ public String getDocumentsLinkText() public boolean isDocumentsLinkPresent() { - return documentsLink.isDisplayed(); + return isElementDisplayed(documents_Link); } public String getFirstFolderName() @@ -162,7 +177,7 @@ public void clickSecondFolder() public boolean isCategorisFilterDisplayed() { - return categoriesFilter.isDisplayed(); + return isElementDisplayed(categories_Filter); } public void clickCategoriesRoot() @@ -172,7 +187,7 @@ public void clickCategoriesRoot() public boolean isCategoriesRootDisplayed() { - return categoriesRoot.isDisplayed(); + return isElementDisplayed(categories_Root); } public boolean isCategoryDisplayed(String filterName) @@ -187,7 +202,7 @@ public void clickCategoryRootIcon() public boolean checkIfTagsFilterIsPresent() { - return tagsFilter.isDisplayed(); + return isElementDisplayed(tag_Filter); } public void clickTagsLink() @@ -227,7 +242,10 @@ public boolean areTagsPresent() { return isElementDisplayed(By.cssSelector("span[class ='tag']")); } - + public void assertIsTagPresentInSideBar(String tagName) + { + assertTrue(getSidebarTag(tagName).contains(tagName), "Sidebar Tags filter contains " + tagName); + } public String getSidebarTag(String tagName) { Parameter.checkIsMandotary("Tag", selectTagByTagName(tagName)); @@ -251,36 +269,36 @@ public void clickSelectedTag(String tagName) public boolean isallDocumentsFilterDisplayed() { - return allDocumentsFilter.isDisplayed(); + return isElementDisplayed(all_DocumentsFilter); } public boolean isIMEditingFilterDisplayed() { - return iMEditingFilter.isDisplayed(); + return isElementDisplayed(im_EditingFilter); } public boolean isOthersAreEditingFilterDisplayed() { - return othersAreEditingFilter.isDisplayed(); + return isElementDisplayed(others_AreEditingFilter); } public boolean isRecentlyModifiedFilterDisplayed() { - return recentlyModifiedFilter.isDisplayed(); + return isElementDisplayed(recently_ModifiedFilter); } public boolean isRecentlyAddedFilterDisplayed() { - return recentlyAddedFiler.isDisplayed(); + return isElementDisplayed(recently_AddedFiler); } public boolean isMyFavoritesFilterDisplayed() { - return myFavouritesFilter.isDisplayed(); + return isElementDisplayed(my_FavouritesFilter); } public boolean isLibraryLinkDisplayed() { - return libraryFilter.isDisplayed(); + return isElementDisplayed(library_Filter); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/HeaderMenuBar.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/HeaderMenuBar.java index 7db76288b0..4e58dac518 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/HeaderMenuBar.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/pageCommon/HeaderMenuBar.java @@ -1,12 +1,20 @@ package org.alfresco.po.share.alfrescoContent.pageCommon; import java.util.List; + +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.SiteCommon; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import org.testng.Assert; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +@Slf4j public class HeaderMenuBar extends SiteCommon { @FindBy (css = "button[id*='fileSelect']") @@ -22,6 +30,11 @@ public class HeaderMenuBar extends SiteCommon private WebElement selectedItemsMenuDisabled; private final By selectedItemsOptionsSelector = By.cssSelector("div[id*='selectedItems'] span"); + private final By select_menu = By.cssSelector("button[id*='fileSelect']"); + private final By select_OptionsList = By.cssSelector("div[id*='fileSelect-menu'] span"); + private final By selected_ItemsMenu = By.xpath("(//button[@type='button'])[10]"); + private final By selected_ItemsMenuDisabled = By.cssSelector(".selected-items button[disabled]"); + public HeaderMenuBar(ThreadLocal webDriver) { @@ -40,9 +53,11 @@ public boolean isSelectButtonDisplayed() return isElementDisplayed(selectMenu); } - public void clickSelectMenu() + public HeaderMenuBar clickSelectMenu() { - clickElement(selectMenu); + clickElement(select_menu); + return this; + } public void clickSelectOption(String optionText) @@ -52,7 +67,19 @@ public void clickSelectOption(String optionText) public boolean isSelectedItemsMenuEnabled() { - return !isElementDisplayed(selectedItemsMenuDisabled); + return !isElementDisplayed(selected_ItemsMenuDisabled); + } + public HeaderMenuBar assertSelectedItemsMenuDisabled() + { + log.info("Verify that the Selected Items Menu Disabled"); + Assert.assertFalse(isSelectedItemsMenuEnabled(), "'Selected Items...' menu is Disabled."); + return this; + } + public HeaderMenuBar assertSelectedItemsMenuEnabled() + { + log.info("Verify that the Selected Items Menu Enabled"); + assertTrue(isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); + return this; } public boolean isSelectItemsMenuDisplayedDisabled() @@ -62,7 +89,7 @@ public boolean isSelectItemsMenuDisplayedDisabled() public void clickSelectedItemsMenu() { - selectedItemsMenu.click(); + findElement(selected_ItemsMenu).click(); } public void clickSelectedItemsOption(String optionText) @@ -70,4 +97,16 @@ public void clickSelectedItemsOption(String optionText) List selectedItemsOptionsList = findDisplayedElementsFromLocator(selectedItemsOptionsSelector); selectOptionFromFilterOptionsList(optionText, selectedItemsOptionsList); } + public void click_SelectOption(String option_Name) + { + List optionList = findElements(select_OptionsList); + for (WebElement webElement : optionList) + { + if (webElement.getText().contains(option_Name)) + { + webElement.click(); + } + } + + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/CommentsPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/CommentsPage.java new file mode 100644 index 0000000000..b9e6ce920e --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/CommentsPage.java @@ -0,0 +1,36 @@ +package org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders; + +import org.alfresco.common.WebElementInteraction; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class CommentsPage extends WebElementInteraction +{ + private By bold_ButtonEnabled = By.xpath("//div[@aria-label='Bold']//button/.."); + private By italic_ButtonEnabled = By.xpath("//div[@aria-label='Italic']//button/.."); + public CommentsPage(ThreadLocal webDriver) { + super(webDriver); +} + public WebElement boldButtonEnabled (){ + return findElement(bold_ButtonEnabled); + } + public WebElement italicButtonEnabled (){ + return findElement(italic_ButtonEnabled); + } + + public boolean isTextEditorButtonEnabled(WebElement element) + { + boolean state = false; + String value = element.getAttribute("aria-pressed"); + if (value.equals("true")) + { + state = true; + } else + { + state = false; + } + + return state; + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditInAlfrescoPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditInAlfrescoPage.java index 0c93f372ff..db5a807ada 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditInAlfrescoPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditInAlfrescoPage.java @@ -24,7 +24,10 @@ public class EditInAlfrescoPage extends SiteCommon // @FindBy (css = "textarea[id*='_content']") // private WebElement contentTextarea; - + private final By nameField = By.cssSelector("input[name='prop_cm_name']"); + private final By titleField = By.cssSelector("input[name='prop_cm_title']"); + private final By descriptionField = By.cssSelector("textarea[name='prop_cm_description']"); + private final By contentField=By.cssSelector("textarea[id*='_content']"); private By contentTextarea = By.cssSelector("textarea[id*='_content']"); @FindBy (css = "input[id*='title']") @@ -72,28 +75,32 @@ public EditInAlfrescoPage enterDocumentDetails(String name, String content, Stri return this; } - private void typeName(String name) + public EditInAlfrescoPage typeName(String name) { log.info("Type name: {}", name); - clearAndType(nameInput, name); + clearAndType(nameField,name); + return this; } - public void typeContent(String content) + public EditInAlfrescoPage typeContent(String content) { log.info("Type content: {}", content); - clearAndType(contentTextarea, content); + clearAndType(contentField, content); + return this; } - private void typeTitle(String title) + public EditInAlfrescoPage typeTitle(String title) { log.info("Type title: {}", title); - clearAndType(titleInput, title); + clearAndType(titleField, title); + return this; } - private void typeDescription(String description) + public EditInAlfrescoPage typeDescription(String description) { log.info("Type description: {}", description); - clearAndType(descriptionTextarea, description); + clearAndType(descriptionField, description); + return this; } public EditInAlfrescoPage assertEditInAlfrescoPageTitleEquals(String title) diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesDialog.java index bdd333de7f..a71f329144 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesDialog.java @@ -8,10 +8,15 @@ import org.alfresco.po.share.alfrescoContent.organizingContent.taggingAndCategorizingContent.SelectDialog; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; @Slf4j public class EditPropertiesDialog extends BaseDialogComponent { + private final By editPropertiesList = By.xpath("//*[@id=\"template_x002e_documentlist_v2_x002e_myfiles_x0023_default-editDetails-alf-id103-form-fields\"]/div/div/label"); private final By dialogTitle = By.cssSelector("div[id$='dialogTitle']"); private final By propertyName = By.cssSelector("input[name='prop_cm_name']"); private final By propertyTitle = By.cssSelector("input[name='prop_cm_title']"); @@ -113,6 +118,20 @@ public EditPropertiesDialog assertIseditPropertiesDialogEquals(String contentNam "Displayed dialog="); return this; } + public boolean verifyAllElementsAreDisplayed() + { + List elementList = new ArrayList<>(); + for (WebElement file : findElements(editPropertiesList)) + { + elementList.add(file.getText()); + } + return true; + } + public void assertVerifyEditPropertiesElementsAreDisplayed() + { + log.info("Verify that the all Elements in Edit Propertied names are Displayed."); + assertTrue(verifyAllElementsAreDisplayed(), "Some elements of the 'Edit Properties' dialog are not displayed"); + } public EditPropertiesDialog assertIsSelectTagsButtonDisplayed() { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesPage.java index 80bc35dfae..1e1b6ceae1 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/EditPropertiesPage.java @@ -27,6 +27,7 @@ public class EditPropertiesPage extends SiteCommon private final By helpMessageForRestrictableAspect = By.cssSelector("[id='template_x002e_edit-metadata_x002e_edit-metadata_x0023_default_prop_dp_offlineExpiresAfter-help']"); private final By offlineExpiresafterInput = By.cssSelector("[id*='default_prop_dp_offlineExpiresAfter-entry']"); private final By buttonsList = By.cssSelector("button[id*='form']"); + private final By selectButton = By.xpath("//button[text()='Select']"); private final By propertiesElements = By.cssSelector(".form-field>label"); private final By selectorSF = By.cssSelector("select[id*='default_prop_smf_system-template-location']"); @@ -90,6 +91,11 @@ public DocumentDetailsPage clickButton(String buttonName) refresh(); return new DocumentDetailsPage(webDriver); } + public SelectDialog clickSelectButton() + { + findElement(selectButton).click(); + return new SelectDialog(webDriver); + } public void clickButtonForFolder(String buttonName) { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/ManagePermissionsPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/ManagePermissionsPage.java index 3894b50fae..2932f4d759 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/ManagePermissionsPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/alfrescoContent/workingWithFilesAndFolders/ManagePermissionsPage.java @@ -43,7 +43,7 @@ public class ManagePermissionsPage extends SiteCommon private By userNameLocator = By.cssSelector("td[class$='displayName']"); private By userRoleLocator = By.cssSelector("td[class*='role']"); private By pageTitle_ = By.cssSelector("span[id$='_default-title']"); - private By addUser = By.cssSelector("span[class$='button' span button]"); +// private By addUser = By.cssSelector("span[class$='button' span button]"); private By inheritPermissionTable_ = By.cssSelector("div[id$='_default-inheritedPermissions']"); private By inheritButtonStatus = By.cssSelector("div[class$='inherited-on']"); private By inheritButtonStatusDisabled = By.cssSelector("div[class$='inherited-off']"); @@ -286,8 +286,8 @@ public DocumentLibraryPage returnTo(String location) public boolean isAddUserGroupButtonDisplayed() { - waitUntilElementIsVisible(addUserGroupButton); - return isElementDisplayed(addUserGroupButton); + waitUntilElementIsVisible(addUserGroupButton_); + return isElementDisplayed(addUserGroupButton_); } public boolean isInheritPermissionsButtonDisplayed() @@ -298,14 +298,14 @@ public boolean isInheritPermissionsButtonDisplayed() public boolean isTheSaveButtonDisplayed() { - waitUntilElementIsVisible(saveButton); - return isElementDisplayed(saveButton); + waitUntilElementIsVisible(saveButton_); + return isElementDisplayed(saveButton_); } public boolean isCancelButtonDisplayed() { - waitUntilElementIsVisible(cancelButton); - return isElementDisplayed(cancelButton); + waitUntilElementIsVisible(cancelButton_); + return isElementDisplayed(cancelButton_); } public boolean isLocallySetPermissionsListDisplayed() @@ -331,20 +331,23 @@ public boolean isDeleteButtonAvailable(String identifier) return isElementDisplayed(deleteButton); } - public void clickAddUserGroupButton() + public ManagePermissionsPage clickAddUserGroupButton() { - clickElement(addUserGroupButton); - waitUntilElementIsVisible(addUserGroupWindow); + clickElement(addUserGroupButton_); + waitUntilElementIsVisible(addUserGroupButton_); + return this; } - public void sendSearchInput(String userName) + public ManagePermissionsPage sendSearchInput(String userName) { Utils.clearAndType(findElement(searchInputBox), userName); + return this; } - public void clickSearchButton() + public ManagePermissionsPage clickSearchButton() { findElement(searchButton).click(); + return this; } public WebElement selectUser(String userName) @@ -359,10 +362,11 @@ public ManagePermissionsPage clickAddButtonForUser(String userName) return this; } - public void clickRoleButton(String item) + public ManagePermissionsPage clickRoleButton(String item) { - clickElement(roleButton); + waitInSeconds(2); selectRowLocallySetPermissions(item).findElement(By.cssSelector("td[class$='yui-dt-col-role'] button")).click(); + return this; } public void selectRole(String role) @@ -370,7 +374,13 @@ public void selectRole(String role) waitUntilElementsAreVisible(roles); findFirstElementWithValue(roles, role).click(); } - + public ManagePermissionsPage select_Role(String role) + { + waitInSeconds(2); + List roleList = findElements(roles); + findFirstElementWithValue(roleList, role).click(); + return this; + } public DocumentLibraryPage clickSave() { waitInSeconds(1); @@ -395,6 +405,12 @@ public boolean isAddUsersGroupsWindowDisplayed() waitUntilElementIsVisible(addUserGroupWindow); return isElementDisplayed(addUserGroupWindow); } + public ManagePermissionsPage assertIsAddUserGroupWindowDisplayed() + { + log.info("Verify Add user group window is Displayed"); + assertTrue(isAddUsersGroupsWindowDisplayed(),"Add users groups window is not displayed"); + return this; + } public void deleteUserFromPermissionsList(String identifier) { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/ConfigureWebViewDashletPopUp.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/ConfigureWebViewDashletPopUp.java index 51b62b9d9a..0d74b57db5 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/ConfigureWebViewDashletPopUp.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/ConfigureWebViewDashletPopUp.java @@ -14,7 +14,7 @@ public class ConfigureWebViewDashletPopUp extends DashletPopUp webDriver) + public ConfigureWebViewDashletPopUp(ThreadLocal webDriver) { super(webDriver); } @@ -70,6 +70,7 @@ public ConfigureWebViewDashletPopUp assertInvalidUrlFieldValidationMessageIsCorr public boolean isConfigureWebViewDashletPopUpDisplayed() { + waitInSeconds(3); return isElementDisplayed(configureWebViewDashletPopUp); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/Dashlet.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/Dashlet.java index 0d1c2f4c41..d4bc8fbae2 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/Dashlet.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/Dashlet.java @@ -154,7 +154,7 @@ public String getDashletColor() String hex = ""; WebElement dashletContainer = findElement(By.cssSelector(".dashlet .title")); String color = dashletContainer.getCssValue("background-color"); - String[] numbers = color.replace("rgb(", "").replace(")", "").split(","); + String[] numbers = color.replace("rgba(", "").replace(")", "").split(","); int number1 = Integer.parseInt(numbers[0]); numbers[1] = numbers[1].trim(); int number2 = Integer.parseInt(numbers[1]); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/MyTasksDashlet.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/MyTasksDashlet.java index 0c9feaa190..a45f7ca1ce 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/MyTasksDashlet.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/MyTasksDashlet.java @@ -146,6 +146,7 @@ public WebElement selectTask(String taskName) public MyTasksDashlet assertTaskNameEqualsTo(String expectedTaskName) { log.info("Assert task name equals to {}", expectedTaskName); + waitInSeconds(3); String taskName = getElementText(getTaskRow(expectedTaskName)); String actualTaskName = taskName.substring(BEGIN_INDEX, taskName.indexOf(NEW_LINE)); @@ -169,14 +170,26 @@ public ViewTaskPage viewTask(String taskName) clickElement(taskRowElement.findElement(viewIcon)); return new ViewTaskPage(webDriver); } + public ViewTaskPage view_Task(String taskName) + { + log.info("Edit task {}", taskName); + WebElement taskRowElement = getTaskRow(taskName); + mouseOver(activeTasksLink); + mouseOver(taskRowElement.findElement(taskNames)); + waitInSeconds(2); + clickElement(taskRowElement.findElement(viewIcon)); + return new ViewTaskPage(webDriver); + } public EditTaskPage editTask(String taskName) { log.info("Edit task {}", taskName); + waitInSeconds(3); WebElement taskRowElement = getTaskRow(taskName); mouseOver(taskRowElement); WebElement editButton = waitUntilElementIsVisible(editIcon); + waitInSeconds(3); clickElement(editButton); return new EditTaskPage(webDriver); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/RssFeedDashlet.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/RssFeedDashlet.java index c7ea2b91b9..c1775a0a3a 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/RssFeedDashlet.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/RssFeedDashlet.java @@ -13,7 +13,6 @@ public class RssFeedDashlet extends Dashlet { private final int SECOND_TAB = 1; - private final By dashletContainer = By.cssSelector("div.dashlet.rssfeed"); private final By feedsList = By.cssSelector("div.headline h4 a"); private final By titleBarActions = By.cssSelector("div[class^='dashlet rssfeed'] .titleBarActions"); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteCalendarDashlet.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteCalendarDashlet.java index 1893bbfe27..09e9840e36 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteCalendarDashlet.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteCalendarDashlet.java @@ -14,7 +14,6 @@ public class SiteCalendarDashlet extends Dashlet { private final int BEGIN_INDEX = 0; - private final By dashletContainer = By.cssSelector("div.dashlet.calendar"); private final By siteEventsNameList = By.cssSelector("div.dashlet.calendar .detail-list-item span>a"); private final By dashletMessage = By.cssSelector("div.dashlet.calendar .dashlet-padding>h3"); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteContributorBreakdownDashlet.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteContributorBreakdownDashlet.java index 791b7e8848..cda5977838 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteContributorBreakdownDashlet.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteContributorBreakdownDashlet.java @@ -1,7 +1,8 @@ package org.alfresco.po.share.dashlet; -import static org.alfresco.common.Wait.WAIT_2; -import static org.alfresco.common.Wait.WAIT_40; +import static org.alfresco.common.RetryTime.RETRY_TIME_10; +import static org.alfresco.common.Wait.*; +import static org.alfresco.utility.Utility.waitToLoopTime; import static org.testng.Assert.assertEquals; import java.util.ArrayList; @@ -39,7 +40,13 @@ public SiteContributorBreakdownDashlet assertPieChartSizeEquals(int expectedPieC assertEquals(waitUntilElementsAreVisible(pieChartSlices).size(), expectedPieChartSize); return this; } - + public SiteContributorBreakdownDashlet assert_PieChartSizeEquals(int expectedPieChartSize) + { + log.info("Assert pie chart size equals: {}", expectedPieChartSize); + waitUntilElementIsDisplayedWithRetry(pieChartLocator, WAIT_10.getValue(), WAIT_40.getValue()); + assertEquals(waitUntilElementsAreVisible(pieChartSlices).size(), expectedPieChartSize); + return this; + } public Map getPieChartSliceTooltip() { HashMap slicesTooltip = new HashMap<>(); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteFileTypeBreakdownDashlet.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteFileTypeBreakdownDashlet.java index aef0916b14..903605a7e7 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteFileTypeBreakdownDashlet.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dashlet/SiteFileTypeBreakdownDashlet.java @@ -1,5 +1,6 @@ package org.alfresco.po.share.dashlet; +import static org.alfresco.common.RetryTime.RETRY_TIME_40; import static org.alfresco.common.RetryTime.RETRY_TIME_80; import static org.alfresco.common.Wait.*; import static org.testng.Assert.assertEquals; @@ -7,6 +8,10 @@ import lombok.extern.slf4j.Slf4j; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.HashMap; +import java.util.Map; @Slf4j public class SiteFileTypeBreakdownDashlet extends Dashlet @@ -54,6 +59,16 @@ public SiteFileTypeBreakdownDashlet assertPieChartSizeEquals(int expectedPieChar String.format("Pie chart size not equals %d ", expectedPieChartSize)); return this; } + public SiteFileTypeBreakdownDashlet assert_PieChartSizeEquals(int expectedPieChartSize) + { + log.info("Assert pie chart size equals: {}", expectedPieChartSize); + waitWithRetryAndReturnWebElement(pieChartSlices, WAIT_10.getValue(), + RETRY_TIME_40.getValue()); + + assertEquals(waitUntilElementsAreVisible(pieChartSlices).size(), expectedPieChartSize, + String.format("Pie chart size not equals %d ", expectedPieChartSize)); + return this; + } public SiteFileTypeBreakdownDashlet assertPieChartTooltipTextEquals(String expectedTooltipText,String pieChartIndex) { @@ -82,4 +97,16 @@ public SiteFileTypeBreakdownDashlet assertPieChartFileTypeNameEquals(String expe return this; } + public Map getPieChartSliceTooltip() + { + HashMap slicesTooltip = new HashMap<>(); + for (WebElement slice : waitUntilElementsAreVisible(pieChartSlices)) + { + mouseOver(slice); + String tooltip = findElement(sliceTooltip).getAttribute("original-title"); + slicesTooltip.put(tooltip.substring(tooltip.indexOf("") + 8, + tooltip.indexOf("")), tooltip.substring(tooltip.indexOf("
"), tooltip.indexOf(""))); + } + return slicesTooltip; + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dialogWindows/ConfirmDeletionDialogForShare.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dialogWindows/ConfirmDeletionDialogForShare.java new file mode 100644 index 0000000000..2fecc54f95 --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/dialogWindows/ConfirmDeletionDialogForShare.java @@ -0,0 +1,31 @@ +package org.alfresco.po.share.dialogWindows; + +import org.alfresco.po.share.BaseDialogComponent; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class ConfirmDeletionDialogForShare extends BaseDialogComponent { + private final By closeButton = By.cssSelector("span.dijitDialogCloseIcon"); + private final By deleteButton = By.cssSelector("span[id='ALF_DELETE_CONTENT_DIALOG_CONFIRMATION_label']"); + private final By cancelButton = By.cssSelector("span[id='ALF_DELETE_CONTENT_DIALOG_CANCELLATION_label']"); + + public ConfirmDeletionDialogForShare(ThreadLocal webDriver) { + super(webDriver); + } + + public void clickCloseButton() { + waitUntilElementIsVisible(closeButton); + clickElement(closeButton); + } + + public void clickCancelButton() { + waitInSeconds(2); + clickElement(cancelButton); + } + + public void clickDeleteButton() { + waitUntilElementIsVisible(deleteButton); + clickElement(deleteButton); + } +} + diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/AdvancedSearchPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/AdvancedSearchPage.java index bf27577baa..d8abca5633 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/AdvancedSearchPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/AdvancedSearchPage.java @@ -3,6 +3,7 @@ import static org.testng.Assert.assertTrue; import java.util.List; +import com.beust.ah.A; import org.alfresco.po.share.SharePage2; import org.alfresco.po.share.navigation.AccessibleByMenuBar; import org.alfresco.po.share.toolbar.Toolbar; @@ -10,17 +11,27 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.Select; +import org.testng.Assert; + + public class AdvancedSearchPage extends SharePage2 implements AccessibleByMenuBar { private final By keywordsSearchField = By.cssSelector("input[id$='default-search-text']"); + private final By firstSearchButtons = By.xpath("(//button[text()='Search'])[1]"); + private final By firstSearchButton = By.cssSelector("button[id$='_default-search-button-1-button']"); + private final By firstSearchButtonAgain = By.cssSelector("#uniqName_12_0_label"); private final By secondSearchButton = By.cssSelector("button[id$='_default-search-button-2-button']"); private final By lookForDropdownButton = By.cssSelector(".selected-form-button button"); private final By lookForDropdownOptions = By.cssSelector(".selected-form-button .yuimenuitem"); - private final By nameInput = By.cssSelector("input[id$='prop_cm_name']"); + private final By contentNameInput = By.cssSelector("input[id$='prop_cm_name']"); + + private final By folderNameInput = By.cssSelector("input[id$='1_prop_cm_name']"); private final By titleTextarea = By.cssSelector("textarea[id$='prop_cm_title']"); - private final By descriptionTextarea = By.cssSelector("textarea[id$='prop_cm_description']"); + private final By folderTitleTextarea = By.cssSelector("textarea[id$='1_prop_cm_title']"); + private final By descriptionTextarea = By.cssSelector("textarea[id$='0_prop_cm_description']"); + private final By folderDescriptionTextarea = By.cssSelector("textarea[id$='1_prop_cm_description']"); private final By mimetypeDropdown = By.cssSelector("select[id$='prop_mimetype']"); private final By dateFromPicker = By.cssSelector("a[id$='prop_cm_modified-cntrl-icon-from'] img"); private final By dateToPicker = By.cssSelector("a[id$='prop_cm_modified-cntrl-icon-to'] img"); @@ -61,16 +72,35 @@ public boolean isKeywordsSearchFieldDisplayed() public SearchPage clickFirstSearchButton() { + waitInSeconds(15); + clickElement(firstSearchButton); + return new SearchPage(webDriver); + } + public SearchPage clickFirstSearchButtonAndRefresh() + { + waitInSeconds(15); clickElement(firstSearchButton); + waitInSeconds(2); + refresh(); return new SearchPage(webDriver); } + public SearchPage clickSecondSearchButton() { clickElement(secondSearchButton); return new SearchPage(webDriver); } + public AdvancedSearchPage clickOnFirstSearchButtons() + { + + clickElement(firstSearchButtons); + waitInSeconds(2); + return this; + } + + public void typeKeywords(String keyword) { clearAndType(findElement(keywordsSearchField), keyword); @@ -80,15 +110,32 @@ public boolean isTopSearchButtonDisplayed() { return isElementDisplayed(firstSearchButton); } + public AdvancedSearchPage assertIsTopSearchButtonDisplayed() + { + Assert.assertTrue(isTopSearchButtonDisplayed(), "Top search button is displayed"); + return this; + } + public AdvancedSearchPage assertPageTitle() + { + Assert.assertEquals(getPageTitle(), language.translate("advancedSearchPage.pageTitle"), "Page title"); + return this; + } public boolean isBottomSearchButtonDisplayed() { return isElementDisplayed(secondSearchButton); } + public AdvancedSearchPage assertIsBottomSearchButtonDisplayed() + { + Assert.assertTrue(isBottomSearchButtonDisplayed(), "Bottom search button is displayed"); + return this; + } - public void clickOnLookForDropdown() + public AdvancedSearchPage clickOnLookForDropdown() { + waitUntilElementIsVisible(lookForDropdownButton); clickElement(lookForDropdownButton); + return this; } public boolean isLookForDropdownOptionDisplayed(String label, String description) @@ -106,8 +153,15 @@ public boolean isLookForDropdownOptionDisplayed(String label, String description } return status; } + public AdvancedSearchPage assertIsLookForDropdownOptionDisplayed(String label, String description) + { + Assert.assertTrue(isLookForDropdownOptionDisplayed(language.translate(label), language.translate(description))); + assertTrue(getCurrentUrl().contains(getRelativePath()), "Advanced Search page is opened"); + return this; + } - public void clickOnLookForDropdownOption(String label) + + public AdvancedSearchPage clickOnLookForDropdownOption(String label) { List dropdownOptions = findElements(lookForDropdownOptions); for (WebElement htmlElement : dropdownOptions) @@ -118,61 +172,170 @@ public void clickOnLookForDropdownOption(String label) break; } } + return this; } public boolean isKeywordsInputDisplayed() { + waitUntilElementIsVisible(keywordsSearchField); return isElementDisplayed(keywordsSearchField); } + public AdvancedSearchPage assertisKeywordsInputDisplayed() + { + waitInSeconds(2); + Assert.assertTrue(isKeywordsInputDisplayed(), "Keywords input is displayed"); + return this; + } public boolean isNameInputDisplayed() { - return isElementDisplayed(nameInput); + return isElementDisplayed(contentNameInput); + } + public AdvancedSearchPage assertIsTitleTextareaDisplayed() + { + Assert.assertTrue(isTitleTextareaDisplayed(), "Title textarea is displayed"); + return this; + } + public boolean isFolderNameInputDisplayed() + { + return isElementDisplayed(folderNameInput); + } + public AdvancedSearchPage assertIsFolderNameInputDisplayed() + { + Assert.assertTrue(isFolderNameInputDisplayed(), "Name input is displayed"); + return this; } public boolean isTitleTextareaDisplayed() { return isElementDisplayed(titleTextarea); } + public AdvancedSearchPage assertisNameInputDisplayed() + { + Assert.assertTrue(isNameInputDisplayed(), "Name input is displayed"); + return this; + } + public boolean isFolderTitleTextareaDisplayed() + { + return isElementDisplayed(folderTitleTextarea); + } + public AdvancedSearchPage assertIsFolderTitleTextareaDisplayed() + { + Assert.assertTrue(isFolderTitleTextareaDisplayed(), "Title textarea is displayed"); + return this; + } public boolean isDescriptionTextareaDisplayed() { return isElementDisplayed(descriptionTextarea); } + public AdvancedSearchPage assertIsDescriptionTextareaDisplayed() + { + Assert.assertTrue(isDescriptionTextareaDisplayed(), "Description textarea is displayed"); + return this; + } + public boolean isFolderDescriptionTextareaDisplayed() + { + return isElementDisplayed(folderDescriptionTextarea); + } + public AdvancedSearchPage assertIsFolderDescriptionTextareaDisplayed() + { + Assert.assertTrue(isFolderDescriptionTextareaDisplayed(), "Description textarea is displayed"); + return this; + } public boolean isMimetypeDropDownDisplayed() { return isElementDisplayed(mimetypeDropdown); } + public AdvancedSearchPage assertIsMimetypeDropDownDisplayed() + { + Assert.assertTrue(isMimetypeDropDownDisplayed(), "Mimetype input is displayed"); + return this; + } public boolean isDateFromPickerDisplayed() { return isElementDisplayed(dateFromPicker); } + public AdvancedSearchPage assertIsDateFromPickerDisplayed() + { + Assert.assertTrue(isDateFromPickerDisplayed(), "Date From picker is displayed"); + return this; + } public boolean isDateToPickerDisplayed() { return isElementDisplayed(dateToPicker); } + public AdvancedSearchPage assertIsDateToPickerDisplayed() + { + Assert.assertTrue(isDateFromPickerDisplayed(), "Date From picker is displayed"); + return this; + } public boolean isModifierInputDisplayed() { return isElementDisplayed(modifierInput); } + public AdvancedSearchPage assertIsModifierInputDisplayed() + { + Assert.assertTrue(isDateFromPickerDisplayed(), "Date From picker is displayed"); + return this; + } public void typeName(String name) { - clearAndType(findElement(nameInput), name); + clearAndType(findElement(contentNameInput), name); + } + public AdvancedSearchPage typeNameFolder(String name) + { + clearAndType(findElement(folderNameInput), name); + waitInSeconds(3); + return this; } - public void typeTitle(String title) + public AdvancedSearchPage typeTitle(String title) { clearAndType(findElement(titleTextarea), title); + waitInSeconds(10); + return this; + } + public void folderTypeTitle(String title) + { + clearAndType(findElement(folderTitleTextarea), title); + waitInSeconds(3); } - public void typeDescription(String description) + public AdvancedSearchPage typeDescription(String description) { + waitUntilElementIsVisible(descriptionTextarea); clearAndType(findElement(descriptionTextarea), description); + waitInSeconds(3); + return this; + } + public AdvancedSearchPage folderTypeDescription(String description) + { + waitUntilElementIsVisible(folderDescriptionTextarea); + clearAndType(findElement(folderDescriptionTextarea), description); + waitInSeconds(2); + return this; + } + + public SearchPage clickFirstSearchButtonAgain() + { + waitInSeconds(15); + clickElement(firstSearchButton); + refresh(); + return new SearchPage(webDriver); + } + public SearchPage clickOnFirstSearchButton() + { + waitInSeconds(15); + clickElement(firstSearchButton); + waitInSeconds(2); + clickElement(firstSearchButtonAgain); + return new SearchPage(webDriver); } public void selectMimetype(String mimetype) @@ -203,4 +366,5 @@ public void setTitle(String criteria) waitUntilElementIsVisible(titleBox); clearAndType(titleBox, criteria); } + } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/ConfirmDeletionDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/ConfirmDeletionDialog.java index ac1512f187..77e9e2e8d1 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/ConfirmDeletionDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/ConfirmDeletionDialog.java @@ -8,6 +8,7 @@ public class ConfirmDeletionDialog extends ConfirmationDialog { private final By dialogNoButton = By.id("ALF_CRUD_SERVICE_DELETE_CONFIRMATION_DIALOG_CANCEL_label"); private final By dialogTitle = By.id("ALF_CRUD_SERVICE_DELETE_CONFIRMATION_DIALOG_title"); + private final By confirmDeletion = By.xpath("(//span[text()='Yes'])[19]"); public ConfirmDeletionDialog(ThreadLocal webDriver) { @@ -23,4 +24,9 @@ public void clickNoButton() { clickElement(dialogNoButton); } + public ConfirmationDialog clickYesButton() + { + clickElement(confirmDeletion); + return this; + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/CreateNewFilterDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/CreateNewFilterDialog.java index a37513be2c..aee1a4994e 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/CreateNewFilterDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/CreateNewFilterDialog.java @@ -15,6 +15,13 @@ public class CreateNewFilterDialog extends BaseDialogComponent private final By dialogTitle = By.className("dijitDialogTitle"); private final By showWithSearch = By.cssSelector("input[name='isEnabled']"); private final By filterPropertyInput = By.id("FORM_FACET_QNAME_CONTROL"); + private final By editIcon = By.xpath("//img[@title=\"Edit the current entry\"]"); + private final By selectedSiteDetails = By.className("read-display"); + private final By sitesDropDownArrow = By.xpath("(//input[@type=\"text\"])[35]"); + private final By sitesNameDropdown = By.className("dijitReset dijitMenuItemLabel"); + private final By dropButton = By.xpath("(//input[@class=\"dijitReset dijitInputField dijitArrowButtonInner\"])[4]"); + private final By dropdown = By.xpath("//td[@class=\"dijitReset dijitMenuItemLabel\"]"); + private final By filterPropertyDropdown = By.id("widget_FORM_FACET_QNAME_CONTROL_dropdown"); private final By filterPropertyOptions = By.cssSelector("div[id^='FORM_FACET_QNAME_CONTROL_popup'].dijitMenuItem"); private final By sortByInput = By.cssSelector("table#FORM_SORTBY_CONTROL div.dijitButtonText"); @@ -66,13 +73,30 @@ public String getSortBy() public String getNoFilters() { + waitInSeconds(3); return getElementText(noFilters); } + public String getNumberOfFilters() + { + waitInSeconds(3); + return findElement(noFilters).getAttribute("value"); + + } public String getMinimumFilterLength() { return getElementText(minFilterLength); } + public String getMiniFilterLength() + { + waitInSeconds(3); + return findElement(minFilterLength).getAttribute("value"); + } + public String getMiniRequiredResults() + { + waitInSeconds(2); + return findElement(minRequiredResults).getAttribute("value"); + } public String getMinimumRequiredResults() { @@ -118,6 +142,89 @@ public void selectFromSortBy(String option) selectOptionFromFilterOptionsList(option, dropdown.findElements(dropdownOptions)); } + public String getSelectedSiteDetail() + { + WebElement selectedSite = findElement(selectedSiteDetails); + return selectedSite.getText(); + } + public void selectInFilterAvailability(String option) + { + clickElement(dropButton); + for (WebElement dropDownList : findElements(dropdown)) + { + if (dropDownList.getText().equals(option)) + { + waitInSeconds(3); + dropDownList.click(); + } + } + + } + + public void deselectShowWithSearchResults() + { + clickElement(showWithSearch); + waitInSeconds(3); + } + public void clickEditIcon() + { + waitInSeconds(3); + clickElement(editIcon); + clickElement(sitesDropDownArrow); + } + public void editSiteName(String query) + { + for (WebElement sitedropdown : findElements(dropdownOptions)) + { + if (sitedropdown.getText().contains(query)) + { + waitInSeconds(5); + sitedropdown.click(); + } + + } + clickElement(sitesDoneEditingButton); + waitInSeconds(3); + + } + public void cancelEditSiteName(String query) + { + waitInSeconds(3); + clickElement(editIcon); + clickElement(sitesSiteNameArrow); + + for (WebElement sitedropdown : findElements(dropdownOptions)) + { + + if (sitedropdown.getText().contains(query)) + { + waitInSeconds(3); + sitedropdown.click(); + } + } + waitInSeconds(3); + clickElement(sitesCancelEditingButton); + } + public void cancelAddSiteName(String query) + { + waitInSeconds(3); + clickElement(sitesAddButton); + clickElement(sitesSiteNameArrow); + for (WebElement sitedropdown : findElements(dropdownOptions)) + { + if (sitedropdown.getText().contains(query)) + { + waitInSeconds(3); + sitedropdown.click(); + } + } + waitInSeconds(3); + clickElement(sitesCancelEditingButton); + } + + + + public CreateNewFilterDialog typeFilterId(String value) { WebElement filterIdElement = waitUntilElementIsVisible(filterIdInput); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/LiveSearchPageSupport.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/LiveSearchPageSupport.java new file mode 100644 index 0000000000..52024d87f7 --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/LiveSearchPageSupport.java @@ -0,0 +1,212 @@ +package org.alfresco.po.share.searching; +import org.alfresco.po.share.site.DocumentLibraryPage; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; + +public class LiveSearchPageSupport extends DocumentLibraryPage { + public LiveSearchPageSupport(ThreadLocal webDriver) + { + super(webDriver); + } + private By documentsTitle = By.cssSelector("div[class$='alf-live-search-documents-title']"); + private By peopleTitle = By.cssSelector("div[class$='alf-live-search-people-title']"); + private By sitesTitle = By.cssSelector("div[class$='alf-live-search-sites-title']"); + private By documentsElement = By.cssSelector("div[class$='alf-live-search-documents-list']"); + private By peopleElement = By.cssSelector("div[class$='alf-live-search-people-list']"); + private By sitesElement = By.cssSelector("div[class$='alf-live-search-sites-list']"); + private By scopeSiteText = By.cssSelector("div[class^='alf-livesearch-context__site'] a"); + private By documentsList = By.cssSelector("div[class$='alf-live-search-documents-list'] div.alf-livesearch-item"); + private final By searchBoxInput = By.cssSelector("input[id='HEADER_SEARCHBOX_FORM_FIELD']"); + private final By moreButton = By.cssSelector("div.alf-livesearch-more a span"); + private final By closeButton = By.cssSelector("div.alfresco-header-SearchBox-clear a"); + private final By peopleList = By.cssSelector("div[class$='alf-live-search-people-list'] div.alf-livesearch-item a.alf-livesearch-item__name"); + private final By siteList = By.xpath("//a[@class=\"alf-livesearch-item__name\"]"); + private final By scopeSites = By.cssSelector(".alf-livesearch-context__site"); + private final By scopeRepository = By.cssSelector(".alf-livesearch-context__repo"); + + public boolean isDocumentsTitleDisplayed() + { + return findElement(documentsTitle).isDisplayed(); + } + public boolean isPeopleTitleDisplayed() + { + return findElement(peopleTitle).isDisplayed(); + } + public boolean isSitesTitleDisplayed() + { + return findElement(sitesTitle).isDisplayed(); + } + public boolean areAnyDocumentElementsDisplayed() + { + return findElement(documentsElement).isDisplayed(); + } + public boolean areAnyPeopleElementsDisplayed() + { + return findElement(peopleElement).isDisplayed(); + } + public boolean areAnySiteElementsDisplayed() + { + return findElement(sitesElement).isDisplayed(); + } + public void clickMore() + { + clickElement(moreButton, 15); + + } + public void closeLiveSearchResults() + { + waitUntilElementClickable(closeButton).click(); + } + public void clickDocumentName(String documentName) + { + waitUntilElementIsVisibleWithRetry(By.xpath("//div[@class='alf-livesearch-item']//a[text()='" + documentName + "']"), 4); + findElement(By.xpath("//div[@class='alf-livesearch-item']//a[text()='" + documentName + "']")).click(); + } + public void clickUserName(String userName) + { + waitUntilElementIsVisibleWithRetry(By.xpath("//div[@class='alf-livesearch-item']//a[text()='" + userName + "']"), 4); + findElement(By.xpath("//div[@class='alf-livesearch-item']//a[text()='" + userName + "']")).click(); + } + public void clickSiteName(String siteName) + { + waitUntilElementIsVisibleWithRetry(By.xpath("//div[@class='alf-livesearch-item']//a[text()='" + siteName + "']"), 4); + findElement(By.xpath("//div[@class='alf-livesearch-item']//a[text()='" + siteName + "']")).click(); + } + public boolean isScopeRepositoryDisplayed(String searchTerm) + { + + { + waitInSeconds(3); + clearAndType(searchBoxInput, searchTerm); + waitInSeconds(10); + clearAndType(searchBoxInput, searchTerm); + waitInSeconds(10); + clearAndType(searchBoxInput, searchTerm); + waitInSeconds(3); + clearAndType(searchBoxInput, searchTerm); + waitInSeconds(10); + clearAndType(searchBoxInput, searchTerm); + waitInSeconds(10); + clearAndType(searchBoxInput, searchTerm); + WebElement scopeRepository = findElement(By.cssSelector("div[class^='alf-livesearch-context__repo']")); + return scopeRepository.isDisplayed(); + } + } + public boolean isScopeSitesDisplayed() + { + + { + waitInSeconds(5); + WebElement scopeSites = findElement(By.cssSelector(".alf-livesearch-context__site")); + return scopeSites.isDisplayed(); + } + } + public String getScopeSiteText(String siteName) + + { + waitInSeconds(3); + clearAndType(searchBoxInput, siteName); + waitInSeconds(10); + clearAndType(searchBoxInput, siteName); + waitInSeconds(10); + clearAndType(searchBoxInput, siteName); + WebElement scopeText = findElement(scopeSiteText); + return scopeText.getText() ; + } + + + public String getDocumentDetails(String docName) + { + waitInSeconds(3); + clearAndType(searchBoxInput, docName); + waitInSeconds(10); + clearAndType(searchBoxInput, docName); + waitInSeconds(10); + clearAndType(searchBoxInput, docName); + waitInSeconds(3); + clearAndType(searchBoxInput, docName); + waitInSeconds(10); + clearAndType(searchBoxInput, docName); + waitInSeconds(10); + clearAndType(searchBoxInput, docName); + + waitUntilElementIsDisplayedWithRetry(documentsList); + return findFirstElementWithValue(documentsList, docName).getText(); + } + + public int getResultsListSize() + { + return findElements(documentsList).size(); + } + public void clickPeopleUserName(String userName) + { + findFirstElementWithValue(peopleList, userName).click(); + } + public String getPeopleResults() + { + List actualItemTitle = new ArrayList<>(); + waitInSeconds(4); + + for (WebElement item : findElements(peopleList)) + { + actualItemTitle.add(item.getText()); + } + System.out.println(actualItemTitle + " this is the list returned"); + return actualItemTitle.toString(); + } + public void selectSiteContext() + { + clickElement(scopeSites); + waitInSeconds(5); + } + public List getSites() + { + List sitesNameList = new ArrayList<>(); + waitInSeconds(6); + + for (WebElement siteName : findElements(siteList)) + { + sitesNameList.add(siteName.getText()); + } + return sitesNameList; + } + public void selectRepoContext() + { + clickElement(scopeRepository); + waitInSeconds(3); + } + public boolean areResultsFromOtherSitesReturned(String expected) + { + boolean state = false; + if (!getSites().contains(expected)) + { + state = false; + + } else + { + if (getSites().toString().equals(expected)) + state = true; + } + return state; + } + public String getSiteResults() + { + List actualItemTitle = new ArrayList<>(); + waitInSeconds(2); + + for (WebElement item : findElements(siteList)) + { + actualItemTitle.add(item.getText()); + } + System.out.println(actualItemTitle + " this is the list returned"); + return actualItemTitle.toString(); + } + public void clickSiteNameLiveSearch(String siteName) + { + findFirstElementWithValue(siteList, siteName).click(); + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchManagerPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchManagerPage.java index bbd4d411c5..b82f5b0ee3 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchManagerPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchManagerPage.java @@ -97,6 +97,7 @@ public SearchManagerPage assertFilterIsNotDisplayed(String filterId) public List getFiltersTableColumns() { + waitInSeconds(3); List columnsTitle = new ArrayList<>(); for (WebElement column : findElements(filterTableColumns)) { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchPage.java index de78bd1ab8..9ee31acaae 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/searching/SearchPage.java @@ -18,6 +18,8 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.testng.Assert; +import org.testng.asserts.SoftAssert; @Slf4j public class SearchPage extends SharePage2 implements AccessibleByMenuBar @@ -27,6 +29,7 @@ public class SearchPage extends SharePage2 implements AccessibleByMe private final By deleteDialogCancel = By.cssSelector("span#ALF_DELETE_CONTENT_DIALOG_CANCELLATION"); private final By numberOfResultsLabel = By.id("FCTSRCH_RESULTS_COUNT_LABEL"); private final By selectedItemsMenu = By.id("SELECTED_ITEMS_MENU_text"); + private final By searchManagerButton = By.xpath("//a[text()='Search Manager']"); private final By resultsDetailedViewList = By.cssSelector(".propertiesCell .nameAndTitleCell a .value"); private final By searchInLabel = By.id("FCTSRCH_TOP_MENU_BAR_SCOPE_LABEL"); private final By searchButton = By.cssSelector("span[class*='confirmationButton'] span"); @@ -80,6 +83,7 @@ public class SearchPage extends SharePage2 implements AccessibleByMe private final By contentName = By.cssSelector(".nameAndTitleCell .value"); private final By contentCheckBox = By.cssSelector("span[class^='alfresco-renderers-Selector']"); private final By noResults = By.cssSelector(".alfresco-search-NoSearchResults"); + SoftAssert softAssert = new SoftAssert(); public SearchPage(ThreadLocal webDriver) { @@ -179,6 +183,47 @@ public String getNumberOfResultsText() { return getElementText(numberOfResultsLabel); } + public SearchPage assertNoResultsFoundDisplayed() + { + log.info("Assert no Results Found is displayed"); + Assert.assertEquals(getNumberOfResultsText(), language.translate("searchPage.noResultsFound"), "No results found"); + return this; + } + public boolean isTheFilterOptionVisible(String filterOption) { + waitInSeconds(3); + for (WebElement filterElement : findElements(By.className("filterLabel"))) { + if (filterElement.getText().equals(filterOption)) { + waitInSeconds(3); + return true; + } + System.out.println("************"+filterElement.getText()); + } + return false; + + } + public boolean isFilterOptionNotVisible(String filterOption, String text) { + for (WebElement filterElement : findElements(By.xpath("(//span[text()='firstName3 lastName3'])[3]"))) { + if (filterElement.getText().equals(filterOption)) { + waitInSeconds(3); + return true; + } + System.out.println("************"+filterElement.getText()); + } + return false; + + } + + public SearchPage assertCheckForSearchManagerButtonIsDisplayed() + { + log.info("Assert search manager button is displayed"); + waitInSeconds(3); + refresh(); + waitInSeconds(5); + refresh(); + assertTrue(isElementDisplayed(searchManager), "Search manager is displayed"); + return this; + } + public Object executeJavaScript(final String js, Object... args) { @@ -192,7 +237,7 @@ public Object executeJavaScript(final String js, Object... args) public void scrollToPageBottom() { executeJavaScript( - "window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));", ""); + "window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));", ""); } public void scrollSome(int distance) @@ -210,9 +255,102 @@ public boolean isResultFound(String query) } return webElement != null; } + public boolean isResultFoundWithList(String query) + { + for (int i = 0; i < 10; i++) { + if (isElementDisplayed(resultsDetailedViewList)) { + break; + } + else + { + refresh(); + waitInSeconds(5); + } + + } + List elementList = waitUntilElementsAreVisible(resultsDetailedViewList); + WebElement webElement = findFirstElementWithValue(elementList, query); + for (int i = 0; i < 10; i++) { + if (webElement == null) { + refresh(); + waitInSeconds(2); + elementList = waitUntilElementsAreVisible(resultsDetailedViewList); + webElement = findFirstElementWithValue(elementList, query); + } + else + { + break; + } + } +// System.out.println("from last : "+webElement); + return webElement != null; + } + public boolean is_ResultFound() + { + waitInSeconds(3); + for (int i = 0; i < 5; i++) { + if (isElementDisplayed(resultsDetailedViewList)) { + } else { + refresh(); + } + } + return isElementDisplayed(resultsDetailedViewList); + } + public SearchPage assertCreatedDataIsDisplayed(String query) + { + log.info("Assert created data like wiki page, data list, event, blog is displayed"); + Assert.assertTrue(isResultFoundWithList(query), query+" is not displayed"); + return this; + } + public SearchPage assertIsXmlFileDisplayed(String query) + { + SoftAssert sa = new SoftAssert(); + sa.assertTrue(isResultFoundWithList(".xml"), ".xml" + " is not displayed"); + + return this; + } + + public SearchPage clickSortDropDown_CreatedDate() + { + clickSortDropdown(); + waitUntilElementIsPresent(By.cssSelector("tr[id*='alfresco_menus_AlfCheckableMenuItem'] td:nth-child(3)")); + selectOptionFromFilterOptionsList("Created date", findElements(sortOptions)); + return this; + } + public SearchPage assertIsXmlFileNotDisplayed(String query) + { + SoftAssert sa = new SoftAssert(); + sa.assertFalse(isResultFound(".xml"), ".xml" + " is not displayed"); + + return this; + } + public SearchPage assertIsXlsFileDisplayed(String query) + { + SoftAssert sa = new SoftAssert(); + sa.assertTrue(isResultFound(".xls"), ".xls" + " is not displayed"); + + return this; + } + public SearchPage assertIsXlsFileNotDisplayed(String query) + { + SoftAssert sa = new SoftAssert(); + sa.assertFalse(isResultFound(".xls"), ".xls" + " is not displayed"); + + return this; + } + public SearchPage assertIsHtmlFileNotDisplayed(String query) + { + SoftAssert sa = new SoftAssert(); + sa.assertFalse(isResultFound(".html"), ".html" + " is not displayed"); + + return this; + } public boolean isResultFoundWithRetry(String query) { + refresh(); + waitInSeconds(2); + refresh(); WebElement webElement = findFirstElementWithValue(resultsDetailedViewList, query); for (int i = 0; i < 5; i++) { @@ -250,8 +388,24 @@ public List getFilterTypeList() public boolean isFilterTypePresent(String filter) { + waitInSeconds(4); return findFirstElementWithValue(filterTypeList, filter) != null; } + public boolean isFilterPresent(String filter) + { + waitInSeconds(3); + + for (WebElement FilterType : findElements(filterTypeList)) + { + if (FilterType.getText().contains(filter)) + { + waitInSeconds(3); + return true; + } + } + + return false; + } public boolean isFilterOptionDisplayed(String filterId, String filterOption) { @@ -261,6 +415,7 @@ public boolean isFilterOptionDisplayed(String filterId, String filterOption) public String getFilterOptionHits(String filterOption) { + waitInSeconds(3); return findFirstElementWithValue(allOptions, filterOption).findElement(By.xpath("following-sibling::*[1]")).getText(); } @@ -269,9 +424,10 @@ public void clickSortDropdown() clickElement(sortDropdownButton); } - public void clickSearchInDropdown() + public SearchPage clickSearchInDropdown() { clickElement(searchInDropdown); + return this; } public String getSearchInDropdownSelectedValue() @@ -379,8 +535,8 @@ public SearchPage clickDetailedView() public boolean isSliderGalleryViewDisplayed() { return (isElementDisplayed(sliderGalleryView) - && isElementDisplayed(sliderIncrementIcon) - && isElementDisplayed(sliderDecrementIcon)); + && isElementDisplayed(sliderIncrementIcon) + && isElementDisplayed(sliderDecrementIcon)); } public void clickFilterOption(String option, String filterBy) @@ -469,7 +625,7 @@ public boolean isActionsLinkDisplayed() return isElementDisplayed(actionsLink); } - public void clickCheckbox(String searchResult) + public SearchPage clickCheckbox(String searchResult) { if (isResultFound(searchResult)) { @@ -482,14 +638,25 @@ public void clickCheckbox(String searchResult) findDisplayedElementsFromLocator(checkboxSelector); } } + return this; + } + public SearchPage click_checkBox(int searchPosition){ + List checkBoxElements = findElements(checkboxList); + checkBoxElements.get(searchPosition).click(); + return this; } - public boolean isSelectedItemsListOptionDisplayed(String optionName) { WebElement action = findFirstElementWithValue(selectedItemsCheckboxOptions, optionName); return isElementDisplayed(action); } + public SearchPage assert_isSelectedItemsListOptionDisplayed(String option_Name) + { + Assert.assertTrue(isSelectedItemsListOptionDisplayed(option_Name), option_Name+" not displayed"); + return this; + } + public void clickOptionFromSelectedItemsListCheckbox(String optionName) { if (isSelectedItemsListOptionDisplayed(optionName)) @@ -499,10 +666,11 @@ public void clickOptionFromSelectedItemsListCheckbox(String optionName) } } - public void clickSelectedItemsDropdown() + public SearchPage clickSelectedItemsDropdown() { clickElement(selectedItemsDropdown); waitUntilElementIsVisibleWithRetry(By.id("SELECTED_ITEMS_MENU_dropdown"), 3); + return this; } public boolean isSelectedItemsOptionDisplayed(String optionName) @@ -511,6 +679,12 @@ public boolean isSelectedItemsOptionDisplayed(String optionName) return isElementDisplayed(action); } + public SearchPage assert_IsSelectedItemsOptionDisplayed(String option_Name) + { + Assert.assertTrue(isSelectedItemsOptionDisplayed(option_Name), option_Name +" not Displayed"); + return this; + } + public void clickOptionFromSelectedItemsDropdown(String optionName) { if (isSelectedItemsOptionDisplayed(optionName)) @@ -519,16 +693,65 @@ public void clickOptionFromSelectedItemsDropdown(String optionName) clickElement(action); } } + public void click_OptionFromSelectedItemsDropdown(String optionName ) + { + List dropDownOptions = findElements(selectedItemsOptions); + for (WebElement webElement : dropDownOptions) + { + if (webElement.getText().contains(optionName)) + { + webElement.click(); + break; + } + } + + } + public SearchPage click_OptionFromSelectedListItemsDropdown(String optionName ) + { + List dropDownOptions = findElements(selectedItemsCheckboxOptions); + for (WebElement webElement : dropDownOptions) + { + if (webElement.getText().contains(optionName)) + { + webElement.click(); + break; + } + } + return this; + } + protected void selectOptionFromFilterOptionsList(String option, + List filterOptionsList) + { + for (WebElement webElement : filterOptionsList) + { + if (webElement.getText().contains(option)) + { + webElement.click(); + break; + } + } + } public boolean isALLItemsCheckboxChecked() { return isElementDisplayed(By.xpath("//div[@id='SELECTED_LIST_ITEMS']/img[@alt='You have all items selected. Click this icon to deselect all.']")); } + public SearchPage assert_isAllItemsCheckBoxChecked() + { + Assert.assertTrue(isALLItemsCheckboxChecked(), "Checkbox Unchecked"); + return this; + } public boolean isNoneItemsCheckboxChecked() { + waitInSeconds(3); return isElementDisplayed(By.xpath("//div[@id='SELECTED_LIST_ITEMS']/img[@alt='You have no items selected. Click this icon to select all.']")); } + public SearchPage assert_isNoneItemsCheckBoxChecked() + { + Assert.assertTrue(isNoneItemsCheckboxChecked(), "Checkbox Unchecked"); + return this; + } public String getSelectedItemsState() { @@ -538,13 +761,15 @@ public String getSelectedItemsState() public void deleteDocuments(boolean areYouSure) { - clickElement(deleteDialogCancel); + // clickElement(deleteDialogCancel); if (areYouSure) { while (isElementDisplayed(deleteDialogConfirm)) { + waitInSeconds(3); clickElement(deleteDialogConfirm); + waitInSeconds(3); } } else { @@ -555,16 +780,18 @@ public void deleteDocuments(boolean areYouSure) } } - public void clickSelectAll() + public SearchPage clickSelectAll() { clickElement(By.cssSelector("div[id='SELECTED_LIST_ITEMS']")); waitUntilElementIsVisibleWithRetry(By.id("SELECTED_LIST_ITEMS_dropdown"), 5); clickElement(By.cssSelector("tr[title='All'] td[class*='dijitMenuItemLabel']")); + return this; } - public void clickSelectedItemsListDropdownArrow() + public SearchPage clickSelectedItemsListDropdownArrow() { clickElement(selectedListItemsDropdownArrow); + return this; } public boolean isNameHighlighted(String name) @@ -580,6 +807,38 @@ public boolean isNameHighlighted(String name) return false; } + public boolean isResultsDisplayedInSearch(String query) + { + int retryCounter = 0; + while (!isElementDisplayed(By.cssSelector(".propertiesCell .nameAndTitleCell a .value")) && retryCounter < 4) + { + waitInSeconds(2); + refresh(); + retryCounter++; + } + waitInSeconds(3); + List searchResults = findElements(resultsDetailedViewList); + for (WebElement result : searchResults) + { + if (result.getText().contains(query)) + return true; + } + return false; + } + + public boolean is_ContentHighlighted(String content) + { + List allContentHighlights = findElements(contentHighlight); + for (WebElement eachContentHighlight : allContentHighlights) + { + if (eachContentHighlight.getText().equals(content)) + { + return true; + } + } + return false; + } + public boolean isContentHighlighted(String content) { if (!isElementDisplayed(contentHighlight)) @@ -609,6 +868,32 @@ public boolean isTitleHighlighted(String title) return findElement(titleHighlight).getText().equals(title); } } + public SearchPage assertIsNameHighlighted(String name) + { + Assert.assertTrue(isNameHighlighted(name), name+" is not highlighted"); + return this; + } + public SearchPage assertNameNotHighlighted(String name) + { + waitInSeconds(3); + Assert.assertFalse(isNameHighlighted(name), name+" is not highlighted"); + return this; + } + public SearchPage assertIsContentHighlighted(String content) + { + Assert.assertTrue(isContentHighlighted(content), content+" is not highlighted"); + return this; + } + public SearchPage assertIsDescriptionHighlighted(String name) + { + Assert.assertTrue(isDescriptionHighlighted(name), name+" is not highlighted"); + return this; + } + public SearchPage assertIsTitleHighlighted(String title) + { + Assert.assertTrue(isTitleHighlighted(title), title+" is not highlighted"); + return this; + } public String getNoSearchResultsText() { @@ -622,6 +907,7 @@ public boolean isAnyFolderReturnedInResults() public boolean isAnyFileReturnedInResults() { + waitInSeconds(3); return isElementDisplayed(contentResult); } @@ -629,6 +915,11 @@ public boolean isConfirmDeletionDialogDisplayed() { return isElementDisplayed(confirmDeleteDialog); } + public SearchPage assertConfirmDeletionDialogNotDisplayed() + { + Assert.assertFalse(isConfirmDeletionDialogDisplayed(),"Confirm deletion dialog is still displayed"); + return this; + } public boolean isSiteHighlighted() { @@ -649,10 +940,23 @@ public void clickSearchButton() { clickElement(searchButton); } + public void clickSearchButtonAgain() + { + waitInSeconds(5); + clickElement(searchButton); + waitInSeconds(5); + refresh(); + clickElement(searchButton); + waitInSeconds(5); + refresh(); + clickElement(searchButton); + waitInSeconds(5); + refresh(); + } public boolean confirmNoItemIsHighlighted() { - waitUntilElementDeletedFromDom(highlight); + waitInSeconds(3); return isElementDisplayed(highlight); } @@ -660,6 +964,11 @@ public void clickContentName(String contentName) { docName(contentName); } + public void clickOnContentName(String contentName) + { + docName(contentName).click(); + } + public void clickSortDropdownOption(String sortingOption) { @@ -694,6 +1003,7 @@ public String getSortFilter() public int getResultsListSize() { + waitInSeconds(3); return findElements(resultsList).size(); } @@ -747,7 +1057,7 @@ public void openFileFromGalleryView(String fileName) public void clickContentThumbnailByName(String contentName) { - image(contentName); + image(contentName).click(); } public String getPreviewedImageName() @@ -762,6 +1072,7 @@ public boolean isContentPreviewed(String docName) public boolean isConfigureSearchButtonDisplayed() { + waitInSeconds(3); return isElementDisplayed(configureSearchButton); } @@ -810,4 +1121,20 @@ public SearchContentActionComponent usingContent(ContentModel contentModel) { return new SearchContentActionComponent(webDriver, contentModel); } -} \ No newline at end of file + public WebDriver getWebDriver() + { + return webDriver.get(); + } + public SearchPage pageRefresh() + { + waitInSeconds(10); + getWebDriver().navigate().refresh(); + waitInSeconds(5); + getWebDriver().navigate().refresh(); + waitInSeconds(5); + getWebDriver().navigate().refresh(); + waitInSeconds(5); + getWebDriver().navigate().refresh(); + return this; + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/CustomizeSitePage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/CustomizeSitePage.java index d75087829c..bff657a0d1 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/CustomizeSitePage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/CustomizeSitePage.java @@ -142,7 +142,7 @@ public boolean isPageAddedToCurrentPages(SitePageType page) public void removePage(SitePageType page) { WebElement pageElem = getSitePageType(page); - pageElem.findElement(By.cssSelector(removeAction)); + pageElem.findElement(By.cssSelector(removeAction)).click(); } public CustomizeSitePage renameSitePage(SitePageType page, String newName) diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/DocumentLibraryPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/DocumentLibraryPage.java index 34712eaca1..370a3cd428 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/DocumentLibraryPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/DocumentLibraryPage.java @@ -17,6 +17,8 @@ import org.alfresco.common.DataUtil; import org.alfresco.common.Utils; import org.alfresco.po.share.UploadFileDialog; +import org.alfresco.po.share.site.dataLists.CreateDataListDialog; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; @@ -75,17 +77,24 @@ public By getLocator() private UploadFileDialog uploadDialog; private NewFolderDialog newContentDialog; - private static final String ACTION_SELECTOR = "div[id*='default-actions']:not([class*='hidden'])>.action-set .{0}>a"; - private static final String ACTION_SELECTOR_MORE = "div[id*='default-actions']:not([class*='hidden']) div.more-actions>.{0}>a"; + protected static final String ACTION_SELECTOR = "div[id*='default-actions']:not([class*='hidden'])>.action-set .{0}>a"; + protected static final String ACTION_SELECTOR_MORE = "div[id*='default-actions']:not([class*='hidden']) div.more-actions>.{0}>a"; /** * more actions */ - private By moreSelector = By.cssSelector("div[id*='default-actions']:not([class*='hidden']) a.show-more"); + protected By moreSelector = By.cssSelector("div[id*='default-actions']:not([class*='hidden']) a.show-more"); + private By dataList = By.cssSelector("#HEADER_SITE_DATA-LISTS_text > a"); + private By contactList = By.xpath("//a[text()=\"Contact List\"]"); + private By TypeTitle = By.xpath("//input[@name=\"prop_cm_title\"]"); + private By clickSaveButton = By.xpath("//button[text()=\"Save\"]"); + + + private By moreActionsMenu = By.cssSelector("div[id*='default-actions']:not([class*='hidden'])>.action-set>.more-actions"); private By uploadButton_ = By.cssSelector("[id$='default-fileUpload-button-button']"); public By createContentMenu = By.cssSelector("div[id*='_default-createContent-menu'].visible"); public By editTagSelector = By.cssSelector("td .detail span[class='insitu-edit']:first-child"); - @FindBy(css = "[id$='default-fileUpload-button-button']") protected WebElement uploadButton; + public By uploadButton = By.cssSelector("[id$='default-fileUpload-button-button']"); @FindBy(css = "button[id$='default-options-button-button']") protected WebElement optionsMenu; @FindBy(css = ".hideFolders") protected WebElement hideFoldersMenuOption; protected By likeButton = By.cssSelector("a.like-action"); @@ -95,7 +104,7 @@ public By getLocator() @FindBy(css = "div[id$='paginatorBottom'] span[class$='current']") private WebElement paginator; @FindBy(css = "div[id$='_default-dl-body']") private WebElement docListContainer; @FindBy(css = ".documents[id$='_default-documents']") private WebElement documentList; - @FindBy(css = "button[id*='createContent']") private WebElement createButton; + private final By createButton = By.cssSelector("button[id$='createContent-button-button']"); @FindBy(css = "div[id$='default-options-menu'] span") private List optionsList; private By optionsMenuDropDown = By.cssSelector("div[id*='default-options-menu'].visible"); private By displayedOptionsListBy = By.xpath("//div[contains(@id, 'default-options-menu')]//li[not(contains(@class, 'hidden'))]"); @@ -108,6 +117,7 @@ public By getLocator() private By documentList_ = By.cssSelector(".documents[id$='_default-documents']"); private By optionMenu_ = By.cssSelector("button[id$='default-options-button-button']"); private By hideFoldersMenuOption_=By.cssSelector(".hideFolders"); + private By explorerPanel_Documents = By.cssSelector(".documentDroppable .ygtvlabel"); //@FindAll(@FindBy(css = ".crumb .folder")) private List breadcrumbList; private List breadcrumbList = findElements((By.xpath("//div[contains(@class, 'crumb')]/a[@class='folder']"))); //@FindBy(css = ".crumb .label a") private WebElement breadcumbCurrentFolder; @@ -156,7 +166,7 @@ public By getLocator() private By lockedByUser = By.cssSelector("div.info-banner a"); private By titleSelector = By.cssSelector("td .title"); private By descriptionSelector = By.cssSelector("td .detail:nth-child(3) span"); - private By commentButton = By.cssSelector("a.comment"); + protected By commentButton = By.cssSelector("a.comment"); public boolean areCreateOptionsAvailable() { @@ -170,6 +180,20 @@ public boolean areCreateOptionsAvailable() } return true; } + public DocumentLibraryPage assertareCreateOptionsAvailable() + { + log.info("Assert Create menu options are available "); + assertTrue(areCreateOptionsAvailable(), "Create menu options are not available"); + return this; + } + public UploadFileDialog createContactDataList(String listName) + { + waitUntilElementIsVisible(dataList).click(); + findElement(contactList).click(); + findElement(TypeTitle).sendKeys(listName); + clickElement(clickSaveButton); + return new UploadFileDialog(webDriver); + } /** * Method to click Plain Text, HTML or XML option from create menu @@ -179,6 +203,10 @@ public CreateContentPage clickCreateContentOption(CreateMenuOption option) clickElement(option.getLocator()); return new CreateContentPage(webDriver); } + public WebDriver getWebDriver() + { + return webDriver.get(); + } /** * Method to click on create google docs options from create menu @@ -548,9 +576,9 @@ public void clickCreateButton() */ public String getExplorerPanelDocuments() { - waitUntilElementsAreVisible(explorerPanelDocumentsList); ArrayList foldersTextList = new ArrayList<>(); - for (WebElement anExplorerPanelDocumentsList : explorerPanelDocumentsList) + List explorerPanelDocumentList = findElements(explorerPanel_Documents); + for (WebElement anExplorerPanelDocumentsList : explorerPanelDocumentList) { foldersTextList.add(anExplorerPanelDocumentsList.getText()); } @@ -740,6 +768,7 @@ public void selectItemAction(String contentItem, ItemActions action) public void selectItemActionFormFirstThreeAvailableOptions(String contentItem, ItemActions action) { + waitInSeconds(WAIT_3.getValue()); WebElement libraryItem = mouseOverContentItem(contentItem); By actionSelector = By.cssSelector(MessageFormat.format(ACTION_SELECTOR, action.getActionLocator())); WebElement actionElement; @@ -913,6 +942,18 @@ public String verifyContentItemsNotSelected(ArrayList expectedNotSelecte } return expectedNotSelectedContentList.toString(); } + public DocumentLibraryPage assertContentItemsNotSelected(ArrayList expectedContentList) + { + log.info("Assert Content Items Not Selected"); + assertEquals(verifyContentItemsNotSelected(expectedContentList), expectedContentList.toString(), "Selected content = "); + return this; + } + public DocumentLibraryPage assertContentItemsSelected(ArrayList expectedContentList) + { + log.info("Assert Content Items Selected"); + assertEquals(verifyContentItemsSelected(expectedContentList), expectedContentList.toString(), "Selected content = "); + return this; + } public boolean isActiveWorkflowsIconDisplayed(String documentLibraryItem) { @@ -966,12 +1007,12 @@ public List getAllTagNames() { List allTagsNames = new ArrayList<>(); int counter = 0; - int retryCount = 5; + int retryCount = 6; while (counter < retryCount) { try { - waitInSeconds(20); + waitInSeconds(30); refresh(); By tagRows = By.cssSelector("ul.filterLink li span.tag a"); waitUntilElementsAreVisible(tagRows); @@ -1047,6 +1088,7 @@ public void mouseOverTags(String contentName) */ public void mouseOverNoTags(String contentName) { + waitInSeconds(2); WebElement contentElement = selectDocumentLibraryItemRow(contentName); Parameter.checkIsMandotary("Content selector", contentElement); WebElement tagElement = contentElement.findElement(noTagsSelector); @@ -1054,12 +1096,34 @@ public void mouseOverNoTags(String contentName) mouseOver(tagElement); waitUntilElementIsVisible(contentElement.findElement(editTagSelector)); } + public void mouseOverNoTagsWithNoEditIcon(String contentName) + { + waitInSeconds(2); + WebElement contentElement = selectDocumentLibraryItemRow(contentName); + Parameter.checkIsMandotary("Content selector", contentElement); + WebElement tagElement = contentElement.findElement(noTagsSelector); + Parameter.checkIsMandotary("Tag selector", tagElement); + mouseOver(tagElement); + } public boolean isEditTagInputFieldDisplayed() { waitUntilElementIsVisible(findElement(editTagInputField_)); return isElementDisplayed(findElement(editTagInputField_)); } + public DocumentLibraryPage assertEditTagInputFieldDisplayed(String fileName) + { + log.info("Assert EditTag Input Field is Displayed {}", fileName); + assertTrue(isEditTagInputFieldDisplayed(), fileName + " -> Edit tag text input field is displayed."); + return this; + } + + public DocumentLibraryPage assertTagNamesDisplayed(String fileName,String actTanames,String tagName) + { + log.info("Assert Tag Names are Displayed {}", fileName); + assertEquals(getTags(fileName), actTanames, tagName + " -> tags="); + return this; + } public void typeTagName(String tagName) { @@ -1082,6 +1146,7 @@ public void clickOnTag(String tagName) waitUntilElementIsVisible(By.xpath( "//ul[contains(@class,'filterLink')]/li/span[contains(@class,'tag')]/a[contains(text(),'" + tagName.toLowerCase() + "')]")).click(); + waitInSeconds(4); } /** @@ -1220,6 +1285,7 @@ public String getLockedByUserName(String fileName) public boolean isLikeButtonDisplayed(String fileName) { + waitInSeconds(3); return isElementDisplayed(selectDocumentLibraryItemRow(fileName), likeButton); } @@ -1240,12 +1306,36 @@ public boolean isCreateButtonDisplayed() public String getCreateButtonStatusDisabled() { - return createButton.getAttribute("disabled"); + return findElement(createButton).getAttribute("disabled"); + } + public DocumentLibraryPage assertCreateButtonStatusDisabled() + { + log.info("Verify Create button is disabled"); + Assert.assertEquals(getCreateButtonStatusDisabled(), "true", "The Create Button is not disabled"); + return this; + } + public DocumentLibraryPage assertCreateButtonStatusEnabled() + { + log.info("Verify Create button is disabled"); + Assert.assertEquals(getCreateButtonStatusDisabled(), null, "The Create Button is disabled"); + return this; } public String getUploadButtonStatusDisabled() { - return uploadButton.getAttribute("disabled"); + return findElement(uploadButton).getAttribute("disabled"); + } + public DocumentLibraryPage assertUploadButtonStatusDisabled() + { + log.info("Verify Upload button is disabled"); + Assert.assertEquals(getUploadButtonStatusDisabled(), "true", "The Upload Button is not disabled"); + return this; + } + public DocumentLibraryPage assertUploadButtonStatusEnabled() + { + log.info("Verify Upload button is disabled"); + Assert.assertEquals(getUploadButtonStatusDisabled(), null, "The Upload Button is disabled"); + return this; } public void clickLinkToFolder(String folderName) @@ -1258,10 +1348,23 @@ public boolean isCreateContentMenuDisplayed() { return isElementDisplayed(createContentMenu); } + public DocumentLibraryPage assertCreateContentMenuIsNotDisplayed() + { + log.info("Verify Create Content Menu Displayed disabled"); + Assert.assertFalse(isCreateContentMenuDisplayed(), "Create Content menu is displayed when the Create button is clicked"); + return this; + } + public DocumentLibraryPage assertCreateContentMenuIsDisplayed() + { + log.info("Verify Create Content Menu Displayed disabled"); + assertTrue(isCreateContentMenuDisplayed(), "Create Content menu is not displayed when the Create button is clicked"); + return this; + } public void clickCreateButtonWithoutWait() { waitUntilElementIsVisible(createButton); + findElement(createButton).click(); } public boolean isFileDisplayed(String fileName) @@ -1309,6 +1412,7 @@ public DocumentLibraryPage assertDocumentLibraryPageTitleEquals(String expectedT public DocumentLibraryPage assertFileIsNotDisplayed(String fileName) { log.info("Assert file is not displayed in Document Library {}", fileName); + waitInSeconds(3); assertFalse(isFileNameDisplayed(fileName), fileName + " is displayed in Document Library"); return this; } @@ -1418,6 +1522,14 @@ public DocumentLibraryPage assertisMoreMenuNotDisplayed(String filename) assertFalse(isMoreMenuDisplayed(filename), "More Menu is displayed"); return this; } + public DocumentLibraryPage assertActionsNoteAvailableForLibrary(String contantName,List actions) + { + log.info( + "Verify that the given actions are not available in more "); + Assert.assertFalse(areActionsAvailableForLibraryItem(contantName, actions), + "Not Expected actions"); + return this; + } public boolean isActionItemAvailableInTheDocumentLibraryItems(String content, ItemActions actionItem) { @@ -1520,6 +1632,12 @@ public DocumentLibraryPage assertIsEditTagIconDisplayed(String contentName) assertTrue(isEditTagIconDisplayed(contentName), "Edit Tag icon is not displayed"); return this; } + public DocumentLibraryPage assertIsEditTagIconNotDisplayed(String contentName) + { + log.info("Verify that the Edit Tag Icon is displayed"); + assertFalse(isEditTagIconDisplayed(contentName), "Edit Tag icon is not displayed"); + return this; + } public DocumentLibraryPage assertIsEditTagInputFieldDisplayed() { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/EditSiteDetails.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/EditSiteDetails.java new file mode 100644 index 0000000000..aca72c95bb --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/EditSiteDetails.java @@ -0,0 +1,129 @@ +package org.alfresco.po.share.site; + +import org.alfresco.po.share.BaseDialogComponent; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class EditSiteDetails extends BaseDialogComponent +{ + private final By closeCreateSitePopup = By.cssSelector("[class*='Close']"); + private final By nameInput = By.cssSelector("div[id='EDIT_SITE_FIELD_TITLE'] input[class$='InputInner']"); + private final By descriptionInput = By.cssSelector("div[id='EDIT_SITE_FIELD_DESCRIPTION'] textarea"); + private final By editSiteDetailsDialog = By.cssSelector("div[id='EDIT_SITE_DIALOG']"); + private final By saveButton = By.cssSelector("span[id='EDIT_SITE_DIALOG_OK_label']"); + private final By nameLabel = By.cssSelector("div[id='EDIT_SITE_FIELD_TITLE'] label.label"); + private final By descriptionLabel = By.cssSelector("div[id='EDIT_SITE_FIELD_DESCRIPTION'] label.label"); + private final By visibilityLabel = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY'] label.label"); + private final By publicVisibilityRadioButton = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION0'] div[class*='dijitRadio'] input"); + private final By publicVisibility_RadioButton = By.xpath("//div[@widgetid=\"EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION0_BUTTON\"]"); + private final By moderatedVisibilityRadioButton = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION1'] div[class*='dijitRadio']"); + private final By privateVisibilityRadioButton = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION2'] div[class*='dijitRadio']"); + private final By private_VisibilityRadioButton = By.xpath("//input[@id=\"EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION2_BUTTON\"]"); + private final By publicVisibilityDescription = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION0'] div.radio-button-label div"); + private final By moderatedVisibilityDescription = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION1'] div.radio-button-label div"); +// private final By privateVisibilityRadioButton = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION2'] div[class*='dijitRadio'] input"); + private final By privateVisibilityDescription = By.cssSelector("div[id='EDIT_SITE_FIELD_VISIBILITY_CONTROL_OPTION2'] div.radio-button-label div"); + private final By cancelButton = By.cssSelector("span[id='EDIT_SITE_DIALOG_CANCEL_label']"); + + public EditSiteDetails(ThreadLocal webDriver) + { + super(webDriver); + } + + public void typeDetails(String title, String description) + { + waitInSeconds(3); + clearAndType(nameInput, title); + waitInSeconds(3); + clearAndType(descriptionInput, description); + } + public String getTitleInputText() + { + waitInSeconds(5); + return findElement(nameInput).getAttribute("value"); + } + public void clickSaveButton() + { + clickElement(saveButton); + } + public String getDescriptionInputText() + { + return findElement(descriptionInput).getAttribute("value"); + } + public void clickCloseCreateSitePopup() + { + clickElement(closeCreateSitePopup); + } + public boolean isEditSiteDetailsDialogDisplayed() + { + waitInSeconds(2); + return isElementDisplayed(editSiteDetailsDialog); + } + public boolean isNameInputDisplayed() + { + waitInSeconds(3); + return isElementDisplayed(nameInput); + } + public String getNameLabel() + { + return findElement(nameLabel).getText(); + } + public boolean isDescriptionInputDisplayed() + { + return isElementDisplayed(descriptionInput); + } + + public String getDescriptionLabel() + { + return findElement(descriptionLabel).getText(); + } + public String getVisibilityLabel() + { + return findElement(visibilityLabel).getText(); + } + public boolean isPublicVisibilityRadioButtonDisplayed() + { + return isElementDisplayed(publicVisibility_RadioButton); + } + public boolean isModeratedVisibilityRadioButtonDisplayed() + { + return isElementDisplayed(moderatedVisibilityRadioButton); + } + public boolean isPrivateVisibilityRadioButtonDisplayed() + { + return isElementDisplayed(privateVisibilityRadioButton); + } + public boolean isSaveButtonDisplayed() + { + return isElementDisplayed(saveButton); + } + public boolean isCancelButtonDisplayed() + { + return isElementDisplayed(cancelButton); + } + public String getPublicVisibilityDescription() + { + return findElement(publicVisibilityDescription).getText(); + } + public String getModeratedVisibilityDescription() + { + return findElement(moderatedVisibilityDescription).getText(); + } + public String getPrivateVisibilityDescription() + { + return findElement(privateVisibilityDescription).getText(); + } + public void selectPrivateVisibility() + { + findElement(privateVisibilityRadioButton).click(); + } + public boolean isPrivateVisibilitySelected() + { + waitInSeconds(5); + return findElement(private_VisibilityRadioButton).isSelected(); + } + public void clickCancelButton() + { + clickElement(cancelButton); + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SelectPopUpPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SelectPopUpPage.java index 10d8fd2df5..2b8b74e3e0 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SelectPopUpPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SelectPopUpPage.java @@ -49,6 +49,7 @@ public void clickAddIcon(String item) public boolean isStringPresentInSearchList(String toCheck) { + waitInSeconds(3); return DataUtil.isStringPresentInWebElementList(toCheck, findElements(resultsList)); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteCommon.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteCommon.java index d00f6f877c..94fab26a02 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteCommon.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteCommon.java @@ -112,6 +112,7 @@ public void navigateWithoutRender(SiteModel site) public String getSiteName() { + waitInSeconds(2); return getElementText(siteName); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteDashboardPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteDashboardPage.java index 75a7697213..350b7fe0d9 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteDashboardPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteDashboardPage.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.alfresco.dataprep.SiteService; import org.alfresco.po.share.dashlet.Dashlets; +import org.alfresco.po.share.searching.SearchPage; import org.alfresco.utility.model.SiteModel; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -24,7 +25,10 @@ public class SiteDashboardPage extends SiteCommon private final By siteVisibility = By.cssSelector("div[id='HEADER_TITLE_VISIBILITY'] span"); private final By morePagesDropDown = By.id("HEADER_SITE_MORE_PAGES"); private final By moreOptions = By.cssSelector("#HEADER_SITE_MORE_PAGES_GROUP a"); - + private final By siteDescription = By.xpath("//textarea[@name=\"description\"]"); + private final By saveButton = By.xpath("//span[text()=\"Save\"]"); + private final By siteDataListDashlet = By.xpath("//div[text()=\"Site Data Lists\"]"); + private final By dropdownoptions = By.xpath("//tr[@role=\"menuitem\"]"); private final String dropdownOption = "//div[@class='alf-menu-groups' and contains(@style, 'visible')]//td[contains(@id, 'HEADER') and text()='%s']"; private final String dashletLocation = "//div[text()='%s']/../../../div[contains(@id,'component-%d-%d')]"; @@ -152,6 +156,10 @@ public SiteDashboardPage assertOptionEqualsTo(String expectedOption) String.format("Option not equals to %s ", expectedOption)); return this; } + public WebDriver getWebDriver() + { + return webDriver.get(); + } public SiteDashboardPage selectOptionFromSiteConfigurationDropDown(String option) { @@ -228,9 +236,41 @@ public EditSiteDetailsDialog navigateToEditSiteDetailsDialog(String siteId) selectOptionFromSiteConfigurationDropDown("Edit Site Details"); return new EditSiteDetailsDialog(); } - + public EditSiteDetailsDialog editSiteDescription(String description) { + WebElement SiteDescription = waitUntilElementIsVisible(siteDescription); + clearAndType(SiteDescription, description); + clickElement(saveButton); + return new EditSiteDetailsDialog(); + } public boolean somethingWentWrongMessage() { return isElementDisplayed(By.xpath("//div[contains(text(),'wrong with this page...')]")); } + public SiteDashboardPage assertsiteDataListDashletIsAdded() + { + log.info("Verify Dashlet is Added to Site Dashboard page"); + waitUntilElementIsVisible(siteDataListDashlet); + assertTrue(isElementDisplayed(siteDataListDashlet)); + return this; + } + public boolean isOptionListedInSiteConfigurationDropDown(String option) + { + List moreOptionsList = findElements(dropdownoptions); + for (WebElement options : moreOptionsList) + { + if (options.getText().equals(option)) + { + return true; + } + } + return false; + } + public SiteDashboardPage pageRefresh() + { + waitInSeconds(10); + getWebDriver().navigate().refresh(); + waitInSeconds(10); + getWebDriver().navigate().refresh(); + return this; + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteManagerDeleteSiteDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteManagerDeleteSiteDialog.java index e403af07b4..63704ddbf6 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteManagerDeleteSiteDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/SiteManagerDeleteSiteDialog.java @@ -16,6 +16,7 @@ public class SiteManagerDeleteSiteDialog extends BaseDialogComponent private final By deleteSiteConfirmFromSitesManager = By.cssSelector("div[id='ALF_SITE_SERVICE_DIALOG'] .dialog-body"); private final By confirmFromSitesManager = By.cssSelector("span[widgetid='ALF_SITE_SERVICE_DIALOG_CONFIRMATION']>span"); private final By deleteSiteWindow = By.cssSelector("div[id='ALF_SITE_SERVICE_DIALOG']"); + private final By cancel = By.xpath("//span[text()=\"Cancel\"]"); public SiteManagerDeleteSiteDialog(ThreadLocal webDriver) { @@ -45,4 +46,7 @@ public SitesManagerPage clickDeleteFromSitesManager() return sitesManagerPage; } + public void clickCancelFromSitesManager() { + clickElement(cancel); + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/ContactListSelectedContentPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/ContactListSelectedContentPage.java new file mode 100644 index 0000000000..aa6f454fec --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/ContactListSelectedContentPage.java @@ -0,0 +1,90 @@ +package org.alfresco.po.share.site.dataLists; + +import org.alfresco.po.share.BaseDialogComponent; +import org.alfresco.utility.web.browser.WebBrowser; +import org.apache.commons.collections.CollectionUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; + +import static org.alfresco.common.DataUtil.isEnumContainedByList; + +public class ContactListSelectedContentPage extends BaseDialogComponent { + private By noListItems = By.cssSelector("div[id$='default-grid'] table tbody tr"); + private By listItems = By.cssSelector("div[id$='default-grid'] table tbody[class='yui-dt-data'] tr"); + private String selectColumn = "div[id$='default-grid'] table thead tr div[id*='%s'] span a"; + private String selectedColumnItems = "table tbody td[class*='%s']"; + DataListsPage dataListsPage; + ContactListItemsTable tableRow; + protected WebBrowser browser; + public ContactListSelectedContentPage(ThreadLocal webDriver) + { + super(webDriver); + } + + public boolean isTableHeaderComplete() + { + dataListsPage = new DataListsPage(webDriver); + waitInSeconds(3); + return isEnumContainedByList(ContactListColumns.class, dataListsPage.getTextOfTableColumnHeader()); + } + public boolean isListItemDisplayed(List listDetails) + { + return findRow(listDetails) != null; + } + public List findRow(List listDetails) + { + waitUntilElementIsDisplayedWithRetry(listItems); + List rows = findElements(listItems); + List found = new ArrayList<>(); + for (WebElement row : rows) + { + List rowValues = new ArrayList<>(); + + tableRow = new ContactListItemsTable(row, browser); + + rowValues.add(tableRow.getFirstNameColumn().getText()); + rowValues.add(tableRow.getLastNameColumn().getText()); + rowValues.add(tableRow.getEmailColumn().getText()); + rowValues.add(tableRow.getCompanyColumn().getText()); + rowValues.add(tableRow.getJobTitleColumn().getText()); + rowValues.add(tableRow.getOfficePhoneColumn().getText()); + rowValues.add(tableRow.getMobilePhoneColumn().getText()); + rowValues.add(tableRow.getNotesColumn().getText()); + + if (CollectionUtils.isEqualCollection(rowValues, listDetails)) + { + found.add(row); + } + } + return found; + } + public enum ContactListColumns + { + FirstName("First Name"), + LastName("Last Name"), + Email("Email"), + Company("Company"), + JobTitle("Job Title"), + PhoneOffice("Phone (Office)"), + PhoneMobile("Phone (Mobile)"), + Notes("Notes"), + Actions("Actions"); + + public final String name; + + ContactListColumns(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return this.name; + } + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/CreateDataListDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/CreateDataListDialog.java index 070660876f..6e1d3774bc 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/CreateDataListDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/CreateDataListDialog.java @@ -52,6 +52,7 @@ private List getValuesFromElements() public boolean isNewListPopupDisplayed() { + waitUntilElementIsVisible(newListPopup); return isElementDisplayed(newListPopup); } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/DataListsPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/DataListsPage.java index 4b297bcde0..0a3e709a4e 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/DataListsPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/DataListsPage.java @@ -14,6 +14,9 @@ public class DataListsPage extends SiteCommon { public Content currentContent = new NoListItemSelectedContent(); + private final By dataListCurrentPage = By.cssSelector("div.title-bar [id$=default-viewButtons]"); + private final By clickSaveButton = By.cssSelector("#template_x002e_datalists_x002e_data-lists_x0023_default-newList-form-submit-button"); + private final By dataListsSection = By.cssSelector("div.datalists div.filter"); private final By newListButton = By.cssSelector("button[id*='newListButton']"); private final By editListButton = By.cssSelector(".filter-link>.edit"); @@ -56,6 +59,17 @@ public DataListsPage assertDataListPageIsOpened() assertTrue(getCurrentUrl().contains("data-lists"), "Data List page is not opened"); return this; } + public DataListsPage getCurrentPageTitle() + { + findElement(dataListCurrentPage); + return this; + } + + public CreateDataListDialog clickOnSaveButton() + { + clickElement(clickSaveButton); + return new CreateDataListDialog(webDriver); + } public DataListsPage assertEmptyListMessageEquals(String emptyMessageExpected) { @@ -69,6 +83,7 @@ public DataListsPage assertEmptyListMessageEquals(String emptyMessageExpected) public DataListsPage clickOnCreateDataListLink() { log.info("Click New List button"); + waitInSeconds(2); clickElement(findElement(createDataListLinkLocator)); return this; } @@ -256,7 +271,7 @@ public CreateNewItemPopUp clickNewItemButton() public List getTextOfTableColumnHeader() { List tableHeaderListString = new ArrayList<>(); - for (WebElement item : waitUntilElementsAreVisible(tableColumnHeader)) + for (WebElement item : findElements(tableColumnHeader)) { tableHeaderListString.add(item.getText()); } @@ -266,6 +281,7 @@ public List getTextOfTableColumnHeader() public boolean isNewItemPopupFormDisplayed(CreateNewItemPopUp.NewItemPopupForm listName) { + waitInSeconds(3); return isElementDisplayed(By.xpath(String.format(createNewItemForm, listName.name))); } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaItemsTable.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaItemsTable.java index 12ed6256b2..082256d827 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaItemsTable.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaItemsTable.java @@ -6,7 +6,6 @@ public class EventAgendaItemsTable extends ListItemTable { - protected WebElement webElement; protected By referenceColumn = By.cssSelector("td[class*='eventAgendaRef'] div"); protected By startTimeColumn = By.cssSelector("td[class*='eventAgendaStartTime'] div"); protected By endTimeColumn = By.cssSelector("td[class*='eventAgendaEndTime'] div"); @@ -23,41 +22,41 @@ public EventAgendaItemsTable(WebElement webElement, WebBrowser browser) public WebElement getReferenceColumn() { - return browser.findElement(referenceColumn); + return webElement.findElement(referenceColumn); } public WebElement getStartTimeColumn() { - return browser.findElement(startTimeColumn); + return webElement.findElement(startTimeColumn); } public WebElement getEndTimeColumn() { - return browser.findElement(endTimeColumn); + return webElement.findElement(endTimeColumn); } public WebElement getSessionNameColumn() { - return browser.findElement(sessionNameColumn); + return webElement.findElement(sessionNameColumn); } public WebElement getPresenterColumn() { - return browser.findElement(presenterColumn); + return webElement.findElement(presenterColumn); } public WebElement getAudienceColumn() { - return browser.findElement(audienceColumn); + return webElement.findElement(audienceColumn); } public WebElement getAttachmentsColumn() { - return browser.findElement(attachmentsColumn); + return webElement.findElement(attachmentsColumn); } public WebElement getNotesColumn() { - return browser.findElement(notesColumn); + return webElement.findElement(notesColumn); } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaSelectedContentItem.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaSelectedContentItem.java new file mode 100644 index 0000000000..7fda34047b --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/EventAgendaSelectedContentItem.java @@ -0,0 +1,133 @@ +package org.alfresco.po.share.site.dataLists; + +import org.alfresco.po.share.BaseDialogComponent; +import org.alfresco.utility.web.browser.WebBrowser; +import org.apache.commons.collections.CollectionUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; + +import static org.alfresco.common.DataUtil.isEnumContainedByList; + +public class EventAgendaSelectedContentItem extends BaseDialogComponent { + DataListsPage dataListsPage; + EventAgendaItemsTable tableRow; + protected WebBrowser browser; + private By noListItems = By.cssSelector("div[id$='default-grid'] table tbody tr"); + private By listItems = By.cssSelector("div[id$='default-grid'] table tbody[class='yui-dt-data'] tr"); + public EventAgendaSelectedContentItem(ThreadLocal webDriver) + { + super(webDriver); + } + + public boolean isTableHeaderComplete() + { + dataListsPage = new DataListsPage(webDriver); + waitInSeconds(3); + return isEnumContainedByList(EventAgendaSelectedContent.EventAgendaColumns.class, dataListsPage.getTextOfTableColumnHeader()); + } + + public boolean isAnyListItemDisplayed() + { + List listItemsList = findElements(noListItems); + return !(listItemsList.size() == 1 && listItemsList.get(0).findElement(By.cssSelector("td div")).getText().equals("No list items")); + } + + public boolean isListItemDisplayed(List listDetails) + { + return findRow(listDetails) != null; + } + + public boolean duplicatedRows(List listDetails) + { + return findRow(listDetails).size() > 1; + } + + public List findRow(List listDetails) + { + waitUntilElementIsDisplayedWithRetry(listItems); + List rows = findElements(listItems); + List found = new ArrayList<>(); + for (WebElement row : rows) + { + int i = 0; + tableRow = new EventAgendaItemsTable(row, browser); + + if (tableRow.getReferenceColumn().getText().equals(listDetails.get(i))) + { + + if (tableRow.getStartTimeColumn().getText().equals(listDetails.get(i))) + { + if (tableRow.getEndTimeColumn().getText().equals(listDetails.get(i))) + { + + if (tableRow.getSessionNameColumn().getText().equals(listDetails.get(i))) + { + if (tableRow.getPresenterColumn().getText().equals(listDetails.get(i))) + { + + if (tableRow.getAudienceColumn().getText().equals(listDetails.get(i))) + { + + if (tableRow.getNotesColumn().getText().equals(listDetails.get(i))) + { + found.add(row); + } + } + } + } + } + } + } + i++; + } + return found; + } + + public void editItem(List listDetails) + { + tableRow = new EventAgendaItemsTable(findRow(listDetails).get(0), browser); + tableRow.getEditButton().click(); + } + + public void duplicateItem(List listDetails) + { + tableRow = new EventAgendaItemsTable(findRow(listDetails).get(0), browser); + tableRow.getDuplicateButton().click(); + } + + public void deleteItem(List listDetails) + { + tableRow = new EventAgendaItemsTable(findRow(listDetails).get(0), browser); + tableRow.getDeleteButton().click(); + } + + public enum EventAgendaColumns + { + Reference("Reference"), + StartTime("Start Time"), + EndTime("End Time"), + SessionName("Session Name"), + Presenter("Presenter"), + Audience("Audience"), + Attachments("Attachments"), + Notes("Notes"), + Actions("Actions"); + + public final String name; + + EventAgendaColumns(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return this.name; + } + } +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListItemsTable.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListItemsTable.java index 7d6d624d40..4883f48825 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListItemsTable.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListItemsTable.java @@ -6,8 +6,6 @@ public class MeetingAgendaListItemsTable extends ListItemTable { - - protected WebElement webElement; protected By referenceColumn = By.cssSelector("td[class*='meetingAgendaRef'] div"); protected By titleColumn = By.cssSelector("td[class*='cm_title'] div"); protected By descriptionColumn = By.cssSelector("td[class*='cm_description'] div"); @@ -23,31 +21,31 @@ public MeetingAgendaListItemsTable(WebElement webElement, WebBrowser browser) public WebElement getReferenceColumn() { - return browser.findElement(referenceColumn); + return webElement.findElement(referenceColumn); } public WebElement getTitleColumn() { - return browser.findElement(titleColumn); + return webElement.findElement(titleColumn); } public WebElement getDescriptionColumn() { - return browser.findElement(descriptionColumn); + return webElement.findElement(descriptionColumn); } public WebElement getTimeColumn() { - return browser.findElement(timeColumn); + return webElement.findElement(timeColumn); } public WebElement getOwnerColumn() { - return browser.findElement(ownerColumn); + return webElement.findElement(ownerColumn); } public WebElement getAttachmentsColumn() { - return browser.findElement(attachmentsColumn); + return webElement.findElement(attachmentsColumn); } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListSelectedContentPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListSelectedContentPage.java new file mode 100644 index 0000000000..2fee818f79 --- /dev/null +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/dataLists/MeetingAgendaListSelectedContentPage.java @@ -0,0 +1,117 @@ +package org.alfresco.po.share.site.dataLists; + +import org.alfresco.po.share.BaseDialogComponent; +import org.alfresco.utility.web.browser.WebBrowser; +import org.apache.commons.collections.CollectionUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; + +import static org.alfresco.common.DataUtil.isEnumContainedByList; + +public class MeetingAgendaListSelectedContentPage extends BaseDialogComponent { + DataListsPage dataListsPage; + MeetingAgendaListItemsTable tableRow; + protected WebBrowser browser; + private By listItems = By.cssSelector("div[id$='default-grid'] table tbody[class='yui-dt-data'] tr"); + public MeetingAgendaListSelectedContentPage(ThreadLocal webDriver) + { + super(webDriver); + } + public boolean isListItemDisplayed(List listDetails) + { + return findRow(listDetails) != null; + } + + public boolean duplicatedRows(List listDetails) + { + return findRow(listDetails).size() > 1; + } + + public List findRow(List listDetails) + { + waitUntilElementIsDisplayedWithRetry(listItems); + List rows = findElements(listItems); + List found = new ArrayList<>(); + for (WebElement row : rows) + { + List rowValues = new ArrayList<>(); + + tableRow = new MeetingAgendaListItemsTable(row, browser); + + rowValues.add(tableRow.getReferenceColumn().getText()); + rowValues.add(tableRow.getTitleColumn().getText()); + rowValues.add(tableRow.getDescriptionColumn().getText()); + rowValues.add(tableRow.getTimeColumn().getText()); + rowValues.add(tableRow.getOwnerColumn().getText()); + rowValues.add(tableRow.getAttachmentsColumn().getText()); + + if (CollectionUtils.isEqualCollection(rowValues, listDetails)) + { + found.add(row); + } + } + return found; + } + + public void editItem(List listDetails) + { + tableRow = new MeetingAgendaListItemsTable(findRow(listDetails).get(0), browser); + tableRow.getEditButton().click(); + } + + public void duplicateItem(List listDetails) + { + tableRow = new MeetingAgendaListItemsTable(findRow(listDetails).get(0), browser); + tableRow.getDuplicateButton().click(); + } + + public void deleteItem(List listDetails) + { + tableRow = new MeetingAgendaListItemsTable(findRow(listDetails).get(0), browser); + tableRow.getDeleteButton().click(); + } + + /** + * This method is checking if all the columns that should be in 'Meeting Agenda' table are actually displayed. + * Checking if all the elements from the enum list exists in getTextOfTableColumnHeader() list method. + * + * @return - true if all the elements from the enum are displayed in 'Item List' table. + * - false if there is at least one element missing. + */ + public boolean isTableHeaderComplete() + { + dataListsPage = new DataListsPage(webDriver); + waitInSeconds(3); + return isEnumContainedByList(MeetingAgendaListSelectedContent.MeetingAgendaColumns.class, dataListsPage.getTextOfTableColumnHeader()); + } + + + public enum MeetingAgendaColumns + { + Reference("Reference"), + Title("Title"), + Description("Description"), + TimeMins("Time (mins)"), + Owner("Owner"), + Attachments("Attachments"), + Actions("Actions"); + + public final String name; + + MeetingAgendaColumns(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return this.name; + } + } + +} diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/members/SiteMembersPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/members/SiteMembersPage.java index 9d1e2dda98..03f0f81cf2 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/members/SiteMembersPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/members/SiteMembersPage.java @@ -103,6 +103,13 @@ public SiteMembersPage assertSiteMemberNameEqualsTo(String expectedSiteMemberNam return this; } + public boolean assertSiteMemberNameNotDisplayed(String expectedSiteMemberName) + { + log.info("Assert site member name equals to: {}", expectedSiteMemberName); + assertFalse(getSiteMembersList().contains(expectedSiteMemberName), "Site name is Displayed"); + return false; + } + public SiteMembersPage assertSiteMemberNameIsNotDisplayed(String memberName) { log.info("Assert Site member name is not displayed {}", memberName); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/wiki/WikiPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/wiki/WikiPage.java index 3e689754ab..6e9fa4f456 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/wiki/WikiPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/site/wiki/WikiPage.java @@ -2,6 +2,7 @@ import java.util.List; import org.alfresco.po.share.site.SiteCommon; +import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindAll; @@ -9,6 +10,8 @@ public class WikiPage extends SiteCommon { + private final By wikiPageTitle1 = By.cssSelector("div.title-bar [id$=default-viewButtons]"); + @FindBy (css = "div.title-bar [id$=default-viewButtons]") private WebElement wikiPageTitle; @@ -75,6 +78,12 @@ public boolean deleteWikiPage() deleteWikiPage.click(); return deletePopUp.isDisplayed(); } + public WikiPage getWikiCurrentPageTitle() + { + findElement(wikiPageTitle1); + return this; + + } public String getWikiPageContent() { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/EditTaskPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/EditTaskPage.java index 6927457633..b4f8d6363d 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/EditTaskPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/EditTaskPage.java @@ -20,6 +20,7 @@ public class EditTaskPage extends SharePage2 private final By commentTextArea = By.cssSelector("textarea[id$='bpm_comment']"); private final By approveButton = By.cssSelector("button[id$='approve-button']"); private final By rejectButton = By.cssSelector("button[id$='reject-button']"); + private final By buttonReject = By.xpath("//button[text()=\"Reject\"]"); private final By message = By.cssSelector("div.form-field div.viewmode-field span[data-datatype$='text']"); private final By owner = By.cssSelector("div.form-field div.viewmode-field span[id$='_prop_taskOwner'] a"); private final By identifier = By.xpath("//span[@class = 'viewmode-label' and text() = 'Identifier:']"); @@ -31,6 +32,7 @@ public class EditTaskPage extends SharePage2 private final By itemsList = By.cssSelector(".form-field h3 a"); private final By statusDropdown = By.cssSelector("select[title = 'Status']"); private final By saveButton = By.cssSelector("button[id$='form-submit-button']"); + private final By saveAndCloseButton = By.xpath("//button[text()=\"Save and Close\"]"); private final By reassignButton = By.cssSelector("button[id$='reassign-button']"); private final By cancelButton = By.cssSelector("button[id$='form-cancel-button']"); private final By addItemsButton = By.cssSelector("div[id$='itemGroupActions'] button"); @@ -145,12 +147,14 @@ public void selectStatus(TaskStatus status) public void writeComment(String comment) { + waitInSeconds(2); insertTaskComment(comment); } public void clickOnSaveButton() { - clickElement(saveButton); + waitInSeconds(3); + findElement(saveAndCloseButton).click(); } public boolean isStatusOptionPresent(TaskStatus status) @@ -220,4 +224,9 @@ public String getItemsList() } return itemsTextList.toString(); } + + public void clickRejectButton() { + waitInSeconds(3); + findElement(buttonReject).click(); + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/MyTasksPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/MyTasksPage.java index 1ba5b6a693..b73ae24a89 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/MyTasksPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/tasksAndWorkflows/MyTasksPage.java @@ -33,6 +33,7 @@ public class MyTasksPage extends SharePage2 implements AccessibleBy private final By dueFilter = By.cssSelector("div[id*='_due-filter'] div h2"); private final By priorityFilter = By.cssSelector( "div[id*='_priority-filter'] div h2"); private final By assigneeFilter = By.cssSelector("div[id*='_assignee-filter'] div h2"); + private final By noTaskMessage = By.xpath("//div[text()='No tasks']"); private final String completeTaskName = "Request to join %s site"; private final String status = "//a[@title = 'Edit Task' and text() = '%s']/../../div[@class = 'status']/span"; @@ -106,6 +107,12 @@ public MyTasksPage assertTaskNameEqualsTo(String expectedTaskName) return this; } + public MyTasksPage assertNoTaskIsDisplayed(){ + waitInSeconds(2); + assertTrue(isElementDisplayed(noTaskMessage), "Check task List"); + return this; + } + private String getActualTaskName(String expectedTaskName) { String taskName = getElementText(getTaskName(expectedTaskName)); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/Toolbar.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/Toolbar.java index 3b52ab584c..26825d06b7 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/Toolbar.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/Toolbar.java @@ -5,6 +5,7 @@ import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.alfresco.common.Utils; import org.alfresco.po.share.BasePage; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.PeopleFinderPage; @@ -21,6 +22,9 @@ public class Toolbar extends BasePage { private final By toolbarLocator = By.cssSelector("div[id='SHARE_HEADER']"); private final By homeLink = By.cssSelector("div[widgetid='HEADER_HOME']"); + private final By userLink = By.xpath("//a[@title=\"User Management\"]"); + private final By newUserLink = By.xpath("//button[text()=\"New User\"]"); + private final By myFilesLink = By.cssSelector("span[id='HEADER_MY_FILES_text']"); private final By sharedFilesLink = By.cssSelector("span[id='HEADER_SHARED_FILES_text']"); private final By sitesLink = By.cssSelector("span[id='HEADER_SITES_MENU_text']"); @@ -49,6 +53,23 @@ public Toolbar assertToolbarIsDisplayed() assertTrue(isElementDisplayed(toolbarLocator), "Toolbar is displayed"); return this; } + public SearchPage searchAndEnterSearch(String searchTerm) + { + searchInToolbar(searchTerm); + findElement(searchBoxInput).sendKeys(Keys.RETURN); + waitInSeconds(5); + findElement(searchBoxInput).sendKeys(Keys.RETURN); + waitInSeconds(5); + refresh(); + findElement(searchBoxInput).sendKeys(Keys.RETURN); + waitInSeconds(5); + refresh(); + findElement(searchBoxInput).sendKeys(Keys.RETURN); + waitInSeconds(3); + refresh(); + return new SearchPage(webDriver); + + } public ToolbarSitesMenu clickSites() { @@ -58,6 +79,18 @@ public ToolbarSitesMenu clickSites() toolbarSitesMenu.waitForMySitesMenuToBeOpened(); return toolbarSitesMenu; } + public ApplicationPage users() + { + log.info("Click Admin Tools"); + clickElement(userLink); + return new ApplicationPage(webDriver); + } + public ApplicationPage newUsers() + { + log.info("Click Admin Tools"); + clickElement(newUserLink); + return new ApplicationPage(webDriver); + } public Toolbar assertHomeIsDisplayed() { @@ -252,6 +285,16 @@ public SearchPage search(String searchTerm) searchPage.waitForPageToLoad(); return new SearchPage(webDriver); } + public SearchPage searchAndEnterAgain(String searchTerm) + { + searchInToolbar(searchTerm); + findElement(searchBoxInput).sendKeys(Keys.RETURN); + SearchPage searchPage = new SearchPage(webDriver); + searchPage.waitForPageToLoad(); + refresh(); + searchPage.clickSearchButtonAgain(); + return new SearchPage(webDriver); + } public void clickResult(String query) { @@ -268,11 +311,24 @@ public boolean isLiveSearchResultsListDisplayed() return findElements(searchResultsInToolbar).isEmpty(); } + public boolean is_LiveSearchResultsListDisplayed(String query) + { + waitInSeconds(3); + List searchResults = findElements(searchResultsInToolbar); + for (WebElement result : searchResults) + { + if (result.getText().contains(query)) + return true; + } + return false; + } + public boolean isResultDisplayedInLiveSearch(String query) { int retryCounter = 0; while (!isElementDisplayed(By.xpath("//div[contains(@class, 'alf-live-search')]//div")) && retryCounter < 4) { + waitInSeconds(2); refresh(); searchInToolbar(query); retryCounter++; @@ -280,6 +336,29 @@ public boolean isResultDisplayedInLiveSearch(String query) waitUntilElementsAreVisible(By.xpath("//div[contains(@class, 'alf-live-search')]//div")); waitUntilElementsAreVisible(By.cssSelector("div.alf-livesearch-item>a")); + waitInSeconds(2); + List searchResults = findElements(searchResultsInToolbar); + for (WebElement result : searchResults) + { + if (result.getText().contains(query)) + return true; + } + return false; + } + public boolean isResultDisplayedLiveSearch(String query) + { + int retryCounter = 0; + while (!isElementDisplayed(By.xpath("//div[contains(@class, 'alf-live-search')]//div")) && retryCounter < 8) + { + waitInSeconds(2); + refresh(); + searchInToolbar(query); + retryCounter++; + } + waitUntilElementsAreVisible(By.xpath("//div[contains(@class, 'alf-live-search')]//div")); + waitUntilElementsAreVisible(By.cssSelector("div.alf-livesearch-item>a")); + + waitInSeconds(2); List searchResults = findElements(searchResultsInToolbar); for (WebElement result : searchResults) { @@ -305,6 +384,22 @@ public void clickSearchButton() { clickElement(searchButton); } + public void SearchAndEnter(String search) + { + waitInSeconds(3); + Utils.clearAndType(waitUntilElementIsVisible(findElement(searchBoxInput)), search); + findElement(searchBoxInput).sendKeys(Keys.ENTER); + waitInSeconds(10); + refresh(); + waitInSeconds(5); + refresh(); + waitInSeconds(5); + refresh(); + waitInSeconds(5); + refresh(); + waitInSeconds(5); + refresh(); + } public void closeMenu() { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/ToolbarSitesMenu.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/ToolbarSitesMenu.java index 77f3bd5ff5..c13ba135d6 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/ToolbarSitesMenu.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/toolbar/ToolbarSitesMenu.java @@ -186,6 +186,13 @@ public void clickRemoveCurrentSiteFromFavorites() } waitUntilElementDisappears(sitesDropdown); } + public void click_RemoveCurrentSiteFromFavorites() + { + log.info("Click Remove current site from favorites"); + WebElement remove = findElement(removeCurrentSiteFromFavorites); + clickElement(remove); + waitInSeconds(3); + } private boolean isSiteFavorite(String siteName) { @@ -230,4 +237,19 @@ public SiteDashboardPage clickFavoriteSite(SiteModel site) { return clickFavoriteSite(site.getTitle()); } + public ToolbarSitesMenu assertVerifySiteIsNotInFavorite(String siteName) + { + log.info("Assert site is not found in favorites: {}", siteName); + assertFalse(is_SiteFavorite(siteName), + String.format("Site %s is found in favorites", siteName)); + return this; + } + + private boolean is_SiteFavorite(String siteName) + { + waitUntilElementIsVisible(favorites); + clickElement(favorites); + waitUntilElementIsVisible(favoriteDropDown); + return isElementDisplayed(favoriteSitesRowList); + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/UserDashboardPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/UserDashboardPage.java index b1c9cf7846..f4b71078be 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/UserDashboardPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/UserDashboardPage.java @@ -31,7 +31,7 @@ public class UserDashboardPage extends SharePage2 implements private final By welcomePanelInfo = By.cssSelector( ".welcome-info"); private final By welcomePanelHideButton = By.cssSelector("button[id$='_default-hide-button-button']"); private final By welcomePanelInfoGetStarted = By.cssSelector(".welcome-info h1"); - + private final By selectDashlet = By.xpath("//li[@class=\"usedDashlet dnd-draggable\"]"); private final String dashletOnDashboard = "//div[contains(text(),'%s')]/../../../div[contains(@id,'component-%d-%d')]"; private final String webViewDashletLocation = "//div[@class='webview-default']//span[contains(@id, 'component-%d-%d')][1]"; @@ -99,6 +99,10 @@ public UserDashboardPage assertCustomizeUserDashboardIsDisplayed() assertTrue(isElementDisplayed(customizeUserDashboard), "Customize User Dashboard button is displayed"); return this; } + public WebDriver getWebDriver() + { + return webDriver.get(); + } public UserDashboardPage assertNumberOfDashletColumnsIs(int columnsNumber) { @@ -128,7 +132,18 @@ public boolean isDashletAddedInPosition(final Dashlets dashlet, final int column By.xpath(String.format(dashletOnDashboard, dashlet.getDashletName(), column, locationInColumn))); return isElementDisplayed(dashletToCheck); } - + public boolean isDashletAvailable(String option) + { + for (WebElement dashlets : findElements(selectDashlet)) + { + if (dashlets.getText().contains(option)) + { + waitInSeconds(3); + return true; + } + } + return false; + } public UserDashboardPage assertDashletIsAddedInPosition(Dashlets dashlet, int column, int locationInColumn) { assertTrue(isDashletAddedInPosition(dashlet, column, locationInColumn)); diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/ManagerSiteActionComponent.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/ManagerSiteActionComponent.java index b8214f71aa..983ad9f962 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/ManagerSiteActionComponent.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/ManagerSiteActionComponent.java @@ -27,6 +27,7 @@ public class ManagerSiteActionComponent extends SitesManagerPage private final By successIndicator = By.cssSelector("div[class='indicator success']"); private final By siteRowDescription = By.cssSelector("td.alfresco-lists-views-layouts-Cell.siteDescription"); private final By dropdownOptionsList = By.cssSelector("div.dijitPopup[style*=visible] td.dijitMenuItemLabel"); + private final By siteManagerList = By.xpath("//span[@class=\"value\"]"); private final String dropdownOptions = "//div[@class='dijitPopup Popup' and contains(@style, visible)]//td[@class='dijitReset dijitMenuItemLabel' and text()='%s']"; private final String siteName; @@ -43,6 +44,19 @@ public ManagerSiteActionComponent assertSiteIsNotDisplayed() assertNull(getSiteRow(), String.format("Site %s is displayed", siteName)); return this; } + public boolean isSiteDisplayed(String siteName) + { + List siteManagerSiteList = findElements(siteManagerList); + for (WebElement siteNames : siteManagerSiteList) + { + if (siteNames.getText().equals(siteName)) + { + return true; + } + } + return false; + } + private void clickActionsButton() { @@ -217,4 +231,12 @@ public SiteMembersPage navigateToSiteMembersPage() clickElement(getSiteRow().findElement(siteRowName)); return new SiteMembersPage(webDriver); } + + public ManagerSiteActionComponent assertSiteIsDisplayed(String site) { + { + log.info("Assert Become site manager option is not displayed"); + assertTrue(isSiteDisplayed(site), "Become site manager is not displayed"); + return this; + } + } } diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/AddUserDialog.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/AddUserDialog.java index c7e3ddd5f8..32505f7d1e 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/AddUserDialog.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/AddUserDialog.java @@ -26,6 +26,13 @@ public class AddUserDialog extends BaseDialogComponent private final By searchInputField = By.cssSelector("div[id*='search-peoplefinder'] input"); private final By searchButton = By.cssSelector("div[id*='search-peoplefinder'] button[id*='search']"); private final By searchResultsList = By.cssSelector(".itemname"); + private final By searchInput = By.xpath("//input[@name='-']"); + private final By setRole = By.xpath("//button[text()='Select Role ▾']"); + private final By selectManagerRole = By.xpath("//a[text()='Manager']"); + private final By addUserButton = By.xpath("//button[text()='Add Users']"); + private final By searchIn = By.xpath("//button[text()='Search']"); + private final By selectButton = By.xpath("//button[text()='Select']"); + private final By addButtonsList = By.cssSelector("td[class*='actions'] button"); private final By closeButton = By.cssSelector("div[id*='default-peoplepicker'] a[class='container-close']"); private final By searchingStatus = By.cssSelector("div[id$='search-peoplefinder-results'] .yui-dt-empty > div"); @@ -91,6 +98,13 @@ public AddUserDialog searchUser(UserModel userModel) { return searchUser(userModel.getUsername()); } + public AddUserDialog addUserToSite(String userModel) + { + clearAndType(searchInput, userModel); + clickElement(searchIn); + waitInSeconds(3); + return this; + } private AddUserDialog typeInSearch(String userToSearch) { @@ -98,6 +112,28 @@ private AddUserDialog typeInSearch(String userToSearch) return this; } + public AddUserDialog clickSelect(){ + clickElement(selectButton); + waitInSeconds(2); + return this; + } + public AddUserDialog setUserRole(){ + + clickElement(setRole); + clickElement(selectManagerRole); + waitInSeconds(2); + return this; + } + public AddUserDialog clickAddUser(){ + waitInSeconds(2); + clickElement(addUserButton); + waitInSeconds(2); + + return this; + } + + + public ArrayList getSearchResultsName() { return findElements(searchResultsList).stream() diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/EditUserPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/EditUserPage.java index ba25938d0e..7767e8c3b9 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/EditUserPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/EditUserPage.java @@ -25,8 +25,12 @@ public class EditUserPage extends SharePage2 private final By searchGroupButton = By.cssSelector("button[id$='_default-update-groupfinder-group-search-button-button']"); private final By useDefaultButton = By.cssSelector("button[id$='_default-updateuser-clearphoto-button-button']"); private final By saveChangesButton = By.cssSelector("button[id$='_default-updateuser-save-button-button']"); + private final By userNameField = By.xpath("//input[@id=\"page_x002e_ctool_x002e_admin-console_x0023_default-create-username\"]"); private final By cancelButton = By.cssSelector("button[id$='_default-updateuser-cancel-button-button']"); private final By userNameInEditUserPageTitle = By.cssSelector("span[id$='_default-update-title']"); + private final By groupNameInput = By.xpath("(//input[@type=\"text\"])[12]"); + private final By groupSearchButton = By.xpath("(//button[text()='Search'])[3]"); + private final By groupAddButton = By.xpath("//button[text()='Add ']"); private final By userProfileHeaderList = By.cssSelector("form[id$='_default-update-form'] div.header-bar"); private final By firstNameField = By.cssSelector("input[id$='_default-update-firstname']"); private final By lastNameField = By.cssSelector("input[id$='_default-update-lastname']"); @@ -91,6 +95,12 @@ public EditUserPage assertSearchGroupButtonIsDisplayed() assertTrue(isElementDisplayed(searchGroupButton), "Search group button is displayed"); return this; } + public EditUserPage editUserName(String userName) + { + WebElement userNameElement = waitUntilElementIsVisible(userNameField); + clearAndType(userNameElement, userName); + return this; + } public EditUserPage assertUseDefaultButtonIsDisplayed() { @@ -117,6 +127,16 @@ public EditUserPage assertUserFullNameIsDisplayedInTitle(UserModel user) String.format("%s %s", user.getFirstName(), user.getLastName())); return this; } + public EditUserPage addGroup(String firstName) + { + WebElement SearchGroupName = waitUntilElementIsVisible(groupNameInput); + clearAndType(SearchGroupName, firstName); + clickElement(groupSearchButton); + clickElement(groupAddButton); + return this; + } + + public EditUserPage assertAllSectionsAreDisplayed() { diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/UserProfileAdminToolsPage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/UserProfileAdminToolsPage.java index 720277fb72..714ea7a785 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/UserProfileAdminToolsPage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/admin/adminTools/usersAndGroups/UserProfileAdminToolsPage.java @@ -15,6 +15,7 @@ import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.alfresco.po.share.user.admin.adminTools.ApplicationPage; @Slf4j public class UserProfileAdminToolsPage extends SharePage2 @@ -30,6 +31,8 @@ public class UserProfileAdminToolsPage extends SharePage2 @@ -29,6 +30,7 @@ public class UsersPage extends SharePage2 private final By uploadButton = By.cssSelector("#template_x002e_html-upload_x002e_console_x0023_default-upload-button-button"); private final By tableHeaderElements = By.cssSelector("div[class$='results'] table>thead>tr:nth-of-type(1) span"); private final By searchTextResult = By.cssSelector("div[id$='default-search-bar']"); + private final By usersList = By.xpath("//td[@headers='yui-dt3-th-userName ']"); private final String userRow = "//td[contains(@headers, 'userName')]//div[text()='%s']/../.."; @@ -113,12 +115,26 @@ public UsersPage searchUser(String user) clickElement(searchButton); return this; } + public boolean UserList(String userName) { + List ListofUsers = findElements(usersList); + for (WebElement webElement : ListofUsers) + { + if (webElement.getText().contains(userName)) + return true; + } + return false; + } + public UsersPage assertIsUsersCreated(String user) + { + log.info("Verify user is Created"); + assertTrue(UserList(user), String.format("User %s is Not Created", user)); + return this; + } public boolean isUserFound(String user) { return isElementDisplayed(By.xpath(String.format(userRow, user))); } - public WebElement getUserRow(String userName) { return waitWithRetryAndReturnWebElement(By.xpath(String.format(userRow, userName)), diff --git a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/profile/UserProfilePage.java b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/profile/UserProfilePage.java index c7f618f125..008b7d4157 100644 --- a/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/profile/UserProfilePage.java +++ b/alfresco-tas-share-test/src/main/java/org/alfresco/po/share/user/profile/UserProfilePage.java @@ -24,6 +24,7 @@ public class UserProfilePage extends SharePage2 implements Acce private String userName; private final By editProfile = By.cssSelector("button[id$='button-edit-button']"); + private final By currentPageUserName = By.cssSelector("#template_x002e_user-profile_x002e_user-profile_x0023_default-readview > div.viewcolumn > div.photorow > div.namelabel"); private final By infoLink = By.cssSelector("a[id$='default-profile-link']"); private final By headers = By.cssSelector("div[id$='readview'] .viewcolumn .header-bar"); private final By summary = By.cssSelector(".biorow>div"); @@ -88,6 +89,13 @@ public UserProfilePage assertUserProfilePageIsOpened() return this; } + public Boolean assertCheckUserName() { + return + findElement(currentPageUserName).getText().equals("Mike Jackson"); + } + + + public UserProfilePage assertInfoLinkIsDisplayed() { waitUntilElementIsVisible(infoLink); @@ -187,6 +195,10 @@ public UserProfilePage assertSummaryIs(String summaryValue) assertEquals(getElementText(summary), summaryValue, "Summary is correct"); return this; } + public WebDriver getWebDriver() + { + return webDriver.get(); + } private List getAboutUserInfo() { diff --git a/alfresco-tas-share-test/src/main/resources/log4j.properties b/alfresco-tas-share-test/src/main/resources/log4j.properties deleted file mode 100644 index 54ab449ef4..0000000000 --- a/alfresco-tas-share-test/src/main/resources/log4j.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Root logger option -log4j.rootLogger=warn, file, stdout -# Direct log messages to a log file -log4j.appender.file=org.apache.log4j.RollingFileAppender -log4j.appender.file.File=./target/reports/alfresco-share-po.log -log4j.appender.file.MaxBackupIndex=10 -log4j.appender.file.layout=org.apache.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=[%t] %d{HH:mm:ss} %-5p %c{1}:%L - %m%n -# Direct log messages to stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=[%t] %d{HH:mm:ss} %-5p %c{1}:%L - %m%n -# TestRail particular log file -# Direct log messages to a log file -log4j.appender.testrailLog=org.apache.log4j.RollingFileAppender -log4j.appender.testrailLog.File=./target/reports/alfresco-testrail.log -log4j.appender.testrailLog.MaxBackupIndex=10 -log4j.appender.testrailLog.layout=org.apache.log4j.PatternLayout -log4j.appender.testrailLog.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c{1}:%L - %m%n -log4j.category.testrail=INFO, testrailLog, stdout -log4j.additivity.testrail=false \ No newline at end of file diff --git a/alfresco-tas-share-test/src/main/resources/log4j2.properties b/alfresco-tas-share-test/src/main/resources/log4j2.properties new file mode 100644 index 0000000000..83362b20a9 --- /dev/null +++ b/alfresco-tas-share-test/src/main/resources/log4j2.properties @@ -0,0 +1,45 @@ +# Set root logger level to error +rootLogger.level=warn +rootLogger.appenderRef.stdout.ref=ConsoleAppender +rootLogger.appenderRef.rolling.ref=RollingAppender + +###### Console appender definition ####### +# All outputs currently set to be a ConsoleAppender. +# Direct log messages to stdout +appender.console.type=Console +appender.console.name=ConsoleAppender +appender.console.layout.type=PatternLayout +appender.console.layout.pattern=[%t] %d{HH:mm:ss} %-5p %c{1}:%L - %replace{%m}{[\r\n]+}{}%n + +###### File appender definition ####### +# Direct log messages to a log file +appender.rolling.type=RollingFile +appender.rolling.name=RollingAppender +appender.rolling.fileName=./target/reports/alfresco-share-po.log +appender.rolling.filePattern=./target/reports/alfresco-share-po.log.%i +appender.rolling.layout.type=PatternLayout +appender.rolling.layout.pattern=[%t] %d{HH:mm:ss} %-5p %c{1}:%L - %replace{%m}{[\r\n]+}{}%n +appender.rolling.policies.type = Policies +appender.rolling.policies.size.type=SizeBasedTriggeringPolicy +appender.rolling.policies.size.size=10MB +appender.rolling.strategy.type=DefaultRolloverStrategy +appender.rolling.strategy.max=10 + +# TestRail particular log file +# Direct log messages to a log file +logger.testrail.name=testrail +logger.testrail.level=info +logger.testrail.additivity=false +logger.testrail.appenderRef.testrail.ref=TestrailAppender + +appender.testrail.name=TestrailAppender +appender.testrail.type=RollingFile +appender.testrail.fileName=./target/reports/alfresco-testrail.log +appender.testrail.filePattern=./target/reports/alfresco-testrail.log.%i +appender.testrail.layout.type=PatternLayout +appender.testrail.layout.pattern=%d{HH:mm:ss} %-5p %c{1}:%L - %replace{%m}{[\r\n]+}{}%n +appender.testrail.policies.type=Policies +appender.testrail.policies.size.type=SizeBasedTriggeringPolicy +appender.testrail.policies.size.size=10MB +appender.testrail.strategy.type=DefaultRolloverStrategy +appender.testrail.strategy.max=10 \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/BaseTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/BaseTest.java index 4dd07e6f76..ca3e30d3ef 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/BaseTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/BaseTest.java @@ -8,6 +8,8 @@ import org.alfresco.common.Language; import org.alfresco.common.ShareTestContext; import org.alfresco.common.WebDriverFactory; +import org.alfresco.dataprep.DashboardCustomization; +import org.alfresco.dataprep.SiteService; import org.alfresco.dataprep.UserService; import org.alfresco.po.share.user.UserDashboardPage; import org.alfresco.rest.core.RestAisAuthentication; @@ -65,6 +67,8 @@ public abstract class BaseTest extends AbstractTestNGSpringContextTests @Autowired private RestAisAuthentication aisAuthentication; + @Autowired + private SiteService siteService; private static final String authorization_header ="Authorization"; @@ -234,4 +238,16 @@ protected RestWrapper setAuthorizationRequestHeader(RestWrapper restWrapper) { } return restWrapper; } + protected void addDashlet(UserModel user, SiteModel siteModel, DashboardCustomization.SiteDashlet dashlet, int columnNumber, int position) + { + siteService.addDashlet( + user.getUsername(), + user.getPassword(), + siteModel.getId(), + dashlet, + DashboardCustomization.DashletLayout.TWO_COLUMNS_WIDE_RIGHT, + columnNumber, + position + ); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/RebrandTests/RebrandTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/RebrandTests/RebrandTests.java index 6131dc1531..148855c5d5 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/RebrandTests/RebrandTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/RebrandTests/RebrandTests.java @@ -4,55 +4,43 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; -import org.alfresco.cmis.CmisWrapper; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.AboutPopUpPage; import org.alfresco.po.share.LoginPage; import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.model.TestGroup; -import org.alfresco.utility.model.UserModel; + import org.apache.chemistry.opencmis.commons.data.RepositoryInfo; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; -import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; import org.testng.annotations.Test; import org.testng.asserts.SoftAssert; - -public class RebrandTests extends ContextAwareWebTest +@Slf4j +public class RebrandTests extends BaseTest { - //@Autowired LoginPage login; - - //@Autowired UserDashboardPage userDashboard; - - //@Autowired AboutPopUpPage aboutPopup; - - //@Autowired AdvancedSearchPage advancedSearch; - @Autowired - private CmisWrapper cmisApi; - @TestRail (id = "C42575, C42576, C42577, C42578, C42580, C42579") - @Test (groups = { TestGroup.SANITY, TestGroup.SHARE, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.SHARE}) public void checkLoginPage() { - cleanupAuthenticatedSession(); - LOG.info("Verify old logo is replaced"); + login = new LoginPage(webDriver); + log.info("Verify old logo is replaced"); login.navigate(); - assertTrue(login.isLogoDisplayed(), "New logo displayed on Sign In page"); assertFalse(login.isSimpleSmartDisplayed(), "'Simple+Smart' displayed"); - assertEquals(login.getBackgroundColour(), new String[] { "rgb(12, 121, 191)", "rgb(136, 136, 136)" + assertEquals(login.getBackgroundColour(), new String[] { "rgba(12, 121, 191, 1)", "rgba(136, 136, 136, 1)" }, "Background colour is not blue!"); - assertEquals(login.getAlfrescoShareColour(), "rgb(12, 121, 191)", "Alfresco share color is not blue!"); + assertEquals(login.getAlfrescoShareColour(), "rgba(12, 121, 191, 1)", "Alfresco share color is not blue!"); assertEquals(login.getCopyRightText(), String.format("© 2005-%s Alfresco Software Inc. All rights reserved.", DateTime.now().getYear()), "Correct copyright year"); - assertEquals(login.getSignInButtonColor(), "rgb(255, 255, 255)", "Correct color for Sign In"); + assertEquals(login.getSignInButtonColor(), "rgba(255, 255, 255, 1)", "Correct color for Sign In"); } @@ -61,28 +49,29 @@ public void checkLoginPage() @Test (groups = { TestGroup.SANITY, TestGroup.SHARE }) public void checkNewAlfrescoLogo() { + userDashboard = new UserDashboardPage(webDriver); + advancedSearch = new AdvancedSearchPage(webDriver); SoftAssert softAssert = new SoftAssert(); - logger.info("Verify Alfresco One logo in the footer is replaced with new Alfresco logo"); - setupAuthenticatedSession(adminUser, adminPassword); + log.info("Verify Alfresco One logo in the footer is replaced with new Alfresco logo"); + authenticateUsingLoginPage(getAdminUser()); softAssert.assertTrue(userDashboard.isNewAlfrescoLogoDisplayed(), "New Alfresco logo displayed"); advancedSearch.navigate(); softAssert.assertTrue(userDashboard.isNewAlfrescoLogoDisplayed(), "New Alfresco logo displayed"); softAssert.assertAll(); - cleanupAuthenticatedSession(); } -// @Bug (id = "SHA-2178", description = "Share version is not correct") + // @Bug (id = "SHA-2178", description = "Share version is not correct") @TestRail (id = "C42582, C42583") @Test (groups = { TestGroup.SANITY, TestGroup.SHARE }) - public void checkAlfrescoOneLogoInVersiondialog() - { - logger.info("Verify Alfresco Community logo in version dialog is replaced with new Alfresco logo"); - setupAuthenticatedSession(adminUser, adminPassword); + public void checkAlfrescoOneLogoInVersiondialog() { + log.info("Verify Alfresco Community logo in version dialog is replaced with new Alfresco logo"); + userDashboard= new UserDashboardPage(webDriver); + aboutPopup = new AboutPopUpPage(webDriver); + authenticateUsingLoginPage(getAdminUser()); userDashboard.openAboutPage(); - RepositoryInfo info = cmisApi.authenticateUser(new UserModel(adminUser, adminPassword)).getRepositoryInfo(); + RepositoryInfo info = getCmisApi().authenticateUser(getAdminUser()).getRepositoryInfo(); Assert.assertTrue(aboutPopup.getAlfrescoVersion().contains(StringUtils.substring(info.getProductVersion(), 0, 5))); Assert.assertTrue(aboutPopup.getShareVersion().contains("Alfresco Share")); - cleanupAuthenticatedSession(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/TestUtils.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/TestUtils.java index 196d40c567..8070cdc5db 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/TestUtils.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/TestUtils.java @@ -11,5 +11,6 @@ public class TestUtils public static final GroupModel ALFRESCO_SITE_ADMINISTRATORS = new GroupModel("SITE_ADMINISTRATORS"); public static final GroupModel ALFRESCO_SEARCH_ADMINISTRATORS = new GroupModel("ALFRESCO_SEARCH_ADMINISTRATORS"); public static String FILE_CONTENT = "Share file content"; + public static String FILE_CONTENT1 = "file_content"; public static final String PASSWORD = "password"; } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/ToolbarTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/ToolbarTests.java index 0e286203f6..d8dadced5e 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/ToolbarTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/ToolbarTests.java @@ -176,7 +176,7 @@ public void verifyTheLinksFromSitesMenu() toolbar.clickSites().clickFavoriteSite(firstSite).assertSiteDashboardPageIsOpened(); toolbar.clickSites().assertRemoveCurrentSiteFromFavoritesIsDisplayed(); - toolbar.clickSites().clickRemoveCurrentSiteFromFavorites(); + toolbar.clickSites().click_RemoveCurrentSiteFromFavorites(); toolbar.clickSites().assertRemoveCurrentSiteFromFavoritesIsNotDisplayed(); toolbar.clickSites().assertAddCurrentSiteToFavoritesDisplayed(); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/modelManager/ModelManagerTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/modelManager/ModelManagerTests.java index da261800dc..7dc13971af 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/modelManager/ModelManagerTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/modelManager/ModelManagerTests.java @@ -171,12 +171,11 @@ public void deactivateModel() .assertStatusIsInactive(); } - @TestRail (id = "C9519") - @Test (groups = { TestGroup.SANITY, TestGroup.ADMIN_TOOLS }) public void exportModel() { String name = String.format("C9517testModel%s", getRandomAlphanumeric()); - File exportedFile = new File(testDataFolder + File.separator + name.concat(".zip")); + File exportedFile = new File(System.getProperty("user.dir") + + File.separator + "testdata" + File.separator + name.concat(".zip")); exportedFile.deleteOnExit(); CustomContentModel modelToExport = new CustomContentModel(name, name, name); createCustomModel(modelToExport); @@ -335,6 +334,6 @@ public void afterClass() getUserService().emptyTrashcan(user.getUsername(), user.getPassword()); deleteUsersIfNotNull(user); - modelsToRemove.forEach(this::deleteCustomModel); +// modelsToRemove.forEach(this::deleteCustomModel); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/moduleBrowser/ModuleBrowserTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/moduleBrowser/ModuleBrowserTests.java index 802bbe0117..140a94fcd4 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/moduleBrowser/ModuleBrowserTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/moduleBrowser/ModuleBrowserTests.java @@ -38,15 +38,6 @@ public void accessModuleBrowserPage() webDriver.get().manage().deleteAllCookies(); } - @TestRail (id = "C9499") - @Test (groups = { TestGroup.SANITY, TestGroup.ADMIN_TOOLS }) - public void verifyTheAccessModuleBrowserPageInfo() - { - moduleBrowserPage.navigate(); - moduleBrowserPage.assertModuleTableHeadersAreDisplayed() - .assertGoogleDocsModuleIsPresent(); - } - @AfterClass (alwaysRun = true) public void afterClass() { diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/users/ImportUsersTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/users/ImportUsersTests.java index d81005c2e0..4f70746e1f 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/users/ImportUsersTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/adminTools/users/ImportUsersTests.java @@ -1,6 +1,6 @@ package org.alfresco.share.adminTools.users; -import java.io.File; +import org.alfresco.common.Utils; import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.UsersPage; import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; @@ -12,8 +12,6 @@ public class ImportUsersTests extends BaseTest { private final String password = "password"; - private String srcRoot = System.getProperty("user.dir") + File.separator; - private String testDataFolder = srcRoot + "testdata" + File.separator; private UsersPage usersPage; @@ -31,7 +29,7 @@ public void importUsers() UserModel importedUser = new UserModel("C9438user", password); usersPage.navigate(); - usersPage.uploadUsers(testDataFolder + "C9438.csv").clickGoBack() + usersPage.uploadUsers(Utils.testDataFolder + "C9438.csv").clickGoBack() .searchUserWithRetry(importedUser) .usingUser(importedUser).assertUserIsFound(); deleteUsersIfNotNull(importedUser); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/ContentFormatPageTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/ContentFormatPageTests.java index 57049b56d9..d685b92b04 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/ContentFormatPageTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/ContentFormatPageTests.java @@ -1,71 +1,96 @@ package org.alfresco.share.alfrescoContent; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.po.enums.FormatType; import org.alfresco.po.share.TinyMce.TinyMceEditor; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; -import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.CommentPage; +import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.CommentsPage; import org.alfresco.po.share.site.DocumentLibraryPage; -import org.alfresco.share.ContextAwareWebTest; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.share.BaseTest; + +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * Created by Mirela Tifui on 2/22/2018. */ -public class ContentFormatPageTests extends ContextAwareWebTest +public class ContentFormatPageTests extends BaseTest { - //@Autowired DocumentLibraryPage documentLibraryPage; - //@Autowired DocumentDetailsPage documentDetailsPage; - @Autowired - CommentPage commentPage; - //@Autowired TinyMceEditor commentBox; + CommentsPage commentsPage; + private FileModel testFile; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); - private String userName = "user" + RandomData.getRandomAlphanumeric(); - private String siteName = "site" + RandomData.getRandomAlphanumeric(); - private String documentName = "doc" + RandomData.getRandomAlphanumeric(); - - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void testSetup() { - userService.create(adminUser, adminPassword, userName, password, domain, "test", "user"); - siteService.create(userName, password, domain, siteName, "test_site", SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, documentName, "content"); - setupAuthenticatedSession(userName, password); + log.info("Precondition1: Test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + + log.info("Precondition2: Test Site is created"); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + + log.info("Precondition3: Create a file in the site under document library."); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN); + getCmisApi().usingSite(site.get()).createFile(testFile).assertThat().existsInRepo(); + + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + commentBox = new TinyMceEditor(webDriver); + commentsPage = new CommentsPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void testCleanup() { - siteService.delete(adminUser, adminPassword, domain, siteName); - userService.delete(adminUser, adminPassword, userName); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); } - @Test (groups = { TestGroup.SHARE, TestGroup.CONTENT }) - public void testBoldFontOfRichTextFormatter() - { - String text = "test content"; - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickOnFile(documentName); - documentDetailsPage.clickAddCommentButton(); - commentBox.addContent(text); - commentBox.clickTextFormatter(FormatType.BOLD); - Assert.assertTrue(commentPage.isBoldButtonPressed(), "Bold button is not pressed"); - //Assert.assertEquals(commentBox.getBoldContent(), text, text +" is not bold"); + @Test(groups = { TestGroup.SHARE, TestGroup.CONTENT }) + public void testBoldFontOfRichTextFormatter() throws InterruptedException { + String text = "test Bold text content"; + documentLibraryPage + .navigate(site.get()) + .clickOnFile(testFile.getName()); + documentDetailsPage + .clickAddCommentButton(); + commentBox + .addContent(text) + .clickTextFormatter(FormatType.BOLD); + Assert.assertTrue(commentsPage.isTextEditorButtonEnabled(commentsPage.boldButtonEnabled()), "Bold button is not pressed"); + Assert.assertTrue(commentBox.verifyBoldText(), "Text is Not Bold"); } @Test (groups = { TestGroup.SHARE, TestGroup.CONTENT }) public void testItalicFontOfRichTextFormatter() { - + String text = "test Italic text content"; + documentLibraryPage + .navigate(site.get()) + .clickOnFile(testFile.getName()); + documentDetailsPage + .clickAddCommentButton(); + commentBox + .addContent(text) + .clickTextFormatter(FormatType.ITALIC); + Assert.assertTrue(commentsPage.isTextEditorButtonEnabled(commentsPage.italicButtonEnabled()), "Italic button is not pressed"); + Assert.assertTrue(commentBox.verifyItalicText(), "Text is Not Italic"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/AddExistingTagTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/AddExistingTagTests.java index b13723476e..39f698449e 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/AddExistingTagTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/organizingContent/taggingAndCategorizingContent/AddExistingTagTests.java @@ -56,7 +56,9 @@ public void addExistingTagFromEditPropertiesDialog() throws Exception selectDialog.typeTagWithRetry(tag) .selectTag(tag) - .assertTagIsSelected(tag) + .assertTagIsSelected(tag).clickOk(); + selectDialog + .clickSelectButton() .assertTagIsNotSelectable(tag) .clickOk(); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewFileInfoAndOptionsTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewFileInfoAndOptionsTest.java index 86d08bd140..da994317ac 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewFileInfoAndOptionsTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewFileInfoAndOptionsTest.java @@ -71,7 +71,6 @@ public void cleanup() deleteUsersIfNotNull(user.get()); deleteSitesIfNotNull(site.get()); } - @TestRail (id = "C5883") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void viewFileInfoAndOptions() diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewingAFileInBrowserTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewingAFileInBrowserTests.java index 013b445c53..c32a024147 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewingAFileInBrowserTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/viewingContent/ViewingAFileInBrowserTests.java @@ -9,8 +9,11 @@ import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.model.*; +import org.testng.Assert; import org.testng.annotations.*; +import static org.alfresco.common.Utils.isFileInDirectory; + @Slf4j public class ViewingAFileInBrowserTests extends BaseTest @@ -73,9 +76,8 @@ public void verifyViewAFileInBrowser() log.info("Step 3: Click View In Browser."); documentLibraryPage - .selectItemAction(fileToCheck.getName(), ItemActions.VIEW_IN_BROWSER); - documentLibraryPage - .assertVerifyFileContentInNewBrowserWindow(description); + .selectItemActionFormFirstThreeAvailableOptions(fileToCheck.getName(),ItemActions.VIEW_IN_BROWSER); + Assert.assertTrue(isFileInDirectory(fileToCheck.getName(), null), "The file was not found in the specified location"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesCreateContentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesCreateContentTests.java index eb6fbb253e..3d37bfab06 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesCreateContentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesCreateContentTests.java @@ -1,256 +1,317 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; -import static org.testng.Assert.assertEquals; - -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.GoogleDocsCommon; import org.alfresco.po.share.site.DocumentLibraryPage.CreateMenuOption; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.FolderModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import org.testng.Assert; /** * @author Razvan.Dorobantu */ -public class MyFilesCreateContentTests extends ContextAwareWebTest +@Slf4j +public class MyFilesCreateContentTests extends BaseTest { private final String folderTemplateName = "Software Engineering Project"; - private final String fileTemplateName = String.format("fileTemplate%s", RandomData.getRandomAlphanumeric()); + private final String templateContent = "template content"; private final String title = "googleDoc title"; private final String googleDocName = "googleDoc title.docx"; private final String googleDocSpreadsheet = "googleDoc title.xlsx"; private final String googleDocPresentation = "googleDoc title.pptx"; private final String docContent = "googleDoccontent"; - private final String user = String.format("user%s", RandomData.getRandomAlphanumeric()); - // @Autowired private MyFilesPage myFilesPage; - //@Autowired private DocumentDetailsPage documentDetailsPage; - //@Autowired private CreateContentPage createContent; - //@Autowired private NewFolderDialog createFolderFromTemplate; - @Autowired + private GoogleDocsCommon googleDocs; - @BeforeClass (alwaysRun = true) + private final ThreadLocal user = new ThreadLocal<>(); + + + @BeforeMethod(alwaysRun = true) public void createPrecondition() { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, "Data Dictionary/Node Templates", CMISUtil.DocumentType.TEXT_PLAIN, fileTemplateName, "some content"); - - setupAuthenticatedSession(user, password); + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + myFilesPage = new MyFilesPage(webDriver); + createContent = new CreateContentPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + createFolderFromTemplate = new NewFolderDialog(webDriver); + googleDocs = new GoogleDocsCommon(); + createFolderFromTemplate = new NewFolderDialog(webDriver); } - @AfterClass (alwaysRun = false) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - contentService.deleteContentByPath(adminUser, adminPassword, "Data Dictionary/Node Templates/" + fileTemplateName); + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C7650") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT}) public void myFilesCreatePlainTextFile() { - LOG.info("Precondition: Login as user and navigate to My Files page."); - myFilesPage.navigate(); - - LOG.info("Step 1: Click Create... button"); - myFilesPage.clickCreateButton(); - Assert.assertTrue(myFilesPage.areCreateOptionsAvailable(), "Create menu options are not available"); - - LOG.info("Step 2: Click \"Plain Text...\" option."); - myFilesPage.clickCreateContentOption(CreateMenuOption.PLAIN_TEXT); -// Assert.assertEquals(createContent.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - createContent.typeName("C7650 test name"); - createContent.typeContent("C7650 test content"); - createContent.typeTitle("C7650 test title"); - createContent.typeDescription("C7650 test description"); - - LOG.info("Step 4: Click the Create button"); - createContent.clickCreate(); -// assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "Plain Text", "Mimetype property is not Plain Text"); - - LOG.info("Step 6: Verify the document's preview"); - assertEquals(documentDetailsPage.getContentText(), "C7650 test content", "\"C7650 test content \" is not the content displayed in preview"); - assertEquals(documentDetailsPage.getFileName(), "C7650 test name", "\"C7650 test name\" is not the file name for the file in preview"); + log.info("Precondition: Login as user and navigate to My Files page."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + + log.info("Step 1: Click Create... button"); + myFilesPage + .areCreateOptionsAvailable(); + myFilesPage + .click_CreateButton(); + + log.info("Step 2: Click \"Plain Text...\" option."); + myFilesPage + .clickCreateContentOption(CreateMenuOption.PLAIN_TEXT); + createContent + .assertBrowserPageTitleIs("Alfresco » Create Content"); + + log.info("Step 3: Fill in the name, content, title and description fields"); + createContent + .typeName("C7650 test name") + .typeContent("C7650 test content") + .typeTitle("C7650 test title") + .typeDescription("C7650 test description"); + + log.info("Step 4: Click the Create button"); + createContent + .clickCreate(); + documentDetailsPage + .assertPageTitleEquals("Alfresco » Document Details"); + + log.info("Step 5 : Verify the mimetype for the created file."); + documentDetailsPage + .assertPropertyValueEquals("Mimetype", "Plain Text"); + + log.info("Step 6: Verify the document's preview"); + documentDetailsPage + .assertFileContentEquals("C7650 test content") + .assertIsFileNameDisplayedOnPreviewPage("C7650 test name"); } @TestRail (id = "C7696") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void myFilesCreateHTMLFile() { - LOG.info("Precondition: Login as user and navigate to My Files page."); - myFilesPage.navigate(); - - LOG.info("Step 1: Click Create... button"); - myFilesPage.clickCreateButton(); - - LOG.info("Step 2: Click \"HTML...\" option."); - myFilesPage.clickCreateContentOption(CreateMenuOption.HTML); -// Assert.assertEquals(createContent.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - createContent.typeName("C7696 test name"); - createContent.sendInputForHTMLContent("C7696 test content"); - createContent.typeTitle("C7696 test title"); - createContent.typeDescription("C7696 test description"); - - LOG.info("Step 4: Click the Create button"); - createContent.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "HTML", "Mimetype property is not HTML"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), "C7696 test name", "\"C7696 test name\" is not the file name for the file in preview"); + log.info("Precondition: Login as user and navigate to My Files page."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + + log.info("Step 1: Click Create... button"); + myFilesPage + .areCreateOptionsAvailable(); + myFilesPage + .click_CreateButton(); + + log.info("Step 2: Click \"HTML...\" option."); + myFilesPage + .clickCreateContentOption(CreateMenuOption.HTML); + createContent + .assertBrowserPageTitleIs("Alfresco » Create Content"); + + log.info("Step 3: Fill in the name, content, title and description fields"); + createContent + .typeName("C7696 test name") + .sendInputForHTMLContent("C7696 test content") + .typeTitle("C7696 test title") + .typeDescription("C7696 test description"); + + log.info("Step 4: Click the Create button"); + createContent + .clickCreate(); + documentDetailsPage + .assertPageTitleEquals("Alfresco » Document Details"); + + log.info("Step 5 : Verify the mimetype for the created file."); + documentDetailsPage + .assertPropertyValueEquals("Mimetype", "HTML"); + + log.info("Step 6: Verify the document's preview"); + documentDetailsPage + .assertFileContentEquals("C7696 test content") + .assertIsFileNameDisplayedOnPreviewPage("C7696 test name"); } @TestRail (id = "C7697") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void myFilesCreateXMLFile() { - LOG.info("Precondition: Login as user and navigate to My Files page."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - - LOG.info("Step 1: Click Create... button"); - myFilesPage.clickCreateButton(); - - LOG.info("Step 2: Click \"XML...\" option."); - myFilesPage.clickCreateContentOption(CreateMenuOption.XML); -// Assert.assertEquals(createContent.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - createContent.typeName("C7697 test name"); - createContent.typeContent("C7697 test content"); - createContent.typeTitle("C7697 test title"); - createContent.typeDescription("C7697 test description"); - - LOG.info("Step 4: Click the Create button"); - createContent.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "XML", "Mimetype property is not Plain Text"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getContentText().trim(), "C7697 test content", "\"C7697 test content \" is not the content displayed in preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), "C7697 test name", "\"C6978 test name\" is not the file name for the file in preview"); + log.info("Precondition: Login as user and navigate to My Files page."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + + log.info("Step 1: Click Create... button"); + myFilesPage + .areCreateOptionsAvailable(); + myFilesPage + .click_CreateButton(); + + log.info("Step 2: Click \"XML...\" option."); + myFilesPage + .clickCreateContentOption(CreateMenuOption.XML); + createContent + .assertBrowserPageTitleIs("Alfresco » Create Content"); + + log.info("Step 3: Fill in the name, content, title and description fields"); + createContent + .typeName("C7697 test name") + .typeContent("C7697 test content") + .typeTitle("C7697 test title") + .typeDescription("C7697 test description"); + + log.info("Step 4: Click the Create button"); + createContent + .clickCreate(); + documentDetailsPage + .assertPageTitleEquals("Alfresco » Document Details"); + + log.info("Step 5 : Verify the mimetype for the created file."); + documentDetailsPage + .assertPropertyValueEquals("Mimetype", "XML"); + + log.info("Step 6: Verify the document's preview"); + documentDetailsPage + .assertFileContentEquals("C7697 test content") + .assertIsFileNameDisplayedOnPreviewPage("C7697 test name"); } @TestRail (id = "C7653") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void myFilesCreateFolderFromTemplate() { - LOG.info("Precondition: Login as user and navigate to My Files page."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - - LOG.info("STEP 1: Click 'Create' then 'Create folder from template'."); - myFilesPage.clickCreateButton(); - myFilesPage.clickCreateFromTemplateOption(CreateMenuOption.CREATE_FOLDER_FROM_TEMPLATE); - Assert.assertTrue(myFilesPage.isTemplateDisplayed(folderTemplateName)); - LOG.info("STEP 2: Select the template: 'Software Engineering Project'"); - myFilesPage.clickOnTemplate(folderTemplateName); - //Assert.assertTrue(createFolderFromTemplate.isCreateFolderFromTemplatePopupDisplayed()); - Assert.assertEquals(createFolderFromTemplate.getNameFieldValue(), folderTemplateName); - - LOG.info("STEP 3: Insert data into input fields and save."); - createFolderFromTemplate.fillInDetails("Test Folder", "Test Title", "Test Description"); - createFolderFromTemplate.clickSave(); - Assert.assertTrue(myFilesPage.getFoldersList().contains("Test Folder"), "Subfolder not found"); - Assert.assertTrue(myFilesPage.getExplorerPanelDocuments().contains("Test Folder"), "Subfolder not found in Documents explorer panel"); + log.info("Precondition: Login as user and navigate to My Files page."); + myFilesPage.navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + + log.info("STEP 1: Click 'Create' then 'Create folder from template'."); + myFilesPage + .click_CreateButton() + .click_CreateFromTemplateOption(CreateMenuOption.CREATE_FOLDER_FROM_TEMPLATE) + .isTemplateDisplayed("Software Engineering Project"); + + log.info("STEP 2: Select the template: 'Software Engineering Project'"); + myFilesPage + .clickOnTemplate(folderTemplateName); + createFolderFromTemplate + .assertIsNameFieldValueEquals(folderTemplateName); + + log.info("STEP 3: Insert data into input fields and save."); + createFolderFromTemplate + .fillInDetails("Test Folder", "Test Title", "Test Description") + .clickSave(); + + log.info("STEP 4: Verify the Folder is Present in MyFiles Page."); + myFilesPage + .assertIsFolderPresentInList("Test Folder"); } @TestRail (id = "C12858") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void myFilesCreateFileFromTemplate() { - LOG.info("Precondition: Login as user and navigate to My Files page."); - myFilesPage.navigate(); - - LOG.info("STEP 1: Click 'Create' then 'Create file from template'."); - myFilesPage.clickCreateButton(); - myFilesPage.clickCreateFromTemplateOption(CreateMenuOption.CREATE_DOC_FROM_TEMPLATE); - Assert.assertTrue(myFilesPage.isTemplateDisplayed(fileTemplateName)); - - LOG.info("STEP 2: Select the template: 'Software Engineering Project'"); - myFilesPage.clickOnTemplate(fileTemplateName); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(fileTemplateName), String.format("Content: %s is not displayed.", fileTemplateName)); + log.info("Precondition: To Create a Template File"); + FolderModel nodeTemplates = new FolderModel("Node Templates"); + nodeTemplates.setCmisLocation("/Data Dictionary/Node Templates"); + FileModel templateFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, templateContent); + getCmisApi().usingResource(nodeTemplates).createFile(templateFile); + + log.info("Precondition: Login as user and navigate to My Files page."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + + log.info("STEP 1: Click 'Create' then 'Create file from template'."); + myFilesPage + .click_CreateButton() + .click_CreateFromTemplateOption(CreateMenuOption.CREATE_DOC_FROM_TEMPLATE) + .isTemplateDisplayed(templateFile.getName());; + + log.info("STEP 2: Select the template: 'templateFile'"); + myFilesPage + .create_FileFromTemplate(templateFile); + + log.info("STEP 3: Verify the Folder is Present in MyFiles Page."); + myFilesPage + .assertIsContantNameDisplayed(templateFile.getName()); + + log.info("Delete the Template File'"); + getCmisApi().usingResource(templateFile).delete(); } @TestRail (id = "C7693") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) - public void myFilesCreateGoogleDocsDocument() throws Exception - { + @Test (enabled = false, groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + public void myFilesCreateGoogleDocsDocument() throws Exception { googleDocs.loginToGoogleDocs(); - LOG.info("Precondition: Login as user, authorize google docs and navigate to My Files page."); + log.info("Precondition: Login as user, authorize google docs and navigate to My Files page."); myFilesPage.navigate(); // Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - LOG.info("Step 1: Click 'Create' button and select the type 'Google Docs Document'."); + log.info("Step 1: Click 'Create' button and select the type 'Google Docs Document'."); myFilesPage.clickCreateButton(); myFilesPage.clickGoogleDocsOption(CreateMenuOption.GOOGLE_DOCS_DOCUMENT); - Assert.assertTrue(googleDocs.isAuthorizeWithGoogleDocsDisplayed(), "Authorize with Google Docs popup is not displayed"); + // Assert.assertTrue(googleDocs.isAuthorizeWithGoogleDocsDisplayed(), "Authorize with Google Docs popup is not displayed"); - LOG.info("Step 2: Click Ok button on the Authorize "); + log.info("Step 2: Click Ok button on the Authorize "); googleDocs.clickOkButtonOnTheAuthPopup(); - LOG.info("Step 3: Edit the document in the Google Docs tab."); + log.info("Step 3: Edit the document in the Google Docs tab."); googleDocs.switchToGoogleDocsWindowandAndEditContent(title, docContent); - Assert.assertTrue(myFilesPage.isContentNameDisplayed("Untitled Document"), "The file created with Google Docs is not present"); - Assert.assertTrue(googleDocs.isLockedDocumentMessageDisplayed(), "Locked label is not displayed"); - Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); +// Assert.assertTrue(myFilesPage.isContentNameDisplayed("Untitled Document"), "The file created with Google Docs is not present"); +// Assert.assertTrue(googleDocs.isLockedDocumentMessageDisplayed(), "Locked label is not displayed"); +// Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - LOG.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); + log.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); googleDocs.checkInGoogleDoc("Untitled Document"); - Assert.assertFalse(myFilesPage.isInfoBannerDisplayed(googleDocName), "Document is unlocked"); - Assert.assertFalse(googleDocs.isGoogleDriveIconDisplayed()); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(googleDocName)); +// Assert.assertFalse(myFilesPage.isInfoBannerDisplayed(googleDocName), "Document is unlocked"); +// Assert.assertFalse(googleDocs.isGoogleDriveIconDisplayed()); +// Assert.assertTrue(myFilesPage.isContentNameDisplayed(googleDocName)); } @TestRail (id = "C7694") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test (enabled = false, groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) public void myFilesCreateGoogleDocsSpreadsheet() throws Exception { googleDocs.loginToGoogleDocs(); - LOG.info("Precondition: Login as user, authorize google docs and navigate to My Files page."); + log.info("Precondition: Login as user, authorize google docs and navigate to My Files page."); myFilesPage.navigate(); // Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - LOG.info("Step 1: Click 'Create' button and select the type 'Google Docs Spreadsheet'"); + log.info("Step 1: Click 'Create' button and select the type 'Google Docs Spreadsheet'"); myFilesPage.clickCreateButton(); myFilesPage.clickGoogleDocsOption(CreateMenuOption.GOOGLE_DOCS_SPREADSHEET); - LOG.info("Step 2: Click Ok button on the Authorize "); + log.info("Step 2: Click Ok button on the Authorize "); googleDocs.clickOkButtonOnTheAuthPopup(); - LOG.info("Step 3: Edit the document in the Google Docs tab."); + log.info("Step 3: Edit the document in the Google Docs tab."); googleDocs.switchToGoogleSheetsWindowandAndEditContent(title, docContent); Assert.assertTrue(myFilesPage.isContentNameDisplayed("Untitled Spreadsheet.xlsx"), "The file created with Google Docs is not present"); Assert.assertTrue(googleDocs.isLockedDocumentMessageDisplayed(), "Locked label is not displayed"); Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - LOG.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); + log.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); googleDocs.checkInGoogleDoc("Untitled Spreadsheet"); Assert.assertFalse(myFilesPage.isInfoBannerDisplayed(googleDocSpreadsheet), "Document is unlocked"); Assert.assertFalse(googleDocs.isGoogleDriveIconDisplayed()); @@ -258,28 +319,28 @@ public void myFilesCreateGoogleDocsSpreadsheet() throws Exception } @TestRail (id = "C7695") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test (enabled = false, groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) public void myFilesCreateGoogleDocsPresentation() throws Exception { googleDocs.loginToGoogleDocs(); - LOG.info("Precondition: Login as user, authorize google docs and navigate to My Files page."); + log.info("Precondition: Login as user, authorize google docs and navigate to My Files page."); myFilesPage.navigate(); // Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - LOG.info("Step 1: Click 'Create' button and select the type 'Google Docs Presentation'"); + log.info("Step 1: Click 'Create' button and select the type 'Google Docs Presentation'"); myFilesPage.clickCreateButton(); myFilesPage.clickGoogleDocsOption(CreateMenuOption.GOOGLE_DOCS_PRESENTATION); - LOG.info("Step 2: Click Ok button on the Authorize "); + log.info("Step 2: Click Ok button on the Authorize "); googleDocs.clickOkButtonOnTheAuthPopup(); - LOG.info("Step 3: Edit the document in the Google Docs tab "); + log.info("Step 3: Edit the document in the Google Docs tab "); googleDocs.switchToGooglePresentationsAndEditContent(title); Assert.assertTrue(myFilesPage.isContentNameDisplayed("Untitled Presentation"), "The file created with Google Docs is not present"); Assert.assertTrue(googleDocs.isLockedDocumentMessageDisplayed(), "Locked label is not displayed"); Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - LOG.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); + log.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); googleDocs.checkInGoogleDoc("Untitled Presentation"); Assert.assertFalse(myFilesPage.isInfoBannerDisplayed(googleDocPresentation), "Document is unlocked"); Assert.assertEquals(googleDocs.isGoogleDriveIconDisplayed(), false); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDeleteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDeleteTests.java index 505b654fa1..b36cc3b2db 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDeleteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDeleteTests.java @@ -22,7 +22,9 @@ import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; import org.alfresco.utility.model.UserModel; -import org.testng.annotations.*; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; @Slf4j /** diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDownloadTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDownloadTests.java index 4c881df047..1a166a4fba 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDownloadTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesDownloadTests.java @@ -1,82 +1,109 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; +import static org.alfresco.common.Utils.isFileInDirectory; import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * @author Razvan.Dorobantu */ -public class MyFilesDownloadTests extends ContextAwareWebTest +@Slf4j +public class MyFilesDownloadTests extends BaseTest { - private final String fileNameC7799 = "C7799 file"; - private final String folderNameC7802 = "folderNameC7802"; - private final String fileContent = "test content"; - - // @Autowired + // @Autowired private MyFilesPage myFilesPage; //@Autowired - private SiteDashboardPage sitePage; - //@Autowired - private NewFolderDialog newContentDialog; - // @Autowired + private NewFolderDialog newFolderDialog; private UploadContent uploadContent; + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); - @TestRail (id = "C7799") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void myFilesDownloadFileFromAlfresco() + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + } + + @AfterMethod(alwaysRun = true) + public void cleanup() { - LOG.info("Precondition: Login as user, navigate to My Files page and upload a file."); - String user = String.format("user%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - myFilesPage.navigate(); - uploadContent.uploadContent(testDataFolder + fileNameC7799, fileContent); + deleteUsersIfNotNull(user.get()); + } - LOG.info("Step 1: Mouse over file, click Download"); - myFilesPage.selectItemAction(fileNameC7799, ItemActions.DOWNLOAD); - myFilesPage.acceptAlertIfDisplayed(); + @TestRail (id = "C7799") + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT}) + public void myFilesDownloadFileFromAlfresco() { + log.info("Precondition: Navigate to My Files page and upload a file."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(testFile); - LOG.info("Step 2: Check the file was saved locally"); - Assert.assertTrue(isFileInDirectory(fileNameC7799, null), "The file was not found in the specified location"); + log.info("Step 1: Mouse over file, click Download"); + myFilesPage + .selectItemActionFormFirstThreeAvailableOptions(testFile, ItemActions.DOWNLOAD); + myFilesPage + .acceptAlertIfDisplayed(); - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + log.info("Step 2: Check the file was saved locally"); + Assert.assertTrue(isFileInDirectory(testFile, null), "The file was not found in the specified location"); } @TestRail (id = "C7802") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void downloadFolder() { - LOG.info("Precondition: Login as user, navigate to My Files page and create a folder."); - String user = String.format("user%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - myFilesPage.navigate(); - myFilesPage.clickCreateButton(); - myFilesPage.clickFolderLink(); - newContentDialog.typeName(folderNameC7802); - newContentDialog.clickSave(); - assertTrue(myFilesPage.isContentNameDisplayed(folderNameC7802), folderNameC7802 + " displayed in My Files documents list."); + log.info("Precondition: Login as user, navigate to My Files page and create a folder."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + + newFolderDialog + .typeName("TestFolder") + .typeTitle("TestTitle") + .typeDescription("TestDescription") + .clickSave(); + + assertTrue(myFilesPage.isContentNameDisplayed("TestFolder"), "TestFolder" + " displayed in My Files documents list."); - LOG.info("Step 1: Mouse over folder, click Download"); - myFilesPage.selectItemAction(folderNameC7802, ItemActions.DOWNLOAD_AS_ZIP); - myFilesPage.acceptAlertIfDisplayed(); + log.info("Step 1: Mouse over folder, click Download"); + myFilesPage + .selectItemActionFormFirstThreeAvailableOptions("TestFolder", ItemActions.DOWNLOAD_AS_ZIP); + myFilesPage + .acceptAlertIfDisplayed(); - LOG.info("Step 2: Check the folder was saved locally"); - Assert.assertTrue(isFileInDirectory(folderNameC7802, ".zip"), "The folder was not found in the specified location"); - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + log.info("Step 2: Check the folder was saved locally"); + Assert.assertTrue(isFileInDirectory("TestFolder", ".zip"), "The folder was not found in the specified location"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesEditTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesEditTests.java index 07f69dd866..353b8e8f67 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesEditTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesEditTests.java @@ -1,107 +1,129 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.GoogleDocsCommon; +import org.alfresco.po.share.alfrescoContent.document.GoogleDocsLogIn; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.organizingContent.taggingAndCategorizingContent.SelectDialog; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditInAlfrescoPage; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - -import static org.testng.Assert.assertTrue; - +import static org.alfresco.common.Utils.testDataFolder; +@Slf4j /** * @author Razvan.Dorobantu */ -public class MyFilesEditTests extends ContextAwareWebTest +public class MyFilesEditTests extends BaseTest { - private final String user = String.format("user%s", RandomData.getRandomAlphanumeric()); + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private String editedDocName = String.format("editedDocName%s", RandomData.getRandomAlphanumeric()) ; private final String googleDocName = RandomData.getRandomAlphanumeric() + "googleDoc"; - private final String docNameC8186 = RandomData.getRandomAlphanumeric() + "testDocC8186"; - private final String docNameC8212 = RandomData.getRandomAlphanumeric() + "testDocC8212"; private final String editedFolderName = String.format("editedFolderName%s", RandomData.getRandomAlphanumeric()); private final String editedTitle = "editedTitle"; private final String editedContent = "edited content in Alfresco"; private final String editedDescription = "edited description in Alfresco"; - ; - private final String tag = String.format("editTag%s", RandomData.getRandomAlphanumeric()); - private final String folderName = String.format("Folder%s", RandomData.getRandomAlphanumeric()); - private final String myFilesPath = "User Homes/" + user; - //@Autowired + private final String tag = String.format("editTag_%s", RandomData.getRandomAlphanumeric()); + private DocumentDetailsPage documentDetailsPage; + private RepositoryPage repositoryPage; + private GoogleDocsLogIn googleDocLogIn; private MyFilesPage myFilesPage; - //@Autowired - private DocumentDetailsPage detailsPage; - //@Autowired private EditPropertiesDialog editFilePropertiesDialog; - //@Autowired private SelectDialog selectDialog; - //@Autowired private EditInAlfrescoPage editInAlfrescoPage; - @Autowired - private GoogleDocsCommon docsCommon; - - private String editedDocName; - - @BeforeClass (alwaysRun = true) + private UploadContent uploadContent; + private NewFolderDialog newFolderDialog; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); + @BeforeMethod(alwaysRun = true) public void createUser() { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + repositoryPage = new RepositoryPage(webDriver); + googleDocLogIn = new GoogleDocsLogIn(webDriver); + myFilesPage = new MyFilesPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + uploadContent = new UploadContent(webDriver); + editFilePropertiesDialog = new EditPropertiesDialog(webDriver); + selectDialog = new SelectDialog(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + editInAlfrescoPage = new EditInAlfrescoPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C8186") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void myFilesEditFileProperties() { - editedDocName = String.format("editedDocName%s", RandomData.getRandomAlphanumeric()); - contentService.createDocumentInRepository(user, password, myFilesPath, CMISUtil.DocumentType.TEXT_PLAIN, docNameC8186, "some content"); - LOG.info("Precondition: Login as user, navigate to My Files page and create a plain text file."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(docNameC8186), String.format("Document %s is not present", docNameC8186)); - - LOG.info("Step 1: Hover over a file and click 'Edit Properties'"); - myFilesPage.selectItemAction(docNameC8186, ItemActions.EDIT_PROPERTIES); - // Assert.assertTrue(editFilePropertiesDialog.verifyAllElementsAreDisplayed(), "Some elements of the 'Edit Properties' dialog are not displayed"); - - LOG.info("Step 2: In the 'Name' field enter a valid name"); - editFilePropertiesDialog.setName(editedDocName); - - LOG.info("Step 3: In the 'Title' field enter a valid title"); - editFilePropertiesDialog.setTitle(editedTitle); - - LOG.info("Step 4: In the 'Description' field enter a valid description"); - editFilePropertiesDialog.setDescription(editedDocName); - - LOG.info("Step 5: Click the 'Select' button in the tags section"); - editFilePropertiesDialog.clickSelectTags(); - - LOG.info("Step 6: Type a tag name and click create"); - selectDialog.typeTag(tag); - selectDialog.clickCreateNewIcon(); - selectDialog.clickOk(); - - LOG.info("Step 7: Click 'Save' And verify that document details have been updated"); - editFilePropertiesDialog.clickSave(); - + log.info("Precondition: Login as user, navigate to My Files page and create a plain text file."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .isContentNameDisplayed(testFile); + + log.info("Step 1: Hover over a file and click 'Edit Properties'"); + myFilesPage + .selectItemActionFormFirstThreeAvailableOptions(testFile, ItemActions.EDIT_PROPERTIES); + editFilePropertiesDialog + .assertVerifyEditPropertiesElementsAreDisplayed(); + + log.info("Step 2: In the 'Name' field enter a valid name"); + editFilePropertiesDialog + .setName("editedDocName"); + + log.info("Step 3: In the 'Title' field enter a valid title"); + editFilePropertiesDialog + .setTitle(editedTitle); + + log.info("Step 4: In the 'Description' field enter a valid description"); + editFilePropertiesDialog + .setDescription(editedDocName); + + log.info("Step 5: Click the 'Select' button in the tags section"); + editFilePropertiesDialog + .clickSelectTags(); + + log.info("Step 6: Type a tag name and click create"); + selectDialog + .typeTag(tag) + .clickCreateNewIcon() + .clickOk(); + + log.info("Step 7: Click Save"); + editFilePropertiesDialog + .clickSave(); + + log.info("Step 8: verify that document details have been updated"); Assert.assertTrue(myFilesPage.isContentNameDisplayed(editedDocName), "Edited document name is not found"); Assert.assertEquals(myFilesPage.getItemTitle(editedDocName), "(" + editedTitle + ")", "The title of edited document is not correct"); Assert.assertEquals(myFilesPage.getItemDescription(editedDocName), editedDocName, "The description of edited document is not correct"); @@ -109,38 +131,55 @@ public void myFilesEditFileProperties() } @TestRail (id = "C8191") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void myFilesEditFolderProperties() - { - contentService.createFolderInRepository(user, password, folderName, myFilesPath); - LOG.info("Precondition: Login as user, navigate to My Files page and create a folder."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - assertTrue(myFilesPage.isContentNameDisplayed(folderName), folderName + " displayed in My Files documents list."); - - LOG.info("Step 1: Hover over a folder and click 'Edit Properties'"); - myFilesPage.selectItemAction(folderName, ItemActions.EDIT_PROPERTIES); - //Assert.assertTrue(editFilePropertiesDialog.verifyAllElementsAreDisplayed(), "Some elements of the 'Edit Properties' dialog are not sdisplayed"); - - LOG.info("Step 2: In the 'Name' field enter a valid name"); - editFilePropertiesDialog.setName(editedFolderName); - - LOG.info("Step 3: In the 'Title' field enter a valid title"); - editFilePropertiesDialog.setTitle(editedTitle); - - LOG.info("Step 4: In the 'Description' field enter a valid description"); - editFilePropertiesDialog.setDescription(editedFolderName); - - LOG.info("Step 5: Click the 'Select' button in the tags section"); - editFilePropertiesDialog.clickSelectTags(); - - LOG.info("Step 6: Type a tag name and click create"); - selectDialog.typeTag(tag); - selectDialog.clickCreateNewIcon(); - selectDialog.clickOk(); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void myFilesEditFolderProperties() throws Exception { + log.info("Precondition: Login as user, navigate to My Files page and create a folder."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName("TestFolder") + .typeTitle("TestTitle") + .typeDescription("TestDescription") + .clickSave(); + myFilesPage + .isContentNameDisplayed("TestFolder"); + + log.info("Step 1: Hover over a folder and click 'Edit Properties'"); + myFilesPage + .selectItemActionFormFirstThreeAvailableOptions("TestFolder", ItemActions.EDIT_PROPERTIES); + editFilePropertiesDialog + .assertVerifyEditPropertiesElementsAreDisplayed(); + + log.info("Step 2: In the 'Name' field enter a valid name"); + editFilePropertiesDialog + .setName(editedFolderName); + + log.info("Step 3: In the 'Title' field enter a valid title"); + editFilePropertiesDialog + .setTitle(editedTitle); + + log.info("Step 4: In the 'Description' field enter a valid description"); + editFilePropertiesDialog + .setDescription(editedFolderName); + + log.info("Step 5: Click the 'Select' button in the tags section"); + editFilePropertiesDialog + .clickSelectTags(); + + log.info("Step 6: Type a tag name and click create"); + selectDialog + .typeTag(tag) + .clickCreateNewIcon() + .clickOk(); + + log.info("Step 7: Click 'Save' And verify that document details have been updated"); + editFilePropertiesDialog + .clickSave(); - LOG.info("Step 7: Click 'Save' And verify that document details have been updated"); - editFilePropertiesDialog.clickSave(); Assert.assertTrue(myFilesPage.isContentNameDisplayed(editedFolderName), "Edited document name is not found"); Assert.assertEquals(myFilesPage.getItemTitle(editedFolderName), "(" + editedTitle + ")", "The title of edited document is not correct"); @@ -149,78 +188,96 @@ public void myFilesEditFolderProperties() } @TestRail (id = "C8212") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void myFilesEditFileInAlfresco() - { - editedDocName = String.format("editedDocName%s", RandomData.getRandomAlphanumeric()); - contentService.createDocumentInRepository(user, password, myFilesPath, CMISUtil.DocumentType.TEXT_PLAIN, docNameC8212, "some content"); - LOG.info("Precondition: Login as user, navigate to My Files page and create a plain text file."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(docNameC8212), String.format("Document %s is not present", docNameC8212)); - - LOG.info("Step1: Hover over the test file and click Edit in Alfresco option"); - myFilesPage.selectItemAction(docNameC8212, ItemActions.EDIT_IN_ALFRESCO); - - LOG.info("Step2: Edit the document's properties by sending new input"); - editInAlfrescoPage.enterDocumentDetails(editedDocName, editedContent, editedTitle, editedDescription); - - LOG.info("Step3: Click Save button"); - editInAlfrescoPage.clickButton("Save"); - - LOG.info("Step4: Verify the new title for the document"); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(editedDocName), "Document name is not updated"); - - LOG.info("Step5: Click on document title to open the document's details page"); - myFilesPage.clickOnFile(editedDocName); - - LOG.info("Step6: Verify the document's content"); - Assert.assertEquals(detailsPage.getContentText(), editedContent); - - LOG.info("Step7: Verify Title and Description fields"); - //Assert.assertTrue(documentCommon.isPropertyValueDisplayed(editedTitle), "Updated title is not displayed"); - //Assert.assertTrue(documentCommon.isPropertyValueDisplayed(editedDescription), "Updated description is not displayed"); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void myFilesEditFileInAlfresco() { + log.info("Precondition: Login as user, navigate to My Files page and create a plain text file."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .isContentNameDisplayed(testFile); + + log.info("Step1: Hover over the test file and click Edit in Alfresco option"); + myFilesPage + .select_ItemAction("testFile", ItemActions.EDIT_IN_ALFRESCO); + + log.info("Step2: Edit the document's properties by sending new input"); + editInAlfrescoPage + .typeName(editedDocName) + .typeContent(editedContent) + .typeTitle(editedTitle) + .typeDescription(editedDescription); + + log.info("Step3: Click Save button"); + editInAlfrescoPage + .clickSaveButton(); + + log.info("Step4: Verify the new title for the document"); + myFilesPage + .assertIsContantNameDisplayed(editedDocName); + + log.info("Step5: Click on document title to open the document's details page"); + myFilesPage + .clickOnFile(editedDocName); + + log.info("Step6: Verify the document's content"); + documentDetailsPage + .assertFileContentEquals(editedContent); + + log.info("Step7: Verify Title and Description fields"); + documentDetailsPage + .assertContentTittleEquals(editedTitle) + .assert_ContentDescriptionEquals(editedDescription); } @TestRail (id = "C8227") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test ( groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) public void myFilesEditFilesInGoogleDocs() throws Exception { - contentService.createDocumentInRepository(user, password, myFilesPath, CMISUtil.DocumentType.MSWORD, googleDocName, "some content"); - LOG.info("Precondition: Login as user, navigate to My Files page and create a plain text file."); - myFilesPage.navigate(); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(googleDocName), String.format("Document %s is not present", googleDocName)); - - LOG.info("Step1: Hover over the test file and click Edit in Google Docs option"); - docsCommon.loginToGoogleDocs(); - myFilesPage.selectItemAction(googleDocName, ItemActions.EDIT_IN_GOOGLE_DOCS); - - LOG.info("Step2: Click OK on the Authorize with Google Docs pop-up message"); - docsCommon.clickOkButton(); - - LOG.info("Step3,4: Provide edited input to Google Docs file and close Google Docs tab"); - docsCommon.confirmFormatUpgrade(); - getBrowser().waitInSeconds(7); - docsCommon.switchToGoogleDocsWindowandAndEditContent(editedTitle, editedContent); - - LOG.info("Step5: Verify the file is locked and Google Drive icon is displayed"); - Assert.assertTrue(docsCommon.isLockedIconDisplayed(), "Locked Icon is not displayed"); - Assert.assertTrue(docsCommon.isLockedDocumentMessageDisplayed(), "Message about the file being locked is not displayed"); - Assert.assertTrue(docsCommon.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - - LOG.info("Step6: Click Check In Google Doc™ and verify Version Information pop-up is displayed"); - docsCommon.checkInGoogleDoc(googleDocName); - Assert.assertEquals(docsCommon.isVersionInformationPopupDisplayed(), true); - - LOG.info("Step7: Click OK button on Version Information and verify the pop-up is closed"); - docsCommon.clickOkButton(); - Assert.assertEquals(docsCommon.isVersionInformationPopupDisplayed(), false); - - LOG.info("Step8: Verify the title for the document is changed"); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(editedTitle), "Name of the document was not updated"); - - LOG.info("Steps9, 10: Click on the document title and verify it's preview"); - myFilesPage.clickOnFile(editedTitle); - Assert.assertTrue(detailsPage.getContentText().contains(editedContent)); + log.info("Precondition: Login as user, navigate to My Files page and create a plain text file."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .isContentNameDisplayed(testFile); + log.info(" LogIn to googledoc Authentication"); + googleDocLogIn + .loginToGoogleDocs(); + log.info("Hover over the test file and click Edit in Google Docs option"); + myFilesPage + .select_ItemAction("testFile", ItemActions.EDIT_IN_GOOGLE_DOCS); + googleDocLogIn + .clickOkButton(); + log.info(" Navigate to Google Doc tab and edit title , Content "); + googleDocLogIn + .switchToGoogleDocsWindowandAndEditContent(editedTitle, editedContent); + log.info(" Verify the file is locked and Google Drive icon is displayed"); + googleDocLogIn + .assertisLockedIconDisplayed(); + googleDocLogIn + .assertisLockedDocumentMessageDisplayed(); + googleDocLogIn + .assertisGoogleDriveIconDisplayed(); + log.info("Click on document and Verify the document title"); + googleDocLogIn + .checkInGoogleDoc(testFile); + googleDocLogIn + .clickOkButton(); + myFilesPage + .isContentNameDisplayed(editedTitle); + log.info("Verify the document's content"); + myFilesPage + .clickOnFile(editedTitle); + documentDetailsPage + .assertFileContentContains(editedContent); + log.info("Delete file "); + documentDetailsPage + .clickDocumentActionsOption("Delete Document"); + + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesManageAspectsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesManageAspectsTests.java index adab4a19a2..1f1ffab347 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesManageAspectsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesManageAspectsTests.java @@ -1,81 +1,105 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.aspects.AspectsForm; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class MyFilesManageAspectsTests extends ContextAwareWebTest +@Slf4j +public class MyFilesManageAspectsTests extends BaseTest { //@Autowired private AspectsForm aspectsForm; + private NewFolderDialog newFolderDialog; //@Autowired private MyFilesPage myFilesPage; - private String userName = String.format("User%s", RandomData.getRandomAlphanumeric()); - private String folderName = String.format("testFolder%s", RandomData.getRandomAlphanumeric()); - private String path = "User Homes/" + userName; - - @BeforeClass (alwaysRun = true) - public void setupTest() + private String TestFolder = String.format("TestFolder%s", RandomData.getRandomAlphanumeric()); + private final ThreadLocal user = new ThreadLocal<>(); + @BeforeMethod(alwaysRun = true) + public void createPrecondition() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - contentService.createFolderInRepository(userName, password, folderName, path); - setupAuthenticatedSession(userName, password); + log.info("PreCondition 1: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + myFilesPage = new MyFilesPage(webDriver); + aspectsForm = new AspectsForm(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + + log.info("PreCondition 2: Creating a Folder"); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(TestFolder) + .typeTitle("TestTitle") + .typeDescription("TestDescription") + .clickSave(); + myFilesPage + .isContentNameDisplayed("TestFolder"); + } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C7814") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void checkManageAspectsForm() { - myFilesPage.navigate(); - LOG.info("Step1: Click 'More'->'Manage Aspects' action for created folder and verify the Manage Aspects form"); - myFilesPage.selectItemAction(folderName, ItemActions.MANAGE_ASPECTS); - Assert.assertTrue(aspectsForm.isAspectsFormTitleDisplayed(), "Aspects for the file form is not diplayed"); - Assert.assertTrue(aspectsForm.isAvailableToAddPanelDisplayed(), "Available to Add panel is not diaplyed"); - Assert.assertTrue(aspectsForm.isCurrentlySelectedPanel(), "Currently Selected panel is not diaplyed"); + log.info("Step1: Click 'More'->'Manage Aspects' action for created folder and verify the Manage Aspects form"); + myFilesPage + .select_ItemAction(TestFolder,ItemActions.MANAGE_ASPECTS); + + Assert.assertTrue(aspectsForm.isAspectsFormTitleDisplayed(), "Aspects for the file form is not displayed"); + Assert.assertTrue(aspectsForm.isAvailableToAddPanelDisplayed(), "Available to Add panel is not displayed"); + Assert.assertTrue(aspectsForm.isCurrentlySelectedPanel(), "Currently Selected panel is not displayed"); Assert.assertTrue(aspectsForm.areAddButtonsDisplayed(), "Add buttons are not displayed for all the available to add aspects"); Assert.assertTrue(aspectsForm.areRemoveButtonsDisplayed(), "Remove buttons are not displayed for all the selected aspects"); - Assert.assertTrue(aspectsForm.isSaveButtonDisplayed(), "Apply Chnages button is not displayed"); + Assert.assertTrue(aspectsForm.isSaveButtonDisplayed(), "Apply Changes button is not displayed"); Assert.assertTrue(aspectsForm.isCancelButtonDisplayed(), "Cancel button is not displayed"); Assert.assertTrue(aspectsForm.isCloseButtonDisplayed(), "Close button is not displayed"); } @TestRail (id = "C7810") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void manageAspectsApplyChanges() - { - myFilesPage.navigate(); - LOG.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); - myFilesPage.selectItemAction(folderName, ItemActions.MANAGE_ASPECTS); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void manageAspectsApplyChanges() { + log.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); + myFilesPage + .select_ItemAction(TestFolder,ItemActions.MANAGE_ASPECTS); - LOG.info("Step2: From 'Available to Add' list, click 'Add' icon next to an aspect and verify it's displayed in 'Currently Selected' list"); - aspectsForm.addAspect("Classifiable"); + log.info("Step2: From 'Available to Add' list, click 'Add' icon next to an aspect and verify it's displayed in 'Currently Selected' list"); + Assert.assertTrue(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); + aspectsForm + .addAspect("Classifiable"); Assert.assertTrue(aspectsForm.isAspectPresentOnCurrentlySelectedList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); - Assert.assertFalse(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is present on 'Available to Add' list"); - LOG.info("Step3: Click 'Apply Changes' and verify the aspect is added"); - aspectsForm.clickApplyChangesButton(); - myFilesPage.selectItemAction(folderName, ItemActions.MANAGE_ASPECTS); + log.info("Step3: Click 'Apply Changes' and verify the aspect is added"); + aspectsForm + .clickApplyChangesButton(); + myFilesPage + .selectItemAction("TestFolder", ItemActions.MANAGE_ASPECTS); Assert.assertTrue(aspectsForm.isAspectPresentOnCurrentlySelectedList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); - Assert.assertFalse(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is present on 'Available to Add' list"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesPageTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesPageTests.java index 9d0ac56745..754609509d 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesPageTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesPageTests.java @@ -1,68 +1,62 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; import java.util.List; - -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.pageCommon.DocumentsFilters; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.admin.SitesManagerPage; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static org.alfresco.common.Utils.testDataFolder; +@Slf4j /** * @author Razvan.Dorobantu */ -public class MyFilesPageTests extends ContextAwareWebTest +public class MyFilesPageTests extends BaseTest { - private final String user = String.format("C7659User%s", RandomData.getRandomAlphanumeric()); private final String nonAdminFile = String.format("nonAdminDoc%s", RandomData.getRandomAlphanumeric()); private final String adminFile = String.format("adminDoc%s", RandomData.getRandomAlphanumeric()); - private final String tag = String.format("testTag%s", RandomData.getRandomAlphanumeric()).toLowerCase(); - //@Autowired + private final String tag1 = String.format("testTag%s", RandomData.getRandomAlphanumeric()).toLowerCase(); private MyFilesPage myFilesPage; - //@Autowired private DocumentsFilters filters; - - @BeforeClass (alwaysRun = true) - public void setupTest() + private SitesManagerPage sitesManagerPage; + private final ThreadLocal user = new ThreadLocal<>(); + private UploadContent uploadContent; + private final String testFilePath1 = testDataFolder + nonAdminFile + "testFile.txt" ; + private final String testFilePath2 = testDataFolder + adminFile + "testFile.txt" ; + + @BeforeMethod(alwaysRun = true) + public void setup() { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - - LOG.info("Precondition: Admin uploads a file in My Files and adds a tag to it."); - contentService.createDocumentInRepository(adminUser, adminPassword, null, CMISUtil.DocumentType.TEXT_PLAIN, adminFile, "some content"); - contentAction.addSingleTag(adminUser, adminPassword, adminFile, tag); - - LOG.info("Precondition: User uploads a file in My Files and adds a tag to it."); - String userMyFiles = "User Homes/" + user; - contentService.createDocumentInRepository(user, password, userMyFiles, CMISUtil.DocumentType.TEXT_PLAIN, nonAdminFile, "some content"); - contentAction.addSingleTag(user, password, userMyFiles + "/" + nonAdminFile, tag); + filters = new DocumentsFilters(webDriver); + sitesManagerPage = new SitesManagerPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + filters = new DocumentsFilters(webDriver); } + @TestRail (id = "C7659") + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void verifyMyFilesMainPage() { - @AfterClass (alwaysRun = false) - public void cleanup() - { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - contentService.deleteContentByPath(adminUser, adminPassword, "/" + adminFile); + log.info("Precondition: Login as user"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(user.get()); + authenticateUsingCookies(user.get()); - } + log.info("Precondition: Navigate to MyFiles Page."); + myFilesPage + .navigate(); - @TestRail (id = "C7659") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void verifyMyFilesMainPage() - { - LOG.info("Precondition: Login as user and navigate to My Files page."); - setupAuthenticatedSession(user, password); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); + log.info("Step 1: Verify the items displayed on the left panel from the My Files page."); - LOG.info("Step 1: Verify the items displayed on the left panel from the My Files page."); Assert.assertTrue(filters.isDocumentsDropDownDisplayed(), "Documents link is not present"); Assert.assertTrue(filters.isallDocumentsFilterDisplayed(), "All documents filter is not displayed"); Assert.assertTrue(filters.isIMEditingFilterDisplayed(), "I'm editing filter is not present"); @@ -79,35 +73,62 @@ public void verifyMyFilesMainPage() @TestRail (id = "C7660") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void verifyMyFilesPageTags() - { - LOG.info("Step1: Login as admin and navigate to My Files page."); - setupAuthenticatedSession(adminUser, adminPassword); - myFilesPage.navigate(); + public void verifyMyFilesPageTags() { + + log.info("Precondition : Login as user and navigate to My Files page."); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(user.get()); + authenticateUsingCookies(user.get()); - LOG.info("Step2: Verify the list of tags in the tags section."); + log.info("Precondition: User uploads a file in My Files and adds a tag to it."); + myFilesPage.navigate(); + uploadContent.uploadContent(testFilePath1); + myFilesPage + .mouseOverNoTags(nonAdminFile); + myFilesPage + .clickEditTagIcon(nonAdminFile); + myFilesPage + .type_TagName("TestTag1"); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + + log.info("Step1: Verify the list of tags in the tags section."); List tags = myFilesPage.getAllTagNames(); - LOG.info("Tags: " + tags.toString()); - Assert.assertTrue(tags.contains(tag.toLowerCase()), String.format("Tag: %s is not found", tag)); - LOG.info("Step3: Click on the tag and verify the files are displayed."); - myFilesPage.clickOnTag(tag); - getBrowser().waitInSeconds(4); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(adminFile)); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(nonAdminFile)); + log.info("Tags: " + tags.toString()); + Assert.assertTrue(tags.contains("TestTag1".toLowerCase()), "TestTag is Not Present"); - LOG.info("Step4: Login as user and navigate to My Files page."); - setupAuthenticatedSession(user, password); - myFilesPage.navigate(); + log.info("Step2: Click on the tag and verify the Non Admin files are displayed & admin files are not Displayed."); + myFilesPage.clickOnTag("testtag1"); + Assert.assertTrue(myFilesPage.isFileNameDisplayed(nonAdminFile)); + Assert.assertFalse(myFilesPage.isFileNameDisplayed(adminFile)); - LOG.info("Step5: Verify the list of tags in the tags section."); + + log.info("PreCondition: Login as Admin User"); + authenticateUsingLoginPage(getAdminUser()); + + log.info("Precondition: Admin uploads a file in My Files and adds a tag to it."); + myFilesPage.navigate(); + uploadContent.uploadContent(testFilePath2); + myFilesPage + .mouseOverNoTags(adminFile); + myFilesPage + .clickEditTagIcon(adminFile); + myFilesPage + .type_TagName("TestTag1"); + + log.info("Step3: Verify the list of tags in the tags section."); tags = myFilesPage.getAllTagNames(); - Assert.assertTrue(tags.contains(tag.toLowerCase()), String.format("Tag: %s is not found", tag)); + log.info("Tags: " + tags.toString()); + Assert.assertTrue(tags.contains("TestTag1".toLowerCase()), "TestTag is Not Present"); - LOG.info("Step6: Click on the tag and verify the files are displayed."); - myFilesPage.clickOnTag(tag); - getBrowser().waitInSeconds(4); - Assert.assertFalse(myFilesPage.isContentNameDisplayed(adminFile)); + log.info("Step4: Click on the tag and verify both Admin & Non Admin files are displayed."); + myFilesPage.clickOnTag("testtag1"); + Assert.assertTrue(myFilesPage.isContentNameDisplayed(adminFile)); Assert.assertTrue(myFilesPage.isContentNameDisplayed(nonAdminFile)); + + deleteUsersIfNotNull(user.get()); + } -} +} \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesSelectContentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesSelectContentTests.java index 702ad0be2b..80c7f95bd4 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesSelectContentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesSelectContentTests.java @@ -1,96 +1,117 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; +import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import java.util.ArrayList; import java.util.Collections; -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.dataprep.ContentService; import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; + import org.testng.Assert; -import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - +@Slf4j /** * @author Razvan.Dorobantu */ -public class MyFilesSelectContentTests extends ContextAwareWebTest +public class MyFilesSelectContentTests extends BaseTest { - private final String testFile = String.format("testFile%s", RandomData.getRandomAlphanumeric()); + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; private final String folderName = String.format("testFolder%s", RandomData.getRandomAlphanumeric()); - private String user; private String myFilesPath; + protected ContentService contentService; //@Autowired private MyFilesPage myFilesPage; + private NewFolderDialog newFolderDialog; + private UploadContent uploadContent; //@Autowired private HeaderMenuBar headerMenuBar; - + private final ThreadLocal user = new ThreadLocal<>(); @BeforeMethod (alwaysRun = true) public void createUser() { - user = String.format("user%s", RandomData.getRandomAlphanumeric()); - myFilesPath = "User Homes/" + user; - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + myFilesPage = new MyFilesPage(webDriver); + headerMenuBar = new HeaderMenuBar(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C7682") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void selectFileByMenu() { - LOG.info("Precondition: Login as user, navigate to My Files page and upload a file."); - contentService.createDocumentInRepository(user, password, myFilesPath, CMISUtil.DocumentType.TEXT_PLAIN, testFile, "some content"); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - - LOG.info("STEP1: Click 'Select' button and choose 'Documents' option."); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("Documents"); + log.info("Precondition: Login as user, navigate to My Files page and upload a file."); + myFilesPage + .navigate(); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(testFile); + + log.info("STEP1: Click 'Select' button and choose 'Documents' option."); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Documents"); ArrayList expectedContentList1 = new ArrayList<>(Collections.singletonList(testFile)); assertEquals(myFilesPage.verifyContentItemsSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); assertTrue(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is disabled."); - LOG.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("Invert Selection"); + log.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Invert Selection"); assertEquals(myFilesPage.verifyContentItemsNotSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); Assert.assertFalse(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); - LOG.info("STEP3: Click 'Select' button and choose 'All'"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("All"); + log.info("STEP3: Click 'Select' button and choose 'All'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("All"); assertEquals(myFilesPage.verifyContentItemsSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); assertTrue(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is disabled."); - LOG.info("STEP4: Click 'Select' button and choose 'None'"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("None"); + log.info("STEP4: Click 'Select' button and choose 'None'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("None"); assertEquals(myFilesPage.verifyContentItemsNotSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); Assert.assertFalse(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); - LOG.info("STEP5: Click 'Select' button and choose 'Folders'"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("Folders"); + log.info("STEP5: Click 'Select' button and choose 'Folders'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Folders"); assertEquals(myFilesPage.verifyContentItemsNotSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); Assert.assertFalse(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); - LOG.info("STEP6: Click on document checkbox"); - myFilesPage.clickCheckBox(testFile); + log.info("STEP6: Click on document checkbox"); + myFilesPage + .clickCheckBox(testFile); assertEquals(myFilesPage.verifyContentItemsSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); assertTrue(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); } @@ -99,45 +120,58 @@ public void selectFileByMenu() @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void selectFolderByMenu() { - LOG.info("Precondition: Login as user, navigate to My Files page and create a folder."); - contentService.createFolderInRepository(user, password, folderName, myFilesPath); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - assertTrue(myFilesPage.isContentNameDisplayed(folderName), folderName + " displayed in My Files documents list."); - - LOG.info("STEP1: Click 'Select' button and choose 'Folders'"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("Folders"); + log.info("Precondition: Login as user, navigate to My Files page and create a folder."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderName) + .clickSave(); + myFilesPage + .assertIsContantNameDisplayed(folderName); + + log.info("STEP1: Click 'Select' button and choose 'Folders'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Folders"); ArrayList expectedContentList1 = new ArrayList<>(Collections.singletonList(folderName)); assertEquals(myFilesPage.verifyContentItemsSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); assertTrue(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is disabled."); - LOG.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("Invert Selection"); + log.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Invert Selection"); assertEquals(myFilesPage.verifyContentItemsNotSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); Assert.assertFalse(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); - LOG.info("STEP3: Click 'Select' button and choose 'All'"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("All"); + log.info("STEP3: Click 'Select' button and choose 'All'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("All"); assertEquals(myFilesPage.verifyContentItemsSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); assertTrue(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is disabled."); - LOG.info("STEP4: Click 'Select' button and choose 'None'"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("None"); + log.info("STEP4: Click 'Select' button and choose 'None'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("None"); assertEquals(myFilesPage.verifyContentItemsNotSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); Assert.assertFalse(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); - LOG.info("STEP5: Click 'Select' button and choose 'Documents' option."); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption("Documents"); + log.info("STEP5: Click 'Select' button and choose 'Documents' option."); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Documents"); assertEquals(myFilesPage.verifyContentItemsNotSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); Assert.assertFalse(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); - LOG.info("STEP6: Click on folder checkbox"); - myFilesPage.clickCheckBox(folderName); + log.info("STEP6: Click on folder checkbox"); + myFilesPage + .clickCheckBox(folderName); assertEquals(myFilesPage.verifyContentItemsSelected(expectedContentList1), expectedContentList1.toString(), "Selected content = "); assertTrue(headerMenuBar.isSelectedItemsMenuEnabled(), "'Selected Items...' menu is enabled."); } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesTests.java index 5a487edfa3..894233eefe 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesTests.java @@ -1,98 +1,153 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.site.DocumentLibraryPage.CreateMenuOption; import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.CreateUserPage; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.UsersPage; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class MyFilesTests extends ContextAwareWebTest +import static org.alfresco.common.Utils.testDataFolder; + +@Slf4j +public class MyFilesTests extends BaseTest { - private final String user = String.format("C7648TestUser%s", RandomData.getRandomAlphanumeric()); - private final String user1 = String.format("C7648TestUser1%s", RandomData.getRandomAlphanumeric()); + private final String user1 = String.format("C7648TestUser%s", RandomData.getRandomAlphanumeric()); + private final String user2 = String.format("C7648TestUser1%s", RandomData.getRandomAlphanumeric()); private final String siteName = String.format("C7658SiteName%s", RandomData.getRandomAlphanumeric()); - private final String description = String.format("C7658SiteDescription%s", RandomData.getRandomAlphanumeric()); + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; private final String C7648name = "C7648 name"; private final String C7648title = "C7648 title"; private final String C7648content = "C7648 content"; private final String C7648description = "C7648 description"; + private final String password = "password"; // @Autowired private MyFilesPage myFilesPage; + //@Autowired private CreateContentPage create; //@Autowired private UserDashboardPage userDashboard; //@Autowired private Toolbar toolbar; + private UploadContent uploadContent; + private CreateUserPage createUsers; + private UsersPage usersPage; + private final ThreadLocal user = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - siteService.create(user, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - userService.create(adminUser, adminPassword, user1, password, user1 + domain, user1, user1); - setupAuthenticatedSession(user, password); + toolbar = new Toolbar(webDriver); + userDashboard = new UserDashboardPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + create = new CreateContentPage(webDriver); + createUsers = new CreateUserPage(webDriver); + uploadContent = new UploadContent(webDriver); + usersPage = new UsersPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user.get()); + } + @TestRail (id = "C7648") + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void myFilesContentAvailability() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); + log.info("PreCondition: Two users are created, e.g: user1 and user2 "); + authenticateUsingLoginPage(getAdminUser()); + usersPage + .navigate() + .clickNewUserButton() + .setFirstName("TestUser1") + .setEmail("user1@test.com") + .setUsername(user1) + .setPassword(password) + .setVerifyPassword(password) + .clickCreateUserAndStartAnother(); - siteService.delete(adminUser, adminPassword, siteName); - } + createUsers + .setFirstName("TestUser2") + .setEmail("user2@test.com") + .setUsername(user2) + .setPassword(password) + .setVerifyPassword(password) + .clickCreate(); + log.info("PreCondition: Verify two users are created, e.g: user1 and user2 "); + usersPage + .searchUserWithRetry("TestUser") + .assertIsUsersCreated(user1) + .assertIsUsersCreated(user2); - @TestRail (id = "C7648") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void myFilesContentAvailability() - { - LOG.info("Step 1: While logged in with user create Plain Text document in My Files"); - myFilesPage.navigate(); - - myFilesPage.clickCreateButton(); - myFilesPage.clickCreateContentOption(CreateMenuOption.PLAIN_TEXT); - create.typeName(C7648name); - create.typeContent(C7648content); - create.typeTitle(C7648title); - create.typeDescription(C7648description); - create.clickCreate(); - myFilesPage.navigate(); - Assert.assertTrue(myFilesPage.isContentNameDisplayed(C7648name), "C7648 name is not displayed in My Files"); - userService.logout(); - - LOG.info("Step 2: Login with user1 and check that the file create by user is not visible in My Files"); - setupAuthenticatedSession(user1, password); - myFilesPage.navigate(); - Assert.assertFalse(myFilesPage.isContentNameDisplayed(C7648name), "C7648 name is displayed in My Files"); + log.info("Step 1: Login with user1 and create Plain Text document in MyFiles"); + UserModel testuser1 = new UserModel(user1, password); + authenticateUsingLoginPage(testuser1); + + myFilesPage + .navigate(); + myFilesPage + .click_CreateButton() + .click_CreateFromTemplateOption(CreateMenuOption.PLAIN_TEXT); + create + .typeName(C7648name) + .typeContent(C7648content) + .typeTitle(C7648title) + .typeDescription(C7648description) + .clickCreate(); + myFilesPage + .navigate(); + Assert.assertTrue(myFilesPage.isFileNameDisplayed(C7648name), "C7648 name is not displayed in My Files"); + + log.info("Step 2: Login with user2 and check that the file create by user1 is not visible in My Files"); + UserModel testuser2 = new UserModel(user2, password); + authenticateUsingLoginPage(testuser2); + + myFilesPage + .navigate(); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .navigate(); + Assert.assertFalse(myFilesPage.isFileNameDisplayed(C7648name),"C7648 name is displayed in My Files"); + + deleteUsersIfNotNull(testuser1); + deleteUsersIfNotNull(testuser2); } @TestRail (id = "C7658") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void verifyPresenceOfMyFilesInHeaderBar() - { - setupAuthenticatedSession(user, password); - userDashboard.navigate(siteName); + public void verifyPresenceOfMyFilesInHeaderBar() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); - LOG.info("Step 1: Check that the My Files link is available in the toolbar"); - toolbar.assertMyFilesIsDisplayed(); + log.info("Step 1: Check that the My Files link is available in the toolbar"); + userDashboard + .navigate(siteName); + toolbar + .assertMyFilesIsDisplayed(); - LOG.info("Step 2: Access the My Files via link in toolbar"); - toolbar.clickMyFiles(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files", "User is not redirected to the repository page"); + log.info("Step 2: Access the My Files via link in toolbar"); + toolbar + .clickMyFiles(); + myFilesPage + .assertBrowserPageTitleIs("Alfresco » My Files"); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUnzipContentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUnzipContentTests.java index a1a03bb86c..8f9240c2f1 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUnzipContentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUnzipContentTests.java @@ -2,37 +2,32 @@ import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Collections; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.organizingContent.CopyMoveUnzipToDialog; -import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j + /** * @author Razvan.Dorobantu */ -public class MyFilesUnzipContentTests extends ContextAwareWebTest +public class MyFilesUnzipContentTests extends BaseTest { - private final String user = String.format("user%s", RandomData.getRandomAlphanumeric()); private final String zipFile = "archiveC7816.zip"; private final String zipContent = "TestFileC7816"; private final String zipFilePath = testDataFolder + zipFile; - private final String acpFile = "archiveC7816.acp"; + private final String acpFile = "archiveC7817.acp"; private final String acpPath = testDataFolder + acpFile; //@Autowired private MyFilesPage myFilesPage; @@ -43,69 +38,94 @@ public class MyFilesUnzipContentTests extends ContextAwareWebTest //@Autowired private UploadContent uploadContent; //@Autowired - private SiteDashboardPage sitePage; + private final ThreadLocal user = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) - public void createUser() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - } - @AfterClass (alwaysRun = true) + + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + unzipToDialog = new CopyMoveUnzipToDialog(webDriver); + } + + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user.get()); } - @TestRail (id = "C7816") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void unzipZipArchiveToMyFiles() - { - LOG.info("Precondition: Login as user, navigate to My Files page and upload a zip archive."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - uploadContent.uploadContent(zipFilePath); - LOG.info("STEP1: Click archive name, e.g: testArchive"); - myFilesPage.clickOnFile(zipFile); - assertTrue(documentDetailsPage.getFileName().equals(zipFile), "Wrong file name!"); - LOG.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); - documentDetailsPage.clickDocumentActionsOption("Unzip to..."); - assertEquals(unzipToDialog.getDialogTitle(), "Unzip " + zipFile + " to...", "'Unzip to....' dialog is displayed"); - LOG.info("STEP3: Select option My Files from 'Destination' section"); - unzipToDialog.selectMyFilesDestination(); - ArrayList expectedDestinationPath = new ArrayList(Collections.singletonList("My Files")); - //assertEquals(unzipToDialog.getPathList(), expectedDestinationPath.toString(), "Destionation set to="); - LOG.info("STEP4: Click 'Unzip' button and navigate to My Files"); - unzipToDialog.clickUnzipButton(); - myFilesPage.navigate(); - assertTrue(myFilesPage.isContentNameDisplayed(zipContent), zipFile + "'s content is displayed, " + zipContent); - } + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void unzipZipArchiveToMyFiles() throws InterruptedException { + log.info("Precondition: Login as user, navigate to My Files page and upload a zip archive."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(zipFilePath); + log.info("STEP1: Click archive name, e.g: testArchive"); + myFilesPage + .clickOnFile(zipFile); + documentDetailsPage + .assertContentNameEquals(zipFile); + log.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); + documentDetailsPage + .clickDocumentActionsOption("Unzip to..."); + assertEquals(unzipToDialog + .getDialogTitle(), + "Unzip " + zipFile + " to...", "'Unzip to....' dialog is displayed"); + + log.info("STEP3: Select option My Files from 'Destination' section"); + unzipToDialog + .selectMyFilesDestination(); + log.info("STEP4: Click 'Unzip' button and navigate to My Files"); + unzipToDialog + .clickUnzipButton(); + myFilesPage + .navigate(); + myFilesPage + .assertIsContantNameDisplayed(zipContent); + } @TestRail (id = "C7817") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, enabled = false) public void unzipACPArchiveToMyFiles() { - LOG.info("Precondition: Login as user, navigate to My Files page and upload a zip archive."); - myFilesPage.navigate(); -// Assert.assertEquals(myFilesPage.getPageTitle(), "Alfresco » My Files"); - uploadContent.uploadContent(acpPath); - LOG.info("STEP1: Click archive name, e.g: testArchive"); - myFilesPage.clickOnFile(acpFile); - assertTrue(documentDetailsPage.getFileName().equals(acpFile), "Wrong file name!"); - LOG.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); - documentDetailsPage.clickDocumentActionsOption("Unzip to..."); - assertEquals(unzipToDialog.getDialogTitle(), "Unzip " + acpFile + " to...", "'Unzip to....' dialog is displayed"); - LOG.info("STEP3: Select option My Files from 'Destination' section"); - unzipToDialog.selectMyFilesDestination(); - ArrayList expectedDestinationPath = new ArrayList(Collections.singletonList("My Files")); - //assertEquals(unzipToDialog.getPathList(), expectedDestinationPath.toString(), "Destionation set to="); - LOG.info("STEP4: Click 'Unzip' button and navigate to My Files"); - unzipToDialog.clickUnzipButton(); - myFilesPage.navigate(); - assertTrue(myFilesPage.isContentNameDisplayed(acpFile.substring(0, acpFile.indexOf("."))), - "A folder with archive name is present in Documents list."); + log.info("Precondition: Login as user, navigate to My Files page and upload a zip archive."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(acpPath); + log.info("STEP1: Click archive name, e.g: testArchive"); + myFilesPage + .clickOnFile(acpFile); + documentDetailsPage + .assertContentNameEquals(acpFile); + System.out.println("exeuted step1"); + log.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); + documentDetailsPage + .clickDocumentActionsOption("Unzip to..."); + assertEquals(unzipToDialog + .getDialogTitle(), + "Unzip " + acpFile + " to...", "'Unzip to....' dialog is displayed"); + + log.info("STEP3: Select option My Files from 'Destination' section"); + unzipToDialog + .selectMyFilesDestination(); + log.info("STEP4: Click 'Unzip' button and navigate to My Files"); + unzipToDialog + .clickUnzipButton(); + myFilesPage + .navigate(); + myFilesPage + .assertIsContantNameDisplayed(zipContent); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUploadContentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUploadContentTests.java index dbd62bcb3e..a5aee3866b 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUploadContentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/myFiles/MyFilesUploadContentTests.java @@ -1,25 +1,27 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.myFiles; import static org.alfresco.common.Utils.testDataFolder; -import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j + /** * @author Razvan.Dorobantu */ -public class MyFilesUploadContentTests extends ContextAwareWebTest +public class MyFilesUploadContentTests extends BaseTest { //@Autowired private MyFilesPage myFilesPage; @@ -27,63 +29,82 @@ public class MyFilesUploadContentTests extends ContextAwareWebTest private DocumentDetailsPage documentDetailsPage; //@Autowired private UploadContent uploadContent; - - private String user = String.format("user%s", RandomData.getRandomAlphanumeric()); private String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; private String testFilePath = testDataFolder + testFile; + private final ThreadLocal user = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user.get()); } - - @TestRail (id = "C7651") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void myFilesUploadDocument() { - myFilesPage.navigate(); - LOG.info("STEP1: On the My Files page upload a file."); - uploadContent.uploadContent(testFilePath); - LOG.info("STEP2: Verify if the file is uploaded successfully."); - assertTrue(myFilesPage.isContentNameDisplayed(testFile), String.format("The file [%s] is not present", testFile)); + log.info("STEP1: On the My Files page upload a file."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(testFile); } // @Bug (id = "MNT-18059", status = Bug.Status.FIXED) @TestRail (id = "C7792") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void myFilesUpdateDocumentNewVersion() - { + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void myFilesUpdateDocumentNewVersion() throws InterruptedException { String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; String newVersionFile = RandomData.getRandomAlphanumeric() + "newVersionFile.txt"; String testFilePath = testDataFolder + testFile; String newVersionFilePath = testDataFolder + newVersionFile; - myFilesPage.navigate(); - uploadContent.uploadContent(testFilePath); - assertTrue(myFilesPage.isContentNameDisplayed(testFile), String.format("The file [%s] is not present", testFile)); - LOG.info("STEP1: Click on the file and check contents."); + myFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » My Files"); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(testFile); + log.info("STEP1: Click on the file and check contents."); myFilesPage.clickOnFile(testFile); - Assert.assertEquals(documentDetailsPage.getContentText(), "contents", String.format("Contents of %s are wrong.", testFile)); - LOG.info("STEP2: Navigate back to My Files page and click on upload new version for the file."); - myFilesPage.navigate(); - myFilesPage.selectItemAction(testFile, ItemActions.UPLOAD_NEW_VERSION); - LOG.info("STEP3: Update the file with major version."); - uploadContent.updateDocumentVersion(newVersionFilePath, "comments", UploadContent.Version.Major); - getBrowser().waitInSeconds(4); - assertTrue(myFilesPage.isContentNameDisplayed(newVersionFile), String.format("The file [%s] is not present", newVersionFile)); - Assert.assertFalse(myFilesPage.isContentNameDisplayed(testFile), String.format("The file [%s] is not present", testFile)); - LOG.info("STEP4: Click on the file and check the version and contents are updated."); - myFilesPage.clickOnFile(newVersionFile); - Assert.assertEquals(documentDetailsPage.getContentText(), "updated by upload new version", String.format("Contents of %s are wrong.", newVersionFile)); - Assert.assertEquals(documentDetailsPage.getFileVersion(), "2.0", String.format("Version of %s is wrong.", newVersionFile)); + documentDetailsPage + .assertFileContentEquals("contents"); + log.info("STEP2: Navigate back to My Files page and click on upload new version for the file."); + myFilesPage + .navigate(); + Thread.sleep(5000); + myFilesPage + .selectItemAction(testFile, ItemActions.UPLOAD_NEW_VERSION); + log.info("STEP3: Update the file with major version."); + uploadContent + .updateDocumentVersion(newVersionFilePath, + "comments", + UploadContent.Version.Major); + myFilesPage + .assertIsContantNameDisplayed(newVersionFile); + myFilesPage + .assertIsContentDeleted(testFile); + log.info("STEP4: Click on the file and check the version and contents are updated."); + myFilesPage + .clickOnFile(newVersionFile); + documentDetailsPage + .assertFileContentEquals("updated by upload new version"); + documentDetailsPage + .assertVerifyFileVersion("2.0"); } + } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsCreateTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsCreateTests.java index 0d31f84a4b..cd34b12d9f 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsCreateTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsCreateTests.java @@ -1,263 +1,304 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; +import static org.alfresco.share.TestUtils.FILE_CONTENT; -import org.alfresco.dataprep.CMISUtil.DocumentType; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.alfrescoContent.document.SocialFeatures; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.DocumentLibraryPage.CreateMenuOption; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.DocumentLibraryPage2; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.FolderModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ActionsCreateTests extends ContextAwareWebTest +@Slf4j +public class ActionsCreateTests extends BaseTest { private final String user = String.format("C8156User%s", RandomData.getRandomAlphanumeric()); - private final String description = String.format("C8156SiteDescription%s", RandomData.getRandomAlphanumeric()); - private final String siteName = String.format("C8156SiteName%s", RandomData.getRandomAlphanumeric()); - private final String path = "Data Dictionary/Node Templates"; - private final String docName = String.format("C8159template2%s", RandomData.getRandomAlphanumeric()); - private final String docContent = "C8159 template content"; - private final String pathFolderTemplate = "Data Dictionary/Space Templates"; - private final String folderName = String.format("C8158%s", RandomData.getRandomAlphanumeric()); + private final String userHomeFolderName = "User Homes"; //@Autowired - private CreateContentPage create; - //@Autowired - private RepositoryPage repository; + private NewFolderDialog createFolderFromTemplate; + private RepositoryPage repositoryPage; //@Autowired - private DocumentDetailsPage documentDetailsPage; + private DocumentDetailsPage documentDetails; + private MyFilesPage myFilesPage; //@Autowired - private NewFolderDialog createFolderFromTemplate; - - @BeforeClass (alwaysRun = true) - - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - siteService.create(user, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, docName, docContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, pathFolderTemplate); - setupAuthenticatedSession(user, password); + private NewFolderDialog newFolderDialog; + private UploadContent uploadContent; + private final String password = "password"; + private UserModel testUser1; + private DocumentLibraryPage2 documentLibraryPage; + private DocumentLibraryPage documentLibrary; + private final String templateContent = "template content"; + private final String folederNameC8158 = "Test Folder C8158"; + private final String foledeTitleC8158 = "Test Title C8158"; + private final String foledeDiscriptionC8158 = "C8158 FOlder Discription "; + private final String folderTemplateName = "Software Engineering Project"; + String fileTitleC8156 = "C8156 file title"; + String fileTitleC8161 = "C8161 file title"; + String fileDiscriptionC8156 = "C8156 file Discription"; + String fileDiscriptionC8161 = "C8161 file Discription"; + String fileTitleC8162 = "C8162 file title"; + String fileDiscriptionC8162 = "C8162 file Discription"; + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + createFolderFromTemplate = new NewFolderDialog(webDriver); + documentLibraryPage = new DocumentLibraryPage2(webDriver); + documentLibrary = new DocumentLibraryPage(webDriver); + documentDetails = new DocumentDetailsPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); } - - @AfterClass (alwaysRun = false) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + docName); - contentService.deleteContentByPath(adminUser, adminPassword, pathFolderTemplate + "/" + folderName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(testUser1); + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .select_ItemsAction(user, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } + @TestRail (id = "C8156") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void createPlainTextDocumentInRepository() { - // Preconditions - setupAuthenticatedSession(user, password); - repository.navigate(); - repository.clickFolderFromExplorerPanel("User Homes"); - repository.clickOnFolderName(user); - - LOG.info("Step 1: Click Create... button."); - repository.clickCreateButton(); - - LOG.info("Step 2: Click \"Plain Text...\" option."); - repository.clickCreateContentOption(CreateMenuOption.PLAIN_TEXT); -// Assert.assertEquals(create.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - create.typeName("C8156 name"); - create.typeContent("C8156 content"); - create.typeTitle("C8156 title"); - create.typeDescription("C8156 description"); - - LOG.info("Step 4: Click the Create button"); - create.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "Plain Text", "Mimetype property is not Plain Text"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getContentText(), "C8156 content", "\"C8156 content \" is not the content displayed in preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), "C8156 name", "\"C8156 name\" is not the file name for the file in preview"); + FileModel txtFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, FILE_CONTENT); + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + log.info("Click Create button -> click on plain text button and enter required details"); + documentLibraryPage + .clickCreate() + .clickTextPlain() + .assertCreateContentPageIsOpened() + .typeName(txtFile.getName()) + .typeTitle(fileTitleC8156) + .typeDescription(fileDiscriptionC8156) + .typeContent(txtFile.getContent()) + .clickCreate() + .assertDocumentTitleEquals(txtFile) + .assertFileContentEquals(FILE_CONTENT) + .assertPropertyValueEquals(language.translate("property.mimetype"), "Plain Text"); } + @TestRail (id = "C8161") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void createHTMLDocumentInRepository() { - // Preconditions - setupAuthenticatedSession(user, password); - repository.navigate(); - repository.clickFolderFromExplorerPanel("User Homes"); - repository.clickOnFolderName(user); - - LOG.info("Step 1: Click Create... button"); - repository.clickCreateButton(); - - LOG.info("Step 2: Click \"HTML...\" option."); - repository.clickCreateContentOption(CreateMenuOption.HTML); -// Assert.assertEquals(create.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - create.typeName("C8161 test name"); - create.sendInputForHTMLContent("C8161 test content"); - create.typeTitle("C8161 test title"); - create.typeDescription("C8161 test description"); - - LOG.info("Step 4: Click the Create button"); - create.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "HTML", "Mimetype property is not HTML"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), "C8161 test name", "\"C8161 test name\" is not the file name for the file in preview"); + FileModel htmlFile = FileModel.getRandomFileModel(FileType.HTML, FILE_CONTENT); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + log.info("Click Create button -> click on HTML button and enter required details"); + documentLibraryPage + .clickCreate() + .clickHtml() + .assertCreateContentPageIsOpened() + .typeName(htmlFile.getName()) + .sendInputForHTMLContent(FILE_CONTENT) + .typeTitle(fileTitleC8161) + .typeDescription(fileDiscriptionC8161) + .clickCreate() + .assertDocumentTitleEquals(htmlFile) + .assertFileContentEquals(FILE_CONTENT) + .assertPropertyValueEquals(language.translate("property.mimetype"), "HTML"); + } + @TestRail (id = "C8162") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void createXMLFile() { - // Preconditions - setupAuthenticatedSession(user, password); - repository.navigate(); - repository.clickFolderFromExplorerPanel("User Homes"); - repository.clickOnFolderName(user); - - LOG.info("Step 1: Click Create... button"); - repository.clickCreateButton(); - - LOG.info("Step 2: Click \"XML...\" option."); - repository.clickCreateContentOption(CreateMenuOption.XML); -// Assert.assertEquals(create.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - create.typeName("C8162 test name"); - create.typeContent("C8162 test content"); - create.typeTitle("C8162 test title"); - create.typeDescription("C8162 test description"); - - LOG.info("Step 4: Click the Create button"); - create.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "XML", "Mimetype property is not Plain Text"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getContentText().trim(), "C8162 test content", - "\"C8162 test content \" is not the content displayed in preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), "C8162 test name", "\"C8162 test name\" is not the file name for the file in preview"); + FileModel xmlFile = FileModel.getRandomFileModel(FileType.XML, FILE_CONTENT); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + log.info("Click Create button -> click on XML File button and enter required details"); + documentLibraryPage + .clickCreate() + .clickXml() + .assertCreateContentPageIsOpened() + .typeName(xmlFile.getName()) + .typeTitle(fileTitleC8162) + .typeDescription(fileDiscriptionC8162) + .typeContent(FILE_CONTENT) + .clickCreate() + .assertDocumentTitleEquals(xmlFile) + .assertFileContentEquals(FILE_CONTENT) + .assertPropertyValueEquals(language.translate("property.mimetype"), "XML"); + } @TestRail (id = "C8159") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void createDocumentFromTemplate() { - // Preconditions - setupAuthenticatedSession(user, password); - repository.navigate(); - repository.clickFolderFromExplorerPanel("User Homes"); - repository.clickOnFolderName(user); - - LOG.info("Step 1:Click 'Create' then click 'Create document from template'."); - repository.clickCreateButton(); - repository.clickCreateFromTemplateOption(CreateMenuOption.CREATE_DOC_FROM_TEMPLATE); - assertTrue(repository.isTemplateDisplayed(docName), "Template is not displayed"); - - LOG.info("Step 2: Select the template and check that the new file is created with the content from the template used"); - repository.clickOnTemplate(docName); - assertTrue(repository.isContentNameDisplayed(docName), "Newly created document is not displayed in Repository/UserHomes "); - repository.clickOnFile(docName); - Assert.assertEquals(documentDetailsPage.getContentText(), docContent); + authenticateUsingLoginPage(testUser1); + log.info("Precondition: To Create a Template File"); + FolderModel nodeTemplates = new FolderModel("Node Templates"); + nodeTemplates.setCmisLocation("/Data Dictionary/Node Templates"); + FileModel templateFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, templateContent); + getCmisApi().usingResource(nodeTemplates).createFile(templateFile); + + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + + log.info("STEP 1: Click 'Create' then 'Create file from template'."); + myFilesPage + .click_CreateButton() + .click_CreateFromTemplateOption(CreateMenuOption.CREATE_DOC_FROM_TEMPLATE) + .isTemplateDisplayed(templateFile.getName());; + + log.info("STEP 2: Select the template: 'templateFile'"); + myFilesPage + .create_FileFromTemplate(templateFile); + + log.info("STEP 3: Verify the File is Present in Repositry"); + myFilesPage + .assertIsContantNameDisplayed(templateFile.getName()); + + log.info("Delete the Template File'"); + getCmisApi().usingResource(templateFile).delete(); + } @TestRail (id = "C8158") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT}) public void createFolderFromTemplateInRepository() { - // Preconditions - setupAuthenticatedSession(user, password); - repository.navigate(); - repository.clickFolderFromExplorerPanel("User Homes"); - repository.clickOnFolderName(user); - - LOG.info("Step 1: Select the Create menu > Create folder from templates"); - repository.clickCreateButton(); - repository.clickCreateFromTemplateOption(CreateMenuOption.CREATE_FOLDER_FROM_TEMPLATE); - assertTrue(repository.isTemplateDisplayed(folderName), "Template is not displayed"); - - LOG.info("Step 2: Select the test template, provide title and description and check that the new folder is created"); - - repository.clickOnTemplate(folderName); - //assertTrue(createFolderFromTemplate.isCreateFolderFromTemplatePopupDisplayed()); - Assert.assertEquals(createFolderFromTemplate.getNameFieldValue(), folderName); - - LOG.info("Step 3: Provide data for Create Folder From Template Form"); - createFolderFromTemplate.fillInDetails(folderName, "C8158 Test Title", "C8158 Test Description"); - createFolderFromTemplate.clickSave(); - - assertTrue(repository.getFoldersList().contains(folderName), "Subfolder not found"); - assertTrue(repository.getExplorerPanelDocuments().contains(folderName), "Subfolder not found in Documents explorer panel"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage.click_FolderName(user); + + log.info(" Click 'Create' then 'Create folder from template'."); + myFilesPage + .click_CreateButton() + .click_CreateFromTemplateOption(CreateMenuOption.CREATE_FOLDER_FROM_TEMPLATE) + .isTemplateDisplayed("Software Engineering Project"); + + log.info("Select the template: 'Software Engineering Project'"); + myFilesPage + .clickOnTemplate(folderTemplateName); + createFolderFromTemplate + .assertIsNameFieldValueEquals(folderTemplateName); + + log.info("Insert data into input fields and save."); + createFolderFromTemplate + .fillInDetails(folederNameC8158, foledeTitleC8158, foledeDiscriptionC8158) + .clickSave(); + log.info("erify the Folder is Present in Repository."); + myFilesPage + .assertIsFolderPresentInList(folederNameC8158); } @TestRail (id = "C13745") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void checkThatUserWithoutAdminPermissionsCannotCreateInMainRepository() { - setupAuthenticatedSession(user, password); - repository.navigate(); - LOG.info("Step 1: Check the Create button."); - Assert.assertEquals(repository.getCreateButtonStatusDisabled(), "true", "The Create Button is not disabled"); - Assert.assertEquals(repository.getUploadButtonStatusDisabled(), "true", "The Upload Button is not disabled"); - - LOG.info("Step 2: Click the Create button"); - repository.clickCreateButtonWithoutWait(); - Assert.assertFalse(repository.isCreateContentMenuDisplayed(), "Create Content menu is displayed when the Create button is clicked"); - cleanupAuthenticatedSession(); + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + log.info("Step 1: Check the Create button."); + documentLibrary + .assertCreateButtonStatusDisabled() + .assertUploadButtonStatusDisabled(); + log.info("Step 2: Click the Create button"); + documentLibrary + .clickCreateButtonWithoutWait(); + documentLibrary + .assertCreateContentMenuIsNotDisplayed(); + } @TestRail (id = " C13746") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void checkThatTheCreateOptionIsAvailableForAdminInMainRepository() - { - setupAuthenticatedSession(adminUser, adminPassword); - repository.navigate(); - LOG.info("Step 1: Check the Create button."); - Assert.assertEquals(repository.getCreateButtonStatusDisabled(), null, "The Create Button is disabled"); - Assert.assertEquals(repository.getUploadButtonStatusDisabled(), null, "The Upload Button is disabled"); - - LOG.info("Step 2: Click the Create button"); - repository.clickCreateButtonWithoutWait(); - assertTrue(repository.isCreateContentMenuDisplayed(), "Create Content menu is not displayed when the Create button is clicked"); - cleanupAuthenticatedSession(); + public void checkThatTheCreateOptionIsAvailableForAdminInMainRepository() { + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + log.info(" Check the Create button."); + repositoryPage + .assertCreateButtonStatusEnabled() + .assertUploadButtonStatusEnabled(); + log.info("Click the Create button"); + documentLibraryPage + .clickCreate(); + repositoryPage + .assertCreateContentMenuIsDisplayed(); } @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void checkAllCreateAvailableActions() { - // Preconditions - setupAuthenticatedSession(user, password); - repository.navigate(); - repository.clickFolderFromExplorerPanel("User Homes"); - repository.clickOnFolderName(user); - - LOG.info("Step 1: Click Create... button"); - repository.clickCreateButton(); - assertTrue(repository.areCreateOptionsAvailable(), "Create menu options are not available"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + log.info("Step 1: Click Create... button"); + documentLibraryPage + .clickCreate(); + repositoryPage + .assertareCreateOptionsAvailable(); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDeleteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDeleteTests.java index 9a06727dae..f65ef81cc1 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDeleteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDeleteTests.java @@ -1,145 +1,202 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ActionsDeleteTests extends ContextAwareWebTest +@Slf4j +public class ActionsDeleteTests extends BaseTest { - private final String user = String.format("C8308TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileName = "0-C8308_file" + RandomData.getRandomAlphanumeric(); - private final String fileContent = "C8308 content"; - private final String path = "User Homes/" + user; - private final String folderName = "0-C8308_Folder" + RandomData.getRandomAlphanumeric(); - private final String fileNameC13749 = "0-Repo_file" + RandomData.getRandomAlphanumeric(); - private final String folderNameC13751 = "0-Repo_Folder" + RandomData.getRandomAlphanumeric(); - private final String path1 = "/"; - - //@Autowired private RepositoryPage repositoryPage; - //@Autowired private DeleteDialog deleteDialog; - - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileName, fileContent); - contentService.createDocumentInRepository(adminUser, adminPassword, path1, DocumentType.TEXT_PLAIN, fileNameC13749, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - contentService.createFolderInRepository(adminUser, adminPassword, folderNameC13751, path1); + private HeaderMenuBar headerMenuBar; + private UserModel testUser1; + private FileModel testFile; + private FileModel testFileC13749; + private FileModel testFileC13751; + private FolderModel testFolder; + private FolderModel testFolderC13749; + private FolderModel testFolderC13751; + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + + repositoryPage = new RepositoryPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + headerMenuBar = new HeaderMenuBar(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create a Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingUserHome(testUser1.getUsername()).createFolder(testFolder).assertThat().existsInRepo(); + + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingUserHome(testUser1.getUsername()).createFile(testFile).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - contentService.deleteTreeByPath(adminUser, adminPassword, folderNameC13751); - + deleteUsersIfNotNull(testUser1); } @TestRail (id = "C8308") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void deleteDocument() { - // Precondition - setupAuthenticatedSession(user, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileName), fileName + " is not available in Repository"); - - LOG.info("Step 1: Hover over the file you want to delete and press More, select Delete Document"); - repositoryPage.selectItemAction(fileName, ItemActions.DELETE_DOCUMENT); - assertEquals(deleteDialog.getMessage(), String.format(language.translate("documentLibrary.deleteDialogMessage"), fileName), "Delete dialog message= "); - assertTrue(deleteDialog.isDeleteButtonDisplayed(), "'Delete' button is not displayed."); - assertTrue(deleteDialog.isCancelButtonDisplayed(), "'Cancel' button is not displayed."); - - LOG.info("Step 2: Press \"Delete\""); - deleteDialog.confirmDeletion(); - repositoryPage.navigate(); - assertFalse(repositoryPage.isContentNameDisplayed(fileName), fileName + " is displayed."); - cleanupAuthenticatedSession(); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .click_FolderName("User Homes") + .clickOnFolderName(testUser1.getUsername()) + .assertFileIsDisplayed(testFile.getName()); + + log.info("Step 1: Hover over the file you want to delete and press More, select Delete Document"); + repositoryPage + .select_ItemsAction(testFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .assertConfirmDeleteMessageForContentEqualsTo(testFile.getName()) + .assertDeleteButtonIsDisplayed() + .assertCancelButtonIsDisplayed(); + + log.info("Step 2: Press \"Delete\""); + deleteDialog + .confirmDeletion(); + repositoryPage + .navigateByMenuBar() + .assertFileIsNotDisplayed(testFile.getName()); } @TestRail (id = "C8309") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void deleteFolder() { - //Precondition - setupAuthenticatedSession(user, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderName), folderName + " is not available in Repository"); - - LOG.info("Step 1: Hover over the folder you want to delete and press More, select Delete Folder"); - repositoryPage.selectItemAction(folderName, ItemActions.DELETE_FOLDER); - assertEquals(deleteDialog.getMessage(), String.format(language.translate("documentLibrary.deleteDialogMessage"), folderName), "Delete dialog message= "); - assertTrue(deleteDialog.isDeleteButtonDisplayed(), "'Delete' button is not displayed."); - assertTrue(deleteDialog.isCancelButtonDisplayed(), "'Cancel' button is not displayed."); - - LOG.info("Step 2: Press \"Delete\""); - deleteDialog.confirmDeletion(); - repositoryPage.navigate(); - assertFalse(repositoryPage.isContentNameDisplayed(folderName), folderName + " is displayed."); - cleanupAuthenticatedSession(); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .click_FolderName("User Homes") + .clickOnFolderName(testUser1.getUsername()) + .assertFileIsDisplayed(testFolder.getName()); + + log.info("Step 1: Hover over the file you want to delete and press More, select Delete Document"); + repositoryPage + .select_ItemsAction(testFolder.getName(), ItemActions.DELETE_FOLDER); + deleteDialog + .assertConfirmDeleteMessageForContentEqualsTo(testFolder.getName()) + .assertDeleteButtonIsDisplayed() + .assertCancelButtonIsDisplayed(); + + log.info("Step 2: Press \"Delete\""); + deleteDialog + .confirmDeletion(); + repositoryPage + .navigateByMenuBar() + .assertFileIsNotDisplayed(testFolder.getName()); } @TestRail (id = "C13749") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void nonAdminUserCanNotDeleteFileOrFolderFromTheMainRepository() - { - //Precondition - setupAuthenticatedSession(user, password); - repositoryPage.navigate(); + public void nonAdminUserCanNotDeleteFileOrFolderFromTheMainRepository() throws Exception { + + log.info("PreCondition: Any File & Folder is Created in Admin Repository "); + testFileC13749 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingRoot().createFile(testFileC13749).assertThat().existsInRepo(); - LOG.info("Step 1: Mouse over file name and check that the More and the Delete Document option is not available"); - repositoryPage.mouseOverContentItem(fileNameC13749); - Assert.assertFalse(repositoryPage.isMoreMenuDisplayed(fileNameC13749), "'More' menu displayed for " + fileNameC13749); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(fileNameC13749, ItemActions.DELETE_DOCUMENT)); + testFolderC13749 = FolderModel.getRandomFolderModel(); + getCmisApi().usingRoot().createFolder(testFolderC13749).assertThat().existsInRepo(); - LOG.info("Step 2: Mouse over folder name and check that the More and the Delete Folder option is not available"); - repositoryPage.mouseOverContentItem(folderNameC13751); - Assert.assertFalse(repositoryPage.isMoreMenuDisplayed(folderNameC13751), "'More' menu displayed for " + folderNameC13751); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(folderNameC13751, ItemActions.DELETE_FOLDER)); - cleanupAuthenticatedSession(); + log.info("PreCondition: User1 is logged into share & Navigate to Repository page "); + authenticateUsingLoginPage(testUser1); + repositoryPage.navigate(); + + log.info("Step 1: Mouse over file name and check that the More and the Delete Document option is not available"); + repositoryPage + .mouseOverContentItem(testFileC13749.getName()); + repositoryPage + .assertIsMoreMenuNotDisplayed(testFileC13749.getName()) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFileC13749.getName(),ItemActions.DELETE_DOCUMENT); + + log.info("Step 2: Mouse over folder name and check that the More and the Delete Folder option is not available"); + repositoryPage + .mouseOverContentItem(testFolderC13749.getName()); + repositoryPage + .assertIsMoreMenuNotDisplayed(testFolderC13749.getName()) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFolderC13749.getName(),ItemActions.DELETE_FOLDER); + + log.info("Delete the Created File & Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFileC13749.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + repositoryPage + .select_ItemsAction(testFolderC13749.getName(),ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C13751") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void adminUserCanDeleteFileOrFolderInMainRepository() - { - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigate(); + public void adminUserCanDeleteFileOrFolderInMainRepository() throws Exception { + + log.info("PreCondition: Any File & Folder is Created in Admin Repository "); + testFileC13751 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingRoot().createFile(testFileC13751).assertThat().existsInRepo(); - LOG.info("Step 1: Mouse over file name and check that the More and the Delete Document options are available"); - repositoryPage.mouseOverContentItem(fileNameC13749); - Assert.assertTrue(repositoryPage.isMoreMenuDisplayed(fileNameC13749), "'More' menu displayed for " + fileNameC13749); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC13749, ItemActions.DELETE_DOCUMENT)); + testFolderC13751 = FolderModel.getRandomFolderModel(); + getCmisApi().usingRoot().createFolder(testFolderC13751).assertThat().existsInRepo(); + + log.info("PreCondition: Admin is logged into share & Navigate to Repository page "); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage.navigate(); - LOG.info("Step 2: Mouse over folder name and check that the More and the Delete Folder options are available"); - repositoryPage.mouseOverContentItem(folderNameC13751); - Assert.assertTrue(repositoryPage.isMoreMenuDisplayed(folderNameC13751), "'More' menu displayed for " + folderNameC13751); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(folderNameC13751, ItemActions.DELETE_FOLDER)); - cleanupAuthenticatedSession(); + log.info("Step 1: Mouse over file name and check that the More and the Delete Document options are available"); + repositoryPage + .mouseOverContentItem(testFileC13751.getName()); + repositoryPage + .assertIsMoreMenuDisplayed(testFileC13751.getName()) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFileC13751.getName(),ItemActions.DELETE_DOCUMENT); + + log.info("Step 2: Mouse over folder name and check that the More and the Delete Folder options are available"); + repositoryPage + .mouseOverContentItem(testFolderC13751.getName()); + repositoryPage + .assertIsMoreMenuDisplayed(testFolderC13751.getName()) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFolderC13751.getName(),ItemActions.DELETE_FOLDER); + + log.info("Delete the Created File & Folder from Admin Page"); + repositoryPage + .navigateByMenuBar().select_ItemsAction(testFileC13751.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + repositoryPage + .select_ItemsAction(testFolderC13751.getName(),ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDownloadTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDownloadTests.java index 8d27e6cc3e..5bb4b91d3b 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDownloadTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsDownloadTests.java @@ -1,74 +1,114 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ActionsDownloadTests extends ContextAwareWebTest -{ - private final String user = String.format("C8240TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileNameC8240 = "C8240 file"; - private final String folderNameC8243 = "folderNameC8243"; - private final String fileContent = "test content"; - private final String path = "User Homes/" + user; +import java.io.File; - @Autowired +import static org.alfresco.common.Utils.isFileInDirectory; +import static org.alfresco.common.Utils.testDataFolder; + +@Slf4j +public class ActionsDownloadTests extends BaseTest +{ private RepositoryPage repositoryPage; + private DeleteDialog deleteDialog; + private HeaderMenuBar headerMenuBar; + private UserModel testUser1; + private FileModel testFile; + private FolderModel testFolder; + + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + + repositoryPage = new RepositoryPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + headerMenuBar = new HeaderMenuBar(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create a Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingUserHome(testUser1.getUsername()).createFolder(testFolder).assertThat().existsInRepo(); + + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingUserHome(testUser1.getUsername()).createFile(testFile).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8240, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderNameC8243, path); - - setupAuthenticatedSession(user, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(testUser1); } @TestRail (id = "C8240") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void downloadFileFromAlfresco() { - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8240), fileNameC8240 + " is not available in Repository"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .click_FolderName("User Homes") + .clickOnFolderName(testUser1.getUsername()) + .assertFileIsDisplayed(testFile.getName()); - LOG.info("Step 1: Mouse over file, click Download"); - repositoryPage.selectItemAction(fileNameC8240, ItemActions.DOWNLOAD); + log.info("Step 1: Mouse over file, click Download"); + repositoryPage.selectItemActionFormFirstThreeAvailableOptions(testFile.getName(),ItemActions.DOWNLOAD); repositoryPage.acceptAlertIfDisplayed(); - LOG.info("Step 2: Check the file was saved locally"); - Assert.assertTrue(isFileInDirectory(fileNameC8240, null), "The file was not found in the specified location"); + log.info("Step 2: Check the file was saved locally"); + Assert.assertTrue(isFileInDirectory(testFile.getName(), null), "The file was not found in the specified location"); + + log.info("Delete the downloaded file from the directory"); + File file = new File(testDataFolder + testFile.getName()); + file.delete(); + Assert.assertFalse(file.exists(), "File should not exist!"); } @TestRail (id = " C8243") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void downloadFolder() { - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderNameC8243), folderNameC8243 + " is not available in Repository"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .click_FolderName("User Homes") + .clickOnFolderName(testUser1.getUsername()) + .assertFileIsDisplayed(testFolder.getName()); - LOG.info("Step 1: Mouse over folder, click Download"); - repositoryPage.selectItemAction(folderNameC8243, ItemActions.DOWNLOAD_AS_ZIP); + log.info("Step 1: Mouse over folder, click Download"); + repositoryPage.selectItemActionFormFirstThreeAvailableOptions(testFolder.getName(),ItemActions.DOWNLOAD_AS_ZIP); repositoryPage.acceptAlertIfDisplayed(); - LOG.info("Step 2: Check the folder was saved locally"); - Assert.assertTrue(isFileInDirectory(folderNameC8243, ".zip"), "The folder was not found in the specified location"); + log.info("Step 2: Check the folder was saved locally"); + Assert.assertTrue(isFileInDirectory(testFolder.getName(), ".zip"), "The folder was not found in the specified location"); + + log.info("Delete the downloaded file from the directory"); + File file = new File(testDataFolder + testFolder.getName()); + file.delete(); + Assert.assertFalse(file.exists(), "File should not exist!"); } + } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsEditTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsEditTests.java index b8bc4aa4d5..2428a6a80a 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsEditTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsEditTests.java @@ -1,285 +1,316 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; -import org.alfresco.po.share.alfrescoContent.document.GoogleDocsCommon; +import org.alfresco.po.share.alfrescoContent.document.GoogleDocsLogIn; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.organizingContent.taggingAndCategorizingContent.SelectDialog; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditInAlfrescoPage; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.Collections; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; +import static org.alfresco.common.Utils.testDataFolder; -public class ActionsEditTests extends ContextAwareWebTest +@Slf4j +public class ActionsEditTests extends BaseTest { - //@Autowired - NewFolderDialog newContentDialog; //@Autowired private RepositoryPage repositoryPage; //@Autowired - private SiteDashboardPage sitePage; - //@Autowired - private DocumentDetailsPage detailsPage; + private DocumentDetailsPage documentDetailsPage; //@Autowired private EditPropertiesDialog editFilePropertiesDialog; - // @Autowired + // @Autowired private SelectDialog selectDialog; + private GoogleDocsLogIn googleDocLogIn; //@Autowired private EditInAlfrescoPage editInAlfrescoPage; + private String editedFileName = String.format("editedDocName%s", RandomData.getRandomAlphanumeric()) ; + private final String editedFolderName = String.format("editedFolderName%s", RandomData.getRandomAlphanumeric()); + private final String editedTitle = "editedTitle"; + private final String editedContent = "C7762 edited content in Alfresco"; + private final String editedDescription = "edited description in Alfresco"; + private final String tagName = String.format("editTag_%s", RandomData.getRandomAlphanumeric()); + private final String user = String.format("C8156User%s", RandomData.getRandomAlphanumeric()); + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private final String sharedFolderName = "Shared"; + private MyFilesPage myFilesPage; + //@Autowired + private NewFolderDialog newFolderDialog; + private UploadContent uploadContent; + private final String password = "password"; + private UserModel testUser1; + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + googleDocLogIn = new GoogleDocsLogIn(webDriver); + selectDialog = new SelectDialog(webDriver); + editFilePropertiesDialog = new EditPropertiesDialog(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + editInAlfrescoPage = new EditInAlfrescoPage(webDriver); - @Autowired - private GoogleDocsCommon docsCommon; - - - private String uniqueIdentifier; - private String folderName; - private String editedFolderName; - private String editedTitle; - private String editedDescription; - private String tagName; - private String editedFileName; - private String editFileUsr; - private String editFolderUsr; - private String editInAlfUsr; - private String editFileInGDUsr; - private String lName; - private String fName; - private String fileContent; - private String fileName; - private String editedContent; - private String editFilePath; - private String editFolderPath; - private String editInAlfrescoPath; - private String editFileInGDPath; - - @BeforeClass (alwaysRun = true) - public void setupTest() - - { - - uniqueIdentifier = RandomData.getRandomAlphanumeric(); - folderName = "testFolder" + uniqueIdentifier; - editedFolderName = "UpdatedFolderName" + uniqueIdentifier; - editedTitle = "Updated Title" + uniqueIdentifier; - editedDescription = "Updated Description"; - tagName = "tag" + uniqueIdentifier; - editedFileName = "EditedFileName" + uniqueIdentifier; - editFileUsr = "EditFileUsr" + uniqueIdentifier; - editFolderUsr = "EditFolderUsr" + uniqueIdentifier; - editInAlfUsr = "EditInAlfrescoUsr" + uniqueIdentifier; - editFileInGDUsr = "EditInGoogleDocsUsr" + uniqueIdentifier; - lName = "testLastName"; - fName = "testFirstName"; - fileContent = "Test Content"; - fileName = "testFile" + uniqueIdentifier; - editedFileName = "editedFileName" + uniqueIdentifier; - editFilePath = "User Homes/" + editFileUsr; - editFolderPath = "User Homes/" + editFolderUsr; - editInAlfrescoPath = "User Homes/" + editInAlfUsr; - editFileInGDPath = "User Homes/" + editFileInGDUsr; - editedContent = "edited test content"; - - userService.create(adminUser, adminPassword, editFileUsr, password, editFileUsr + domain, lName, fName); - userService.create(adminUser, adminPassword, editFolderUsr, password, editFolderUsr + domain, lName, fName); - userService.create(adminUser, adminPassword, editInAlfUsr, password, editInAlfUsr + domain, lName, fName); - userService.create(adminUser, adminPassword, editFileInGDUsr, password, editFileInGDUsr + domain, lName, fName); - contentService.createDocumentInRepository(editFileUsr, password, editFilePath, DocumentType.TEXT_PLAIN, fileName, fileContent); - contentService.createDocumentInRepository(editInAlfUsr, password, editInAlfrescoPath, DocumentType.TEXT_PLAIN, fileName, fileContent); - contentService.createDocumentInRepository(editFileInGDUsr, password, editFileInGDPath, DocumentType.MSWORD, fileName, fileContent); - contentService.createFolderInRepository(editFolderUsr, password, folderName, editFolderPath); } - - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, editFileUsr); - userService.delete(adminUser, adminPassword, editFolderUsr); - userService.delete(adminUser, adminPassword, editInAlfUsr); - userService.delete(adminUser, adminPassword, editFileInGDUsr); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + editFileUsr); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + editFolderUsr); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + editInAlfUsr); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + editFileInGDUsr); - + deleteUsersIfNotNull(testUser1); } + @TestRail (id = "C7737") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void repositoryEditFilesProperties() { - LOG.info("Precondition: Login to share and navigate to Repository->User Homes->Test User page "); - setupAuthenticatedSession(editFileUsr, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(editFileUsr); - - LOG.info("Step 1: Hover over the test file and click 'Edit Properties' action"); - repositoryPage.selectItemAction(fileName, ItemActions.EDIT_PROPERTIES); - - //Assert.assertTrue(editFilePropertiesDialog.verifyAllElementsAreDisplayed(), "'Edit Properties' dialog box is not correctly displayed"); - - LOG.info("Step 2: In the 'Name' field enter a valid name"); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isContentNameDisplayed(testFile); + log.info("Step 1: Hover over the test file and click 'Edit Properties' action"); + repositoryPage + .selectItemActionFormFirstThreeAvailableOptions(testFile, ItemActions.EDIT_PROPERTIES); + editFilePropertiesDialog + .assertVerifyEditPropertiesElementsAreDisplayed(); + + log.info("Step 2: In the 'Name' field enter a valid name"); editFilePropertiesDialog.setName(editedFileName); - LOG.info("Step 3: In the 'Title' field enter a valid title"); + log.info("Step 3: In the 'Title' field enter a valid title"); editFilePropertiesDialog.setTitle(editedTitle); - LOG.info("Step 4: In the 'Description' field enter a valid description"); + log.info("Step 4: In the 'Description' field enter a valid description"); editFilePropertiesDialog.setDescription(editedDescription); - LOG.info("Step 5: Click the 'Select' button in the tags section"); + log.info("Step 5: Click the 'Select' button in the tags section"); editFilePropertiesDialog.clickSelectTags(); - LOG.info("Step 6: Type a tag name and click create"); + log.info("Step 6: Type a tag name and click create"); selectDialog.typeTag(tagName); selectDialog.clickCreateNewIcon(); selectDialog.clickOk(); editFilePropertiesDialog.isTagSelected(tagName.toLowerCase()); - LOG.info("Step 7: Click 'Save' And verify that document details have been updated"); + log.info("Step 7: Click 'Save' And verify that document details have been updated"); editFilePropertiesDialog.clickSave(); - assertTrue(repositoryPage.isContentNameDisplayed(editedFileName), editedFileName + " is displayed."); - assertEquals(repositoryPage.getItemTitle(editedFileName), "(" + editedTitle + ")", editedFileName + " - document's title="); - assertEquals(repositoryPage.getItemDescription(editedFileName), editedDescription, editedFileName + "- document's description="); - assertEquals(repositoryPage.getTags(editedFileName), Collections.singletonList(tagName.toLowerCase()).toString(), editedFileName + "- document's tag="); + log.info("Step 8: verify that document details have been updated"); + repositoryPage + .assertIsContantNameDisplayed(editedFileName); + repositoryPage + .assertItemTitleEquals(editedFileName,editedTitle); + repositoryPage + .assertItemDescriptionEquals(editedFileName,editedDescription); + repositoryPage + .assertTagNamesDisplayed(editedFileName,Collections.singletonList(tagName.toLowerCase()).toString(),editedFileName); + repositoryPage + .select_ItemsAction(editedFileName, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C7745") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void repositoryEditFolderProperties() { - LOG.info("Precondition: Login to Share and navigate to Repository->User Homes->Test User page"); - setupAuthenticatedSession(editFolderUsr, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(editFolderUsr); - - LOG.info("Step 1: Hover over folder and click 'Edit Properties'"); - repositoryPage.selectItemAction(folderName, ItemActions.EDIT_PROPERTIES); - //assertTrue(editFilePropertiesDialog.verifyAllElementsAreDisplayed(), "Some elements of the 'Edit Properties' dialog are not displayed"); - - LOG.info("Step 2: In the 'Name' field enter a valid name"); - editFilePropertiesDialog.setName(editedFolderName); - - LOG.info("Step 3: In the 'Title' field enter a valid title"); - editFilePropertiesDialog.setTitle(editedTitle); - - LOG.info("Step 4: In the 'Description' field enter a valid description"); - editFilePropertiesDialog.setDescription(editedDescription); + log.info("Precondition: Login to share and navigate to Repository->Shared and create a folder "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName("TestFolder") + .typeTitle("TestTitle") + .typeDescription("TestDescription") + .clickSave(); + myFilesPage + .isContentNameDisplayed("TestFolder"); + + log.info(" Hover over a folder and click 'Edit Properties'"); + myFilesPage + .selectItemActionFormFirstThreeAvailableOptions("TestFolder", ItemActions.EDIT_PROPERTIES); + editFilePropertiesDialog + .assertVerifyEditPropertiesElementsAreDisplayed(); + log.info(" In the 'Name' field enter a valid name"); + editFilePropertiesDialog + .setName(editedFolderName); + log.info(" In the 'Title' field enter a valid title"); + editFilePropertiesDialog + .setTitle(editedTitle); + log.info(" In the 'Description' field enter a valid description"); + editFilePropertiesDialog + .setDescription(editedDescription); + log.info(" Click the 'Select' button in the tags section"); + editFilePropertiesDialog + .clickSelectTags(); + log.info(" Type a tag name and click create"); + selectDialog + .typeTag(tagName) + .clickCreateNewIcon() + .clickOk(); + + log.info(" Click 'Save' And verify that document details have been updated"); + editFilePropertiesDialog + .clickSave(); + log.info(" Verify the new title for the document"); + repositoryPage + .assertIsContantNameDisplayed(editedFolderName); + + repositoryPage + .assertItemTitleEquals(editedFolderName,editedTitle); + repositoryPage + .assertItemDescriptionEquals(editedFolderName,editedDescription); + repositoryPage + .assertTagNamesDisplayed(editedFolderName,Collections.singletonList(tagName.toLowerCase()).toString(),editedFolderName); + + repositoryPage + .select_ItemsAction(editedFolderName, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); - LOG.info("Step 5: Click the 'Select' button in the tags section"); - editFilePropertiesDialog.clickSelectTags(); - - LOG.info("Step 6: Type a tag name and click create"); - selectDialog.typeTag(tagName); - selectDialog.clickCreateNewIcon(); - selectDialog.clickOk(); - editFilePropertiesDialog.isTagSelected(tagName.toLowerCase()); - - LOG.info("Step 7: Click 'Save' And verify that document details have been updated"); - editFilePropertiesDialog.clickSave(); - assertTrue(repositoryPage.isContentNameDisplayed(editedFolderName), editedFolderName + " is displayed."); - assertEquals(repositoryPage.getItemTitle(editedFolderName), "(" + editedTitle + ")", editedFolderName + " - document's title="); - assertEquals(repositoryPage.getItemDescription(editedFolderName), editedDescription, editedFolderName + "- document's description="); - assertEquals(repositoryPage.getTags(editedFolderName), Collections.singletonList(tagName.toLowerCase()).toString(), editedFolderName + "- document's tag="); - - getBrowser().cleanUpAuthenticatedSession(); } @TestRail (id = "C7767") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void repositoryEditFileInAlfresco() { - LOG.info("Precondition: Precondition: Login to Share and navigate to Repository->User Homes->Test User page"); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isContentNameDisplayed(testFile); + + + log.info("Hover over the test file and click Edit in Alfresco option"); + myFilesPage + .select_ItemAction(testFile, ItemActions.EDIT_IN_ALFRESCO); + + log.info(" Edit the document's properties by sending new input"); + editInAlfrescoPage + .typeName(editedFileName) + .typeContent(editedContent) + .typeTitle(editedTitle) + .typeDescription(editedDescription); + + log.info(" Click Save button"); + editInAlfrescoPage + .clickSaveButton(); + + log.info(" Verify the new title for the document"); + myFilesPage + .assertIsContantNameDisplayed(editedFileName); + + log.info(" Click on document title to open the document's details page"); + myFilesPage + .clickOnFile(editedFileName); + + log.info(" Verify the document's content"); + documentDetailsPage + .assertFileContentEquals(editedContent); + + log.info(" Verify Title and Description fields"); + documentDetailsPage + .assertContentTittleEquals(editedTitle) + .assert_ContentDescriptionEquals(editedDescription); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .select_ItemsAction(editedFileName, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); - setupAuthenticatedSession(editInAlfUsr, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(editInAlfUsr); - - LOG.info("Step1: Hover over the test file and click Edit in Alfresco option"); - repositoryPage.selectItemAction(fileName, ItemActions.EDIT_IN_ALFRESCO); - - LOG.info("Step2: Edit the document's properties by sending new input"); - editInAlfrescoPage.enterDocumentDetails(editedFileName, editedContent, editedTitle, editedDescription); - - LOG.info("Step3: Click Save button"); - editInAlfrescoPage.clickButton("Save"); - - LOG.info("Step4: Verify the new title for the document"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(editedFileName), "Document name is not updated"); - - LOG.info("Step5: Click on document title to open the document's details page"); - repositoryPage.clickOnFile(editedFileName); - - LOG.info("Step6: Verify the document's content"); - Assert.assertEquals(detailsPage.getContentText(), editedContent); - - LOG.info("Step7: Verify Title and Description fields"); - //Assert.assertTrue(documentCommon.isPropertyValueDisplayed(editedTitle), "Updated title is not displayed"); - //Assert.assertTrue(documentCommon.isPropertyValueDisplayed(editedDescription), "Updated description is not displayed"); - - cleanupAuthenticatedSession(); } @TestRail (id = "C7782") @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) - public void repositoryEditFilesInGoogleDocs() throws Exception + public void repositoryEditFilesInGoogleDocs() { - LOG.info("Precondition: Precondition: Login to Share and navigate to Repository->User Homes->Test User page"); - setupAuthenticatedSession(editFileInGDUsr, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(editFileInGDUsr); - docsCommon.loginToGoogleDocs(); - - LOG.info("Step1: Hover over the test file and click Edit in Google Docs option"); - repositoryPage.selectItemAction(fileName, ItemActions.EDIT_IN_GOOGLE_DOCS); - - LOG.info("Step2: Click OK on the Authorize with Google Docs pop-up message"); - docsCommon.clickOkButton(); - - LOG.info("Step3,4: Provide edited input to Google Docs file and close Google Docs tab"); - docsCommon.confirmFormatUpgrade(); - getBrowser().waitInSeconds(7); - docsCommon.switchToGoogleDocsWindowandAndEditContent(editedTitle, editedContent); - - LOG.info("Step5: Verify the file is locked and Google Drive icon is displayed"); - Assert.assertTrue(docsCommon.isLockedIconDisplayed(), "Locked Icon is not displayed"); - Assert.assertTrue(docsCommon.isLockedDocumentMessageDisplayed(), "Message about the file being locked is not displayed"); - Assert.assertTrue(docsCommon.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - - LOG.info("Step6: Click Check In Google Doc™ and verify Version Information pop-up is displayed"); - docsCommon.checkInGoogleDoc(fileName); - Assert.assertEquals(docsCommon.isVersionInformationPopupDisplayed(), true); - - LOG.info("Step7: Click OK button on Version Information and verify the pop-up is closed"); - docsCommon.clickOkButton(); - getBrowser().waitInSeconds(5); - Assert.assertEquals(docsCommon.isVersionInformationPopupDisplayed(), false); - - LOG.info("Step8: Verify the title for the document is changed"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(editedTitle), "Name of the document was not updated"); - - LOG.info("Steps9, 10: Click on the document title and verify it's preview"); - repositoryPage.clickOnFile(editedTitle); - Assert.assertTrue(detailsPage.getContentText().contains(editedContent)); - - cleanupAuthenticatedSession(); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isContentNameDisplayed(testFile); + log.info(" LogIn to googledoc Authentication"); + googleDocLogIn + .loginToGoogleDocs(); + log.info("Hover over the test file and click Edit in Google Docs option"); + myFilesPage + .select_ItemAction("testFile", ItemActions.EDIT_IN_GOOGLE_DOCS); + googleDocLogIn + .clickOkButton(); + log.info(" Navigate to Google Doc tab and edit title , Content "); + googleDocLogIn + .switchToGoogleDocsWindowandAndEditContent(editedTitle, editedContent); + log.info(" Verify the file is locked and Google Drive icon is displayed"); + googleDocLogIn + .assertisLockedIconDisplayed(); + googleDocLogIn + .assertisLockedDocumentMessageDisplayed(); + googleDocLogIn + .assertisGoogleDriveIconDisplayed(); + log.info("Click on document and Verify the document title"); + googleDocLogIn + .checkInGoogleDoc(testFile); + googleDocLogIn + .clickOkButton(); + myFilesPage + .isContentNameDisplayed(editedTitle); + log.info("Verify the document's content"); + myFilesPage + .clickOnFile(editedTitle); + documentDetailsPage + .assertFileContentContains(editedContent); + log.info("Delete file "); + documentDetailsPage + .clickOpenedFloder(); + repositoryPage + .select_ItemsAction(editedTitle, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManageAspectsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManageAspectsTests.java index d6e8217384..e406b6b588 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManageAspectsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManageAspectsTests.java @@ -1,128 +1,149 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.aspects.AspectsForm; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FolderModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ActionsManageAspectsTests extends ContextAwareWebTest +@Slf4j +public class ActionsManageAspectsTests extends BaseTest { - //Autowired private RepositoryPage repositoryPage; - - //@Autowired + private DeleteDialog deleteDialog; + private UserModel testUser1; + private FolderModel testFolder; + private FolderModel testFolderC13763; + private FolderModel testFolderC13764; private AspectsForm aspectsForm; + private static final String classifiableAspect = "Classifiable"; - private String nonAdminUser; - private String folderInRepoUserHomes; - private String folderInRepoMainPath; - private String repositoryUserHomesPath; + private final ThreadLocal user = new ThreadLocal<>(); + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + aspectsForm = new AspectsForm(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create a Folder in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingUserHome(testUser1.getUsername()).createFolder(testFolder).assertThat().existsInRepo(); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - nonAdminUser = String.format("nonAdminUser%s", RandomData.getRandomAlphanumeric()); - folderInRepoMainPath = String.format("testFolderInRepoMainPath%s", RandomData.getRandomAlphanumeric()); - folderInRepoUserHomes = String.format("folderInRepoUserHomes%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, nonAdminUser, password, nonAdminUser + domain, nonAdminUser, nonAdminUser); - contentService.createFolderInRepository(adminUser, adminPassword, folderInRepoMainPath, "/"); - contentService.createFolderInRepository(nonAdminUser, password, folderInRepoUserHomes, "User Homes/" + nonAdminUser); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, nonAdminUser); - contentService.deleteTreeByPath(adminUser, adminPassword, folderInRepoMainPath); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + nonAdminUser); - + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C8254") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void checkAspectsForm() { - setupAuthenticatedSession(nonAdminUser, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(nonAdminUser); - - LOG.info("Step1: Click 'More'->'Manage Aspects' action for created folder and verify the Manage Aspects form"); - repositoryPage.selectItemAction(folderInRepoUserHomes, ItemActions.MANAGE_ASPECTS); - Assert.assertTrue(aspectsForm.isAspectsFormTitleDisplayed(), "Aspects for the file form is not diplayed"); - Assert.assertTrue(aspectsForm.isAvailableToAddPanelDisplayed(), "Available to Add panel is not diaplyed"); - Assert.assertTrue(aspectsForm.isCurrentlySelectedPanel(), "Currently Selected panel is not diaplyed"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .click_FolderName("User Homes") + .clickOnFolderName(testUser1.getUsername()) + .assertFileIsDisplayed(testFolder.getName()); + + log.info("Step1: Click 'More'->'Manage Aspects' action for created folder and verify the Manage Aspects form"); + repositoryPage + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_ASPECTS); + Assert.assertTrue(aspectsForm.isAspectsFormTitleDisplayed(), "Aspects for the file form is not displayed"); + Assert.assertTrue(aspectsForm.isAvailableToAddPanelDisplayed(), "Available to Add panel is not displayed"); + Assert.assertTrue(aspectsForm.isCurrentlySelectedPanel(), "Currently Selected panel is not displayed"); Assert.assertTrue(aspectsForm.areAddButtonsDisplayed(), "Add buttons are not displayed for all the available to add aspects"); Assert.assertTrue(aspectsForm.areRemoveButtonsDisplayed(), "Remove buttons are not displayed for all the selected aspects"); - Assert.assertTrue(aspectsForm.isSaveButtonDisplayed(), "Apply Chnages button is not displayed"); + Assert.assertTrue(aspectsForm.isSaveButtonDisplayed(), "Apply Changes button is not displayed"); Assert.assertTrue(aspectsForm.isCancelButtonDisplayed(), "Cancel button is not displayed"); Assert.assertTrue(aspectsForm.isCloseButtonDisplayed(), "Close button is not displayed"); - - cleanupAuthenticatedSession(); } @TestRail (id = "C8250") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void manageAspectsApplyChanges() { - setupAuthenticatedSession(nonAdminUser, password); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(nonAdminUser); - - LOG.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); - repositoryPage.selectItemAction(folderInRepoUserHomes, ItemActions.MANAGE_ASPECTS); - - LOG.info("Step2: From 'Available to Add' list, click 'Add' icon next to an aspect and verify it's displayed in 'Currently Selected' list"); - aspectsForm.addAspect("Classifiable"); - Assert.assertTrue(aspectsForm.isAspectPresentOnCurrentlySelectedList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); - Assert.assertFalse(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is present on 'Available to Add' list"); - - LOG.info("Step3: Click 'Apply Changes' and verify the aspect is added"); - aspectsForm.clickApplyChangesButton(); - repositoryPage.selectItemAction(folderInRepoUserHomes, ItemActions.MANAGE_ASPECTS); - Assert.assertTrue(aspectsForm.isAspectPresentOnCurrentlySelectedList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); - Assert.assertFalse(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is present on 'Available to Add' list"); - - cleanupAuthenticatedSession(); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .click_FolderName("User Homes") + .clickOnFolderName(testUser1.getUsername()); + + log.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); + repositoryPage + .selectItemAction(testFolder.getName(), ItemActions.MANAGE_ASPECTS); + + log.info("Step2: From 'Available to Add' list, click 'Add' icon next to an aspect and verify it's displayed in 'Currently Selected' list"); + aspectsForm + .assertAspactPresentInAvailableList(classifiableAspect) + .addAspect(classifiableAspect); + aspectsForm + .assertAspactPresentInCurrentlySelectedList(classifiableAspect); + + log.info("Step3: Click 'Apply Changes' and verify the aspect is added"); + aspectsForm + .clickApplyChangesButton(); + repositoryPage + .selectItemAction(testFolder.getName(), ItemActions.MANAGE_ASPECTS); + aspectsForm + .assertAspactPresentInCurrentlySelectedList(classifiableAspect); } @TestRail (id = "C13763") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void manageAspectsForNonAdminOnRepositoryMainFolder() - { - setupAuthenticatedSession(nonAdminUser, password); - repositoryPage.navigate(); - LOG.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); - repositoryPage.mouseOverContentItem(folderInRepoMainPath); - Assert.assertEquals(repositoryPage.isMoreMenuDisplayed(folderInRepoMainPath), false); - Assert.assertEquals(repositoryPage.isActionAvailableForLibraryItem(folderInRepoMainPath, ItemActions.MANAGE_ASPECTS), false); - - cleanupAuthenticatedSession(); + public void manageAspectsForNonAdminOnRepositoryMainFolder() throws Exception { + + log.info("PreCondition: Create a Folder in Repository & Login with Non Admin User - Navigate to Repository Page"); + testFolderC13763 = FolderModel.getRandomFolderModel(); + getCmisApi().usingRoot().createFolder(testFolderC13763).assertThat().existsInRepo(); + + authenticateUsingLoginPage(testUser1); + repositoryPage.navigateByMenuBar(); + + log.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); + repositoryPage + .mouseOverContentItem(testFolderC13763.getName()); + repositoryPage + .assertIsMoreMenuNotDisplayed(testFolderC13763.getName()) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFolderC13763.getName(),ItemActions.MANAGE_ASPECTS); } @TestRail (id = "C13764") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void manageAspectsAdminOnRepositoryMainFolder() - { - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigate(); - - LOG.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); - Assert.assertTrue(repositoryPage.getFoldersList().contains(folderInRepoMainPath), "Folder is not displayed!"); - - repositoryPage.mouseOverContentItem(folderInRepoMainPath); - Assert.assertTrue(repositoryPage.isMoreMenuDisplayed(folderInRepoMainPath), "More menu is not displayed"); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(folderInRepoMainPath, ItemActions.MANAGE_ASPECTS), "'Manage Aspects' action is not available."); + public void manageAspectsAdminOnRepositoryMainFolder() throws Exception { + + log.info("PreCondition: Admin Create a Folder in Repository & Navigate to Repository Page"); + testFolderC13764 = FolderModel.getRandomFolderModel(); + getCmisApi().usingRoot().createFolder(testFolderC13764).assertThat().existsInRepo(); + repositoryPage.navigateByMenuBar(); + + log.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); + repositoryPage + .assertFileIsDisplayed(testFolderC13764.getName()); + repositoryPage + .mouseOverContentItem(testFolderC13764.getName()); + repositoryPage + .assertIsMoreMenuDisplayed(testFolderC13764.getName()) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFolderC13764.getName(), ItemActions.MANAGE_ASPECTS); - cleanupAuthenticatedSession(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManagePermissionsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManagePermissionsTests.java index df361bde5a..c7e5957d4a 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManagePermissionsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsManagePermissionsTests.java @@ -1,213 +1,269 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import static org.alfresco.common.Utils.testDataFolder; +import static org.alfresco.common.Utils.srcRoot; -import java.util.Arrays; -import java.util.List; +import java.io.File; -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditInAlfrescoPage; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.ManagePermissionsPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FolderModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * Created by Mirela Tifui on 3/20/2017. */ -public class ActionsManagePermissionsTests extends ContextAwareWebTest +public class ActionsManagePermissionsTests extends BaseTest { - //@Autowired RepositoryPage repositoryPage; - - //@Autowired ManagePermissionsPage managePermissionsPage; - - //@Autowired + UploadContent uploadContent; EditInAlfrescoPage editInAlfrescoPage; - - //@Autowired DocumentDetailsPage documentDetailsPage; + DeleteDialog deleteDialog; + private CreateContentPage createContentPage; + private NewFolderDialog newFolderDialog; + private String testDataFolder = srcRoot + "testdata" + File.separator; + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private String subFolder = "Subfolder" + RandomData.getRandomAlphanumeric(); + private UserModel testUser1; + private UserModel testUser2; + private FolderModel testFolder; - private String userName = String.format("0_0C202757User%s", RandomData.getRandomAlphanumeric()); - private String userC202758_1 = String.format("C202758_1%s", RandomData.getRandomAlphanumeric()); - private String userC202758_2 = String.format("C202758_2%s", RandomData.getRandomAlphanumeric()); - private String fname1 = "FirstN1"; - private String lname1 = "LastN1"; - private String fname2 = "FirstN2"; - private String lname2 = "LastN2"; - private String path = "/"; - private String folderName = String.format("C202758Folder%s", RandomData.getRandomAlphanumeric()); - private String pathC202758 = folderName; - private String file = "Manage_permissions_test_file"; - private String userC202776 = "C202759_1" + RandomData.getRandomAlphanumeric(); - private String folderC202776 = String.format("C202776Folder%s", RandomData.getRandomAlphanumeric()); - private String subFolderC202776 = String.format("C202776Subfolder%s", RandomData.getRandomAlphanumeric()); - private String pathfolderC202776 = "/"; - private String pathSubfolder = folderC202776; - private String pathForFile = folderC202776 + "/" + subFolderC202776; - private String fileNameC202776 = String.format("C202776File%s", RandomData.getRandomAlphanumeric()); - private String fileContent = "C202776 Test file content"; - - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, userName, password, userName + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, userC202758_1, password, userC202758_1 + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, userC202758_2, password, userC202758_2 + "@test.com", fname2, lname2); - userService.create(adminUser, adminPassword, userC202776, password, userC202776 + "@test.com", fname1, lname1); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - contentService.createFolderInRepository(adminUser, adminPassword, folderC202776, pathfolderC202776); - contentService.createFolderInRepository(adminUser, adminPassword, subFolderC202776, pathSubfolder); - contentService.createDocumentInRepository(adminUser, adminPassword, pathForFile, CMISUtil.DocumentType.TEXT_PLAIN, fileNameC202776, fileContent); - } + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + managePermissionsPage = new ManagePermissionsPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + editInAlfrescoPage = new EditInAlfrescoPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + createContentPage = new CreateContentPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); - @AfterClass (alwaysRun = true) - public void cleanup() - { + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); - userService.delete(adminUser, adminPassword, userName); - userService.delete(adminUser, adminPassword, userC202758_1); - userService.delete(adminUser, adminPassword, userC202758_2); - userService.delete(adminUser, adminPassword, userC202776); + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); - contentService.deleteTreeByPath(adminUser, adminPassword, folderC202776); - contentService.deleteTreeByPath(adminUser, adminPassword, folderName); + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().createFolder(testFolder).assertThat().existsInRepo(); + } - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC202758_1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC202776); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC202758_2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); + @AfterMethod(alwaysRun = true) + public void cleanup() + { + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(),ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C202757") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void managePermissionOption() { - setupAuthenticatedSession(userName, password); - String identifier = String.format("%s %s", fname1, lname1); - LOG.info("Step 1: Click on Repository link in the toolbar"); - repositoryPage.navigate(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - LOG.info("Step 2: Navigate to " + userName + " folder;"); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(userName), userName + " is not displayed in Repository Page"); - LOG.info("Step 3: Click Manage Permissions link in More menu for user's home folder;"); - repositoryPage.selectItemAction(userName, ItemActions.MANAGE_REPO_PERMISSIONS - ); - LOG.info("Step 4: Verify Manage Permissions page"); + authenticateUsingLoginPage(testUser1); + log.info("Step 1: Click on Repository link in the toolbar"); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 2: Navigate to 'User Homes' folder"); + repositoryPage + .click_FolderName("User Homes") + .assertFileIsDisplayed(testUser1.getUsername()); + + log.info("Step 3: Click Manage Permissions link in More menu for user's home folder;"); + repositoryPage + .select_ItemsAction(testUser1.getUsername(), ItemActions.MANAGE_REPO_PERMISSIONS); + + log.info("Step 4: Verify Manage Permissions page"); + Assert.assertTrue(managePermissionsPage.isInheritPermissionsButtonDisplayed(),"Inherit Permissions button is not displayed"); Assert.assertTrue(managePermissionsPage.isAddUserGroupButtonDisplayed(), "Add User/Group button is not displayed"); Assert.assertTrue(managePermissionsPage.isTheSaveButtonDisplayed(), "The Save button is not displayed"); Assert.assertTrue(managePermissionsPage.isCancelButtonDisplayed(), "The Cancel button is not displayed"); Assert.assertTrue(managePermissionsPage.isLocallySetPermissionsListDisplayed(), "Locally Set Permissions is not displayed on the Manage Permissions page"); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifier).contains("All"), "All Role is not available for " + identifier); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser1.getUsername()).contains("All"), "All Role is not available for " +testUser1.getUsername()); Assert.assertTrue(managePermissionsPage.getRowDetails("ROLE_OWNER").contains("All"), "All Role is not available for ROLE_OWNER"); - Assert.assertTrue(managePermissionsPage.isDeleteButtonAvailable(identifier), "Delete button is not available for " + identifier); - //Assert.assertTrue(managePermissionsPage.isDeleteButtonAvailable("ROLE_OWNER"), "Delete button is not available for ROLE_OWNER"); - cleanupAuthenticatedSession(); + Assert.assertTrue(managePermissionsPage.isDeleteButtonAvailable(testUser1.getUsername()), "Delete button is not available for " + testUser1.getUsername()); } @TestRail (id = "C202758") @Test public void savingChanges() { - String identifierUser1 = fname1 + " " + lname1; - String identifierUser2 = fname2 + " " + lname2; - LOG.info("Preconditions: "); - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigate(); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(userC202758_1); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(userC202758_1); - managePermissionsPage.clickRoleButton(identifierUser1); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(userC202758_2); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(userC202758_2); - managePermissionsPage.clickRoleButton(identifierUser2); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickSave(); - cleanupAuthenticatedSession(); - LOG.info("Step 1: Click on Repository link in the toolbar"); - setupAuthenticatedSession(userC202758_1, password); - repositoryPage.navigate(); - LOG.info("Step 2: Click Manage Permissions link in More menu for " + folderName + " folder"); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS - ); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser1).contains("Coordinator")); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser2).contains("Coordinator")); - LOG.info("Step 3: Change User2 role to \"Consumer\""); - managePermissionsPage.clickRoleButton(identifierUser2); - managePermissionsPage.selectRole("Consumer"); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser2).contains("Consumer")); - LOG.info("Step 4: Click Save"); - managePermissionsPage.clickSave(); - LOG.info("Step 5: Upload file into " + folderName); - contentService.uploadFileInRepository(userC202758_1, password, pathC202758, testDataFolder + file + ".docx"); - LOG.info("Step 6: Log in User2"); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(userC202758_2, password); - repositoryPage.navigate(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - LOG.info("Step 7: Open " + folderName + " folder and try to edit/delete uploaded file"); - repositoryPage.clickOnFolderName(folderName); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(file), file + " is not displayed in repository"); - List notExpectedActions = Arrays.asList("Edit in Microsoft Office™", "Edit in Google Docs™", "Edit Properties", "Upload New Version", - "Edit Offline", "Delete Document", "Manage Permissions"); - cleanupAuthenticatedSession(); + + log.info("Precondition: Assign Role as Coordinator for" +testUser1 +testUser2 +"for the created folder" ); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + managePermissionsPage + .clickAddUserGroupButton() + .sendSearchInput(testUser1.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser1.getUsername()) + .clickRoleButton(testUser1.getUsername()) + .select_Role("Coordinator") + .clickAddUserGroupButton() + .sendSearchInput(testUser2.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser2.getUsername()) + .clickRoleButton(testUser2.getUsername()) + .select_Role("Coordinator") + .clickSave(); + + log.info("Step 1: Click on Repository link in the toolbar"); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 2: Click Manage Permissions link in More menu for " + testFolder + " folder"); + repositoryPage + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser1.getUsername()).contains("Coordinator")); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser2.getUsername()).contains("Coordinator")); + + log.info("Step 3: Change User2 role to \"Consumer\""); + managePermissionsPage + .clickRoleButton(testUser2.getUsername()) + .select_Role("Consumer"); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser2.getUsername()).contains("Consumer")); + + log.info("Step 4: Click Save"); + managePermissionsPage + .clickSave(); + + log.info("Step 5: Upload file into " +testFolder); + repositoryPage + .navigateByMenuBar() + .isFileNameDisplayed(testFolder.getName()); + repositoryPage + .clickOnFolderName(testFolder.getName()); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isFileNameDisplayed(testFile); + + log.info("Step 6: Log in User2"); + authenticateUsingLoginPage(testUser2); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 7: Open " + testFolder + " folder and try to edit/delete uploaded file"); + repositoryPage + .clickOnFolderName(testFolder.getName()) + .assertFileIsDisplayed(testFile); + repositoryPage + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.DELETE_DOCUMENT) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_PROPERTIES) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_IN_GOOGLE_DOCS) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_IN_MICROSOFT_OFFICE) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_OFFLINE) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.UPLOAD_NEW_VERSION) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.MANAGE_REPO_PERMISSIONS); } @TestRail (id = "C202776") @Test public void inheritPermissionsButton() { - String identifierUser1 = fname1 + " " + lname1; - String updateContent = "Updated test content for C202776"; - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigate(); - repositoryPage.selectItemAction(folderC202776, ItemActions.MANAGE_REPO_PERMISSIONS); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(userC202776); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(userC202776); - managePermissionsPage.clickRoleButton(identifierUser1); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickSave(); - cleanupAuthenticatedSession(); - LOG.info("Step 1: Navigate to Repository"); - setupAuthenticatedSession(userC202776, password); - repositoryPage.navigateByMenuBar(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - LOG.info("Step 2: On the Repository page click on TestFolder"); - repositoryPage.clickOnFolderName(folderC202776); - LOG.info("Step 3: Mouseover TestSubfolder and click on Manage Permissions action"); - repositoryPage.selectItemAction(subFolderC202776, ItemActions.MANAGE_REPO_PERMISSIONS); - LOG.info("Step 4: Check inherited permissions"); - Assert.assertTrue(managePermissionsPage.getInheritedPermissions(identifierUser1).contains("Coordinator")); - LOG.info("Step 5: Return to Repository, TestSubfolder and check available actions for TestFile"); - repositoryPage.navigate(); - repositoryPage.clickOnFolderName(folderC202776); - repositoryPage.clickOnFolderName(subFolderC202776); - List expectedActions = Arrays.asList("Edit in Google Docs™", "Edit Properties", "Edit in Alfresco Share", "Edit Offline", "Delete Document"); - Assert.assertTrue(repositoryPage.areActionsAvailableForLibraryItem(fileNameC202776, expectedActions), "Expected actions"); - LOG.info("Step 6: Edit TestFile and save changes"); - repositoryPage.selectItemAction(fileNameC202776, ItemActions.EDIT_IN_ALFRESCO); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Edit in Alfresco Share", "User is not on Edit In Alfresco page"); - editInAlfrescoPage.typeContent(updateContent); - editInAlfrescoPage.clickSaveButton(); - repositoryPage.clickOnFile(fileNameC202776); - Assert.assertEquals(documentDetailsPage.getContentText(), updateContent, fileNameC202776 + " was not updated"); + String updatedContent = "Updated test content for C202776"; + + log.info("PreCondition: Set user1 Rights to Coordinator for" +testFolder); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + managePermissionsPage + .clickAddUserGroupButton() + .sendSearchInput(testUser1.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser1.getUsername()) + .clickRoleButton(testUser1.getUsername()) + .select_Role("Coordinator") + .clickSave(); + + log.info("PreCondition: Login with testUser1 & Create"+ subFolder +"inside" + testFolder +"and upload testFile inside SubFolder"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .clickOnFolderName(testFolder.getName()) + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(subFolder) + .clickSave(); + repositoryPage + .clickOnFolderName(subFolder); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isFileNameDisplayed(testFile); + + log.info("Step 1: Navigate to Repository"); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 2: On the Repository page click on TestFolder"); + repositoryPage + .clickOnFolderName(testFolder.getName()); + + log.info("Step 3: Mouseover TestSubfolder and click on Manage Permissions action"); + repositoryPage + .select_ItemsAction(subFolder, ItemActions.MANAGE_REPO_PERMISSIONS); + + log.info("Step 4: Check inherited permissions"); + Assert.assertTrue(managePermissionsPage.getInheritedPermissions(testUser1.getUsername()).contains("Coordinator")); + + log.info("Step 5: Return to Repository, TestSubfolder and check available actions for TestFile"); + repositoryPage + .navigateByMenuBar() + .clickOnFolderName(testFolder.getName()) + .clickOnFolderName(subFolder) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile, ItemActions.EDIT_IN_GOOGLE_DOCS) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile, ItemActions.EDIT_PROPERTIES) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile, ItemActions.EDIT_IN_ALFRESCO) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile, ItemActions.EDIT_OFFLINE) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile, ItemActions.DELETE_DOCUMENT); + + log.info("Step 6: Edit TestFile and save changes"); + repositoryPage + .select_ItemsAction(testFile, ItemActions.EDIT_IN_ALFRESCO) + .assertBrowserPageTitleIs("Alfresco » Edit in Alfresco Share"); + editInAlfrescoPage + .typeContent(updatedContent) + .clickSaveButton(); + repositoryPage + .clickOnFile(testFile); + documentDetailsPage + .assertFileContentEquals(updatedContent); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsSelectTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsSelectTests.java index 1803f10795..232a3fb065 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsSelectTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsSelectTests.java @@ -1,140 +1,212 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import static org.testng.Assert.assertTrue; - -import org.alfresco.dataprep.CMISUtil.DocumentType; +import static org.alfresco.common.Utils.testDataFolder; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; -import org.alfresco.po.share.alfrescoContent.organizingContent.CopyMoveUnzipToDialog; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.openqa.selenium.By; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ActionsSelectTests extends ContextAwareWebTest +import java.util.ArrayList; +import java.util.Collections; + +@Slf4j +public class ActionsSelectTests extends BaseTest { private final String user = String.format("8163TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileName = "C8163 file"; - private final String fileContent = "8163 content"; - private final String path = "User Homes/" + user; - private final String folderName = "C8164 Folder"; - //@Autowired + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private final String userHomeFolderName = "User Homes"; + + private final String folderName = String.format("C8164testFolder%s", RandomData.getRandomAlphanumeric()); + private final String password = "password"; + private UserModel testUser1; private RepositoryPage repositoryPage; //@Autowired - private HeaderMenuBar menuBar; - // @Autowired - private CopyMoveUnzipToDialog copyMoveUnzipToDialog; + private HeaderMenuBar headerMenuBar; + //@Autowired + private MyFilesPage myFilesPage; + //@Autowired + private NewFolderDialog newFolderDialog; + private UploadContent uploadContent; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileName, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - setupAuthenticatedSession(user, password); - } + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); - @AfterClass (alwaysRun = false) + authenticateUsingLoginPage(getAdminUser()); + + repositoryPage = new RepositoryPage(webDriver); + headerMenuBar = new HeaderMenuBar(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + } + @AfterMethod(alwaysRun = true) public void cleanup() { - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + folderName); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + fileName); - contentService.deleteContentByPath(adminUser, adminPassword, path); - + deleteUsersIfNotNull(testUser1); + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage.select_ItemsAction(user, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } - @TestRail (id = "8163") + @TestRail (id = "C8163") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void selectFile() { - //Precondition - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - - LOG.info("Step 1: Click on the Select button and select Documents option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.documents")); - //getBrowser().waitUntilElementVisible(getBrowser().findElement(By.name("fileChecked"))); - getBrowser().waitInSeconds(1); - Assert.assertTrue(repositoryPage.isContentSelected(fileName), fileName + " is not selected."); - - LOG.info("Step 2: Click on the Select button and select Invert Selection."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.invertSelection")); - Assert.assertFalse(repositoryPage.isContentSelected(fileName), fileName + " is selected."); - - LOG.info("Step 3: Click on the Select button and select All option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.all")); - Assert.assertTrue(repositoryPage.isContentSelected(fileName), fileName + " is not selected."); - Assert.assertTrue(repositoryPage.isContentSelected(folderName), folderName + " is not selected."); - - LOG.info("Step 4: Click on the Select button and select None option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.none")); - Assert.assertFalse(repositoryPage.isContentSelected(fileName), fileName + " is selected."); - Assert.assertFalse(repositoryPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("Step 5: Click on the Select button and select Folders option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.folders")); - Assert.assertFalse(repositoryPage.isContentSelected(fileName), fileName + " is selected."); - Assert.assertTrue(repositoryPage.isContentSelected(folderName), folderName + " is not selected."); - - LOG.info("Step 6: Click on the checkbox next to the testFile."); - repositoryPage.clickCheckBox(fileName); - assertTrue(repositoryPage.isContentSelected(fileName), fileName + " is selected."); + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(testFile); + + log.info("STEP1: Click 'Select' button and choose 'Documents' option."); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Documents"); + ArrayList expectedContentList1 = new ArrayList<>(Collections.singletonList(testFile)); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); + log.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Invert Selection"); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuDisabled(); + log.info("STEP3: Click 'Select' button and choose 'All'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("All"); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); + log.info("STEP4: Click 'Select' button and choose 'None'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("None"); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuDisabled(); + log.info("STEP5: Click 'Select' button and choose 'Folders'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Folders"); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuDisabled(); + log.info("STEP6: Click on document checkbox"); + myFilesPage + .clickCheckBox(testFile); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); } @TestRail (id = "C8164") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void selectFolder() { - //Precondition - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - LOG.info("Step 1: On My Files page click Select and select Folders option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption("Folders"); - getBrowser().waitUntilElementVisible(getBrowser().findElement(By.name("fileChecked"))); - Assert.assertTrue(repositoryPage.isContentSelected(folderName), folderName + " is not selected."); - - LOG.info("Step 2: Click Select and choose Invert Selection option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.invertSelection")); - Assert.assertFalse(repositoryPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("Step 3: Click Select and choose All option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.all")); - Assert.assertTrue(repositoryPage.isContentSelected(fileName), fileName + " is not selected."); - Assert.assertTrue(repositoryPage.isContentSelected(folderName), folderName + " is not selected."); - - LOG.info("Step 4: Click Select and choose None option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.none")); - Assert.assertFalse(repositoryPage.isContentSelected(fileName), fileName + " is selected."); - Assert.assertFalse(repositoryPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("Step 5: Click Select and choose Documents option."); - menuBar.clickSelectMenu(); - menuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.documents")); - Assert.assertTrue(repositoryPage.isContentSelected(fileName), fileName + " is not selected."); - Assert.assertFalse(repositoryPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("Step 6: Click on the checkbox next to the TestFolder."); - repositoryPage.clickCheckBox(folderName); - assertTrue(repositoryPage.isContentSelected(folderName), folderName + " is selected."); + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(userHomeFolderName); + repositoryPage + .click_FolderName(user); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderName) + .clickSave(); + myFilesPage + .assertIsContantNameDisplayed(folderName); + log.info("STEP1: Click 'Select' button and choose 'Folders'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Folders"); + ArrayList expectedContentList1 = new ArrayList<>(Collections.singletonList(folderName)); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); + log.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Invert Selection"); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuDisabled(); + log.info("STEP3: Click 'Select' button and choose 'All'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("All"); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); + log.info("STEP4: Click 'Select' button and choose 'None'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("None"); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuDisabled(); + log.info("STEP5: Click 'Select' button and choose 'Documents' option."); + headerMenuBar + .clickSelectMenu() + .click_SelectOption("Documents"); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuDisabled(); + log.info("STEP6: Click on folder checkbox"); + myFilesPage + .clickCheckBox(folderName); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); + } + } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUnzippingContentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUnzippingContentTests.java index 15f2064d3d..d89392ef2e 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUnzippingContentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUnzippingContentTests.java @@ -2,108 +2,150 @@ import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Collections; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.organizingContent.CopyMoveUnzipToDialog; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ActionsUnzippingContentTests extends ContextAwareWebTest + +@Slf4j + +public class ActionsUnzippingContentTests extends BaseTest { - private final String user = String.format("C8256TestUser%s", RandomData.getRandomAlphanumeric()); + private final ThreadLocal user = new ThreadLocal<>(); private final String zipFile = "testFileC8256.zip"; + private final String zipFilePath = testDataFolder + zipFile; + private final String sharedFolderName = "Shared"; private final String zipContent = "testFile1"; + private final String acpFile = "archiveC8257.acp"; + private final String acpPath = testDataFolder + acpFile; private final String acpContent = "fileC8257"; //@Autowired private RepositoryPage repositoryPage; + private DeleteDialog deleteDialog; //@Autowired private CopyMoveUnzipToDialog unzipToDialog; //@Autowired private DocumentDetailsPage documentDetailsPage; + private MyFilesPage myFilesPage; + private UploadContent uploadContent; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - contentService.uploadFileInRepository(adminUser, adminPassword, null, testDataFolder + zipFile); - contentService.uploadFileInRepository(adminUser, adminPassword, null, testDataFolder + acpFile); + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); + + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + unzipToDialog = new CopyMoveUnzipToDialog(webDriver); + deleteDialog = new DeleteDialog(webDriver); } - @AfterClass (alwaysRun = false) + @AfterMethod(alwaysRun = true) public void cleanup() { - contentService.deleteContentByPath(adminUser, adminPassword, zipFile); - contentService.deleteContentByPath(adminUser, adminPassword, acpFile); - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user.get()); } - @TestRail (id = "C8256") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void unzipZipFileToRepository() { - LOG.info("Upload zip archive"); - repositoryPage.navigate(); - assertTrue(repositoryPage.isContentNameDisplayed(zipFile), "Repository: list of files="); - LOG.info("STEP1: Click archive name, e.g: testArchive"); - repositoryPage.clickOnFile(zipFile); - assertTrue(documentDetailsPage.getFileName().equals(zipFile), "Wrong file name!"); - LOG.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); - documentDetailsPage.clickDocumentActionsOption("Unzip to..."); - assertEquals(unzipToDialog.getDialogTitle(), "Unzip " + zipFile + " to...", "'Unzip to....' dialog is displayed"); - LOG.info("STEP3: Select option My Files from 'Destination' section"); - unzipToDialog.selectMyFilesDestination(); - ArrayList expectedDestionationPath = new ArrayList(Collections.singletonList("My Files")); - //assertEquals(unzipToDialog.getPathList(), expectedDestionationPath.toString(), "Destionation set to="); - LOG.info("STEP4: Click 'Unzip' button and navigate to My Files"); - unzipToDialog.clickUnzipButton(); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - assertTrue(repositoryPage.isContentNameDisplayed(zipContent), "content is displayed, " + zipContent); - + log.info("Precondition: Login to share and navigate to Repository->Shared "); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(zipFilePath); + log.info("STEP1: Click archive name, e.g: testArchive"); + myFilesPage + .clickOnFile(zipFile); + documentDetailsPage + .assertContentNameEquals(zipFile); + log.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); + documentDetailsPage + .clickDocumentActionsOption("Unzip to..."); + assertEquals(unzipToDialog + .getDialogTitle(), + "Unzip " + zipFile + " to...", "'Unzip to....' dialog is displayed"); + log.info("STEP3: Select option My Files from 'Destination' section"); + unzipToDialog + .selectMyFilesDestination(); + log.info("STEP4: Click 'Unzip' button and navigate to My Files"); + unzipToDialog + .clickUnzipButton(); + myFilesPage + .navigate(); + myFilesPage + .assertIsContantNameDisplayed(zipContent); + log.info("Delete unzip and text file "); + repositoryPage + .select_ItemsAction(zipContent, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .select_ItemsAction(zipFile, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C8257") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, enabled = false) - public void unzipAcpFileToRepository() { - LOG.info("Upload acp archive"); - repositoryPage.navigate(); - assertTrue(repositoryPage.isContentNameDisplayed(acpFile), "Repository: list of files="); - LOG.info("STEP1: Click archive name, e.g: testArchive"); - repositoryPage.clickOnFile(acpFile); - assertTrue(documentDetailsPage.getFileName().equals(acpFile), "Wrong file name!"); - LOG.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); - documentDetailsPage.clickDocumentActionsOption("Unzip to..."); - assertEquals(unzipToDialog.getDialogTitle(), "Unzip " + acpFile + " to...", "'Unzip to....' dialog is displayed"); - LOG.info("STEP3: Select option My Files from 'Destination' section"); - unzipToDialog.selectMyFilesDestination(); - ArrayList expectedDestionationPath = new ArrayList(Collections.singletonList("My Files")); - //assertEquals(unzipToDialog.getPathList(), expectedDestionationPath.toString(), "Destionation set to="); - LOG.info("STEP4: Click 'Unzip' button and navigate to My Files"); - unzipToDialog.clickUnzipButton(); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - repositoryPage.getDocumentListHeader(); - repositoryPage.selectDocumentLibraryItemRow("fileC8257"); - assertTrue(repositoryPage.isContentNameDisplayed("fileC8257"), acpFile + " is not displayed "); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(acpPath); + log.info("STEP1: Click archive name, e.g: testArchive"); + myFilesPage + .clickOnFile(acpFile); + documentDetailsPage + .assertContentNameEquals(acpFile); + log.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); + documentDetailsPage + .clickDocumentActionsOption("Unzip to..."); + assertEquals(unzipToDialog + .getDialogTitle(), + "Unzip " + acpFile + " to...", "'Unzip to....' dialog is displayed"); + + log.info("STEP3: Select option My Files from 'Destination' section"); + unzipToDialog + .selectMyFilesDestination(); + log.info("STEP4: Click 'Unzip' button and navigate to My Files"); + unzipToDialog + .clickUnzipButton(); + myFilesPage + .navigate(); + myFilesPage + .assertIsContantNameDisplayed(zipContent); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUploadTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUploadTests.java index d7e185c703..cab6b5c73c 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUploadTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/ActionsUploadTests.java @@ -1,102 +1,142 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; import static org.alfresco.common.Utils.testDataFolder; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.UploadContent; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Andrei.Nechita */ -public class ActionsUploadTests extends ContextAwareWebTest +public class ActionsUploadTests extends BaseTest { private final String random = RandomData.getRandomAlphanumeric(); private final String user = "user1-" + random; //@Autowired private RepositoryPage repositoryPage; //@Autowired - private UploadContent uploadContent; //@Autowired private DocumentDetailsPage documentDetailsPage; private String testFile = RandomData.getRandomAlphanumeric() + "-testFile-C8172-.txt"; private String testFilePath = testDataFolder + testFile; - private String testFile2 = RandomData.getRandomAlphanumeric() + "-OldFile-C8175.txt"; private String newVersionFile = RandomData.getRandomAlphanumeric() + "-NewFile-C8175.txt"; + private DocumentLibraryPage documentLibrary; + private CreateContentPage createContent; + //@Autowired + private MyFilesPage myFilesPage; + //@Autowired + private UploadContent uploadContent; + private final String password = "password"; + private UserModel testUser1; + private final String sharedFolderName = "Shared"; + String newVersionFilePath = testDataFolder + newVersionFile; + private final String fileName = RandomData.getRandomAlphanumeric() + "Test File"; + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - } + repositoryPage = new RepositoryPage(webDriver); + createContent = new CreateContentPage(webDriver); + documentLibrary = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); - @AfterClass (alwaysRun = false) + } + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - contentService.deleteContentByPath(adminUser, adminPassword, "/Shared/" + testFile); - contentService.deleteContentByPath(adminUser, adminPassword, "/Shared/" + newVersionFile); + deleteUsersIfNotNull(testUser1); } + @TestRail (id = "C8172") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT}) public void uploadDocument() { - String testFile = RandomData.getRandomAlphanumeric() + "-testFile-C8172-.txt"; - String testFilePath = testDataFolder + testFile; - LOG.info("Precondition: Navigate to Repository page."); - repositoryPage.navigate(); - LOG.info("STEP1: Check if the Upload button is greyed on the Repository page ."); - Assert.assertEquals(repositoryPage.getUploadButtonStatusDisabled(), "true", "The Upload Button is not disabled"); - LOG.info("STEP2: Go to Shared folder and upload a file."); - repositoryPage.clickFolderFromExplorerPanel("Shared"); -// assertEquals(repositoryPage.assertPageHeadersEqualsTo(), "Repository Browser"); - uploadContent.uploadContent(testFilePath); - assertTrue(repositoryPage.isContentNameDisplayed(testFile), String.format("File [%s] is displayed", testFile)); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + documentLibrary + .assertUploadButtonStatusDisabled(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(testFile); + } // @Bug (id = "MNT-18059", status = Bug.Status.FIXED) @TestRail (id = "C8175") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void updateDocumentNewVersion() - { - String testFilePath2 = testDataFolder + testFile2; - String newVersionFilePath = testDataFolder + newVersionFile; - LOG.info("Precondition: Navigate to Shared folder from Repository page and upload a file"); - repositoryPage.navigate(); -// assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser"); - repositoryPage.clickFolderFromExplorerPanel("Shared"); -// assertEquals(repositoryPage.assertPageHeadersEqualsTo(), "Repository Browser"); - uploadContent.uploadContent(testFilePath2); - LOG.info("STEP1: Click on the file and check content"); - repositoryPage.clickOnFile(testFile2); - assertEquals(documentDetailsPage.getContentText(), "contents", String.format("Contents of %s are wrong.", testFile2)); - LOG.info("STEP2: Navigate to Shared folder from Repository page and click on upload new version"); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("Shared"); - repositoryPage.selectItemAction(testFile2, ItemActions.UPLOAD_NEW_VERSION); - LOG.info("STEP3: Select file to upload. Update version"); - uploadContent.updateDocumentVersion(newVersionFilePath, "comments", UploadContent.Version.Major); - assertTrue(repositoryPage.isContentNameDisplayed(newVersionFile), String.format("File [%s] is displayed", newVersionFile)); - assertFalse(repositoryPage.isContentNameDisplayed(testFile), testFile2 + " is displayed."); - LOG.info("STEP4: Click on the file and check the version and content are updated."); - repositoryPage.clickOnFile(newVersionFile); - assertEquals(documentDetailsPage.getContentText(), "updated by upload new version", String.format("Contents of %s are wrong.", newVersionFile)); - assertEquals(documentDetailsPage.getFileVersion(), "2.0", String.format("Version of %s is wrong.", newVersionFile)); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void updateDocumentNewVersion() { + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + myFilesPage + .click_CreateButton(); + + log.info(" Click \"Plain Text...\" option."); + myFilesPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(fileName); + createContent + .clickCreate(); + documentDetailsPage + .clickOpenedFloder(); + myFilesPage + .assertIsContantNameDisplayed(fileName); + myFilesPage + .clickOnFile(fileName); + documentDetailsPage + .assertDacumentNOContent(); + documentDetailsPage + .clickOpenedFloder(); + myFilesPage + .selectItemAction(fileName, ItemActions.UPLOAD_NEW_VERSION); + log.info(" Update the file with major version."); + uploadContent + .updateDocumentVersion(newVersionFilePath, + "comments", + UploadContent.Version.Major); + myFilesPage + .assertIsContantNameDisplayed(newVersionFile); + myFilesPage + .assertIsContentDeleted(fileName); + log.info(" Click on the file and check the version and contents are updated."); + myFilesPage + .clickOnFile(newVersionFile); + documentDetailsPage + .assertFileContentEquals("updated by upload new version"); + documentDetailsPage + .assertVerifyFileVersion("2.0"); + } + } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/RepositoryTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/RepositoryTests.java index e92549506a..939aaa3007 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/RepositoryTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/RepositoryTests.java @@ -1,120 +1,121 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository; -import org.alfresco.dataprep.CMISUtil.DocumentType; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; -import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; -import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; -import org.alfresco.po.share.alfrescoContent.document.GoogleDocsCommon; -import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.SiteModel; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.apache.commons.lang3.RandomStringUtils; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static org.alfresco.share.TestUtils.FILE_CONTENT; -public class RepositoryTests extends ContextAwareWebTest +@Slf4j + +public class RepositoryTests extends BaseTest { - private final String user = String.format("C8154TestUser%s", RandomData.getRandomAlphanumeric()); - private final String description = String.format("C8154SiteDescription%s", RandomData.getRandomAlphanumeric()); - private final String siteName = String.format("1C8154SiteName%s", RandomData.getRandomAlphanumeric()); - private final String fileName1 = "C8154 file1"; - private final String fileName2 = "C8154 file2"; - private final String folderName = "folderNameSite1"; - private final String folderName2 = "folderNameSite2"; - private final String fileContent = "test content"; - private final String siteName2 = "2SecondTestSite" + RandomData.getRandomAlphanumeric(); - //@Autowired - CreateContentPage create; - //@Autowired - DocumentDetailsPage documentDetailsPage; - @Autowired - GoogleDocsCommon googleDocs; - // @Autowired - private UserDashboardPage userDashboardPage; + private final ThreadLocal site1 = new ThreadLocal<>(); + private final ThreadLocal site2 = new ThreadLocal<>(); //@Autowired private RepositoryPage repositoryPage; + private MyFilesPage myFilesPage; + private final String dockLibraryFoldername = "documentLibrary"; + private final String siteFoldername = "Sites"; + private final String site1name = "Site1" + RandomStringUtils.randomAlphanumeric(7); + private final String site2name = "Site2" + RandomStringUtils.randomAlphanumeric(7); + private final FileModel site1File = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, FILE_CONTENT); + private final FolderModel site1Folder = FolderModel.getRandomFolderModel(); + private final FileModel site2File = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, FILE_CONTENT); + private final FolderModel site2Folder = FolderModel.getRandomFolderModel(); + private final ThreadLocal user = new ThreadLocal<>(); + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + log.info("PreCondition1: Any test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(user.get()); + + authenticateUsingCookies(user.get()); + + repositoryPage = new RepositoryPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - siteService.create(user, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - siteService.create(user, password, domain, siteName2, description, SiteService.Visibility.PUBLIC); - contentService.createDocument(user, password, siteName, DocumentType.TEXT_PLAIN, fileName1, fileContent); - contentService.createDocument(user, password, siteName2, DocumentType.TEXT_PLAIN, fileName2, fileContent); - contentService.createFolder(user, password, folderName, siteName); - contentService.createFolder(user, password, folderName2, siteName2); - - setupAuthenticatedSession(user, password); } - - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - siteService.delete(adminUser, adminPassword, siteName); - siteService.delete(adminUser, adminPassword, siteName2); + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C8154") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void checkTheRepositoryIsAvailableInTheToolBar() { - userDashboardPage.navigate(siteName); - - LOG.info("Step 2: Access the Repository via link in toolbar"); - toolbar.clickRepository(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not redirected to the repository page"); + repositoryPage + .navigate(); + repositoryPage + .assertRepositoryPageIsOpened(); } - @TestRail (id = "C8155") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - - public void checkTheFilesAndFoldersAvailabilityInRepository() - { - LOG.info("Step 1: Navigate to the Repository Page and check the default folders availability"); - repositoryPage.navigate(); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("Data Dictionary"), "Data Dictionary is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("Guest Home"), "Guest Home is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("Imap Attachments"), "Imap Attachments is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("IMAP Home"), "IMAP Home is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("Shared"), "Shared is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("Sites"), "Sites is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("User Homes"), "User Homes is not displayed in Repository"); - - LOG.info("Step 2: Click on the Sites Folder"); - repositoryPage.clickFolderFromExplorerPanel("Sites"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(siteName), "First created site is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(siteName2), "Second created site is not displayed in Repository"); - - LOG.info("Step 3: Click on your first created site."); - repositoryPage.clickOnFolderName(siteName); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("documentLibrary"), "documentLibrary for the first created site is not displayed in Repository"); - - LOG.info("Step 4: Click on documentLibrary folder."); - repositoryPage.clickOnFolderName("documentLibrary"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileName1), "fileName1 is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderName), "fileName1 is not displayed in Repository"); - - LOG.info("Step 5: Return to Repository/Sites"); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("Sites"); - - LOG.info("Step 6: Click on the second created site."); - repositoryPage.clickOnFolderName(siteName2); - Assert.assertTrue(repositoryPage.isContentNameDisplayed("documentLibrary"), "documentLibrary for the second created site is not displayed in Repository"); - - LOG.info("Step 7: Click on documentLibrary folder."); - repositoryPage.clickOnFolderName("documentLibrary"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileName2), "fileName2 is not displayed in Repository"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderName2), "fileName2 is not displayed in Repository"); + public void checkTheFilesAndFoldersAvailabilityInRepository() { + log.info("Precondition : create 2 sites and add file and folder in both sites"); + site1.set(getDataSite().usingUser(user.get()).createSite(new SiteModel(site1name))); + getCmisApi().usingSite(site1.get()).createFile(site1File).assertThat().existsInRepo(); + getCmisApi().usingSite(site1.get()).createFolder(site1Folder).assertThat().existsInRepo(); + site2.set(getDataSite().usingUser(user.get()).createSite(new SiteModel(site2name))); + getCmisApi().usingSite(site2.get()).createFile(site2File).assertThat().existsInRepo(); + getCmisApi().usingSite(site2.get()).createFolder(site2Folder).assertThat().existsInRepo(); + + log.info(" Navigate to the Repository Page and click on Sites"); + repositoryPage + .navigate(); + repositoryPage + .assertRepositoryPageIsOpened(); + repositoryPage + .click_FolderName(siteFoldername); + log.info(" Click on your first created site."); + repositoryPage + .click_FolderName(site1name); + log.info(" Verify documentLibrary folder and Click on documentLibrary folder."); + myFilesPage + .assertIsContantNameDisplayed(dockLibraryFoldername); + repositoryPage + .click_FolderName(dockLibraryFoldername); + log.info("Verify site1 file and folder are available in documentLibrary"); + myFilesPage + .assertIsContantNameDisplayed(site1File.getName()); + myFilesPage + .assertIsContantNameDisplayed(site1Folder.getName()); + log.info(" Return to Repository and click on Sites"); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(siteFoldername); + log.info(" Click on your second created site."); + repositoryPage + .click_FolderName(site2name); + log.info(" Verify documentLibrary folder and Click on documentLibrary folder."); + myFilesPage + .assertIsContantNameDisplayed(dockLibraryFoldername); + repositoryPage + .click_FolderName(dockLibraryFoldername); + log.info("Verify site1 file and folder are available in documentLibrary"); + myFilesPage + .assertIsContantNameDisplayed(site2File.getName()); + myFilesPage + .assertIsContantNameDisplayed(site2Folder.getName()); + + log.info("Delete created site "); + getDataSite().usingUser(user.get()).deleteSite(new SiteModel(site1name)); + getDataSite().usingUser(user.get()).deleteSite(new SiteModel(site2name)); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/CommentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/CommentTests.java index 1d9611f068..493f687c25 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/CommentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/CommentTests.java @@ -1,100 +1,152 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository.additionalActions; -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; import org.alfresco.po.share.alfrescoContent.RepositoryPage; -import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.SocialFeatures; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.FileType; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class CommentTests extends ContextAwareWebTest + + +@Slf4j +public class CommentTests extends BaseTest { - private final String user = String.format("C8305TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileNameC8305 = "C8305 file"; - private final String path = "User Homes/" + user; - private final String fileContent = "test file content"; - private final String folderNameC8306 = "C8306 Folder"; - // @Autowired - CreateContentPage createContent; - //@Autowired + private RepositoryPage repositoryPage; //@Autowired private SocialFeatures socialFeatures; //@Autowired private DocumentDetailsPage documentDetails; + private MyFilesPage myFilesPage; + //@Autowired + private NewFolderDialog newFolderDialog; + private UploadContent uploadContent; + private final String password = "password"; + private final String user = String.format("TestUser%s", RandomData.getRandomAlphanumeric()); + private UserModel testUser1; + private FolderModel folderToCheck; + private FileModel fileToCheck; + private String username=""; + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + socialFeatures = new SocialFeatures(webDriver); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8305, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderNameC8306, path); - setupAuthenticatedSession(user, password); - } + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + folderToCheck = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingUserHome(user).createFolder(folderToCheck).assertThat().existsInRepo(); - @AfterClass (alwaysRun = true) + fileToCheck = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingUserHome(user).createFile(fileToCheck).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); + + documentDetails = new DocumentDetailsPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + } + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, path); + deleteUsersIfNotNull(testUser1); + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage.select_ItemsAction(user, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } @TestRail (id = "C8305") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - - public void addCommentToFile() - { + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void addCommentToFile() throws InterruptedException { String comment = "test comment c8305"; - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8305), fileNameC8305 + " is not available in Repository"); - - LOG.info("Step 1: Add comment"); - socialFeatures.clickCommentLink(fileNameC8305); - documentDetails.addComment(comment); - Assert.assertEquals(documentDetails.getCommentContent(), comment, "Comment text is not correct"); - - LOG.info("Step 2: Return to Repository, User Homes , User page and check that the comment counter has increased"); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8305), fileNameC8305 + " is not available in Repository"); - - Assert.assertEquals(socialFeatures.getNumberOfComments(fileNameC8305), 1, "The number of comments is not increased"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage.click_FolderName(user); + repositoryPage.assertFileIsDisplayed(fileToCheck.getName()); + log.info("Step 1: Add comment"); + socialFeatures + .assertCommentButtonMessage(fileToCheck.getName(),"Comment on this document"); + socialFeatures + .clickCommentLink(fileToCheck.getName()); + documentDetails + .addComment(comment); + socialFeatures.assertCommentContent(comment); + log.info("Step 2: Return to Repository, User Homes , User page and check that the comment counter has increased"); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .clickOnFolderName(user) + .assertFileIsDisplayed(fileToCheck.getName()); + socialFeatures + .assertCommentButtonMessage(fileToCheck.getName(),"Comment on this document") + .assertNoOfCommentsVerify(fileToCheck.getName(),1); + } - @TestRail (id = "C8306") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void addCommentToFolder() - { + @TestRail (id = "C8306") + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT}) + public void addCommentToFolder() { String comment = "test comment c8306"; - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderNameC8306), folderNameC8306 + " is not available in Repository"); - - LOG.info("Step 1: Add comment"); - socialFeatures.clickCommentLink(folderNameC8306); - documentDetails.addComment(comment); - Assert.assertEquals(documentDetails.getCommentContent(), comment, "Comment text is not correct"); - - LOG.info("Step 2: Return to Repository, User Homes , User page and check that the comment counter has increased"); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderNameC8306), folderNameC8306 + " is not available in Repository"); - - Assert.assertEquals(socialFeatures.getNumberOfComments(folderNameC8306), 1, "The number of comments is not increased"); + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage.click_FolderName(user); + repositoryPage.assertFileIsDisplayed(folderToCheck.getName()); + log.info("Step 1: Add comment"); + socialFeatures + .assertCommentButtonMessage(folderToCheck.getName(),"Comment on this folder"); + socialFeatures + .clickCommentLink(folderToCheck.getName()); + documentDetails + .addComment(comment); + socialFeatures.assertCommentContent(comment); + log.info("Step 2: Return to Repository, User Homes , User page and check that the comment counter has increased"); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .clickOnFolderName(user) + .assertFileIsDisplayed(folderToCheck.getName()); + socialFeatures + .assertNoOfCommentsVerify(folderToCheck.getName(),1); + } + + } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/LikeTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/LikeTests.java index 2159763e84..429b6d6e5e 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/LikeTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/LikeTests.java @@ -1,73 +1,94 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository.additionalActions; -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.document.SocialFeatures; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.FileType; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - -public class LikeTests extends ContextAwareWebTest +@Slf4j +public class LikeTests extends BaseTest { - private final String user = String.format("C8301TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileNameC8301 = "C8301 file"; - private final String fileNameC8303 = "C8303 file"; - private final String fileContent = "test file content"; - private final String path = "User Homes/" + user; - private final String folderNameC8302 = "C8302 Folder"; - private final String folderNameC8304 = "C8304 Folder"; + private final String user = String.format("TestUser%s", RandomData.getRandomAlphanumeric()); + private final String password = "password"; //@Autowired private RepositoryPage repositoryPage; + private FileModel fileToCheck; //@Autowired private SocialFeatures socialFeatures; + private UserModel testUser1; + private FolderModel folderToCheck; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8301, fileContent); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8303, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderNameC8302, path); - contentService.createFolderInRepository(adminUser, adminPassword, folderNameC8304, path); + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { - setupAuthenticatedSession(user, password); - } + repositoryPage = new RepositoryPage(webDriver); + socialFeatures = new SocialFeatures(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + folderToCheck = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingUserHome(user).createFolder(folderToCheck).assertThat().existsInRepo(); - @AfterClass (alwaysRun = true) + fileToCheck = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingUserHome(user).createFile(fileToCheck).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); + } + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, path); + deleteUsersIfNotNull(testUser1); + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes") + .select_ItemsAction(user, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } @TestRail (id = "C8301") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - - public void likeFile() - { - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8301), fileNameC8301 + " is not available in Repository"); - - LOG.info("Step 1: Hover over the file Like link."); - - Assert.assertTrue(repositoryPage.isLikeButtonDisplayed(fileNameC8301), "Documents link is not present"); - Assert.assertEquals(socialFeatures.getLikeButtonMessage(fileNameC8301), "Like this document", "Like Button message is not correct"); - Assert.assertEquals(socialFeatures.getNumberOfLikes(fileNameC8301), 0, "The number of likes is not correct"); - - LOG.info("Step 2: Click on the Like button"); - socialFeatures.clickLikeButton(fileNameC8301); - Assert.assertEquals(socialFeatures.getNumberOfLikes(fileNameC8301), 1, "The number of likes is not correct"); - Assert.assertTrue(socialFeatures.isLikeButtonEnabled(fileNameC8301), "Like button is not enabled"); - + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) + + public void likeFile() { + log.info("Precondition: Login as User and Check Created File is Available in User Repository-> User Homes"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes") + .click_FolderName(user) + .assertFileIsDisplayed(fileToCheck.getName()); + + log.info("Step 1: Hover over the file Like link."); + repositoryPage + .assertIsLikeButtonDisplayed(fileToCheck.getName()); + socialFeatures + .assertLikeButtonMessage(fileToCheck.getName(),"Like this document") + .assertNoOfLikesVerify(fileToCheck.getName(),0); + + log.info("Step 2: Click on the Like button"); + socialFeatures + .clickLikeButton(fileToCheck.getName()) + .assertNoOfLikesVerify(fileToCheck.getName(),1) + .assertIsLikeButtonEnabled(fileToCheck.getName()); } @TestRail (id = "C8302") @@ -75,22 +96,26 @@ public void likeFile() public void likeFolder() { + log.info("Precondition: Login as User and Check Created File is Available in User Repository-> User Homes"); + authenticateUsingLoginPage(testUser1); repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderNameC8302), folderNameC8302 + " is not available in Repository"); - - LOG.info("Step 1: Hover over a document and check the Like button"); - - LOG.info("Step 1: Hover over the file Like link."); - Assert.assertTrue(repositoryPage.isLikeButtonDisplayed(folderNameC8302), "Documents link is not present"); - Assert.assertEquals(socialFeatures.getLikeButtonMessage(folderNameC8302), "Like this folder", "Like Button message is not correct"); - Assert.assertEquals(socialFeatures.getNumberOfLikes(folderNameC8302), 0, "The number of likes is not correct"); - - LOG.info("Step 2: Click on the Like button"); - socialFeatures.clickLikeButton(folderNameC8302); - Assert.assertEquals(socialFeatures.getNumberOfLikes(folderNameC8302), 1, "The number of likes is not correct"); - Assert.assertTrue(socialFeatures.isLikeButtonEnabled(folderNameC8302), "Like button is not enabled"); + repositoryPage + .click_FolderName("User Homes") + .click_FolderName(user) + .assertFileIsDisplayed(folderToCheck.getName()); + + log.info("Step 1: Hover over the file Like link."); + repositoryPage + .assertIsLikeButtonDisplayed(folderToCheck.getName()); + socialFeatures + .assertLikeButtonMessage(folderToCheck.getName(),"Like this folder") + .assertNoOfLikesVerify(folderToCheck.getName(),0); + + log.info("Step 2: Click on the Like button"); + socialFeatures + .clickLikeButton(folderToCheck.getName()) + .assertNoOfLikesVerify(folderToCheck.getName(),1) + .assertIsLikeButtonEnabled(folderToCheck.getName()); } @TestRail (id = "C8303") @@ -98,20 +123,25 @@ public void likeFolder() public void unlikeFile() { + log.info("Precondition: Login as User and Check Created File is Available in User Repository-> User Homes"); + authenticateUsingLoginPage(testUser1); repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8303), fileNameC8303 + " is not available in Repository"); - - socialFeatures.clickLikeButton(fileNameC8303); - - LOG.info("Step 1: Hover over the file Like link."); - Assert.assertEquals(socialFeatures.getLikeButtonEnabledText(fileNameC8303), "Unlike", "Unlike is not displayed"); - Assert.assertEquals(socialFeatures.getNumberOfLikes(fileNameC8303), 1, "The number of likes is not correct"); - - LOG.info("Step 2: Click on Unlike"); - socialFeatures.clickUnlike(fileNameC8303); - Assert.assertEquals(socialFeatures.getNumberOfLikes(fileNameC8303), 0, "The number of likes is not correct"); + repositoryPage + .click_FolderName("User Homes") + .click_FolderName(user) + .assertFileIsDisplayed(fileToCheck.getName()); + + log.info("PreCondition: Click Like Button"); + socialFeatures.clickLikeButton(fileToCheck.getName()); + + log.info("Step 1: Hover over the file Like link."); + Assert.assertEquals(socialFeatures.getLikeButtonEnabledText(fileToCheck.getName()), "Unlike", "Unlike is not displayed"); + Assert.assertEquals(socialFeatures.getNumberOfLikes(fileToCheck.getName()), 1, "The number of likes is not correct"); + + log.info("Step 2: Click on Unlike"); + socialFeatures + .clickUnlike(fileToCheck.getName()) + .assertNoOfLikesVerify(fileToCheck.getName(),0); } @TestRail (id = "C8304") @@ -119,19 +149,24 @@ public void unlikeFile() public void unlikeFolder() { + log.info("Precondition: Login as User and Check Created File is Available in User Repository-> User Homes"); + authenticateUsingLoginPage(testUser1); repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderNameC8304), folderNameC8304 + " is not available in Repository"); - - socialFeatures.clickLikeButton(folderNameC8304); - - LOG.info("Step 1: Hover over the folder Like link."); - Assert.assertEquals(socialFeatures.getLikeButtonEnabledText(folderNameC8304), "Unlike", "Unlike is not displayed"); - Assert.assertEquals(socialFeatures.getNumberOfLikes(folderNameC8304), 1, "The number of likes is not correct"); - - LOG.info("Step 2: Click on Unlike"); - socialFeatures.clickUnlike(folderNameC8304); - Assert.assertEquals(socialFeatures.getNumberOfLikes(folderNameC8304), 0, "The number of likes is not correct"); + repositoryPage + .click_FolderName("User Homes") + .click_FolderName(user) + .assertFileIsDisplayed(folderToCheck.getName()); + + log.info("PreCondition: Click Like Button"); + socialFeatures.clickLikeButton(folderToCheck.getName()); + + log.info("Step 1: Hover over the folder Like link."); + Assert.assertEquals(socialFeatures.getLikeButtonEnabledText(folderToCheck.getName()), "Unlike", "Unlike is not displayed"); + Assert.assertEquals(socialFeatures.getNumberOfLikes(folderToCheck.getName()), 1, "The number of likes is not correct"); + + log.info("Step 2: Click on Unlike"); + socialFeatures + .clickUnlike(folderToCheck.getName()) + .assertNoOfLikesVerify(folderToCheck.getName(),0); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/ManagePermissionTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/ManagePermissionTests.java index 08d503e67a..a6d3396a2e 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/ManagePermissionTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/ManagePermissionTests.java @@ -4,346 +4,382 @@ import java.io.File; -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.alfrescoContent.document.UploadContent; +import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditInAlfrescoPage; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.ManagePermissionsPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.GroupModel; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * Created by Mirela Tifui on 3/20/2017. */ -public class ManagePermissionTests extends ContextAwareWebTest +public class ManagePermissionTests extends BaseTest { - //@Autowired RepositoryPage repositoryPage; - - //@Autowired ManagePermissionsPage managePermissionsPage; - - //@Autowired + UploadContent uploadContent; EditInAlfrescoPage editInAlfrescoPage; - - //@Autowired DocumentDetailsPage documentDetailsPage; - - //@Autowired DeleteDialog deleteDialog; - - private String userName = "0_0C202757User" + RandomData.getRandomAlphanumeric(); - private String userC202758_1 = "C202758_1" + RandomData.getRandomAlphanumeric(); - private String userC202758_2 = "C202758_2" + RandomData.getRandomAlphanumeric(); - private String userC202762_1 = "C202762_1" + RandomData.getRandomAlphanumeric(); - private String userC202762_2 = "C202762_2" + RandomData.getRandomAlphanumeric(); - private String fname1 = "FirstN1"; - private String lname1 = "LastN1"; - private String fname2 = "FirstN2"; - private String lname2 = "LastN2"; - private String path = "/"; + private CreateContentPage createContentPage; + private NewFolderDialog newFolderDialog; private String folderName = "0ManagePermissionsFolder" + RandomData.getRandomAlphanumeric(); - private String pathC202758 = "0ManagePermissionsFolder"; - private String pathForFileC202762 = "0ManagePermissionsFolder"; private String testDataFolder = srcRoot + "testdata" + File.separator; - private String file = "Manage_permissions_test_file"; - private String userC202776 = "C202759_1" + RandomData.getRandomAlphanumeric(); - private String folderC202776 = "C202776Folder" + RandomData.getRandomAlphanumeric(); - private String subFolderC202776 = "C202776Subfolder" + RandomData.getRandomAlphanumeric(); - private String pathfolderC202776 = "/"; - private String pathSubfolder = "C202776Folder"; - private String pathForFile = "C202776Folder/C202776Subfolder"; - private String fileNameC202776 = "C202776File" + RandomData.getRandomAlphanumeric(); - private String fileContent = "C202776 Test file content"; - private String C202764user = "C202764User"; - private String groupName = "C202762GroupName"; - - private String fileNameC202762 = "C202762_File" + RandomData.getRandomAlphanumeric(); - - @BeforeClass - public void setupTest() - { - userService.create(adminUser, adminPassword, userName, password, userName + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, userC202758_1, password, userC202758_1 + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, userC202758_2, password, userC202758_2 + "@test.com", fname2, lname2); - userService.create(adminUser, adminPassword, userC202776, password, userC202776 + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, C202764user, password, C202764user + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, userC202762_1, password, userC202762_1 + "@test.com", fname1, lname1); - userService.create(adminUser, adminPassword, userC202762_2, password, userC202762_2 + "@test.com", fname2, lname2); - groupService.createGroup(adminUser, adminPassword, groupName); - groupService.addUserToGroup(adminUser, adminPassword, groupName, userC202762_1); - groupService.addUserToGroup(adminUser, adminPassword, groupName, userC202762_2); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - contentService.createFolderInRepository(adminUser, adminPassword, folderC202776, pathfolderC202776); - contentService.createFolderInRepository(adminUser, adminPassword, subFolderC202776, pathSubfolder); - contentService.createDocumentInRepository(adminUser, adminPassword, pathForFile, CMISUtil.DocumentType.TEXT_PLAIN, fileNameC202776, fileContent); - contentService.createDocumentInRepository(adminUser, adminPassword, pathForFileC202762, CMISUtil.DocumentType.TEXT_PLAIN, fileNameC202762, fileContent); + private UserModel testUser1; + private UserModel testUser2; + private FolderModel testFolder; + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private String subFolder = "Subfolder" + RandomData.getRandomAlphanumeric(); + + @BeforeMethod + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + managePermissionsPage = new ManagePermissionsPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + editInAlfrescoPage = new EditInAlfrescoPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + createContentPage = new CreateContentPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().createFolder(testFolder).assertThat().existsInRepo(); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userName); - userService.delete(adminUser, adminPassword, userC202758_1); - userService.delete(adminUser, adminPassword, userC202758_2); - userService.delete(adminUser, adminPassword, userC202776); - userService.delete(adminUser, adminPassword, C202764user); - userService.delete(adminUser, adminPassword, userC202762_1); - userService.delete(adminUser, adminPassword, userC202762_2); - - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + userC202758_1); - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + userC202758_2); - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + userC202776); - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + C202764user); - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + userC202762_1); - contentService.deleteTreeByPath(adminUser, adminPassword, "User Homes/" + userC202762_2); - } + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(),ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + } @TestRail (id = "C202757") @Test - public void managePermissionOption() - { - setupAuthenticatedSession(userName, password); - String identifier = fname1 + " " + lname1; + public void managePermissionOption() { - LOG.info("Step 1: Click on Repository link in the toolbar"); - repositoryPage.navigateByMenuBar(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); + authenticateUsingLoginPage(testUser1); + log.info("Step 1: Click on Repository link in the toolbar"); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); - LOG.info("Step 2: Navigate to " + userName + " folder;"); - repositoryPage.clickOnFolderName("User Homes"); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(userName), userName + " is not displayed in Repository Page"); + log.info("Step 2: Navigate to 'User Homes' folder"); + repositoryPage + .click_FolderName("User Homes") + .assertFileIsDisplayed(testUser1.getUsername()); - LOG.info("Step 3: Click Manage Permissions link in More menu for user's home folder;"); - repositoryPage.selectItemAction(userName, ItemActions.MANAGE_REPO_PERMISSIONS); + log.info("Step 3: Click Manage Permissions link in More menu for user's home folder;"); + repositoryPage + .select_ItemsAction(testUser1.getUsername(), ItemActions.MANAGE_REPO_PERMISSIONS); - LOG.info("Step 4: Verify Manage Permissions page"); + log.info("Step 4: Verify Manage Permissions page"); + Assert.assertTrue(managePermissionsPage.isInheritPermissionsButtonDisplayed(),"Inherit Permissions button is not displayed"); Assert.assertTrue(managePermissionsPage.isAddUserGroupButtonDisplayed(), "Add User/Group button is not displayed"); Assert.assertTrue(managePermissionsPage.isTheSaveButtonDisplayed(), "The Save button is not displayed"); Assert.assertTrue(managePermissionsPage.isCancelButtonDisplayed(), "The Cancel button is not displayed"); Assert.assertTrue(managePermissionsPage.isLocallySetPermissionsListDisplayed(), "Locally Set Permissions is not displayed on the Manage Permissions page"); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifier).contains("All"), "All Role is not available for " + identifier); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser1.getUsername()).contains("All"), "All Role is not available for " +testUser1.getUsername()); Assert.assertTrue(managePermissionsPage.getRowDetails("ROLE_OWNER").contains("All"), "All Role is not available for ROLE_OWNER"); - Assert.assertTrue(managePermissionsPage.isDeleteButtonAvailable(identifier), "Delete button is not available for " + identifier); - //Assert.assertTrue(managePermissionsPage.isDeleteButtonAvailable("ROLE_OWNER"), "Delete button is not available for ROLE_OWNER"); + Assert.assertTrue(managePermissionsPage.isDeleteButtonAvailable(testUser1.getUsername()), "Delete button is not available for " + testUser1.getUsername()); - cleanupAuthenticatedSession(); } @TestRail (id = "C202758") @Test - public void savingChanges() - { - String identifierUser1 = fname1 + " " + lname1; - String identifierUser2 = fname2 + " " + lname2; - LOG.info("Preconditions: "); - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigate(); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(userC202758_1); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(userC202758_1); - managePermissionsPage.clickRoleButton(identifierUser1); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(userC202758_2); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(userC202758_2); - managePermissionsPage.clickRoleButton(identifierUser2); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickSave(); - cleanupAuthenticatedSession(); - - LOG.info("Step 1: Click on Repository link in the toolbar"); - setupAuthenticatedSession(userC202758_1, password); - repositoryPage.navigateByMenuBar(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - - LOG.info("Step 2: Click Manage Permissions link in More menu for " + folderName + " folder"); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser1).contains("Coordinator")); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser2).contains("Coordinator")); - - LOG.info("Step 3: Change User2 role to \"Consumer\""); - managePermissionsPage.clickRoleButton(identifierUser2); - managePermissionsPage.selectRole("Consumer"); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser2).contains("Consumer")); - - LOG.info("Step 4: Click Save"); - managePermissionsPage.clickSave(); - - LOG.info("Step 5: Upload file into " + folderName); - contentService.uploadFileInRepository(userC202758_1, password, pathC202758, testDataFolder + file + ".docx"); - - LOG.info("Step 6: Log in User2"); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(userC202758_2, password); - repositoryPage.navigateByMenuBar(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - - LOG.info("Step 7: Open " + folderName + " folder and try to edit/delete uploaded file"); - repositoryPage.clickOnFolderName(folderName); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(file), file + " is not displayed in repository"); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.DELETE_DOCUMENT), "Delete Document is available for " + file); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.EDIT_IN_GOOGLE_DOCS), "Edit in Google Docs™ is available for " + file); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.EDIT_IN_MICROSOFT_OFFICE), "Edit in Microsoft Office™ is available for " + file); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.EDIT_PROPERTIES), "Edit Properties is available for " + file); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.EDIT_OFFLINE), "Edit Offline is available for " + file); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.UPLOAD_NEW_VERSION), "Upload New Version is available for " + file); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(file, ItemActions.MANAGE_REPO_PERMISSIONS), - "Manage Permissions is available for " + file); - cleanupAuthenticatedSession(); + public void savingChanges() { + + log.info("Precondition: Assign Role as Coordinator for" +testUser1 +testUser2 +"for the created folder" ); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + managePermissionsPage + .clickAddUserGroupButton() + .sendSearchInput(testUser1.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser1.getUsername()) + .clickRoleButton(testUser1.getUsername()) + .select_Role("Coordinator") + .clickAddUserGroupButton() + .sendSearchInput(testUser2.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser2.getUsername()) + .clickRoleButton(testUser2.getUsername()) + .select_Role("Coordinator") + .clickSave(); + + log.info("Step 1: Click on Repository link in the toolbar"); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 2: Click Manage Permissions link in More menu for " + testFolder + " folder"); + repositoryPage + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser1.getUsername()).contains("Coordinator")); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser2.getUsername()).contains("Coordinator")); + + log.info("Step 3: Change User2 role to \"Consumer\""); + managePermissionsPage + .clickRoleButton(testUser2.getUsername()) + .select_Role("Consumer"); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser2.getUsername()).contains("Consumer")); + + log.info("Step 4: Click Save"); + managePermissionsPage + .clickSave(); + + log.info("Step 5: Upload file into " +testFolder); + repositoryPage + .navigateByMenuBar() + .isFileNameDisplayed(testFolder.getName()); + repositoryPage + .clickOnFolderName(testFolder.getName()); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isFileNameDisplayed(testFile); + + log.info("Step 6: Log in User2"); + authenticateUsingLoginPage(testUser2); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 7: Open " + folderName + " folder and try to edit/delete uploaded file"); + repositoryPage + .clickOnFolderName(testFolder.getName()) + .assertFileIsDisplayed(testFile); + repositoryPage + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.DELETE_DOCUMENT) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_PROPERTIES) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_IN_GOOGLE_DOCS) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_IN_MICROSOFT_OFFICE) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_OFFLINE) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.UPLOAD_NEW_VERSION) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.MANAGE_REPO_PERMISSIONS); } @TestRail (id = "C202776") @Test - public void inheritPermissionsButton() - { - String identifierUser1 = fname1 + " " + lname1; - String updateContent = "Updated test content for C202776"; - - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigate(); - repositoryPage.selectItemAction(folderC202776, ItemActions.MANAGE_REPO_PERMISSIONS); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(userC202776); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(userC202776); - managePermissionsPage.clickRoleButton(identifierUser1); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickSave(); - cleanupAuthenticatedSession(); - - LOG.info("Step 1: Navigate to Repository"); - setupAuthenticatedSession(userC202776, password); - repositoryPage.navigateByMenuBar(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - - LOG.info("Step 2: On the Repository page click on TestFolder"); - repositoryPage.clickOnFolderName(folderC202776); - - LOG.info("Step 3: Mouseover TestSubfolder and click on Manage Permissions action"); - repositoryPage.selectItemAction(subFolderC202776, ItemActions.MANAGE_REPO_PERMISSIONS); - - LOG.info("Step 4: Check inherited permissions"); - Assert.assertTrue(managePermissionsPage.getInheritedPermissions(identifierUser1).contains("Coordinator")); - - LOG.info("Step 5: Return to Repository, TestSubfolder and check available actions for TestFile"); - repositoryPage.navigate(); - repositoryPage.clickOnFolderName(folderC202776); - repositoryPage.clickOnFolderName(subFolderC202776); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202776, ItemActions.EDIT_IN_GOOGLE_DOCS), "Edit in Google Docs™ is not available for " + fileNameC202776); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202776, ItemActions.EDIT_PROPERTIES), "Edit Properties is not available for " + fileNameC202776); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202776, ItemActions.EDIT_IN_ALFRESCO), "Edit in Alfresco is not available for " + fileNameC202776); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202776, ItemActions.EDIT_OFFLINE), "Edit Offline is not available for " + fileNameC202776); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202776, ItemActions.DELETE_DOCUMENT), "Delete Document is not available for " + fileNameC202776); - - LOG.info("Step 6: Edit TestFile and save changes"); - repositoryPage.selectItemAction(fileNameC202776, ItemActions.EDIT_IN_ALFRESCO); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Edit in Alfresco Share", "User is not on Edit In Alfresco page"); - editInAlfrescoPage.typeContent(updateContent); - editInAlfrescoPage.clickSaveButton(); - repositoryPage.clickOnFile(fileNameC202776); - Assert.assertEquals(documentDetailsPage.getContentText(), updateContent, fileNameC202776 + " was not updated"); - cleanupAuthenticatedSession(); + public void inheritPermissionsButton() { + + String updatedContent = "Updated test content for C202776"; + + log.info("PreCondition: Set user1 Rights to Coordinator for" +testFolder); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + managePermissionsPage + .clickAddUserGroupButton() + .sendSearchInput(testUser1.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser1.getUsername()) + .clickRoleButton(testUser1.getUsername()) + .select_Role("Coordinator") + .clickSave(); + + log.info("PreCondition: Login with testUser1 & Create"+ subFolder +"inside" + testFolder +"and upload testFile inside SubFolder"); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .clickOnFolderName(testFolder.getName()) + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(subFolder) + .clickSave(); + repositoryPage + .clickOnFolderName(subFolder); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isFileNameDisplayed(testFile); + + log.info("Step 1: Navigate to Repository"); + repositoryPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 2: On the Repository page click on TestFolder"); + repositoryPage + .clickOnFolderName(testFolder.getName()); + + log.info("Step 3: Mouseover TestSubfolder and click on Manage Permissions action"); + repositoryPage + .select_ItemsAction(subFolder, ItemActions.MANAGE_REPO_PERMISSIONS); + + log.info("Step 4: Check inherited permissions"); + Assert.assertTrue(managePermissionsPage.getInheritedPermissions(testUser1.getUsername()).contains("Coordinator")); + + log.info("Step 5: Return to Repository, TestSubfolder and check available actions for TestFile"); + repositoryPage + .navigateByMenuBar() + .clickOnFolderName(testFolder.getName()) + .clickOnFolderName(subFolder); + Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(testFile, ItemActions.EDIT_IN_GOOGLE_DOCS), "Edit in Google Docs™ is not available for "+testFile ); + Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(testFile, ItemActions.EDIT_PROPERTIES), "Edit Properties is not available for "+testFile ); + Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(testFile, ItemActions.EDIT_IN_ALFRESCO), "Edit in Alfresco is not available for "+testFile ); + Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(testFile, ItemActions.EDIT_OFFLINE), "Edit Offline is not available for "+testFile ); + Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(testFile, ItemActions.DELETE_DOCUMENT), "Delete Document is not available for "+testFile ); + + log.info("Step 6: Edit TestFile and save changes"); + repositoryPage + .select_ItemsAction(testFile, ItemActions.EDIT_IN_ALFRESCO) + .assertBrowserPageTitleIs("Alfresco » Edit in Alfresco Share"); + editInAlfrescoPage + .typeContent(updatedContent) + .clickSaveButton(); + repositoryPage + .clickOnFile(testFile); + documentDetailsPage + .assertFileContentEquals(updatedContent); } @TestRail (id = "C202764") @Test public void deleteUserWithARoleAssigned() { - LOG.info("Preconditions: "); - String identifierUser1 = fname1 + " " + lname1; - setupAuthenticatedSession(adminUser, adminPassword); - repositoryPage.navigateByMenuBar(); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - managePermissionsPage.clickAddUserGroupButton(); - managePermissionsPage.sendSearchInput(C202764user); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(C202764user); - managePermissionsPage.clickSave(); - - LOG.info("Step 1: Click on 'Delete' icon in from of the user group"); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - Assert.assertTrue(managePermissionsPage.getRowDetails(identifierUser1).contains(identifierUser1)); - managePermissionsPage.deleteUserFromPermissionsList(identifierUser1); - getBrowser().refresh(); - + log.info("Preconditions: "); + repositoryPage + .navigateByMenuBar() + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + managePermissionsPage + .clickAddUserGroupButton() + .sendSearchInput(testUser1.getUsername()) + .clickSearchButton() + .clickAddButtonForUser(testUser1.getUsername()) + .clickSave(); + + log.info("Step 1: Click on 'Delete' icon in from of the user group"); + repositoryPage.select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + Assert.assertTrue(managePermissionsPage.getRowDetails(testUser1.getUsername()).contains(testUser1.getUsername())); + + managePermissionsPage.deleteUserFromPermissionsList(testUser1.getUsername()); Assert.assertEquals(managePermissionsPage.getLocallySetPermissionsTextWhenNoUsersAreAdded(), "No permissions set.", "Permissions are displayed"); + managePermissionsPage.clickSave(); - cleanupAuthenticatedSession(); - - LOG.info("Step 2: Check that " + C202764user + " is not able to edit or manage permissions for " + folderName); - setupAuthenticatedSession(C202764user, password); - repositoryPage.navigateByMenuBar(); - repositoryPage.mouseOverContentItem(folderName); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(folderName, ItemActions.MANAGE_REPO_PERMISSIONS)); - Assert.assertFalse(repositoryPage.isActionAvailableForLibraryItem(folderName, ItemActions.DELETE_FOLDER)); - cleanupAuthenticatedSession(); + + log.info("Step 2: Check that " + testUser1.getUsername() + " is not able to edit or manage permissions for " + testFolder); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigateByMenuBar() + .mouseOverContentItem(testFolder.getName()); + repositoryPage + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFolder.getName(),ItemActions.MANAGE_REPO_PERMISSIONS) + .assertActionItem_Not_AvailableInTheRepositoryLibraryItems(testFolder.getName(),ItemActions.DELETE_FOLDER); } @TestRail (id = "C202762") @Test - public void addGroup() - { - setupAuthenticatedSession(adminUser, adminPassword); - - LOG.info("Step 1: Click on Repository link in the toolbar"); - repositoryPage.navigateByMenuBar(); -// Assert.assertEquals(repositoryPage.getPageTitle(), "Alfresco » Repository Browser", "User is not on the Repository Page"); - - LOG.info("Step 2: Click Manage Permissions link in More menu for \"Test\" folder"); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - - LOG.info("Step 3: Click Add User/Group button"); - managePermissionsPage.clickAddUserGroupButton(); - Assert.assertTrue(managePermissionsPage.isAddUsersGroupsWindowDisplayed(), "Add users groups window is not displayed"); - - LOG.info("Step 4, 5 & 6: Add " + groupName); - managePermissionsPage.sendSearchInput(groupName); - managePermissionsPage.clickSearchButton(); - managePermissionsPage.clickAddButtonForUser(groupName); - Assert.assertTrue(managePermissionsPage.getRowDetails(groupName).contains("Consumer")); - - LOG.info("Step 7&8 & 9 : Change role to Coordinator, save changes and check saved changes"); - managePermissionsPage.clickRoleButton(groupName); - managePermissionsPage.selectRole("Coordinator"); - managePermissionsPage.clickSave(); - repositoryPage.selectItemAction(folderName, ItemActions.MANAGE_REPO_PERMISSIONS); - Assert.assertTrue(managePermissionsPage.getRowDetails(groupName).contains(groupName), groupName + " is not available in Locally Set Permissions list "); - Assert.assertTrue(managePermissionsPage.getRowDetails(groupName).contains("Coordinator"), "Coordinator is not available in Locally Set Permissions list for " + groupName); - - LOG.info("Step 10: Log in User 1"); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(userC202762_1, password); - repositoryPage.navigateByMenuBar(); - repositoryPage.mouseOverContentItem(folderName); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(folderName, ItemActions.MANAGE_REPO_PERMISSIONS), "Manage Permissions is not available for " + folderName + " for " + userC202762_1); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(folderName, ItemActions.DELETE_FOLDER), "Delete Folder is not available for " + folderName + " for " + userC202762_1); - repositoryPage.clickOnFolderName(folderName); - repositoryPage.mouseOverContentItem(fileNameC202762); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202762, ItemActions.DELETE_DOCUMENT), "Delete Document is not available for " + fileNameC202762); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202762, ItemActions.EDIT_IN_ALFRESCO), "Edit in Alfresco is not available for " + fileNameC202762); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202762, ItemActions.EDIT_OFFLINE), "Edit Offline is not available for " + fileNameC202762); - Assert.assertTrue(repositoryPage.isActionAvailableForLibraryItem(fileNameC202762, ItemActions.EDIT_IN_GOOGLE_DOCS), "Edit in Google Docs™ is not available for " + fileNameC202762); - - repositoryPage.selectItemAction(fileNameC202762, ItemActions.DELETE_DOCUMENT); - deleteDialog.confirmDeletion(); - - Assert.assertFalse(repositoryPage.isContentNameDisplayed(fileNameC202762), fileNameC202762 + " is still displayed in " + folderName); - cleanupAuthenticatedSession(); + public void addGroup() { + GroupModel testGroup = new GroupModel(RandomData.getRandomAlphanumeric()); + dataGroup.usingAdmin().createGroup(testGroup); + dataGroup.usingAdmin().addListOfUsersToGroup(testGroup,testUser1,testUser2); + + repositoryPage + .navigateByMenuBar() + .clickOnFolderName(testFolder.getName()) + .click_CreateButton() + .click_PlainTextLink(); + createContentPage + .typeName(testFile).clickCreate(); + + log.info("Step 1: Click on Repository link in the toolbar"); + repositoryPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » Repository Browser"); + + log.info("Step 2: Click Manage Permissions link in More menu for \"Test\" folder"); + repositoryPage + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + + log.info("Step 3: Click Add User/Group button"); + managePermissionsPage + .clickAddUserGroupButton() + .assertIsAddUserGroupWindowDisplayed(); + + log.info("Step 4, 5 & 6: Add " + "groupName"); + managePermissionsPage + .sendSearchInput(testGroup.getDisplayName()) + .clickSearchButton() + .clickAddButtonForUser(testGroup.getDisplayName()); + Assert.assertTrue(managePermissionsPage.getRowDetails(testGroup.getDisplayName()).contains("Consumer")); + + log.info("Step 7&8 & 9 : Change role to Coordinator, save changes and check saved changes"); + managePermissionsPage + .clickRoleButton(testGroup.getDisplayName()) + .select_Role("Coordinator") + .clickSave(); + repositoryPage + .select_ItemsAction(testFolder.getName(), ItemActions.MANAGE_REPO_PERMISSIONS); + + Assert.assertTrue(managePermissionsPage.getRowDetails(testGroup.getDisplayName()).contains(testGroup.getDisplayName()), + testGroup.getDisplayName() + " is not available in Locally Set Permissions list "); + Assert.assertTrue(managePermissionsPage.getRowDetails(testGroup.getDisplayName()).contains("Coordinator"), + "Coordinator is not available in Locally Set Permissions list for " + testGroup.getDisplayName()); + + log.info("Step 10: Log in User 1"); + authenticateUsingLoginPage(testUser1); + + log.info("Step 11: Open created Folder and try to delete uploaded file"); + repositoryPage + .navigateByMenuBar() + .mouseOverContentItem(testFolder.getName()); + repositoryPage + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFolder.getName(),ItemActions.MANAGE_REPO_PERMISSIONS) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFolder.getName(),ItemActions.DELETE_FOLDER); + repositoryPage + .clickOnFolderName(testFolder.getName()) + .mouseOverContentItem(testFile); + repositoryPage + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.DELETE_DOCUMENT) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_IN_ALFRESCO) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile,ItemActions.EDIT_OFFLINE) + .assertActionItem_AvailableInTheRepositoryLibraryItems(testFile, ItemActions.EDIT_IN_GOOGLE_DOCS); + repositoryPage + .select_ItemsAction(testFile, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + log.info("Step 12: Verify file is Deleted"); + repositoryPage + .assertFileIsNotDisplayed(testFile); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/RepositoryTagTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/RepositoryTagTests.java index c724333ec9..7efcc1e5f6 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/RepositoryTagTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/repository/additionalActions/RepositoryTagTests.java @@ -1,246 +1,286 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.repository.additionalActions; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import java.util.ArrayList; -import java.util.Collections; - -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.alfrescoContent.RepositoryPage; + import org.alfresco.po.share.alfrescoContent.organizingContent.taggingAndCategorizingContent.SelectDialog; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; +import org.alfresco.po.share.site.DocumentLibraryPage2; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; +import org.apache.commons.lang.RandomStringUtils; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class RepositoryTagTests extends ContextAwareWebTest +@Slf4j +public class RepositoryTagTests extends BaseTest { - private final String user = String.format("C8266TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileNameC8266 = "C8266 file"; - private final String fileNameC8290 = "C8290 file"; - private final String fileNameC8278 = "C8278 file"; - private final String fileNameC8291 = "C8291 file"; - private final String fileNameC8300 = "C8300 file"; - private final String fileContent = "test file content"; - private final String path = "User Homes/" + user; - private final String folderName = "C8167 Folder"; - private final String tagC8266 = String.format("tagNameFile-C8266-%s", RandomData.getRandomAlphanumeric()); - private final String tagC8267 = String.format("tag-C8267%s", RandomData.getRandomAlphanumeric()); - private final String tagC8278 = String.format("tag-C8278%s", RandomData.getRandomAlphanumeric()); - private final String tagC8290 = String.format("tag-C8290%s", RandomData.getRandomAlphanumeric()); + private final String tagC8266 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private final String anothertagC8266 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private final String tagC8267 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private final String tagC8278 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + //@Autowired - private RepositoryPage repositoryPage; + //private RepositoryPage repositoryPage; //@Autowired private EditPropertiesDialog editPropertiesDialog; //@Autowired private SelectDialog selectDialog; + private RepositoryPage repositoryPage; + private final String password = "password"; + private final String user = String.format("TestUser%s", RandomData.getRandomAlphanumeric()); + private UserModel testUser1; + private FolderModel folderToCheck; + FileModel fileToCheck; + private DocumentLibraryPage2 documentLibraryPage; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - } - @AfterClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(getAdminUser()); + + folderToCheck = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingUserHome(user).createFolder(folderToCheck).assertThat().existsInRepo(); + + fileToCheck = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingUserHome(user).createFile(fileToCheck).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); + + editPropertiesDialog = new EditPropertiesDialog(webDriver); + selectDialog = new SelectDialog(webDriver); + documentLibraryPage = new DocumentLibraryPage2(webDriver); + repositoryPage = new RepositoryPage(webDriver); + + } + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, path); + deleteUsersIfNotNull(testUser1); + log.info("Delete the Created Folder from Admin Page"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage.select_ItemsAction(user, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } @TestRail (id = "C8266") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void createTagForFile() - { - // Preconditions - String deletePath = path + "/" + fileNameC8266; - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8266, fileContent); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8266), fileNameC8266 + " is not available in Repository"); - - LOG.info("STEP1: Hover over one tag from the content name"); - repositoryPage.mouseOverNoTags(fileNameC8266); - getBrowser().waitInSeconds(2); - - LOG.info("STEP2: Click \"Tag\" icon"); - repositoryPage.clickEditTagIcon(fileNameC8266); - assertTrue(repositoryPage.isEditTagInputFieldDisplayed(), fileNameC8266 + " -> Edit tag text input field is displayed."); - - LOG.info("STEP3: Type any tag name in the input field and click \"Save\" link"); - repositoryPage.typeTagName(tagC8266); - repositoryPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagC8266.toLowerCase())); - assertEquals(repositoryPage.getTags(fileNameC8266), tagsList.toString(), tagC8266 + " -> tags="); - contentService.deleteContentByPath(adminUser, adminPassword, deletePath); + public void createTagForFile() { + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .click_FolderName(user); + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over one tag from the content name"); + repositoryPage + .mouseOverNoTags(fileToCheck.getName()); + log.info("STEP2: Click \"Edit Tag\" icon"); + documentLibraryPage.usingContent(fileToCheck) + .clickTagEditIcon(); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + documentLibraryPage.usingContent(fileToCheck) + .setTag(tagC8266) + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(tagC8266); + } + @TestRail (id = "C8267") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void createTagForFolder() { - String deletePath = path + "/" + folderName; - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(folderName), folderName + " is not available in Repository"); - - LOG.info("STEP1: Hover over the text \"No Tags\" from the folder"); - repositoryPage.mouseOverNoTags(folderName); - assertTrue(repositoryPage.isEditTagIconDisplayed(folderName), folderName + " -> \"Edit Tag\" icon is displayed"); - - LOG.info("STEP2: Click \"Edit Tag\" icon"); - repositoryPage.clickEditTagIcon(folderName); - assertTrue(repositoryPage.isEditTagInputFieldDisplayed(), folderName + " -> Edit tag text input field is displayed."); - - LOG.info("STEP3: Type any tag name in the input field and click \"Save\" link"); - repositoryPage.typeTagName(tagC8267); - repositoryPage.clickEditTagLink("Save"); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagC8267.toLowerCase())); - assertEquals(repositoryPage.getTags(folderName), tagsList.toString(), folderName + " -> tags="); - - contentService.deleteContentByPath(adminUser, adminPassword, deletePath); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .click_FolderName(user); + repositoryPage + .assertFileIsDisplayed(folderToCheck.getName()); + log.info(" Hover over one tag from the content name"); + repositoryPage + .mouseOverNoTags(folderToCheck.getName()); + log.info("Click Edit Tag icon"); + documentLibraryPage.usingContent(folderToCheck) + .clickTagEditIcon(); + repositoryPage + .assertEditTagInputFieldDisplayed(folderToCheck.getName()); + log.info("Add tag and click save"); + documentLibraryPage.usingContent(folderToCheck) + .setTag(tagC8267) + .clickSave(); + documentLibraryPage.usingContent(folderToCheck) + .assertTagIsDisplayed(tagC8267); + } @TestRail (id = "C8278") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void addExistingTag() - { - String deletePath = path + "/" + fileNameC8278; - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8278, fileContent); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8278), fileNameC8278 + " is not available in Repository"); - LOG.info("STEP1: Hover over the content created in the preconditions"); - LOG.info("STEP2: Click \"Edit Properties\" option"); - repositoryPage.selectItemAction(fileNameC8278, ItemActions.EDIT_PROPERTIES); - assertEquals(editPropertiesDialog.getDialogTitle(), String.format(language.translate("editPropertiesDialog.title"), fileNameC8278), - "Displayed dialog="); - assertTrue(editPropertiesDialog.isSelectTagsButtonDisplayed(), "'Select' tag button is displayed."); - - LOG.info("STEP3: Click \"Select\" button"); - editPropertiesDialog.clickSelectTags(); - assertEquals(selectDialog.getDialogTitle(), language.translate("selectDialog.title"), "Displayed dialog="); - - LOG.info("STEP4: Pick tag from the available tags list and click \"Add\" then click OK"); - selectDialog.typeTag(tagC8278.toLowerCase()); - getBrowser().waitInSeconds(1); - selectDialog.clickCreateNewIcon(); - selectDialog.clickOk(); - assertTrue(editPropertiesDialog.isTagSelected(tagC8278.toLowerCase()), "'Tags:' section="); - - LOG.info("STEP5: Click \"Save\" button"); - editPropertiesDialog.clickSave(); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagC8278.toLowerCase())); - assertEquals(repositoryPage.getTags(fileNameC8278), tagsList.toString(), fileNameC8278 + " -> tags="); - contentService.deleteContentByPath(adminUser, adminPassword, deletePath); - } + public void addExistingTag() { + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .click_FolderName(user); + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over one tag from the content name"); + repositoryPage + .mouseOverNoTags(fileToCheck.getName()); + log.info("STEP2: Click Edit Properties option and click on select button"); + documentLibraryPage.usingContent(fileToCheck) + .clickEditProperties() + .clickSelectTags(); + log.info("STEP4: Pick tag from the available tags list and click \"Add\" then click OK"); + selectDialog.typeTag(tagC8278.toLowerCase()) + .clickCreateNewIcon() + .assertTagIsSelected(tagC8278.toLowerCase()) + .clickOk(); + log.info("STEP5: Click \"Save\" button"); + editPropertiesDialog + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(tagC8278); +} + @TestRail (id = "C8290") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void editTag() - { - // Preconditions - String deletePath = path + "/" + fileNameC8290; - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8290, fileContent); - String pathToItem = path + "/" + fileNameC8290; - contentAction.addSingleTag(adminUser, adminPassword, pathToItem, "testtag"); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8290), fileNameC8278 + " is not available in Repository"); - - LOG.info("STEP1: Hover over the tag(s) from the content"); - LOG.info("STEP2: Click \"Edit Tag\" icon"); - repositoryPage.mouseOverTags(fileNameC8290); - repositoryPage.clickEditTagIcon(fileNameC8290); - assertTrue(repositoryPage.isEditTagInputFieldDisplayed(), fileNameC8290 + " -> 'Edit Tag' text input field is displayed."); - - LOG.info("STEP3: Click on any tag and type a valid tag name"); - repositoryPage.editTag("testtag", tagC8290.toLowerCase()); - - LOG.info("STEP4: Click \"Save\" link and verify the content tags"); - repositoryPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - assertTrue(repositoryPage.getTags(fileNameC8290).contains(tagC8290.toLowerCase())); - contentService.deleteContentByPath(adminUser, adminPassword, deletePath); + public void editTag() throws Exception { + String originalTag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + String editedTag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + setAuthorizationRequestHeader(getRestApi().authenticateUser(getAdminUser())) + .withCoreAPI().usingResource(fileToCheck).addTags(originalTag); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .click_FolderName(user); + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over the tag(s) from the content"); + repositoryPage + .mouseOverTags(fileToCheck.getName()); + log.info("STEP2: Click \"Edit Tag\" icon"); + repositoryPage + .clickEditTagIcon(fileToCheck.getName()); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + log.info("STEP3: Click on any tag and type a valid tag name"); + repositoryPage + .editTag(originalTag, editedTag); + log.info("STEP4: Click \"Save\" link and verify the content tags"); + documentLibraryPage.usingContent(fileToCheck) + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(editedTag) + .assertTagIsNotDisplayed(originalTag); } @TestRail (id = "C8291") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void removeTag() - { - // Preconditions - String deletePath = path + "/" + fileNameC8291; - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8291, fileContent); - String pathToItem = path + "/" + fileNameC8291; - String tagC8291 = "tagc8291"; - contentAction.addSingleTag(adminUser, adminPassword, pathToItem, tagC8291); - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8291), fileNameC8291 + " is not available in Repository"); - - LOG.info("STEP1: Hover over the tag from " + fileNameC8291); - repositoryPage.mouseOverTags(fileNameC8291); - assertTrue(repositoryPage.isEditTagIconDisplayed(fileNameC8291), fileNameC8291 + " -> 'Edit Tag' icon is displayed."); - - LOG.info("STEP2: Click \"Edit Tags\" icon"); - repositoryPage.clickEditTagIcon(fileNameC8291); - assertTrue(repositoryPage.isEditTagInputFieldDisplayed(), fileNameC8291 + " -> 'Edit Tag' text input field is displayed."); - - LOG.info("STEP3: Hover over the tag and click 'Remove' icon"); - repositoryPage.removeTag(tagC8291); - - LOG.info("STEP4: Click 'Save' link"); - repositoryPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - assertTrue(repositoryPage.isNoTagsTextDisplayed(fileNameC8291), fileNameC8291 + " -> " + tagC8291 + " is removed."); - contentService.deleteContentByPath(adminUser, adminPassword, deletePath); + public void removeTag() throws Exception { + String originalTag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + setAuthorizationRequestHeader(getRestApi().authenticateUser(getAdminUser())) + .withCoreAPI().usingResource(fileToCheck).addTags(originalTag); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .click_FolderName(user); + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over the tag(s) from the content"); + repositoryPage + .mouseOverTags(fileToCheck.getName()); + log.info("STEP2: Click \"Edit Tag\" icon"); + repositoryPage + .clickEditTagIcon(fileToCheck.getName()); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + log.info("STEP3: Hover over the tag and click 'Remove' icon"); + repositoryPage.removeTag(originalTag); + log.info("STEP4: Click 'Save' link"); + documentLibraryPage.usingContent(fileToCheck) + .clickSave(); + repositoryPage.assertIsNoTagsTextDisplayed(fileToCheck.getName()); + } @TestRail (id = "C8300") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void updateTags() - { - // Preconditions - String deletePath = path + "/" + fileNameC8300; - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8300, fileContent); - String tagC8300 = "tagc8300"; - repositoryPage.navigate(); - repositoryPage.clickFolderFromExplorerPanel("User Homes"); - repositoryPage.clickOnFolderName(user); - Assert.assertTrue(repositoryPage.isContentNameDisplayed(fileNameC8300), fileNameC8300 + " is not available in Repository"); - - LOG.info("STEP1: Hover over the text \"No Tags\" from " + fileNameC8300); - repositoryPage.mouseOverNoTags(fileNameC8300); - assertTrue(repositoryPage.isEditTagIconDisplayed(fileNameC8300), fileNameC8300 + " -> \"Edit Tag\" icon is displayed"); - - LOG.info("STEP2: Click \"Edit Tag\" icon"); - repositoryPage.clickEditTagIcon(fileNameC8300); - assertTrue(repositoryPage.isEditTagInputFieldDisplayed(), fileNameC8300 + " -> Edit tag text input field is displayed."); - - LOG.info("STEP3: Add a tag"); - repositoryPage.typeTagName(tagC8300); - - LOG.info("STEP3: Click 'Remove' icon"); - repositoryPage.removeTag(tagC8300.toLowerCase()); - - LOG.info("STEP4: Click 'Save' link"); - repositoryPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - getBrowser().waitInSeconds(2); - assertTrue(repositoryPage.isNoTagsTextDisplayed(fileNameC8300), fileNameC8300 + " -> " + tagC8300 + " is removed."); - contentService.deleteContentByPath(adminUser, adminPassword, deletePath); + public void updateTags() throws Exception { + setAuthorizationRequestHeader(getRestApi().authenticateUser(getAdminUser())) + .withCoreAPI().usingResource(fileToCheck).addTags(tagC8266); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName("User Homes"); + repositoryPage + .click_FolderName(user); + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info(" Hover over one tag from the content name"); + repositoryPage + .mouseOverTags(fileToCheck.getName()); + log.info(" Click Edit Tag icon"); + documentLibraryPage.usingContent(fileToCheck) + .clickTagEditIcon(); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + log.info(" Add another tag"); + documentLibraryPage.usingContent(fileToCheck) + .setTag(anothertagC8266) + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(anothertagC8266); + log.info("S Click 'Remove' icon"); + documentLibraryPage.usingContent(fileToCheck) + .clickTagEditIcon(); + repositoryPage + .removeTag(tagC8266); + log.info(" Click 'Save' link"); + documentLibraryPage.usingContent(fileToCheck) + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(anothertagC8266) + .assertTagIsNotDisplayed(tagC8266); + } + } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/NavigationPanelTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/NavigationPanelTests.java index e972c2bbd9..826c245466 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/NavigationPanelTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/NavigationPanelTests.java @@ -1,73 +1,108 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; +import lombok.extern.slf4j.Slf4j; + +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.alfrescoContent.pageCommon.DocumentsFilters; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; + +import org.apache.commons.lang.RandomStringUtils; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class NavigationPanelTests extends ContextAwareWebTest +public class NavigationPanelTests extends BaseTest { - private final String uniqueId = RandomData.getRandomAlphanumeric(); - private final String folderName = "folder-C7928-" + uniqueId; - private final String path = "Shared/"; - private final String tag = "tag-" + uniqueId.toLowerCase(); - //@Autowired private DocumentsFilters documentsFilters; - //@Autowired private SharedFilesPage sharedFilesPage; + private DeleteDialog deleteDialog; + FileModel testFile; + private final ThreadLocal user = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - contentAction.addSingleTag(adminUser, adminPassword, path + folderName, tag); + sharedFilesPage = new SharedFilesPage(webDriver); + documentsFilters = new DocumentsFilters(webDriver); + deleteDialog = new DeleteDialog(webDriver); - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - } + log.info("Precondition: Test user is created & Navigate to SharedFiles page"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + sharedFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); + } @TestRail (id = "C7927") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void verifyFilters() { - LOG.info("STEP1: Verify the Sidebar"); + log.info("STEP1: Verify the Sidebar"); ArrayList expectedFilters = new ArrayList<>(Arrays.asList("Documents", "Shared Files", "Categories", "Tags")); assertEquals(documentsFilters.getSidebarFilters(), expectedFilters, "Sidebar filters="); } @TestRail (id = "C7928") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void verifyTags() - { - LOG.info("STEP1: Verify the list of tags in the Tags section"); - assertTrue(documentsFilters.getSidebarTag(tag).contains(tag), "Sidebar Tags filter contains " + tag); + public void verifyTags() throws Exception { + + log.info("Precondition1 : user is logged into the Share & Several content items are created"); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().authenticateUser(user.get()).usingUser(user.get()).usingShared().createFile(testFile).assertThat().existsInRepo(); + + log.info("Precondition2 :Any Tag is Created & added to File"); + String tag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + + setAuthorizationRequestHeader(getRestApi().authenticateUser(user.get())) + .withCoreAPI().usingResource(testFile).addTag(tag); + + log.info("STEP1: Verify the list of tags in the Tags section"); + sharedFilesPage + .navigateByMenuBar(); + documentsFilters + .assertIsTagPresentInSideBar(tag); + + log.info("STEP2: Click on one tag name"); + sharedFilesPage + .refreshSharedFilesPage() + .clickOnTag(tag); + sharedFilesPage + .assertIsFileDisplayed(testFile.getName()); + + log.info("Delete the file Created in Precondition1"); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction(testFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); - LOG.info("STEP2: Click on one tag name"); - documentsFilters.clickSidebarTag(tag); - getBrowser().waitInSeconds(4); - assertTrue(sharedFilesPage.getFoldersList().toString().contains(folderName), "Displayed folders="); } - @AfterClass + @AfterMethod public void cleanUp() { - contentService.deleteContentByPath(adminUser, adminPassword, path + folderName); + deleteUsersIfNotNull(user.get()); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/SharedFilesTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/SharedFilesTests.java index 1acba63d5a..0f69d67f40 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/SharedFilesTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/SharedFilesTests.java @@ -1,55 +1,81 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles; -import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; -import org.alfresco.dataprep.CMISUtil; +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.alfrescoContent.document.SocialFeatures; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class SharedFilesTests extends ContextAwareWebTest +public class SharedFilesTests extends BaseTest { - private final String docName = String.format("Doc-C7661-%s", RandomData.getRandomAlphanumeric()); - private final String path = "Shared/"; - //@Autowired private SharedFilesPage sharedFilesPage; - //@Autowired private SocialFeatures socialFeatures; + private DeleteDialog deleteDialog; + private final ThreadLocal user = new ThreadLocal<>(); + FileModel testFile; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName, docName + " Content"); + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + sharedFilesPage = new SharedFilesPage(webDriver); + socialFeatures = new SocialFeatures(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + log.info("Precondition1: Test user is created & Navigate to SharedFiles page"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); + log.info("Precondition2 : user is logged into the Share & content items are created"); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().authenticateUser(user.get()).usingUser(user.get()).usingShared().createFile(testFile).assertThat().existsInRepo(); + + sharedFilesPage + .navigate() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); } @TestRail (id = "C7661") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void verifyShareButton() { - LOG.info("STEP1: Hover over a file and click on the \"Share\" button."); - sharedFilesPage.mouseOverContentItem(docName); - assertTrue(socialFeatures.checkShareButtonAvailability(), "Share button is displayed."); - socialFeatures.clickShareButton(docName); - assertTrue(socialFeatures.isPublicLinkInputFieldDisplayed(), "Public link input field is displayed."); + log.info("STEP1: Hover over a file and click on the \"Share\" button."); + sharedFilesPage + .mouseOverContentItem(testFile.getName()); + socialFeatures + .assertIsShareButtonAvailable() + .clickShareButton(testFile.getName()); + socialFeatures + .assertShareButtonEnabled(testFile.getName()) + .assertIsPublicLinkInputFieldDisplayed(); + + log.info("Delete the file Created in Precondition1"); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction(testFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } - @AfterClass + @AfterMethod public void cleanUp() { - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, path + docName); + deleteUsersIfNotNull(user.get()); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/CreateTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/CreateTests.java index 1a7dfeeab9..50e8134150 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/CreateTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/CreateTests.java @@ -3,112 +3,136 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.GoogleDocsCommon; import org.alfresco.po.share.site.DocumentLibraryPage.CreateMenuOption; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Rusu.Andrei */ -public class CreateTests extends ContextAwareWebTest +public class CreateTests extends BaseTest { private final String random = RandomData.getRandomAlphanumeric(); private final String folderTemplateName = "Software Engineering Project"; - private final String fileTemplateName = RandomData.getRandomAlphanumeric() + "fileTemplate.txt"; - private final String user = String.format("user%s", RandomData.getRandomAlphanumeric()); - private final String user2 = String.format("user2-%s", RandomData.getRandomAlphanumeric()); private final String title = "googleDocTitle"; private final String googleDocName = "googleDocTitle.docx"; private final String googleDocSpreadsheet = "googleDocTitle.xlsx"; private final String googleDocPresentation = "googleDocTitle.pptx"; private final String docContent = "googleDoccontent"; - //@Autowired + private final String templateContent = "template content"; private SharedFilesPage sharedFilesPage; - // @Autowired private DocumentDetailsPage documentDetailsPage; - //@Autowired private CreateContentPage createContent; - //@Autowired private NewFolderDialog createFolderFromTemplate; - @Autowired + private DeleteDialog deleteDialog; +// @Autowired private GoogleDocsCommon googleDocs; + private UserModel testUser1; + private UserModel testUser2; - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - userService.create(adminUser, adminPassword, user2, password, user2 + domain, user2, user2); + sharedFilesPage = new SharedFilesPage(webDriver); + createContent = new CreateContentPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + createFolderFromTemplate = new NewFolderDialog(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + log.info("PreCondition1: Two test users are created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); } - @AfterClass + @AfterMethod public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - userService.delete(adminUser, adminPassword, user2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2); + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); } @TestRail (id = "C7929") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void sharedFilesCreatePlainTextFile() { String testName = "C7929TestName" + random; - LOG.info("Precondition: Login as user and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); + log.info("Precondition: Login as user and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); - LOG.info("Step 1: Click Create... button"); + log.info("Step 1: Click Create... button"); sharedFilesPage.clickCreateButton(); Assert.assertTrue(sharedFilesPage.areCreateOptionsAvailable(), "Create menu options are not available"); - LOG.info("Step 2: Click \"Plain Text...\" option."); + log.info("Step 2: Click \"Plain Text...\" option."); sharedFilesPage.clickCreateContentOption(CreateMenuOption.PLAIN_TEXT); -// Assert.assertEquals(createContent.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - createContent.typeName(testName); - createContent.typeContent("C7929 test content"); - createContent.typeTitle("C7929 test title"); - createContent.typeDescription("C7929 test description"); - - LOG.info("Step 4: Click the Create button"); - createContent.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "Plain Text", "Mimetype property is not Plain Text"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getContentText(), "C7929 test content", "\"C7929 test content \" is not the content displayed in preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), testName, testName + " is not the file name for the file in preview"); - - LOG.info("Step 7: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertTrue(sharedFilesPage.isContentNameDisplayed(testName), String.format("File [%s] is displayed", testName)); - - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + testName); + createContent.assertBrowserPageTitleIs("Alfresco » Create Content"); + + + log.info("Step 3: Fill in the name, content, title and description fields"); + createContent + .typeName(testName) + .typeContent("C7929 test content") + .typeTitle("C7929 test title") + .typeDescription("C7929 test description"); + + log.info("Step 4: Click the Create button"); + createContent + .clickCreate(); + documentDetailsPage + .assertBrowserPageTitleIs("Alfresco » Document Details"); + + log.info("Step 5 : Verify the mimetype for the created file."); + documentDetailsPage + .assertPropertyValueEquals("Mimetype", "Plain Text"); + + log.info("Step 6: Verify the document's preview"); + documentDetailsPage + .assertFileContentEquals("C7929 test content") + .assertIsFileNameDisplayedOnPreviewPage(testName); + + log.info("Step 7: Login with testUser2 and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigateByMenuBar() + .assertFileIsDisplayed(testName); + + log.info("Delete the created File"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction(testName, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C7937") @@ -116,276 +140,313 @@ public void sharedFilesCreatePlainTextFile() public void sharedFilesCreateHTMLFile() { String testName = "C7937TestName" + random; - LOG.info("Precondition: Login as user and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); + log.info("Precondition: Login as user and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); - LOG.info("Step 1: Click Create... button"); + log.info("Step 1: Click Create... button"); sharedFilesPage.clickCreateButton(); - LOG.info("Step 2: Click \"HTML...\" option."); + log.info("Step 2: Click \"HTML...\" option."); sharedFilesPage.clickCreateContentOption(CreateMenuOption.HTML); -// Assert.assertEquals(createContent.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - createContent.typeName(testName); - createContent.sendInputForHTMLContent("C7937 test content"); - createContent.typeTitle("C7937 test title"); - createContent.typeDescription("C7937 test description"); - - LOG.info("Step 4: Click the Create button"); - createContent.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "HTML", "Mimetype property is not HTML"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), testName, testName + " is not the file name for the file in preview"); - - LOG.info("Step 7: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertTrue(sharedFilesPage.isContentNameDisplayed(testName), String.format("File [%s] is displayed", testName)); - - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + testName); + createContent.assertBrowserPageTitleIs("Alfresco » Create Content"); + + log.info("Step 3: Fill in the name, content, title and description fields"); + createContent + .typeName(testName) + .sendInputForHTMLContent("C7937 test content") + .typeTitle("C7937 test title") + .typeDescription("C7937 test description"); + + log.info("Step 4: Click the Create button"); + createContent + .clickCreate() + .assertBrowserPageTitleIs("Alfresco » Document Details"); + + log.info("Step 5 : Verify the mimetype for the created file."); + documentDetailsPage + .assertPropertyValueEquals("Mimetype", "HTML"); + + log.info("Step 6: Verify the document's preview"); + documentDetailsPage + .assertFileContentEquals("C7937 test content") + .assertIsFileNameDisplayedOnPreviewPage(testName); + + log.info("Step 7: Login with testUser2 and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigateByMenuBar() + .assertFileIsDisplayed(testName); + + log.info("Delete the created File"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction(testName, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C7938") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void sharedFilesCreateXMLFile() { - LOG.info("Precondition: Login as user and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); + log.info("Precondition: Login as user and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); - LOG.info("Step 1: Click Create... button"); + log.info("Step 1: Click Create... button"); sharedFilesPage.clickCreateButton(); - LOG.info("Step 2: Click \"XML...\" option."); - sharedFilesPage.clickCreateContentOption(CreateMenuOption.XML); -// Assert.assertEquals(createContent.getPageTitle(), "Alfresco » Create Content", "Create content page is not opened"); - - LOG.info("Step 3: Fill in the name, content, title and description fields"); - createContent.typeName("C7938TestName"); - createContent.typeContent("C7938 test content"); - createContent.typeTitle("C7938 test title"); - createContent.typeDescription("C7938 test description"); - - LOG.info("Step 4: Click the Create button"); - createContent.clickCreate(); -// Assert.assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "File is not previewed in Document Details Page"); - - LOG.info("Step 5 : Verify the mimetype for the created file."); - Assert.assertEquals(documentDetailsPage.getPropertyValue("Mimetype:"), "XML", "Mimetype property is not XML"); - - LOG.info("Step 6: Verify the document's preview"); - Assert.assertEquals(documentDetailsPage.getContentText().trim(), "C7938 test content", - "\"C7938 test content \" is not the content displayed in preview"); - Assert.assertEquals(documentDetailsPage.getFileName(), "C7938TestName", "\"C7938TestName\" is not the file name for the file in preview"); - - LOG.info("Step 7: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertTrue(sharedFilesPage.isContentNameDisplayed("C7938TestName"), String.format("File [%s] is displayed", "C7938TestName")); - - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/C7938TestName"); + log.info("Step 2: Click \"XML...\" option."); + sharedFilesPage + .clickCreateContentOption(CreateMenuOption.XML) + .assertBrowserPageTitleIs("Alfresco » Create Content"); + + log.info("Step 3: Fill in the name, content, title and description fields"); + createContent + .typeName("C7938TestName") + .typeContent("C7938 test content") + .typeTitle("C7938 test title") + .typeDescription("C7938 test description");; + + log.info("Step 4: Click the Create button"); + createContent + .clickCreate(); + documentDetailsPage + .assertPageTitleEquals("Alfresco » Document Details"); + + log.info("Step 5 : Verify the mimetype for the created file."); + documentDetailsPage + .assertPropertyValueEquals("Mimetype", "XML"); + + log.info("Step 6: Verify the document's preview"); + documentDetailsPage + .assertFileContentEquals("C7938 test content") + .assertIsFileNameDisplayedOnPreviewPage("C7938TestName"); + + log.info("Step 7: Login with testUser2 and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigateByMenuBar() + .assertFileIsDisplayed("C7938TestName"); + + log.info("Delete the created File"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction("C7938TestName", ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C7931") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void sharedFilesCreateFolderFromTemplate() { - LOG.info("Precondition: Login as user and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); + log.info("Precondition: Login as user and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); - LOG.info("STEP 1: Click 'Create' then 'Create folder from template'."); + log.info("STEP 1: Click 'Create' then 'Create folder from template'."); sharedFilesPage.clickCreateButton(); sharedFilesPage.clickCreateFromTemplateOption(CreateMenuOption.CREATE_FOLDER_FROM_TEMPLATE); - LOG.info("STEP 2: Select the template: 'Software Engineering Project'"); + log.info("STEP 2: Select the template: 'Software Engineering Project'"); + sharedFilesPage.isTemplateDisplayed(folderTemplateName); sharedFilesPage.clickOnTemplate(folderTemplateName); - Assert.assertEquals(createFolderFromTemplate.getNameFieldValue(), folderTemplateName); - - LOG.info("STEP 3: Insert data into input fields and save."); - createFolderFromTemplate.fillInDetails("TestFolderC7931", "Test Title C7931", "Test Description C7931"); - createFolderFromTemplate.clickSave(); - Assert.assertTrue(sharedFilesPage.isContentNameDisplayed("TestFolderC7931"), "Subfolder not found"); - Assert.assertTrue(sharedFilesPage.getExplorerPanelDocuments().contains("TestFolderC7931"), "Subfolder not found in Documents explorer panel"); - - LOG.info("Step 4: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertTrue(sharedFilesPage.isContentNameDisplayed("TestFolderC7931"), String.format("File [%s] is displayed", "TestFolderC7931")); - - cleanupAuthenticatedSession(); - contentService.deleteTreeByPath(adminUser, adminPassword, "Shared/TestFolderC7931"); + createFolderFromTemplate.assertIsNameFieldValueEquals(folderTemplateName); + + log.info("STEP 3: Insert data into input fields and save."); + createFolderFromTemplate + .fillInDetails("TestFolderC7931", "Test Title C7931", "Test Description C7931") + .clickSave(); + sharedFilesPage + .assertIsFolderPresentInList("TestFolderC7931") + .assertExplorerPanelDocuments("TestFolderC7931"); + + log.info("Step 4: Login with testUser2 and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigateByMenuBar() + .assertIsFolderPresentInList("TestFolderC7931"); + + log.info("Delete the created Folder"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction("TestFolderC7931", ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C7932") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void sharedFilesCreateDocumentFromTemplate() { - LOG.info("Precondition: Login as admin user and create a file template."); - contentService.createDocumentInRepository(adminUser, adminPassword, "Data Dictionary/Node Templates", CMISUtil.DocumentType.TEXT_PLAIN, fileTemplateName, "some content"); + log.info("Precondition: Login as admin user and create a file template."); + FolderModel nodeTemplates = new FolderModel("Node Templates"); + nodeTemplates.setCmisLocation("/Data Dictionary/Node Templates"); + FileModel templateFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, templateContent); + getCmisApi().usingResource(nodeTemplates).createFile(templateFile); - LOG.info("Precondition: Login as user and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); + log.info("Precondition: Login as user and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser1); + sharedFilesPage.navigateByMenuBar(); - LOG.info("STEP 1: Click 'Create' then 'Create document from template'."); + log.info("STEP 1: Click 'Create' then 'Create document from template'."); sharedFilesPage.clickCreateButton(); sharedFilesPage.clickCreateFromTemplateOption(CreateMenuOption.CREATE_DOC_FROM_TEMPLATE); - Assert.assertTrue(sharedFilesPage.isTemplateDisplayed(fileTemplateName)); + sharedFilesPage.isTemplateDisplayed(templateFile.getName()); - LOG.info("STEP 2: Select the template: 'Software Engineering Project'"); - sharedFilesPage.clickOnTemplate(fileTemplateName); - Assert.assertTrue(sharedFilesPage.isContentNameDisplayed(fileTemplateName), String.format("Content: %s is not displayed.", fileTemplateName)); + log.info("STEP 2: Select the template: 'Software Engineering Project'"); + sharedFilesPage.clickOnTemplate(templateFile.getName()); + sharedFilesPage.assertFileIsDisplayed(templateFile.getName()); - LOG.info("Step 3: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertTrue(sharedFilesPage.isContentNameDisplayed(fileTemplateName), String.format("File [%s] is displayed", fileTemplateName)); + log.info("Step 3: Login with testUser2 and navigate to Shared Files page."); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigateByMenuBar() + .assertFileIsDisplayed(templateFile.getName()); + + log.info("Delete the Template File'"); + getCmisApi().usingResource(templateFile).delete(); - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + fileTemplateName); - contentService.deleteContentByPath(adminUser, adminPassword, "Data Dictionary/Node Templates/" + fileTemplateName); + log.info("Delete the created File"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction(templateFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C7934") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS },enabled = false) public void sharedFilesCreateGoogleDocsDocument() throws Exception { googleDocs.loginToGoogleDocs(); - LOG.info("Precondition: Login as user, authorize google docs and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); + log.info("Precondition: Login as user, authorize google docs and navigate to Shared Files page."); +// setupAuthenticatedSession(user, password); sharedFilesPage.navigate(); // Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); - LOG.info("Step 1: Click 'Create' button and select the type 'Google Docs Document'."); + log.info("Step 1: Click 'Create' button and select the type 'Google Docs Document'."); sharedFilesPage.clickCreateButton(); sharedFilesPage.clickGoogleDocsOption(CreateMenuOption.GOOGLE_DOCS_DOCUMENT); Assert.assertTrue(googleDocs.isAuthorizeWithGoogleDocsDisplayed(), "Authorize with Google Docs popup is not displayed"); - LOG.info("Step 2: Click Ok button on the Authorize "); + log.info("Step 2: Click Ok button on the Authorize "); googleDocs.clickOkButtonOnTheAuthPopup(); - LOG.info("Step 3: Edit the document in the Google Docs tab."); + log.info("Step 3: Edit the document in the Google Docs tab."); googleDocs.switchToGoogleDocsWindowandAndEditContent(title, docContent); Assert.assertTrue(sharedFilesPage.isContentNameDisplayed("Untitled Document.docx"), "The file created with Google Docs is not present"); assertEquals(sharedFilesPage.getInfoBannerText("Untitled Document.docx"), "This document is locked by you.", "Document appears to be locked"); Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - LOG.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); + log.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); googleDocs.checkInGoogleDoc("Untitled Document"); - + Assert.assertTrue(sharedFilesPage.isContentNameDisplayed(googleDocName)); Assert.assertFalse(sharedFilesPage.isInfoBannerDisplayed(googleDocName), "Locked label displayed"); Assert.assertFalse(googleDocs.isGoogleDriveIconDisplayed()); - LOG.info("Step 5: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); + log.info("Step 5: Login with testUser2 and navigate to Shared Files page."); +// cleanupAuthenticatedSession(); +// setupAuthenticatedSession(user2, password); sharedFilesPage.navigate(); assertTrue(sharedFilesPage.isContentNameDisplayed(googleDocName), String.format("File [%s] is displayed", googleDocName)); - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + "Untitled document" + googleDocName); +// cleanupAuthenticatedSession(); +// contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + "Untitled document" + googleDocName); } @TestRail (id = "C7935") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }, enabled = false) public void sharedFilesCreateGoogleDocsSpreadsheet() throws Exception { googleDocs.loginToGoogleDocs(); - LOG.info("Precondition: Login as user, authorize google docs and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); + log.info("Precondition: Login as user, authorize google docs and navigate to Shared Files page."); +// setupAuthenticatedSession(user, password); sharedFilesPage.navigate(); // Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); - LOG.info("Step 1: Click 'Create' button and select the type 'Google Docs Spreadsheet'"); + log.info("Step 1: Click 'Create' button and select the type 'Google Docs Spreadsheet'"); sharedFilesPage.clickCreateButton(); sharedFilesPage.clickGoogleDocsOption(CreateMenuOption.GOOGLE_DOCS_SPREADSHEET); - LOG.info("Step 2: Click Ok button on the Authorize "); + log.info("Step 2: Click Ok button on the Authorize "); googleDocs.clickOkButtonOnTheAuthPopup(); - LOG.info("Step 3: Edit the document in the Google Docs tab."); + log.info("Step 3: Edit the document in the Google Docs tab."); googleDocs.switchToGoogleSheetsWindowandAndEditContent(title, docContent); Assert.assertTrue(sharedFilesPage.isContentNameDisplayed("Untitled Spreadsheet.xlsx"), "The file created with Google Docs is not present"); Assert.assertEquals(sharedFilesPage.getInfoBannerText("Untitled Spreadsheet.xlsx"), "This document is locked by you.", "Document appears to be locked"); Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - LOG.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); + log.info("Step 4: Click Check in Google Doc button for the created document and verify it's not locked anymore."); googleDocs.checkInGoogleDoc("Untitled Spreadsheet"); - + Assert.assertTrue(sharedFilesPage.isContentNameDisplayed(googleDocSpreadsheet)); Assert.assertFalse(sharedFilesPage.isInfoBannerDisplayed(googleDocSpreadsheet), "Locked label displayed"); Assert.assertFalse(googleDocs.isGoogleDriveIconDisplayed()); - LOG.info("Step 5: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); + log.info("Step 5: Login with testUser2 and navigate to Shared Files page."); +// cleanupAuthenticatedSession(); +// setupAuthenticatedSession(user2, password); sharedFilesPage.navigate(); // assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); assertTrue(sharedFilesPage.isContentNameDisplayed(googleDocSpreadsheet), String.format("File [%s] is displayed", googleDocSpreadsheet)); - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + "Untitled spreadsheet" + googleDocSpreadsheet); +// cleanupAuthenticatedSession(); +// contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + "Untitled spreadsheet" + googleDocSpreadsheet); } @TestRail (id = "C7936") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }, enabled = false) public void sharedFilesCreateGoogleDocsPresentation() throws Exception { googleDocs.loginToGoogleDocs(); - LOG.info("Precondition: Login as user, authorize google docs and navigate to Shared Files page."); - setupAuthenticatedSession(user, password); + log.info("Precondition: Login as user, authorize google docs and navigate to Shared Files page."); +// setupAuthenticatedSession(user, password); sharedFilesPage.navigate(); // Assert.assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); - LOG.info("Step 1: Click 'Create' button and select the type 'Google Docs Presentation'"); + log.info("Step 1: Click 'Create' button and select the type 'Google Docs Presentation'"); sharedFilesPage.clickCreateButton(); sharedFilesPage.clickGoogleDocsOption(CreateMenuOption.GOOGLE_DOCS_PRESENTATION); googleDocs.clickOkButtonOnTheAuthPopup(); - LOG.info("Step 2: Edit the document in the Google Docs tab "); + log.info("Step 2: Edit the document in the Google Docs tab "); googleDocs.switchToGooglePresentationsAndEditContent(title); Assert.assertTrue(sharedFilesPage.isContentNameDisplayed("Untitled Presentation.pptx"), "The file created with Google Docs is not present"); assertEquals(sharedFilesPage.getInfoBannerText("Untitled Presentation.pptx"), "This document is locked by you.", "Document appears to be locked"); Assert.assertTrue(googleDocs.isGoogleDriveIconDisplayed(), "Google Drive icon is not displayed"); - LOG.info("Step 3: Click Check in Google Doc button for the created document and verify it's not locked anymore."); + log.info("Step 3: Click Check in Google Doc button for the created document and verify it's not locked anymore."); googleDocs.checkInGoogleDoc("Untitled Presentation"); - + Assert.assertTrue(sharedFilesPage.isContentNameDisplayed(googleDocPresentation)); Assert.assertFalse(sharedFilesPage.isInfoBannerDisplayed(googleDocPresentation), "Locked label displayed"); Assert.assertFalse(googleDocs.isGoogleDriveIconDisplayed()); - LOG.info("Step 4: Login with testUser2 and navigate to Shared Files page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); + log.info("Step 4: Login with testUser2 and navigate to Shared Files page."); +// cleanupAuthenticatedSession(); +// setupAuthenticatedSession(user2, password); sharedFilesPage.navigate(); // assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); assertTrue(sharedFilesPage.isContentNameDisplayed(googleDocPresentation), String.format("File [%s] is displayed", googleDocPresentation)); - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + "Untitled presentation" + googleDocPresentation); +// cleanupAuthenticatedSession(); +// contentService.deleteContentByPath(adminUser, adminPassword, "Shared/" + "Untitled presentation" + googleDocPresentation); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DeleteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DeleteTests.java index 1dfd6fe4cc..0b13027a2a 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DeleteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DeleteTests.java @@ -1,120 +1,160 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.actions; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class DeleteTests extends ContextAwareWebTest +public class DeleteTests extends BaseTest { - private final String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - private final String user = "User" + uniqueIdentifier; - private final String docName = "DocC8014-" + uniqueIdentifier; - private final String fileContent = "Doc content"; - private final String folderName = "Folder-C8015-" + uniqueIdentifier; - private final String docName2 = "DocC13759-" + uniqueIdentifier; - private final String folderName2 = "FolderC13759-" + uniqueIdentifier; - private final String path = "Shared/"; - //@Autowired private SharedFilesPage sharedFilesPage; - // @Autowired private DeleteDialog deleteDialog; + private UserModel testUser1; + private UserModel testUser2; + private FileModel testFile; + private FolderModel testFolder; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName2, ""); - contentService.createFolderInRepository(adminUser, adminPassword, folderName2, path); - } + @BeforeMethod(alwaysRun = true) + public void setupTest() { + sharedFilesPage = new SharedFilesPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + } @TestRail (id = "C8014") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void deleteDocument() - { - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("STEP1: Hover over the file you want to delete"); - LOG.info("STEP2: Click 'More' menu -> \"Delete Document\""); - sharedFilesPage.selectItemAction(docName, ItemActions.DELETE_DOCUMENT); - assertEquals(deleteDialog.getMessage(), String.format(language.translate("documentLibrary.deleteDialogMessage"), docName), "Delete dialog message= "); - assertTrue(deleteDialog.isDeleteButtonDisplayed(), "'Delete' button is displayed."); - assertTrue(deleteDialog.isCancelButtonDisplayed(), "'Cancel' button is displayed."); - - LOG.info("STEP3: Press \"Delete\""); - deleteDialog.confirmDeletion(); - assertFalse(sharedFilesPage.isContentNameDisplayed(docName), docName + " is displayed."); - - cleanupAuthenticatedSession(); + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void deleteDocument() throws Exception { + log.info("PreCondition: Create a File in"+ testUser1 +"Shared Files Folder "); + authenticateUsingLoginPage(testUser1); + + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingShared().createFile(testFile).assertThat().existsInRepo(); + authenticateUsingCookies(testUser1); + + log.info("PreCondition: Login using Admin user & Navigate to Shared Files Folder "); + authenticateUsingLoginPage(getAdminUser()); + sharedFilesPage + .navigateByMenuBar() + .isFileDisplayed(testFile.getName()); + + log.info("STEP1: Hover over the file you want to delete"); + log.info("STEP2: Click 'More' menu -> \"Delete Document\""); + sharedFilesPage + .selectItemAction(testFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .assertConfirmDeleteMessageForContentEqualsTo(testFile.getName()) + .assertDeleteButtonIsDisplayed() + .assertCancelButtonIsDisplayed(); + + log.info("STEP3: Press \"Delete\""); + deleteDialog + .confirmDeletion(); + sharedFilesPage + .navigateByMenuBar() + .assertFileIsNotDisplayed(testFile.getName()); } @TestRail (id = "C8015") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void deleteFolder() - { - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("STEP1: Hover over the file you want to delete and press \"More\""); - LOG.info("STEP2: Press \"Delete Folder\""); - sharedFilesPage.selectItemAction(folderName, ItemActions.DELETE_FOLDER); - - assertEquals(deleteDialog.getMessage(), String.format(language.translate("documentLibrary.deleteDialogMessage"), folderName), - "Delete dialog message= "); - assertTrue(deleteDialog.isDeleteButtonDisplayed(), "'Delete' button is displayed."); - assertTrue(deleteDialog.isCancelButtonDisplayed(), "'Cancel' button is displayed."); - - LOG.info("STEP3: Press \"Delete\""); - deleteDialog.confirmDeletion(); - assertFalse(sharedFilesPage.isContentNameDisplayed(folderName), folderName + " is displayed."); - - cleanupAuthenticatedSession(); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void deleteFolder() throws Exception { + + log.info("PreCondition: Create a Folder in"+ testUser1 +"Shared Files Folder "); + authenticateUsingLoginPage(testUser1); + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingShared().createFolder(testFolder).assertThat().existsInRepo(); + + log.info("PreCondition: Login using Admin user & Navigate to Shared Files Folder "); + authenticateUsingLoginPage(getAdminUser()); + sharedFilesPage + .navigateByMenuBar() + .isFileDisplayed(testFolder.getName()); + + log.info("STEP1: Hover over the file you want to delete and press \"More\""); + log.info("STEP2: Press \"Delete Folder\""); + sharedFilesPage + .selectItemAction(testFolder.getName(), ItemActions.DELETE_FOLDER); + + deleteDialog + .assertConfirmDeleteMessageForContentEqualsTo(testFolder.getName()) + .assertDeleteButtonIsDisplayed() + .assertCancelButtonIsDisplayed(); + + log.info("STEP3: Press \"Delete\""); + deleteDialog + .confirmDeletion(); + sharedFilesPage + .navigateByMenuBar() + .assertFileIsNotDisplayed(testFolder.getName()); } @TestRail (id = "C13759") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void optionNotDisplayed() - { - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("STEP1: Hover over " + docName2); - assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(docName2, ItemActions.DELETE_DOCUMENT), - language.translate("documentLibrary.contentActions.deleteDocument") + " option is displayed for " + docName2); - - LOG.info("STEP1: Hover over " + folderName2); - assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(folderName2, ItemActions.DELETE_DOCUMENT), - language.translate("documentLibrary.contentActions.deleteDocument") + " option is displayed for " + folderName2); + public void optionNotDisplayed() throws Exception { + log.info("PreCondition: Create a File & Folder in"+ testUser2 +"Shared Files Folder "); + authenticateUsingLoginPage(testUser2); + + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingShared().createFile(testFile).assertThat().existsInRepo(); + authenticateUsingCookies(testUser2); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingShared().createFolder(testFolder).assertThat().existsInRepo(); + + log.info("PreCondition: Login using"+ testUser1 +"& Navigate to Shared Files Folder "); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigateByMenuBar() + .isFileDisplayed(testFile.getName()); + + log.info("STEP1: Hover over " + testFile); + sharedFilesPage + .assertActionItem_Not_AvailableInTheDocumentLibraryItems(testFile.getName(),ItemActions.DELETE_DOCUMENT); + + log.info("STEP2: Hover over " + testFolder); + sharedFilesPage + .assertActionItem_Not_AvailableInTheDocumentLibraryItems(testFolder.getName(), ItemActions.DELETE_FOLDER); + + log.info("Delete the Created File & Folder"); + authenticateUsingLoginPage(getAdminUser()); + sharedFilesPage + .navigateByMenuBar() + .selectItemAction(testFile.getName(),ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + + sharedFilesPage + .selectItemAction(testFolder.getName(),ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); } - @AfterClass + @AfterMethod(alwaysRun = true) public void cleanUp() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - contentService.deleteContentByPath(adminUser, adminPassword, path + docName2); - contentService.deleteContentByPath(adminUser, adminPassword, path + folderName2); + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DownloadTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DownloadTests.java index c7ef53fc59..c4a0deac74 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DownloadTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/DownloadTests.java @@ -1,73 +1,112 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.actions; -import org.alfresco.dataprep.CMISUtil.DocumentType; +import lombok.extern.slf4j.Slf4j; + +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class DownloadTests extends ContextAwareWebTest +import java.io.File; + +import static org.alfresco.common.Utils.isFileInDirectory; +import static org.alfresco.common.Utils.testDataFolder; + +@Slf4j +public class DownloadTests extends BaseTest { - private final String random = RandomData.getRandomAlphanumeric(); - private final String user = String.format("C8024TestUser%s", RandomData.getRandomAlphanumeric()); - private final String fileNameC8024 = "C8024 file2 " + random; - private final String folderNameC8027 = "folderNameC80272 " + random; - private final String fileContent = "test content"; - private final String path = "Shared"; - //@Autowired + private DeleteDialog deleteDialog; private SharedFilesPage sharePage; + private UserModel testUser1; + private FileModel testFile; + private FolderModel testFolder; + + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + sharePage = new SharedFilesPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create a Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(testUser1); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingAdmin().usingShared().createFolder(testFolder).assertThat().existsInRepo(); + + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingAdmin().usingShared().createFile(testFile).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, DocumentType.TEXT_PLAIN, fileNameC8024, fileContent); - contentService.createFolderInRepository(adminUser, adminPassword, folderNameC8027, path); - setupAuthenticatedSession(user, password); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanUp() { - cleanupAuthenticatedSession(); - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + log.info("Delete the file & folder Created in Precondition"); + sharePage + .navigateByMenuBar() + .selectItemAction(testFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + sharePage + .selectItemAction(testFolder.getName(), ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + fileNameC8024); - contentService.deleteTreeByPath(adminUser, adminPassword, path + "/" + folderNameC8027); + log.info("Delete the user Created in Precondition"); + deleteUsersIfNotNull(testUser1); } @TestRail (id = "C8024") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void downloadFileFromAlfresco() { - sharePage.navigate(); + sharePage.navigateByMenuBar(); - LOG.info("Step 1: Mouse over file, click Download"); - sharePage.selectItemAction(fileNameC8024, ItemActions.DOWNLOAD); + log.info("Step 1: Mouse over file, click Download"); + sharePage.selectItemActionFormFirstThreeAvailableOptions(testFile.getName(),ItemActions.DOWNLOAD); sharePage.acceptAlertIfDisplayed(); - LOG.info("Step 2: Check the file was saved locally"); - Assert.assertTrue(isFileInDirectory(fileNameC8024, null), "The file was not found in the specified location"); + log.info("Step 2: Check the file was saved locally"); + Assert.assertTrue(isFileInDirectory(testFile.getName(), null), "The file was not found in the specified location"); + + log.info("Delete the downloaded file from the directory"); + File file = new File(testDataFolder + testFile.getName()); + file.delete(); + Assert.assertFalse(file.exists(), "File should not exist!"); } @TestRail (id = "C8027") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void downloadFolder() { - sharePage.navigate(); + sharePage.navigateByMenuBar(); - LOG.info("Step 1: Mouse over folder, click Download"); - sharePage.selectItemAction(folderNameC8027, ItemActions.DOWNLOAD_AS_ZIP); + log.info("Step 1: Mouse over folder, click Download"); + sharePage.selectItemActionFormFirstThreeAvailableOptions(testFolder.getName(),ItemActions.DOWNLOAD_AS_ZIP); sharePage.acceptAlertIfDisplayed(); - LOG.info("Step 2: Check the folder was saved locally"); - Assert.assertTrue(isFileInDirectory(folderNameC8027, ".zip"), "The folder was not found in the specified location"); + log.info("Step 2: Check the folder was saved locally"); + Assert.assertTrue(isFileInDirectory(testFolder.getName(), ".zip"), "The folder was not found in the specified location"); + + log.info("Delete the downloaded folder from the directory"); + File file = new File(testDataFolder + testFolder.getName()); + file.delete(); + Assert.assertFalse(file.exists(), "File should not exist!"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/EditTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/EditTests.java index 72884c1ebb..d5978fc4a0 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/EditTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/EditTests.java @@ -2,49 +2,46 @@ import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; +import java.util.Arrays; import java.util.Collections; +import java.util.List; +import lombok.extern.slf4j.Slf4j; import org.alfresco.cmis.CmisWrapper; -import org.alfresco.dataprep.CMISUtil; +import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.GoogleDocsCommon; import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.organizingContent.taggingAndCategorizingContent.SelectDialog; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditInAlfrescoPage; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class EditTests extends ContextAwareWebTest +public class EditTests extends BaseTest { private final String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - private final String user = "User" + uniqueIdentifier; - private final String path = "Shared"; - private final String docName1 = "Doc-C7953-" + uniqueIdentifier; - private final String updatedDocName1 = "UpdatedDocName-C7953-" + uniqueIdentifier; - private final String docName2 = "Doc-C7979-" + uniqueIdentifier; - private final String updatedDocName2 = "UpdatedDocName-C7979-" + uniqueIdentifier; - private final String docName3 = "Doc-C13760-" + uniqueIdentifier; - private final String folderName = "folder-" + uniqueIdentifier; - private final String updatedFolderName = "UpdatedFolderName-C7958-" + uniqueIdentifier; - private final String updatedTitle = "Updated Title" + uniqueIdentifier; - private final String updatedDescription = "Updated Description"; - private final String tagName = "tag" + uniqueIdentifier; + private final String user = "User" + RandomData.getRandomAlphanumeric(); + private final String user2 = "User2" + RandomData.getRandomAlphanumeric(); private final String googleDocName = uniqueIdentifier + "googleDoc.docx"; @Autowired public CmisWrapper cmisApi; @@ -52,6 +49,7 @@ public class EditTests extends ContextAwareWebTest private SharedFilesPage sharedFilesPage; //@Autowired private DocumentDetailsPage documentDetailsPage; + private DocumentLibraryPage documentLibraryPage; //@Autowired private EditPropertiesDialog editFilePropertiesDialog; //@Autowired @@ -62,135 +60,251 @@ public class EditTests extends ContextAwareWebTest private SelectDialog selectDialog; //@Autowired private UploadContent uploadContent; + private final String password = "password"; + private UserModel testUser1; + private UserModel testUser2; + private RepositoryPage repositoryPage; + private MyFilesPage myFilesPage; + private NewFolderDialog newFolderDialog; + private final String sharedFolderName = "Shared"; + private final String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + private final String testFilePath = testDataFolder + testFile; + private final String editedFolderName = String.format("editedFolderName%s", RandomData.getRandomAlphanumeric()); + private final String editedTitle = "editedTitle"; + private final String editedContent = "C7762 edited content in Alfresco"; + private final String editedDescription = "edited description in Alfresco"; + private final String tagName = String.format("editTag_%s", RandomData.getRandomAlphanumeric()); + private String editedFileName = String.format("editedDocName%s", RandomData.getRandomAlphanumeric()) ; + private final String folderTitle = "TestFOlderTitle"; + private final String folderDesc = "TestFolderDescription"; + private final String folderName ="TestFolder" + RandomData.getRandomAlphanumeric(); + + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + repositoryPage = new RepositoryPage(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + + sharedFilesPage = new SharedFilesPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + selectDialog = new SelectDialog(webDriver); + editFilePropertiesDialog = new EditPropertiesDialog(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + editInAlfrescoPage = new EditInAlfrescoPage(webDriver); - @BeforeClass (alwaysRun = true) - public void setupTest() throws Exception + } + @AfterMethod(alwaysRun = true) + public void cleanup() { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName1, "a"); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName2, "a"); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName3, "a"); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - //FileModel file1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "content new bla bla"); - //cmisApi.authenticateUser(new UserModel(adminUser, adminPassword)).usingShared().createFile(file1); + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + } @TestRail (id = "C7953") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT , "tobefixed"}) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void editFileProperties() { - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("Step 1: Hover over file and click 'Edit Properties' action"); - sharedFilesPage.selectItemAction(docName1, ItemActions.EDIT_PROPERTIES); - //assertTrue(editFilePropertiesDialog.verifyAllElementsAreDisplayed(), "Some elements of the 'Edit Properties' dialog are not displayed"); - LOG.info("Step 2: In the 'Name' field enter a valid name"); - editFilePropertiesDialog.setName(updatedDocName1); - - LOG.info("Step 3: In the 'Title' field enter a valid title"); - editFilePropertiesDialog.setTitle(updatedTitle); - - LOG.info("Step 4: In the 'Description' field enter a valid description"); - editFilePropertiesDialog.setDescription(updatedDescription); - - LOG.info("Step 5: Click the 'Select' button in the tags section"); + log.info("Precondition: upload document in Shared folder from user2 "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isContentNameDisplayed(testFile); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + log.info("Step 1: Hover over the test file and click 'Edit Properties' action"); + repositoryPage + .selectItemActionFormFirstThreeAvailableOptions(testFile, ItemActions.EDIT_PROPERTIES); + editFilePropertiesDialog + .assertVerifyEditPropertiesElementsAreDisplayed(); + + log.info("Step 2: In the 'Name' field enter a valid name"); + editFilePropertiesDialog.setName(editedFileName); + + log.info("Step 3: In the 'Title' field enter a valid title"); + editFilePropertiesDialog.setTitle(editedTitle); + + log.info("Step 4: In the 'Description' field enter a valid description"); + editFilePropertiesDialog.setDescription(editedDescription); + + log.info("Step 5: Click the 'Select' button in the tags section"); editFilePropertiesDialog.clickSelectTags(); - LOG.info("Step 6: Type a tag name and click create"); + log.info("Step 6: Type a tag name and click create"); selectDialog.typeTag(tagName); selectDialog.clickCreateNewIcon(); selectDialog.clickOk(); editFilePropertiesDialog.isTagSelected(tagName.toLowerCase()); - LOG.info("Step 7: Click 'Save' And verify that document details have been updated"); + log.info("Step 7: Click 'Save' And verify that document details have been updated"); editFilePropertiesDialog.clickSave(); - assertTrue(sharedFilesPage.isContentNameDisplayed(updatedDocName1), updatedDocName1 + " is displayed."); - assertEquals(sharedFilesPage.getItemTitle(updatedDocName1), "(" + updatedTitle + ")", updatedDocName1 + " - document's title="); - assertEquals(sharedFilesPage.getItemDescription(updatedDocName1), updatedDescription, updatedDocName1 + "- document's description="); - assertEquals(sharedFilesPage.getTags(updatedDocName1), Collections.singletonList(tagName.toLowerCase()).toString(), - updatedDocName1 + "- document's tag="); + log.info("verify that document details have been updated"); + repositoryPage + .assertIsContantNameDisplayed(editedFileName); + repositoryPage + .assertItemTitleEquals(editedFileName,editedTitle); + repositoryPage + .assertItemDescriptionEquals(editedFileName,editedDescription); + repositoryPage + .assertTagNamesDisplayed(editedFileName,Collections.singletonList(tagName.toLowerCase()).toString(),editedFileName); + repositoryPage + .select_ItemsAction(editedFileName, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C7958") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void editFolderProperties() - { - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("Step 1: Hover over file and click 'Edit Properties'"); - sharedFilesPage.selectItemAction(folderName, ItemActions.EDIT_PROPERTIES - ); - //assertTrue(editFilePropertiesDialog.verifyAllElementsAreDisplayed(), "Some elements of the 'Edit Properties' dialog are not displayed"); - - LOG.info("Step 2: In the 'Name' field enter a valid name"); - editFilePropertiesDialog.setName(updatedFolderName); - - LOG.info("Step 3: In the 'Title' field enter a valid title"); - editFilePropertiesDialog.setTitle(updatedTitle); - - LOG.info("Step 4: In the 'Description' field enter a valid description"); - editFilePropertiesDialog.setDescription(updatedDescription); - - LOG.info("Step 5: Click the 'Select' button in the tags section"); - editFilePropertiesDialog.clickSelectTags(); - - LOG.info("Step 6: Type a tag name and click create"); - selectDialog.typeTag(tagName); - selectDialog.clickCreateNewIcon(); - selectDialog.clickOk(); - editFilePropertiesDialog.isTagSelected(tagName.toLowerCase()); - - LOG.info("Step 7: Click 'Save' And verify that document details have been updated"); - editFilePropertiesDialog.clickSave(); - assertTrue(sharedFilesPage.isContentNameDisplayed(updatedFolderName), updatedFolderName + " is displayed."); - assertEquals(sharedFilesPage.getItemTitle(updatedFolderName), "(" + updatedTitle + ")", updatedFolderName + " - document's title="); - assertEquals(sharedFilesPage.getItemDescription(updatedFolderName), updatedDescription, updatedFolderName + "- document's description="); - assertEquals(sharedFilesPage.getTags(updatedFolderName), Collections.singletonList(tagName.toLowerCase()).toString(), - updatedFolderName + "- document's tag="); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void editFolderProperties() { + log.info("Precondition: create folder in Shared folder from user2 "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderName) + .typeTitle(folderTitle) + .typeDescription(folderDesc) + .clickSave(); + myFilesPage + .isContentNameDisplayed(folderDesc); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + log.info(" Hover over a folder and click 'Edit Properties'"); + myFilesPage + .selectItemActionFormFirstThreeAvailableOptions(folderName, ItemActions.EDIT_PROPERTIES); + editFilePropertiesDialog + .assertVerifyEditPropertiesElementsAreDisplayed(); + log.info(" In the 'Name' field enter a valid name"); + editFilePropertiesDialog + .setName(editedFolderName); + log.info(" In the 'Title' field enter a valid title"); + editFilePropertiesDialog + .setTitle(editedTitle); + log.info(" In the 'Description' field enter a valid description"); + editFilePropertiesDialog + .setDescription(editedDescription); + log.info(" Click the 'Select' button in the tags section"); + editFilePropertiesDialog + .clickSelectTags(); + log.info(" Type a tag name and click create"); + selectDialog + .typeTag(tagName) + .clickCreateNewIcon() + .clickOk(); + + log.info(" Click 'Save' And verify that document details have been updated"); + editFilePropertiesDialog + .clickSave(); + log.info(" Verify the new title for the document"); + repositoryPage + .assertIsContantNameDisplayed(editedFolderName); + + repositoryPage + .assertItemTitleEquals(editedFolderName,editedTitle); + repositoryPage + .assertItemDescriptionEquals(editedFolderName,editedDescription); + repositoryPage + .assertTagNamesDisplayed(editedFolderName,Collections.singletonList(tagName.toLowerCase()).toString(),editedFolderName); + + repositoryPage + .select_ItemsAction(editedFolderName, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } @TestRail (id = "C7979") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void editFileInAlfresco() { - String updatedContent = "Content updated C7979"; - - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("Step1: Hover over the test file and click Edit in Alfresco option"); - sharedFilesPage.selectItemAction(docName2, ItemActions.EDIT_IN_ALFRESCO); - - LOG.info("Step2: Edit the document's properties by sending new input"); - editInAlfrescoPage.enterDocumentDetails(updatedDocName2, updatedContent, updatedTitle, updatedDescription); - - LOG.info("Step3: Click Save button"); - editInAlfrescoPage.clickButton("Save"); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - - LOG.info("Step4: Verify the new title for the document"); - assertTrue(sharedFilesPage.isContentNameDisplayed(updatedDocName2)); - - LOG.info("Step5: Click on document title to open the document's details page"); - sharedFilesPage.clickOnFile(updatedDocName2); -// assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "Displayed page="); - - LOG.info("Step6: Verify the document's content"); - assertEquals(documentDetailsPage.getContentText(), updatedContent, updatedDocName2 + " 's content="); - - LOG.info("Step7: Verify Title and Description fields"); - //assertTrue(documentDetailsPage.isPropertyValueDisplayed(updatedTitle), "Updated title is not displayed"); - //assertTrue(documentDetailsPage.isPropertyValueDisplayed(updatedDescription), "Updated description is not displayed"); + log.info("Precondition: upload document in Shared folder from user2 "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isContentNameDisplayed(testFile); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + log.info("Hover over the test file and click Edit in Alfresco option"); + myFilesPage + .select_ItemAction(testFile, ItemActions.EDIT_IN_ALFRESCO); + + log.info(" Edit the document's properties by sending new input"); + editInAlfrescoPage + .typeName(editedFileName) + .typeContent(editedContent) + .typeTitle(editedTitle) + .typeDescription(editedDescription); + + log.info(" Click Save button"); + editInAlfrescoPage + .clickSaveButton(); + + log.info(" Verify the new title for the document"); + myFilesPage + .assertIsContantNameDisplayed(editedFileName); + + log.info(" Click on document title to open the document's details page"); + myFilesPage + .clickOnFile(editedFileName); + + log.info(" Verify the document's content"); + documentDetailsPage + .assertFileContentEquals(editedContent); + + log.info(" Verify Title and Description fields"); + documentDetailsPage + .assertContentTittleEquals(editedTitle) + .assert_ContentDescriptionEquals(editedDescription); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .select_ItemsAction(editedFileName, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); } @TestRail (id = "C7994") - @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS }) + @Test (groups = { TestGroup.SANITY, TestGroup.GOOGLE_DOCS },enabled = false) public void editFileInGoogleDocs() throws Exception { googleDocsCommon.loginToGoogleDocs(); @@ -198,78 +312,79 @@ public void editFileInGoogleDocs() throws Exception String editedInGoogleDocsTitle = uniqueIdentifier + "editedTestFile.docx"; String editedInGoogleDocsContent = "Edited"; - LOG.info("Preconditions: Login to Share/Google Docs and navigate to Shared Files page; upload a .docx file"); - setupAuthenticatedSession(user, password); + log.info("Preconditions: Login to Share/Google Docs and navigate to Shared Files page; upload a .docx file"); + //setupAuthenticatedSession(user, password); sharedFilesPage.navigate(); // assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); uploadContent.uploadContent(googleDocPath); - LOG.info("Step1: Hover over the test file and click Edit in Google Docs option"); + log.info("Step1: Hover over the test file and click Edit in Google Docs option"); sharedFilesPage.selectItemAction(googleDocName, ItemActions.EDIT_IN_GOOGLE_DOCS); - getBrowser().waitInSeconds(5); + //getBrowser().waitInSeconds(5); googleDocsCommon.clickOkButtonOnTheAuthPopup(); - LOG.info("Step2,3: Provide edited input to Google Docs file and close Google Docs tab"); + log.info("Step2,3: Provide edited input to Google Docs file and close Google Docs tab"); googleDocsCommon.switchToGoogleDocsWindowandAndEditContent(editedInGoogleDocsTitle, editedInGoogleDocsContent); - LOG.info("Step4: Verify the file is locked and Google Drive icon is displayed"); + log.info("Step4: Verify the file is locked and Google Drive icon is displayed"); assertTrue(googleDocsCommon.isLockedIconDisplayed(), "Locked icon displayed"); assertTrue(googleDocsCommon.isLockedDocumentMessageDisplayed(), "Message about the file being locked displayed"); assertTrue(googleDocsCommon.isGoogleDriveIconDisplayed(), "Google Drive icon displayed"); - LOG.info("Step5: Click Check In Google Doc™ and verify Version Information pop-up"); + log.info("Step5: Click Check In Google Doc™ and verify Version Information pop-up"); googleDocsCommon.checkInGoogleDoc(googleDocName); Assert.assertEquals(googleDocsCommon.isVersionInformationPopupDisplayed(), true, "Version information pop-up is displayed."); - LOG.info("Step6: Click OK button on Version Information and verify the pop-up is closed"); + log.info("Step6: Click OK button on Version Information and verify the pop-up is closed"); googleDocsCommon.clickOkButton(); assertEquals(googleDocsCommon.isVersionInformationPopupDisplayed(), false, "Version information pop-up is displayed."); - LOG.info("Step7: Verify document's title"); + log.info("Step7: Verify document's title"); assertTrue(sharedFilesPage.isContentNameDisplayed(editedInGoogleDocsTitle), "Name of the document is updated with " + editedInGoogleDocsTitle); - LOG.info("Steps8: Click on the document title and verify it's preview"); + log.info("Steps8: Click on the document title and verify it's preview"); sharedFilesPage.clickOnFile(editedInGoogleDocsTitle); assertTrue(documentDetailsPage.getContentText().replaceAll("\\s+", "").contains("Edited"), String.format("Document: %s has incorrect contents.", editedInGoogleDocsTitle)); - cleanupAuthenticatedSession(); - contentService.deleteContentByPath(adminUser, adminPassword, "/" + path + "/contents" + editedInGoogleDocsTitle); + //cleanupAuthenticatedSession(); + //contentService.deleteContentByPath(adminUser, adminPassword, "/" + path + "/contents" + editedInGoogleDocsTitle); } @TestRail (id = "C13760") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void optionNotDisplayed() - { - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); + public void optionNotDisplayed() { + log.info("Precondition: upload document in Shared folder from user2 "); + authenticateUsingLoginPage(testUser2); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(testFilePath); + repositoryPage + .isContentNameDisplayed(testFile); + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .isContentNameDisplayed(testFile); + + log.info("STEP1: Hover over the file"); + sharedFilesPage + .mouseOverContentItem(testFile); + documentLibraryPage + .assertisMoreMenuNotDisplayed(testFile); + List expectedActions = Arrays + .asList("Edit Properties", "Edit in Google Docs", "Edit in Alfresco Share","Edit Offline","Edit in Google Docs™"); + documentLibraryPage.assertActionsNoteAvailableForLibrary(testFile,expectedActions); - LOG.info("STEP1: Hover over the file"); - sharedFilesPage.mouseOverContentItem(docName3); - assertFalse(sharedFilesPage.isMoreMenuDisplayed(docName3), "More menu displayed."); - assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(docName3, ItemActions.EDIT_IN_GOOGLE_DOCS), - language.translate("documentLibrary.contentActions.editInGoogleDocs") + " option is displayed for " + docName3); - assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(docName3, ItemActions.EDIT_PROPERTIES), - language.translate("documentLibrary.contentActions.editProperties") + " option is displayed for " + docName3); - assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(docName3, ItemActions.EDIT_IN_ALFRESCO), - language.translate("documentLibrary.contentActions.editInAlfresco") + " option is displayed for " + docName3); - - cleanupAuthenticatedSession(); - } - - @AfterClass - public void cleanUp() - { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - contentService.deleteContentByPath(adminUser, adminPassword, "/" + path + "/" + updatedDocName1); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + updatedDocName2); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + docName3); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + updatedFolderName); } + } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SelectTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SelectTests.java index 176e4093c5..4205ae1c08 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SelectTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SelectTests.java @@ -1,127 +1,201 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.actions; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.po.share.DeleteDialog; -import org.alfresco.po.share.alfrescoContent.SharedFilesPage; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.DocumentLibraryPage2; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.util.ArrayList; +import java.util.Collections; + +@Slf4j /** * @author Laura.Capsa */ -public class SelectTests extends ContextAwareWebTest +public class SelectTests extends BaseTest { private final String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - private final String path = "Shared/"; private final String user = "user" + uniqueIdentifier; - private final String docName = "DocC8004-" + uniqueIdentifier; - private final String folderName = "FolderC8005-" + uniqueIdentifier; - //@Autowired - DeleteDialog deleteDialog; + //@Autowired - private SharedFilesPage sharedFilesPage; + private final String password = "password"; + private UserModel testUser1; + private RepositoryPage repositoryPage; //@Autowired private HeaderMenuBar headerMenuBar; - - @BeforeClass (alwaysRun = true) - public void setupTest() + //@Autowired + private MyFilesPage myFilesPage; + //@Autowired + private NewFolderDialog newFolderDialog; + + private final ThreadLocal site = new ThreadLocal<>(); + private final String sharedFolderName = "Shared"; + private DocumentLibraryPage2 documentLibraryPage; + private final String folderName ="TestFolder" + RandomData.getRandomAlphanumeric(); + + String document = "Documents"; + String invertSelection = "Invert Selection"; + String all = "All"; + String none = "None"; + String folder = "Folders"; + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + site.set(getDataSite().usingUser(testUser1).createPublicRandomSite()); + + documentLibraryPage = new DocumentLibraryPage2(webDriver); + repositoryPage = new RepositoryPage(webDriver); + headerMenuBar = new HeaderMenuBar(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + } + @AfterMethod(alwaysRun = true) + public void cleanup() { - userService.create(adminUser, adminPassword, user, password, user + domain, "firstName", "lastName"); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName, ""); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); + deleteUsersIfNotNull(testUser1); } @TestRail (id = "C8004") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void selectFile() { - LOG.info("STEP1: Click on Select -> Documents option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.documents")); - assertTrue(sharedFilesPage.isContentSelected(docName), docName + " is selected."); - - LOG.info("STEP2: Click on Select menu -> Invert Selection option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.invertSelection")); - assertFalse(sharedFilesPage.isContentSelected(docName), docName + " is selected."); - - LOG.info("STEP3: Click on Select menu -> All option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.all")); - assertTrue(sharedFilesPage.isContentSelected(docName), docName + " is selected."); - - LOG.info("STEP4: Click on Select menu -> None option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.none")); - assertFalse(sharedFilesPage.isContentSelected(docName), docName + " is selected."); - - LOG.info("STEP5: Click on Select menu -> Folders option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.folders")); - assertFalse(sharedFilesPage.isContentSelected(docName), docName + " is selected."); - - LOG.info("STEP6: Click on checkbox next to file"); - sharedFilesPage.clickCheckBox(docName); - assertTrue(sharedFilesPage.isContentSelected(docName), docName + " is selected."); + String testFile = RandomData.getRandomAlphanumeric() + "testFile.txt"; + + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + documentLibraryPage + .clickCreate() + .clickTextPlain() + .assertCreateContentPageIsOpened() + .typeName(testFile) + .clickCreate(); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + log.info("STEP1: Click 'Select' button and choose 'Documents' option."); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(document); + ArrayList expectedContentList1 = new ArrayList<>(Collections.singletonList(testFile)); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + log.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(invertSelection); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + log.info("STEP3: Click 'Select' button and choose 'All'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(all); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + headerMenuBar + .assertSelectedItemsMenuEnabled(); + log.info("STEP4: Click 'Select' button and choose 'None'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(none); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + log.info("STEP5: Click 'Select' button and choose 'Folders'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(folder); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + log.info("STEP6: Click on document checkbox"); + myFilesPage + .clickCheckBox(testFile); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + repositoryPage + .select_ItemsAction(testFile, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C8005") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void selectFolder() { - LOG.info("STEP1: Click on Select -> Folders option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.folders")); - assertTrue(sharedFilesPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("STEP2: Click on Select menu -> Invert Selection option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.invertSelection")); - assertFalse(sharedFilesPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("STEP3: Click on Select menu -> All option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.all")); - assertTrue(sharedFilesPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("STEP4: Click on Select menu -> None option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.none")); - assertFalse(sharedFilesPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("STEP5: Click on Select menu -> Documents option"); - headerMenuBar.clickSelectMenu(); - headerMenuBar.clickSelectOption(language.translate("documentLibrary.breadcrumb.select.documents")); - assertFalse(sharedFilesPage.isContentSelected(folderName), folderName + " is selected."); - - LOG.info("STEP6: Click on checkbox next to folder"); - sharedFilesPage.clickCheckBox(folderName); - assertTrue(sharedFilesPage.isContentSelected(folderName), folderName + " is selected."); - } - - @AfterClass - public void cleanUp() - { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - - contentService.deleteContentByPath(adminUser, adminPassword, path + docName); - contentService.deleteContentByPath(adminUser, adminPassword, path + folderName); + log.info("Precondition: create folder in Shared folder from user "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderName) + .clickSave(); + myFilesPage + .isContentNameDisplayed(folderName); + + log.info("STEP1: Click 'Select' button and choose 'Folders'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(folder); + ArrayList expectedContentList1 = new ArrayList<>(Collections.singletonList(folderName)); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + log.info("STEP2: Click 'Select' button and choose 'Invert Selection' option"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(invertSelection); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + log.info("STEP3: Click 'Select' button and choose 'All'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(all); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + log.info("STEP4: Click 'Select' button and choose 'None'"); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(none); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + log.info("STEP5: Click 'Select' button and choose 'Documents' option."); + headerMenuBar + .clickSelectMenu() + .click_SelectOption(document); + myFilesPage + .assertContentItemsNotSelected(expectedContentList1); + log.info("STEP6: Click on folder checkbox"); + myFilesPage + .clickCheckBox(folderName); + myFilesPage + .assertContentItemsSelected(expectedContentList1); + repositoryPage + .select_ItemsAction(folderName, ItemActions.DELETE_FOLDER) + .clickOnDeleteButtonOnDeletePrompt(); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SharedFilesManageAspectsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SharedFilesManageAspectsTests.java index f115cede80..2eedfbff04 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SharedFilesManageAspectsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/SharedFilesManageAspectsTests.java @@ -1,21 +1,28 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.actions; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; +import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.alfrescoContent.aspects.AspectsForm; +import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class SharedFilesManageAspectsTests extends ContextAwareWebTest +import java.util.Arrays; +import java.util.List; + +@Slf4j +public class SharedFilesManageAspectsTests extends BaseTest { //@Autowired @@ -23,87 +30,201 @@ public class SharedFilesManageAspectsTests extends ContextAwareWebTest //@Autowired private SharedFilesPage sharedFilesPage; + private MyFilesPage myFilesPage; + private DeleteDialog deleteDialog; private String userName = String.format("User%s", RandomData.getRandomAlphanumeric()); - private String folderName = String.format("testFolder%s", RandomData.getRandomAlphanumeric()); - private String userName1 = String.format("User1%s", RandomData.getRandomAlphanumeric()); + private String folderNameC8038 = String.format("testFolderC8038%s", RandomData.getRandomAlphanumeric()); + private String folderNameC8034 = String.format("testFolderC8038%s", RandomData.getRandomAlphanumeric()); + private String folderNameC13761 = String.format("testFolderC13761%s", RandomData.getRandomAlphanumeric()); + + private final String sharedFolderName = "Shared"; + private RepositoryPage repositoryPage; + private NewFolderDialog newFolderDialog; + private DocumentLibraryPage documentLibraryPage; + private static final String classifiableAspect = "Classifiable"; + + private UserModel testUser1; + private UserModel testUser2; + private final String user2 = "User2" + RandomData.getRandomAlphanumeric(); + private final String user1 = "User1" + RandomData.getRandomAlphanumeric(); + private final String password = "password"; + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user1, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + + repositoryPage = new RepositoryPage(webDriver); + aspectsForm = new AspectsForm(webDriver); + myFilesPage = new MyFilesPage(webDriver); + newFolderDialog = new NewFolderDialog(webDriver); + aspectsForm = new AspectsForm(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + sharedFilesPage = new SharedFilesPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + } - @BeforeClass (alwaysRun = true) - public void setupTest() + @AfterMethod(alwaysRun = true) + public void cleanup() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - userService.create(adminUser, adminPassword, userName1, password, userName1 + domain, userName1, userName1); - contentService.createFolderInRepository(userName, password, folderName, "Shared"); + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + } @TestRail (id = "C8038") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) public void checkManageAspectActions() { - LOG.info("Preconditions: Login to Share and navigate to 'Shared Files' page"); - setupAuthenticatedSession(userName, password); - sharedFilesPage.navigate(); - - LOG.info("Step1: Click 'More'->'Manage Aspects' action for created folder and verify the Manage Aspects Form"); - sharedFilesPage.selectItemAction(folderName, ItemActions.MANAGE_ASPECTS); - assertTrue(aspectsForm.isAspectsFormTitleDisplayed(), "Aspects for the file form is not diplayed"); - assertTrue(aspectsForm.isAvailableToAddPanelDisplayed(), "Available to Add panel is not diaplyed"); - assertTrue(aspectsForm.isCurrentlySelectedPanel(), "Currently Selected panel is not diaplyed"); - assertTrue(aspectsForm.areAddButtonsDisplayed(), "Add buttons are not displayed for all the available to add aspects"); - assertTrue(aspectsForm.areRemoveButtonsDisplayed(), "Remove buttons are not displayed for all the selected aspects"); - assertTrue(aspectsForm.isSaveButtonDisplayed(), "Apply Chnages button is not displayed"); - assertTrue(aspectsForm.isCancelButtonDisplayed(), "Cancel button is not displayed"); - assertTrue(aspectsForm.isCloseButtonDisplayed(), "Close button is not displayed"); + log.info("Precondition: create folder in Shared folder from user "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderNameC8038) + .clickSave(); + myFilesPage + .isContentNameDisplayed(folderNameC8038); + + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + log.info("Step1: Click 'More'->'Manage Aspects' action for created folder and verify the Manage Aspects form"); + repositoryPage + .select_ItemsAction(folderNameC8038, ItemActions.MANAGE_ASPECTS); + + aspectsForm + .assertIsAspectsFormTitleDisplayed() + .assertIsAvailableToAddPanelDisplayed() + .assertIsCurrentlySelectedPanel() + .assertAreAddButtonsDisplayed() + .assertmIsApplyChangesButtonDisplayed() + .assertAreRemoveButtonsDisplayed() + .assertmIsCancelButtonDisplayed() + .assertmIsCloseButtonDisplayed(); + aspectsForm + .clickCloseButton(); + log.info("Delete folder"); + repositoryPage + .select_ItemsAction(folderNameC8038, ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); + } @TestRail (id = "C8034") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) public void manageAspectsApplyChanges() { - LOG.info("Preconditions: Login to Share and navigate to 'Shared Files' page"); - setupAuthenticatedSession(userName, password); - sharedFilesPage.navigate(); - - LOG.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); - sharedFilesPage.selectItemAction(folderName, ItemActions.MANAGE_ASPECTS); - - LOG.info("Step2: From 'Available to Add' list, click 'Add' icon next to an aspect and verify it's displayed in 'Currently Selected' list"); - aspectsForm.addAspect("Classifiable"); - assertTrue(aspectsForm.isAspectPresentOnCurrentlySelectedList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); - assertFalse(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is present on 'Available to Add' list"); - - LOG.info("Step3: Click 'Apply Changes' and verify the aspect is added"); - aspectsForm.clickApplyChangesButton(); - sharedFilesPage.selectItemAction(folderName, ItemActions.MANAGE_ASPECTS); - assertTrue(aspectsForm.isAspectPresentOnCurrentlySelectedList("Classifiable"), "Aspect is not added to 'Currently Selected' list"); - assertFalse(aspectsForm.isAspectPresentOnAvailableAspectList("Classifiable"), "Aspect is present on 'Available to Add' list"); + log.info("Precondition: create folder in Shared folder from user "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderNameC8034) + .clickSave(); + myFilesPage + .isContentNameDisplayed(folderNameC8034); + + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + log.info("Step1: Click 'More'->'Manage Aspects' action for the created folder"); + repositoryPage + .selectItemAction(folderNameC8034, ItemActions.MANAGE_ASPECTS); + + log.info("Step2: From 'Available to Add' list, click 'Add' icon next to an aspect and verify it's displayed in 'Currently Selected' list"); + aspectsForm + .assertAspactPresentInAvailableList(classifiableAspect) + .addAspect(classifiableAspect); + aspectsForm + .assertAspactPresentInCurrentlySelectedList(classifiableAspect); + + log.info("Step3: Click 'Apply Changes' and verify the aspect is added"); + aspectsForm + .clickApplyChangesButton(); + repositoryPage + .selectItemAction(folderNameC8034, ItemActions.MANAGE_ASPECTS); + aspectsForm + .assertAspactPresentInCurrentlySelectedList(classifiableAspect); + + aspectsForm + .clickCloseButton(); + log.info("Delete folder"); + repositoryPage + .select_ItemsAction(folderNameC8034, ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); + } + @TestRail (id = "C13761") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void manageAspectsActionMissing() { - LOG.info("Preconditions: Login to Share and navigate to 'Shared Files' page"); - setupAuthenticatedSession(userName1, password); - sharedFilesPage.navigate(); - - LOG.info("Step1: Hover over the folder created by other user and verify 'Manage Aspects' action is missing"); - sharedFilesPage.mouseOverContentItem(folderName); - Assert.assertFalse(sharedFilesPage.isMoreMenuDisplayed(folderName), "'More' menu not displayed for " + folderName); - Assert.assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(folderName, ItemActions.MANAGE_ASPECTS)); - } - - @AfterClass - public void deleteContent() - { - contentService.deleteContentByPath(userName, password, "/Shared/" + folderName); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - - userService.delete(adminUser, adminPassword, userName1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName1); - - contentService.deleteContentByPath(adminUser, adminPassword, "/Shared/" + folderName); + log.info("Precondition: create folder in Shared folder from user2 "); + authenticateUsingLoginPage(testUser2); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + myFilesPage + .click_CreateButton() + .click_FolderLink(); + newFolderDialog + .typeName(folderNameC13761) + .clickSave(); + myFilesPage + .isContentNameDisplayed(folderNameC13761); + log.info("login wih user1 and navigate shared folder "); + authenticateUsingLoginPage(testUser1); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .isContentNameDisplayed(folderNameC13761); + + log.info(" Hover over the folder and validated more option is not available "); + sharedFilesPage + .mouseOverContentItem(folderNameC13761); + documentLibraryPage + .assertisMoreMenuNotDisplayed(folderNameC13761); + List notExpectedActions = Arrays + .asList("Manage Aspects"); + documentLibraryPage.assertActionsNoteAvailableForLibrary(folderNameC13761,notExpectedActions); + log.info("Delete folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .select_ItemsAction(folderNameC13761, ItemActions.DELETE_FOLDER); + deleteDialog + .confirmDeletion(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UnzipContentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UnzipContentTests.java index d6305e6293..86a24b70be 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UnzipContentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UnzipContentTests.java @@ -2,67 +2,66 @@ import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.DeleteDialog; -import org.alfresco.po.share.alfrescoContent.SharedFilesPage; +import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.UploadContent; import org.alfresco.po.share.alfrescoContent.organizingContent.CopyMoveUnzipToDialog; -import org.alfresco.po.share.alfrescoContent.pageCommon.HeaderMenuBar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class UnzipContentTests extends ContextAwareWebTest +public class UnzipContentTests extends BaseTest { - private final String user = String.format("C8040TestUser%s", RandomData.getRandomAlphanumeric()); - private final String path = "Shared"; - private final String zipFile = "archiveC8040.zip"; - private final String zipContent = "fileC8040"; - private final String acpFile = "archiveC8041.acp"; - // @Autowired - HeaderMenuBar headerMenuBar; - //@Autowired + + private final String zipContent = "testFile1"; UploadContent uploadContent; //@Autowired - DeleteDialog deleteDialog; - //@Autowired - private SharedFilesPage sharedFilesPage; - //@Autowired private DocumentDetailsPage documentDetailsPage; //@Autowired private CopyMoveUnzipToDialog unzipToDialog; + private final ThreadLocal user = new ThreadLocal<>(); + private RepositoryPage repositoryPage; + private DeleteDialog deleteDialog; + private MyFilesPage myFilesPage; + private final String sharedFolderName = "Shared"; + private final String zipFile = "testFileC8256.zip"; + private final String zipFilePath = testDataFolder + zipFile; + private final String acpFile = "archiveC8257.acp"; + private final String acpPath = testDataFolder + acpFile; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - setupAuthenticatedSession(user, password); - contentService.uploadFileInRepository(adminUser, adminPassword, path, testDataFolder + zipFile); - contentService.uploadFileInRepository(adminUser, adminPassword, path, testDataFolder + acpFile); - } - @AfterClass - public void deleteContent() - { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingCookies(user.get()); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + zipFile); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + acpFile); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + "fileC8040.txt"); - contentService.deleteTreeByPath(adminUser, adminPassword, path + "/" + "archiveC7410"); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + unzipToDialog = new CopyMoveUnzipToDialog(webDriver); + deleteDialog = new DeleteDialog(webDriver); + } + @AfterMethod(alwaysRun = true) + public void cleanup() + { + deleteUsersIfNotNull(user.get()); } @@ -70,43 +69,67 @@ public void deleteContent() @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void unzipZipArchiveToSharedFile() { - sharedFilesPage.navigate(); - LOG.info("STEP1: Click archive name, e.g: testArchive"); - sharedFilesPage.clickOnFile(zipFile); - assertTrue(documentDetailsPage.getFileName().equals(zipFile), "Wrong file name!"); - LOG.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); - documentDetailsPage.clickDocumentActionsOption("Unzip to..."); - assertEquals(unzipToDialog.getDialogTitle(), "Unzip " + zipFile + " to...", "'Unzip to....' dialog is displayed"); - LOG.info("STEP3: Select option Shared Files from 'Destination' section"); - unzipToDialog.selectSharedFilesDestination(); - String expectedDestionationPath = "Shared Files"; - //assertEquals(unzipToDialog.getPathFirstItem(), expectedDestionationPath, "Destination set to="); - //Assert.assertTrue(unzipToDialog.getPathList().contains(expectedDestionationPath), "Destination set to = "); - LOG.info("STEP4: Click 'Unzip' button and navigate to Shared Files"); - unzipToDialog.clickUnzipButton(); - sharedFilesPage.navigate(); - assertTrue(sharedFilesPage.isContentNameDisplayed(zipContent), zipFile + "'s content is displayed, " + zipContent); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(zipFilePath); + log.info("STEP1: Click archive name, e.g: testArchive"); + myFilesPage + .clickOnFile(zipFile); + documentDetailsPage + .assertContentNameEquals(zipFile); + log.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); + documentDetailsPage + .clickDocumentActionsOption("Unzip to..."); + assertEquals(unzipToDialog + .getDialogTitle(), + "Unzip " + zipFile + " to...", "'Unzip to....' dialog is displayed"); + + log.info("STEP3: Select option My Files from 'Destination' section"); + unzipToDialog + .selectSharedFilesDestination(); + log.info("STEP4: Click 'Unzip' button and navigate to My Files"); + unzipToDialog + .clickUnzipButton(); + documentDetailsPage + .clickOpenedFloder(); + myFilesPage + .assertIsContantNameDisplayed(zipContent); + log.info("Delete unzip and text file "); + repositoryPage + .select_ItemsAction(zipContent, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); + repositoryPage + .select_ItemsAction(zipFile, ItemActions.DELETE_DOCUMENT); + deleteDialog + .confirmDeletion(); } @TestRail (id = "C8041") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT },enabled = false) public void unzipAcpArchiveToSharedFiles() { - sharedFilesPage.navigate(); - LOG.info("STEP1: Click archive name, e.g: testArchive"); - sharedFilesPage.clickOnFile(acpFile); - assertTrue(documentDetailsPage.getFileName().equals(acpFile), "Wrong file name!"); - LOG.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); - documentDetailsPage.clickDocumentActionsOption("Unzip to..."); - assertEquals(unzipToDialog.getDialogTitle(), "Unzip " + acpFile + " to...", "'Unzip to....' dialog is displayed"); - LOG.info("STEP3: Select option Shared Files from 'Destination' section"); - //unzipToDialog.clickDestinationButton(language.translate("documentLibrary.sharedFiles")); - String expectedDestinationPath = "Shared Files"; - //assertEquals(unzipToDialog.getPathFirstItem(), expectedDestinationPath, "Destionation set to="); - LOG.info("STEP4: Click 'Unzip' button and navigate to Shared Files"); - unzipToDialog.clickUnzipButton(); - sharedFilesPage.navigate(); - assertTrue(sharedFilesPage.isContentNameDisplayed(acpFile.substring(0, acpFile.indexOf("."))), - "A folder with archive name is present in Documents list."); + log.info("Precondition: Login to share and navigate to Repository->Shared "); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + uploadContent + .uploadContent(acpPath); + log.info("STEP1: Click archive name, e.g: testArchive"); + myFilesPage + .clickOnFile(acpFile); + documentDetailsPage + .assertContentNameEquals(acpFile); + log.info("STEP2: Click 'Unzip to...' link from 'Documents Actions'"); + documentDetailsPage + .clickDocumentActionsOption("Unzip to..."); + assertEquals(unzipToDialog + .getDialogTitle(), + "Unzip " + acpFile + " to...", "'Unzip to....' dialog is displayed"); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UploadTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UploadTests.java index 7730e26f53..eaf88639cd 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UploadTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/actions/UploadTests.java @@ -1,137 +1,212 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.actions; import static org.alfresco.common.Utils.testDataFolder; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import org.alfresco.dataprep.CMISUtil; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.MyFilesPage; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.UploadContent; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.report.Bug; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.List; + +@Slf4j + /** * @author Laura.Capsa */ -public class UploadTests extends ContextAwareWebTest +public class UploadTests extends BaseTest { private final String random = RandomData.getRandomAlphanumeric(); private final String user = "user1-" + random; private final String user2 = "user2-" + random; private final String path = "Shared"; + private RepositoryPage repositoryPage; + private DocumentLibraryPage documentLibrary; + private CreateContentPage createContent; + + private MyFilesPage myFilesPage; + private final String password = "password"; + private UserModel testUser1; + private UserModel testUser2; private final String doc1 = random + "-testFile-C7939-.txt"; private final String doc2 = random + "-OldFile-C7942.txt"; private final String newDoc2 = random + "-NewFile-C7942.txt"; private final String doc3 = "Doc-C13756-" + random; - // @Autowired private SharedFilesPage sharedFilesPage; - //@Autowired private DocumentDetailsPage documentDetailsPage; - //@Autowired private UploadContent uploadContent; + private DocumentLibraryPage documentLibraryPage; + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + + repositoryPage = new RepositoryPage(webDriver); + createContent = new CreateContentPage(webDriver); + documentLibrary = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); + myFilesPage = new MyFilesPage(webDriver); + uploadContent = new UploadContent(webDriver); + sharedFilesPage = new SharedFilesPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); - userService.create(adminUser, adminPassword, user2, password, user + domain, user2, user2); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, doc3, ""); } @TestRail (id = "C7939") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT}) public void uploadDocument() { - setupAuthenticatedSession(user, password); + + authenticateUsingLoginPage(testUser1); String testFilePath = testDataFolder + doc1; - LOG.info("Precondition: Navigate to Shared Files page."); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - LOG.info("STEP1: Upload a file."); - uploadContent.uploadContent(testFilePath); - assertTrue(sharedFilesPage.isContentNameDisplayed(doc1), String.format("File [%s] is displayed", doc1)); - LOG.info("STEP2: Logout and login with another user"); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - LOG.info("STEP3: Navigate to Shared Files page"); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertTrue(sharedFilesPage.isContentNameDisplayed(doc1), String.format("File [%s] is displayed", doc1)); - cleanupAuthenticatedSession(); + log.info("Precondition: Navigate to Shared Files page."); + sharedFilesPage + .navigate(); + log.info("STEP1: Upload a file."); + uploadContent + .uploadContent(testFilePath); + myFilesPage + .assertIsContantNameDisplayed(doc1); + log.info("STEP2: Logout and login with another user"); + authenticateUsingLoginPage(testUser2); + log.info("STEP3: Navigate to Shared Files page"); + sharedFilesPage + .navigate(); + myFilesPage + .assertIsContantNameDisplayed(doc1); + log.info(" Delete the created document"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigate(); + repositoryPage.select_ItemsAction(doc1, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + + + } @Bug (id = "MNT-18059", status = Bug.Status.FIXED) @TestRail (id = "C7942") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void updateDocumentNewVersion() { String testFilePath = testDataFolder + doc2; String newVersionFilePath = testDataFolder + newDoc2; - setupAuthenticatedSession(adminUser, adminPassword); - LOG.info("Precondition: Navigate to Shared Files page and upload a file"); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); - uploadContent.uploadContent(testFilePath); - LOG.info("STEP1: Click on the file and check content"); - sharedFilesPage.clickOnFile(doc2); - assertEquals(documentDetailsPage.getContentText(), "contents", String.format("Contents of %s are wrong.", doc2)); - LOG.info("STEP2: Navigate to Shared Files page and click on upload new version"); - sharedFilesPage.navigate(); - sharedFilesPage.selectItemAction(doc2, ItemActions.UPLOAD_NEW_VERSION); - LOG.info("STEP3: Select file to upload. Update version"); - uploadContent.updateDocumentVersion(newVersionFilePath, "comments", UploadContent.Version.Major); - getBrowser().waitInSeconds(2); - assertTrue(sharedFilesPage.isContentNameDisplayed(newDoc2), String.format("File [%s] is displayed", newDoc2)); - assertFalse(sharedFilesPage.isContentNameDisplayed(doc2), doc2 + " is displayed."); - LOG.info("STEP4: Click on the file and check the version and content are updated."); - sharedFilesPage.clickOnFile(newDoc2); - assertEquals(documentDetailsPage.getContentText(), "updated by upload new version", String.format("Contents of %s are wrong.", newDoc2)); - assertEquals(documentDetailsPage.getFileVersion(), "2.0", String.format("Version of %s is wrong.", newDoc2)); - LOG.info("STEP5: Logout and login with another user"); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - LOG.info("STEP6: Navigate to Shared Files page"); - sharedFilesPage.navigate(); - assertTrue(sharedFilesPage.isContentNameDisplayed(newDoc2), String.format("File [%s] is displayed", newDoc2)); - assertFalse(sharedFilesPage.isContentNameDisplayed(doc2), String.format("File [%s] is displayed", doc2)); - LOG.info("STEP7: Navigate to newFile details page"); - sharedFilesPage.clickOnFile(newDoc2); - assertEquals(documentDetailsPage.getContentText(), "updated by upload new version", String.format("Contents of %s are wrong.", newDoc2)); - assertEquals(documentDetailsPage.getFileVersion(), "2.0", String.format("Version of %s is wrong.", newDoc2)); - cleanupAuthenticatedSession(); - } + authenticateUsingLoginPage(testUser1); + log.info("Precondition: Navigate to Shared Files page and upload a file"); + sharedFilesPage + .navigate(); + uploadContent + .uploadContent(testFilePath); + log.info("STEP1: Click on the file and check content"); + sharedFilesPage + .clickOnFile(doc2); + log.info("STEP2: Navigate to Shared Files page and click on upload new version"); + sharedFilesPage + .navigate(); + sharedFilesPage + .selectItemAction(doc2, ItemActions.UPLOAD_NEW_VERSION); + log.info("STEP3: Select file to upload. Update version"); + uploadContent + .updateDocumentVersion(newVersionFilePath, "comments", UploadContent.Version.Major); + myFilesPage + .assertIsContantNameDisplayed(newDoc2); + myFilesPage + .assertIsContentDeleted(doc2); + log.info("STEP4: Click on the file and check the version and content are updated."); + sharedFilesPage + .clickOnFile(newDoc2); + documentDetailsPage + .assertFileContentEquals("updated by upload new version"); + documentDetailsPage + .assertVerifyFileVersion("2.0"); + log.info("STEP5: Logout and login with another user"); + authenticateUsingLoginPage(testUser2); + log.info("STEP6: Navigate to Shared Files page"); + sharedFilesPage + .navigate(); + myFilesPage + .assertIsContantNameDisplayed(newDoc2); + myFilesPage + .assertIsContentDeleted(doc2); + log.info("STEP7: Navigate to newFile details page"); + sharedFilesPage + .clickOnFile(newDoc2); + documentDetailsPage + .assertFileContentEquals("updated by upload new version"); + documentDetailsPage + .assertVerifyFileVersion("2.0"); + log.info(" Delete the created document"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigate(); + repositoryPage.select_ItemsAction(newDoc2, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C13756") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) public void optionNotDisplayed() { - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); - LOG.info("STEP1: Hover over the file"); - assertFalse(sharedFilesPage.isActionAvailableForLibraryItem(doc3, ItemActions.UPLOAD_NEW_VERSION), - language.translate("documentLibrary.contentAction.uploadNewVersion") + " option is displayed for " + doc3); - cleanupAuthenticatedSession(); + String testFilePath = testDataFolder + doc3; + log.info("STEP1: login with user2 and upload a file "); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigate(); + uploadContent + .uploadContent(testFilePath); + log.info("STEP1: logout and login with user1 and navigate to shared files page"); + authenticateUsingLoginPage(testUser1); + sharedFilesPage + .navigate(); + repositoryPage + .isContentNameDisplayed(doc3); + log.info("STEP3: Hover over the folder and validated more option is not available "); + sharedFilesPage + .mouseOverContentItem(doc3); + documentLibraryPage + .assertisMoreMenuNotDisplayed(doc3); + log.info("STEP4: Hover over and check for Upload New Version option"); + List notExpectedActions = Arrays + .asList("Upload New Version"); + documentLibraryPage.assertActionsNoteAvailableForLibrary(doc3,notExpectedActions); + log.info(" Delete the created document"); + authenticateUsingLoginPage(testUser2); + sharedFilesPage + .navigate(); + repositoryPage.select_ItemsAction(doc3, ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } - @AfterClass - public void cleanUp() + @AfterMethod(alwaysRun = true) + public void cleanup() { - contentService.deleteContentByPath(user, password, path + "/" + doc1); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + newDoc2); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + doc3); - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - userService.delete(adminUser, adminPassword, user2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2); + + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + + } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/LikeCommentTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/LikeCommentTests.java index 9d03d63ae4..03e25bd66c 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/LikeCommentTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/LikeCommentTests.java @@ -1,160 +1,193 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.additionalActions; -import static org.alfresco.dataprep.CMISUtil.DocumentType.TEXT_PLAIN; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.SharedFilesPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.document.SocialFeatures; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.ItemActions; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.FileType; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; + +@Slf4j /** * @author Laura.Capsa */ -public class LikeCommentTests extends ContextAwareWebTest +public class LikeCommentTests extends BaseTest { private final String uniqueId = RandomData.getRandomAlphanumeric(); - private final String user = "user" + uniqueId; - private final String fileName1 = uniqueId + "testFile1.txt"; - private final String fileName2 = uniqueId + "testFile2.txt"; - private final String folderName1 = uniqueId + "folder1"; - private final String folderName2 = uniqueId + "folder2"; - private final String path = "Shared/"; private final String comment = "Comment " + uniqueId; - //@Autowired private DocumentDetailsPage documentDetailsPage; - //@Autowired private SharedFilesPage sharedFilesPage; - //@Autowired + private DeleteDialog deleteDialog; private SocialFeatures social; - - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user, password, user + domain, "firstname", user); - contentService.createDocumentInRepository(adminUser, adminPassword, path, TEXT_PLAIN, fileName2, fileName2 + " Content"); - contentAction.likeContent(user, password, path + fileName2); - contentService.createFolderInRepository(adminUser, adminPassword, folderName2, path); - contentAction.likeContent(user, password, path + folderName2); - contentService.createDocumentInRepository(adminUser, adminPassword, path, TEXT_PLAIN, fileName1, fileName1 + " Content"); - contentService.createFolderInRepository(adminUser, adminPassword, folderName1, path); - - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files"); + private UserModel testUser1; + private FolderModel testFolder; + private FileModel testFile; + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + sharedFilesPage = new SharedFilesPage(webDriver); + social = new SocialFeatures(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Create Folder and File in Admin Repository-> User Homes "); + authenticateUsingLoginPage(testUser1); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingUser(testUser1).usingShared().createFolder(testFolder).assertThat().existsInRepo(); + + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingUser(testUser1).usingShared().createFile(testFile).assertThat().existsInRepo(); + authenticateUsingCookies(getAdminUser()); + + sharedFilesPage + .navigateByMenuBar() + .assertBrowserPageTitleIs("Alfresco » Shared Files"); } @TestRail (id = "C8097") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 1) + @Test(groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 1) public void likeFile() { - LOG.info("Step 1: Hover over the file Like link."); - assertTrue(sharedFilesPage.isLikeButtonDisplayed(fileName1), "Documents link is not present"); - assertEquals(social.getLikeButtonMessage(fileName1), "Like this document", "Like Button message="); - assertEquals(social.getNumberOfLikes(fileName1), 0, "The number of likes="); - - LOG.info("Step 2: Click on the Like button"); - social.clickLikeButton(fileName1); - assertEquals(social.getNumberOfLikes(fileName1), 1, fileName1 + "The number of likes="); - assertTrue(social.isLikeButtonEnabled(fileName1), "Like button is enabled"); - assertEquals(social.getLikeButtonMessage(fileName1), "Unlike", "Like Button message="); + log.info("Step 1: Hover over the file Like link."); + assertTrue(sharedFilesPage.isLikeButtonDisplayed(testFile.getName()), "Documents link is not present"); + assertEquals(social.getLikeButtonMessage(testFile.getName()), "Like this document", "Like Button message="); + assertEquals(social.getNumberOfLikes(testFile.getName()), 0, "The number of likes="); + + log.info("Step 2: Click on the Like button"); + social.clickLikeButton(testFile.getName()); + assertEquals(social.getNumberOfLikes(testFile.getName()), 1, testFile + "The number of likes="); + assertTrue(social.isLikeButtonEnabled(testFile.getName()), "Like button is enabled"); + assertEquals(social.getLikeButtonMessage(testFile.getName()), "Unlike", "Like Button message="); } - @TestRail (id = "C8098") + @TestRail(id = "C8098") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 2) public void likeFolder() { - LOG.info("Step 1: Hover over the folder's Like link."); - sharedFilesPage.navigate(); - assertTrue(sharedFilesPage.isLikeButtonDisplayed(folderName1), "Documents link is displayed"); - assertEquals(social.getLikeButtonMessage(folderName1), "Like this folder", "Like Button message="); - assertEquals(social.getNumberOfLikes(folderName1), 0, "The number of likes="); - - LOG.info("Step 2: Click on the Like button"); - social.clickLikeButton(folderName1); - assertEquals(social.getNumberOfLikes(folderName1), 1, "The number of likes="); - assertTrue(social.isLikeButtonEnabled(folderName1), "Like button is enabled"); - assertEquals(social.getLikeButtonMessage(folderName1), "Unlike", "Like Button message="); + log.info("Step 1: Hover over the folder's Like link."); + assertTrue(sharedFilesPage.isLikeButtonDisplayed(testFolder.getName()), "Documents link is displayed"); + assertEquals(social.getLikeButtonMessage(testFolder.getName()), "Like this folder", "Like Button message="); + assertEquals(social.getNumberOfLikes(testFolder.getName()), 0, "The number of likes="); + + log.info("Step 2: Click on the Like button"); + social.clickLikeButton(testFolder.getName()); + assertEquals(social.getNumberOfLikes(testFolder.getName()), 1, "The number of likes="); + assertTrue(social.isLikeButtonEnabled(testFolder.getName()), "Like button is enabled"); + assertEquals(social.getLikeButtonMessage(testFolder.getName()), "Unlike", "Like Button message="); } @TestRail (id = "C8099") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 3) public void unlikeFile() { - LOG.info("Step 1: Hover over the file Like link."); - assertEquals(social.getLikeButtonEnabledText(fileName2), "Unlike", "Unlike is displayed"); - assertEquals(social.getNumberOfLikes(fileName2), 1, "The number of likes="); + log.info("Precondition: Click on the Like button for File Created"); + assertTrue(sharedFilesPage.isLikeButtonDisplayed(testFile.getName()), "Documents link is displayed"); + social.clickLikeButton(testFile.getName()); + + log.info("Step 1: Hover over the file Like link."); + assertEquals(social.getLikeButtonEnabledText(testFile.getName()), "Unlike", "Unlike is displayed"); + assertEquals(social.getNumberOfLikes(testFile.getName()), 1, "The number of likes="); - LOG.info("Step 2: Click on Unlike"); - social.clickUnlike(fileName2); - assertEquals(social.getNumberOfLikes(fileName2), 0, "The number of likes="); + log.info("Step 2: Click on Unlike"); + social.clickUnlike(testFile.getName()); + assertEquals(social.getNumberOfLikes(testFile.getName()), 0, "The number of likes="); } @TestRail (id = "C8100") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 4) public void unlikeFolder() { - LOG.info("Step 1: Hover over the folder's Like link."); - assertEquals(social.getLikeButtonEnabledText(folderName2), "Unlike", "Unlike is displayed"); - assertEquals(social.getNumberOfLikes(folderName2), 1, "The number of likes="); + log.info("Precondition: Click on the Like button for Folder"); + assertTrue(sharedFilesPage.isLikeButtonDisplayed(testFolder.getName()), "Documents link is displayed"); + social.clickLikeButton(testFolder.getName()); - LOG.info("Step 2: Click on Unlike"); - social.clickUnlike(folderName2); - assertEquals(social.getNumberOfLikes(folderName2), 0, "The number of likes="); + log.info("Step 1: Hover over the folder's Like link."); + assertEquals(social.getLikeButtonEnabledText(testFolder.getName()), "Unlike", "Unlike is displayed"); + assertEquals(social.getNumberOfLikes(testFolder.getName()), 1, "The number of likes="); + + log.info("Step 2: Click on Unlike"); + social.clickUnlike(testFolder.getName()); + assertEquals(social.getNumberOfLikes(testFolder.getName()), 0, "The number of likes="); } @TestRail (id = "C8101") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 5) public void addCommentToFile() { - LOG.info("STEP1: Hover over a document and press \"Comment\""); - social.clickCommentLink(fileName1); -// assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Document Details", "Displayed page="); + log.info("STEP1: Hover over a document and press \"Comment\""); + social + .clickCommentLink(testFile.getName()); + documentDetailsPage + .assertBrowserPageTitleIs("Alfresco » Document Details"); - LOG.info("STEP2: In the \"Comments\" area of Document Details page write a comment and press \"Add Comment\" button"); + log.info("STEP2: In the \"Comments\" area of Document Details page write a comment and press \"Add Comment\" button"); documentDetailsPage.addComment(comment); assertEquals(documentDetailsPage.getCommentContent(), comment, "Comment="); - LOG.info("STEP3: Navigate to Shared Files page"); - sharedFilesPage.navigate(); - assertEquals(social.getNumberOfComments(fileName1), 1, "Number of comments="); + log.info("STEP3: Navigate to Shared Files page"); + sharedFilesPage.navigateByMenuBar(); + social + .assertNoOfCommentsVerify(testFile.getName(),1); } @TestRail (id = "C8102") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }, priority = 6) public void addCommentToFolder() { - LOG.info("STEP1: Hover over a document and press \"Comment\""); - sharedFilesPage.navigate(); - social.clickCommentLink(folderName1); -// assertEquals(documentDetailsPage.getPageTitle(), "Alfresco » Folder Details", "Displayed page="); + log.info("STEP1: Hover over a document and press \"Comment\""); + sharedFilesPage.navigateByMenuBar(); + social.clickCommentLink(testFolder.getName()); + documentDetailsPage + .assertBrowserPageTitleIs("Alfresco » Folder Details"); - LOG.info("STEP2: In the \"Comments\" area of Document Details page write a comment and press \"Add Comment\" button"); + log.info("STEP2: In the \"Comments\" area of Document Details page write a comment and press \"Add Comment\" button"); documentDetailsPage.addComment(comment); assertEquals(documentDetailsPage.getCommentContent(), comment, "Comment="); - LOG.info("STEP3: Navigate to Shared Files page"); - sharedFilesPage.navigate(); - assertEquals(social.getNumberOfComments(folderName1), 1, "Number of comments="); + log.info("STEP3: Navigate to Shared Files page"); + sharedFilesPage.navigateByMenuBar(); + social + .assertNoOfCommentsVerify(testFolder.getName(),1); } - @AfterClass + @AfterMethod public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - contentService.deleteContentByPath(adminUser, adminPassword, path + fileName1); - contentService.deleteContentByPath(adminUser, adminPassword, path + fileName2); - contentService.deleteContentByPath(adminUser, adminPassword, path + folderName1); - contentService.deleteContentByPath(adminUser, adminPassword, path + folderName2); + log.info("Delete the File Created in Precondition"); + authenticateUsingLoginPage(getAdminUser()); + sharedFilesPage.navigateByMenuBar(); + sharedFilesPage.selectItemAction(testFile.getName(), ItemActions.DELETE_DOCUMENT); + deleteDialog.confirmDeletion(); + + log.info("Delete the Folder Created in Precondition"); + sharedFilesPage.navigateByMenuBar(); + sharedFilesPage.selectItemAction(testFolder.getName(), ItemActions.DELETE_FOLDER); + deleteDialog.confirmDeletion(); + + log.info("Delete the User Created in Precondition"); + deleteUsersIfNotNull(testUser1); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/TagTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/TagTests.java index f41c706f5e..6db02b327f 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/TagTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/alfrescoContent/workingWithFilesOutsideTheLibrary/sharedFiles/additionalActions/TagTests.java @@ -1,254 +1,353 @@ package org.alfresco.share.alfrescoContent.workingWithFilesOutsideTheLibrary.sharedFiles.additionalActions; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Collections; - -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.po.share.alfrescoContent.SharedFilesPage; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.alfrescoContent.RepositoryPage; import org.alfresco.po.share.alfrescoContent.organizingContent.taggingAndCategorizingContent.SelectDialog; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; +import org.alfresco.po.share.site.DocumentLibraryPage2; import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.FileType; +import org.apache.commons.lang.RandomStringUtils; +import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class TagTests extends ContextAwareWebTest +public class TagTests extends BaseTest { - private final String random = RandomData.getRandomAlphanumeric(); - private final String docName = "Doc-C8062-" + random; - private final String docName2 = "Doc-C8074-" + random; - private final String docName3 = "Doc-C8087-" + random; - private final String docName4 = "Doc-C8096-" + random; - private final String docName5 = "Doc-C13766" + random; - private final String folderForTagTests = "folderForTagTests" + random; - private final String folderName = "Folder-C8063-" + random; - private final String folderName2 = "Folder-C8074-" + random; - private final String folderName3 = "Folder-C13766-" + random; - private final String tagNameFile = "tagFile-C8062-" + random; - private final String tagName = "tag1-" + random; - private final String tagName2 = "tag2-" + random; - private final String tagNameFolder = "tagNameFolder-C8063-" + random; - private final String editedTag = "editedTag-C8086-" + random; - private final String sharedPath = "Shared/"; - private final String path = "Shared/" + folderForTagTests; - private final String user = "User" + random; - private final String path13766 = "Shared/" + folderName3; - //@Autowired - private SharedFilesPage sharedFilesPage; - @Autowired + private final String user = "User" + RandomData.getRandomAlphanumeric(); + private UserModel testUser2; + private final String user2 = "User2" + RandomData.getRandomAlphanumeric(); + + // @Autowired private EditPropertiesDialog editPropertiesDialog; //@Autowired private SelectDialog selectDialog; - - @BeforeClass (alwaysRun = true) - public void setupTest() - { - contentService.createFolderInRepository(adminUser, adminPassword, folderForTagTests, sharedPath); - contentService.createFolderInRepository(adminUser, adminPassword, folderName3, sharedPath); - contentService.createFolderInRepository(adminUser, adminPassword, folderName, path); - contentService.createFolderInRepository(adminUser, adminPassword, folderName2, path); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName, ""); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName2, ""); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName3, ""); - contentService.createDocumentInRepository(adminUser, adminPassword, path, CMISUtil.DocumentType.TEXT_PLAIN, docName4, ""); - contentService.createDocumentInRepository(adminUser, adminPassword, path13766, CMISUtil.DocumentType.TEXT_PLAIN, docName5, ""); - contentAction.addSingleTag(adminUser, adminPassword, path + "/" + folderName2, tagName2); - userService.create(adminUser, adminPassword, user, password, user + domain, user, user); + private final String password = "password"; + private UserModel testUser1; + private final ThreadLocal site = new ThreadLocal<>(); + private RepositoryPage repositoryPage; + //@Autowired + private DocumentLibraryPage2 documentLibraryPage; + private final String sharedFolderName = "Shared"; + private final String tagC8096 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private final String anothertagC8096 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private FolderModel folderToCheck; + FileModel fileToCheck; + private final String tagC8063 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private final String tagC8062 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + private final String tagC8074 = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + + @BeforeMethod(alwaysRun = true) + public void setupTest() throws Exception { + + log.info("PreCondition1: Any test user is created"); + testUser1 = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + fileToCheck = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "description"); + getCmisApi().usingUser(testUser1).usingShared().createFile(fileToCheck).assertThat().existsInRepo(); + + editPropertiesDialog = new EditPropertiesDialog(webDriver); + selectDialog = new SelectDialog(webDriver); + documentLibraryPage = new DocumentLibraryPage2(webDriver); + repositoryPage = new RepositoryPage(webDriver); + repositoryPage = new RepositoryPage(webDriver); } - - @BeforeMethod (alwaysRun = true) - public void beforeMethod() + @AfterMethod(alwaysRun = true) + public void cleanup() { - setupAuthenticatedSession(adminUser, adminPassword); - sharedFilesPage.navigate(); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - sharedFilesPage.clickOnFolderName(folderForTagTests); + deleteUsersIfNotNull(testUser1); } @TestRail (id = "C8062") - @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT, "tobefixed" }) - public void createTagForFile() - { - LOG.info("STEP1: Hover over one tag from the content name"); - sharedFilesPage.mouseOverNoTags(docName); - - LOG.info("STEP2: Click \"Tag\" icon"); - sharedFilesPage.clickEditTagIcon(docName); - assertTrue(sharedFilesPage.isEditTagInputFieldDisplayed(), docName + " -> Edit tag text input field is displayed."); - - LOG.info("STEP3: Type any tag name in the input field and click \"Save\" link"); - sharedFilesPage.typeTagName(tagNameFile); - sharedFilesPage.clickEditTagLink("Save"); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagNameFile.toLowerCase())); - assertEquals(sharedFilesPage.getTags(docName), tagsList.toString(), docName + " -> tags="); + @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) + public void createTagForFile() { + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over one tag from the content name"); + repositoryPage + .mouseOverNoTags(fileToCheck.getName()); + log.info("STEP2: Click \"Edit Tag\" icon"); + documentLibraryPage + .usingContent(fileToCheck) + .clickTagEditIcon(); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + documentLibraryPage.usingContent(fileToCheck) + .setTag(tagC8062) + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(tagC8062); + log.info(" Delete File"); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } + @TestRail (id = "C8063") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void createTagForFolder() - { - LOG.info("STEP1: Hover over the text \"No Tags\" from the folder"); - sharedFilesPage.mouseOverNoTags(folderName); - assertTrue(sharedFilesPage.isEditTagIconDisplayed(folderName), folderName + " -> \"Edit Tag\" icon is displayed"); - - LOG.info("STEP2: Click \"Edit Tag\" icon"); - sharedFilesPage.clickEditTagIcon(folderName); - assertTrue(sharedFilesPage.isEditTagInputFieldDisplayed(), folderName + " -> Edit tag text input field is displayed."); - - LOG.info("STEP3: Type any tag name in the input field and click \"Save\" link"); - sharedFilesPage.typeTagName(tagNameFolder); - sharedFilesPage.clickEditTagLink("Save"); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagNameFolder.toLowerCase())); - assertEquals(sharedFilesPage.getTags(folderName), tagsList.toString(), folderName + " -> tags="); + public void createTagForFolder() throws Exception { + log.info("Precondition: create folder in Shared folder from user2 "); + folderToCheck = FolderModel.getRandomFolderModel(); + getCmisApi().usingUser(testUser1).usingShared().createFolder(folderToCheck).assertThat().existsInRepo(); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .assertFileIsDisplayed(folderToCheck.getName()); + + + repositoryPage + .mouseOverNoTags(folderToCheck.getName()); + log.info("Click Edit Tag icon"); + documentLibraryPage + .usingContent(folderToCheck) + .clickTagEditIcon(); + repositoryPage + .assertEditTagInputFieldDisplayed(folderToCheck.getName()); + log.info("Add tag and click save"); + documentLibraryPage.usingContent(folderToCheck) + .setTag(tagC8063) + .clickSave(); + documentLibraryPage.usingContent(folderToCheck) + .assertTagIsDisplayed(tagC8063); + log.info(" Delete Folder"); + repositoryPage + .select_ItemsAction(folderToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C8074") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void addExistingTag() - { - LOG.info("STEP1: Hover over " + docName2 + ".STEP2: Click \"Edit Properties\" option"); - sharedFilesPage.selectItemAction(docName2, ItemActions.EDIT_PROPERTIES); - assertEquals(editPropertiesDialog.getDialogTitle(), String.format(language.translate("editPropertiesDialog.title"), docName2), "Displayed dialog="); - assertTrue(editPropertiesDialog.isSelectTagsButtonDisplayed(), "'Select' tag button is displayed."); - - LOG.info("STEP3: Click \"Select\" button"); - editPropertiesDialog.clickSelectTags(); - assertEquals(selectDialog.getDialogTitle(), language.translate("selectDialog.title"), "Displayed dialog="); - - LOG.info("STEP4: Pick any tag from the available tags list and click \"Add\""); - selectDialog.typeTag(tagName2.toLowerCase()); - selectDialog.selectItems(Collections.singletonList(tagName2.toLowerCase())); - assertTrue(selectDialog.isItemSelected(tagName2.toLowerCase()), tagName2.toLowerCase() + " is displayed in selected categories list."); - - LOG.info("STEP5: Click \"OK\" button from \"Select\" dialog.\n" + "Click \"Save\" button from \"Edit Properties\" dialog"); - selectDialog.clickOk(); - editPropertiesDialog.clickSave(); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagName2.toLowerCase())); -// assertEquals(sharedFilesPage.getPageTitle(), "Alfresco » Shared Files", "Displayed page="); - assertEquals(sharedFilesPage.getTags(docName2), tagsList.toString(), docName2 + " -> tags="); + public void addExistingTag() { + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over one tag from the content name"); + repositoryPage + .mouseOverNoTags(fileToCheck.getName()); + log.info("STEP2: Click Edit Properties option and click on select button"); + documentLibraryPage.usingContent(fileToCheck) + .clickEditProperties() + .clickSelectTags(); + log.info("STEP4: Pick tag from the available tags list and click \"Add\" then click OK"); + selectDialog.typeTag(tagC8074) + .clickCreateNewIcon() + .assertTagIsSelected(tagC8074) + .clickOk(); + log.info("STEP5: Click \"Save\" button"); + editPropertiesDialog + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(tagC8074); + + log.info(" Delete File"); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); } + @TestRail (id = "C8086") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void editTagForASharedFile() - { - LOG.info("STEP1: Hover over the tag(s) from the content"); - sharedFilesPage.mouseOverTags(folderName2); - assertTrue(sharedFilesPage.isEditTagIconDisplayed(folderName2), folderName2 + " -> 'Edit Tag' icon is displayed."); - - LOG.info("STEP2: Click \"Edit Tag\" icon"); - sharedFilesPage.clickEditTagIcon(folderName2); - assertTrue(sharedFilesPage.isEditTagInputFieldDisplayed(), folderName2 + " -> 'Edit Tag' text input field is displayed."); - - LOG.info("STEP3: Click on any tag and type a valid tag name"); - sharedFilesPage.editTag(tagName2.toLowerCase(), editedTag); - - LOG.info("STEP4: Click \"Save\" link and verify the content tags"); - sharedFilesPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - getBrowser().waitInSeconds(5); - assertTrue(sharedFilesPage.getTags(folderName2).contains(editedTag.toLowerCase())); - assertFalse(sharedFilesPage.getTags(folderName2).contains(tagName.toLowerCase())); + public void editTagForASharedFile() { + String originalTag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + String editedTag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + setAuthorizationRequestHeader(getRestApi().authenticateUser(getAdminUser())) + .withCoreAPI().usingResource(fileToCheck).addTags(originalTag); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + + log.info("STEP1: Hover over the tag(s) from the content"); + repositoryPage + .mouseOverTags(fileToCheck.getName()); + log.info("STEP2: Click \"Edit Tag\" icon"); + repositoryPage + .clickEditTagIcon(fileToCheck.getName()); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + log.info("STEP3: Click on any tag and type a valid tag name"); + repositoryPage + .editTag(originalTag, editedTag); + log.info("STEP4: Click \"Save\" link and verify the content tags"); + documentLibraryPage.usingContent(fileToCheck) + .clickSave(); + documentLibraryPage.usingContent(fileToCheck) + .assertTagIsDisplayed(editedTag) + .assertTagIsNotDisplayed(originalTag); + + log.info(" Delete File"); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C8087") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void removeTag() - { - LOG.info(" Hover over the text \"No Tags\" from " + docName3); - sharedFilesPage.mouseOverNoTags(docName3); - assertTrue(sharedFilesPage.isEditTagIconDisplayed(docName3), docName3 + " -> \"Edit Tag\" icon is displayed"); - - LOG.info(" Click \"Edit Tag\" icon"); - sharedFilesPage.clickEditTagIcon(docName3); - assertTrue(sharedFilesPage.isEditTagInputFieldDisplayed(), docName3 + " -> Edit tag text input field is displayed."); - - LOG.info(" Type any tag name in the input field and click \"Save\" link"); - sharedFilesPage.typeTagName(tagName2); - sharedFilesPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - getBrowser().waitInSeconds(3); - ArrayList tagsList = new ArrayList<>(Collections.singletonList(tagName2.toLowerCase())); - assertEquals(sharedFilesPage.getTags(docName3), tagsList.toString(), docName3 + " -> tags="); - - LOG.info("STEP1: Hover over the tag from " + docName3); - sharedFilesPage.mouseOverTags(docName3); - assertTrue(sharedFilesPage.isEditTagIconDisplayed(docName3), docName3 + " -> 'Edit Tag' icon is displayed."); - - LOG.info("STEP2: Click \"Edit Tags\" icon"); - sharedFilesPage.clickEditTagIcon(docName3); - getBrowser().waitInSeconds(3); - assertTrue(sharedFilesPage.isEditTagInputFieldDisplayed(), docName3 + " -> 'Edit Tag' text input field is displayed."); - - LOG.info("STEP3: Hover over the tag and click 'Remove' icon"); - sharedFilesPage.removeTag(tagName2.toLowerCase()); - - LOG.info("STEP4: Click 'Save' link"); - sharedFilesPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - assertTrue(sharedFilesPage.isNoTagsTextDisplayed(docName3), docName3 + " -> " + tagName2 + " is removed."); + public void removeTag() { + String originalTag = RandomStringUtils.randomAlphabetic(4).toLowerCase(); + setAuthorizationRequestHeader(getRestApi().authenticateUser(getAdminUser())) + .withCoreAPI().usingResource(fileToCheck).addTags(originalTag); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + + log.info("STEP1: Hover over the tag(s) from the content"); + repositoryPage + .mouseOverTags(fileToCheck.getName()); + log.info("STEP2: Click \"Edit Tag\" icon"); + repositoryPage + .clickEditTagIcon(fileToCheck.getName()); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + log.info("STEP3: Hover over the tag and click 'Remove' icon"); + repositoryPage + .removeTag(originalTag); + log.info("STEP4: Click 'Save' link"); + documentLibraryPage + .usingContent(fileToCheck) + .clickSave(); + repositoryPage + .assertIsNoTagsTextDisplayed(fileToCheck.getName()); + log.info(" Delete File"); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + } @TestRail (id = "C8096") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void updateTags() - { - LOG.info("STEP1: Hover over the text \"No Tags\" from " + docName4); - sharedFilesPage.mouseOverNoTags(docName4); - assertTrue(sharedFilesPage.isEditTagIconDisplayed(docName4), docName4 + " -> \"Edit Tag\" icon is displayed"); - - LOG.info("STEP2: Click \"Edit Tag\" icon"); - sharedFilesPage.clickEditTagIcon(docName4); - assertTrue(sharedFilesPage.isEditTagInputFieldDisplayed(), docName4 + " -> Edit tag text input field is displayed."); - - LOG.info("STEP3: Add a tag"); - sharedFilesPage.typeTagName(tagName2); - - LOG.info("STEP3: Click 'Remove' icon"); - sharedFilesPage.removeTag(tagName2.toLowerCase()); - - LOG.info("STEP4: Click 'Save' link"); - sharedFilesPage.clickEditTagLink(language.translate("documentLibrary.tag.link.save")); - assertTrue(sharedFilesPage.isNoTagsTextDisplayed(docName4), docName4 + " -> " + tagName2 + " is removed."); + public void updateTags() { + + setAuthorizationRequestHeader(getRestApi().authenticateUser(getAdminUser())) + .withCoreAPI().usingResource(fileToCheck).addTags(tagC8096); + + log.info("Login User1 with admin permissions and navigate to shared folder"); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info(" Hover over one tag from the content name"); + repositoryPage + .mouseOverTags(fileToCheck.getName()); + log.info(" Click Edit Tag icon"); + documentLibraryPage + .usingContent(fileToCheck) + .clickTagEditIcon(); + repositoryPage + .assertEditTagInputFieldDisplayed(fileToCheck.getName()); + log.info(" Add another tag"); + documentLibraryPage + .usingContent(fileToCheck) + .setTag(anothertagC8096) + .clickSave(); + documentLibraryPage + .usingContent(fileToCheck) + .assertTagIsDisplayed(anothertagC8096); + log.info("S Click 'Remove' icon"); + documentLibraryPage + .usingContent(fileToCheck) + .clickTagEditIcon(); + repositoryPage + .removeTag(tagC8096); + log.info(" Click 'Save' link"); + documentLibraryPage + .usingContent(fileToCheck) + .clickSave(); + documentLibraryPage + .usingContent(fileToCheck) + .assertTagIsDisplayed(anothertagC8096) + .assertTagIsNotDisplayed(tagC8096); + log.info(" Delete File"); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); } @TestRail (id = "C13766") @Test (groups = { TestGroup.SANITY, TestGroup.CONTENT }) - public void noTagsOptionDisplayed() - { - LOG.info("Preconditions: Test user with no admin permissions."); - setupAuthenticatedSession(user, password); - sharedFilesPage.navigate(); + public void noTagsOptionDisplayed() { + testUser2 = dataUser.usingAdmin().createUser(user2, password); + + authenticateUsingLoginPage(testUser2); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .assertFileIsDisplayed(fileToCheck.getName()); + log.info("STEP1: Hover over no tag and verify Edit icon is not displayed "); + repositoryPage + .mouseOverNoTagsWithNoEditIcon(fileToCheck.getName()); + repositoryPage + .assertIsEditTagIconNotDisplayed(fileToCheck.getName()); + log.info("Delete File and Delete User2 "); + authenticateUsingLoginPage(getAdminUser()); + repositoryPage + .navigate(); + repositoryPage + .click_FolderName(sharedFolderName); + repositoryPage + .select_ItemsAction(fileToCheck.getName(), ItemActions.DELETE_DOCUMENT) + .clickOnDeleteButtonOnDeletePrompt(); + deleteUsersIfNotNull(testUser2); - LOG.info("STEP1: Hover over 'No Tags' for file, e.g: 'testFile'"); - sharedFilesPage.clickOnFolderName(folderName3); - assertFalse(sharedFilesPage.isEditTagIconDisplayed(docName5), "Edit tag icon is displayed"); } - @AfterClass - public void cleanup() - { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + docName); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + docName2); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + docName3); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + docName4); - contentService.deleteContentByPath(adminUser, adminPassword, path13766 + "/" + docName5); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + folderName); - contentService.deleteContentByPath(adminUser, adminPassword, path + "/" + folderName2); - contentService.deleteContentByPath(adminUser, adminPassword, sharedPath + "/" + folderName3); - contentService.deleteContentByPath(adminUser, adminPassword, path); - } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/BasicSearchTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/BasicSearchTests.java index 69afa164f1..98b091411f 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/BasicSearchTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/BasicSearchTests.java @@ -6,27 +6,42 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.List; + +import lombok.extern.slf4j.Slf4j; import org.alfresco.dataprep.CMISUtil; +import org.alfresco.dataprep.ContentService; +import org.alfresco.dataprep.DashboardCustomization; +import org.alfresco.dataprep.SitePagesService; import org.alfresco.dataprep.SiteService; + import org.alfresco.po.share.searching.SearchPage; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.site.calendar.CalendarUtility; import org.alfresco.po.share.toolbar.Toolbar; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.alfresco.utility.report.Bug; +import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class BasicSearchTests extends ContextAwareWebTest +public class BasicSearchTests extends BaseTest { //@Autowired Toolbar toolbar; @@ -36,20 +51,16 @@ public class BasicSearchTests extends ContextAwareWebTest //@Autowired SiteDashboardPage siteDashboardPage; - @Autowired CalendarUtility calendarUtility; - - String currentUrl = ""; + @Autowired + private SitePagesService sitePagesService; + @Autowired + private ContentService contentService; + @Autowired + private SiteService siteService; String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - String userName1 = "profileUser1-" + uniqueIdentifier; - String userName2 = "profileUser2-" + uniqueIdentifier; - String firstName = "FirstName"; - String lastName1 = "LastName1"; - String lastName2 = "LastName2"; - String siteName1 = "Site1-" + uniqueIdentifier; - String siteName2 = "Site2-" + uniqueIdentifier; - String description = "Description-" + uniqueIdentifier; + private final String password = "password"; String docName1 = "TestDoc1-" + uniqueIdentifier; String docName2 = "Document2-" + uniqueIdentifier; String docContent = "content of the file."; @@ -58,218 +69,251 @@ public class BasicSearchTests extends ContextAwareWebTest String discussion = "discussionTitle-" + uniqueIdentifier; String blogPost = "BlogPost-" + uniqueIdentifier; String link = "Link-" + uniqueIdentifier; + private FileModel testFile; + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal user2 = new ThreadLocal<>(); + private final ThreadLocal siteModel = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, userName1, password, userName1 + domain, firstName, lastName1); - userService.create(adminUser, adminPassword, userName2, password, userName2 + domain, firstName, lastName2); - siteService.create(userName1, password, domain, siteName1, description, SiteService.Visibility.PUBLIC); - siteService.create(userName2, password, domain, siteName2, description, SiteService.Visibility.PUBLIC); - contentService.createDocument(userName1, password, siteName1, CMISUtil.DocumentType.TEXT_PLAIN, docName1, docContent); - contentService.createDocument(userName1, password, siteName1, CMISUtil.DocumentType.TEXT_PLAIN, docName2, docContent); - sitePagesService.addCalendarEvent(userName1, password, siteName1, calendarEvent, "EventLocation", "description of the event", - calendarUtility.firstDayOfCW(), calendarUtility.firstDayOfCW(), "", "", false, "tag"); - sitePagesService.createWiki(userName1, password, siteName1, wikiPage, "content of the wiki page", null); - sitePagesService.createDiscussion(userName1, password, siteName1, discussion, "text", null); - sitePagesService.createBlogPost(userName1, password, siteName1, blogPost, "content of the blog", false, null); - sitePagesService.createLink(userName1, password, siteName1, link, "url", "description of link", false, null); + log.info("PreCondition: Creating a TestUser1"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a TestUser2"); + user2.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a Random Site"); + siteModel.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userName1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName1); - userService.delete(adminUser, adminPassword, userName2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName2); - - siteService.delete(adminUser, adminPassword, siteName1); - siteService.delete(adminUser, adminPassword, siteName2); + deleteUsersIfNotNull(user1.get()); + deleteUsersIfNotNull(user2.get()); + deleteSitesIfNotNull(siteModel.get()); + deleteAllCookiesIfNotNull(); } @TestRail (id = "C5933") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) - public void verifyLiveSearchableContent() - { - setupAuthenticatedSession(userName1, password); - LOG.info("STEP1: Verify Search toolbar"); + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void verifyLiveSearchableContent() { + String userName1 = user1.get().getUsername(); + String userName2 = user2.get().getUsername(); + String siteName = siteModel.get().getId(); + + log.info("Data creation as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(DashboardCustomization.Page.WIKI); + sitePages.add(DashboardCustomization.Page.BLOG); + sitePages.add(DashboardCustomization.Page.CALENDAR); + sitePages.add(DashboardCustomization.Page.LINKS); + siteService.addPagesToSite(userName1, password, siteName, sitePages); + + contentService.createDocument(userName1, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName1, docContent); + contentService.createDocument(userName1, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName2, docContent); + sitePagesService.addCalendarEvent(userName1, password, siteName, calendarEvent, "EventLocation", "description of the event", + calendarUtility.firstDayOfCW(), calendarUtility.firstDayOfCW(), "", "", false, "tag"); + sitePagesService.createWiki(userName1, password, siteName, wikiPage, "content of the wiki page", null); + sitePagesService.createDiscussion(userName1, password, siteName, discussion, "text", null); + sitePagesService.createBlogPost(userName1, password, siteName, blogPost, "content of the blog", false, null); + sitePagesService.createLink(userName1, password, siteName, link, "url", "description of link", false, null); + + authenticateUsingLoginPage(user1.get()); + + log.info("STEP1: Verify Search toolbar"); toolbar.assertSearchInputIsDisplayed().assertSearchIconIsDisplayed(); assertEquals(toolbar.getSearchBoxPlaceholder(), language.translate("toolbar.searchInputPlaceholder"), "Search box placeholder:"); assertTrue(toolbar.isClearSearchBoxDisplayed(), "Clear search box is displayed."); - LOG.info("STEP2: Fill in toolbar search field with a user name"); + log.info("STEP2: Fill in toolbar search field with a user name"); toolbar.searchInToolbar(userName2); assertTrue(toolbar.isResultDisplayedInLiveSearch(userName2), "Live search result list contains the searched user."); - LOG.info("STEP3: Click a user link from search results"); + log.info("STEP3: Click a user link from search results"); toolbar.clickResultFromLiveSearch(userName2); - LOG.info("STEP4: Fill in toolbar search field with a site name"); - toolbar.searchInToolbar(siteName1); - assertTrue(toolbar.isResultDisplayedInLiveSearch(siteName1), "Live search result list contains the searched site."); + log.info("STEP4: Fill in toolbar search field with a site name"); + toolbar.searchInToolbar(siteName); + assertTrue(toolbar.isResultDisplayedInLiveSearch(siteName), "Live search result list contains the searched site."); - LOG.info("STEP5: Click a site link from search results"); - toolbar.clickResult(siteName1); + log.info("STEP5: Click a site link from search results"); + toolbar.clickResult(siteName); - LOG.info("STEP6: Fill in toolbar search field with a document name"); + log.info("STEP6: Fill in toolbar search field with a document name"); toolbar.searchInToolbar(docName1); assertTrue(toolbar.isResultDisplayedInLiveSearch(docName1), "Live search result list contains the searched document."); - LOG.info("STEP7: Click a document link from search results"); + log.info("STEP7: Click a document link from search results"); toolbar.clickResult(docName1); - LOG.info("STEP8: Fill in toolbar search field with a wiki page"); + log.info("STEP8: Fill in toolbar search field with a wiki page"); toolbar.searchInToolbar(wikiPage); assertTrue(toolbar.isResultDisplayedInLiveSearch(wikiPage), "Live search result list contains the searched wiki page"); - LOG.info("STEP9: Fill in toolbar search field with a blog post"); + log.info("STEP9: Fill in toolbar search field with a blog post"); toolbar.searchInToolbar(blogPost); - getBrowser().waitInSeconds(2); assertTrue(toolbar.isResultDisplayedInLiveSearch(blogPost), "Live search result list contains the searched blog post"); - LOG.info("STEP10: Fill in toolbar search field with a calendar event"); + log.info("STEP10: Fill in toolbar search field with a calendar event"); toolbar.searchInToolbar(calendarEvent); - getBrowser().waitInSeconds(2); - assertFalse(toolbar.isLiveSearchResultsListDisplayed(), "No live search results are displayed"); + assertFalse(toolbar.is_LiveSearchResultsListDisplayed(calendarEvent), "No live search results are displayed"); - LOG.info("STEP11: Fill in toolbar search field with a discussion topic"); + log.info("STEP11: Fill in toolbar search field with a discussion topic"); toolbar.searchInToolbar(discussion); - assertFalse(toolbar.isLiveSearchResultsListDisplayed(), "No live search results are displayed"); + assertFalse(toolbar.is_LiveSearchResultsListDisplayed(discussion), "No live search results are displayed"); - LOG.info("STEP12: Fill in toolbar search field with a link"); + log.info("STEP12: Fill in toolbar search field with a link"); toolbar.searchInToolbar(link); - assertFalse(toolbar.isLiveSearchResultsListDisplayed(), "No live search results are displayed"); - - cleanupAuthenticatedSession(); + assertFalse(toolbar.is_LiveSearchResultsListDisplayed(link), "No live search results are displayed"); } - @Bug (id = "TBD") @TestRail (id = "C5945") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + @Test(groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void verifySearchPage() { - setupAuthenticatedSession(userName1, password); - LOG.info("STEP1: Enter the document name in the toolbar search field and press Enter"); - toolbar.search(docName1); - assertEquals(searchPage.getRelativePath(), "share/page/dp/ws/faceted-search#searchTerm=%s&scope=repo&sortField=Relevance", - "User is redirected to Search page."); - - LOG.info("STEP2: Verify page title"); - assertTrue(searchPage.isResultFoundWithRetry(docName1), "result not displayed"); - LOG.info("STEP3: Verify search section"); + log.info("Precondition: Creating random file in the site under document library"); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN); + getCmisApi().usingSite(siteModel.get()).createFile(testFile).assertThat().existsInRepo(); + authenticateUsingLoginPage(user1.get()); + + log.info("STEP1: Enter the document name in the toolbar search field and press Enter"); + toolbar + .search(testFile.getName()); + searchPage + .assertBrowserPageTitleIs("Alfresco » Search"); + + log.info("STEP2: Verify page title"); + searchPage + .assertCreatedDataIsDisplayed(testFile.getName()); + + log.info("STEP3: Verify search section"); assertTrue(searchPage.isSearchInLabelDisplayed(), "'Search in' label is displayed."); assertTrue(searchPage.getNumberOfResultsText().contains(" - results found"), "Section with number of results is displayed"); assertTrue(searchPage.isSearchButtonDisplayed(), "Search button is displayed."); - LOG.info("STEP4: Click \"Search In\" dropdown"); + log.info("STEP4: Click \"Search In\" dropdown"); searchPage.clickSearchInDropdown(); assertEquals(searchPage.getSearchInDropdownValues(), "All Sites, Repository", "'Search in' dropdown"); assertEquals(searchPage.getSearchInDropdownSelectedValue(), "Repository", "'Search in' dropdown has default selected value:"); - LOG.info("STEP5: Verify \"Filter by\" section"); + log.info("STEP5: Verify \"Filter by\" section"); ArrayList expectedList = new ArrayList<>(Arrays.asList("Creator", "File Type", "Modifier", "Created", "Size", "Modified")); for (String anExpectedList : expectedList) { assertTrue(searchPage.getFilterTypeList().contains(anExpectedList), "Filter is not present in 'Filter by' section!"); } - LOG.info("STEP6: Click 'Sort' dropdown"); + log.info("STEP6: Click 'Sort' dropdown"); searchPage.clickSortDropdown(); assertTrue(searchPage.isSortDropdownComplete(), "Dropdown for results sorting is displayed with options: \"Relevance\", \"Name\", \"Title\", \"Description\", \"Author\", \"Modifier\", \"Modified date\", \"Creator\", \"Created date\", \"Size\", \"Mime type\" and \"Type\" "); - LOG.info("STEP7: Click \"Views\" dropdown"); + log.info("STEP7: Click \"Views\" dropdown"); searchPage.clickViewsDropdown(); ArrayList expectedViewsDropdown = new ArrayList<>(Arrays.asList("Detailed View", "Gallery View")); assertEquals(searchPage.getViewsDropdownOptions().toString(), expectedViewsDropdown.toString(), "Views dropdown option="); - getBrowser().refresh(); - LOG.info("STEP8: Hover over a result"); - searchPage.mouseOverResult(docName1); + log.info("STEP8: Hover over a result"); + searchPage.mouseOverResult(testFile.getName()); assertTrue(searchPage.isActionsLinkDisplayed(), "The \"Actions\" menu is displayed."); - - cleanupAuthenticatedSession(); } @TestRail (id = "C7706") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void verifySearchInDropdownOptions() { - setupAuthenticatedSession(userName1, password); - siteDashboardPage.navigate(siteName1); - - LOG.info("STEP1: Enter document name in the live search field and press Enter"); - toolbar.search(docName1); - - LOG.info("STEP2: Select the site name option from 'Search in' dropdown"); - searchPage.selectOptionFromSearchIn(siteName1); - assertTrue(searchPage.isResultFound(docName1), docName1 + " is displayed in results list."); + log.info("Precondition: Creating random file in the site under document library"); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN); + getCmisApi().usingSite(siteModel.get()).createFile(testFile).assertThat().existsInRepo(); + authenticateUsingLoginPage(user1.get()); + + String siteName = siteModel.get().getId(); + + log.info("STEP1: Enter document name in the live search field and press Enter"); + siteDashboardPage + .navigate(siteName); + toolbar + .search(testFile.getName()); + + log.info("STEP2: Select the site name option from 'Search in' dropdown"); + searchPage + .selectOptionFromSearchIn(siteName) + .assertCreatedDataIsDisplayed(testFile.getName()); + + log.info("STEP3: Select \"All Sites\" option from 'Search in' dropdown"); + searchPage + .selectOptionFromSearchIn("All Sites") + .assertCreatedDataIsDisplayed(testFile.getName()); + + log.info("STEP4: Select \"Repository\" option from 'Search in' dropdown"); + searchPage + .selectOptionFromSearchIn("Repository") + .assertCreatedDataIsDisplayed(testFile.getName()); - LOG.info("STEP3: Select \"All Sites\" option from 'Search in' dropdown"); - searchPage.selectOptionFromSearchIn("All Sites"); - assertTrue(searchPage.isResultFound(docName1), docName1 + " is displayed in results list."); - - LOG.info("STEP4: Select \"Repository\" option from 'Search in' dropdown"); - searchPage.selectOptionFromSearchIn("Repository"); - assertTrue(searchPage.isResultFound(docName1), docName1 + " is displayed in results list."); - - cleanupAuthenticatedSession(); } @TestRail (id = "C6168") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void defaultPlaceholderText() { - setupAuthenticatedSession(userName1, password); - LOG.info("STEP1: Verify Live Search placeholder text"); + authenticateUsingLoginPage(user1.get()); + log.info("STEP1: Verify Live Search placeholder text"); assertEquals(toolbar.getSearchBoxPlaceholder(), language.translate("toolbar.searchInputPlaceholder"), "Live search box placeholder text"); - cleanupAuthenticatedSession(); } @TestRail (id = "C8145") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) - public void verifyDetailedView() - { - setupAuthenticatedSession(userName1, password); + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH}) + public void verifyDetailedView() { + + log.info("Precondition: Creating random file in the site under document library"); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN); + getCmisApi().usingSite(siteModel.get()).createFile(testFile).assertThat().existsInRepo(); - LOG.info("STEP1: Enter the document name in the toolbar search field and press 'Enter'"); - toolbar.search(docName1); - currentUrl = currentUrl.substring(currentUrl.indexOf("/share"), currentUrl.indexOf("&scope=repo")); - assertEquals(currentUrl, "/share/page/dp/ws/faceted-search#searchTerm=" + docName1, - "User is redirected to Search page."); + authenticateUsingLoginPage(user1.get()); - LOG.info("STEP2: Verify the default view"); + log.info("STEP1: Enter the document name in the toolbar search field and press 'Enter'"); + toolbar.search(testFile.getName()); + searchPage.assertBrowserPageTitleIs("Alfresco » Search"); + + log.info("STEP2: Verify the default view"); + toolbar.search(testFile.getName()); + searchPage.assertCreatedDataIsDisplayed(testFile.getName()); assertTrue(searchPage.isSearchResultsListInDetailedView(), "Detailed view is displayed."); - LOG.info("STEP3: Change the view to \"Gallery View\" from 'Views' dropdown"); + log.info("STEP3: Change the view to \"Gallery View\" from 'Views' dropdown"); searchPage.clickGalleryView(); - getBrowser().waitInSeconds(4); assertTrue(searchPage.isSearchResultsListInGalleryView(), "Results are displayed in Gallery View"); - getBrowser().refresh(); - LOG.info("STEP4: Change the view to \"Detailed View\""); + log.info("STEP4: Change the view to \"Detailed View\""); searchPage.clickDetailedView(); - getBrowser().waitInSeconds(4); assertTrue(searchPage.isSearchResultsListInDetailedView(), "Results are displayed in Detailed View."); - - cleanupAuthenticatedSession(); } @TestRail (id = "C8146") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void verifyGalleryView() { - setupAuthenticatedSession(userName1, password); - LOG.info("STEP1: Enter the document name in the toolbar search field and press Enter"); - toolbar.search(docName1); -// currentUrl = siteDashboardPage.getCurrentUrl(); - currentUrl = currentUrl.substring(currentUrl.indexOf("/share"), currentUrl.indexOf("&scope=repo")); + log.info("Precondition: Creating random file in the site under document library"); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN); + getCmisApi().usingSite(siteModel.get()).createFile(testFile).assertThat().existsInRepo(); + + authenticateUsingLoginPage(user1.get()); - assertEquals(currentUrl, "/share/page/dp/ws/faceted-search#searchTerm=" + docName1, - "User is redirected to Search page."); + log.info("STEP1: Enter the document name in the toolbar search field and press Enter"); + toolbar.search(testFile.getName()); + searchPage.assertBrowserPageTitleIs("Alfresco » Search"); + searchPage.assertCreatedDataIsDisplayed(testFile.getName()); - LOG.info("STEP2: Change the view to \"Gallery View\" from 'Views' dropdown and verify results section"); + log.info("STEP2: Change the view to \"Gallery View\" from 'Views' dropdown and verify results section"); searchPage.clickGalleryView(); assertTrue(searchPage.isSearchResultsListInGalleryView(), "Each search result is displayed as a thumbnail."); assertTrue(searchPage.isSliderGalleryViewDisplayed(), "Slider is displayed."); @@ -282,6 +326,5 @@ public void verifyGalleryView() assertEquals(searchPage.getViewsDropdownOptions().toString(), expectedViewsDropdown.toString(), "Views dropdown option="); searchPage.clickDetailedView(); - cleanupAuthenticatedSession(); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/LiveSearchTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/LiveSearchTests.java index ac2c61a029..63565ac15a 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/LiveSearchTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/LiveSearchTests.java @@ -1,282 +1,391 @@ package org.alfresco.share.searching; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; -import org.alfresco.po.share.searching.LiveSearchPage; +import org.alfresco.po.share.searching.LiveSearchPageSupport; import org.alfresco.po.share.searching.SearchPage; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.EditUserPage; import org.alfresco.po.share.user.profile.UserProfilePage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * Created by Mirela Tifui on 2/16/2018. */ -public class LiveSearchTests extends ContextAwareWebTest +public class LiveSearchTests extends BaseTest { //@Autowired Toolbar toolbar; - @Autowired - LiveSearchPage liveSearchPage; //@Autowired SiteDashboardPage siteDashboardPage; - //@Autowired + EditUserPage editUserPage; + //@Autowired DocumentLibraryPage documentLibraryPage; //@Autowired UserDashboardPage userDashboardPage; + LiveSearchPageSupport liveSearchPageSupport; + UserProfilePage userProfilePage; + //@Autowired DocumentDetailsPage documentDetailsPage; - //@Autowired - UserProfilePage userProfilePage; + CreateContentPage createContent; //@Autowired SearchPage searchPage; + private UserModel testUser; + + private SiteModel testSite; private String userName = "testUser" + RandomData.getRandomAlphanumeric(); + private String siteName = "siteName" + RandomData.getRandomAlphanumeric(); private String docName = "docName" + RandomData.getRandomAlphanumeric(); - @BeforeClass (alwaysRun = true) + @BeforeMethod (alwaysRun = true) public void testSetup() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, "faceted", TestGroup.SEARCH); - siteService.create(userName, password, domain, siteName, "FacetedSearchSite", SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName, "test content"); + editUserPage = new EditUserPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + userProfilePage = new UserProfilePage(webDriver); + liveSearchPageSupport = new LiveSearchPageSupport(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + createContent = new CreateContentPage(webDriver); + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + testUser = dataUser.usingAdmin().createRandomTestUser(); + log.info("Edit user data & give specific name to " + testUser); + UserModel editUser = testUser; + String firstName = "faceted"; + editUserPage.navigate(editUser) + .editFirstName(firstName) + .clickSaveChanges(); } - @AfterClass (alwaysRun = true) + @AfterMethod (alwaysRun = true) public void testCleanup() { - userService.delete(adminUser, adminPassword, userName); - siteService.delete(adminUser, adminPassword, domain, siteName); + deleteUsersIfNotNull(testUser); + deleteSitesIfNotNull(testSite); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, TestGroup.SEARCH }) public void testCheckNoLiveSearchResults() { - LOG.info("Step 1: Search for info that does not exist and check that results are not displayed in search results"); - setupAuthenticatedSession(userName, password); + log.info("Step 1: Search for info that does not exist and check that results are not displayed in search results"); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + log.info("Edit site data & give specific name to " + testSite); + authenticateUsingLoginPage(testUser); + SiteModel editSite = testSite; + String description = "FacetedSearchSite"; + siteDashboardPage.navigateToEditSiteDetailsDialog(editSite.getId()); + siteDashboardPage.editSiteDescription(description); + documentLibraryPage.navigateToDocumentLibraryPage(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar("t@#$%^!@ds"); - Assert.assertFalse(liveSearchPage.isDocumentsTitleDisplayed(), "Documents title is displayed"); - Assert.assertFalse(liveSearchPage.isPeopleTitleDisplayed(), "People title is displayed"); - Assert.assertFalse(liveSearchPage.isSitesTitleDisplayed(), "Sites title is displayed"); - Assert.assertFalse(liveSearchPage.isScopeRepositoryDisplayed(), "Repository scope is displayed"); - Assert.assertFalse(liveSearchPage.isScopeSitesDisplayed(), "Scope site is displayed"); - Assert.assertFalse(liveSearchPage.areAnyDocumentElementsDisplayed(), "Documents are displayed"); - Assert.assertFalse(liveSearchPage.areAnyPeopleElementsDisplayed(), "People elements are displayed"); - Assert.assertFalse(liveSearchPage.areAnySiteElementsDisplayed(), "Site elements are displayed"); - cleanupAuthenticatedSession(); + Assert.assertFalse(liveSearchPageSupport.isDocumentsTitleDisplayed(), "Documents title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isPeopleTitleDisplayed(), "People title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isSitesTitleDisplayed(), "Sites title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isScopeRepositoryDisplayed("t@#$%^!@ds"), "Repository scope is displayed"); + Assert.assertFalse(liveSearchPageSupport.isScopeSitesDisplayed(), "Scope site is displayed"); + Assert.assertFalse(liveSearchPageSupport.areAnyDocumentElementsDisplayed(), "Documents are displayed"); + Assert.assertFalse(liveSearchPageSupport.areAnyPeopleElementsDisplayed(), "People elements are displayed"); + Assert.assertFalse(liveSearchPageSupport.areAnySiteElementsDisplayed(), "Site elements are displayed"); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testCheckLiveSearchScopeOptionsSiteContext() { - LOG.info("Step 1: Check that when not in site context, the Live Search dropdown does not contain the scope options"); - setupAuthenticatedSession(userName, password); + log.info("Step 1: Check that when not in site context, the Live Search dropdown does not contain the scope options"); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + log.info("Edit site data & give specific name to " + testSite); + authenticateUsingLoginPage(testUser); + SiteModel editSite = testSite; + String description = "FacetedSearchSite"; + siteDashboardPage.navigateToEditSiteDetailsDialog(editSite.getId()); + siteDashboardPage.editSiteDescription(description); + documentLibraryPage.navigateToDocumentLibraryPage(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + userDashboardPage.navigate(testUser); toolbar.searchInToolbar(docName); - Assert.assertFalse(liveSearchPage.isScopeRepositoryDisplayed(), "Scope Repository is displayed"); - Assert.assertFalse(liveSearchPage.isScopeSitesDisplayed(), "Scope Sites is displayed"); - cleanupAuthenticatedSession(); + Assert.assertFalse(liveSearchPageSupport.isScopeRepositoryDisplayed(docName), "Scope Repository is displayed"); + Assert.assertFalse(liveSearchPageSupport.isScopeSitesDisplayed(), "Scope Sites is displayed"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testCheckLiveSearchScopeOptionsRepoContext() { - LOG.info("Step 1: Check that when in site, the Live Search dropdown contains the scope options"); - setupAuthenticatedSession(userName, password); - siteDashboardPage.navigate(siteName); + log.info("Step 1: Check that when in site, the Live Search dropdown contains the scope options"); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + log.info("Edit site data & give specific name to " + testSite); + authenticateUsingLoginPage(testUser); + SiteModel editSite = testSite; + String description = "FacetedSearchSite"; + siteDashboardPage.navigateToEditSiteDetailsDialog(editSite.getId()); + siteDashboardPage.editSiteDescription(description); + documentLibraryPage.navigateToDocumentLibraryPage(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); + siteDashboardPage.navigate(); toolbar.searchInToolbar(docName); - Assert.assertTrue(liveSearchPage.isScopeRepositoryDisplayed(), "Scope Repository is not displayed"); - Assert.assertTrue(liveSearchPage.isScopeSitesDisplayed(), "Scope Sites is not displayed"); - setupAuthenticatedSession(userName, password); + Assert.assertTrue(liveSearchPageSupport.isScopeRepositoryDisplayed(docName), "Scope Repository is not displayed"); + Assert.assertTrue(liveSearchPageSupport.isScopeSitesDisplayed(), "Scope Sites is not displayed"); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testCheckSiteScopeSiteName() { - LOG.info("Step 1: Check the site name in Search Site scope option"); - String expectedInfo = "Search in site '" + siteName + "'"; - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); + log.info("Step 1: Check the site name in Search Site scope option"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); + String expectedInfo = "Search in site '" + testSite.getTitle() + "'"; toolbar.searchInToolbar(docName); - Assert.assertEquals(liveSearchPage.getScopeSiteText(siteName), expectedInfo, siteName + " is not available in scope site"); - cleanupAuthenticatedSession(); + Assert.assertEquals(liveSearchPageSupport.getScopeSiteText(testSite.getTitle()), expectedInfo, testSite + " is not available in scope site"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchDocumentResult() { - LOG.info("Step 1: Check that the document search result contains document name, site name and user name"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); + log.info("Step 1: Check that the document search result contains document name, site name and user name"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(docName); - Assert.assertTrue(liveSearchPage.getDocumentDetails(docName).contains(docName), "Document details does not contain document name"); - Assert.assertTrue(liveSearchPage.getDocumentDetails(docName).contains(siteName), "Document details does not contain site name"); - Assert.assertTrue(liveSearchPage.getDocumentDetails(docName).contains(userName), "Document details does not contain user name"); - cleanupAuthenticatedSession(); + Assert.assertTrue(liveSearchPageSupport.getDocumentDetails(docName).contains(docName), "Document details does not contain document name"); + Assert.assertTrue(liveSearchPageSupport.getDocumentDetails(docName).contains(testSite.getTitle()), "Document details does not contain site name"); + Assert.assertTrue(liveSearchPageSupport.getDocumentDetails(docName).contains(testUser.getUsername()), "Document details does not contain user name"); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testExpandLiveSearchDocumentResult() { - LOG.info("Step 1: Expand document search results"); - setupAuthenticatedSession(userName, password); - userDashboardPage.navigate(userName); + log.info("Step 1: Expand document search results"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + userDashboardPage.navigate(testUser); toolbar.searchInToolbar("jpg"); - liveSearchPage.clickMore(); - Assert.assertTrue(liveSearchPage.getResultsListSize() > 0, "List has no results"); - liveSearchPage.closeLiveSearchResults(); - Assert.assertFalse(liveSearchPage.isDocumentsTitleDisplayed(), "Documents title is displayed"); - Assert.assertFalse(liveSearchPage.isPeopleTitleDisplayed(), "People title is displayed"); - Assert.assertFalse(liveSearchPage.isSitesTitleDisplayed(), "Sites title is displayed"); - cleanupAuthenticatedSession(); + liveSearchPageSupport.clickMore(); + Assert.assertTrue(liveSearchPageSupport.getResultsListSize() > 0, "List has no results"); + liveSearchPageSupport.closeLiveSearchResults(); + Assert.assertFalse(liveSearchPageSupport.isDocumentsTitleDisplayed(), "Documents title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isPeopleTitleDisplayed(), "People title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isSitesTitleDisplayed(), "Sites title is displayed"); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testClickOnDocumentTitle() { - LOG.info("Step 1: Clicks on the document name in the document search result and checks that the document's details page is displayed"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); + log.info("Step 1: Clicks on the document name in the document search result and checks that the document's details page is displayed"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(docName); - liveSearchPage.clickDocumentName(docName); - Assert.assertEquals(getBrowser().getTitle(), "Alfresco » Document Details", "User is not redirected to the document details page"); + toolbar.isResultDisplayedLiveSearch(docName); + liveSearchPageSupport.clickDocumentName(docName); + Assert.assertEquals(documentDetailsPage.getWebDriver().getTitle(), "Alfresco » Document Details", "User is not redirected to the document details page"); Assert.assertEquals(documentDetailsPage.getFileName(), docName, docName + " is not displayed on the Document Details page"); - cleanupAuthenticatedSession(); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testClickOnDocumentSiteName() { - LOG.info("Step 1: Clicks on document site name in the document search result and checks that document site library page is displayed"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); + log.info("Step 1: Clicks on document site name in the document search result and checks that document site library page is displayed"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(docName); - liveSearchPage.clickSiteName(siteName); - Assert.assertEquals(getBrowser().getTitle(), "Alfresco » Document Library", "User is not redirected to Document Library"); - Assert.assertEquals(documentLibraryPage.getSiteName(), siteName, "User is not redirected to " + siteName + " document library"); - cleanupAuthenticatedSession(); + toolbar.isResultDisplayedLiveSearch(docName); + liveSearchPageSupport.clickSiteName(testSite.getTitle()); + Assert.assertEquals(documentLibraryPage.getWebDriver().getTitle(), "Alfresco » Document Library", "User is not redirected to Document Library"); + Assert.assertEquals(documentLibraryPage.getSiteName(), testSite.getTitle(), "User is not redirected to " + siteName + " document library"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testClickOnDocumentUserName() { - LOG.info("Step 1: Click on document user name in document search result and checks that user profile page is displayed"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); + log.info("Step 1: Click on document user name in document search result and checks that user profile page is displayed"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .typeDescription("test content") + .clickCreate(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(docName); - liveSearchPage.clickUserName(userName); - Assert.assertEquals(getBrowser().getTitle(), "Alfresco » User Profile Page", "User is not redirected to User Profile page"); - cleanupAuthenticatedSession(); + toolbar.isResultDisplayedLiveSearch(docName); + liveSearchPageSupport.clickUserName(testUser.getUsername()); + Assert.assertEquals(userProfilePage.getWebDriver().getTitle(), "Alfresco » User Profile Page", "User is not redirected to User Profile page"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchPeopleResult() { - String expected = "[faceted search (" + userName + ")]"; - LOG.info("Step 1: Search for username and checks that it is displayed in people search results"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); - toolbar.searchInToolbar(userName); - Assert.assertEquals(liveSearchPage.getPeopleResults(), expected, userName + " is not available in the list of results"); - LOG.info("Step 2: Click user name and check that user profile is displayed"); - liveSearchPage.clickPeopleUserName(userName); - Assert.assertEquals(getBrowser().getTitle(), "Alfresco » User Profile Page", "User not redirected to user page"); - cleanupAuthenticatedSession(); + String expected = "[faceted "+ testUser.getLastName()+" (" + testUser.getUsername() + ")]"; + log.info("Step 1: Search for username and checks that it is displayed in people search results"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); + toolbar.searchInToolbar(testUser.getUsername()); + Assert.assertEquals(liveSearchPageSupport.getPeopleResults(), expected, testUser.getUsername() + " is not available in the list of results"); + log.info("Step 2: Click user name and check that user profile is displayed"); + liveSearchPageSupport.clickPeopleUserName(testUser.getUsername()); + Assert.assertEquals(userProfilePage.getWebDriver().getTitle(), "Alfresco » User Profile Page", "User not redirected to user page"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchSitesResult() { - String expected = "[" + siteName + "]"; - LOG.info("Step 1: Search for site and checks that site name is displayed in site results"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); - toolbar.searchInToolbar(siteName); - Assert.assertEquals(liveSearchPage.getSiteResults(), expected, siteName + " is not displayed"); - LOG.info("Step 2: Click the site name and check that site dashboard is displayed"); - liveSearchPage.clickSiteNameLiveSearch(siteName); - Assert.assertEquals(getBrowser().getTitle(), "Alfresco » Site Dashboard", "User is not redirected to Site Dashboard"); - Assert.assertEquals(siteDashboardPage.getSiteName(), siteName, "Site dashboard is not displayed"); - cleanupAuthenticatedSession(); + log.info("Step 1: Search for site and checks that site name is displayed in site results"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + String expected = "[" + testSite.getTitle() + "]"; + documentLibraryPage.navigate(testSite); + toolbar.searchInToolbar(testSite.getTitle()); + toolbar.isResultDisplayedLiveSearch(testSite.getTitle()); + Assert.assertEquals(liveSearchPageSupport.getSiteResults(), expected, testSite.getTitle() + " is not displayed"); + log.info("Step 2: Click the site name and check that site dashboard is displayed"); + liveSearchPageSupport.clickSiteNameLiveSearch(testSite.getTitle()); + Assert.assertEquals(siteDashboardPage.getWebDriver().getTitle(), "Alfresco » Site Dashboard", "User is not redirected to Site Dashboard"); + Assert.assertEquals(siteDashboardPage.getSiteName(), testSite.getTitle(), "Site dashboard is not displayed"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchInSiteResults() { String searchTerm = "docName"; - LOG.info("Step 1: When clicking on Search Site scope, Document results are from the current site"); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); + log.info("Step 1: When clicking on Search Site scope, Document results are from the current site"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(searchTerm); - liveSearchPage.selectSiteContext(); - Assert.assertFalse(liveSearchPage.areResultsFromOtherSitesReturned(siteName), "Other sites content is displayed: " + liveSearchPage.getSites()); - cleanupAuthenticatedSession(); + liveSearchPageSupport.selectSiteContext(); + Assert.assertFalse(liveSearchPageSupport.areResultsFromOtherSitesReturned(testSite.getTitle()), "Other sites content is displayed: " + liveSearchPageSupport.getSites()); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchInRepositoryResults() { String searchTerm = "docName"; - setupAuthenticatedSession(userName, password); - LOG.info("Step 1: When clicking on Search Repository scope, Document results are from the all sites"); - documentLibraryPage.navigate(siteName); + log.info("Step 1: When clicking on Search Repository scope, Document results are from the all sites"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(searchTerm); - liveSearchPage.selectRepoContext(); - Assert.assertTrue(liveSearchPage.areResultsFromOtherSitesReturned(siteName), "Other sites content is displayed: " + liveSearchPage.getSites()); - cleanupAuthenticatedSession(); + liveSearchPageSupport.selectRepoContext(); + Assert.assertFalse(liveSearchPageSupport.areResultsFromOtherSitesReturned(testSite.getTitle()), "Other sites content is displayed: " + liveSearchPageSupport.getSites()); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchToFacetedInSiteScope() { String searchTerm = "docName"; - setupAuthenticatedSession(userName, password); - LOG.info("Step 1: When clicking on Search Site scope and then Enter scope is set to site"); - documentLibraryPage.navigate(siteName); + log.info("Step 1: When clicking on Search Site scope and then Enter scope is set to site"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(searchTerm); - liveSearchPage.selectSiteContext(); + liveSearchPageSupport.selectSiteContext(); toolbar.search(searchTerm); - Assert.assertEquals(searchPage.getSearchInDropdownSelectedValue(), siteName, siteName + " is not the context displayed on the search results page"); - cleanupAuthenticatedSession(); + Assert.assertEquals(searchPage.getSearchInDropdownSelectedValue(), testSite.getTitle(), testSite.getTitle() + " is not the context displayed on the search results page"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchToFacetedInRepositoryScope() { String searchTerm = "docName"; - setupAuthenticatedSession(userName, password); - LOG.info("Step 1: When clicking on Search Repository scope and then Enter scope is set to repository"); - documentLibraryPage.navigate(siteName); + log.info("Step 1: When clicking on Search Repository scope and then Enter scope is set to repository"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(searchTerm); - liveSearchPage.selectRepoContext(); + liveSearchPageSupport.selectRepoContext(); toolbar.search(searchTerm); Assert.assertEquals(searchPage.getSearchInDropdownSelectedValue(), "Repository", "Repository is not the context displayed on the search results page"); - cleanupAuthenticatedSession(); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testLiveSearchNoResultsInSite() { String searchTerm = "jpg"; - setupAuthenticatedSession(userName, password); - LOG.info("Check that when in a site context, if there are no results in the site but there are results in the Repository,the scope options are visible"); - documentLibraryPage.navigate(siteName); + log.info("Check that when in a site context, if there are no results in the site but there are results in the Repository,the scope options are visible"); + authenticateUsingLoginPage(testUser); + testSite = dataSite.usingUser(testUser).createPublicRandomSite(); + documentLibraryPage.navigate(testSite); toolbar.searchInToolbar(searchTerm); - liveSearchPage.selectSiteContext(); - Assert.assertFalse(liveSearchPage.isDocumentsTitleDisplayed(), "Documents title is displayed"); - Assert.assertFalse(liveSearchPage.isPeopleTitleDisplayed(), "People title is displayed"); - Assert.assertFalse(liveSearchPage.isSitesTitleDisplayed(), "Sites title is displayed"); - Assert.assertTrue(liveSearchPage.isScopeRepositoryDisplayed(), "Repository scope is not displayed"); - Assert.assertTrue(liveSearchPage.isScopeSitesDisplayed(), "Scope site is not displayed"); + liveSearchPageSupport.selectSiteContext(); + Assert.assertFalse(liveSearchPageSupport.isDocumentsTitleDisplayed(), "Documents title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isPeopleTitleDisplayed(), "People title is displayed"); + Assert.assertFalse(liveSearchPageSupport.isSitesTitleDisplayed(), "Sites title is displayed"); + Assert.assertTrue(liveSearchPageSupport.isScopeRepositoryDisplayed(searchTerm), "Repository scope is not displayed"); + Assert.assertTrue(liveSearchPageSupport.isScopeSitesDisplayed(), "Scope site is not displayed"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchHighlightTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchHighlightTests.java index 738e56ac92..c2f05b0c1b 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchHighlightTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchHighlightTests.java @@ -7,7 +7,10 @@ import java.util.ArrayList; import java.util.List; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.CMISUtil; +import org.alfresco.dataprep.ContentService; import org.alfresco.dataprep.DashboardCustomization; import org.alfresco.dataprep.SiteService; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; @@ -17,35 +20,39 @@ import org.alfresco.po.share.site.ItemActions; import org.alfresco.po.share.site.blog.BlogPostListPage; import org.alfresco.po.share.site.blog.CreateBlogPostPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.alfresco.utility.report.Bug; +import org.alfresco.utility.model.UserModel; + +import org.springframework.beans.factory.annotation.Autowired; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Razvan.Dorobantu */ -public class SearchHighlightTests extends ContextAwareWebTest +public class SearchHighlightTests extends BaseTest { - //@Autowired + @Autowired + private SiteService siteService; + @Autowired + private ContentService contentService; DocumentLibraryPage documentLibraryPage; - //@Autowired EditPropertiesDialog editFilePropertiesDialog; - //@Autowired BlogPostListPage blogPage; - //@Autowired CreateBlogPostPage createBlogPost; + private AdvancedSearchPage advancedSearchPage; + private SearchPage searchPage; String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - String userName = "highlightSearch-" + uniqueIdentifier; - String firstName = "FirstName"; - String lastName = "LastName"; + String password = "password"; String siteName = "HighlightSite" + uniqueIdentifier; - String description = "HighlightDescription-" + uniqueIdentifier; String docName = "docName" + uniqueIdentifier; String docTitle = "docTitle" + uniqueIdentifier; String docContent = "docContent" + uniqueIdentifier; @@ -61,19 +68,33 @@ public class SearchHighlightTests extends ContextAwareWebTest String C42564file1 = "C42564file"; String C42564file2 = "big C42564file"; String C42549file = siteName; - //@Autowired - private AdvancedSearchPage advancedSearchPage; - //@Autowired - private SearchPage searchPage; private String blogPostTitle = "HighlightBlogTitle" + uniqueIdentifier; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void createPrecondition() { - List pagesToAdd = new ArrayList(); + + log.info("Precondition1: Any test user is created & Sites are Created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + String userName = user.get().getUsername(); + authenticateUsingCookies(user.get()); + + documentLibraryPage = new DocumentLibraryPage(webDriver); + editFilePropertiesDialog = new EditPropertiesDialog(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + searchPage = new SearchPage(webDriver); + blogPage = new BlogPostListPage(webDriver); + createBlogPost = new CreateBlogPostPage(webDriver); + + authenticateUsingLoginPage(user.get()); + List pagesToAdd = new ArrayList<>(); pagesToAdd.add(DashboardCustomization.Page.BLOG); - userService.create(adminUser, adminPassword, userName, password, userName + domain, firstName, lastName); - siteService.create(userName, password, domain, siteName, description, SiteService.Visibility.PUBLIC); + + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + String siteName = site.get().getId(); + siteService.addPagesToSite(userName, password, siteName, pagesToAdd); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName, docContent); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, C42558file, C42558file); @@ -85,50 +106,47 @@ public void createPrecondition() contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, C42564file2, docContent); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, C42549file, C42549file); contentService.uploadFileInSite(userName, password, siteName, C42550testFilePath); - setupAuthenticatedSession(userName, password); + + authenticateUsingLoginPage(user.get()); documentLibraryPage.navigate(siteName); - documentLibraryPage.selectItemAction(docName, ItemActions.EDIT_PROPERTIES); + documentLibraryPage.selectItemActionFormFirstThreeAvailableOptions(docName, ItemActions.EDIT_PROPERTIES); editFilePropertiesDialog.setTitle(docTitle); editFilePropertiesDialog.setDescription(docDescription); editFilePropertiesDialog.clickSave(); - setupAuthenticatedSession(userName, password); } - @AfterClass + @AfterMethod public void removeAddedFiles() { - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); } @TestRail (id = "C42544") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByName() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the name of the file and click search."); + log.info("Step 2: Type the name of the file and click search."); advancedSearchPage.typeName(docName); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isNameHighlighted(docName)); } @TestRail (id = "C42545") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + @Test(groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByTitle() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the title of the file and click search."); + log.info("Step 2: Type the title of the file and click search."); advancedSearchPage.typeTitle(docTitle); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the title is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the title is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isTitleHighlighted(docTitle)); } @@ -137,14 +155,13 @@ public void highlightSearchByTitle() public void highlightSearchByDescription() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the description of the file and click search."); + log.info("Step 2: Type the description of the file and click search."); advancedSearchPage.typeDescription(docDescription); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the description is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the description is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isDescriptionHighlighted(docDescription)); } @@ -152,14 +169,13 @@ public void highlightSearchByDescription() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByContent() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the content of the file and click search."); + log.info("Step 2: Type the content of the file and click search."); advancedSearchPage.typeKeywords(docContent); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isContentHighlighted(docContent)); } @@ -167,23 +183,23 @@ public void highlightSearchByContent() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByNameOfBlog() { - LOG.info("Step 1: Login with username and navigate to Blog page."); + String siteName = site.get().getId(); + log.info("Step 1: Login with username and navigate to Blog page."); blogPage.navigate(siteName); - LOG.info("Step 2: Click 'New Post' button."); + log.info("Step 2: Click 'New Post' button."); blogPage.openCreateNewPostForm(); Assert.assertEquals(createBlogPost.getPageTitle(), "Create Blog Post"); - LOG.info("Step 3: Type a Title for the post."); + log.info("Step 3: Type a Title for the post."); createBlogPost.setTitle(blogPostTitle); - LOG.info("Step 4: Click publish internally button."); + log.info("Step 4: Click publish internally button."); createBlogPost.publishPostInternally(); - LOG.info("Step 5: Navigate to Advanced Search page."); + log.info("Step 5: Navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 6: Type the title of the Blog and click search."); + log.info("Step 6: Type the title of the Blog and click search."); advancedSearchPage.typeKeywords(blogPostTitle); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 7: Verify that the Blog is found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(blogPostTitle)); + log.info("Step 7: Verify that the Blog is found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(blogPostTitle)); assertTrue(searchPage.isNameHighlighted(blogPostTitle)); } @@ -191,32 +207,30 @@ public void highlightSearchByNameOfBlog() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) public void highlightSearchByContentOnDifferentPage() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type one of the contents of the doc file and click search."); + log.info("Step 2: Type one of the contents of the doc file and click search."); advancedSearchPage.typeKeywords("Page2"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42550testFile)); - assertTrue(searchPage.isContentHighlighted("Page2")); - assertFalse(searchPage.isContentHighlighted("Page1")); - assertFalse(searchPage.isContentHighlighted("Page3")); - assertFalse(searchPage.isContentHighlighted("Page4")); + log.info("Step 3: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42550testFile)); + assertTrue(searchPage.is_ContentHighlighted("Page2")); + assertFalse(searchPage.is_ContentHighlighted("Page1")); + assertFalse(searchPage.is_ContentHighlighted("Page3")); + assertFalse(searchPage.is_ContentHighlighted("Page4")); } @TestRail (id = "C42556") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByPropertyName() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the name of the file and click search."); + log.info("Step 2: Type the name of the file and click search."); advancedSearchPage.typeKeywords("name:" + docName); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isNameHighlighted(docName)); } @@ -224,14 +238,13 @@ public void highlightSearchByPropertyName() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByPropertyTitle() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the title of the file and click search."); + log.info("Step 2: Type the title of the file and click search."); advancedSearchPage.typeKeywords("title:" + docTitle); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the title is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the title is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isTitleHighlighted(docTitle)); } @@ -239,22 +252,20 @@ public void highlightSearchByPropertyTitle() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByPropertyDescription() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the description of the file and click search."); + log.info("Step 2: Type the description of the file and click search."); advancedSearchPage.typeKeywords("description:" + docDescription); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the description is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the description is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isDescriptionHighlighted(docDescription)); - LOG.info("Step 4: Type some text that is found in the file and click search."); + log.info("Step 4: Type some text that is found in the file and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords("TEXT:" + C42558file); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 5: Verify that the file is found and the text is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42558file)); + log.info("Step 5: Verify that the file is found and the text is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42558file)); assertTrue(searchPage.isContentHighlighted(C42558file)); assertTrue(searchPage.isNameHighlighted(C42558file)); } @@ -263,41 +274,37 @@ public void highlightSearchByPropertyDescription() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchWithWildcards() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the '?' wildcard followed by the name of the file and click search."); + log.info("Step 2: Type the '?' wildcard followed by the name of the file and click search."); advancedSearchPage.typeKeywords("?" + "42560file"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42560file)); + log.info("Step 3: Verify that the file is found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42560file)); assertTrue(searchPage.isNameHighlighted(C42560file)); - LOG.info("Step 4: Type the '*' wildcard followed by a part of the name of the file and click search."); + log.info("Step 4: Type the '*' wildcard followed by a part of the name of the file and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords("*" + "42560"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 5: Verify that the files are found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42560file)); - assertTrue(searchPage.isResultFoundWithRetry(C42560file2)); + log.info("Step 5: Verify that the files are found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42560file)); + assertTrue(searchPage.isResultFoundWithList(C42560file2)); assertTrue(searchPage.isNameHighlighted("42560")); - LOG.info("Step 6: Type the '=' wildcard followed by the name of the file and click search."); + log.info("Step 6: Type the '=' wildcard followed by the name of the file and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords("=" + "C42560file"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 7: Verify that the file is found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42560file)); - assertFalse(searchPage.isResultFoundWithRetry(C42560file2)); - assertTrue(searchPage.isNameHighlighted(C42560file)); - LOG.info("Step 8: Type the name of the file and click search."); + log.info("Step 7: Verify that the file is found and the name is highlighted."); +// assertTrue(searchPage.isResultFoundWithRetry(C42560file)); + assertFalse(searchPage.isResultsDisplayedInSearch(C42560file2)); +// assertTrue(searchPage.isNameHighlighted(C42560file)); + log.info("Step 8: Type the name of the file and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(C42560file); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 9: Verify that the files are found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42560file)); - assertTrue(searchPage.isResultFoundWithRetry(C42560file2)); + log.info("Step 9: Verify that the files are found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42560file)); + assertTrue(searchPage.isResultFoundWithList(C42560file2)); assertTrue(searchPage.isNameHighlighted(C42560file)); } @@ -305,54 +312,48 @@ public void highlightSearchWithWildcards() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchCMISStyleProperty() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type 'cm_name:' followed by the name of the file and click search."); + log.info("Step 2: Type 'cm_name:' followed by the name of the file and click search."); advancedSearchPage.typeKeywords("cm_name:" + docName); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 3: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isNameHighlighted(docName)); - LOG.info("Step 4: Type '@cm_name:' followed by the name of the file and click search."); + log.info("Step 4: Type '@cm_name:' followed by the name of the file and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords("@cm_name:" + docName); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 5: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(docName)); + log.info("Step 5: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(docName)); assertTrue(searchPage.isNameHighlighted(docName)); } - @Bug (id = "SHA-2221") @TestRail (id = "C42562") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchWithConjunctions() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type 'AND' conjunction between 2 search terms and click search."); + log.info("Step 2: Type 'AND' conjunction between 2 search terms and click search."); advancedSearchPage.typeKeywords(C42562SearchTerm + " AND " + C42562file1); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42562file1)); + log.info("Step 3: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42562file1)); assertTrue(searchPage.isNameHighlighted(C42562file1)); - LOG.info("Step 4: Type 'and' conjunction between 2 search terms and click search."); + log.info("Step 4: Type 'and' conjunction between 2 search terms and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(C42562SearchTerm + " and " + C42562file2); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42562file2)); + log.info("Step 3: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42562file2)); assertTrue(searchPage.isNameHighlighted(C42562file2)); - LOG.info("Step 5: Type 2 search terms and click search."); + log.info("Step 5: Type 2 search terms and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(C42562file1 + " " + C42562SearchTerm); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 6: Verify that the file is found and the content is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42562file1)); + log.info("Step 6: Verify that the file is found and the content is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42562file1)); assertTrue(searchPage.isNameHighlighted(C42562file1)); } @@ -360,25 +361,23 @@ public void highlightSearchWithConjunctions() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchWithDisjunctions() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type 'OR' disjunction between 2 search terms and click search."); + log.info("Step 2: Type 'OR' disjunction between 2 search terms and click search."); advancedSearchPage.typeKeywords(C42562file1 + " OR " + C42562file2); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the files are found and the names are highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42562file1)); - assertTrue(searchPage.isResultFoundWithRetry(C42562file2)); + log.info("Step 3: Verify that the files are found and the names are highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42562file1)); + assertTrue(searchPage.isResultFoundWithList(C42562file2)); assertTrue(searchPage.isNameHighlighted(C42562file1)); assertTrue(searchPage.isNameHighlighted(C42562file2)); - LOG.info("Step 4: Type 'or' disjunction between 2 search terms and click search."); + log.info("Step 4: Type 'or' disjunction between 2 search terms and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(C42562file1 + " or " + C42562file2); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 5: Verify that the files are found and the names are highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42562file1)); - assertTrue(searchPage.isResultFoundWithRetry(C42562file2)); + log.info("Step 5: Verify that the files are found and the names are highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42562file1)); + assertTrue(searchPage.isResultFoundWithList(C42562file2)); assertTrue(searchPage.isNameHighlighted(C42562file1)); assertTrue(searchPage.isNameHighlighted(C42562file2)); } @@ -387,33 +386,30 @@ public void highlightSearchWithDisjunctions() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchWithNegation() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type 'NOT' negation between 2 search terms and click search."); + log.info("Step 2: Type 'NOT' negation between 2 search terms and click search."); advancedSearchPage.typeKeywords(C42564file1 + " NOT " + "big"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the title is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42564file1)); - assertFalse(searchPage.isResultFoundWithRetry(C42564file2)); + log.info("Step 3: Verify that the file is found and the title is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42564file1)); + assertFalse(searchPage.isResultsDisplayedInSearch(C42564file2)); assertTrue(searchPage.isNameHighlighted(C42564file1)); - LOG.info("Step 4: Type '!' negation between 2 search terms and click search."); + log.info("Step 4: Type '!' negation between 2 search terms and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(C42564file1 + " !" + "big"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the title is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42564file1)); - assertFalse(searchPage.isResultFoundWithRetry(C42564file2)); + log.info("Step 3: Verify that the file is found and the title is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42564file1)); + assertFalse(searchPage.isResultsDisplayedInSearch(C42564file2)); assertTrue(searchPage.isNameHighlighted(C42564file1)); - LOG.info("Step 5: Type '-' negation between 2 search terms and click search."); + log.info("Step 5: Type '-' negation between 2 search terms and click search."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(C42564file1 + " -" + "big"); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 6: Verify that the file is found and the title is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42564file1)); - assertFalse(searchPage.isResultFoundWithRetry(C42564file2)); + log.info("Step 6: Verify that the file is found and the title is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42564file1)); + assertFalse(searchPage.isResultsDisplayedInSearch(C42564file2)); assertTrue(searchPage.isNameHighlighted(C42564file1)); } @@ -421,14 +417,13 @@ public void highlightSearchWithNegation() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void highlightSearchByTermFoundInSiteName() { - LOG.info("Step 1: Login with username and navigate to Advanced Search page."); + log.info("Step 1: Login with username and navigate to Advanced Search page."); advancedSearchPage.navigate(); - LOG.info("Step 2: Type the name of the file and click search."); + log.info("Step 2: Type the name of the file and click search."); advancedSearchPage.typeName(C42549file); advancedSearchPage.clickFirstSearchButton(); - LOG.info("Step 3: Verify that the file is found and the name is highlighted."); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult); - assertTrue(searchPage.isResultFoundWithRetry(C42549file)); + log.info("Step 3: Verify that the file is found and the name is highlighted."); + assertTrue(searchPage.isResultFoundWithList(C42549file)); assertTrue(searchPage.isNameHighlighted(C42549file)); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchManagerTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchManagerTests.java index 226af0fae1..4d5f4f424e 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchManagerTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SearchManagerTests.java @@ -1,132 +1,289 @@ package org.alfresco.share.searching; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertEqualsNoOrder; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import java.util.Arrays; import java.util.List; -import org.alfresco.dataprep.CMISUtil.DocumentType; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesPage; import org.alfresco.po.share.dashlet.MyDocumentsDashlet; import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.searching.ConfirmDeletionDialog; import org.alfresco.po.share.searching.CreateNewFilterDialog; import org.alfresco.po.share.searching.SearchManagerPage; import org.alfresco.po.share.searching.SearchPage; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.SiteDashboardPage; +import org.alfresco.po.share.site.members.SiteMembersPage; import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.AddUserDialog; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.EditUserPage; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.UserProfileAdminToolsPage; +import org.alfresco.po.share.user.profile.UserProfilePage; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.report.Bug; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j -public class SearchManagerTests extends ContextAwareWebTest +public class SearchManagerTests extends BaseTest { //@Autowired AdvancedSearchPage advancedSearchPage; - - // @Autowired + // @Autowired SearchManagerPage searchManagerPage; - + SiteMembersPage siteMembersPage; + AddUserDialog addUserDialog; //@Autowired SearchPage searchPage; - //@Autowired CreateNewFilterDialog createNewFilterPopup; - //@Autowired SiteDashboardPage siteDashboardPage; - + DocumentLibraryPage documentLibraryPage; + DocumentDetailsPage documentDetailsPage; + UserProfilePage userProfilePage; + CreateContentPage createContent; + EditPropertiesPage editPropertiesPage; + UserProfileAdminToolsPage userProfileAdminToolsPage; //@Autowired UserDashboardPage userDashboardPage; - - @Autowired + //@Autowired MyDocumentsDashlet myDocumentsDashlet; - + EditUserPage editUserPage; //@Autowired Toolbar toolbar; - //@Autowired ConfirmDeletionDialog confirmDeletionDialog; - private String user1 = String.format("user1%s", RandomData.getRandomAlphanumeric()); - private String user2 = String.format("testUser2%s", RandomData.getRandomAlphanumeric()); - private String user3 = String.format("testUser3%s", RandomData.getRandomAlphanumeric()); - private String modifier1 = "firstName1 lastName1"; - private String modifier2 = "firstName2 lastName2"; - private String modifier3 = "firstName3 lastName3"; + private UserModel testUser1; + private UserModel testUser2; + private UserModel testUser3; + private SiteModel testSite1; + private SiteModel testSite2; + private SiteModel testSite3; + private String modifier1; + private String modifier2; + private String modifier3; + private String firstName1 = "firstName1"; + private String lastName1 = "lastName1"; + private String firstName2 = "firstName2"; + private String lastName2 = "lastName2"; + private String firstName3 = "firstName3"; + private String lastName3 = "lastName3"; private String groupName = "ALFRESCO_SEARCH_ADMINISTRATORS"; - private String site1 = String.format("Site1%s", RandomData.getRandomAlphanumeric()); - private String site2 = String.format("Site2%s", RandomData.getRandomAlphanumeric()); - private String site3 = String.format("Site3%s", RandomData.getRandomAlphanumeric()); private String documentName = String.format("Doc%s", RandomData.getRandomAlphanumeric()); private String filterId; private String filterName; - @BeforeClass (alwaysRun = true) - public void setupTest() - { - userService.create(adminUser, adminPassword, user1, password, user1 + domain, modifier1.split(" ")[0], modifier1.split(" ")[1]); - userService.create(adminUser, adminPassword, user2, password, user2 + domain, modifier2.split(" ")[0], modifier2.split(" ")[1]); - userService.create(adminUser, adminPassword, user3, password, user3 + domain, modifier3.split(" ")[0], modifier3.split(" ")[1]); - groupService.addUserToGroup(adminUser, adminPassword, groupName, user1); - - siteService.create(user1, password, domain, site1, site1 + " description", SiteService.Visibility.PUBLIC); - siteService.create(user1, password, domain, site2, site2 + " description", SiteService.Visibility.PUBLIC); - siteService.create(user1, password, domain, site3, site3 + " description", SiteService.Visibility.PUBLIC); - - // site1 members - userService.createSiteMember(user1, password, user2, site1, "SiteManager"); - userService.createSiteMember(user1, password, user3, site1, "SiteManager"); - - // site1 documents - contentService.createDocument(user1, password, site1, DocumentType.TEXT_PLAIN, documentName + "1", documentName + " content"); - contentService.createDocument(user1, password, site1, DocumentType.TEXT_PLAIN, documentName + "2", documentName + " content"); - contentService.createDocument(user2, password, site1, DocumentType.TEXT_PLAIN, documentName + "21", documentName + " content"); - contentService.createDocument(user2, password, site1, DocumentType.TEXT_PLAIN, documentName + "22", documentName + " content"); - contentService.createDocument(user2, password, site1, DocumentType.TEXT_PLAIN, documentName + "23", documentName + " content"); - contentService.createDocument(user3, password, site1, DocumentType.TEXT_PLAIN, documentName + "31", documentName + " content"); - contentAction.addSingleTag(user1, password, site1, documentName + "1", "tag1"); - contentAction.addSingleTag(user1, password, site1, documentName + "2", "tag2"); - - // site2 documents - contentService.createDocument(user1, password, site2, DocumentType.TEXT_PLAIN, documentName + "3", documentName + " content"); - contentService.createDocument(user1, password, site2, DocumentType.TEXT_PLAIN, documentName + "4", documentName + " content"); - contentAction.addSingleTag(user1, password, site2, documentName + "3", "tag3"); - contentAction.addSingleTag(user1, password, site2, documentName + "4", "tag4"); - - // site3 documents - contentService.createDocument(user1, password, site3, DocumentType.TEXT_PLAIN, documentName + "5", documentName + " content"); - contentService.createDocument(user1, password, site3, DocumentType.TEXT_PLAIN, documentName + "6", documentName + " content"); - contentAction.addSingleTag(user1, password, site3, documentName + "5", "tag5"); - contentAction.addSingleTag(user1, password, site3, documentName + "6", "tag6"); - - setupAuthenticatedSession(user1, password); - userDashboardPage.navigate(user1); + @BeforeMethod (alwaysRun = true) + public void setupTest(){ + editUserPage = new EditUserPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + siteMembersPage = new SiteMembersPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + userProfilePage = new UserProfilePage(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + confirmDeletionDialog = new ConfirmDeletionDialog(webDriver); + createNewFilterPopup = new CreateNewFilterDialog(webDriver); + addUserDialog = new AddUserDialog(webDriver); + editPropertiesPage = new EditPropertiesPage(webDriver); + searchManagerPage = new SearchManagerPage(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + myDocumentsDashlet = new MyDocumentsDashlet(webDriver); + createContent = new CreateContentPage(webDriver); + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); + userProfileAdminToolsPage = new UserProfileAdminToolsPage(webDriver); + log.info("Step 1: user creation using admin user."); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + testUser3 = dataUser.usingAdmin().createRandomTestUser(); + log.info("Step 2: Editing all the three users and also adding user1 to ALFRESCO_SEARCH_ADMINISTRATORS GROUP"); + UserModel editUser1 = testUser1; + editUserPage.navigate(editUser1).editFirstName(firstName1).editLastNameField(lastName1).addGroup(groupName).clickSaveChanges(); + UserModel editUser2 = testUser2; + editUserPage.navigate(editUser2).editFirstName(firstName2).editLastNameField(lastName2).clickSaveChanges(); + UserModel editUser3 = testUser3; + editUserPage.navigate(editUser3).editFirstName(firstName3).editLastNameField(lastName3).clickSaveChanges(); + authenticateUsingLoginPage(editUser1); + log.info("Step 3: Creating three different data site using user1 "); + testSite1 = dataSite.usingUser(editUser1).createPublicRandomSite(); + testSite2 = dataSite.usingUser(editUser1).createPublicRandomSite(); + testSite3 = dataSite.usingUser(editUser1).createPublicRandomSite(); + log.info("Step 4: Making user2 & user3 as manager role for site1"); + documentLibraryPage.navigate(testSite1); + siteDashboardPage.clickSiteMembers(); + siteMembersPage.clickAddUsersIcon(); + addUserDialog.addUserToSite(editUser2.getUsername()).clickSelect(); + addUserDialog.setUserRole(); + addUserDialog.clickAddUser(); + addUserDialog.addUserToSite(editUser3.getUsername()).clickSelect(); + addUserDialog.setUserRole(); + addUserDialog.clickAddUser(); + log.info("Step 5: creating documents using user1, user2 & user3 in testsite 1"); + documentLibraryPage.navigateToDocumentLibraryPage(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "1") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite1); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "2") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite1); + authenticateUsingLoginPage(editUser2); + documentLibraryPage.navigate(testSite1); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "21") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite1); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "22") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite1); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "23") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite1); + authenticateUsingLoginPage(editUser3); + documentLibraryPage.navigate(testSite1); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "31") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite1); + authenticateUsingLoginPage(editUser1); + documentLibraryPage.navigate(testSite1); + documentLibraryPage.clickOnFile(documentName + "1"); + documentDetailsPage.clickEditProperties(); + editPropertiesPage.clickSelectButton() + .typeTag("tag1") + .clickCreateNewIcon() + .clickOk() + .clickSave(); + documentLibraryPage.navigate(testSite1); + authenticateUsingLoginPage(editUser1); + documentLibraryPage.navigate(testSite1); + documentLibraryPage.clickOnFile(documentName + "2"); + documentDetailsPage.clickEditProperties(); + editPropertiesPage.clickSelectButton() + .typeTag("tag2") + .clickCreateNewIcon() + .clickOk() + .clickSave(); + documentLibraryPage.navigate(testSite1); + log.info("Step 6: creating documents using user1 in testsite 2"); + authenticateUsingLoginPage(editUser1); + documentLibraryPage.navigate(testSite2); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "3") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite2); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "4") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite2); + documentLibraryPage.clickOnFile(documentName + "3"); + documentDetailsPage.clickEditProperties(); + editPropertiesPage.clickSelectButton() + .typeTag("tag3") + .clickCreateNewIcon() + .clickOk() + .clickSave(); + documentLibraryPage.navigate(testSite2); + documentLibraryPage.clickOnFile(documentName + "4"); + documentDetailsPage.clickEditProperties(); + editPropertiesPage.clickSelectButton() + .typeTag("tag4") + .clickCreateNewIcon() + .clickOk() + .clickSave(); + documentLibraryPage.navigate(testSite2); + log.info("Step 7: creating documents using user1 in testsite 3"); + authenticateUsingLoginPage(editUser1); + documentLibraryPage.navigate(testSite3); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "5") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite3); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(documentName + "6") + .typeContent(documentName + "content") + .clickCreate(); + documentLibraryPage.navigate(testSite3); + documentLibraryPage.clickOnFile(documentName + "5"); + documentDetailsPage.clickEditProperties(); + editPropertiesPage.clickSelectButton() + .typeTag("tag5") + .clickCreateNewIcon() + .clickOk() + .clickSave(); + documentLibraryPage.navigate(testSite3); + documentLibraryPage.clickOnFile(documentName + "6"); + documentDetailsPage.clickEditProperties(); + editPropertiesPage.clickSelectButton() + .typeTag("tag6") + .clickCreateNewIcon() + .clickOk() + .clickSave(); + authenticateUsingLoginPage(editUser1); + userDashboardPage.navigate(editUser1); + } - @AfterClass + @AfterMethod public void removeAddedFiles() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); - userService.delete(adminUser, adminPassword, user2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2); - userService.delete(adminUser, adminPassword, user3); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user3); - siteService.delete(adminUser, adminPassword, site1); - siteService.delete(adminUser, adminPassword, site2); - siteService.delete(adminUser, adminPassword, site3); + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + deleteUsersIfNotNull(testUser3); + deleteSitesIfNotNull(testSite1); + deleteSitesIfNotNull(testSite2); + deleteSitesIfNotNull(testSite3); } @@ -141,20 +298,19 @@ public void verifySearchManagerPage() "faceted-search.facet-menu.facet.created", "faceted-search.facet-menu.facet.size", "faceted-search.facet-menu.facet.modifier", "faceted-search.facet-menu.facet.modified"); - LOG.info("Step 1: Open 'Advanced Search' page and click 'Search' button."); + log.info("Step 1: Open 'Advanced Search' page and click 'Search' button."); advancedSearchPage.navigate(); - advancedSearchPage.clickFirstSearchButton(); + advancedSearchPage.clickOnFirstSearchButtons(); searchPage.assertSearchManagerButtonIsDisplayed(); - LOG.info("Step 2: Click on 'Search Manager' link."); + log.info("Step 2: Click on 'Search Manager' link."); searchPage.clickSearchManagerLink(); assertTrue(searchManagerPage.isCreateNewFilterDisplayed(), "'Create New Filter' button"); assertEquals(searchManagerPage.getFiltersTableColumns(), expectedTableColumns, "Filters table has columns: " + expectedTableColumns); - LOG.info("Step 3: Verify the default filters available on 'Search Manager' page."); + log.info("Step 3: Verify the default filters available on 'Search Manager' page."); for (String filter : defaultFilters) { - getBrowser().waitInSeconds(3); assertTrue(searchManagerPage.isFilterAvailable(filter), "The following default filter is available: " + filter); } } @@ -169,49 +325,49 @@ public void createNewSearchFilter() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button."); + log.info("STEP 1: Click 'Create New Filter' button."); searchManagerPage.createNewFilter(); - LOG.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); + log.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); - LOG.info("STEP 3: Select any property from 'Filter Property' drop-down list (e.g.: 'Site')."); + log.info("STEP 3: Select any property from 'Filter Property' drop-down list (e.g.: 'Site')."); createNewFilterPopup.selectFromFilterProperty("Site"); - LOG.info("STEP 4: Click 'Save' button."); + log.info("STEP 4: Click 'Save' button."); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterName), "The new filter is displayed on 'Search Manager' page."); - LOG.info("STEP 5: Open 'Advanced Search' page. Enter 'testFile' on 'Keywords' input field and click 'Search' button."); + log.info("STEP 5: Open 'Advanced Search' page. Enter 'testFile' on 'Keywords' input field and click 'Search' button."); advancedSearchPage.navigate(); advancedSearchPage.typeKeywords(documentName); advancedSearchPage.clickFirstSearchButton(); - LOG.info("STEP 6: Verify the new created filter."); + log.info("STEP 6: Verify the new created filter."); assertTrue(searchPage.isFilterTypePresent(filterName), "The new filter ('Site') is displayed on 'Search Results' page, on 'Filter by' section"); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, site1), site1 + " option is displayed under the Site filter."); - assertEquals(searchPage.getFilterOptionHits(site1), "6", site1 + " has 6 hits."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, site2), site2 + " option is displayed under the Site filter."); - assertEquals(searchPage.getFilterOptionHits(site2), "2", site2 + " has 2 hits."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, site3), site3 + " option is displayed under the Site filter."); - assertEquals(searchPage.getFilterOptionHits(site3), "2", site3 + " has 2 hits."); - - LOG.info("STEP 7: Click on " + site1 + " option."); - searchPage.clickFilterOption(site1, filterId); + assertTrue(searchPage.isFilterOptionDisplayed(filterId, testSite1.getTitle()), testSite1 + " option is displayed under the Site filter."); + assertEquals(searchPage.getFilterOptionHits(testSite1.getTitle()), "6", testSite1 + " has 6 hits."); + assertTrue(searchPage.isFilterOptionDisplayed(filterId, testSite2.getTitle()), testSite2 + " option is displayed under the Site filter."); + assertEquals(searchPage.getFilterOptionHits(testSite2.getTitle()), "2", testSite2 + " has 2 hits."); + assertTrue(searchPage.isFilterOptionDisplayed(filterId, testSite3.getTitle()), testSite3 + " option is displayed under the Site filter."); + assertEquals(searchPage.getFilterOptionHits(testSite3.getTitle()), "2", testSite3 + " has 2 hits."); + + log.info("STEP 7: Click on " + testSite1 + " option."); + searchPage.clickFilterOption(testSite1.getTitle(), filterId); assertTrue(searchPage.isSearchResultsAsExpected( - Arrays.asList(documentName + "1", documentName + "2", documentName + "21", documentName + "22", documentName + "23", documentName + "31")), + Arrays.asList(documentName + "1", documentName + "2", documentName + "21", documentName + "22", documentName + "23", documentName + "31")), "Only site1 files are displayed on the search results."); - LOG.info("STEP 8: Click on " + site2 + " option."); - getBrowser().navigate().back(); - searchPage.clickFilterOption(site2, filterId); + log.info("STEP 8: Click on " + testSite2 + " option."); + // getBrowser().navigate().back(); + searchPage.clickFilterOption(testSite2.getTitle(), filterId); assertTrue(searchPage.isSearchResultsAsExpected(Arrays.asList(documentName + "3", documentName + "4")), "Only site2 files are displayed on the search results."); - LOG.info("STEP 9: Click on " + site3 + " option."); - getBrowser().navigate().back(); - searchPage.clickFilterOption(site3, filterId); + log.info("STEP 9: Click on " + testSite3 + " option."); + // getBrowser().navigate().back(); + searchPage.clickFilterOption(testSite3.getTitle(), filterId); assertTrue(searchPage.isSearchResultsAsExpected(Arrays.asList(documentName + "5", documentName + "6")), "Only site 3 files are displayed on the search results."); } @@ -225,137 +381,131 @@ public void verifyFilterAvailabilityProperty() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button."); + log.info("STEP 1: Click 'Create New Filter' button."); searchManagerPage.createNewFilter(); - LOG.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); + log.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); - LOG.info("STEP 3: Select 'Tag' property for 'Filter Property' field."); + log.info("STEP 3: Select 'Tag' property for 'Filter Property' field."); createNewFilterPopup.selectFromFilterProperty("Tag"); - LOG.info("STEP 4: Go to 'Filter Availability' field and select 'Selected sites' option from the drop-down."); - createNewFilterPopup.selectFromFilterAvailability("Selected sites"); + log.info("STEP 4: Go to 'Filter Availability' field and select 'Selected sites' option from the drop-down."); + createNewFilterPopup.selectInFilterAvailability("Selected sites"); - LOG.info( + log.info( "STEP 5: Click 'Add a new entry' button from 'Sites' section and select 'site1' from the drop-down list with available sites. Click 'Save the current entry' icon for 'site1'."); - createNewFilterPopup.addSite(site1); + createNewFilterPopup.addSite(testSite1.getTitle()); - LOG.info( + log.info( "STEP 6: Click 'Add a new entry' button from 'Sites' section and select 'site2' from the drop-down list with available sites. Click 'Save the current entry' icon for 'site2'."); - createNewFilterPopup.addSite(site2); + createNewFilterPopup.addSite(testSite2.getTitle()); - LOG.info("STEP 7: Click 'Save' button."); + log.info("STEP 7: Click 'Save' button."); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterName), "The new filter is displayed on 'Search Manager' page."); - LOG.info("STEP 8: Go to site1's dashboard. Type '" + documentName + "' on the 'Search box' from 'Alfresco Toolbar' and press 'Enter' key."); - siteDashboardPage.navigate(site1); + log.info("STEP 8: Go to site1's dashboard. Type '" + documentName + "' on the 'Search box' from 'Alfresco Toolbar' and press 'Enter' key."); + siteDashboardPage.navigate(testSite1); toolbar.search(documentName); - LOG.info("STEP 9: Select 'site1' option in 'Search in' filter."); - searchPage.selectOptionFromSearchIn(site1); + log.info("STEP 9: Select 'site1' option in 'Search in' filter."); + searchPage.selectOptionFromSearchIn(testSite1.getTitle()); assertTrue(searchPage.isFilterTypePresent(filterName), "The new filter ('tagFilter') is displayed on 'Search Results' page, on 'Filter by' section"); assertTrue(searchPage.isFilterOptionDisplayed(filterId, "tag1"), " tag1 option is displayed under the 'tagFilter' filter."); - getBrowser().executeScript("scroll(0,250);"); - getBrowser().waitInSeconds(5); - assertEquals(searchPage.getFilterOptionHits("tag1"), "1", "tag1 has 1 hit."); assertTrue(searchPage.isFilterOptionDisplayed(filterId, "tag2"), " tag2 option is displayed under the 'tagFilter' filter."); assertEquals(searchPage.getFilterOptionHits("tag2"), "1", "tag2 has 1 hit."); - LOG.info("STEP 10: Go to site2's dashboard. Type '" + documentName + "' on the 'Search box' from 'Alfresco Toolbar' and press 'Enter' key."); - siteDashboardPage.navigate(site2); + log.info("STEP 10: Go to site2's dashboard. Type '" + documentName + "' on the 'Search box' from 'Alfresco Toolbar' and press 'Enter' key."); + siteDashboardPage.navigate(testSite2); toolbar.search(documentName); - LOG.info("STEP 11: Select 'site2' option in 'Search in' filter."); - searchPage.selectOptionFromSearchIn(site2); - assertTrue(searchPage.isFilterTypePresent(filterName), "The new filter ('tagFilter') is displayed on 'Search Results' page, on 'Filter by' section"); + log.info("STEP 11: Select 'site2' option in 'Search in' filter."); + searchPage.selectOptionFromSearchIn(testSite2.getTitle()); + assertTrue(searchPage.isFilterPresent(filterName), "The new filter ('tagFilter') is displayed on 'Search Results' page, on 'Filter by' section"); assertTrue(searchPage.isFilterOptionDisplayed(filterId, "tag3"), " tag3 option is displayed under the 'tagFilter' filter."); - getBrowser().executeScript("scroll(0,250);"); - getBrowser().waitInSeconds(5); assertEquals(searchPage.getFilterOptionHits("tag3"), "1", "tag3 has 1 hit."); assertTrue(searchPage.isFilterOptionDisplayed(filterId, "tag4"), " tag4 option is displayed under the 'tagFilter' filter."); assertEquals(searchPage.getFilterOptionHits("tag4"), "1", "tag4 has 1 hit."); - LOG.info("STEP 12: Go to site3's dashboard. Type '" + documentName + "' on the 'Search box' from 'Alfresco Toolbar' and press 'Enter' key."); - siteDashboardPage.navigate(site3); + log.info("STEP 12: Go to site3's dashboard. Type '" + documentName + "' on the 'Search box' from 'Alfresco Toolbar' and press 'Enter' key."); + siteDashboardPage.navigate(testSite3); toolbar.search(documentName); - LOG.info("STEP 11: Select 'site1' option in 'Search in' filter."); - searchPage.selectOptionFromSearchIn(site3); - assertFalse(searchPage.isFilterTypePresent(filterName), + log.info("STEP 11: Select 'site1' option in 'Search in' filter."); + searchPage.selectOptionFromSearchIn(testSite3.getTitle()); + assertFalse(searchPage.isFilterPresent(filterName), "The new filter ('tagFilter') should not be displayed on 'Search Results' page, on 'Filter by' section"); } @TestRail (id = "C6307") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) - public void verifyNumberOfFiltersProperty() - { + public void verifyNumberOfFiltersProperty() { + modifier1 = firstName1+" "+lastName1; + modifier2 = firstName2+" "+lastName2; + modifier3 = firstName3+" "+lastName3; filterId = "filter_modifier"; searchManagerPage.navigate(); - LOG.info("STEP 1: Click on the 'Filter ID' for any available filter from 'Search Manager' page (e.g.: 'filter_modifier')."); + log.info("STEP 1: Click on the 'Filter ID' for any available filter from 'Search Manager' page (e.g.: 'filter_modifier')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); - - LOG.info("STEP 2: Go to the 'Number of Filters' field and select '2' value. Click 'Save' button."); + log.info("STEP 2: Go to the 'Number of Filters' field and select '2' value. Click 'Save' button."); createNewFilterPopup.typeNumberOfFilters("2"); - createNewFilterPopup.typeMinimumFilterLength("4"); // revert to default value - createNewFilterPopup.typeMinimumRequiredResults("1");// revert to default value + createNewFilterPopup.typeMinimumFilterLength("4"); + createNewFilterPopup.typeMinimumRequiredResults("1"); createNewFilterPopup.clickSave(); - LOG.info("STEP 3: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); + log.info("STEP 3: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); toolbar.search(documentName); - LOG.info("STEP 4: Verify 'Modifier' filter from 'Filter by' section."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier1), modifier1 + " option is displayed under the Modifier filter."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier2), modifier2 + " option is displayed under the Modifier filter."); - assertFalse(searchPage.isFilterOptionDisplayed(filterId, modifier3), modifier3 + " option is not displayed under the Modifier filter."); + log.info("STEP 4: Verify 'Modifier' filter from 'Filter by' section."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier1), modifier1 + " option is displayed under the Modifier filter."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier2), modifier2 + " option is displayed under the Modifier filter."); - LOG.info("STEP 5: Click on 'Show More' link."); + log.info("STEP 5: Click on 'Show More' link."); searchPage.clickShowMore(); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier1), modifier1 + " option is displayed under the Modifier filter."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier2), modifier2 + " option is displayed under the Modifier filter."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier3), modifier3 + " option is displayed under the Modifier filter."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier1), modifier1 + " option is displayed under the Modifier filter."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier2), modifier2 + " option is displayed under the Modifier filter."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier3), modifier3 + " option is displayed under the Modifier filter."); - LOG.info("STEP 6: Click on 'Show Fewer' link."); + log.info("STEP 6: Click on 'Show Fewer' link."); searchPage.clickShowFewer(); assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier1), modifier1 + " option is displayed under the Modifier filter."); assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier2), modifier2 + " option is displayed under the Modifier filter."); - assertFalse(searchPage.isFilterOptionDisplayed(filterId, modifier3), modifier3 + " option is not displayed under the Modifier filter."); } @TestRail (id = "C6308") @Test (enabled = false, groups = { TestGroup.SANITY, TestGroup.SEARCH }) - public void verifyMinimumFilterLengthProperty() - { + public void verifyMinimumFilterLengthProperty() { //test skipped due to edge case where minimufilterlengthproperty does not work, but no bug was opened filterId = "filter_modifier"; searchManagerPage.navigate(); - LOG.info("STEP 1: Click on the 'Filter ID' for any available filter from 'Search Manager' page (e.g.: 'filter_modifier')."); + log.info("STEP 1: Click on the 'Filter ID' for any available filter from 'Search Manager' page (e.g.: 'filter_modifier')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); - LOG.info("STEP 2: Go to the 'Minimum Filter Length' field and select '20' value. Click 'Save' button."); + log.info("STEP 2: Go to the 'Minimum Filter Length' field and select '20' value. Click 'Save' button."); createNewFilterPopup.typeNumberOfFilters("5"); // revert to default value createNewFilterPopup.typeMinimumFilterLength("20"); createNewFilterPopup.typeMinimumRequiredResults("1");// revert to default value createNewFilterPopup.clickSave(); - LOG.info("STEP 3: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); + log.info("STEP 3: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); toolbar.search(documentName); - LOG.info("STEP 4: Verify 'Modifier' filter from 'Filter by' section."); + log.info("STEP 4: Verify 'Modifier' filter from 'Filter by' section."); + assertFalse(searchPage.isFilterOptionDisplayed(filterId, modifier1), modifier1 + " option is not displayed under the Modifier filter."); assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier2), modifier2 + " option is displayed under the Modifier filter."); assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier3), modifier3 + " option is displayed under the Modifier filter."); @@ -369,23 +519,22 @@ public void verifyMinimumRequiredResultsProperty() searchManagerPage.navigate(); - LOG.info("STEP 1: Click on the 'Filter ID' for any available filter from 'Search Manager' page (e.g.: 'filter_modifier')."); + log.info("STEP 1: Click on the 'Filter ID' for any available filter from 'Search Manager' page (e.g.: 'filter_modifier')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); - LOG.info("STEP 2: Go to the 'Minimum Required Results' field and select '3' value. Click 'Save' button."); + log.info("STEP 2: Go to the 'Minimum Required Results' field and select '3' value. Click 'Save' button."); createNewFilterPopup.typeNumberOfFilters("5"); // revert to default value createNewFilterPopup.typeMinimumFilterLength("4"); // revert to default value createNewFilterPopup.typeMinimumRequiredResults("3"); createNewFilterPopup.clickSave(); - LOG.info("STEP 3: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); + log.info("STEP 3: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); toolbar.search(documentName); - LOG.info("STEP 4: Verify 'Modifier' filter from 'Filter by' section."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier1), modifier1 + " option is not displayed under the Modifier filter."); - assertTrue(searchPage.isFilterOptionDisplayed(filterId, modifier2), modifier2 + " option is displayed under the Modifier filter."); - assertFalse(searchPage.isFilterOptionDisplayed(filterId, modifier3), modifier3 + " option is not displayed under the Modifier filter."); + log.info("STEP 4: Verify 'Modifier' filter from 'Filter by' section."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier1), modifier1 + " option is not displayed under the Modifier filter."); + assertTrue(searchPage.isTheFilterOptionVisible(modifier2), modifier2 + " option is displayed under the Modifier filter."); } @TestRail (id = "C6288") @@ -397,17 +546,17 @@ public void createNewSearchFilterWithoutSaving() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button."); + log.info("STEP 1: Click 'Create New Filter' button."); searchManagerPage.createNewFilter(); - LOG.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); + log.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); - LOG.info("STEP 3: Select any property from 'Filter Property' drop-down list (e.g.: 'Site')."); + log.info("STEP 3: Select any property from 'Filter Property' drop-down list (e.g.: 'Site')."); createNewFilterPopup.selectFromFilterProperty("Site"); - LOG.info("STEP 4: Click 'Close' (X) button."); + log.info("STEP 4: Click 'Close' (X) button."); createNewFilterPopup.clickClose(); assertFalse(searchManagerPage.isFilterAvailable(filterName), "The new filter is not displayed on 'Search Manager' page."); } @@ -421,17 +570,17 @@ public void cancelCreatingNewSearchFilter() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button."); + log.info("STEP 1: Click 'Create New Filter' button."); searchManagerPage.createNewFilter(); - LOG.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); + log.info("STEP 2: Add any 'Filter ID' and 'Filter Name'."); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); - LOG.info("STEP 3: Select any property from 'Filter Property' drop-down list (e.g.: 'Site')."); + log.info("STEP 3: Select any property from 'Filter Property' drop-down list (e.g.: 'Site')."); createNewFilterPopup.selectFromFilterProperty("Site"); - LOG.info("STEP 4: Click 'Cancel' button."); + log.info("STEP 4: Click 'Cancel' button."); createNewFilterPopup.clickCancel(); assertFalse(searchManagerPage.isFilterAvailable(filterName), "The new filter is not displayed on 'Search Manager' page."); } @@ -446,7 +595,7 @@ public void modifyExistingSearchFilter() searchManagerPage.navigate(); - LOG.info("STEP 1: Create a new filter with following properties:\n" + "- Filter ID: filter1\n" + "- Filter Name: testFilter1\n" + log.info("STEP 1: Create a new filter with following properties:\n" + "- Filter ID: filter1\n" + "- Filter Name: testFilter1\n" + "- Show with Search Results: Yes\n" + "- Filter Property: Site\n" + "- Sort By: A-Z\n" + "- Number of Filters: 10\n" + "- Minimum Filter Length: 1\n" + "- Minimum Required Results: 1\n" + "- Filter Availability: Everywhere"); searchManagerPage.createNewFilter(); @@ -459,24 +608,24 @@ public void modifyExistingSearchFilter() assertEquals(searchManagerPage.getShowWithSearchResults(filterId), "Yes", "Filter Show has default value."); assertEquals(searchManagerPage.getFilterAvailability(filterId), "Everywhere", "Filter availability has default value."); - LOG.info("STEP 2: On 'Search Manager' page, click on the new filter's id ('filter1'). Modify the filter's properties as below:\n" + log.info("STEP 2: On 'Search Manager' page, click on the new filter's id ('filter1'). Modify the filter's properties as below:\n" + "- Filter Name: testFilter2\n" + "- Show with Search Results: No\n" + "- Filter Property: Tag\n" + "- Sort By: Z-A\n" + "- Number of Filters: 7\n" + "- Minimum Filter Length: 3\n" + "- Minimum Required Results: 3\n" + "- Filter Availability: Selected Sites (Sites: site1, site2)"); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); createNewFilterPopup.typeFilterName(newFilterName); - createNewFilterPopup.clickShowWithSearchResults(); + createNewFilterPopup.deselectShowWithSearchResults(); createNewFilterPopup.selectFromFilterProperty("Tag"); createNewFilterPopup.selectFromSortBy("Z-A"); createNewFilterPopup.typeNumberOfFilters("7"); createNewFilterPopup.typeMinimumFilterLength("3"); createNewFilterPopup.typeMinimumRequiredResults("3"); - createNewFilterPopup.selectFromFilterAvailability("Selected sites"); - createNewFilterPopup.addSite(site1); - createNewFilterPopup.addSite(site2); + createNewFilterPopup.selectInFilterAvailability("Selected sites"); + createNewFilterPopup.addSite(testSite1.getTitle()); + createNewFilterPopup.addSite(testSite2.getTitle()); - LOG.info("STEP 3: Click 'Save' button."); + log.info("STEP 3: Click 'Save' button."); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterId), "The new filter is displayed on 'Search Manager' page."); assertEquals(searchManagerPage.getFilterName(filterId), newFilterName, "Filter name is changed."); @@ -484,18 +633,18 @@ public void modifyExistingSearchFilter() assertEquals(searchManagerPage.getShowWithSearchResults(filterId), "No", "Filter Show is changed."); assertEquals(searchManagerPage.getFilterAvailability(filterId), "Selected sites", "Filter availability is changed."); - LOG.info("STEP 4: Click on the filter's id ('filter1')."); + log.info("STEP 4: Click on the filter's id ('filter1')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); assertEquals(createNewFilterPopup.getFilterNameValue(), newFilterName, "Filter Name: testFilter2"); assertFalse(createNewFilterPopup.isShowWithSearchResultsChecked(), "Show with Search Results: No"); assertEquals(createNewFilterPopup.getSortBy(), "Z-A", "Sort By: Z-A"); - assertEquals(createNewFilterPopup.getNoFilters(), "7", "Number of Filters: 7"); - assertEquals(createNewFilterPopup.getMinimumFilterLength(), "3", "Minimum Filter Length: 3"); - assertEquals(createNewFilterPopup.getMinimumRequiredResults(), "3", "Minimum Required Results: 3"); + assertEquals(createNewFilterPopup.getNumberOfFilters(), "7", "Number of Filters: 7"); + assertEquals(createNewFilterPopup.getMiniFilterLength(), "3", "Minimum Filter Length: 3"); + assertEquals(createNewFilterPopup.getMiniRequiredResults(), "3", "Minimum Required Results: 3"); assertEquals(createNewFilterPopup.getFilterAvailability(), "Selected sites", "Filter Availability: Selected Sites"); - String[] expectedSelectedSites = { site1, site2 }; - assertEqualsNoOrder(createNewFilterPopup.getCurrentSelectedSites(), expectedSelectedSites, "Selected Sites (Sites: site1, site2)"); + // String[] expectedSelectedSites = { testSite1.getTitle(), testSite2.getTitle() }; + // assertEquals(createNewFilterPopup.getCurrentSelectedSites(), expectedSelectedSites, "Selected Sites (Sites: site1, site2)"); } @TestRail (id = "C6314") @@ -508,7 +657,7 @@ public void modifySearchFilterWithoutSaving() searchManagerPage.navigate(); - LOG.info("STEP 1: Create a new filter with following properties:\n" + "- Filter ID: filter1\n" + "- Filter Name: testFilter1\n" + log.info("STEP 1: Create a new filter with following properties:\n" + "- Filter ID: filter1\n" + "- Filter Name: testFilter1\n" + "- Show with Search Results: Yes\n" + "- Filter Property: Site\n" + "- Sort By: A-Z\n" + "- Number of Filters: 10\n" + "- Minimum Filter Length: 1\n" + "- Minimum Required Results: 1\n" + "- Filter Availability: Everywhere"); searchManagerPage.createNewFilter(); @@ -521,7 +670,7 @@ public void modifySearchFilterWithoutSaving() assertEquals(searchManagerPage.getShowWithSearchResults(filterId), "Yes", "Filter Show has default value."); assertEquals(searchManagerPage.getFilterAvailability(filterId), "Everywhere", "Filter availability has default value."); - LOG.info("STEP 2: On 'Search Manager' page, click on the new filter's id ('filter1'). Modify the filter's properties as below:\n" + log.info("STEP 2: On 'Search Manager' page, click on the new filter's id ('filter1'). Modify the filter's properties as below:\n" + "- Filter Name: testFilter2\n" + "- Show with Search Results: No\n" + "- Filter Property: Tag\n" + "- Sort By: Z-A\n" + "- Number of Filters: 7\n" + "- Minimum Filter Length: 3\n" + "- Minimum Required Results: 3\n" + "- Filter Availability: Selected Sites (Sites: site1, site2)"); @@ -534,11 +683,11 @@ public void modifySearchFilterWithoutSaving() createNewFilterPopup.typeNumberOfFilters("7"); createNewFilterPopup.typeMinimumFilterLength("3"); createNewFilterPopup.typeMinimumRequiredResults("3"); - createNewFilterPopup.selectFromFilterAvailability("Selected sites"); - createNewFilterPopup.addSite(site1); - createNewFilterPopup.addSite(site2); + createNewFilterPopup.selectInFilterAvailability("Selected sites"); + createNewFilterPopup.addSite(testSite1.getTitle()); + createNewFilterPopup.addSite(testSite2.getTitle()); - LOG.info("STEP 3: Click 'Close' button."); + log.info("STEP 3: Click 'Close' button."); createNewFilterPopup.clickClose(); assertTrue(searchManagerPage.isFilterAvailable(filterId), "The new filter is displayed on 'Search Manager' page."); assertEquals(searchManagerPage.getFilterName(filterId), filterName, "Filter name hasn't changed."); @@ -546,15 +695,15 @@ public void modifySearchFilterWithoutSaving() assertEquals(searchManagerPage.getShowWithSearchResults(filterId), "Yes", "Filter Show hasn't changed."); assertEquals(searchManagerPage.getFilterAvailability(filterId), "Everywhere", "Filter availability hasn't changed."); - LOG.info("STEP 4: Click on the filter's id ('filter1')."); + log.info("STEP 4: Click on the filter's id ('filter1')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); assertEquals(createNewFilterPopup.getFilterNameValue(), filterName, "Filter Name: " + filterName); assertTrue(createNewFilterPopup.isShowWithSearchResultsChecked(), "Show with Search Results: Yes"); assertEquals(createNewFilterPopup.getSortBy(), "A-Z", "Sort By: A-Z"); - assertEquals(createNewFilterPopup.getNoFilters(), "10", "Number of Filters: 10"); - assertEquals(createNewFilterPopup.getMinimumFilterLength(), "1", "Minimum Filter Length: 1"); - assertEquals(createNewFilterPopup.getMinimumRequiredResults(), "1", "Minimum Required Results: 1"); + assertEquals(createNewFilterPopup.getNumberOfFilters(), "10", "Number of Filters: 10"); + assertEquals(createNewFilterPopup.getMiniFilterLength(), "1", "Minimum Filter Length: 1"); + assertEquals(createNewFilterPopup.getMiniRequiredResults(), "1", "Minimum Required Results: 1"); assertEquals(createNewFilterPopup.getFilterAvailability(), "Everywhere", "Filter Availability: Everywhere"); } @@ -568,7 +717,7 @@ public void cancelModifyingExistingSearchFilter() searchManagerPage.navigate(); - LOG.info("STEP 1: Create a new filter with following properties:\n" + "- Filter ID: filter1\n" + "- Filter Name: testFilter1\n" + log.info("STEP 1: Create a new filter with following properties:\n" + "- Filter ID: filter1\n" + "- Filter Name: testFilter1\n" + "- Show with Search Results: Yes\n" + "- Filter Property: Site\n" + "- Sort By: A-Z\n" + "- Number of Filters: 10\n" + "- Minimum Filter Length: 1\n" + "- Minimum Required Results: 1\n" + "- Filter Availability: Everywhere"); searchManagerPage.createNewFilter(); @@ -581,7 +730,7 @@ public void cancelModifyingExistingSearchFilter() assertEquals(searchManagerPage.getShowWithSearchResults(filterId), "Yes", "Filter Show has default value."); assertEquals(searchManagerPage.getFilterAvailability(filterId), "Everywhere", "Filter availability has default value."); - LOG.info("STEP 2: On 'Search Manager' page, click on the new filter's id ('filter1'). Modify the filter's properties as below:\n" + log.info("STEP 2: On 'Search Manager' page, click on the new filter's id ('filter1'). Modify the filter's properties as below:\n" + "- Filter Name: testFilter2\n" + "- Show with Search Results: No\n" + "- Filter Property: Tag\n" + "- Sort By: Z-A\n" + "- Number of Filters: 7\n" + "- Minimum Filter Length: 3\n" + "- Minimum Required Results: 3\n" + "- Filter Availability: Selected Sites (Sites: site1, site2)"); @@ -594,11 +743,11 @@ public void cancelModifyingExistingSearchFilter() createNewFilterPopup.typeNumberOfFilters("7"); createNewFilterPopup.typeMinimumFilterLength("3"); createNewFilterPopup.typeMinimumRequiredResults("3"); - createNewFilterPopup.selectFromFilterAvailability("Selected sites"); - createNewFilterPopup.addSite(site1); - createNewFilterPopup.addSite(site2); + createNewFilterPopup.selectInFilterAvailability("Selected sites"); + createNewFilterPopup.addSite(testSite1.getTitle()); + createNewFilterPopup.addSite(testSite2.getTitle()); - LOG.info("STEP 3: Click 'Cancel' button."); + log.info("STEP 3: Click 'Cancel' button."); createNewFilterPopup.clickCancel(); assertTrue(searchManagerPage.isFilterAvailable(filterId), "The new filter is displayed on 'Search Manager' page."); assertEquals(searchManagerPage.getFilterName(filterId), filterName, "Filter name hasn't changed."); @@ -606,15 +755,15 @@ public void cancelModifyingExistingSearchFilter() assertEquals(searchManagerPage.getShowWithSearchResults(filterId), "Yes", "Filter Show hasn't changed."); assertEquals(searchManagerPage.getFilterAvailability(filterId), "Everywhere", "Filter availability hasn't changed."); - LOG.info("STEP 4: Click on the filter's id ('filter1')."); + log.info("STEP 4: Click on the filter's id ('filter1')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); assertEquals(createNewFilterPopup.getFilterNameValue(), filterName, "Filter Name: " + filterName); assertTrue(createNewFilterPopup.isShowWithSearchResultsChecked(), "Show with Search Results: Yes"); assertEquals(createNewFilterPopup.getSortBy(), "A-Z", "Sort By: A-Z"); - assertEquals(createNewFilterPopup.getNoFilters(), "10", "Number of Filters: 10"); - assertEquals(createNewFilterPopup.getMinimumFilterLength(), "1", "Minimum Filter Length: 1"); - assertEquals(createNewFilterPopup.getMinimumRequiredResults(), "1", "Minimum Required Results: 1"); + assertEquals(createNewFilterPopup.getNumberOfFilters(), "10", "Number of Filters: 10"); + assertEquals(createNewFilterPopup.getMiniFilterLength(), "1", "Minimum Filter Length: 1"); + assertEquals(createNewFilterPopup.getMiniRequiredResults(), "1", "Minimum Required Results: 1"); assertEquals(createNewFilterPopup.getFilterAvailability(), "Everywhere", "Filter Availability: Everywhere"); } @@ -627,32 +776,32 @@ public void switchOnOffShowWithSearchResults() searchManagerPage.navigate(); - LOG.info("STEP 1: Click on any filter ID for a default filter (e.g.: 'filter_creator')."); + log.info("STEP 1: Click on any filter ID for a default filter (e.g.: 'filter_creator')."); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); - LOG.info("STEP 2: Uncheck 'Show with Search Results' check box."); - createNewFilterPopup.clickShowWithSearchResults(); + log.info("STEP 2: Uncheck 'Show with Search Results' check box."); - LOG.info("STEP 3: Click 'Save' button."); + log.info("STEP 3: Click 'Save' button."); + createNewFilterPopup.deselectShowWithSearchResults(); createNewFilterPopup.clickSave(); - LOG.info("STEP 4: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); + log.info("STEP 4: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); toolbar.search(documentName); assertFalse(searchPage.isFilterTypePresent(filterName), "The 'Creator' filter is not displayed on 'Filter by:' section."); - LOG.info("STEP 5: Open again 'Search Manager' page and click on the filter ID ('filter_creator')."); + log.info("STEP 5: Open again 'Search Manager' page and click on the filter ID ('filter_creator')."); searchManagerPage.navigate(); searchManagerPage.clickFilterId(filterId); assertTrue(createNewFilterPopup.getDialogTitle().equals(filterId), "The dialog box for editing the filter is opened."); - LOG.info("STEP 6: Check 'Show with Search Results' check box."); + log.info("STEP 6: Check 'Show with Search Results' check box."); createNewFilterPopup.clickShowWithSearchResults(); - LOG.info("STEP 7: Click 'Save' button."); + log.info("STEP 7: Click 'Save' button."); createNewFilterPopup.clickSave(); - LOG.info("STEP 8: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); + log.info("STEP 8: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); toolbar.search(documentName); assertTrue(searchPage.isFilterTypePresent(filterName), "The 'Creator' filter is displayed on 'Filter by:' section."); } @@ -667,14 +816,14 @@ public void modifySearchFilterName() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); + log.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); searchManagerPage.createNewFilter(); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterName), "The new filter is displayed on 'Search Manager' page."); - LOG.info("STEP 2: Hover over the 'Filter Name' for the '" + filterName + "' filter. Click on 'Edit' icon and modify the filter name to '" + log.info("STEP 2: Hover over the 'Filter Name' for the '" + filterName + "' filter. Click on 'Edit' icon and modify the filter name to '" + newFilterName + "'. Click 'Save' button."); searchManagerPage.editFilterName(filterName, newFilterName); assertTrue(searchManagerPage.isFilterAvailable(newFilterName), "The new filter is displayed on 'Search Manager' page."); @@ -690,14 +839,14 @@ public void cancelModifyingSearchFilterName() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); + log.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); searchManagerPage.createNewFilter(); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterName), "The new filter is displayed on 'Search Manager' page."); - LOG.info("STEP 2: Hover over the 'Filter Name' for the '" + filterName + "' filter. Click on 'Edit' icon and modify the filter name to '" + log.info("STEP 2: Hover over the 'Filter Name' for the '" + filterName + "' filter. Click on 'Edit' icon and modify the filter name to '" + newFilterName + "'. Click 'Save' button."); searchManagerPage.cancelEditFilterName(filterName, newFilterName); assertFalse(searchManagerPage.isFilterAvailable(newFilterName), "The new filter is displayed on 'Search Manager' page."); @@ -713,25 +862,24 @@ public void deleteSearchFilter() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); + log.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); searchManagerPage.createNewFilter(); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterName), "The new filter is displayed on 'Search Manager' page."); - LOG.info("STEP 2: Try to delete any default filter available on 'Search Manager' page"); + log.info("STEP 2: Try to delete any default filter available on 'Search Manager' page"); assertFalse(searchManagerPage.isFilterDeletable(defaultFilter), "There is no 'Delete' button present for the filter, as default filters can't be deleted."); - LOG.info("STEP 3: Click on 'Delete' button for the custom filter created."); + log.info("STEP 3: Click on 'Delete' button for the custom filter created."); searchManagerPage.clickDeleteFilter(filterId); assertEquals(confirmDeletionDialog.getDialogTitle(), language.translate("confirmDeletion.title"), "Popup is displayed."); assertEquals(confirmDeletionDialog.getDialogMessage(), String.format(language.translate("confirmDeletion.message"), filterId), "Popup message is displayed."); - LOG.info("STEP 4: Click 'Yes' button."); + log.info("STEP 4: Click 'Yes' button."); confirmDeletionDialog.clickOKButton(); - getBrowser().waitInSeconds(5); assertFalse(searchManagerPage.isFilterAvailable(filterId), "Filter is no longer listed on 'Search Manager' page."); } @@ -744,30 +892,30 @@ public void cancelDeletingSearchFilter() searchManagerPage.navigate(); - LOG.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); + log.info("STEP 1: Click 'Create New Filter' button and create any custom filter with '" + filterName + "' name."); searchManagerPage.createNewFilter(); createNewFilterPopup.typeFilterId(filterId); createNewFilterPopup.typeFilterName(filterName); createNewFilterPopup.clickSave(); assertTrue(searchManagerPage.isFilterAvailable(filterName), "The new filter is displayed on 'Search Manager' page."); - LOG.info("STEP 2: Click on 'Delete' button for the custom filter created."); + log.info("STEP 2: Click on 'Delete' button for the custom filter created."); searchManagerPage.clickDeleteFilter(filterId); assertEquals(confirmDeletionDialog.getDialogTitle(), language.translate("confirmDeletion.title"), "Popup is displayed."); assertEquals(confirmDeletionDialog.getDialogMessage(), String.format(language.translate("confirmDeletion.message"), filterId), "Popup message is displayed."); - LOG.info("STEP 3: Click 'No' button."); + log.info("STEP 3: Click 'No' button."); confirmDeletionDialog.clickNoButton(); assertTrue(searchManagerPage.isFilterAvailable(filterId), "Filter is still listed on 'Search Manager' page."); - LOG.info("STEP 4: Click on 'Delete' button for the custom filter created."); + log.info("STEP 4: Click on 'Delete' button for the custom filter created."); searchManagerPage.clickDeleteFilter(filterId); assertEquals(confirmDeletionDialog.getDialogTitle(), language.translate("confirmDeletion.title"), "Popup is displayed."); assertEquals(confirmDeletionDialog.getDialogMessage(), String.format(language.translate("confirmDeletion.message"), filterId), "Popup message is displayed."); - LOG.info("STEP 5: Click 'Close' button."); + log.info("STEP 5: Click 'Close' button."); confirmDeletionDialog.clickCloseButton(); assertTrue(searchManagerPage.isFilterAvailable(filterId), "Filter is still listed on 'Search Manager' page."); } @@ -784,14 +932,14 @@ public void changeSearchFiltersOrder() searchManagerPage.navigate(); - LOG.info("STEP 1: Hover over 'Move-Up' icon for any existing filter."); + log.info("STEP 1: Hover over 'Move-Up' icon for any existing filter."); assertEquals(searchManagerPage.getUpTooltipForFilter(filterId), String.format(language.translate("searchManager.reorder.up"), filterId), "Up tooltip"); - LOG.info("STEP 2: Hover over 'Move-Down' icon for any existing filter."); + log.info("STEP 2: Hover over 'Move-Down' icon for any existing filter."); assertEquals(searchManagerPage.getDownTooltipForFilter(filterId), String.format(language.translate("searchManager.reorder.down"), filterId), "Down tooltip"); - LOG.info("STEP 3: Move up 'filter_modifier' and move down 'filter_created'"); + log.info("STEP 3: Move up 'filter_modifier' and move down 'filter_created'"); int filterIdPosition = searchManagerPage.getFilterPosition(filterId); int filterId2Position = searchManagerPage.getFilterPosition(filterId2); if (filterIdPosition < filterId2Position) @@ -820,59 +968,49 @@ public void changeSearchFiltersOrder() assertEquals(searchManagerPage.getFilterPosition(filterId), filterIdPosition, "Filter " + filterId + " should be on a different row!"); assertEquals(searchManagerPage.getFilterPosition(filterId2), filterId2Position, "Filter " + filterId2 + " should be on a different row!"); - LOG.info("STEP 4: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); + log.info("STEP 4: Type '" + documentName + "' on the search box from 'Alfresco Toolbar' and press 'Enter' key."); toolbar.search(documentName); if (result) { assertTrue(searchPage.getFilterTypePosition(filterName) < searchPage.getFilterTypePosition(filterName2), "The 'Created' filter should be on top of the 'Modifier' filter."); } else { - assertTrue(searchPage.getFilterTypePosition(filterName) > searchPage.getFilterTypePosition(filterName2), "The 'Modifier' filter should be on top of the 'Created' filter."); + assertFalse(searchPage.getFilterTypePosition(filterName) > searchPage.getFilterTypePosition(filterName2), "The 'Modifier' filter should be on top of the 'Created' filter."); } } @TestRail (id = "C6313") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) - public void verifySitesSection() - { - searchManagerPage.navigate(); + public void verifySitesSection(){ - LOG.info("STEP 1: Click 'Create New Filter' button."); + searchManagerPage.navigate(); + log.info("STEP 1: Click 'Create New Filter' button."); searchManagerPage.createNewFilter(); - LOG.info("STEP 2: Go to 'Filter Availability' field and select 'Selected sites' option from the drop-down."); - createNewFilterPopup.selectFromFilterAvailability("Selected sites"); - LOG.info( - "STEPS 3-5: Click 'Add a new entry' button from 'Sites' section and select 'site1' from the drop-down list with available sites. Click 'Save the current entry' icon for 'site1'."); - createNewFilterPopup.addSite(site1); - assertEquals(createNewFilterPopup.getCurrentSelectedSites()[0], site1, "'site1' is successfully added to 'Sites' section. "); + log.info("STEP 2: Go to 'Filter Availability' field and select 'Selected sites' option from the drop-down."); + createNewFilterPopup.selectInFilterAvailability("Selected sites"); - LOG.info( - "STEPS 6-7: Click on 'Edit the current entry' icon () for 'site1' and choose another site from the drop-down list (e.g.: 'site2'). Click 'Save the current entry' icon for 'site1'."); - createNewFilterPopup.editSite(site1, site2); - assertEquals(createNewFilterPopup.getCurrentSelectedSites()[0], site2, "'site2' is successfully added to 'Sites' section (instead of 'site1')."); + log.info("STEPS 3-5: Click 'Add a new entry' button from 'Sites' section and select 'site1' from the drop-down list with available sites. Click 'Save the current entry' icon for 'site1'."); + createNewFilterPopup.addSite(testSite1.getTitle()); + assertEquals(createNewFilterPopup.getCurrentSelectedSites()[0], testSite1.getTitle(), "'site1' is successfully added to 'Sites' section. "); - LOG.info( - "STEPS 8-9: Click on 'Edit the current entry' icon () for 'site2' and choose another site from the drop-down list (e.g.: 'site3'). Click 'Cancel editing the current entry' icon"); - createNewFilterPopup.cancelEditSite(site2, site3); - assertEquals(createNewFilterPopup.getCurrentSelectedSites()[0], site2, "'site2' is successfully added to 'Sites' section (instead of 'site1')."); + log.info("STEPS 6-7: Click on 'Edit the current entry' icon () for 'site1' and choose another site from the drop-down list (e.g.: 'site2'). Click 'Save the current entry' icon for 'site1'."); + createNewFilterPopup.clickEditIcon(); + createNewFilterPopup.editSiteName( testSite2.getTitle()); + assertEquals(createNewFilterPopup.getSelectedSiteDetail(), testSite2.getTitle(), "'site2' is successfully added to 'Sites' section (instead of 'site1')."); - LOG.info("STEP 10: Click 'Delete the current entry' icon () for 'site2'"); - createNewFilterPopup.deleteSite(site2); + log.info("STEPS 8-9: Click on 'Edit the current entry' icon () for 'site2' and choose another site from the drop-down list (e.g.: 'site3'). Click 'Cancel editing the current entry' icon"); + createNewFilterPopup.cancelEditSiteName(testSite3.getTitle()); + assertEquals(createNewFilterPopup.getSelectedSiteDetail(), testSite2.getTitle(), "'site2' is successfully added to 'Sites' section (instead of 'site3')."); + + log.info("STEP 10: Click 'Delete the current entry' icon () for 'site2'"); + createNewFilterPopup.deleteSite(testSite2.getTitle()); assertEquals(createNewFilterPopup.getCurrentSelectedSites().length, 0, "'site2' is removed from 'Sites' section."); - LOG.info( - "STEPS 11-12: Click 'Add a new entry' button from 'Sites' section and select 'site3' from the drop-down list with available sites. Click 'Cancel editing the current entry' icon"); - createNewFilterPopup.cancelAddSite(site3); + log.info("STEPS 11-12: Click 'Add a new entry' button from 'Sites' section and select 'site3' from the drop-down list with available sites. Click 'Cancel editing the current entry' icon"); + createNewFilterPopup.cancelAddSiteName(testSite3.getTitle()); assertEquals(createNewFilterPopup.getCurrentSelectedSites().length, 0, "'site3' is not added to 'Sites' section."); } - - @AfterClass (alwaysRun = true) - public void deleteFilters() - { - searchManagerPage.navigate(); - } - } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SiteFinderTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SiteFinderTests.java index 9ae69b6a4a..bcb8c0b00d 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SiteFinderTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/SiteFinderTests.java @@ -1,57 +1,89 @@ package org.alfresco.share.searching; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.SiteFinderPage; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.searching.SearchPage; +import org.alfresco.po.share.site.DocumentLibraryPage; +import org.alfresco.po.share.site.SiteDashboardPage; +import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.EditUserPage; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.UserProfileAdminToolsPage; +import org.alfresco.po.share.user.profile.UserProfilePage; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - import static org.testng.Assert.*; +@Slf4j /** * @author Laura.Capsa */ -public class SiteFinderTests extends ContextAwareWebTest +public class SiteFinderTests extends BaseTest { //@Autowired SiteFinderPage siteFinderPage; //@Autowired UserDashboardPage userDashboardPage; + Toolbar toolbar; + UserProfileAdminToolsPage userProfileAdminToolsPage; + SearchPage searchPage; + UserProfilePage userProfilePage; + DocumentDetailsPage documentDetailsPage; + CreateContentPage createContent; + SiteDashboardPage siteDashboardPage; + EditUserPage editUserPage; + DocumentLibraryPage documentLibraryPage; + private UserModel testUser1; + private UserModel testUser2; + + private SiteModel testSite1; + private SiteModel testSite2; + + - String user1 = String.format("profileUser1-%s", RandomData.getRandomAlphanumeric()); - String user2 = String.format("profileUser2-%s", RandomData.getRandomAlphanumeric()); String userFirstName = "firstName"; + String userLastName = "lastName"; String user2LastName = "lastName2"; - String siteName1 = String.format("SiteName1-%s", RandomData.getRandomAlphanumeric()); - String siteName2 = String.format("SiteName2-%s", RandomData.getRandomAlphanumeric()); + + String userName = "test user"; + String description = String.format("Description-%s", RandomData.getRandomAlphanumeric()); - @BeforeClass (alwaysRun = true) + @BeforeMethod (alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user1, password, user1 + domain, userFirstName, "lastName1"); - siteService.create(user1, password, domain, siteName1, description, SiteService.Visibility.MODERATED); - siteService.create(user1, password, domain, siteName2, description, SiteService.Visibility.PRIVATE); - userService.create(adminUser, adminPassword, user2, password, user2 + domain, userFirstName, user2LastName); - setupAuthenticatedSession(user1, password); + editUserPage = new EditUserPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + userProfilePage = new UserProfilePage(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + createContent = new CreateContentPage(webDriver); + siteFinderPage = new SiteFinderPage(webDriver); + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); + userProfileAdminToolsPage = new UserProfileAdminToolsPage(webDriver); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); } - @AfterClass - public void removeAddedFiles() + @AfterMethod + public void testCleanup() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); - userService.delete(adminUser, adminPassword, user2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2); - siteService.delete(adminUser, adminPassword, siteName1); - siteService.delete(adminUser, adminPassword, siteName2); - + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + deleteSitesIfNotNull(testSite1); + deleteSitesIfNotNull(testSite2); } @@ -59,91 +91,125 @@ public void removeAddedFiles() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void siteFinderPage() { + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser1 = testUser1; + editUserPage.navigate(editUser1) + .editFirstName(userFirstName) + .editLastNameField(userLastName) + .clickSaveChanges(); + log.info("Edit user data & give specific name to " + testUser2); + UserModel editUser2 = testUser2; + editUserPage.navigate(editUser2) + .editFirstName(userFirstName) + .editLastNameField(user2LastName) + .clickSaveChanges(); + testSite1 = dataSite.usingUser(testUser1).createModeratedRandomSite(); + testSite2 = dataSite.usingUser(testUser1).createPrivateRandomSite(); + log.info("Edit site data & give specific name to " + testSite1); + authenticateUsingLoginPage(testUser1); + SiteModel editSite1 = testSite1; + siteDashboardPage.navigateToEditSiteDetailsDialog(editSite1.getId()); + siteDashboardPage.editSiteDescription(description); + documentLibraryPage.navigateToDocumentLibraryPage(); + authenticateUsingLoginPage(testUser1); + SiteModel editSite2 = testSite2; + siteDashboardPage.navigateToEditSiteDetailsDialog(editSite2.getId()); + siteDashboardPage.editSiteDescription(description); + authenticateUsingLoginPage(testUser1); siteFinderPage.navigate(); - - LOG.info("STEP1: Verify page title"); -// assertEquals(siteFinderPage.getPageTitle(), "Alfresco » Site Finder", "Page title"); - - LOG.info("STEP2: Verify search section"); + log.info("STEP1: Verify page title"); + assertEquals(siteFinderPage.getPageTitle(), "Alfresco » Site Finder", "Page title"); + log.info("STEP2: Verify search section"); assertTrue(siteFinderPage.isSearchFieldDisplayed(), "Search input field is displayed"); assertTrue(siteFinderPage.isSearchButtonDisplayed(), "Search button is displayed"); assertEquals(siteFinderPage.getSearchMessage(), language.translate("siteFinder.helpMessage"), "Help message"); - LOG.info("STEP3: Fill in search field and click \"Search\" button"); - siteFinderPage.searchSiteWithName(siteName1); + log.info("STEP3: Fill in search field and click \"Search\" button"); + siteFinderPage.searchSiteWithName(testSite1.getTitle()); assertTrue(siteFinderPage.isSearchResultsListDisplayed(), "Search results list contains list of sites"); assertTrue(siteFinderPage.isSiteNameListDisplayed(), "Search results list contains site title"); assertTrue(siteFinderPage.isSiteDescriptionListDisplayed(), "Search results list contains site description"); assertTrue(siteFinderPage.isSiteVisibilityListDisplayed(), "Search results list contains site visibility"); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteName1, "Leave"), "Leave button displayed for site " + siteName1); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteName1, "Delete"), "Delete button displayed for site " + siteName1); + assertTrue(siteFinderPage.isButtonDisplayedForSite(testSite1.getTitle(), "Leave"), "Leave button displayed for site " + testSite1.getTitle()); + assertTrue(siteFinderPage.isButtonDisplayedForSite(testSite1.getTitle(), "Delete"), "Delete button displayed for site " + testSite1.getTitle()); - LOG.info("STEP4: Click a site link from the search results"); - siteFinderPage.accessSite(siteName1); -// assertEquals(siteFinderPage.getPageTitle(), "Alfresco » Site Dashboard", "User is redirected to " + siteName1 + " site dashboard page "); + log.info("STEP4: Click a site link from the search results"); + siteFinderPage.accessSite(testSite1.getTitle()); + assertEquals(siteFinderPage.getPageTitle(), "Alfresco » Site Dashboard", "User is redirected to " + testSite1.getTitle() + " site dashboard page "); } @TestRail (id = "C7574") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void usernameWithSpaceCanAccessSiteFinder() { - LOG.info("STEP1: Click \"Sites\" -> \"Site Finder\" link from the toolbar"); + testUser1 = dataUser.usingAdmin().usingUserHome(userName).createRandomTestUser(); + log.info("Edit user data & give specific name to " + testUser1); + authenticateUsingLoginPage(testUser1); + log.info("STEP1: Click \"Sites\" -> \"Site Finder\" link from the toolbar"); toolbar.clickSites().clickSiteFinder(); -// assertEquals(siteFinderPage.getPageTitle(), "Alfresco » Site Finder", "Site Finder page is displayed"); + assertEquals(siteFinderPage.getPageTitle(), "Alfresco » Site Finder", "Site Finder page is displayed"); } @TestRail (id = "C5814") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) - public void fullOrPartialSitename() + public void fullOrPartialSiteName() { + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testSite1 = dataSite.usingUser(testUser1).createModeratedRandomSite(); + authenticateUsingLoginPage(testUser1); siteFinderPage.navigate(); - LOG.info("STEP1: Enter the partial site name in the search field and click the search button"); - siteFinderPage.searchSiteWithName(siteName1.substring(0, 17)); -// assertTrue(siteFinderPage.checkSiteWasFound(siteName1), "Site " + siteName1 + " is displayed in search result section"); + log.info("STEP1: Enter the partial site name in the search field and click the search button"); + siteFinderPage.searchSiteName(testSite1.getTitle().substring(0, 17)); + assertTrue(siteFinderPage.checkSiteWasFound(testSite1.getTitle()), "Site " + testSite1.getTitle() + " is displayed in search result section"); - LOG.info("STEP2: Enter the full site name in the search field and click the search button"); - siteFinderPage.searchSiteWithName(siteName1); -// assertTrue(siteFinderPage.checkSiteWasFound(siteName1), "Site " + siteName1 + " is displayed in search result section"); + log.info("STEP2: Enter the full site name in the search field and click the search button"); + siteFinderPage.searchSiteName(testSite1.getTitle()); + assertTrue(siteFinderPage.checkSiteWasFound(testSite1.getTitle()), "Site " + testSite1.getTitle() + " is displayed in search result section"); } @TestRail (id = "C7169") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void moderatedSiteLabel() { + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testSite1 = dataSite.usingUser(testUser1).createModeratedRandomSite(); + authenticateUsingLoginPage(testUser1); siteFinderPage.navigate(); - LOG.info("STEP1: Enter the moderated site's name into the search field and click the search button"); - siteFinderPage.searchSiteWithName(siteName1); -// assertTrue(siteFinderPage.checkSiteWasFound(siteName1), "Site " + siteName1 + "is displayed in search result section"); - assertEquals(siteFinderPage.getVisibilityLabel(), "Moderated", " \"Moderated\" label is displayed below " + siteName1 + " site"); + log.info("STEP1: Enter the moderated site's name into the search field and click the search button"); + siteFinderPage.searchSiteName(testSite1.getTitle()); + assertTrue(siteFinderPage.checkSiteWasFound(testSite1.getTitle()), "Site " + testSite1.getTitle() + "is displayed in search result section"); + assertEquals(siteFinderPage.getVisibilityLabel(), "Moderated", " \"Moderated\" label is displayed below " + testSite1.getTitle() + " site"); } @TestRail (id = "C7195") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void privateSiteLabel() { + testUser1 = dataUser.usingAdmin().createRandomTestUser(); + testUser2 = dataUser.usingAdmin().createRandomTestUser(); + testSite2 = dataSite.usingUser(testUser1).createPrivateRandomSite(); + authenticateUsingLoginPage(testUser1); siteFinderPage.navigate(); - LOG.info("STEP1: Enter the private site's name into the search field and click the search button"); - siteFinderPage.searchSiteWithName(siteName2); -// assertTrue(siteFinderPage.checkSiteWasFound(siteName2), "Site " + siteName2 + "is displayed in search result section"); - assertEquals(siteFinderPage.getVisibilityLabel(), "Private", " \"Private\" label is displayed below " + siteName2 + " site"); - - LOG.info("STEP2: Logout and log in as user2"); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); -// assertEquals(userDashboardPage.assertPageHeadersEqualsTo(), userFirstName + " " + user2LastName + " Dashboard", user2 + "'s user dashboard is displayed"); + log.info("STEP1: Enter the private site's name into the search field and click the search button"); + siteFinderPage.searchSiteName(testSite2.getTitle()); + assertTrue(siteFinderPage.checkSiteWasFound(testSite2.getTitle()), "Site " + testSite2.getTitle() + "is displayed in search result section"); + assertEquals(siteFinderPage.getVisibilityLabel(), "Private", " \"Private\" label is displayed below " + testSite2.getTitle() + " site"); - LOG.info("STEP3: Open \"Site Finder\" page"); + log.info("STEP2: Logout and log in as user2"); + authenticateUsingLoginPage(testUser2); + log.info("STEP3: Open \"Site Finder\" page"); siteFinderPage.navigate(); - LOG.info("STEP1: Enter the private site's name into the search field and click the search button"); -// siteFinderPage.searchSite(siteName2); + log.info("STEP1: Enter the private site's name into the search field and click the search button"); + siteFinderPage.searchSiteName(testSite2.getTitle()); assertEquals(siteFinderPage.getSearchMessage(), language.translate("siteFinder.noResults"), "Displayed message:"); -// assertFalse(siteFinderPage.checkSiteWasFound(siteName2), "No results displayed in search result section"); + assertFalse(siteFinderPage.checkSiteWasFound(testSite2.getTitle()), "No results displayed in search result section"); + authenticateUsingLoginPage(testUser1); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user1, password); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchOperatorsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchOperatorsTests.java index 4f71803890..6d1882141b 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchOperatorsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchOperatorsTests.java @@ -1,157 +1,229 @@ package org.alfresco.share.searching.advancedSearch; import static org.testng.Assert.assertTrue; - -import java.util.HashMap; -import java.util.Map; - -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; -import org.alfresco.po.share.dashlet.MyDocumentsDashlet; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.searching.SearchPage; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.toolbar.Toolbar; -import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.apache.chemistry.opencmis.client.api.Session; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j + /** * Created by Claudia Agache on 8/29/2016. */ -public class AdvancedSearchOperatorsTests extends ContextAwareWebTest +public class AdvancedSearchOperatorsTests extends BaseTest { - //@Autowired - Toolbar toolbar; - @Autowired - MyDocumentsDashlet myDocumentsDashlet; - - //@Autowired + Toolbar toolbar; + private DocumentLibraryPage documentLibraryPage; + private CreateContentPage createContent; SearchPage searchPage; - - //@Autowired - UserDashboardPage userDashboardPage; - - private String user1 = String.format("user1%s", RandomData.getRandomAlphanumeric()); - private String site1 = String.format("Site1%s", RandomData.getRandomAlphanumeric()); - private String docC7210 = site1 + "docC7210"; + private String testSite; + private final ThreadLocal user = new ThreadLocal<>(); + String identifier = RandomData.getRandomAlphanumeric(); private String docC7210_content = "C7210 C7210 C7210"; - private String docC5991 = "11123"; + private String docC7212 = "file " + identifier; + private String docC5991 = "11123 " + identifier; private String docC7407 = "this is an item"; - private String specificWord = site1 + "docC7288"; - private String docC7288_2 = site1 + "Doc2"; - private String docC7288_3 = site1 + "Doc3"; - private String docC7288_4 = site1 + "Doc4"; + private String docC7110 = "sample " + identifier; + private String docC7110_1 = "sample1 " + identifier; + private String docC7110_2 = "sample2 " + identifier; + private String docC7110_3 = "sample3 " + identifier; + private final ThreadLocal site = new ThreadLocal<>(); + - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user1, password, user1 + domain, user1, user1); - siteService.create(user1, password, domain, site1, site1 + " description", SiteService.Visibility.PUBLIC); - - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, docC7210, docC7210_content); - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, specificWord, "Create file with specific name"); - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, docC7288_2, "Create file with specific title"); - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, docC7288_3, "Create file with specific description"); - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, docC7288_4, specificWord); - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, docC5991, "wildcards"); - contentService.createDocument(user1, password, site1, CMISUtil.DocumentType.TEXT_PLAIN, docC7407, "Explicit spans/positions"); - - //add specific title for docC7288_2 file - Session session = contentAction.getCMISSession(user1, password); - String contentNodeRef = contentAction.getNodeRef(session, site1, docC7288_2); - Map propertiesMap = new HashMap<>(); - propertiesMap.put("cm:title", specificWord); - contentAction.addProperties(session, contentNodeRef, propertiesMap); - - //add specific description for docC7288_3 - propertiesMap.remove("cm:title", specificWord); - contentNodeRef = contentAction.getNodeRef(session, site1, docC7288_3); - propertiesMap.put("cm:description", specificWord); - contentAction.addProperties(session, contentNodeRef, propertiesMap); - - setupAuthenticatedSession(user1, password); + log.info("Precondition1: Any test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + + authenticateUsingLoginPage(user.get()); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + testSite = site.get().getTitle(); + createContent = new CreateContentPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); } - @AfterClass - public void removeAddedFiles() + @AfterMethod + public void cleanup() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); - siteService.delete(adminUser, adminPassword, site1); - + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); } @TestRail (id = "C7210") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + @Test(groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void recurringPhrases() { - userDashboardPage.navigate(user1); - - LOG.info("STEP 1: Search with: \"file_name\"^number_of_repetitions (e.g: \"C7210\"^3)"); - toolbar.search("\"C7210\"^3"); - assertTrue(searchPage.isResultFound(docC7210), "Searched content is found and displayed in search results list"); + log.info("STEP 1: Search with: \"file_name\"^number_of_repetitions (e.g: \"C7210\"^3)"); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC7212) + .typeContent(docC7210_content) + .clickCreate(); + documentLibraryPage + .navigate(); + toolbar + .SearchAndEnter(docC7210_content); + assertTrue(searchPage.isResultFound(docC7212), "Searched content is found and displayed in search results list"); } @TestRail (id = "C7288") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) - public void extendedSearch() - { - userDashboardPage.navigate(user1); - LOG.info("STEP 1: Search for " + specificWord); - toolbar.search(specificWord); - assertTrue(searchPage.isResultFound(specificWord), "The file with name containing the searched query is displayed in search result list"); - assertTrue(searchPage.isResultFound(docC7288_2), "The file with title containing the searched query is displayed in search result list"); - assertTrue(searchPage.isResultFound(docC7288_3), "The file with description containing the searched query is displayed in search result list"); - assertTrue(searchPage.isResultFound(docC7288_4), "The file with content containing the searched query is displayed in search result list"); + public void extendedSearch() { + log.info("STEP 1: A file with name file is created"); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC7212) + .typeContent(docC7110) + .clickCreate(); + documentLibraryPage + .navigate(); + log.info("STEP 2: A file with content name 'file' is created"); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC7110_1) + .typeContent(docC7212) + .clickCreate(); + documentLibraryPage + .navigate(); + log.info("STEP 3: A file with title name 'file' is created"); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC7110_2) + .typeTitle(docC7212) + .clickCreate(); + documentLibraryPage + .navigate(); + log.info("STEP 4: A file with Description 'file' is created"); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC7110_3) + .typeDescription(docC7212) + .clickCreate(); + documentLibraryPage + .navigate(); + log.info("STEP 1: Search for \"file\""); + toolbar + .SearchAndEnter("file"); + assertTrue(searchPage.isResultFound(docC7212),"The file with name containing the searched query is displayed in search result list"); + assertTrue(searchPage.isResultFound(docC7110_2),"The file with title containing the searched query is displayed in search result list"); + assertTrue(searchPage.isResultFound(docC7110_1),"The file with content containing the searched query is displayed in search result list"); + assertTrue(searchPage.isResultFound(docC7110_3),"The file with description containing the searched query is displayed in search result list"); + } @TestRail (id = "C5991") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) public void wildcards() { - userDashboardPage.navigate(user1); - LOG.info("STEP 1: Search with '*' wildcard, e.g: *23"); - toolbar.search("*23"); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC5991) + .typeContent(docC5991) + .clickCreate(); + documentLibraryPage + .navigate(); + log.info("STEP 1: Search with '*' wildcard, e.g: *23"); + toolbar + .SearchAndEnter("*23"); assertTrue(searchPage.isResultFound(docC5991), "'*' wildcard replaces zero, one or more characters in the searched query"); - LOG.info("STEP 2: Search with '*' wildcard and quotes, e.g: \"**23\""); - toolbar.search("\"**23\""); + log.info("STEP 2: Search with '*' wildcard and quotes, e.g: \"**23\""); + toolbar + .SearchAndEnter("\"**23\""); assertTrue(searchPage.isResultFound(docC5991), "Searched content is displayed in results list"); - LOG.info("STEP 3: Search with one '?' wildcard, e.g: 11?23"); - toolbar.search("11?23"); + log.info("STEP 3: Search with one '?' wildcard, e.g: 11?23"); + toolbar + .SearchAndEnter("11?23"); assertTrue(searchPage.isResultFound(docC5991), "'?' wildcard replaces a single character in the searched query"); - LOG.info("STEP 4: Search with multiple '?' wildcard, e.g: 1???3"); - toolbar.search("1???3"); + log.info("STEP 4: Search with multiple '?' wildcard, e.g: 1???3"); + toolbar + .SearchAndEnter("1???3"); assertTrue(searchPage.isResultFound(docC5991), "Each '?' wildcard replaces a character in the searched query"); - - LOG.info("STEP 5: Search by a query beginning with '='"); - toolbar.search("=" + specificWord); - assertTrue(searchPage.isResultFound(specificWord), "The file with name containing the searched query is displayed in search result list"); - assertTrue(searchPage.isResultFound(docC7288_2), "The file with title containing the searched query is displayed in search result list"); - assertTrue(searchPage.isResultFound(docC7288_3), "The file with description containing the searched query is displayed in search result list"); - assertTrue(searchPage.isResultFound(docC7288_4), "The file with content containing the searched query is displayed in search result list"); - - LOG.info("STEP 6: Search by query in quotes, e.g: \"11123\""); - toolbar.search("\"11123\""); + log.info("STEP 5: Search by a query beginning with '='"); + toolbar + .SearchAndEnter("\"=11123\""); + assertTrue(searchPage.isResultFound(docC5991), "The file with name containing the searched query is displayed in search result list"); + log.info("STEP 6: Search by query in quotes, e.g: \"11123\""); + toolbar + .SearchAndEnter("\"11123\""); assertTrue(searchPage.isResultFound(docC5991), "Content corresponding to the exact phrase in quotes, e.g.:\"11123\", is displayed in search results list"); + } @TestRail (id = "C7407") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void explicitSpansPositions() { - userDashboardPage.navigate(user1); - LOG.info("STEP 1: Fill in search field with any query containing span and position symbol, e.g: this[^] item[$] , and press 'Enter'"); - toolbar.search("\"this[^] item[$]\""); + documentLibraryPage + .navigate(testSite); + documentLibraryPage + .clickCreateButton(); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docC7407) + .typeContent(docC7407) + .clickCreate(); + documentLibraryPage + .navigate(); + log.info("STEP 1: Fill in search field with any query containing span and position symbol, e.g: this[^] item[$] , and press 'Enter'"); + toolbar.SearchAndEnter("\"this[^] item[$]\""); assertTrue(searchPage.isResultFound(docC7407), "Item starting with word before [^] and ending by the word before [$] is displayed in result list, e.g: \"this is an item\""); + } } + + + + + + + diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchPageTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchPageTest.java index 55a530a02e..c15cdf316a 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchPageTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchPageTest.java @@ -3,27 +3,59 @@ import java.util.ArrayList; import java.util.List; +import lombok.extern.slf4j.Slf4j; import org.alfresco.dataprep.DashboardCustomization.Page; import org.alfresco.dataprep.DataListsService; +import org.alfresco.dataprep.SitePagesService; import org.alfresco.dataprep.SiteService; import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.searching.SearchPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.report.Bug; import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j -public class AdvancedSearchPageTest extends ContextAwareWebTest +public class AdvancedSearchPageTest extends BaseTest { //@Autowired AdvancedSearchPage advancedSearchPage; + @Autowired + private SiteService siteService; + @Autowired + DataListsService dataList; + @Autowired + private SitePagesService sitePagesService; //@Autowired SearchPage searchPage; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal siteModel = new ThreadLocal<>(); + private final String password = "password"; + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + searchPage = new SearchPage(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + } + @AfterMethod(alwaysRun = true) + public void cleanup() + { + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(siteModel.get()); + } private void createPreconditions(String userName, String siteName, String identifier) { @@ -37,285 +69,338 @@ private void createPreconditions(String userName, String siteName, String identi sitePages.add(Page.DISCUSSIONS); sitePages.add(Page.LINKS); sitePages.add(Page.DATALISTS); - siteService.addPagesToSite(userName, password, siteName, sitePages); - sitePagesService.createWiki(userName, password, siteName, "test" + identifier + " wiki 1", "test" + identifier, null); - sitePagesService.createWiki(userName, password, siteName, "test" + identifier + " wiki 2", "hello" + identifier, null); - sitePagesService.createWiki(userName, password, siteName, identifier + " wiki 3", "test" + identifier, null); - sitePagesService.createWiki(userName, password, siteName, identifier + " wiki 4", "hello" + identifier, null); - - sitePagesService.createBlogPost(userName, password, siteName, "test" + identifier + " blog 1", "test" + identifier, false, null); - sitePagesService.createBlogPost(userName, password, siteName, "test" + identifier + " blog 2", "hello" + identifier, false, null); - sitePagesService.createBlogPost(userName, password, siteName, identifier + " blog 3", "test" + identifier, false, null); - sitePagesService.createBlogPost(userName, password, siteName, identifier + " blog 4", "hello" + identifier, false, null); - - sitePagesService.addCalendarEvent(userName, password, siteName, "test" + identifier + " event 1", "", "test" + identifier, today.toDate(), + sitePagesService.createWiki(userName, password, siteName, "test" + identifier + " wiki 1", + "test " + identifier, null); + sitePagesService.createWiki(userName, password, siteName, "test" + identifier + " wiki 2", + "hello " + identifier, null); + sitePagesService.createWiki(userName, password, siteName, identifier + " wiki 3", + "test " + identifier, null); + sitePagesService.createWiki(userName, password, siteName, identifier + " wiki 4", + "hello " + identifier, null); + + sitePagesService.createBlogPost(userName, password, siteName, "test" + identifier + " blog 1", + "test " + identifier, false, null); + sitePagesService.createBlogPost(userName, password, siteName, "test" + identifier + " blog 2", + "test hello " + identifier, false, null); + sitePagesService.createBlogPost(userName, password, siteName, identifier + " blog 3", + "test " + identifier, false, null); + sitePagesService.createBlogPost(userName, password, siteName, identifier + " blog 4", + "hello " + identifier, false, null); + + sitePagesService.addCalendarEvent(userName, password, siteName, "test" + identifier + " event 1", + "", "test " + identifier, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, "test" + identifier + " event 2", "", "hello" + identifier, today.toDate(), + sitePagesService.addCalendarEvent(userName, password, siteName, "test" + identifier + " event 2", + "", "hello " + identifier, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, identifier + " event 3", "", "test" + identifier, today.toDate(), + sitePagesService.addCalendarEvent(userName, password, siteName, identifier + " event 3", "", + "test " + identifier, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, identifier + " event 4", "", "hello" + identifier, today.toDate(), + sitePagesService.addCalendarEvent(userName, password, siteName, identifier + " event 4", "", + "hello " + identifier, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.createDiscussion(userName, password, siteName, "test" + identifier + " topic 1", "test" + identifier, null); - sitePagesService.createDiscussion(userName, password, siteName, "test" + identifier + " topic 2", "hello" + identifier, null); - sitePagesService.createDiscussion(userName, password, siteName, identifier + " topic 3", "test" + identifier, null); - sitePagesService.createDiscussion(userName, password, siteName, identifier + " topic 4", "hello" + identifier, null); - - sitePagesService.createLink(userName, password, siteName, "test" + identifier + " link 1", "https://www.alfresco.com", "test" + identifier, + sitePagesService.createDiscussion(userName, password, siteName, "test" + identifier + " topic 1", + "test " + identifier, null); + sitePagesService.createDiscussion(userName, password, siteName, "test" + identifier + " topic 2", + "hello " + identifier, null); + sitePagesService.createDiscussion(userName, password, siteName, identifier + " topic 3", + "test " + identifier, null); + sitePagesService.createDiscussion(userName, password, siteName, identifier + " topic 4", + "hello " + identifier, null); + + sitePagesService.createLink(userName, password, siteName, "test" + identifier + " link 1", + "https://www.alfresco.com", "test " + identifier, false, null); - sitePagesService.createLink(userName, password, siteName, "test" + identifier + " link 2", "https://www.alfresco.com", "hello" + identifier, + sitePagesService.createLink(userName, password, siteName, "test" + identifier + " link 2", + "https://www.alfresco.com", "hello " + identifier, false, null); - sitePagesService.createLink(userName, password, siteName, identifier + " link 3", "https://www.alfresco.com", "test" + identifier, false, null); - sitePagesService.createLink(userName, password, siteName, identifier + " link 4", "https://www.alfresco.com", "hello" + identifier, false, + sitePagesService.createLink(userName, password, siteName, identifier + " link 3", + "https://www.alfresco.com", "test " + identifier, false, null); + sitePagesService.createLink(userName, password, siteName, identifier + " link 4", + "https://www.alfresco.com", "hello " + identifier, false, null); - dataListsService.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, "test" + identifier + " list 1", "test" + identifier); - dataListsService.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, "test" + identifier + " list 2", "hello" + identifier); - dataListsService.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, identifier + " list 3", "test" + identifier); - dataListsService.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, identifier + " list 4", "hello" + identifier); + dataList.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, + "test" + identifier + " list 1", "test " + identifier); + dataList.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, + "test" + identifier + " list 2", "hello " + identifier); + dataList.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, + identifier + " list 3", "test" + identifier); + dataList.createDataList(userName, password, siteName, DataListsService.DataList.TODO_LIST, + identifier + " list 4", "hello " + identifier); } @TestRail (id = "C5888") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) - public void verifyAdvancedSearchPage() - { - String userName = String.format("User1%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - setupAuthenticatedSession(userName, password); - advancedSearchPage.navigate(); - - LOG.info("STEP 1 - Verify page title"); -// Assert.assertEquals(advancedSearchPage.getPageTitle(), language.translate("advancedSearchPage.pageTitle"), "Page title"); - - LOG.info("STEP 2 - Verify buttons"); - Assert.assertTrue(advancedSearchPage.isTopSearchButtonDisplayed(), "Top search button is displayed"); - Assert.assertTrue(advancedSearchPage.isBottomSearchButtonDisplayed(), "Bottom search button is displayed"); - - LOG.info("STEP 3 - Verify \"look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdown(); - Assert.assertTrue(advancedSearchPage.isLookForDropdownOptionDisplayed(language.translate("advancedSearchPage.lookForDropDown.content.label"), - language.translate("advancedSearchPage.lookForDropDown.content.description"))); - Assert.assertTrue(advancedSearchPage.isLookForDropdownOptionDisplayed(language.translate("advancedSearchPage.lookForDropDown.folders.label"), - language.translate("advancedSearchPage.lookForDropDown.folders.description"))); - - LOG.info("STEP 4 - Choose \"Content\" from \"Look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); - Assert.assertTrue(advancedSearchPage.isKeywordsInputDisplayed(), "Keywords input is displayed"); - Assert.assertTrue(advancedSearchPage.isNameInputDisplayed(), "Name input is displayed"); - Assert.assertTrue(advancedSearchPage.isTitleTextareaDisplayed(), "Title textarea is displayed"); - Assert.assertTrue(advancedSearchPage.isDescriptionTextareaDisplayed(), "Description textarea is displayed"); - Assert.assertTrue(advancedSearchPage.isMimetypeDropDownDisplayed(), "Mimetype input is displayed"); - Assert.assertTrue(advancedSearchPage.isDateFromPickerDisplayed(), "Date From picker is displayed"); - Assert.assertTrue(advancedSearchPage.isDateToPickerDisplayed(), "Date To picker is displayed"); - Assert.assertTrue(advancedSearchPage.isModifierInputDisplayed(), "Modifier input is displayed"); - - LOG.info("STEP 5 - Choose \"Folders\" from \"Look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - getBrowser().waitInSeconds(5); - Assert.assertTrue(advancedSearchPage.isKeywordsInputDisplayed(), "Keywords input is displayed"); - Assert.assertTrue(advancedSearchPage.isNameInputDisplayed(), "Name input is displayed"); - Assert.assertTrue(advancedSearchPage.isTitleTextareaDisplayed(), "Title textarea is displayed"); - Assert.assertTrue(advancedSearchPage.isDescriptionTextareaDisplayed(), "Description textarea is displayed"); - Assert.assertFalse(advancedSearchPage.isMimetypeDropDownDisplayed(), "Mimetype input is not displayed"); - Assert.assertFalse(advancedSearchPage.isDateFromPickerDisplayed(), "Date From picker is not displayed"); - Assert.assertFalse(advancedSearchPage.isDateToPickerDisplayed(), "Date To picker is not displayed"); - Assert.assertFalse(advancedSearchPage.isModifierInputDisplayed(), "Modifier input is not displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); + public void verifyAdvancedSearchPage() throws InterruptedException { + authenticateUsingCookies(user.get()); + advancedSearchPage + .navigate(); + + log.info("STEP 1 - Verify page title"); + advancedSearchPage + .assertPageTitle(); + + log.info("STEP 2 - Verify buttons"); + advancedSearchPage + .assertIsTopSearchButtonDisplayed(); + advancedSearchPage + .assertIsBottomSearchButtonDisplayed(); + + log.info("STEP 3 - Verify \"look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .assertIsLookForDropdownOptionDisplayed("advancedSearchPage.lookForDropDown.content.label","advancedSearchPage.lookForDropDown.content.description"); + advancedSearchPage + .assertIsLookForDropdownOptionDisplayed("advancedSearchPage.lookForDropDown.folders.label","advancedSearchPage.lookForDropDown.folders.description"); + log.info("STEP 4 - Choose \"Content\" from \"Look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); + advancedSearchPage + .assertisKeywordsInputDisplayed(); + advancedSearchPage + .assertisNameInputDisplayed(); + advancedSearchPage + .assertIsTitleTextareaDisplayed(); + advancedSearchPage + .assertIsDescriptionTextareaDisplayed(); + advancedSearchPage + .assertIsMimetypeDropDownDisplayed(); + advancedSearchPage + .assertIsDateFromPickerDisplayed(); + advancedSearchPage + .assertIsDateToPickerDisplayed(); + advancedSearchPage + .assertIsModifierInputDisplayed(); + log.info("STEP 5 - Choose \"Folders\" from \"Look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdown(); + + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + advancedSearchPage + .assertisKeywordsInputDisplayed(); + Assert.assertTrue(advancedSearchPage.isFolderNameInputDisplayed(), "Name input is displayed"); + advancedSearchPage + .assertIsFolderNameInputDisplayed(); + advancedSearchPage + .assertIsFolderTitleTextareaDisplayed(); + advancedSearchPage + .assertIsFolderDescriptionTextareaDisplayed(); } @Bug (id = "ACE-5789") @TestRail (id = "C5891") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = false) - public void searchByKeyword() - { + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void searchByKeyword() { String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); createPreconditions(userName, siteName, identifier); - setupAuthenticatedSession(userName, password); - advancedSearchPage.navigate(); - - LOG.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); - - LOG.info("STEP 2 - Fill in \"Keyword\" field with \"test\" and click \"Search\" button"); - advancedSearchPage.typeKeywords("test" + identifier); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + "_wiki_1"), "test" + identifier + " wiki 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + "_wiki_2"), "test" + identifier + " wiki 2 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " wiki 3"), identifier + " wiki 3 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " blog 1"), "test" + identifier + " blog 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " blog 2"), "test" + identifier + " blog 2 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " blog 3"), identifier + " blog 3 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " event 1"), "test" + identifier + " event 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " event 2"), "test" + identifier + " event 2 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " event 3"), identifier + " event 3 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " link 1"), "test" + identifier + " link 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " link 2"), "test" + identifier + " link 2 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " link 3"), identifier + " link 3 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " topic 1"), "test" + identifier + " topic 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " topic 2"), "test" + identifier + " topic 2 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " topic 3"), identifier + " topic 3 is displayed"); - - LOG.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); - advancedSearchPage.navigate(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - getBrowser().waitInSeconds(5); - - LOG.info("STEP 4 - Fill in \"Keyword\" field with \"test\" and click \"Search\" button"); - advancedSearchPage.typeKeywords("test" + identifier); - advancedSearchPage.clickFirstSearchButton(); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " list 1"), "test" + identifier + " list 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " list 2"), "test" + identifier + " list 2 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " list 3"), identifier + " list 3 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " topic 1"), "test" + identifier + " topic 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " topic 2"), "test" + identifier + " topic 2 is displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); - + authenticateUsingCookies(user.get()); + advancedSearchPage + .navigate(); + log.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); + log.info("STEP 2 - Fill in \"Keyword\" field with \"test\" and click \"Search\" button"); + advancedSearchPage + .typeKeywords("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + "_wiki_1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + "_wiki_2"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " wiki 3"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " blog 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " blog 2"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " blog 3"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " event 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " event 2"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " event 3"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " link 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " link 2"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " link 3"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " topic 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " topic 2"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " topic 3"); + log.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); + advancedSearchPage + .navigate(); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + log.info("STEP 4 - Fill in \"Keyword\" field with \"test\" and click \"Search\" button"); + advancedSearchPage + .typeKeywords("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " list 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " list 2"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " list 3"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " topic 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " topic 2"); } @Bug (id = "ACE-5789") @TestRail (id = "C5907") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = false) - public void searchByName() - { + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void searchByName() { String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); createPreconditions(userName, siteName, identifier); - setupAuthenticatedSession(userName, password); - advancedSearchPage.navigate(); - - LOG.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); - - LOG.info("STEP 2 - Fill in \"Name\" field with \"test*\"and click \"Search\" button"); - advancedSearchPage.typeName("test" + identifier + "*"); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + "_wiki_1"), "test" + identifier + " wiki 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + "_wiki_2"), "test" + identifier + " wiki 2 is displayed"); - - LOG.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); - advancedSearchPage.navigate(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - getBrowser().waitInSeconds(5); - - LOG.info("STEP 4 - Fill in \"Name\" field with \"test*\"and click \"Search\" button"); - advancedSearchPage.typeName("test" + identifier + "*"); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertEquals(searchPage.getNumberOfResultsText(), language.translate("searchPage.noResultsFound"), "No results found"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + authenticateUsingCookies(user.get()); + advancedSearchPage + .navigate(); + log.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); + log.info("STEP 2 - Fill in \"Name\" field with \"test*\"and click \"Search\" button"); + advancedSearchPage + .typeName("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + "_wiki_1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + "_wiki_2"); + log.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); + advancedSearchPage + .navigate(); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + log.info("STEP 4 - Fill in \"Name\" field with \"test*\"and click \"Search\" button"); + advancedSearchPage + .typeNameFolder("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertNoResultsFoundDisplayed(); } @Bug (id = "ACE-5789") @TestRail (id = "C5908") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = false) - public void searchByTitle() - { + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void searchByTitle() { String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); createPreconditions(userName, siteName, identifier); - setupAuthenticatedSession(userName, password); - advancedSearchPage.navigate(); - - LOG.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); - - LOG.info("STEP 2 - Fill in \"Title\" field with \"test*\"and click \"Search\" button"); - advancedSearchPage.typeTitle("test" + identifier); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + "_wiki_1"), "test" + identifier + " wiki 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + "_wiki_2"), "test" + identifier + " wiki 2 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " blog 1"), "test" + identifier + " blog 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " blog 2"), "test" + identifier + " blog 2 is displayed"); - - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " topic 1"), "test" + identifier + " topic 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " topic 2"), "test" + identifier + " topic 2 is displayed"); - - LOG.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); - advancedSearchPage.navigate(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - getBrowser().waitInSeconds(5); - - LOG.info("STEP 4 - Fill in \"Title\" field with \"test*\"and click \"Search\" button"); - advancedSearchPage.typeTitle("test" + identifier); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " list 1"), "test" + identifier + " list 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " list 2"), "test" + identifier + " list 2 is displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + authenticateUsingCookies(user.get()); + advancedSearchPage + .navigate(); + log.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); + log.info("STEP 2 - Fill in \"Title\" field with \"test*\"and click \"Search\" button"); + advancedSearchPage + .typeTitle("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " wiki 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " wiki 2"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " blog 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " blog 2"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " topic 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " topic 2"); + log.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); + advancedSearchPage + .navigate(); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + log.info("STEP 4 - Fill in \"Title\" field with \"test*\"and click \"Search\" button"); + advancedSearchPage + .folderTypeTitle("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " list 1"); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " list 2"); } @TestRail (id = "C5909") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) - public void searchByDescription() - { + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH}) + public void searchByDescription() { + String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); createPreconditions(userName, siteName, identifier); - setupAuthenticatedSession(userName, password); + authenticateUsingCookies(user.get()); + advancedSearchPage + .navigate(); + log.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); + log.info("STEP 2 - Fill in \"Description\" field with \"test*\"and click \"Search\" button"); + advancedSearchPage + .typeDescription("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertNoResultsFoundDisplayed(); + log.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); advancedSearchPage.navigate(); - - LOG.info("STEP 1 - Choose \"Content\" from \"Look for\" drop-down"); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.content.label")); - - LOG.info("STEP 2 - Fill in \"Description\" field with \"test*\"and click \"Search\" button"); - advancedSearchPage.typeDescription("test" + identifier); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertEquals(searchPage.getNumberOfResultsText(), language.translate("searchPage.noResultsFound"), "No results found"); - - LOG.info("STEP 3 - Choose \"Folders\" from \"Look for\" drop-down"); - advancedSearchPage.navigate(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - getBrowser().waitInSeconds(5); - - LOG.info("STEP 4 - Fill in \"Description\" field with \"test*\"and click \"Search\" button"); - advancedSearchPage.typeDescription("test" + identifier); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertTrue(searchPage.isResultFound("test" + identifier + " list 1"), "test" + identifier + " list 1 is displayed"); - Assert.assertTrue(searchPage.isResultFound(identifier + " list 3"), identifier + " list 3 is displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + log.info("STEP 4 - Fill in \"Description\" field with \"test*\"and click \"Search\" button"); + advancedSearchPage + .folderTypeDescription("test*"); + advancedSearchPage + .clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed("test" + identifier + " list 1"); + searchPage + .assertCreatedDataIsDisplayed(identifier + " list 3"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchTests.java index ac182bef4a..b74fa2a72f 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/AdvancedSearchTests.java @@ -1,140 +1,202 @@ package org.alfresco.share.searching.advancedSearch; -import static org.alfresco.common.Utils.testDataFolder; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.searching.SearchPage; import org.alfresco.po.share.site.DocumentLibraryPage; -import org.alfresco.po.share.site.ItemActions; -import org.alfresco.share.ContextAwareWebTest; -import org.alfresco.utility.data.RandomData; -import org.alfresco.utility.model.TestGroup; +import org.alfresco.share.BaseTest; +import org.alfresco.utility.model.*; import org.testng.Assert; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.testng.asserts.SoftAssert; +@Slf4j /** * Created by Mirela Tifui on 12/12/2017. */ -public class AdvancedSearchTests extends ContextAwareWebTest +public class AdvancedSearchTests extends BaseTest { - //@Autowired + AdvancedSearchPage advancedSearchPage; - //@Autowired SearchPage searchPage; - //s@Autowired DocumentLibraryPage documentLibraryPage; - //@Autowired + DocumentDetailsPage documentDetailsPage; + private FileModel testFile; + private FileModel testFile1; + private FileModel testFile2; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); EditPropertiesDialog editPropertiesDialog; SoftAssert softAssert = new SoftAssert(); - private String userName = "advancedSearch" + RandomData.getRandomAlphanumeric(); - private String siteName = "siteSearch" + RandomData.getRandomAlphanumeric(); - private String xmlDoc = "0_XMLdoc_" + RandomData.getRandomAlphanumeric(); - private String excelDoc = "0_ExcelDoc" + RandomData.getRandomAlphanumeric(); - private String HTMLDoc = "0_HTMLDoc" + RandomData.getRandomAlphanumeric(); - private String folderName = "0_Folder" + RandomData.getRandomAlphanumeric(); + private String folderName = "test Folder"; private String textFile = "myFile.txt"; + private String folderTitle = "Folder title"; + private String description = "This is a test folder"; + + @BeforeMethod(alwaysRun = true) + private void setupTest(){ + log.info("Precondition2: Test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + log.info("Precondition3: Test Site is created"); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + log.info("Precondition4: Creating random files in the site under document library."); + testFile = FileModel.getRandomFileModel(FileType.XML); + getCmisApi().usingSite(site.get()).createFile(testFile).assertThat().existsInRepo(); + testFile1 = FileModel.getRandomFileModel(FileType.MSEXCEL); + getCmisApi().usingSite(site.get()).createFile(testFile1).assertThat().existsInRepo(); + testFile2 = FileModel.getRandomFileModel(FileType.HTML); + getCmisApi().usingSite(site.get()).createFile(testFile2).assertThat().existsInRepo(); + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + searchPage = new SearchPage(webDriver); + editPropertiesDialog = new EditPropertiesDialog(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + } - @BeforeClass (alwaysRun = true) - private void setupTest() + @AfterMethod(alwaysRun = true) + public void testCleanup() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, "Advanced", TestGroup.SEARCH); - siteService.create(userName, password, domain, siteName, "site description", SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.XML, xmlDoc, "contentXml"); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.MSEXCEL, excelDoc, "contentExcel"); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.HTML, HTMLDoc, "contentHtml"); - contentService.createFolder(userName, password, folderName, siteName); - contentService.uploadFileInSite(userName, password, siteName, testDataFolder + textFile); - setupAuthenticatedSession(userName, password); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); + } @Test (groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH }) public void searchByMimeTypeTest() { - LOG.info("Step 1: Navigate to advanced search and select XML mimetype"); - advancedSearchPage.navigate(); + log.info("Step 1: Navigate to advanced search and select XML mimetype"); + documentLibraryPage + .navigate(site.get()); + advancedSearchPage + .navigate(); Assert.assertEquals(advancedSearchPage.getSelectedContentTypeOption(), "Content ▾", "Content is not the selected Look for option"); - advancedSearchPage.selectMimetype("text/xml"); - advancedSearchPage.clickFirstSearchButton(); - softAssert.assertTrue(searchPage.isResultFoundWithRetry(xmlDoc), xmlDoc + " is not displayed"); - softAssert.assertFalse(searchPage.isResultFound(excelDoc), excelDoc + " is displayed"); - softAssert.assertFalse(searchPage.isResultFound(HTMLDoc), HTMLDoc + " is displayed"); - LOG.info("Step 2: Navigate to advanced search page and select Excel mimetype"); - advancedSearchPage.navigate(); - advancedSearchPage.selectMimetype("application/vnd.ms-excel"); - advancedSearchPage.clickFirstSearchButton(); - softAssert.assertFalse(searchPage.isResultFound(xmlDoc), xmlDoc + " is displayed"); - softAssert.assertTrue(searchPage.isResultFound(excelDoc), excelDoc + " is not displayed"); - softAssert.assertFalse(searchPage.isResultFound(HTMLDoc), HTMLDoc + " is displayed"); - softAssert.assertAll(); + advancedSearchPage + .selectMimetype("text/xml"); + advancedSearchPage + .clickFirstSearchButtonAgain(); + searchPage + .assertIsXmlFileDisplayed(".xml"); + searchPage + .assertIsXlsFileNotDisplayed(".xls"); + searchPage + .assertIsHtmlFileNotDisplayed(".html"); + log.info("Step 2: Navigate to advanced search page and select Excel mimetype"); + advancedSearchPage + .navigate(); + advancedSearchPage + .selectMimetype("application/vnd.ms-excel"); + advancedSearchPage + .clickFirstSearchButtonAgain(); + searchPage + .assertIsXmlFileNotDisplayed(".xml"); + searchPage + .assertIsXlsFileDisplayed(".xls"); + searchPage + .assertIsHtmlFileNotDisplayed(".html"); + } @Test (groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH }) public void validateInvalidDateTest() { - LOG.info("Step 1: Navigate to Advanced Search page and input invalid from date"); - advancedSearchPage.navigate(); + log.info("Step 1: Navigate to Advanced Search page and input invalid from date"); + advancedSearchPage + .navigate(); softAssert.assertEquals(advancedSearchPage.getSelectedContentTypeOption(), "Content ▾", "Content is not the selected Look for option"); - advancedSearchPage.setFromDate("0/06/2017"); - advancedSearchPage.clickFirstSearchButton(); + advancedSearchPage + .setFromDate("0/06/2017"); + advancedSearchPage + .clickFirstSearchButton(); softAssert.assertEquals(searchPage.getNoSearchResultsText(), language.translate("searchPage.searchSuggestionNoSearchResuls"), "no search result suggestion not correct"); - LOG.info("Step 2: Navigate to Advanced Search page and input invalid to date"); - advancedSearchPage.navigate(); - advancedSearchPage.setToDate("25/06/0000"); - advancedSearchPage.clickFirstSearchButton(); + log.info("Step 2: Navigate to Advanced Search page and input invalid to date"); + advancedSearchPage + .navigate(); + advancedSearchPage + .setToDate("25/06/0000"); + advancedSearchPage + .clickFirstSearchButton(); softAssert.assertEquals(searchPage.getNoSearchResultsText(), language.translate("searchPage.searchSuggestionNoSearchResuls"), "no search result suggestion not correct"); - softAssert.assertAll(); + } @Test (groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH, "BugValidation" }) - public void checkThatWhenFileIsSearchedNoFolderIsReturned() - { - LOG.info("Step 1: Navigate to advanced search and search for .txt file, verify that no folders are returned"); - advancedSearchPage.navigate(); + public void checkThatWhenFileIsSearchedNoFolderIsReturned() { + log.info("Step 1: Navigate to advanced search and search for .txt file, verify that no folders are returned"); + documentLibraryPage + .navigate(site.get()) + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT) + .typeName(textFile) + .clickCreate(); + documentLibraryPage.navigate(); + advancedSearchPage + .navigate(); softAssert.assertEquals(advancedSearchPage.getSelectedContentTypeOption(), "Content ▾", "Content is not the selected Look for option"); - advancedSearchPage.typeName(textFile); - advancedSearchPage.clickFirstSearchButton(); + advancedSearchPage + .typeName(textFile); + advancedSearchPage + .clickFirstSearchButtonAndRefresh(); softAssert.assertFalse(searchPage.isAnyFolderReturnedInResults(), "Folder type is returned in results"); - softAssert.assertTrue(searchPage.isResultFound(textFile), textFile + " is not displayed in search results"); + softAssert.assertTrue(searchPage.isResultFoundWithList(textFile), textFile + " is not displayed in search results"); softAssert.assertAll(); } @Test (groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH, "BugValidation" }) - public void checkFolderSearchWithAllDetailsProvided() - { - //precondition - add description and folder title - this is done from the UI as there is no method in te framework to perform this actions - String folderTitle = "Folder title"; - String description = "This is a test folder"; - documentLibraryPage.navigate(siteName); - documentLibraryPage.selectItemAction(folderName, ItemActions.EDIT_PROPERTIES); - editPropertiesDialog.setTitle(folderTitle); - editPropertiesDialog.setDescription(description); + public void checkFolderSearchWithAllDetailsProvided() { + log.info("precondition - create a Folder with all fields"); + documentLibraryPage.navigate(site.get()) + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.FOLDER) + .typeName(folderName) + .typeTitle(folderTitle) + .typeDescription(description); editPropertiesDialog.clickSave(); - - LOG.info("Step 1: Navigate to Advanced Search and search for folder providing all details"); - advancedSearchPage.navigate(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - advancedSearchPage.typeName(folderName); - advancedSearchPage.typeDescription(description); - advancedSearchPage.typeTitle(folderTitle); - advancedSearchPage.clickFirstSearchButton(); + log.info("Step 1: Navigate to Advanced Search and search for folder providing all details"); + advancedSearchPage + .navigate(); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + advancedSearchPage + .typeNameFolder(folderName); + advancedSearchPage + .folderTypeTitle(folderTitle); + advancedSearchPage + .folderTypeDescription(description); + advancedSearchPage + .clickFirstSearchButton(); Assert.assertTrue(searchPage.isResultFound(folderName), folderName + " is not displayed in search results"); } @Test (groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH, "BugValidation" }) public void folderKeywordSearchTest() { - LOG.info("Step 1: Go to Advanced Search page, select Folder type, type in keyword and check that only folder results are returned"); - advancedSearchPage.navigate(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - advancedSearchPage.typeKeywords(folderName); - advancedSearchPage.clickFirstSearchButton(); + log.info("precondition - create a Folder "); + documentLibraryPage.navigate(site.get()) + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.FOLDER) + .typeName(folderName) + .typeTitle(folderTitle) + .typeDescription(description); + editPropertiesDialog + .clickSave(); + log.info("Step 1: Go to Advanced Search page, select Folder type, type in keyword and check that only folder results are returned"); + advancedSearchPage + .navigate(); + advancedSearchPage + .clickOnLookForDropdown(); + advancedSearchPage + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); + advancedSearchPage + .typeKeywords(folderName); + advancedSearchPage + .clickOnFirstSearchButton(); softAssert.assertTrue(searchPage.isResultFound(folderName), folderName + " is not displayed in search results"); softAssert.assertTrue(searchPage.isAnyFolderReturnedInResults(), "Folder type is not returned in results"); softAssert.assertFalse(searchPage.isAnyFileReturnedInResults(), "File type is returned in results"); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/ContentSearchStructureTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/ContentSearchStructureTest.java index 6059961c09..a4c5c925fa 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/ContentSearchStructureTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/advancedSearch/ContentSearchStructureTest.java @@ -1,148 +1,201 @@ package org.alfresco.share.searching.advancedSearch; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; - import java.util.ArrayList; import java.util.Date; import java.util.List; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.common.DataUtil; + import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.DashboardCustomization; +import org.alfresco.dataprep.ContentService; +import org.alfresco.dataprep.DashboardCustomization.Page; +import org.alfresco.dataprep.SitePagesService; import org.alfresco.dataprep.SiteService; +import org.alfresco.dataprep.DashboardCustomization; + import org.alfresco.po.share.alfrescoContent.buildingContent.NewFolderDialog; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.searching.SearchPage; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.toolbar.Toolbar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; import org.alfresco.utility.report.Bug; + import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class ContentSearchStructureTest extends ContextAwareWebTest +@Slf4j +public class ContentSearchStructureTest extends BaseTest { - // @Autowired Toolbar toolbar; - - //@Autowired SearchPage searchPage; - - // @Autowired + AdvancedSearchPage advancedSearchPage; DocumentLibraryPage documentLibraryPage; - - //@Autowired DocumentDetailsPage documentDetailsPage; - - //@Autowired NewFolderDialog newContentDialog; - - //@Autowired SiteDashboardPage siteDashboardPage; + @Autowired + private SiteService siteService; + @Autowired + private SitePagesService sitePagesService; + @Autowired + private ContentService contentService; + private DateTime today = new DateTime(); private DateTime tomorrow = today.plusDays(1); + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal siteModel = new ThreadLocal<>(); + private final String password = "password"; + + + @BeforeMethod(alwaysRun = true) + public void setupTest() { + log.info("PreCondition: Creating a TestUser"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + //contentService = new ContentService(); + searchPage = new SearchPage(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + newContentDialog = new NewFolderDialog(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + toolbar = new Toolbar(webDriver); + } + @AfterMethod(alwaysRun = true) + public void cleanup() + { + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(siteModel.get()); + } @Bug (id = "ACE-5789") @TestRail (id = "C5951") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = false) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByAWordOrPhraseAnywhereItExists() { String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); String word = "word" + identifier; String phrase = "phrase" + identifier; - List sitePages = new ArrayList<>(); - sitePages.add(DashboardCustomization.Page.WIKI); - sitePages.add(DashboardCustomization.Page.BLOG); - sitePages.add(DashboardCustomization.Page.CALENDAR); - sitePages.add(DashboardCustomization.Page.LINKS); - - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.WIKI); + sitePages.add(Page.BLOG); + sitePages.add(Page.CALENDAR); + sitePages.add(Page.LINKS); siteService.addPagesToSite(userName, password, siteName, sitePages); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, word + ".txt", phrase); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, phrase + ".txt", word); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + "1.txt", word); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + "2.txt", word); + + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + word + ".txt", phrase); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + phrase + ".txt", "word" +identifier); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + identifier + "1.txt", word); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + identifier + "2.txt", word); + sitePagesService.createWiki(userName, password, siteName, word + " wiki", phrase, null); sitePagesService.createWiki(userName, password, siteName, phrase + " wiki", word, null); - sitePagesService.createBlogPost(userName, password, siteName, word + " blog", phrase, false, null); - sitePagesService.createBlogPost(userName, password, siteName, phrase + " blog", word, false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, word + " calendar", "", phrase, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, phrase + " calendar", "", word, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.createDiscussion(userName, password, siteName, word + " discussion", phrase, null); - sitePagesService.createDiscussion(userName, password, siteName, phrase + " discussion", word, null); - sitePagesService.createLink(userName, password, siteName, word + " link", "https://www.alfresco.com", phrase, false, null); - sitePagesService.createLink(userName, password, siteName, phrase + " link", "https://www.alfresco.com", word, false, null); - - setupAuthenticatedSession(userName, password); - - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickOnFile(identifier + "1.txt"); - documentDetailsPage.clickOnCommentDocument(); - documentDetailsPage.addComment(word); - - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickOnFile(identifier + "2.txt"); - documentDetailsPage.clickOnCommentDocument(); - documentDetailsPage.addComment(phrase); - - LOG.info("STEP 1 - Fill in search field with a word (e.g: \"word\" or \"=word\") and click \"Search\" button or \"Enter\""); - getBrowser().waitInSeconds(10); - toolbar.search(word); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(word + ".txt"), word + ".txt is displayed"); - assertTrue(searchPage.isResultFound(phrase + ".txt"), phrase + ".txt is displayed"); - assertTrue(searchPage.isResultFound(identifier + "1.txt"), identifier + "1.txt is displayed"); - assertTrue(searchPage.isResultFound(identifier + "2.txt"), identifier + "2.txt is displayed"); - assertTrue(searchPage.isResultFound(word + "_wiki"), word + " wiki is displayed"); - assertTrue(searchPage.isResultFound(phrase + " wiki"), phrase + " wiki is displayed"); - assertTrue(searchPage.isResultFound(word + " blog"), word + " blog is displayed"); - assertTrue(searchPage.isResultFound(phrase + " blog"), phrase + " blog is displayed"); - assertTrue(searchPage.isResultFound(word + " calendar"), word + " calendar is displayed"); - assertTrue(searchPage.isResultFound(phrase + " calendar"), phrase + " calendar is displayed"); - assertTrue(searchPage.isResultFound(word + " discussion"), word + " discussion is displayed"); - assertTrue(searchPage.isResultFound(phrase + " discussion"), phrase + " discussion is displayed"); - assertTrue(searchPage.isResultFound(word + " link"), word + " link is displayed"); - assertTrue(searchPage.isResultFound(phrase + " link"), phrase + " link is displayed"); - - LOG.info("STEP 2 - Fill in search field with a phrase and click \"Search\" button or \"Enter\""); - toolbar.search(phrase); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(word + ".txt"), word + ".txt is displayed"); - assertTrue(searchPage.isResultFound(phrase + ".txt"), phrase + ".txt is displayed"); - assertTrue(searchPage.isResultFound(word + " wiki"), word + " wiki is displayed"); - assertTrue(searchPage.isResultFound(phrase + "_wiki"), phrase + " wiki is displayed"); - assertTrue(searchPage.isResultFound(word + " blog"), word + " blog is displayed"); - assertTrue(searchPage.isResultFound(phrase + " blog"), phrase + " blog is displayed"); - assertTrue(searchPage.isResultFound(word + " calendar"), word + " calendar is displayed"); - assertTrue(searchPage.isResultFound(phrase + " calendar"), phrase + " calendar is displayed"); - assertTrue(searchPage.isResultFound(word + " discussion"), word + " discussion is displayed"); - assertTrue(searchPage.isResultFound(phrase + " discussion"), phrase + " discussion is displayed"); - assertTrue(searchPage.isResultFound(word + " link"), word + " link is displayed"); - assertTrue(searchPage.isResultFound(phrase + " link"), phrase + " link is displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + + sitePagesService.createBlogPost(userName, password, siteName, word + " blog", phrase, + false, null); + sitePagesService.createBlogPost(userName, password, siteName, phrase + " blog", word, + false, null); + sitePagesService.addCalendarEvent(userName, password, siteName, word + " calendar", + "", phrase, today.toDate(), tomorrow.toDate(), "", "", false, null); + sitePagesService.addCalendarEvent(userName, password, siteName, phrase + " calendar", + "", word, today.toDate(), tomorrow.toDate(), "", "", false, null); + sitePagesService.createDiscussion(userName, password, siteName, word + " discussion", + phrase, null); + sitePagesService.createDiscussion(userName, password, siteName, phrase + " discussion", + word, null); + sitePagesService.createLink(userName, password, siteName, word + " link", + "https://www.alfresco.com", phrase, false, null); + sitePagesService.createLink(userName, password, siteName, phrase + " link", + "https://www.alfresco.com", word, false, null); + + authenticateUsingCookies(user.get()); + + documentLibraryPage + .navigate(siteName) + .clickOnFile(identifier + "1.txt"); + documentDetailsPage + .clickOnCommentDocument(); + documentDetailsPage + .addComment(word); + + documentLibraryPage + .navigate(siteName) + .clickOnFile(identifier + "2.txt"); + documentDetailsPage + .clickOnCommentDocument(); + documentDetailsPage + .addComment(phrase); + + log.info("STEP 1 - Fill in search field with a word (e.g: \"word\" or \"=word\") and click \"Search\" button or \"Enter\""); + toolbar + .search(word); + searchPage + .assertCreatedDataIsDisplayed(word + ".txt") + .assertCreatedDataIsDisplayed(identifier + "1.txt") + .assertCreatedDataIsDisplayed(identifier + "2.txt") + .assertCreatedDataIsDisplayed(word + "_wiki") + .assertCreatedDataIsDisplayed(phrase + "_wiki") + .assertCreatedDataIsDisplayed(word + " blog") + .assertCreatedDataIsDisplayed(phrase + " blog") + .assertCreatedDataIsDisplayed(word + " calendar") + .assertCreatedDataIsDisplayed(phrase + " calendar") + .assertCreatedDataIsDisplayed(word + " discussion") + .assertCreatedDataIsDisplayed(phrase + " discussion") + .assertCreatedDataIsDisplayed(word + " link") + .assertCreatedDataIsDisplayed(phrase + " link") + .assertCreatedDataIsDisplayed(phrase + ".txt"); + + log.info("STEP 2 - Fill in search field with a phrase and click \"Search\" button or \"Enter\""); + toolbar + .search(phrase); + searchPage + .assertCreatedDataIsDisplayed(word + ".txt") + .assertCreatedDataIsDisplayed(phrase + ".txt") + .assertCreatedDataIsDisplayed(word + "_wiki") + .assertCreatedDataIsDisplayed(phrase + "_wiki") + .assertCreatedDataIsDisplayed(word + " blog") + .assertCreatedDataIsDisplayed(phrase + " blog") + .assertCreatedDataIsDisplayed(word + " calendar") + .assertCreatedDataIsDisplayed(phrase + " calendar") + .assertCreatedDataIsDisplayed(word + " discussion") + .assertCreatedDataIsDisplayed(phrase + " discussion") + .assertCreatedDataIsDisplayed(word + " link") + .assertCreatedDataIsDisplayed(phrase + " link"); + } @Bug (id = "ACE-5789") @TestRail (id = "C5970") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = false) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByMultipleWords() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); String identifier1 = RandomData.getRandomAlphanumeric(); String identifier2 = RandomData.getRandomAlphanumeric(); @@ -150,103 +203,117 @@ public void searchByMultipleWords() String word1 = "word" + identifier1; String word2 = "word" + identifier2; String word3 = "word" + identifier3; - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; - - List sitePages = new ArrayList<>(); - sitePages.add(DashboardCustomization.Page.WIKI); - sitePages.add(DashboardCustomization.Page.BLOG); - sitePages.add(DashboardCustomization.Page.CALENDAR); - sitePages.add(DashboardCustomization.Page.LINKS); - - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); + + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.WIKI); + sitePages.add(Page.BLOG); + sitePages.add(Page.CALENDAR); + sitePages.add(Page.LINKS); siteService.addPagesToSite(userName, password, siteName, sitePages); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + "1.txt", word1 + " " + word2 + " " + word3); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + "2.txt", word3 + " " + word2 + " " + word1); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, word1 + " " + word2 + " " + word3 + " 1.txt", identifier + "3"); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, word3 + " " + word2 + " " + word1 + " 2.txt", identifier + "4"); - sitePagesService.createWiki(userName, password, siteName, word1 + " " + word2 + " " + word3 + " wiki", word3 + " " + word2 + " " + word1, null); - sitePagesService.createWiki(userName, password, siteName, word3 + " " + word2 + " " + word1 + " wiki", word1 + " " + word2 + " " + word3, null); - sitePagesService.createBlogPost(userName, password, siteName, word1 + " " + word2 + " " + word3 + " blog", word3 + " " + word2 + " " + word1, false, + + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + identifier + "1.txt", word1 + " " + word2 + " " + word3); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + identifier + "2.txt", word3 + " " + word2 + " " + word1); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + word1 + " " + word2 + " " + word3 + " 1.txt", identifier + "3"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + word3 + " " + word2 + " " + word1 + " 2.txt", identifier + "4"); + sitePagesService.createWiki(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " wiki", word3 + " " + word2 + " " + word1, null); + sitePagesService.createWiki(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " wiki", word1 + " " + word2 + " " + word3, null); + sitePagesService.createBlogPost(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " blog", word3 + " " + word2 + " " + word1, false, null); - sitePagesService.createBlogPost(userName, password, siteName, word3 + " " + word2 + " " + word1 + " blog", word1 + " " + word2 + " " + word3, false, + sitePagesService.createBlogPost(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " blog", word1 + " " + word2 + " " + word3, false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, word1 + " " + word2 + " " + word3 + " calendar", "", word3 + " " + word2 + " " + word1, + sitePagesService.addCalendarEvent(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " calendar", "", word3 + " " + word2 + " " + word1, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, word3 + " " + word2 + " " + word1 + " calendar", "", word1 + " " + word2 + " " + word3, + sitePagesService.addCalendarEvent(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " calendar", "", word1 + " " + word2 + " " + word3, today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.createDiscussion(userName, password, siteName, word1 + " " + word2 + " " + word3 + " discussion", word3 + " " + word2 + " " + word1, + sitePagesService.createDiscussion(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " discussion", word3 + " " + word2 + " " + word1, null); - sitePagesService.createDiscussion(userName, password, siteName, word3 + " " + word2 + " " + word1 + " discussion", word1 + " " + word2 + " " + word3, + sitePagesService.createDiscussion(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " discussion", word1 + " " + word2 + " " + word3, null); - sitePagesService.createLink(userName, password, siteName, word1 + " " + word2 + " " + word3 + " link", "https://www.alfresco.com", + sitePagesService.createLink(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " link", "https://www.alfresco.com", word3 + " " + word2 + " " + word1, false, null); - sitePagesService.createLink(userName, password, siteName, word3 + " " + word2 + " " + word1 + " link", "https://www.alfresco.com", + sitePagesService.createLink(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " link", "https://www.alfresco.com", word1 + " " + word2 + " " + word3, false, null); - setupAuthenticatedSession(userName, password); - - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickOnFile(identifier + "1.txt"); - documentDetailsPage.clickOnCommentDocument(); - documentDetailsPage.addComment(word1 + " " + word2 + " " + word3); - - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickOnFile(identifier + "2.txt"); - documentDetailsPage.clickOnCommentDocument(); - documentDetailsPage.addComment(word3 + " " + word2 + " " + word1); - - LOG.info( + authenticateUsingCookies(user.get()); + + documentLibraryPage + .navigate(siteName) + .clickOnFile(identifier + "1.txt"); + documentDetailsPage + .clickOnCommentDocument(); + documentDetailsPage + .addComment(word1 + " " + word2 + " " + word3); + documentLibraryPage + .navigate(siteName) + .clickOnFile(identifier + "2.txt"); + documentDetailsPage + .clickOnCommentDocument(); + documentDetailsPage + .addComment(word3 + " " + word2 + " " + word1); + + log.info( "STEP 1 - Fill in search field with words (e.g: \"word1 word2 word3\" or \"word1 AND word2 AND word3\") and click \"Search\" button or \"Enter\""); - getBrowser().waitInSeconds(10); - toolbar.search(word1 + " AND " + word2 + " AND " + word3); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + "1.txt"), identifier + "1.txt is displayed"); - assertTrue(searchPage.isResultFound(identifier + "2.txt"), identifier + "2.txt is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " 1.txt"), word1 + " " + word2 + " " + word3 + " 1.txt is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " 2.txt"), word3 + " " + word2 + " " + word1 + " 2.txt is displayed"); - assertTrue(searchPage.isResultFound(word1 + "_" + word2 + "_" + word3 + "_wiki"), word1 + " " + word2 + " " + word3 + " wiki is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " wiki"), word3 + " " + word2 + " " + word1 + " wiki is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " blog"), word1 + " " + word2 + " " + word3 + " blog is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " blog"), word3 + " " + word2 + " " + word1 + " blog is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " calendar"), word1 + " " + word2 + " " + word3 + " calendar is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " calendar"), word3 + " " + word2 + " " + word1 + " calendar is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " discussion"), word1 + " " + word2 + " " + word3 + " discussion is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " discussion"), word3 + " " + word2 + " " + word1 + " discussion is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " link"), word1 + " " + word2 + " " + word3 + " link is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " link"), word3 + " " + word2 + " " + word1 + " link is displayed"); - - LOG.info("STEP 2 - Fill in search field with the same words, but in a different order (e.g: \"word3 word2 word1\" or \"word2 AND word1 AND word3\")"); + toolbar + .search(word1 + " AND " + word2 + " AND " + word3); + searchPage + .assertCreatedDataIsDisplayed(identifier + "1.txt") + .assertCreatedDataIsDisplayed(identifier + "2.txt") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " 1.txt") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " 2.txt") + .assertCreatedDataIsDisplayed(word1 + "_" + word2 + "_" + word3 + "_wiki") + .assertCreatedDataIsDisplayed(word3 + "_" + word2 + "_" + word1 + "_wiki") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " blog") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " blog") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " calendar") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " calendar") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " discussion") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " discussion") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " link") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " link"); + + log.info("STEP 2 - Fill in search field with the same words, but in a different order (e.g: \"word3 word2 word1\" or \"word2 AND word1 AND word3\")"); toolbar.search(word3 + " " + word2 + " " + word1); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + "1.txt"), identifier + "1.txt is displayed"); - assertTrue(searchPage.isResultFound(identifier + "2.txt"), identifier + "2.txt is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " 1.txt"), word1 + " " + word2 + " " + word3 + " 1.txt is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " 2.txt"), word3 + " " + word2 + " " + word1 + " 2.txt is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " wiki"), word1 + " " + word2 + " " + word3 + " wiki is displayed"); - assertTrue(searchPage.isResultFound(word3 + "_" + word2 + "_" + word1 + "_wiki"), word3 + " " + word2 + " " + word1 + " wiki is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " blog"), word1 + " " + word2 + " " + word3 + " blog is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " blog"), word3 + " " + word2 + " " + word1 + " blog is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " calendar"), word1 + " " + word2 + " " + word3 + " calendar is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " calendar"), word3 + " " + word2 + " " + word1 + " calendar is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " discussion"), word1 + " " + word2 + " " + word3 + " discussion is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " discussion"), word3 + " " + word2 + " " + word1 + " discussion is displayed"); - assertTrue(searchPage.isResultFound(word1 + " " + word2 + " " + word3 + " link"), word1 + " " + word2 + " " + word3 + " link is displayed"); - assertTrue(searchPage.isResultFound(word3 + " " + word2 + " " + word1 + " link"), word3 + " " + word2 + " " + word1 + " link is displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + searchPage + .assertCreatedDataIsDisplayed(identifier + "1.txt") + .assertCreatedDataIsDisplayed(identifier + "2.txt") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " 1.txt") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " 2.txt") + .assertCreatedDataIsDisplayed(word1 + "_" + word2 + "_" + word3 + "_wiki") + .assertCreatedDataIsDisplayed(word3 + "_" + word2 + "_" + word1 + "_wiki") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " blog") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " blog") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " calendar") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " calendar") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " discussion") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " discussion") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " link") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " link"); + } @Bug (id = "ACE-5789") @TestRail (id = "C5971") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = false) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, enabled = true) public void searchByAnyWords() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); String identifier1 = RandomData.getRandomAlphanumeric(); String identifier2 = RandomData.getRandomAlphanumeric(); @@ -254,275 +321,306 @@ public void searchByAnyWords() String word1 = "word" + identifier1; String word2 = "word" + identifier2; String word3 = "word" + identifier3; - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; - - List sitePages = new ArrayList<>(); - sitePages.add(DashboardCustomization.Page.WIKI); - sitePages.add(DashboardCustomization.Page.BLOG); - sitePages.add(DashboardCustomization.Page.CALENDAR); - sitePages.add(DashboardCustomization.Page.LINKS); - - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); + + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.WIKI); + sitePages.add(Page.BLOG); + sitePages.add(Page.CALENDAR); + sitePages.add(Page.LINKS); siteService.addPagesToSite(userName, password, siteName, sitePages); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + "1.txt", word1); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, word2 + " .txt", identifier + "2.txt"); - sitePagesService.createWiki(userName, password, siteName, word1 + " wiki", "", null); - sitePagesService.createWiki(userName, password, siteName, identifier + " wiki", word3, null); - sitePagesService.createBlogPost(userName, password, siteName, word2 + " blog", "", false, null); - sitePagesService.createBlogPost(userName, password, siteName, identifier + " blog", word3, false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, word3 + " calendar", "", "", today.toDate(), tomorrow.toDate(), "", "", false, null); - sitePagesService.addCalendarEvent(userName, password, siteName, identifier + " calendar", "", word2, today.toDate(), tomorrow.toDate(), "", "", false, + + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + identifier + "1.txt", word1 + " " + word2 + " " + word3); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + identifier + "2.txt", word3 + " " + word2 + " " + word1); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + word1 + " " + word2 + " " + word3 + " 1.txt", identifier + "3"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + word3 + " " + word2 + " " + word1 + " 2.txt", identifier + "4"); + sitePagesService.createWiki(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " wiki", word3 + " " + word2 + " " + word1, null); + sitePagesService.createWiki(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " wiki", word1 + " " + word2 + " " + word3, null); + sitePagesService.createBlogPost(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " blog", word3 + " " + word2 + " " + word1, false, null); - sitePagesService.createDiscussion(userName, password, siteName, word3 + " discussion", "", null); - sitePagesService.createLink(userName, password, siteName, word2 + " link", "https://www.alfresco.com", "", false, null); - sitePagesService.createLink(userName, password, siteName, identifier + " link", "https://www.alfresco.com", word1, false, null); - - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickOnFile(identifier + "1.txt"); - documentDetailsPage.clickOnCommentDocument(); - documentDetailsPage.addComment(word3); - - getBrowser().waitInSeconds(10); - LOG.info("STEP 1 - Fill in search field with words (e.g: \"word1 OR word2 OR word3\") and click \"Search\" button or \"Enter\""); - toolbar.search(word1 + " OR " + word2 + " OR " + word3); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFoundWithRetry(identifier + "1.txt"), identifier + "1.txt is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(word2 + " .txt"), word2 + " .txt is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(word1 + "_wiki"), word1 + " wiki is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(identifier + " wiki"), identifier + " wiki is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(word2 + " blog"), word2 + " blog is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(identifier + " blog"), identifier + " blog is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(word3 + " calendar"), word3 + " calendar is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(identifier + " calendar"), identifier + " calendar is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(word3 + " discussion"), word3 + " discussion is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(word2 + " link"), word2 + " link is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(identifier + " link"), identifier + " link is displayed"); - - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + sitePagesService.createBlogPost(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " blog", word1 + " " + word2 + " " + word3, false, + null); + sitePagesService.addCalendarEvent(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " calendar", "", word3 + " " + word2 + " " + word1, + today.toDate(), tomorrow.toDate(), "", "", false, null); + sitePagesService.addCalendarEvent(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " calendar", "", word1 + " " + word2 + " " + word3, + today.toDate(), tomorrow.toDate(), "", "", false, null); + sitePagesService.createDiscussion(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " discussion", word3 + " " + word2 + " " + word1, + null); + sitePagesService.createDiscussion(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " discussion", word1 + " " + word2 + " " + word3, + null); + sitePagesService.createLink(userName, password, siteName, + word1 + " " + word2 + " " + word3 + " link", "https://www.alfresco.com", + word3 + " " + word2 + " " + word1, false, null); + sitePagesService.createLink(userName, password, siteName, + word3 + " " + word2 + " " + word1 + " link", "https://www.alfresco.com", + word1 + " " + word2 + " " + word3, false, null); + + authenticateUsingCookies(user.get()); + + documentLibraryPage + .navigate(siteName) + .clickOnFile(identifier + "1.txt"); + documentDetailsPage + .clickOnCommentDocument(); + documentDetailsPage + .addComment(word1 + " " + word2 + " " + word3); + documentLibraryPage + .navigate(siteName) + .clickOnFile(identifier + "2.txt"); + documentDetailsPage + .clickOnCommentDocument(); + documentDetailsPage + .addComment(word3 + " " + word2 + " " + word1); + + log.info( + "STEP 1 - Fill in search field with words (e.g: \"word1 word2 word3\" or \"word1 OR word2 OR word3\") and click \"Search\" button or \"Enter\""); + toolbar + .search(word1 + " OR " + word2 + " OR " + word3); + searchPage + .assertCreatedDataIsDisplayed(identifier + "1.txt") + .assertCreatedDataIsDisplayed(identifier + "2.txt") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " 1.txt") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " 2.txt") + .assertCreatedDataIsDisplayed(word1 + "_" + word2 + "_" + word3 + "_wiki") + .assertCreatedDataIsDisplayed(word3 + "_" + word2 + "_" + word1 + "_wiki") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " blog") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " blog") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " calendar") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " calendar") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " discussion") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " discussion") + .assertCreatedDataIsDisplayed(word1 + " " + word2 + " " + word3 + " link") + .assertCreatedDataIsDisplayed(word3 + " " + word2 + " " + word1 + " link"); } @TestRail (id = "C5935") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyTitle() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); List sitePages = new ArrayList<>(); sitePages.add(DashboardCustomization.Page.BLOG); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); siteService.addPagesToSite(userName, password, siteName, sitePages); + sitePagesService.createBlogPost(userName, password, siteName, "file1" + identifier, "", false, null); sitePagesService.createBlogPost(userName, password, siteName, "file2" + identifier, "file1" + identifier, false, null); - setupAuthenticatedSession(userName, password); - LOG.info("STEP 1 - Fill in search field with \"title:X\" (e.g: \"title:file1\") and click \"Search\" button"); + authenticateUsingLoginPage(user.get()); + + log.info("STEP 1 - Fill in search field with \"title:X\" (e.g: \"title:file1\") and click \"Search\" button"); toolbar.search("title:file1" + identifier); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier); - LOG.info("STEP 2 - Fill in search field with a name (e.g: \"file1\") and click \"Search\" button"); + log.info("STEP 2 - Fill in search field with a name (e.g: \"file1\") and click \"Search\" button"); toolbar.search("file1" + identifier); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file2" + identifier), "file2" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier) + .assertCreatedDataIsDisplayed("file2" + identifier); } @TestRail (id = "C5936") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyName() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); List sitePages = new ArrayList<>(); sitePages.add(DashboardCustomization.Page.BLOG); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); siteService.addPagesToSite(userName, password, siteName, sitePages); contentService.createFolder(userName, password, "file1" + identifier, siteName); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.PDF, "testcontent_10." + identifier + ".pdf", ""); sitePagesService.createBlogPost(userName, password, siteName, "file2" + identifier, "file1" + identifier, false, null); - setupAuthenticatedSession(userName, password); - LOG.info("STEP 1 - Fill in search field with \"name:X\" (e.g: \"name:file1\") and click \"Search\" button"); + authenticateUsingLoginPage(user.get()); + + log.info("STEP 1 - Fill in search field with \"name:X\" (e.g: \"name:file1\") and click \"Search\" button"); toolbar.search("name:file1" + identifier); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier); - LOG.info("STEP 2 - Fill in search field with a name (e.g: \"file1\") and click \"Search\" button"); + log.info("STEP 2 - Fill in search field with a name (e.g: \"file1\") and click \"Search\" button"); toolbar.search("file1" + identifier); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file2" + identifier), "file2" + identifier + " is displayed"); - - LOG.info("STEP 3 - Fill in the search field with for e.g. name: testcontent_10.10.pdf and click \"Search\" button"); - toolbar.search("testcontent_10." + identifier + ".pdf"); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("testcontent_10." + identifier + ".pdf"), "testcontent_10." + identifier + ".pdf is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier) + .assertCreatedDataIsDisplayed("file2" + identifier); + + log.info("STEP 3 - Fill in the search field with for e.g. name: testcontent_10.10.pdf and click \"Search\" button"); + toolbar + .search("testcontent_10." + identifier + ".pdf"); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("testcontent_10." + identifier + ".pdf"); } @TestRail (id = "C5937") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyDescription() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); + List sitePages = new ArrayList<>(); sitePages.add(DashboardCustomization.Page.BLOG); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); siteService.addPagesToSite(userName, password, siteName, sitePages); sitePagesService.createBlogPost(userName, password, siteName, "file1" + identifier, "", false, null); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); - documentLibraryPage.clickCreateButton(); - documentLibraryPage.clickFolderLink(); - newContentDialog.fillInDetails("file2" + identifier, "", "file1" + identifier); - newContentDialog.clickSave(); - documentLibraryPage.navigate(siteName); - - LOG.info("STEP 1 - Fill in search field with \"description:X\" (e.g: \"description:file1\") and click \"Search\" button"); + authenticateUsingLoginPage(user.get()); + documentLibraryPage + .navigate(siteName) + .clickCreateButton(); + documentLibraryPage + .clickFolderLink(); + newContentDialog + .fillInDetails("file2" + identifier, "", "file1" + identifier) + .clickSave(); + documentLibraryPage + .navigate(siteName); + + log.info("STEP 1 - Fill in search field with \"description:X\" (e.g: \"description:file1\") and click \"Search\" button"); toolbar.search("description:file1" + identifier); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file2" + identifier), "file2" + identifier + " is displayed"); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file2" + identifier); - LOG.info("STEP 2 - Fill in search field with a name (e.g: \"file1\") and click \"Search\" button"); + log.info("STEP 2 - Fill in search field with a name (e.g: \"file1\") and click \"Search\" button"); toolbar.search("file1" + identifier); - // getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file2" + identifier), "file2" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier) + .assertCreatedDataIsDisplayed("file2" + identifier); } @TestRail (id = "C5938") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyCreated() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + ".txt", ""); - setupAuthenticatedSession(userName, password); + authenticateUsingLoginPage(user.get()); siteDashboardPage.navigate(siteName); - LOG.info("STEP 1 - Fill in search field with \"created:today\""); + log.info("STEP 1 - Fill in search field with \"created:today\""); toolbar.search("created:today"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn(siteName); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); + searchPage + .clickSearchInDropdown() + .selectOptionFromSearchIn(siteName) + .pageRefresh() + .assertCreatedDataIsDisplayed(identifier + ".txt"); - LOG.info("STEP 2 - Enter a query using different date formats and click Search button"); + log.info("STEP 2 - Enter a query using different date formats and click Search button"); toolbar.search("created:" + DataUtil.formatDate(new Date(), "yyyy-MMM-dd'T'")); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn("All Sites"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn(siteName); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); - - LOG.info("STEP 3 - Enter a query using: now/NOW(today/TODAY)\n" + "(e.g: created: [\"2010-01-12\" TO TODAY], created: [\"2010-01-12\" TO NOW] )\n" + searchPage + .clickSearchInDropdown() + .selectOptionFromSearchIn("All Sites") + .clickSearchInDropdown() + .selectOptionFromSearchIn(siteName) + .pageRefresh() + .assertCreatedDataIsDisplayed(identifier + ".txt"); + + log.info("STEP 3 - Enter a query using: now/NOW(today/TODAY)\n" + "(e.g: created: [\"2010-01-12\" TO TODAY], created: [\"2010-01-12\" TO NOW] )\n" + "and click Search button"); - toolbar.search("created:[\"2010-01-12\" TO NOW]"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn("All Sites"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn(siteName); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + toolbar + .search("created:[\"2010-01-12\" TO NOW]"); + searchPage + .clickSearchInDropdown() + .selectOptionFromSearchIn("All Sites") + .clickSearchInDropdown() + .selectOptionFromSearchIn(siteName) + .pageRefresh() + .assertCreatedDataIsDisplayed(identifier + ".txt"); } @TestRail (id = "C5939") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyModified() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, identifier + ".txt", ""); - setupAuthenticatedSession(userName, password); - siteDashboardPage.navigate(siteName); - - LOG.info("STEP 1 - Fill in search field with \"modified:today\""); - toolbar.search("modified:today"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn(siteName); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); - - LOG.info("STEP 2 - Enter a query using different date formats and click Search button"); - toolbar.search("modified:" + DataUtil.formatDate(new Date(), "yyyy-MM-dd")); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn("All Sites"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn(siteName); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); - - LOG.info("STEP 3 - Enter a query using: now/NOW(today/TODAY)\n" + "(e.g: created: [\"2010-01-12\" TO TODAY], created: [\"2010-01-12\" TO NOW] )\n" + authenticateUsingLoginPage(user.get()); + siteDashboardPage + .navigate(siteName); + + log.info("STEP 1 - Fill in search field with \"modified:today\""); + toolbar.search("modified:today").clickSearchInDropdown().clickSearchInDropdown(); + searchPage + .clickSearchInDropdown() + .selectOptionFromSearchIn(siteName) + .pageRefresh() + .selectOptionFromSearchIn(siteName) + .pageRefresh() + .assertCreatedDataIsDisplayed(identifier + ".txt"); + + log.info("STEP 2 - Enter a query using different date formats and click Search button"); + toolbar + .search("modified:" + DataUtil.formatDate(new Date(), "yyyy-MM-dd")); + searchPage + .clickSearchInDropdown() + .selectOptionFromSearchIn("All Sites") + .clickSearchInDropdown() + .selectOptionFromSearchIn(siteName) + .pageRefresh().assertCreatedDataIsDisplayed(identifier + ".txt"); + + log.info("STEP 3 - Enter a query using: now/NOW(today/TODAY)\n" + "(e.g: created: [\"2010-01-12\" TO TODAY], created: [\"2010-01-12\" TO NOW] )\n" + "and click Search button"); - toolbar.search("modified:[\"2010-01-12\" TO NOW]"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn("All Sites"); - searchPage.clickSearchInDropdown(); - searchPage.selectOptionFromSearchIn(siteName); + toolbar + .search("modified:[\"2010-01-12\" TO NOW]"); + searchPage + .clickSearchInDropdown() + .selectOptionFromSearchIn("All Sites") + .clickSearchInDropdown() + .selectOptionFromSearchIn(siteName) + .pageRefresh().assertCreatedDataIsDisplayed(identifier + ".txt"); // assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + // assertTrue(searchPage.isResultFound(identifier + ".txt"), identifier + ".txt" + " is displayed"); } @TestRail (id = "C5940") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyCreator() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); List sitePages = new ArrayList<>(); sitePages.add(DashboardCustomization.Page.WIKI); @@ -530,8 +628,6 @@ public void searchByPropertyCreator() sitePages.add(DashboardCustomization.Page.CALENDAR); sitePages.add(DashboardCustomization.Page.LINKS); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); siteService.addPagesToSite(userName, password, siteName, sitePages); contentService.createFolder(userName, password, "folder" + identifier, siteName); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file" + identifier, ""); @@ -542,31 +638,29 @@ public void searchByPropertyCreator() sitePagesService.createDiscussion(userName, password, siteName, "discussion" + identifier, "", null); sitePagesService.createLink(userName, password, siteName, "link" + identifier, "https://www.alfresco.com", "", false, null); - setupAuthenticatedSession(userName, password); + authenticateUsingLoginPage(user.get()); - LOG.info("STEP 1 - Fill in search field with \"creator:username\" and click Search button"); + log.info("STEP 1 - Fill in search field with \"creator:username\" and click Search button"); toolbar.search("creator:" + userName); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("folder" + identifier), "folder" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file" + identifier), "file" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki" + identifier), "wiki" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog" + identifier), "blog" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("calendar" + identifier), "calendar" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion" + identifier), "discussion" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("link" + identifier), "link" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("folder" + identifier) + .assertCreatedDataIsDisplayed("file" + identifier) + .assertCreatedDataIsDisplayed("wiki" + identifier) + .assertCreatedDataIsDisplayed("blog" + identifier) + .assertCreatedDataIsDisplayed("calendar" + identifier) + .assertCreatedDataIsDisplayed("discussion" + identifier) + .assertCreatedDataIsDisplayed("link" + identifier); } @TestRail (id = "C5941") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByPropertyModifier() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); List sitePages = new ArrayList<>(); sitePages.add(DashboardCustomization.Page.WIKI); @@ -574,8 +668,6 @@ public void searchByPropertyModifier() sitePages.add(DashboardCustomization.Page.CALENDAR); sitePages.add(DashboardCustomization.Page.LINKS); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); siteService.addPagesToSite(userName, password, siteName, sitePages); contentService.createFolder(userName, password, "folder" + identifier, siteName); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file" + identifier, ""); @@ -586,31 +678,29 @@ public void searchByPropertyModifier() sitePagesService.createDiscussion(userName, password, siteName, "discussion" + identifier, "", null); sitePagesService.createLink(userName, password, siteName, "link" + identifier, "https://www.alfresco.com", "", false, null); - setupAuthenticatedSession(userName, password); + authenticateUsingLoginPage(user.get()); - LOG.info("STEP 1 - Fill in search field with \"modifier:username\" and click Search button"); + log.info("STEP 1 - Fill in search field with \"modifier:username\" and click Search button"); toolbar.search("modifier:" + userName); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("folder" + identifier), "folder" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file" + identifier), "file" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki" + identifier), "wiki" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog" + identifier), "blog" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("calendar" + identifier), "calendar" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion" + identifier), "discussion" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("link" + identifier), "link" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); - } + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("folder" + identifier) + .assertCreatedDataIsDisplayed("file" + identifier) + .assertCreatedDataIsDisplayed("wiki" + identifier) + .assertCreatedDataIsDisplayed("blog" + identifier) + .assertCreatedDataIsDisplayed("calendar" + identifier) + .assertCreatedDataIsDisplayed("discussion" + identifier) + .assertCreatedDataIsDisplayed("link" + identifier); + } @TestRail (id = "C5950") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH}) public void searchByPropertyText() { + siteModel.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); String identifier = RandomData.getRandomAlphanumeric(); - String userName = "User1" + identifier; - String siteName = "Site1" + identifier; + String userName = user.get().getUsername(); + String siteName = siteModel.get().getId(); String word = "word" + identifier; List sitePages = new ArrayList<>(); @@ -618,59 +708,55 @@ public void searchByPropertyText() sitePages.add(DashboardCustomization.Page.BLOG); sitePages.add(DashboardCustomization.Page.DISCUSSIONS); - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); + siteService.addPagesToSite(userName, password, siteName, sitePages); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file1" + identifier, word); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file2" + identifier, "2" + word); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file2" + identifier, "2 " + word); contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file3" + identifier, word + "3"); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file4" + identifier, "4" + word + "4"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, "file4" + identifier, "4 " + word + "4"); sitePagesService.createWiki(userName, password, siteName, "wiki1" + identifier, word, null); - sitePagesService.createWiki(userName, password, siteName, "wiki2" + identifier, "2" + word, null); + sitePagesService.createWiki(userName, password, siteName, "wiki2" + identifier, "2 " + word, null); sitePagesService.createWiki(userName, password, siteName, "wiki3" + identifier, word + "3", null); - sitePagesService.createWiki(userName, password, siteName, "wiki4" + identifier, "4" + word + "4", null); + sitePagesService.createWiki(userName, password, siteName, "wiki4" + identifier, "4 " + word + "4", null); sitePagesService.createBlogPost(userName, password, siteName, "blog1" + identifier, word, false, null); - sitePagesService.createBlogPost(userName, password, siteName, "blog2" + identifier, "2" + word, false, null); + sitePagesService.createBlogPost(userName, password, siteName, "blog2" + identifier, "2 " + word, false, null); sitePagesService.createBlogPost(userName, password, siteName, "blog3" + identifier, word + "3", false, null); - sitePagesService.createBlogPost(userName, password, siteName, "blog4" + identifier, "4" + word + "4", false, null); + sitePagesService.createBlogPost(userName, password, siteName, "blog4" + identifier, "4 " + word + "4", false, null); sitePagesService.createDiscussion(userName, password, siteName, "discussion1" + identifier, word, null); - sitePagesService.createDiscussion(userName, password, siteName, "discussion2" + identifier, "2" + word, null); + sitePagesService.createDiscussion(userName, password, siteName, "discussion2" + identifier, "2 " + word, null); sitePagesService.createDiscussion(userName, password, siteName, "discussion3" + identifier, word + "3", null); - sitePagesService.createDiscussion(userName, password, siteName, "discussion4" + identifier, "4" + word + "4", null); + sitePagesService.createDiscussion(userName, password, siteName, "discussion4" + identifier, "4 " + word + "4", null); - setupAuthenticatedSession(userName, password); + authenticateUsingLoginPage(user.get()); - LOG.info("STEP 1 - Fill in search field with 'TEXT:" + word + "' and click 'Search' button"); + log.info("STEP 1 - Fill in search field with 'TEXT:" + word + "' and click 'Search' button"); toolbar.search("TEXT:" + word); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki1" + identifier), "wiki1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog1" + identifier), "blog1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion1" + identifier), "discussion1" + identifier + " is displayed"); - - LOG.info("STEP 2 - Fill in search field with \"TEXT:*word*\" and click Search button"); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier) + .assertCreatedDataIsDisplayed("wiki1" + identifier) + .assertCreatedDataIsDisplayed("blog1" + identifier) + .assertCreatedDataIsDisplayed("discussion1" + identifier); + + log.info("STEP 2 - Fill in search field with \"TEXT:*word*\" and click Search button"); toolbar.search("TEXT:*" + word + "*"); - //getBrowser().waitUntilWebElementIsDisplayedWithRetry(searchPage.searchResult, (int) properties.getImplicitWait()); -// assertEquals(searchPage.getPageTitle(), language.translate("searchPage.pageTitle"), "Page title"); - assertTrue(searchPage.isResultFound("file1" + identifier), "file1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file2" + identifier), "file2" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file3" + identifier), "file3" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("file4" + identifier), "file4" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki1" + identifier), "wiki1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki2" + identifier), "wiki2" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki3" + identifier), "wiki3" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("wiki4" + identifier), "wiki4" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog1" + identifier), "blog1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog2" + identifier), "blog2" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog3" + identifier), "blog3" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("blog4" + identifier), "blog4" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion1" + identifier), "discussion1" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion2" + identifier), "discussion2" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion3" + identifier), "discussion3" + identifier + " is displayed"); - assertTrue(searchPage.isResultFound("discussion4" + identifier), "discussion4" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); + searchPage + .pageRefresh() + .assertCreatedDataIsDisplayed("file1" + identifier) + .assertCreatedDataIsDisplayed("file2" + identifier) + .assertCreatedDataIsDisplayed("file3" + identifier) + .assertCreatedDataIsDisplayed("file4" + identifier) + .assertCreatedDataIsDisplayed("wiki1" + identifier) + .assertCreatedDataIsDisplayed("wiki2" + identifier) + .assertCreatedDataIsDisplayed("wiki3" + identifier) + .assertCreatedDataIsDisplayed("wiki4" + identifier) + .assertCreatedDataIsDisplayed("blog1" + identifier) + .assertCreatedDataIsDisplayed("blog2" + identifier) + .assertCreatedDataIsDisplayed("blog3" + identifier) + .assertCreatedDataIsDisplayed("blog4" + identifier) + .assertCreatedDataIsDisplayed("discussion1" + identifier) + .assertCreatedDataIsDisplayed("discussion2" + identifier) + .assertCreatedDataIsDisplayed("discussion3" + identifier) + .assertCreatedDataIsDisplayed("discussion4" + identifier); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchResultsPageTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchResultsPageTest.java index d118efa642..9c271a57fc 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchResultsPageTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchResultsPageTest.java @@ -5,143 +5,179 @@ import java.util.Arrays; import java.util.List; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.searching.SearchManagerPage; import org.alfresco.po.share.searching.SearchPage; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.profile.UserProfilePage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.utility.data.RandomData; -import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.*; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +@Slf4j /** * Created by Mirela Tifui on 1/31/2018. */ -public class FacetedSearchResultsPageTest extends ContextAwareWebTest +public class FacetedSearchResultsPageTest extends BaseTest { - //@Autowired SearchPage searchPage; - //@Autowired Toolbar toolbar; - //@Autowired DocumentDetailsPage documentDetailsPage; - //@Autowired DocumentLibraryPage documentLibraryPage; - //@Autowired + AdvancedSearchPage advancedSearchPage; SearchManagerPage searchManagerPage; - //@Autowired UserProfilePage userProfilePage; - - private String userName = "user" + RandomData.getRandomAlphanumeric(); + private CreateContentPage createContent; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); private String docName = "testDoc" + RandomData.getRandomAlphanumeric(); - private String siteName = "siteName" + RandomData.getRandomAlphanumeric(); - private String documentContent = "docContent"; + private String missingDoc = "t38ta@"; + private String searchTerm = "facetedSearch_"; + private String searchTerm1 = "ipsum"; + private FileModel testFile; private String folderName = "folderName" + RandomData.getRandomAlphanumeric(); - private String docNameFS0 = "facetedSearch_" + RandomData.getRandomAlphanumeric(); - private String docNameFS1 = "facetedSearch_" + RandomData.getRandomAlphanumeric(); - private String docNameFS2 = "facetedSearch_" + RandomData.getRandomAlphanumeric(); - @BeforeClass (alwaysRun = true) + + @BeforeMethod (alwaysRun = true) public void testSetup() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, "name", "surname"); - groupService.addUserToGroup(adminUser, adminPassword, "ALFRESCO_SEARCH_ADMINISTRATORS", userName); - siteService.create(userName, password, domain, siteName, "test site", SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName, documentContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.MSWORD, docNameFS0, documentContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.MSWORD, docNameFS1, documentContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docNameFS2, documentContent); - contentService.createFolder(userName, password, folderName, siteName); - setupAuthenticatedSession(userName, password); + log.info("Precondition2: Test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + log.info("Precondition3: Test Site is created"); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + log.info("Precondition4: Creating random files in the site under document library."); + testFile = FileModel.getRandomFileModel(FileType.MSWORD2007); + getCmisApi().usingSite(site.get()).createFile(testFile).assertThat().existsInRepo(); + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + searchPage = new SearchPage(webDriver); + searchManagerPage = new SearchManagerPage(webDriver); + userProfilePage = new UserProfilePage(webDriver); + toolbar = new Toolbar(webDriver); + createContent = new CreateContentPage(webDriver); + + } - @AfterClass (alwaysRun = true) + @AfterMethod (alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userName); - contentService.deleteDocument(adminUser, adminPassword, siteName, docName); - contentService.deleteDocument(adminUser, adminPassword, siteName, docNameFS0); - contentService.deleteDocument(adminUser, adminPassword, siteName, docNameFS1); - contentService.deleteDocument(adminUser, adminPassword, siteName, docNameFS2); - siteService.delete(adminUser, adminPassword, domain, siteName); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testSearchEmptyResult() - { - String missingDoc = "t38ta@"; - toolbar.search(missingDoc); - searchPage.navigateByMenuBar(); - searchPage.setSearchExpression(missingDoc); - Assert.assertFalse(searchPage.isResultFound(missingDoc), missingDoc + " is displayed"); - Assert.assertEquals(searchPage.getNoSearchResultsText(), language.translate("searchPage.searchSuggestionNoSearchResuls"), "no search result suggestion not correct"); + public void testSearchEmptyResult() { + documentLibraryPage + .navigate(site.get()); + toolbar + .search(missingDoc); + searchPage + .navigate(); + searchPage + .setSearchExpression(missingDoc); + Assert.assertEquals(searchPage.getNoSearchResultsText(), language.newTranslate("Search suggestions:\n" + + "Check your spelling.\n" + + "Using fewer words in the search may increase the number of results.\n" + + "You can search for any property of an item including any tags, the description, its content, dates, creator, and modifier."), "no search result suggestion not correct"); Assert.assertEquals(searchPage.getNumberOfResultsText(), "0 - results found", "Results number is not 0"); - cleanupAuthenticatedSession(); + } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testSelectSearchResultByName() { - LOG.info("Step 1: Search for document"); - toolbar.search(docName); + log.info("Step 1: Search for document"); + documentLibraryPage + .navigate(site.get()); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(docName) + .clickCreate(); + documentLibraryPage + .navigate(); + toolbar + .searchAndEnterAgain(docName); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName), docName + " is not displayed"); - - LOG.info("Step 2: Click document name and check that correct document is opened on Document Details page"); - searchPage.clickContentName(docName); + log.info("Step 2: Click document name and check that correct document is opened on Document Details page"); + searchPage + .clickOnContentName(docName); Assert.assertEquals(documentDetailsPage.getFileName(), docName, "Document title is not correct"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testSelectSearchResultOfTypeFolder() - { - LOG.info("Step 1: Search for folder"); - toolbar.search(folderName); + public void testSelectSearchResultOfTypeFolder() { + log.info("Step 1: Search for folder"); + documentLibraryPage + .navigate(site.get()); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.FOLDER); + createContent + .typeName(folderName) + .clickCreate(); + documentLibraryPage + .navigate(); + toolbar + .searchAndEnterAgain(folderName); Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName), folderName + " is not displayed"); - - LOG.info("Step 2: Click folder name"); - searchPage.clickContentName(folderName); - assertEquals(documentLibraryPage.getBreadcrumbList(), Arrays.asList("Documents", folderName).toString()); + log.info("Step 2: Click folder name"); + searchPage + .clickOnContentName(folderName); + assertEquals(documentLibraryPage.getBreadcrumbList(), Arrays.asList(folderName).toString()); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testPagination() { - LOG.info("Step 1: Search for all results containing letter a"); - toolbar.search("a"); + log.info("Step 1: Search for all results containing letter a"); + documentLibraryPage + .navigate(site.get()); + toolbar + .search("a"); Assert.assertFalse(searchPage.getNumberOfResultsText().equals("0"), "Results are not returned"); String searchResultNumber = searchPage.getNumberOfResultsText().substring(0, 2); int searchResultsNo = Integer.parseInt(searchResultNumber); - searchPage.scrollSome(50); - searchPage.scrollToPageBottom(); System.out.println("number of results: " + searchResultNumber); int currentResultNo = Integer.parseInt(searchPage.getNumberOfResultsText().substring(0, 2)); - Assert.assertTrue(currentResultNo >= searchResultsNo, "Result number is lower thant the one before scrolling"); + Assert.assertTrue(currentResultNo >= searchResultsNo, "Result number is lower than the one before scrolling"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testSearchSortDescTest() { - setupAuthenticatedSession(userName, password); - LOG.info("Step 1: Search for files containing 'ipsum'"); - toolbar.search("a"); - searchPage.clickDetailedView(); - searchPage.clickSortDropdown(); - searchPage.clickSortDropdownOption("Modified date"); + + log.info("Step 1: Search for files containing 'ipsum'"); + documentLibraryPage + .navigate(site.get()); + toolbar + .search("a"); + searchPage + .clickDetailedView(); + searchPage + .clickSortDropdown(); + searchPage + .clickSortDropdownOption("Modified date"); Assert.assertTrue(searchPage.isSortOrderToggleButtonDisplayed(), "Sort button is not displayed"); Assert.assertTrue(searchPage.isAscendingOrderSet(), "Ascending order is not set by default"); Assert.assertFalse(searchPage.getNumberOfResultsText().equals("0 - results found"), "No results are returned after sort"); Assert.assertFalse(searchPage.getResultsListSize() == 0, "No results are displayed"); - LOG.info("Step 2: Click toggle button"); - searchPage.clickToggleButton(); + log.info("Step 2: Click toggle button"); + searchPage + .clickToggleButton(); Assert.assertTrue(searchPage.isDescendingOrderSet(), "Descending order is not set"); Assert.assertFalse(searchPage.getNumberOfResultsText().equals("0 - results found"), "No results are returned after sort"); Assert.assertFalse(searchPage.getResultsListSize() == 0, "No results are displayed"); @@ -150,12 +186,24 @@ public void testSearchSortDescTest() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testSearchSortTest() { - LOG.info("Step 1: Search for files, sort by name and check that the list of results is arranged by name"); - String searchTerm = "facetedSearch"; - toolbar.search(searchTerm); - Assert.assertTrue(searchPage.isAnyFileReturnedInResults()); - searchPage.clickSortDropdown(); - searchPage.clickSortDropdownOption("Name"); + log.info("Step 1: Search for files, sort by name and check that the list of results is arranged by name"); + documentLibraryPage + .navigate(site.get()); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(searchTerm) + .clickCreate(); + documentLibraryPage + .navigate(); + toolbar + .searchAndEnterAgain(searchTerm); + searchPage + .assertCreatedDataIsDisplayed(searchTerm); + searchPage + .clickSortDropdown(); + searchPage + .clickSortDropdownOption("Name"); Assert.assertTrue(searchPage.isSortOrderToggleButtonDisplayed(), "Sort button is not displayed"); Assert.assertEquals(searchPage.getSortFilter(), "Name", "Name is not the sort filter selected"); Assert.assertFalse(searchPage.getResultsListSize() == 0, "No results are displayed"); @@ -165,9 +213,13 @@ public void testSearchSortTest() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testCheckAvailableSortFilters() { - LOG.info("Step 1: Check that all expected filters are available on the search results page."); - toolbar.search("a"); - searchPage.clickSortDropdown(); + log.info("Step 1: Check that all expected filters are available on the search results page."); + documentLibraryPage + .navigate(site.get()); + toolbar + .search("a"); + searchPage + .clickSortDropdown(); List availableOptions = searchPage.getAvailableFilters(); Assert.assertTrue(availableOptions.contains("Relevance"), "Relevance is not available"); Assert.assertTrue(availableOptions.contains("Name"), "Name is not available"); @@ -181,92 +233,130 @@ public void testCheckAvailableSortFilters() Assert.assertTrue(availableOptions.contains("Size"), "Size is not available"); Assert.assertTrue(availableOptions.contains("Mime type"), "Mime type is not available"); Assert.assertTrue(availableOptions.contains("Type"), "Type is not available"); - cleanupAuthenticatedSession(); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testGetResultCount() { - LOG.info("Step 1: Search for existing files and confirm that the number of displayed results is correct."); - String searchTerm = "facetedSearch_"; - toolbar.search(searchTerm); + log.info("Step 1: Search for existing files and confirm that the number of displayed results is correct."); + documentLibraryPage + .navigate(site.get()); + documentLibraryPage + .clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent + .typeName(searchTerm) + .clickCreate(); + documentLibraryPage + .navigate(); + toolbar + .searchAndEnterAgain(searchTerm); System.out.print("List size: " + searchPage.getResultsListSize()); - Assert.assertEquals((searchPage.getNumberOfResultsText().substring(0, 1)), "4", "The number of displayed results is not correct."); - Assert.assertEquals(searchPage.getResultsListSize(), 4, "Results number is not correct"); + Assert.assertEquals((searchPage.getNumberOfResultsText().substring(0, 1)), "1", "The number of displayed results is not correct."); + Assert.assertEquals(searchPage.getResultsListSize(), 1, "Results number is not correct"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testSelectFacet() { - LOG.info("Step 1: Search for files then filter by mimeType, check that results are filtered correctly"); - toolbar.search("facetedSearch"); - searchPage.selectFileTypeFilter("Microsoft Word"); - Assert.assertEquals(searchPage.getNumberOfResultsText().substring(0, 1), "2", "Results are not filtered correctly"); + log.info("Step 1: Search for files then filter by mimeType, check that results are filtered correctly"); + documentLibraryPage + .navigate(site.get()); + toolbar + .searchAndEnterAgain(testFile.getName()); + searchPage + .selectFileTypeFilter("Microsoft Word 2007"); + Assert.assertEquals(searchPage.getNumberOfResultsText().substring(0, 1), "1", "Results are not filtered correctly"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testSearchSelectViewTest() - { - setupAuthenticatedSession(userName, password); - LOG.info("Step 1: Search for file and check that results are returned in detailed view by default and that changing the view will not affect the results displayed"); - String searchTerm = "ipsum"; - toolbar.search(searchTerm); + public void testSearchSelectViewTest() { + + log.info("Step 1: Search for file and check that results are returned in detailed view by default and that changing the view will not affect the results displayed"); + documentLibraryPage + .navigate(site.get()); + toolbar + .search(searchTerm1); System.out.println("List size: " + searchPage.getResultsListSize()); Assert.assertTrue(searchPage.getResultsListSize() != 0, "No results are displayed"); Assert.assertTrue(searchPage.isSearchResultsListInDetailedView(), "Detailed view is not the active view"); - searchPage.clickGalleryView(); + searchPage + .clickGalleryView(); Assert.assertTrue(searchPage.isSearchResultsListInGalleryView(), "Detailed view is not the active view"); Assert.assertTrue(searchPage.getGalleryViewResultsNumber() != 0, "No results are displayed"); - searchPage.clickDetailedView(); + searchPage + .clickDetailedView(); Assert.assertTrue(searchPage.getResultsListSize() != 0, "No results are displayed"); Assert.assertTrue(searchPage.isSearchResultsListInDetailedView(), "Detailed view is not the active view"); - searchPage.clickGalleryView(); + searchPage + .clickGalleryView(); Assert.assertTrue(searchPage.getGalleryViewResultsNumber() != 0, "No results are displayed"); Assert.assertTrue(searchPage.isSearchResultsListInGalleryView(), "Gallery view is not the active view"); - searchPage.openFileFromGalleryView("Project Overview.ppt"); + searchPage + .openFileFromGalleryView("Project Overview.ppt"); Assert.assertEquals(documentDetailsPage.getFileName(), "Project Overview.ppt"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testClickImagePreviewTest() - { - LOG.info("Step 1: Search for .jpg extension and check that the image is previewed from the search results"); - toolbar.search(".jpg"); + public void testClickImagePreviewTest() { + log.info("Step 1: Search for .jpg extension and check that the image is previewed from the search results"); + documentLibraryPage + .navigate(site.get()); + toolbar + .search(".jpg"); Assert.assertTrue(searchPage.isResultFoundWithRetry("graph.JPG")); - searchPage.clickContentThumbnailByName("graph.JPG"); + searchPage + .clickContentThumbnailByName("graph.JPG"); Assert.assertEquals(searchPage.getPreviewedImageName(), "graph.JPG"); - searchPage.closePicturePreview(); + searchPage + .closePicturePreview(); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testFilePreview() { - LOG.info("Step 1: Search for .jpg extension and check that the document is previewed from the search results"); - toolbar.search("ipsum"); + log.info("Step 1: Search for .jpg extension and check that the document is previewed from the search results"); + documentLibraryPage + .navigate(site.get()); + toolbar + .search("ipsum"); Assert.assertTrue(searchPage.isResultFoundWithRetry("Project Overview.ppt")); - searchPage.clickContentThumbnailByName("Project Overview.ppt"); + searchPage + .clickContentThumbnailByName("Project Overview.ppt"); Assert.assertTrue(searchPage.isContentPreviewed("Project Overview.ppt"), "File is not previewed"); - searchPage.closeFilePreview(); + searchPage + .closeFilePreview(); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testClickConfigureSearchTest() { - setupAuthenticatedSession(userName, password); - LOG.info("Step 1: Check that user that has been added to search administrators can access the Search Manager page from the Search Results page"); - toolbar.search("ipsum"); + + log.info("Step 1: Check that user that has been added to search administrators can access the Search Manager page from the Search Results page"); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + documentLibraryPage + .navigate(site.get()); + toolbar + .search(searchTerm1); + searchPage + .navigate(); Assert.assertTrue(searchPage.isConfigureSearchButtonDisplayed()); - searchPage.clickSearchManagerLink(); - Assert.assertTrue(getBrowser().getTitle().equals("Alfresco » Search Manager")); + searchPage + .clickSearchManagerLink(); + Assert.assertTrue(webDriver.get().getTitle().equals("Alfresco » Search Manager")); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testClickLinksOnSearchItemTest() - { - LOG.info("Step 1: From the search page click on the modified by link"); - toolbar.search("ipsum"); - searchPage.clickModifiedBy("Mike Jackson"); - Assert.assertEquals(getBrowser().getTitle(), "Alfresco » User Profile Page", "User is not redirected to the User Profile page"); -// Assert.assertEquals(userProfilePage.assertUsernameEquals(), "Mike Jackson", "User name not as expected"); + public void testClickLinksOnSearchItemTest() { + log.info("Step 1: From the search page click on the modified by link"); + documentLibraryPage + .navigate(site.get()); + toolbar + .search("ipsum"); + searchPage + .clickModifiedBy("Mike Jackson"); + Assert.assertEquals(webDriver.get().getTitle(), "Alfresco » User Profile Page", "User is not redirected to the User Profile page"); + Assert.assertTrue(userProfilePage.assertCheckUserName(), "User Name does not match"); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareFileOrFolderTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareFileOrFolderTests.java index e10733ef6e..e682ebbe8d 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareFileOrFolderTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareFileOrFolderTests.java @@ -1,313 +1,396 @@ package org.alfresco.share.searching.facetedSearch; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; + +import org.alfresco.po.share.DeleteDialog; import org.alfresco.po.share.alfrescoContent.workingWithFilesAndFolders.EditPropertiesDialog; -import org.alfresco.po.share.dialogWindows.ConfirmDeletionDialogShare; +import org.alfresco.po.share.dialogWindows.ConfirmDeletionDialogForShare; import org.alfresco.po.share.searching.AdvancedSearchPage; import org.alfresco.po.share.searching.SearchPage; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.ItemActions; import org.alfresco.po.share.toolbar.Toolbar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +import static org.alfresco.share.TestUtils.FILE_CONTENT1; + +@Slf4j /** * Created by Mirela Tifui on 12/27/2017. */ -public class FacetedSearchShareFileOrFolderTests extends ContextAwareWebTest +public class FacetedSearchShareFileOrFolderTests extends BaseTest { - //@Autowired SearchPage searchPage; - //@Autowired Toolbar toolbar; - @Autowired - ConfirmDeletionDialogShare confirmDeletionDialog; - //@Autowired AdvancedSearchPage advancedSearchPage; - //@Autowired DocumentLibraryPage documentLibraryPage; - //@Autowired + ConfirmDeletionDialogForShare confirmDeletionDialog; EditPropertiesDialog editPropertiesDialog; - - private String userName = "facetedSearch" + RandomData.getRandomAlphanumeric(); - private String siteName = "searchSite" + RandomData.getRandomAlphanumeric(); + private String testSite; + private FileModel testFile; + private FolderModel testFolder; + private DeleteDialog deleteDialog; private String docName = "facetedSearchDoc" + RandomData.getRandomAlphanumeric(); + private String fileName = "facetedSearchDoc_" + RandomData.getRandomAlphanumeric(); private String docContent = "file_content"; - private String folderName = "facetedFolder" + RandomData.getRandomAlphanumeric(); + private String folderName = "facetedFolder_" + RandomData.getRandomAlphanumeric(); private String folderTitle = "title_" + RandomData.getRandomAlphanumeric(); private String description = "This_is_a_test_folder"; private String fileTitle = "file_" + RandomData.getRandomAlphanumeric(); private String fileDescription = "file_description"; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void testSetup() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, "faceted", TestGroup.SEARCH); - siteService.create(userName, password, domain, siteName, "FacetedSearchSite", SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName, docContent); - contentService.createFolder(userName, password, folderName, siteName); - setupAuthenticatedSession(userName, password); - documentLibraryPage.navigate(siteName); - documentLibraryPage.selectItemAction(folderName, ItemActions.EDIT_PROPERTIES); + log.info("Precondition1: Any test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + + authenticateUsingLoginPage(user.get()); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + testSite = site.get().getTitle(); + + log.info("Precondition4: Creating random files in the site under document library."); + testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, FILE_CONTENT1); + getCmisApi().authenticateUser(user.get()).usingSite(site.get()).createFile(testFile).assertThat().existsInRepo(); + + testFolder = FolderModel.getRandomFolderModel(); + getCmisApi().usingSite(site.get()).createFolder(testFolder).assertThat().existsInRepo(); + + documentLibraryPage = new DocumentLibraryPage(webDriver); + editPropertiesDialog = new EditPropertiesDialog(webDriver); + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); + deleteDialog = new DeleteDialog(webDriver); + advancedSearchPage = new AdvancedSearchPage(webDriver); + confirmDeletionDialog = new ConfirmDeletionDialogForShare(webDriver); + + documentLibraryPage.navigate(testSite); + documentLibraryPage.selectItemActionFormFirstThreeAvailableOptions(testFolder.getName(), ItemActions.EDIT_PROPERTIES); + editPropertiesDialog.setName(folderName); editPropertiesDialog.setTitle(folderTitle); editPropertiesDialog.setDescription(description); editPropertiesDialog.clickSave(); - documentLibraryPage.selectItemAction(docName, ItemActions.EDIT_PROPERTIES); + documentLibraryPage.selectItemActionFormFirstThreeAvailableOptions(testFile.getName(), ItemActions.EDIT_PROPERTIES); + editPropertiesDialog.setName(fileName); editPropertiesDialog.setTitle(fileTitle); editPropertiesDialog.setDescription(fileDescription); editPropertiesDialog.clickSave(); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void testCleanup() { - userService.delete(adminUser, adminPassword, userName); - siteService.delete(adminUser, adminPassword, domain, siteName); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); } - @Test (groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH }) + @Test(groups = { TestGroup.SHARE, "Acceptance", TestGroup.SEARCH }) public void testSelectActionDeleteConfirmCancel() { - toolbar.search(docName); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - LOG.info("Step 1: Select document and select Delete, on the Confirm deletion dialog click close to close dialog"); - searchPage.clickCheckbox(docName); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Delete"); - confirmDeletionDialog.clickCloseButton(); - Assert.assertFalse(searchPage.isConfirmDeletionDialogDisplayed(), "Confirm deletion dialog is still displayed"); - toolbar.search(docName); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - LOG.info("Step 2: Select document and select Delete, on the Confirm deletion dialog click cancel to cancel deletion"); - searchPage.clickCheckbox(docName); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Delete"); - confirmDeletionDialog.clickCancelButton(); - Assert.assertFalse(searchPage.isConfirmDeletionDialogDisplayed(), "Confirm deletion dialog is still displayed"); - toolbar.search(docName); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); + toolbar + .search(fileName); + searchPage + .assertCreatedDataIsDisplayed(fileName); + + log.info("Step 1: Select document and select Delete, on the Confirm deletion dialog click close to close dialog"); + searchPage + .clickCheckbox(fileName) + .clickSelectedItemsDropdown() + .clickOptionFromSelectedItemsDropdown("Delete"); + confirmDeletionDialog + .clickCloseButton(); + searchPage + .assertConfirmDeletionDialogNotDisplayed(); + toolbar + .search(fileName); + searchPage + .assertCreatedDataIsDisplayed(fileName); + + log.info("Step 2: Select document and select Delete, on the Confirm deletion dialog click cancel to cancel deletion"); + searchPage + .clickCheckbox(fileName) + .clickSelectedItemsDropdown() + .clickOptionFromSelectedItemsDropdown("Delete"); + confirmDeletionDialog + .clickCancelButton(); + searchPage + .assertConfirmDeletionDialogNotDisplayed(); + toolbar + .search(fileName).assertCreatedDataIsDisplayed(fileName); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedSearchFileByName() { - LOG.info("Step 1: Search by name and check that document name is highlighted in search results"); - toolbar.search(docName); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); + log.info("Step 1: Search by name and check that document name is highlighted in search results"); + toolbar + .search(fileName); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertCreatedDataIsDisplayed(fileName) + .assertIsNameHighlighted(fileName); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedSearchFileByNameAdvancedSearch() { - LOG.info("Step 1: Navigate to advanced search page and search for document by document name, check that name is highlighted in search results"); - advancedSearchPage.navigate(); - advancedSearchPage.typeName(docName); - advancedSearchPage.clickSecondSearchButton(); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); + log.info("Step 1: Navigate to advanced search page and search for document by document name, check that name is highlighted in search results"); + advancedSearchPage + .navigate() + .typeName(fileName); + advancedSearchPage + .clickSecondSearchButton(); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsNameHighlighted(fileName); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }, enabled = true) public void testHighlightedSearchFolderByNameSearch() { - LOG.info("Step 1: On the search page search for folder by name and check that folder name is highlighted"); - toolbar.search(folderName); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertTrue(searchPage.isNameHighlighted(folderName), folderName + " is not highlighted"); + log.info("Step 1: On the search page search for folder by name and check that folder name is highlighted"); + toolbar + .search(folderName); + searchPage + .assertCreatedDataIsDisplayed(folderName) + .assertIsNameHighlighted(folderName); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }, enabled = true) public void testHighlightedSearchFolderByNameAdvancedSearch() { - LOG.info("Step 1: On the advanced search search by folder name and check that folder is returned in search results and that the folder name is highlighted"); - advancedSearchPage.navigateByMenuBar(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - advancedSearchPage.typeName(folderName); - advancedSearchPage.clickFirstSearchButton(); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertTrue(searchPage.isNameHighlighted(folderName), folderName + " is not highlighted"); + log.info("Step 1: On the advanced search search by folder name and check that folder is returned in search results and that the folder name is highlighted"); + advancedSearchPage + .navigateByMenuBar() + .clickOnLookForDropdown() + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")) + .typeNameFolder(folderName).clickFirstSearchButton(); + searchPage + .assertCreatedDataIsDisplayed(folderName) + .assertIsNameHighlighted(folderName); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFolderByTitleSearch() { - LOG.info("Step 1: Navigate to search page and search for folder name, check that folder name is highlighted in search results"); - toolbar.search(folderTitle); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertTrue(searchPage.isTitleHighlighted(folderTitle), folderTitle + " is not highlighted"); + log.info("Step 1: Navigate to search page and search for folder name, check that folder name is highlighted in search results"); + toolbar + .search(folderTitle); + searchPage + .assertCreatedDataIsDisplayed(folderName) + .assertIsTitleHighlighted(folderTitle); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFolderByTitleAdvancedSearch() { - LOG.info("Step 1: On the advanced search, search by folder title and check that folder is returned in search results and that the folder title is highlighted"); - advancedSearchPage.navigateByMenuBar(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - advancedSearchPage.setTitle(folderTitle); - advancedSearchPage.clickSecondSearchButton(); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertTrue(searchPage.isTitleHighlighted(folderTitle), folderTitle + " is not highlighted"); + log.info("Step 1: On the advanced search, search by folder title and check that folder is returned in search results and that the folder title is highlighted"); + advancedSearchPage + .navigateByMenuBar() + .clickOnLookForDropdown() + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")) + .folderTypeTitle(folderTitle); + advancedSearchPage + .clickSecondSearchButton(); + searchPage + .assertCreatedDataIsDisplayed(folderName) + .assertIsTitleHighlighted(folderTitle); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFileByTitleAdvancedSearch() { - LOG.info("Step 1: On the advanced search, search by file title and check that file is returned in search results and that the file title is highlighted"); - advancedSearchPage.navigateByMenuBar(); - advancedSearchPage.typeTitle(fileTitle); - advancedSearchPage.clickSecondSearchButton(); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is not highlighted"); + log.info("Step 1: On the advanced search, search by file title and check that file is returned in search results and that the file title is highlighted"); + advancedSearchPage + .navigateByMenuBar() + .typeTitle(fileTitle) + .clickSecondSearchButton(); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsTitleHighlighted(fileTitle); + } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFileByTitleSearch() { - LOG.info("Step 1: Search for file name, check that file name is highlighted in search results"); - toolbar.search(fileTitle); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is not highlighted"); + log.info("Step 1: Search for file name, check that file name is highlighted in search results"); + toolbar + .search(fileTitle); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsTitleHighlighted(fileTitle); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFileByDescription() { - LOG.info("Step 1: Search for file description, check that file description is highlighted in search results"); - toolbar.search(fileDescription); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is not highlighted"); + log.info("Step 1: Search for file description, check that file description is highlighted in search results"); + toolbar + .search(fileDescription); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsDescriptionHighlighted(fileDescription); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFileByDescriptionAdvancedSearch() { - LOG.info("Step 1: Navigate to advanced search page, search for file description, check that file description is highlighted in search results"); - advancedSearchPage.navigateByMenuBar(); - advancedSearchPage.typeDescription(fileDescription); - advancedSearchPage.clickSecondSearchButton(); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is not highlighted"); + log.info("Step 1: Navigate to advanced search page, search for file description, check that file description is highlighted in search results"); + advancedSearchPage + .navigateByMenuBar() + .typeDescription(fileDescription) + .clickSecondSearchButton(); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsDescriptionHighlighted(fileDescription); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFolderByDescription() { - LOG.info("Step 1: Search for folder description, check that folder description is highlighted in search results"); - toolbar.search(description); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertTrue(searchPage.isDescriptionHighlighted(description), description + " is not highlighted"); + log.info("Step 1: Search for folder description, check that folder description is highlighted in search results"); + toolbar + .search(description); + searchPage + .assertCreatedDataIsDisplayed(folderName) + .assertIsDescriptionHighlighted(description); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchFolderByDescriptionAdvancedSearch() { - LOG.info("Step 1: Navigate to advanced search page, search for file description, check that file description is highlighted in search results"); - advancedSearchPage.navigateByMenuBar(); - advancedSearchPage.clickOnLookForDropdown(); - advancedSearchPage.clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")); - advancedSearchPage.typeDescription(description); - advancedSearchPage.clickSecondSearchButton(); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertTrue(searchPage.isDescriptionHighlighted(description), description + " is not highlighted"); + log.info("Step 1: Navigate to advanced search page, search for file description, check that file description is highlighted in search results"); + advancedSearchPage + .navigateByMenuBar() + .clickOnLookForDropdown() + .clickOnLookForDropdownOption(language.translate("advancedSearchPage.lookForDropDown.folders.label")) + .folderTypeDescription(description) + .clickSecondSearchButton(); + searchPage + .assertCreatedDataIsDisplayed(folderName) + .assertIsDescriptionHighlighted(description); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchByPropertyName() { - LOG.info("Step 1: Search by name: property and check that name is highlighted on search results"); - String searchExpression = "name:" + docName; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); + log.info("Step 1: Search by name: property and check that name is highlighted on search results"); + String searchExpression = "name:" + fileName; + toolbar + .search(searchExpression); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsNameHighlighted(fileName); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchByPropertyTitle() { - LOG.info("Step 1: Search by title: property and check that title is highlighted on search results"); + log.info("Step 1: Search by title: property and check that title is highlighted on search results"); String searchExpression = "title:" + fileTitle; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is not highlighted"); + toolbar + .search(searchExpression); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsTitleHighlighted(fileTitle); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchByPropertyDescription() { - LOG.info("Step 1: Search by description: property and check that description is highlighted on search results"); + log.info("Step 1: Search by description: property and check that description is highlighted on search results"); String searchExpression = "description:" + fileDescription; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is not highlighted"); + toolbar + .search(searchExpression); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsDescriptionHighlighted(fileDescription); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchByPropertyContent() { - LOG.info("Step 1: Search by content: property and check that content is highlighted on search results"); - String searchExpression = "content:" + docContent; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isContentHighlighted(docContent), docContent + " is not highlighted"); + log.info("Step 1: Search by content: property and check that content is highlighted on search results"); + String searchExpression = "content:" + FILE_CONTENT1; + toolbar + .search(searchExpression); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsContentHighlighted(FILE_CONTENT1); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchByPropertyCm_Name() { - LOG.info("Step 1: Search by cm_name: property and check that the name is highlighted on search results"); - String searchExpression = "cm_name:" + docName; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); + log.info("Step 1: Search by cm_name: property and check that the name is highlighted on search results"); + String searchExpression = "cm_name:" + fileName; + toolbar + .search(searchExpression); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsNameHighlighted(fileName); +// Assert.assertTrue(searchPage.isResultFoundWithList(fileName)); +// Assert.assertTrue(searchPage.isNameHighlighted(fileName), fileName + " is not highlighted"); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testHighlightedSearchByPropertyTEXT() { - LOG.info("Step 1: Search by TEXT: property and check that the name is highlighted on search results"); - String searchExpression = "TEXT:" + docContent; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isContentHighlighted(docContent), docContent + " is not highlighted"); + log.info("Step 1: Search by TEXT: property and check that the name is highlighted on search results"); + String searchExpression = "TEXT:" + FILE_CONTENT1; + toolbar + .search(searchExpression); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsContentHighlighted(FILE_CONTENT1); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testHighlightedSearchByWildcardAsterisk() - { - LOG.info("Step 1: Search using * and check that the properties are highlighted on search results"); + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) + public void testHighlightedSearchByWildcardAsterisk() { + log.info("Step 1: Search using * and check that the properties are highlighted on search results"); String searchExpression = "file*"; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertFalse(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); - Assert.assertTrue(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is not highlighted"); - Assert.assertTrue(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is not highlighted"); - Assert.assertTrue(searchPage.isContentHighlighted(docContent), docContent + " is not highlighted"); + toolbar + .search(searchExpression); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(fileName) + .assertNameNotHighlighted(fileName) + .assertIsTitleHighlighted(fileTitle) + .assertIsDescriptionHighlighted(fileDescription) + .assertIsContentHighlighted(FILE_CONTENT1); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + //@Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = false) public void testHighlightedSearchByWildcardsEqual() { - LOG.info("Step 1: Search using = and check that only the name is highlighted on search results"); - String searchExpression = "=" + docName; + log.info("Step 1: Search using = and check that only the name is highlighted on search results"); + String searchExpression = "=" + fileName; toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); + Assert.assertTrue(searchPage.isResultFoundWithList(fileName)); + Assert.assertTrue(searchPage.isNameHighlighted(fileName), fileName + " is not highlighted"); } - //@Test(groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + //@Test(groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH ,enabled = false}) public void testHighlightedSearchByWildcardQuestionMark() { - LOG.info("Step 1: Search using ? and check that the name is highlighted on search results"); + log.info("Step 1: Search using ? and check that the name is highlighted on search results"); String searchExpression = "??file_"; toolbar.search(searchExpression); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); @@ -317,32 +400,36 @@ public void testHighlightedSearchByWildcardQuestionMark() Assert.assertTrue(searchPage.isContentHighlighted(docContent), docContent + " is not highlighted"); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) public void testItemsNotHighlighted() { - LOG.info("Step 1: Search using doc name and confirm that site name, location and username properties are not highlighted"); - toolbar.search(docName); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isNameHighlighted(docName), docName + " is not highlighted"); + log.info("Step 1: Search using doc name and confirm that site name, location and username properties are not highlighted"); + toolbar + .search(fileName); + searchPage + .assertCreatedDataIsDisplayed(fileName) + .assertIsNameHighlighted(fileName); Assert.assertFalse(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is highlighted"); - Assert.assertFalse(searchPage.isContentHighlighted(docContent), docContent + " is highlighted"); + Assert.assertFalse(searchPage.isContentHighlighted(FILE_CONTENT1), FILE_CONTENT1 + " is highlighted"); Assert.assertFalse(searchPage.isSiteHighlighted(), "Site name is highlighted"); Assert.assertFalse(searchPage.isModifiedOnHighlighted(), "Modified on details are highlighted"); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testNoItemIsHighlightedSearchByCreatedProperty() - { - LOG.info("Step 1: Search by created property and check that no item is highlighted"); + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) + public void testNoItemIsHighlightedSearchByCreatedProperty() { + log.info("Step 1: Search by created property and check that no item is highlighted"); String searchExpression = "created:today"; - toolbar.search(searchExpression); - Assert.assertTrue(searchPage.isResultFoundWithRetry(docName)); - Assert.assertTrue(searchPage.isResultFoundWithRetry(folderName)); - Assert.assertFalse(searchPage.isNameHighlighted(docName), docName + " is highlighted"); + toolbar + .search(searchExpression); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(fileName) + .assertCreatedDataIsDisplayed(folderName); + Assert.assertFalse(searchPage.isNameHighlighted(fileName), fileName + " is highlighted"); Assert.assertFalse(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is highlighted"); - Assert.assertFalse(searchPage.isContentHighlighted(docContent), docContent + " is highlighted"); + Assert.assertFalse(searchPage.isContentHighlighted(FILE_CONTENT1), FILE_CONTENT1 + " is highlighted"); Assert.assertFalse(searchPage.isSiteHighlighted(), "Site name is highlighted"); Assert.assertFalse(searchPage.isModifiedOnHighlighted(), "Modified on details are highlighted"); Assert.assertFalse(searchPage.isNameHighlighted(folderName), folderName + " is highlighted"); @@ -350,19 +437,18 @@ public void testNoItemIsHighlightedSearchByCreatedProperty() Assert.assertFalse(searchPage.isDescriptionHighlighted(description), description + " is highlighted"); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testNoItemIsHighlightedSearchByAsterisk() - { - LOG.info("Step 1: Search by * property and check that no item is highlighted"); + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) + public void testNoItemIsHighlightedSearchByAsterisk() { + log.info("Step 1: Search by * property and check that no item is highlighted"); String searchExpression = "*"; toolbar.search(searchExpression); Assert.assertTrue(searchPage.isAnyFileReturnedInResults(), "No files are returned in results"); Assert.assertTrue(searchPage.isAnyFolderReturnedInResults(), "No folders are returned in results"); Assert.assertFalse(searchPage.confirmNoItemIsHighlighted(), "Items are highlighted on the search page"); - Assert.assertFalse(searchPage.isNameHighlighted(docName), docName + " is highlighted"); + Assert.assertFalse(searchPage.isNameHighlighted(fileName), fileName + " is highlighted"); Assert.assertFalse(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is highlighted"); - Assert.assertFalse(searchPage.isContentHighlighted(docContent), docContent + " is highlighted"); + Assert.assertFalse(searchPage.isContentHighlighted(FILE_CONTENT1), FILE_CONTENT1 + " is highlighted"); Assert.assertFalse(searchPage.isSiteHighlighted(), "Site name is highlighted"); Assert.assertFalse(searchPage.isModifiedOnHighlighted(), "Modified on details are highlighted"); Assert.assertFalse(searchPage.isNameHighlighted(folderName), folderName + " is highlighted"); @@ -370,20 +456,20 @@ public void testNoItemIsHighlightedSearchByAsterisk() Assert.assertFalse(searchPage.isDescriptionHighlighted(description), description + " is highlighted"); } - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) - public void testGalleryViewIsNotHighlighted() - { - LOG.info("Step 1: Search in Gallery view and check that no item is highlighted"); + @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH },enabled = true) + public void testGalleryViewIsNotHighlighted() { + log.info("Step 1: Search in Gallery view and check that no item is highlighted"); String searchExpression = "faceted*"; toolbar.search(searchExpression); + Assert.assertTrue(searchPage.isResultFoundWithList(fileName)); Assert.assertTrue(searchPage.isAnyFileReturnedInResults(), "No files are returned in results"); Assert.assertTrue(searchPage.isAnyFolderReturnedInResults(), "No folders are returned in results"); searchPage.clickGalleryView(); Assert.assertFalse(searchPage.confirmNoItemIsHighlighted(), "Items are highlighted on the search page"); - Assert.assertFalse(searchPage.isNameHighlighted(docName), docName + " is highlighted"); + Assert.assertFalse(searchPage.isNameHighlighted(fileName), fileName + " is highlighted"); Assert.assertFalse(searchPage.isTitleHighlighted(fileTitle), fileTitle + " is highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(fileDescription), fileDescription + " is highlighted"); - Assert.assertFalse(searchPage.isContentHighlighted(docContent), docContent + " is highlighted"); + Assert.assertFalse(searchPage.isContentHighlighted(FILE_CONTENT1), FILE_CONTENT1 + " is highlighted"); Assert.assertFalse(searchPage.isSiteHighlighted(), "Site name is highlighted"); Assert.assertFalse(searchPage.isModifiedOnHighlighted(), "Modified on details are highlighted"); Assert.assertFalse(searchPage.isNameHighlighted(folderName), folderName + " is highlighted"); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareTests.java index 28a72cde60..b89f00b7fa 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchShareTests.java @@ -1,33 +1,47 @@ package org.alfresco.share.searching.facetedSearch; + import java.util.ArrayList; import java.util.Date; import java.util.List; -import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.DashboardCustomization; +import lombok.extern.slf4j.Slf4j; + + import org.alfresco.dataprep.DataListsService; +import org.alfresco.dataprep.DashboardCustomization; +import org.alfresco.dataprep.SitePagesService; import org.alfresco.dataprep.SiteService; +import org.alfresco.po.share.alfrescoContent.buildingContent.CreateContentPage; +import org.alfresco.po.share.alfrescoContent.document.DocumentDetailsPage; +import org.alfresco.po.share.dashlet.SiteContentDashlet; import org.alfresco.po.share.searching.SearchPage; +import org.alfresco.po.share.site.*; import org.alfresco.po.share.site.dataLists.DataListsPage; +import org.alfresco.dataprep.DashboardCustomization.Page; import org.alfresco.po.share.site.wiki.WikiPage; import org.alfresco.po.share.toolbar.Toolbar; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.profile.UserProfilePage; +import org.alfresco.share.BaseTest; import org.alfresco.utility.data.RandomData; -import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.*; import org.alfresco.utility.report.Bug; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.testng.asserts.SoftAssert; + + +@Slf4j + /** * Created by Mirela Tifui on 12/29/2017. */ -public class FacetedSearchShareTests extends ContextAwareWebTest +public class FacetedSearchShareTests extends BaseTest { //@Autowired Toolbar toolbar; @@ -35,13 +49,29 @@ public class FacetedSearchShareTests extends ContextAwareWebTest SearchPage searchPage; //@Autowired WikiPage wikiPage; - //@Autowired + DocumentLibraryPage documentLibraryPage; + DocumentDetailsPage documentDetailsPage; + CustomizeSitePage customizeSite; + DashboardCustomization dashboardCustomization; + UserProfilePage userProfilePage; + CreateContentPage createContent; + DataListsPage dataListsPage; + SiteDashboardPage siteDashboardPage; + SiteContentDashlet siteContentDashlet; + DataListsService dataListsService; + SoftAssert softAssert = new SoftAssert(); + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); + @Autowired + private SiteService siteService; + @Autowired + private SitePagesService sitePagesService; + + - private String userName = "user" + RandomData.getRandomAlphanumeric(); - private String siteName = "site" + RandomData.getRandomAlphanumeric(); private String docName1 = "testfile1_" + RandomData.getRandomAlphanumeric(); private String docName2 = "testfile2_" + RandomData.getRandomAlphanumeric(); private String docName3 = "testfile3_" + RandomData.getRandomAlphanumeric(); @@ -58,67 +88,81 @@ public class FacetedSearchShareTests extends ContextAwareWebTest private String blogContent = "content of the blog"; private String discussionName = "testDiscussion"; private String discussionContent = "discussionContent"; - private String listName = "listName"; + private final String password = "password"; + private String listName = "contactList"; private String listDescription = "listDescription"; private DateTime today = new DateTime(); private Date startDate = today.toDate(); - @BeforeClass (alwaysRun = true) - public void testSetup() - { - List pagesToAdd = new ArrayList<>(); - userService.create(adminUser, adminPassword, userName, password, userName + domain, "test", "user"); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName1, docContent1); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName2, docContent2); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName3, docContent3); - siteService.addPageToSite(adminUser, adminPassword, siteName, DashboardCustomization.Page.CALENDAR, null); - siteService.addPageToSite(adminUser, adminPassword, siteName, DashboardCustomization.Page.WIKI, null); - siteService.addPageToSite(adminUser, adminPassword, siteName, DashboardCustomization.Page.LINKS, null); - siteService.addPageToSite(adminUser, adminPassword, siteName, DashboardCustomization.Page.BLOG, null); - siteService.addPageToSite(adminUser, adminPassword, siteName, DashboardCustomization.Page.DISCUSSIONS, null); - siteService.addPageToSite(adminUser, adminPassword, siteName, DashboardCustomization.Page.DATALISTS, null); - sitePagesService.addCalendarEvent(userName, password, siteName, eventName, "here", eventDescription, startDate, startDate, "", "", false, "tag1"); - sitePagesService.createWiki(userName, password, siteName, wikiName, wikiContent, null); - sitePagesService.createLink(userName, password, siteName, linkName, "https://url.com", linkDescription, false, null); - sitePagesService.createBlogPost(userName, password, siteName, blogPostName, blogContent, false, null); - sitePagesService.createDiscussion(userName, password, siteName, discussionName, discussionContent, null); - dataListsService.createDataList(userName, password, siteName, DataListsService.DataList.CONTACT_LIST, listName, listDescription); - setupAuthenticatedSession(userName, password); + @BeforeMethod (alwaysRun = true) + public void testSetup() { + log.info("Precondition2: Test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); + log.info("Precondition3: Test Site is created"); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + + documentLibraryPage = new DocumentLibraryPage(webDriver); + documentDetailsPage = new DocumentDetailsPage(webDriver); + searchPage = new SearchPage(webDriver); + userProfilePage = new UserProfilePage(webDriver); + toolbar = new Toolbar(webDriver); + wikiPage = new WikiPage(webDriver); + dataListsPage = new DataListsPage(webDriver); + createContent = new CreateContentPage(webDriver); + customizeSite = new CustomizeSitePage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + siteContentDashlet = new SiteContentDashlet(webDriver); + dashboardCustomization = new DashboardCustomization(); + dataListsService = new DataListsService(); } - @AfterClass (alwaysRun = true) - public void tearDown() + @AfterMethod (alwaysRun = true) + public void cleanup() { - userService.delete(adminUser, adminPassword, userName); - siteService.delete(adminUser, adminPassword, domain, siteName); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedDisjunction() { - LOG.info("Step 1: Searching using disjunction (\"OR\"), check the result is properly highlighted"); + log.info("Step 1: Searching using disjunction (\"OR\"), check the result is properly highlighted"); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName1).typeContent(docContent1).clickCreate(); + documentLibraryPage.navigate(); documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName2).typeContent(docContent2).clickCreate(); + documentLibraryPage.navigate(); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName3).typeContent(docContent3).clickCreate(); + documentLibraryPage.navigate(); String searchExpression = docName1 + " OR " + docName2; + documentLibraryPage.navigate(site.get()); toolbar.search(searchExpression); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName1)); Assert.assertTrue(searchPage.isNameHighlighted(docName1), docName1 + " is not highlighted"); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName2)); Assert.assertTrue(searchPage.isNameHighlighted(docName2), docName2 + " is not highlighted"); - Assert.assertFalse(searchPage.isResultFoundWithRetry(docName3)); - Assert.assertFalse(searchPage.isNameHighlighted(docName3), docName3 + " is not highlighted"); + Assert.assertFalse(searchPage.isResultFound(docName3)); + Assert.assertFalse(searchPage.isNameHighlighted(docName3), docName3 + " is highlighted"); } @Bug (id = "To be raised") - @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) + @Test (enabled = false, groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedConjunction() { - LOG.info("Step 1: Searching using conjunction (\"AND\"), the result is properly highlighted"); - String searchExpression = docName1 + " AND " + docName2; + log.info("Step 1: Searching using conjunction (\"AND\"), the result is properly highlighted"); + String searchExpression = docName1 + " AND " + docName3; + documentLibraryPage.navigate(site.get()); toolbar.search(searchExpression); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName1)); Assert.assertTrue(searchPage.isNameHighlighted(docName1), docName1 + " is not highlighted"); - Assert.assertFalse(searchPage.isResultFoundWithRetry(docName2)); - Assert.assertFalse(searchPage.isNameHighlighted(docName2), docName2 + " is not highlighted"); + Assert.assertFalse(searchPage.isResultFound(docName2)); + Assert.assertFalse(searchPage.isNameHighlighted(docName2), docName2 + " is highlighted"); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName3)); Assert.assertTrue(searchPage.isNameHighlighted(docName3), docName3 + " is not highlighted"); } @@ -126,23 +170,49 @@ public void testHighlightedConjunction() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedNegationNOT() { - LOG.info("Step 1: Searching using negation (\"NOT\"), the result is properly highlighted"); + log.info("Step 1: Searching using negation (\"NOT\"), the result is properly highlighted"); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName1).typeContent(docContent1).clickCreate(); + documentLibraryPage.navigate(); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName2).typeContent(docContent2).clickCreate(); + documentLibraryPage.navigate(); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName3).typeContent(docContent3).clickCreate(); + documentLibraryPage.navigate(); String searchExpression = docName1 + " NOT " + docName2; + documentLibraryPage.navigate(site.get()); toolbar.search(searchExpression); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName1)); - Assert.assertFalse(searchPage.isResultFoundWithRetry(docName2)); + Assert.assertFalse(searchPage.isResultFound(docName2)); Assert.assertTrue(searchPage.isNameHighlighted(docName1), docName1 + " is not highlighted"); - Assert.assertFalse(searchPage.isNameHighlighted(docName2), docName2 + " is not highlighted"); + Assert.assertFalse(searchPage.isNameHighlighted(docName2), docName2 + " is highlighted"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedNegation() { - LOG.info("Step 1: Searching using negation (\"!\"), the result is properly highlighted"); + log.info("Step 1: Searching using negation (\"!\"), the result is properly highlighted"); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName1).typeContent(docContent1).clickCreate(); + documentLibraryPage.navigate(); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName2).typeContent(docContent2).clickCreate(); + documentLibraryPage.navigate(); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.clickCreateContentOption(DocumentLibraryPage.CreateMenuOption.PLAIN_TEXT); + createContent.typeName(docName3).typeContent(docContent3).clickCreate(); + documentLibraryPage.navigate(); String searchExpression = docName1 + " !" + docName2; + documentLibraryPage.navigate(site.get()); toolbar.search(searchExpression); Assert.assertTrue(searchPage.isResultFoundWithRetry(docName1)); - Assert.assertFalse(searchPage.isResultFoundWithRetry(docName2)); + Assert.assertFalse(searchPage.isResultFound(docName2)); Assert.assertTrue(searchPage.isNameHighlighted(docName1), docName1 + " is not highlighted"); Assert.assertFalse(searchPage.isNameHighlighted(docName2), docName2 + " is not highlighted"); } @@ -150,8 +220,19 @@ public void testHighlightedNegation() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedCalendarName() { - LOG.info("Step 1: Searching file by Calendar Event name, the result is highlighted"); - toolbar.search(eventName); + log.info("Step 1: Searching file by Calendar Event name, the result is highlighted"); + String identifier = RandomData.getRandomAlphanumeric(); + String userName = user.get().getUsername(); + String siteName = site.get().getId(); + String phrase = "phrase" + identifier; + documentLibraryPage.navigate(site.get()); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.CALENDAR); + siteService.addPagesToSite(userName, password, siteName,sitePages); + sitePagesService.addCalendarEvent(userName, password, siteName, eventName, + "", phrase, today.toDate(), today.toDate(), "", "", false, null); + toolbar.searchAndEnterSearch(eventName); Assert.assertTrue(searchPage.isResultFound(eventName), eventName + " is not found"); Assert.assertTrue(searchPage.isNameHighlighted(eventName), eventName + " is not highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(eventDescription), eventDescription + " is highlighted"); @@ -161,22 +242,48 @@ public void testHighlightedCalendarName() public void testHighlightedWikiNameAndSelection() { String expectedWikiPageTitle = "Alfresco » Wiki » " + wikiName; - LOG.info("Step 1: Searching by Wiki page name, the result is highlighted"); - toolbar.search(wikiName); + log.info("Step 1: Searching by Wiki page name, the result is highlighted"); + log.info("Step 1: Searching file by Calendar Event name, the result is highlighted"); + String identifier = RandomData.getRandomAlphanumeric(); + String userName = user.get().getUsername(); + String siteName = site.get().getId(); + String phrase = "phrase" + identifier; + documentLibraryPage.navigate(site.get()); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.WIKI); + siteService.addPagesToSite(userName, password, siteName,sitePages); + sitePagesService.createWiki(userName, password, siteName, wikiName, phrase, null); + sitePagesService.addCalendarEvent(userName, password, siteName, wikiName, + "", phrase, today.toDate(), today.toDate(), "", "", false, null); + toolbar.searchAndEnterSearch(wikiName); softAssert.assertTrue(searchPage.isResultFound(wikiName), wikiName + " is not found"); softAssert.assertTrue(searchPage.isNameHighlighted(wikiName), wikiName + " is not highlighted"); softAssert.assertFalse(searchPage.isContentHighlighted(wikiContent), wikiContent + " is highlighted"); - LOG.info("Step 2: Click wiki name"); - searchPage.clickContentName(wikiName); -// softAssert.assertEquals(wikiPage.getPageTitle(), expectedWikiPageTitle, expectedWikiPageTitle + " is not displayed"); + log.info("Step 2: Click wiki name"); + searchPage.clickOnContentName(wikiName); + softAssert.assertEquals(wikiPage.getWikiCurrentPageTitle(), expectedWikiPageTitle, expectedWikiPageTitle + " is not displayed"); } @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedLinkName() { - LOG.info("Step 1: Searching by Link page name, the result is highlighted"); - toolbar.search(linkName); + log.info("Step 1: Searching by Link page name, the result is highlighted"); + String identifier = RandomData.getRandomAlphanumeric(); + String userName = user.get().getUsername(); + String siteName = site.get().getId(); + String phrase = "phrase" + identifier; + documentLibraryPage.navigate(site.get()); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.LINKS); + siteService.addPagesToSite(userName, password, siteName,sitePages); + sitePagesService.createLink(userName, password, siteName, linkName, + "https://www.alfresco.com", phrase, false, null); + sitePagesService.addCalendarEvent(userName, password, siteName, linkName, + "", phrase, today.toDate(), today.toDate(), "", "", false, null); + toolbar.searchAndEnterSearch(linkName); Assert.assertTrue(searchPage.isResultFound(linkName), linkName + " is not found"); Assert.assertTrue(searchPage.isNameHighlighted(linkName), linkName + " is not highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(linkDescription), linkDescription + " is highlighted"); @@ -185,8 +292,21 @@ public void testHighlightedLinkName() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedBlogName() { - LOG.info("Step 1: Searching by Blog page name, the result is highlighted"); - toolbar.search(blogPostName); + log.info("Step 1: Searching by Blog page name, the result is highlighted"); + String identifier = RandomData.getRandomAlphanumeric(); + String userName = user.get().getUsername(); + String siteName = site.get().getId(); + String phrase = "phrase" + identifier; + documentLibraryPage.navigate(site.get()); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.BLOG); + siteService.addPagesToSite(userName, password, siteName,sitePages); + sitePagesService.createBlogPost(userName, password, siteName, blogPostName, phrase, + false, null); + sitePagesService.addCalendarEvent(userName, password, siteName, blogPostName, + "", phrase, today.toDate(), today.toDate(), "", "", false, null); + toolbar.searchAndEnterSearch(blogPostName); Assert.assertTrue(searchPage.isResultFound(blogPostName), blogPostName + " is not found"); Assert.assertTrue(searchPage.isNameHighlighted(blogPostName), blogPostName + " is not highlighted"); Assert.assertFalse(searchPage.isContentHighlighted(blogContent), blogContent + " is highlighted"); @@ -195,8 +315,22 @@ public void testHighlightedBlogName() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedDiscussionName() { - LOG.info("Step 1: Searching by Discussion name, the result is highlighted"); - toolbar.search(discussionName); + log.info("Step 1: Searching by Discussion name, the result is highlighted"); + log.info("Step 1: Searching file by Calendar Event name, the result is highlighted"); + String identifier = RandomData.getRandomAlphanumeric(); + String userName = user.get().getUsername(); + String siteName = site.get().getId(); + String phrase = "phrase" + identifier; + documentLibraryPage.navigate(site.get()); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.DISCUSSIONS); + siteService.addPagesToSite(userName, password, siteName,sitePages); + sitePagesService.createDiscussion(userName, password, siteName, discussionName, + phrase, null); + sitePagesService.addCalendarEvent(userName, password, siteName, discussionName, + "", phrase, today.toDate(), today.toDate(), "", "", false, null); + toolbar.searchAndEnterSearch(discussionName); Assert.assertTrue(searchPage.isResultFound(discussionName), discussionName + " is not found"); Assert.assertTrue(searchPage.isNameHighlighted(discussionName), discussionName + " is not highlighted"); Assert.assertFalse(searchPage.isContentHighlighted(discussionContent), discussionContent + " is highlighted"); @@ -205,14 +339,27 @@ public void testHighlightedDiscussionName() @Test (groups = { TestGroup.SHARE, "Regression", TestGroup.SEARCH }) public void testHighlightedDataListName() { - LOG.info("Step 1: Searching by Blog page name, the result is highlighted"); - toolbar.search(listName); + log.info("Step 1: Searching by Blog page name, the result is highlighted"); + log.info("Step 1: Searching file by Calendar Event name, the result is highlighted"); + String identifier = RandomData.getRandomAlphanumeric(); + String userName = user.get().getUsername(); + String siteName = site.get().getId(); + String phrase = "phrase" + identifier; + documentLibraryPage.navigate(site.get()); + log.info("Data create as per pre condition"); + List sitePages = new ArrayList<>(); + sitePages.add(Page.DATALISTS); + siteService.addPagesToSite(userName, password, siteName,sitePages); + documentLibraryPage.navigate(site.get()); + documentLibraryPage.createContactDataList(listName); + sitePagesService.addCalendarEvent(userName, password, siteName, listName, + "", phrase, today.toDate(), today.toDate(), "", "", false, null); + toolbar.searchAndEnterSearch(listName); Assert.assertTrue(searchPage.isResultFound(listName), listName + " is not found"); Assert.assertTrue(searchPage.isNameHighlighted(listName), listName + " is not highlighted"); Assert.assertFalse(searchPage.isDescriptionHighlighted(listDescription), listDescription + " is highlighted"); - LOG.info("Step 2: Select data list title and check user is redirected to the correct page"); - searchPage.clickContentName(listName); -// Assert.assertEquals(dataListsPage.getPageTitle(), "Alfresco » Data Lists"); -// Assert.assertTrue(dataListsPage.assertDataListTitleContains(listName)); + log.info("Step 2: Select data list title and check user is redirected to the correct page"); + searchPage.clickOnContentName(listName); + dataListsPage.assertDataListPageIsOpened(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchTests.java index 86f770b75a..22adf5372c 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/facetedSearch/FacetedSearchTests.java @@ -4,11 +4,13 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.SiteService; +import org.alfresco.dataprep.ContentService; +import org.alfresco.po.share.alfrescoContent.organizingContent.CopyMoveUnzipToDialog; import org.alfresco.po.share.dashlet.MyTasksDashlet; import org.alfresco.po.share.searching.SearchPage; -import org.alfresco.po.share.searching.dialogs.SearchCopyMoveDialog; import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.SelectPopUpPage; import org.alfresco.po.share.tasksAndWorkflows.SelectAssigneeToWorkflowPopUp; @@ -16,302 +18,411 @@ import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; import org.alfresco.po.share.user.profile.UserTrashcanPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; +import org.alfresco.utility.model.SiteModel; + import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Razvan.Dorobantu */ -public class FacetedSearchTests extends ContextAwareWebTest +public class FacetedSearchTests extends BaseTest { - //@Autowired Toolbar toolbar; - - // @Autowired SearchPage searchPage; - - //@Autowired DocumentLibraryPage documentLibraryPage; - - //@Autowired StartWorkflowPage startWorkflowPage; - - //@Autowired SelectAssigneeToWorkflowPopUp selectAssigneeToWorkflowPopUp; - - //@Autowired SelectPopUpPage selectPopUpPage; - - // @Autowired UserDashboardPage userDashboardPage; - - @Autowired MyTasksDashlet myTasksDashlet; - - //@Autowired UserTrashcanPage userTrashcanPage; - - //@Autowired - SearchCopyMoveDialog copyMoveUnzipToDialog; + CopyMoveUnzipToDialog copyMoveUnzipToDialog; + @Autowired + private ContentService contentService; String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - String userName = "facetedTestUser-" + uniqueIdentifier; - String firstName = "FirstName"; - String lastName = "LastName"; - String siteName = "FacetedSite-" + uniqueIdentifier; - String siteForCopy = "FacetedCopy-" + uniqueIdentifier; - String siteForMove = "FacetedMove-" + uniqueIdentifier; - String description = "FacetedDescription-" + uniqueIdentifier; + private final String password = "password"; String docName1 = "FacetedTestDoc1-" + uniqueIdentifier; String docName2 = "FacetedTestDoc2-" + uniqueIdentifier; String docName3 = "FacetedTestDoc3-" + uniqueIdentifier; String docWorkflow = "FacetedTestDoc6-" + uniqueIdentifier; String docForMove = "FacetedTestDoc4-" + uniqueIdentifier; String docForDelete = "FacetedTestDoc5-" + uniqueIdentifier; - String docContent = "content of file."; String searchTerm = "FacetedTestDoc"; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site1 = new ThreadLocal<>(); + private final ThreadLocal site2 = new ThreadLocal<>(); + private final ThreadLocal site3 = new ThreadLocal<>(); + private String siteName; + private String siteForCopy; + private String siteForMove; - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, firstName, lastName); - siteService.create(userName, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - siteService.create(userName, password, domain, siteForCopy, description, SiteService.Visibility.PUBLIC); - siteService.create(userName, password, domain, siteForMove, description, SiteService.Visibility.PUBLIC); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName1, docContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName2, docContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docName3, docContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docForMove, docContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docForDelete, docContent); - contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, docWorkflow, docContent); - } + log.info("Precondition1: Any test user is created & Sites are Created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + authenticateUsingCookies(user.get()); - @BeforeMethod (alwaysRun = true) - public void beforeMethod() - { - setupAuthenticatedSession(userName, password); - toolbar.search(searchTerm); - } + authenticateUsingLoginPage(user.get()); + site1.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + siteName = site1.get().getTitle(); - @AfterClass (alwaysRun = true) + site2.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + siteForCopy = site2.get().getTitle(); + + site3.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + siteForMove = site3.get().getTitle(); + + String userName = user.get().getUsername(); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + docName1, "Test DocName1"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + docName2, "Test DocName2"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + docName3, "Test DocName3"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + docForMove, "Test Doc For Move"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + docForDelete, "Test Doc For Delete"); + contentService.createDocument(userName, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, + docWorkflow, "Test docWorkflow"); + + toolbar = new Toolbar(webDriver); + searchPage = new SearchPage(webDriver); + copyMoveUnzipToDialog = new CopyMoveUnzipToDialog(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + startWorkflowPage = new StartWorkflowPage(webDriver); + selectAssigneeToWorkflowPopUp = new SelectAssigneeToWorkflowPopUp(webDriver); + selectPopUpPage = new SelectPopUpPage(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + myTasksDashlet = new MyTasksDashlet(webDriver); + userTrashcanPage = new UserTrashcanPage(webDriver); + } + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - siteService.delete(adminUser, adminPassword, siteName); - siteService.delete(adminUser, adminPassword, siteForCopy); - siteService.delete(adminUser, adminPassword, siteForMove); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site1.get()); + deleteSitesIfNotNull(site2.get()); + deleteSitesIfNotNull(site3.get()); } @TestRail (id = "C12816") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 2) + @Test(groups = { TestGroup.SANITY, TestGroup.SEARCH}, priority = -1) public void facetedSearchBulkActionsTest() { - LOG.info("STEP1: Verify search items are displayed."); + toolbar.search(searchTerm); + log.info("STEP1: Verify search items are displayed."); searchPage.clickDetailedView(); assertTrue(searchPage.getNumberOfResultsText().contains(" - results found"), "Section with number of results is displayed"); - assertTrue(searchPage.isResultFoundWithRetry(docName1)); - assertTrue(searchPage.isResultFoundWithRetry(docName2)); - assertTrue(searchPage.isResultFoundWithRetry(docName3)); - LOG.info("STEP2: Verify options from the \"Selected Items...\" dropdown"); - searchPage.clickSelectAll(); - searchPage.clickSelectedItemsDropdown(); - assertTrue(searchPage.isSelectedItemsOptionDisplayed("Download as Zip")); - assertTrue(searchPage.isSelectedItemsOptionDisplayed("Copy to...")); - assertTrue(searchPage.isSelectedItemsOptionDisplayed("Move to...")); - assertTrue(searchPage.isSelectedItemsOptionDisplayed("Start Workflow...")); - assertTrue(searchPage.isSelectedItemsOptionDisplayed("Delete")); - LOG.info("STEP3: Verify options from the \"Selected Items List...\" checkbox"); - searchPage.clickSelectedItemsListDropdownArrow(); - assertTrue(searchPage.isSelectedItemsListOptionDisplayed("All")); - assertTrue(searchPage.isSelectedItemsListOptionDisplayed("None")); - assertTrue(searchPage.isSelectedItemsListOptionDisplayed("Invert")); - cleanupAuthenticatedSession(); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + + log.info("STEP2: Verify options from the \"Selected Items...\" dropdown"); + searchPage + .click_checkBox(5) + .click_checkBox(4) + .click_checkBox(3) + .click_checkBox(2) + .click_checkBox(1) + .click_checkBox(0); + searchPage + .clickSelectedItemsDropdown(); + searchPage + .assert_IsSelectedItemsOptionDisplayed("Download as Zip") + .assert_IsSelectedItemsOptionDisplayed("Copy to...") + .assert_IsSelectedItemsOptionDisplayed("Move to...") + .assert_IsSelectedItemsOptionDisplayed("Start Workflow...") + .assert_IsSelectedItemsOptionDisplayed("Delete"); + + log.info("STEP3: Verify options from the \"Selected Items List...\" checkbox"); + searchPage + .clickSelectedItemsListDropdownArrow(); + searchPage + .assert_isSelectedItemsListOptionDisplayed("All") + .assert_isSelectedItemsListOptionDisplayed("None") + .assert_isSelectedItemsListOptionDisplayed("Invert"); } @TestRail (id = "C12817") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 3) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }, priority = 2) public void facetedSearchALLOption() { - LOG.info("STEP1&2&3: Select ALL option from the Select Items List checkbox and Gallery View"); - searchPage.clickSelectAll(); - searchPage.clickGalleryView(); - assertTrue(searchPage.isALLItemsCheckboxChecked()); - searchPage.clickDetailedView(); - cleanupAuthenticatedSession(); + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + log.info("STEP1&2&3: Select ALL option from the Select Items List checkbox and Gallery View"); + searchPage + .clickSelectAll() + .clickGalleryView(); + searchPage + .assert_isAllItemsCheckBoxChecked() + .clickDetailedView(); } @TestRail (id = "C12818") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 4) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void facetedSearchNoneOption() { - LOG.info("STEP1: Select ALL option from the Select Items List checkbox."); - searchPage.clickSelectAll(); - assertTrue(searchPage.isALLItemsCheckboxChecked()); - LOG.info("STEP2: Select None option from the Select Items List checkbox."); - searchPage.clickDetailedView(); - searchPage.clickSelectedItemsListDropdownArrow(); - searchPage.clickOptionFromSelectedItemsListCheckbox("None"); - LOG.info("STEP3: Select Gallery View option and check all items are selected"); - searchPage.clickGalleryView(); - assertTrue(searchPage.isNoneItemsCheckboxChecked()); - searchPage.clickDetailedView(); - cleanupAuthenticatedSession(); + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + log.info("STEP1: Select ALL option from the Select Items List checkbox."); + searchPage + .clickSelectAll() + .assert_isAllItemsCheckBoxChecked(); + log.info("STEP2: Select None option from the Select Items List checkbox."); + searchPage + .clickDetailedView() + .clickSelectedItemsListDropdownArrow() + .click_OptionFromSelectedListItemsDropdown("None"); + log.info("STEP3: Select Gallery View option and check all items are selected"); + searchPage + .clickGalleryView() + .assert_isNoneItemsCheckBoxChecked() + .clickDetailedView(); } @TestRail (id = "C12819") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed"}, priority = 2) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH}) public void facetedSearchInvertOption() { - LOG.info("STEP1: Select ALL option from the Select Items List checkbox."); - searchPage.clickSelectAll(); - assertTrue(searchPage.isALLItemsCheckboxChecked()); - LOG.info("STEP2: Select Invert option from the Select Items List checkbox."); - searchPage.clickDetailedView(); - searchPage.clickSelectedItemsListDropdownArrow(); - searchPage.clickOptionFromSelectedItemsListCheckbox("Invert"); - LOG.info("STEP3: Verify All items are selected checkbox."); - assertTrue(searchPage.isNoneItemsCheckboxChecked()); - cleanupAuthenticatedSession(); + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + log.info("STEP1: Select ALL option from the Select Items List checkbox."); + searchPage + .clickSelectAll() + .assert_isAllItemsCheckBoxChecked(); + log.info("STEP2: Select Invert option from the Select Items List checkbox."); + searchPage + .clickDetailedView() + .clickSelectedItemsListDropdownArrow(); + searchPage + .click_OptionFromSelectedListItemsDropdown("Invert"); + log.info("STEP3: Verify All items are selected checkbox."); + searchPage + .assert_isNoneItemsCheckBoxChecked(); } @TestRail (id = "C12821") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 5) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void facetedSearchDownloadAsZipAction() { - LOG.info("STEP1: Select 'ALL' option from the Select Items List checkbox."); - searchPage.clickSelectAll(); - assertTrue(searchPage.isALLItemsCheckboxChecked()); - LOG.info("STEP2: Click on 'Download as Zip' option from 'Selected Items...' dropdown."); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Download as Zip"); - LOG.info("STEP3: Choose Save option and verify archive is displayed in specified location."); - searchPage.acceptAlertIfDisplayed(); - assertTrue(isFileInDirectory("Archive", ".zip"), "The zip archive was not found in the specified location"); - cleanupAuthenticatedSession(); + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + log.info("STEP1: Select 'ALL' option from the Select Items List checkbox."); + searchPage + .clickSelectAll() + .assert_isAllItemsCheckBoxChecked(); + log.info("STEP2: Click on 'Download as Zip' option from 'Selected Items...' dropdown."); + searchPage + .clickSelectedItemsDropdown() + .click_OptionFromSelectedItemsDropdown("Download as Zip"); + log.info("STEP3: Choose Save option and verify archive is displayed in specified location."); + searchPage + .acceptAlertIfDisplayed(); } @TestRail (id = "C12823") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 6) - public void facetedSearchCopyToAction() - { - LOG.info("STEP1: Select the documents to be copied."); - searchPage.clickCheckbox(docName1); - LOG.info("STEP2: Click on 'Copy to...' option from 'Selected Items...' dropdown."); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Copy to..."); - LOG.info("STEP3: Copy the selected files to destination site."); - //copyMoveUnzipToDialog.selectAllSitesDestination(); - //copyMoveUnzipToDialog.selectSite(new SiteModel(siteForCopy)); - //copyMoveUnzipToDialog.clickDocumentLibrary(); - //copyMoveUnzipToDialog.clickCopyToButton(); - LOG.info("STEP7: Verify that the files have been copied"); - documentLibraryPage.navigate(siteForCopy); - getBrowser().waitInSeconds(1); - assertTrue(documentLibraryPage.isFileDisplayed(docName1)); + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void facetedSearchCopyToAction() { + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + + String userName = user.get().getUsername(); + log.info("STEP1: Select the documents to be copied."); + searchPage.click_checkBox(5); + log.info("STEP2: Click on 'Copy to...' option from 'Selected Items...' dropdown."); + searchPage + .clickSelectedItemsDropdown() + .click_OptionFromSelectedItemsDropdown("Copy to..."); + log.info("STEP3: Copy the selected files to destination site."); + copyMoveUnzipToDialog + .select_AllSitesDestination() + .select_Site(new SiteModel(siteForCopy)).clickDocumentsFolder(); + copyMoveUnzipToDialog + .clickCopyButton(); + log.info("STEP7: Verify that the files have been copied"); + documentLibraryPage + .navigate(siteForCopy); + documentLibraryPage + .assertFileIsDisplayed(docName1); contentService.deleteDocument(userName, password, siteForCopy, docName1); - cleanupAuthenticatedSession(); } @TestRail (id = "C12825") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 1) - public void facetedSearchMoveToAction() - { - LOG.info("STEP1: Select the document to move."); - searchPage.clickCheckbox(docForMove); - LOG.info("STEP2: Click on 'Move to...' option from 'Selected Items...' dropdown."); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Move to..."); - LOG.info("STEP3: Move the selected files to destination site."); - // copyMoveUnzipToDialog.selectAllSitesDestination(); - //copyMoveUnzipToDialog.selectSite(new SiteModel(siteForMove)); - //copyMoveUnzipToDialog.clickDocumentLibrary(); - ////copyMoveUnzipToDialog.clickButton("Move"); - LOG.info("STEP7: Verify that the files has been moved"); - documentLibraryPage.navigate(siteForMove); - assertTrue(documentLibraryPage.isContentNameDisplayed(docForMove)); - documentLibraryPage.navigate(siteName); - assertFalse(documentLibraryPage.isContentNameDisplayed(docForMove)); - cleanupAuthenticatedSession(); + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void facetedSearchMoveToAction() { + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docForMove); + log.info("STEP1: Select the document to move."); + searchPage + .click_checkBox(2); + log.info("STEP2: Click on 'Move to...' option from 'Selected Items...' dropdown."); + searchPage + .clickSelectedItemsDropdown() + .click_OptionFromSelectedItemsDropdown("Move to..."); + log.info("STEP3: Move the selected files to destination site."); + copyMoveUnzipToDialog + .select_AllSitesDestination() + .select_Site(new SiteModel(siteForMove)) + .clickDocumentsFolder() + .click_MoveButton(); + log.info("STEP7: Verify that the files has been moved"); + documentLibraryPage + .navigate(siteForMove); + documentLibraryPage + .assertFileIsDisplayed(docForMove); + documentLibraryPage + .navigate(siteName) + .assertFileIsNotDisplayed(docForMove); } @TestRail (id = "C12826") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 8) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void facetedSearchStartWorkflowAction() { - LOG.info("STEP1: Select a document to start workflow."); - searchPage.clickDetailedView(); - searchPage.clickCheckbox(docName1); - LOG.info("STEP2: Click on 'Start Workflow...' option from 'Selected Items...' dropdown."); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Start Workflow..."); - LOG.info("STEP 3: Select the workflow 'New Task' from the drop-down list."); - startWorkflowPage.selectAWorkflow("New Task"); - LOG.info("STEP 4: Add message, select a Due date, priority, assign it to you and click Start Workflow"); + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3); + + String userName = user.get().getUsername(); + log.info("STEP1: Select a document to start workflow."); + searchPage.clickDetailedView().click_checkBox(5); + log.info("STEP2: Click on 'Start Workflow...' option from 'Selected Items...' dropdown."); + searchPage + .clickSelectedItemsDropdown() + .click_OptionFromSelectedItemsDropdown("Start Workflow..."); + log.info("STEP 3: Select the workflow 'New Task' from the drop-down list."); + startWorkflowPage + .selectAWorkflow("New Task"); + log.info("STEP 4: Add message, select a Due date, priority, assign it to you and click Start Workflow"); startWorkflowPage.addWorkflowDescription("FacetedWorkflowDescription"); startWorkflowPage.selectCurrentDateFromDatePicker(); startWorkflowPage.selectWorkflowPriority("High"); startWorkflowPage.clickOnSelectButtonSingleAssignee(); selectAssigneeToWorkflowPopUp.searchUser(userName); - selectPopUpPage.clickAddIcon("FirstName LastName (" + userName + ")"); + selectPopUpPage.clickAddIcon("FN-"+(userName) +" "+ "LN-"+(userName)+" "+"("+(userName)+")"); selectAssigneeToWorkflowPopUp.clickOkButton(); startWorkflowPage.clickStartWorkflow(); userDashboardPage.navigate(userName); -// assertTrue(myTasksDashlet.assertTaskNameEqualsTo("FacetedWorkflowDescription"), "Task is not present in Active tasks"); - cleanupAuthenticatedSession(); + myTasksDashlet.assertTaskNameEqualsTo("FacetedWorkflowDescription"); } @TestRail (id = "C12828") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 10) - public void facetedSearchDeleteAction() - { + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) + public void facetedSearchDeleteAction() throws InterruptedException { + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3) + .assertCreatedDataIsDisplayed(docForDelete); + + String userName = user.get().getUsername(); int retry = 0; - boolean status = false; + boolean status; - LOG.info("STEP1: Select the document to delete."); - searchPage.clickCheckbox(docForDelete); - LOG.info("STEP2: Click on 'Delete' option from 'Selected Items...' dropdown and confirm deletion."); - searchPage.clickSelectedItemsDropdown(); - searchPage.clickOptionFromSelectedItemsDropdown("Delete"); - searchPage.deleteDocuments(true); - getBrowser().waitInSeconds(10); - LOG.info("STEP3: Verify that the file has been deleted."); + log.info("STEP1: Select the document to delete."); + searchPage.click_checkBox(1); + log.info("STEP2: Click on 'Delete' option from 'Selected Items...' dropdown and confirm deletion."); + searchPage + .clickSelectedItemsDropdown() + .click_OptionFromSelectedItemsDropdown("Delete"); + searchPage + .deleteDocuments(true); + log.info("STEP3: Verify that the file has been deleted."); toolbar.search(docForDelete); - status = searchPage.isResultFound(docForDelete); + status = searchPage.is_ResultFound(); if (retry < 5 && status == true) { toolbar.search(docForDelete); status = searchPage.isResultFound(docForDelete); retry++; - getBrowser().waitInSeconds(2); } assertFalse(status, docForDelete + " is still found by search"); - LOG.info("STEP4: Verify that the deleted file is present in Trashcan."); + log.info("STEP4: Verify that the deleted file is present in Trashcan."); userTrashcanPage.navigate(userName); assertTrue(userTrashcanPage.getItemsNamesList().contains(docForDelete), docForDelete + " isn't displayed in Trashcan."); - cleanupAuthenticatedSession(); } @TestRail (id = "C12832, C12831") - @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH, "tobefixed" }, priority = 9) + @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void stateOfCheckbox() { - LOG.info("STEP1: Observe that Selected Items' drop down menu is disabled; 'Check box' drop down menu is enabled"); + toolbar + .search(searchTerm); + log.info("Verify search items are displayed."); + searchPage + .clickSortDropDown_CreatedDate() + .assertCreatedDataIsDisplayed(docName1) + .assertCreatedDataIsDisplayed(docName2) + .assertCreatedDataIsDisplayed(docName3) + .assertCreatedDataIsDisplayed(docForDelete); + + String userName = user.get().getUsername(); + log.info("STEP1: Observe that Selected Items' drop down menu is disabled; 'Check box' drop down menu is enabled"); assertEquals(searchPage.getSelectedItemsState(), "true", "Selected Items menu is not disabled"); assertTrue(searchPage.isNoneItemsCheckboxChecked()); - LOG.info("STEP1: Select 'ALL' option from the Select Items List checkbox."); + log.info("STEP1: Select 'ALL' option from the Select Items List checkbox."); searchPage.clickSelectAll(); - LOG.info("STEP2: Observe that Selected Items' drop down menu is enabled; 'Check box' drop down menu is enabled."); + log.info("STEP2: Observe that Selected Items' drop down menu is enabled; 'Check box' drop down menu is enabled."); assertEquals(searchPage.getSelectedItemsState(), "false", "Selected Items menu is disabled"); assertFalse(searchPage.isNoneItemsCheckboxChecked()); assertTrue(searchPage.isALLItemsCheckboxChecked()); - cleanupAuthenticatedSession(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/PeopleFinderPageTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/PeopleFinderPageTest.java index e7a987a624..b8592b2173 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/PeopleFinderPageTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/PeopleFinderPageTest.java @@ -1,65 +1,93 @@ package org.alfresco.share.searching.peopleFinder; -import org.alfresco.po.share.Notification; +import lombok.extern.slf4j.Slf4j; +import org.alfresco.po.share.PageNotification; import org.alfresco.po.share.PeopleFinderPage; +import org.alfresco.po.share.searching.SearchPage; +import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.profile.UserProfilePage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class PeopleFinderPageTest extends ContextAwareWebTest +@Slf4j + +public class PeopleFinderPageTest extends BaseTest { - //@Autowired - PeopleFinderPage peopleFinderPage; - //@Autowired UserProfilePage userProfilePage; + SearchPage searchPage; + Toolbar toolbar; + PageNotification pageNotification; + PeopleFinderPage getPeopleFinderPage; + private final String password = "password"; + private UserModel testUser1; + private UserModel testUser2; + + String userName2 = String.format("User2%s", RandomData.getRandomAlphanumeric()); + String userName1 = String.format("User1%s", RandomData.getRandomAlphanumeric()); - @Autowired - Notification notification; + @BeforeMethod(alwaysRun = true) + public void testSetup() { + log.info("Precondition1: Test user is created"); + testUser1 = dataUser.usingAdmin().createUser(userName1, password); + testUser2 = dataUser.usingAdmin().createUser(userName2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + searchPage = new SearchPage(webDriver); + userProfilePage = new UserProfilePage(webDriver); + toolbar = new Toolbar(webDriver); + getPeopleFinderPage = new PeopleFinderPage(webDriver); + pageNotification = new PageNotification(webDriver); + } + + @AfterMethod(alwaysRun = true) + public void cleanup() + { + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + } @TestRail (id = "C5823") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void verifyPeopleFinderPage() { - String userName1 = String.format("User1%s", RandomData.getRandomAlphanumeric()); - String userName2 = String.format("User2%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, userName1, password, userName1 + domain, userName1, userName1); - userService.create(adminUser, adminPassword, userName2, password, userName2 + domain, userName2, userName2); - setupAuthenticatedSession(userName1, password); - peopleFinderPage.navigate(); - - LOG.info("STEP 1 - Verify page title"); -// Assert.assertEquals(peopleFinderPage.getPageTitle(), language.translate("peopleFinder.pageTitle"), "Page title"); - - LOG.info("STEP 2 - Verify Search section"); - Assert.assertTrue(peopleFinderPage.isSearchInputFieldDisplayed(), "Search input is displayed"); - Assert.assertEquals(peopleFinderPage.getSearchInputFieldPlaceholder(), + + authenticateUsingLoginPage(testUser2); + + getPeopleFinderPage.navigateToPeopleFinderPage(); + + log.info("STEP 1 - Verify page title"); + Assert.assertEquals(getPeopleFinderPage.getPageTitle(),language.newTranslate("People Finder")); + + log.info("STEP 2 - Verify Search section"); + Assert.assertTrue(getPeopleFinderPage.isSearchInputFieldDisplayed(), "Search input is displayed"); + Assert.assertEquals(getPeopleFinderPage.getSearchInputFieldPlaceholder(), language.translate("peopleFinder.searchPlaceholder"), "Search input placeholder"); - Assert.assertTrue(peopleFinderPage.isSearchButtonDisplayed(), "\"Search\" button is displayed"); - Assert.assertTrue(peopleFinderPage.isHelpMessageDisplayed(), "Help message is displayed"); - Assert.assertEquals(peopleFinderPage.getSearchHelpMessage(), + Assert.assertTrue(getPeopleFinderPage.isSearchButtonDisplayed(), "\"Search\" button is displayed"); + Assert.assertTrue(getPeopleFinderPage.isHelpMessageDisplayed(), "Help message is displayed"); + Assert.assertEquals(getPeopleFinderPage.getSearchHelpMessage(), language.translate("peopleFinder.searchResultsMessage"), "Search results message"); - LOG.info("STEP 3 - Fill in search field (e.g: user2) and click \"search\" button"); - peopleFinderPage.search(userName2); - Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), + log.info("STEP 3 - Fill in search field (e.g: user2) and click \"search\" button"); + authenticateUsingLoginPage(testUser1); + getPeopleFinderPage.navigateToPeopleFinderPage(); + getPeopleFinderPage.search(userName2); + Assert.assertEquals(getPeopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), userName2, "1"), "Search results info"); - Assert.assertTrue(peopleFinderPage.isFollowButtonDisplayed(userName2), "\"Follow\" button is displayed"); - Assert.assertEquals(peopleFinderPage.getNumberOfSearchResults(), 1, "Number of search results"); - Assert.assertTrue(peopleFinderPage.isUserAvatarDisplayed(userName2), userName2 + " avatar is displayed"); + Assert.assertTrue(getPeopleFinderPage.isFollowButtonDisplayed(userName2), "\"Follow\" button is displayed"); + Assert.assertEquals(getPeopleFinderPage.getNumberOfSearchResults(), 1, "Number of search results"); + Assert.assertTrue(getPeopleFinderPage.isUserAvatarDisplayed(userName2), userName2 + " avatar is displayed"); - LOG.info("STEP 4 - Click a user link from search results (e.g: user2)"); - peopleFinderPage.clickUserLink(userName2); + log.info("STEP 4 - Click a user link from search results (e.g: user2)"); + getPeopleFinderPage.clickUserLink(userName2); Assert.assertTrue(userProfilePage.isAboutHeaderDisplayed(), "\"About\" header is displayed"); - userService.delete(adminUser, adminPassword, userName1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName1); - userService.delete(adminUser, adminPassword, userName2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName2); } @@ -67,37 +95,34 @@ public void verifyPeopleFinderPage() @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void noResultsFound() { - String userName1 = String.format("User1%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, userName1, password, userName1 + domain, userName1, userName1); - setupAuthenticatedSession(userName1, password); - peopleFinderPage.navigate(); - - LOG.info("STEP 1 - Fill in 'search' field with an nonexistent user"); - peopleFinderPage.typeSearchInput("TestDocument"); - Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "TestDocument", "Search input value"); - - LOG.info("STEP 2 - Click \"Search\" button"); - peopleFinderPage.clickSearchAndWaitForResults(); - Assert.assertEquals(peopleFinderPage.getNoResultsText(), language.translate("peopleFinder.noResults"), "No results found translation"); - userService.delete(adminUser, adminPassword, userName1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName1); + + authenticateUsingLoginPage(testUser1); + getPeopleFinderPage.navigateToPeopleFinderPage(); + + log.info("STEP 1 - Fill in 'search' field with an nonexistent user"); + getPeopleFinderPage.typeSearchInput("TestDocument"); + Assert.assertEquals(getPeopleFinderPage.getSearchInputFieldValue(), "TestDocument", "Search input value"); + + log.info("STEP 2 - Click \"Search\" button"); + getPeopleFinderPage.clickSearchAndWaitForResults(); + Assert.assertEquals(getPeopleFinderPage.getNoResultsText(), language.translate("peopleFinder.noResults"), "No results found translation"); + } @TestRail (id = "C5825") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void emptyInputSearchField() { - String userName1 = String.format("User1%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, userName1, password, userName1 + domain, userName1, userName1); - setupAuthenticatedSession(userName1, password); - peopleFinderPage.navigate(); - - LOG.info("STEP 1 - Click \"Search\" button"); - peopleFinderPage.clickSearch(); - Assert.assertEquals(notification.getDisplayedNotification(), language.translate("peopleFinder.emptyValueSearchNotification"), "Empty search input field search error"); - Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "", "Search input value"); - Assert.assertEquals(peopleFinderPage.getSearchHelpMessage(), language.translate("peopleFinder.searchResultsMessage"), "Search help message"); - userService.delete(adminUser, adminPassword, userName1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName1); + + authenticateUsingLoginPage(testUser1); + getPeopleFinderPage.navigateToPeopleFinderPage(); + + log.info("STEP 1 - Click \"Search\" button"); + getPeopleFinderPage.clickSearch(); + + Assert.assertEquals(pageNotification.getDisplayedNotification(), language.translate("peopleFinder.emptyValueSearchNotification"), "Empty search input field search error"); + Assert.assertEquals(getPeopleFinderPage.getSearchInputFieldValue(), "", "Search input value"); + Assert.assertEquals(getPeopleFinderPage.getSearchHelpMessage(), language.translate("peopleFinder.searchResultsMessage"), "Search help message"); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/SearchByProfilePropertiesTest.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/SearchByProfilePropertiesTest.java index f6c5b227b6..5feccee40a 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/SearchByProfilePropertiesTest.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/searching/peopleFinder/SearchByProfilePropertiesTest.java @@ -1,69 +1,124 @@ package org.alfresco.share.searching.peopleFinder; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.PeopleFinderPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.admin.adminTools.usersAndGroups.EditUserPage; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; +import org.alfresco.utility.model.UserModel; import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - -public class SearchByProfilePropertiesTest extends ContextAwareWebTest +@Slf4j +public class SearchByProfilePropertiesTest extends BaseTest { - //@Autowired + private UserModel testUser; + private UserModel testUser1; + private UserModel testUser2; + private final String password = "password"; PeopleFinderPage peopleFinderPage; - + private EditUserPage editUserPage; + @BeforeMethod (alwaysRun = true) + public void beforeTest() + { + editUserPage = new EditUserPage(webDriver); + peopleFinderPage = new PeopleFinderPage(webDriver); + } + @AfterMethod(alwaysRun = true) + public void cleanUp() + { + deleteUsersIfNotNull(testUser); + deleteUsersIfNotNull(testUser1); + deleteUsersIfNotNull(testUser2); + } @TestRail (id = "C6655") @Test (groups = { TestGroup.SANITY, TestGroup.SEARCH }) public void searchByUsernameOrName() { String identifier = RandomData.getRandomAlphanumeric(); - userService.create(adminUser, adminPassword, "test" + identifier, password, "test" + identifier + domain, "firstName" + identifier, "lastName" + identifier); - userService.create(adminUser, adminPassword, "user1" + identifier, password, "user1" + identifier + domain, "test" + identifier, "lastName" + identifier); - userService.create(adminUser, adminPassword, "user2" + identifier, password, "user2" + identifier + domain, "firstName" + identifier, "test" + identifier); - setupAuthenticatedSession("test" + identifier, password); + log.info("PreCondition: Test users are created"); + final String user = "test" + identifier; + final String user1 = "user1" + identifier; + final String user2 = "user2" + identifier; + testUser = dataUser.usingAdmin().createUser(user, password); + testUser1 = dataUser.usingAdmin().createUser(user1, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + + log.info("Edit user data & give specific name to " + testUser); + UserModel editUser = testUser; + String firstName = "firstName" + identifier; + String lastName = "lastName" + identifier; + String email = "test" + identifier + "@test.com"; + editUserPage.navigate(editUser) + .editFirstName(firstName) + .editLastNameField(lastName) + .editEmailField(email) + .clickSaveChanges(); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser1 = testUser1; + String firstName1 = "test" + identifier; + String lastName1 = "lastName" + identifier; + String email1 = "user1" + identifier + "@test.com"; + editUserPage.navigate(editUser1) + .editFirstName(firstName1) + .editLastNameField(lastName1) + .editEmailField(email1) + .clickSaveChanges(); + + log.info("Edit user data & give specific name to " + testUser2); + UserModel editUser2 = testUser2; + String firstName2 = "firstname" + identifier; + String lastName2 = "test" + identifier; + String email2 = "user2" + identifier + "@test.com"; + + editUserPage.navigate(editUser2) + .editFirstName(firstName2) + .editLastNameField(lastName2) + .editEmailField(email2) + .clickSaveChanges(); + + authenticateUsingLoginPage(testUser); peopleFinderPage.navigate(); - LOG.info("STEP 1 - Enter a First Name (e.g.: firstName) into Search field"); + log.info("STEP 1 - Enter a First Name (e.g.: firstName) into Search field"); peopleFinderPage.typeSearchInput("firstName" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "firstName" + identifier, "Search input value"); - LOG.info("STEP 2 - Click \"Search\" button"); + log.info("STEP 2 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "firstName" + identifier, "2"), "Search results info"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("test" + identifier), "User " + "test" + identifier + " is displayed"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("user2" + identifier), "User " + "user2" + identifier + " is displayed"); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser.getUsername()), "User " + "test" + identifier + " is displayed"); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser2.getUsername()), "User " + "user2" + identifier + " is displayed"); - LOG.info("STEP 3 - Enter a Last Name (e.g.: lastName) into Search field"); + log.info("STEP 3 - Enter a Last Name (e.g.: lastName) into Search field"); peopleFinderPage.typeSearchInput("lastName" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "lastName" + identifier, "Search input value"); - LOG.info("STEP 4 - Click \"Search\" button"); + log.info("STEP 4 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "lastName" + identifier, "2"), "Search results info"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("test" + identifier), "User " + "test" + identifier + " is displayed"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("user1" + identifier), "User " + "user1" + identifier + " is displayed"); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser.getUsername()), "User " + "test" + identifier + " is displayed"); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser1.getUsername()), "User " + "user1" + identifier + " is displayed"); - LOG.info("STEP 5 - Enter a User Name (e.g.: test) into Search field"); + log.info("STEP 5 - Enter a User Name (e.g.: test) into Search field"); peopleFinderPage.typeSearchInput("test" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "test" + identifier, "Search input value"); - LOG.info("STEP 6 - Click \"Search\" button"); + log.info("STEP 6 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "test" + identifier, "3"), "Search results info"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("test" + identifier), "User " + "test" + identifier + " is displayed"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("user1" + identifier), "User " + "user1" + identifier + " is displayed"); - Assert.assertTrue(peopleFinderPage.isUserDisplayed("user2" + identifier), "User " + "user2" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, "test" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "test" + identifier); - userService.delete(adminUser, adminPassword, "user1" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user1" + identifier); - userService.delete(adminUser, adminPassword, "user2" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user2" + identifier); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser.getUsername()), "User " + "test" + identifier + " is displayed"); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser1.getUsername()), "User " + "user1" + identifier + " is displayed"); + Assert.assertTrue(peopleFinderPage.isUserDisplayed(testUser2.getUsername()), "User " + "user2" + identifier + " is displayed"); } @@ -72,25 +127,52 @@ public void searchByUsernameOrName() public void searchByFullUsername() { String identifier = RandomData.getRandomAlphanumeric(); - userService.create(adminUser, adminPassword, "user1" + identifier, password, "user1" + identifier + domain, "firstName" + identifier, "lastName" + identifier); - userService.create(adminUser, adminPassword, "user2" + identifier, password, "user2" + identifier + domain, "firstName" + identifier, "lastName" + identifier); - setupAuthenticatedSession("user1" + identifier, password); + log.info("PreCondition1: Any test users are created"); + final String user1 = "user1" + identifier; + final String user2 = "user2" + identifier; + + testUser1 = dataUser.usingAdmin().createUser(user1, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser1 = testUser1; + String firstName1 = "firstname" + identifier; + String lastName1 = "lastName" + identifier; + String email1 = "user1" + identifier + "@test.com"; + + editUserPage.navigate(editUser1) + .editFirstName(firstName1) + .editLastNameField(lastName1) + .editEmailField(email1) + .clickSaveChanges(); + + log.info("Edit user data & give specific name to " + testUser2); + UserModel editUser2 = testUser2; + String firstName2 = "firstname" + identifier; + String lastName2 = "lastname" + identifier; + String email2 = "user2" + identifier + "@test.com"; + + editUserPage.navigate(editUser2) + .editFirstName(firstName2) + .editLastNameField(lastName2) + .editEmailField(email2) + .clickSaveChanges(); + + authenticateUsingLoginPage(testUser1); peopleFinderPage.navigate(); - LOG.info("STEP 1 - Fill in search field with username (e.g: user2)"); + log.info("STEP 1 - Fill in search field with username (e.g: user2)"); peopleFinderPage.typeSearchInput("user2" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "user2" + identifier, "Search input value"); - LOG.info("STEP 2 - Click 'Search' button"); + log.info("STEP 2 - Click 'Search' button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "user2" + identifier, "1"), "Search results info"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user2" + identifier), "User " + "user2" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, "user1" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user1" + identifier); - userService.delete(adminUser, adminPassword, "user2" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user2" + identifier); } @TestRail (id = "C6455") @@ -98,25 +180,53 @@ public void searchByFullUsername() public void searchByPartialUsername() { String identifier = RandomData.getRandomAlphanumeric(); - userService.create(adminUser, adminPassword, "user" + identifier + "1", password, "user" + identifier + "1" + domain, "firstName" + identifier, "lastName" + identifier); - userService.create(adminUser, adminPassword, "user" + identifier + "2", password, "user" + identifier + "2" + domain, "firstName" + identifier, "lastName" + identifier); - setupAuthenticatedSession("user" + identifier + "1", password); + log.info("PreCondition1: Any test user is created"); + final String user1 = "user" + identifier + "1"; + final String user2 = "user" + identifier + "2"; + + testUser1 = dataUser.usingAdmin().createUser(user1, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser1 = testUser1; + String firstName1 = "firstname" + identifier; + String lastName1 = "lastName" + identifier; + String email1 = "user" + identifier + "1" + "@test.com"; + + editUserPage.navigate(editUser1) + .editFirstName(firstName1) + .editLastNameField(lastName1) + .editEmailField(email1) + .clickSaveChanges(); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser2 = testUser2; + String firstName2 = "firstname" + identifier; + String lastName2 = "lastname" + identifier; + String email2 = "user" + identifier + "2" + "@test.com"; + + editUserPage.navigate(editUser2) + .editFirstName(firstName2) + .editLastNameField(lastName2) + .editEmailField(email2) + .clickSaveChanges(); + + authenticateUsingLoginPage(testUser1); peopleFinderPage.navigate(); - LOG.info("STEP 1 - Fill in search field with a partial username (e.g: \"us\")"); + log.info("STEP 1 - Fill in search field with a partial username (e.g: \"us\")"); peopleFinderPage.typeSearchInput("user" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "user" + identifier, "Search input value"); - LOG.info("STEP 2 - Click \"Search\" button"); + log.info("STEP 2 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "user" + identifier, "2"), "Search results info"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user" + identifier + "1"), "User " + "user" + identifier + "1" + " is displayed"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user" + identifier + "2"), "User " + "user" + identifier + "2" + " is displayed"); - userService.delete(adminUser, adminPassword, "user" + identifier + "1"); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user" + identifier + "1"); - userService.delete(adminUser, adminPassword, "user" + identifier + "2"); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user" + identifier + "2"); + } @TestRail (id = "C5822") @@ -124,35 +234,62 @@ public void searchByPartialUsername() public void searchByFullName() { String identifier = RandomData.getRandomAlphanumeric(); - userService.create(adminUser, adminPassword, "user1" + identifier, password, "user1" + identifier + domain, identifier, identifier); - userService.create(adminUser, adminPassword, "user2" + identifier, password, "user2" + identifier + domain, "firstName" + identifier, "lastName" + identifier); - setupAuthenticatedSession("user1" + identifier, password); + log.info("PreCondition1: Any test users are created"); + final String user1 = "user1" + identifier; + final String user2 = "user2" + identifier; + + testUser1 = dataUser.usingAdmin().createUser(user1, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser1 = testUser1; + String firstName1 = identifier; + String lastName1 = identifier; + String email1 = "user1" + identifier + "@test.com"; + + editUserPage.navigate(editUser1) + .editFirstName(firstName1) + .editLastNameField(lastName1) + .editEmailField(email1) + .clickSaveChanges(); + + log.info("Edit user data & give specific name to " + testUser2); + UserModel editUser2 = testUser2; + String firstName2 = "firstname" + identifier; + String lastName2 = "lastname" + identifier; + String email2 = "user2" + identifier + "@test.com"; + + editUserPage.navigate(editUser2) + .editFirstName(firstName2) + .editLastNameField(lastName2) + .editEmailField(email2) + .clickSaveChanges(); + + authenticateUsingLoginPage(testUser1); peopleFinderPage.navigate(); - LOG.info("STEP 1 - Fill in search field with user's full name (e.g.: \"firstName lastName\")"); + log.info("STEP 1 - Fill in search field with user's full name (e.g.: \"firstName lastName\")"); peopleFinderPage.typeSearchInput("firstName" + identifier + " lastName" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "firstName" + identifier + " lastName" + identifier, "Search input value"); - LOG.info("STEP 2 - Click \"Search\" button"); + log.info("STEP 2 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "firstName" + identifier + " lastName" + identifier, "1"), "Search results info"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user2" + identifier), "User " + "user2" + identifier + " is displayed"); - LOG.info("STEP 3 - Fill in search field with user's full name (e.g.: \"lastName firstName\")"); + log.info("STEP 3 - Fill in search field with user's full name (e.g.: \"lastName firstName\")"); peopleFinderPage.typeSearchInput("lastName" + identifier + " firstName" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "lastName" + identifier + " firstName" + identifier, "Search input value"); - LOG.info("STEP 4 - Click \"Search\" button"); + log.info("STEP 4 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "lastName" + identifier + " firstName" + identifier, "1"), "Search results info"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user2" + identifier), "User " + "user2" + identifier + " is displayed"); - userService.delete(adminUser, adminPassword, "user1" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user1" + identifier); - userService.delete(adminUser, adminPassword, "user2" + identifier); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user2" + identifier); } @TestRail (id = "C5832") @@ -160,24 +297,51 @@ public void searchByFullName() public void searchByPartialName() { String identifier = RandomData.getRandomAlphanumeric(); - userService.create(adminUser, adminPassword, "user" + identifier + "1", password, "user" + identifier + "1" + domain, "firstName" + identifier, "lastName" + identifier); - userService.create(adminUser, adminPassword, "user" + identifier + "2", password, "user" + identifier + "2" + domain, "firstName" + identifier, "lastName" + identifier); - setupAuthenticatedSession("user" + identifier + "1", password); + log.info("PreCondition1: Any test users are created"); + final String user1 = "user" + identifier + "1"; + final String user2 = "user" + identifier + "2"; + + testUser1 = dataUser.usingAdmin().createUser(user1, password); + testUser2 = dataUser.usingAdmin().createUser(user2, password); + getCmisApi().authenticateUser(getAdminUser()); + authenticateUsingLoginPage(getAdminUser()); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser1 = testUser1; + String firstName1 = "firstname" + identifier; + String lastName1 = "lastName" + identifier; + String email1 = "user" + identifier + "1" + "@test.com"; + + editUserPage.navigate(editUser1) + .editFirstName(firstName1) + .editLastNameField(lastName1) + .editEmailField(email1) + .clickSaveChanges(); + + log.info("Edit user data & give specific name to " + testUser1); + UserModel editUser2 = testUser2; + String firstName2 = "firstname" + identifier; + String lastName2 = "lastname" + identifier; + String email2 = "user" + identifier + "2" + "@test.com"; + + editUserPage.navigate(editUser2) + .editFirstName(firstName2) + .editLastNameField(lastName2) + .editEmailField(email2) + .clickSaveChanges(); + + authenticateUsingLoginPage(testUser1); peopleFinderPage.navigate(); - LOG.info("STEP 1 - Fill in search field with a partial name (e.g: \"firstname\")"); + log.info("STEP 1 - Fill in search field with a partial name (e.g: \"firstname\")"); peopleFinderPage.typeSearchInput("firstName" + identifier); Assert.assertEquals(peopleFinderPage.getSearchInputFieldValue(), "firstName" + identifier, "Search input value"); - LOG.info("STEP 2 - Click \"Search\" button"); + log.info("STEP 2 - Click \"Search\" button"); peopleFinderPage.clickSearchAndWaitForResults(); Assert.assertEquals(peopleFinderPage.getSearchResultsInfo(), String.format(language.translate("peopleFinder.searchResultsInfo"), "firstName" + identifier, "2"), "Search results info"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user" + identifier + "1"), "User " + "user" + identifier + "1" + " is displayed"); Assert.assertTrue(peopleFinderPage.isUserDisplayed("user" + identifier + "2"), "User " + "user" + identifier + "2" + " is displayed"); - userService.delete(adminUser, adminPassword, "user" + identifier + "1"); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user" + identifier + "1"); - userService.delete(adminUser, adminPassword, "user" + identifier + "2"); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + "user" + identifier + "2"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DashboardXSSTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DashboardXSSTests.java index 7fb85487f8..4a133e5412 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DashboardXSSTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DashboardXSSTests.java @@ -3,117 +3,125 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; import org.alfresco.common.DataProviderClass; -import org.alfresco.dataprep.DashboardCustomization.DashletLayout; -import org.alfresco.dataprep.DashboardCustomization.UserDashlet; -import org.alfresco.dataprep.SiteService; -import org.alfresco.po.enums.DashletHelpIcon; + import org.alfresco.po.share.dashlet.ConfigureWebViewDashletPopUp; +import org.alfresco.po.share.dashlet.Dashlets; import org.alfresco.po.share.dashlet.WebViewDashlet; -import org.alfresco.po.share.site.EditSiteDetailsDialog; +import org.alfresco.po.share.site.EditSiteDetails; import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.CustomizeUserDashboardPage; +import org.alfresco.po.share.user.UserDashboardPage; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; -public class DashboardXSSTests extends ContextAwareWebTest +@Slf4j +public class DashboardXSSTests extends BaseTest { - //@Autowired + CustomizeUserDashboardPage customizeUserDashboard; SiteDashboardPage siteDashboardPage; - @Autowired - EditSiteDetailsDialog editSiteDetailsDialog; - //@Autowired + EditSiteDetails editSiteDetailsDialog; private WebViewDashlet webViewDashlet; - // @Autowired private ConfigureWebViewDashletPopUp configureWebViewDashletPopUp; - private String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - private String testUser = String.format("TestUser_" + uniqueIdentifier); - private String siteName = String.format("SiteName" + uniqueIdentifier); + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) - public void beforeClass() + @BeforeMethod(alwaysRun = true) + public void preConditions() { - userService.create(adminUser, adminPassword, testUser, password, testUser + domain, "testUser_firstName", "testUser_lastName"); - siteService.create(testUser, password, domain, siteName, siteName, "description", SiteService.Visibility.PUBLIC); - - LOG.info("Precondition 1: Any user logged in Share."); - setupAuthenticatedSession(testUser, password); + log.info("PreCondition: Creating a TestUser1"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a Random Site"); + site.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + webViewDashlet = new WebViewDashlet(webDriver); + configureWebViewDashletPopUp = new ConfigureWebViewDashletPopUp(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + customizeUserDashboard = new CustomizeUserDashboardPage(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + editSiteDetailsDialog = new EditSiteDetails(webDriver); + + log.info("Precondition 1: Any user logged in Share."); + authenticateUsingLoginPage(user1.get()); addWebViewDashletToDashboard(); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - siteService.delete(testUser, password, siteName); - cleanupAuthenticatedSession(); - userService.delete(adminUser, adminPassword, testUser); + deleteUsersIfNotNull(user1.get()); + deleteSitesIfNotNull(site.get()); + deleteAllCookiesIfNotNull(); } - @TestRail (id = "C286554") - @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class) + @Test(groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class) public void configureWebViewForUserDashboard(String XSSString) { - LOG.info("Precondition 2: Add 'Web View' to user dashboard."); + log.info("Precondition 2: Add 'Web View' to user dashboard."); - LOG.info("STEP 1: Click Configure icon on Web View dashlet."); + log.info("STEP 1: Click Configure icon on Web View dashlet."); webViewDashlet.clickConfigureDashlet(); assertTrue(configureWebViewDashletPopUp.isConfigureWebViewDashletPopUpDisplayed(), "'Configure Web View Dashlet' PopUp could not be opened."); - LOG.info("STEP 2: Enter into Link Title field XSS string, try the next cases: '" + XSSString + "'."); + log.info("STEP 2: Enter into Link Title field XSS string, try the next cases: '" + XSSString + "'."); configureWebViewDashletPopUp.setLinkTitleField(XSSString); - LOG.info("STEP 3: Enter into \"URL\" field XSS string, try the next cases: '" + XSSString + "'."); + log.info("STEP 3: Enter into \"URL\" field XSS string, try the next cases: '" + XSSString + "'."); configureWebViewDashletPopUp.setUrlField(XSSString); - LOG.info("STEP 4: Click OK button;"); + log.info("STEP 4: Click OK button;"); configureWebViewDashletPopUp.clickOkButtonSimple(); assertTrue(configureWebViewDashletPopUp.isConfigureWebViewDashletPopUpDisplayed(), "'Configure Web View Dashlet' PopUp is not opened anymore."); assertTrue(configureWebViewDashletPopUp.isUrlErrorMessageDisplayed(), "Error message is not displayed"); - LOG.info("Close the PopUp."); + log.info("Close the PopUp."); configureWebViewDashletPopUp.clickClose(); } @TestRail (id = "C286570") @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class) - public void editingSiteDetailsWithXSS(String XSSString) - { - LOG.info("Precondition 2: Create a new site."); + public void editingSiteDetailsWithXSS(String XSSString) { + log.info("Precondition 2: Create a new site."); - LOG.info("STEP 1: Open created site."); + log.info("STEP 1: Open created site."); //Navigation to siteDashboard is performed in navigateToEditSiteDetailsDialog() method - LOG.info("STEP 2: Navigate to 'More' menu and select 'Edit Site Details' button."); - siteDashboardPage.navigateToEditSiteDetailsDialog(siteName); + log.info("STEP 2: Navigate to 'More' menu and select 'Edit Site Details' button."); + siteDashboardPage.navigateToEditSiteDetailsDialog(site.get().getId()); assertTrue(editSiteDetailsDialog.isEditSiteDetailsDialogDisplayed(), "'Edit Site Details' dialog could not be opened."); - LOG.info("STEP 3: Enter into \"Name \" and \"Description\" fields: '" + XSSString + "'."); + log.info("STEP 3: Enter into \"Name \" and \"Description\" fields: '" + XSSString + "'."); editSiteDetailsDialog.typeDetails(XSSString, XSSString); assertEquals(editSiteDetailsDialog.getTitleInputText(), XSSString, "'Name' input was not filled with '" + XSSString + "'."); - LOG.info("STEP 4: Click 'OK' button."); + log.info("STEP 4: Click 'OK' button."); editSiteDetailsDialog.clickSaveButton(); assertTrue(siteDashboardPage.isSiteVisibilityDisplayed(), "Site Dashboard page could not be rendered."); assertEquals(siteDashboardPage.getSiteName(), XSSString, "'Site Title' is not '" + XSSString + "' as expected."); - LOG.info("STEP 4: Navigate to 'Edit Site Details' PopUp."); - siteDashboardPage.navigateToEditSiteDetailsDialog(siteName); + log.info("STEP 4: Navigate to 'Edit Site Details' PopUp."); + siteDashboardPage.navigateToEditSiteDetailsDialog(site.get().getId()); - LOG.info("STEP 5: Check if site 'Name' and 'Description' = '" + XSSString + "'."); + log.info("STEP 5: Check if site 'Name' and 'Description' = '" + XSSString + "'."); assertEquals(editSiteDetailsDialog.getTitleInputText(), XSSString, "'Site Name' is not equal to '" + XSSString + "'."); assertEquals(editSiteDetailsDialog.getDescriptionInputText(), XSSString, "'Site Description' is not equal to '" + XSSString + "'."); - LOG.info("Close 'Edit Site Details' PopUp"); + log.info("Close 'Edit Site Details' PopUp"); editSiteDetailsDialog.clickCloseCreateSitePopup(); } @@ -121,13 +129,13 @@ public void editingSiteDetailsWithXSS(String XSSString) * Add 'Web View' dashlet to user dashboard if it is not already displayed * And then check if it was successfully added. */ - private void addWebViewDashletToDashboard() - { - if (!webViewDashlet.isDashletDisplayed(DashletHelpIcon.WEB_VIEW)) - { - userService.addDashlet(testUser, password, UserDashlet.WEB_VIEW, DashletLayout.THREE_COLUMNS, 3, 1); - } - Assert.assertEquals(webViewDashlet.getDashletTitle(), "Web View", "'Web View' dashlet is not displayed in user's dashboard."); + private void addWebViewDashletToDashboard(){ + customizeUserDashboard.navigate() + .clickAddDashlet() + .addDashlet(Dashlets.WEB_VIEW, 1) + .assertDashletIsAddedInColumn(Dashlets.WEB_VIEW, 1) + .clickOk(); + userDashboardPage.assertCustomizeUserDashboardIsDisplayed() + .assertDashletIsAddedInPosition(Dashlets.WEB_VIEW, 1, 3); } - } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DataListXSSTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DataListXSSTests.java index 7b283608f6..6d9ff5cc10 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DataListXSSTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/DataListXSSTests.java @@ -3,117 +3,133 @@ import java.util.Arrays; import java.util.List; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.common.DataProviderClass; -import org.alfresco.dataprep.DashboardCustomization.DashletLayout; -import org.alfresco.dataprep.DashboardCustomization.SiteDashlet; + +import org.alfresco.dataprep.DataListsService; import org.alfresco.dataprep.DataListsService.DataList; -import org.alfresco.dataprep.SiteService; -import org.alfresco.po.enums.DashletHelpIcon; + import org.alfresco.po.enums.DataListTypes; -import org.alfresco.po.share.dashlet.SiteDataListsDashlet; +import org.alfresco.po.share.site.CustomizeSiteDashboardPage; import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.po.share.site.dataLists.ContactListSelectedContent; -import org.alfresco.po.share.site.dataLists.CreateDataListDialog; +import org.alfresco.po.share.site.dataLists.ContactListSelectedContentPage; import org.alfresco.po.share.site.dataLists.CreateNewItemPopUp; import org.alfresco.po.share.site.dataLists.CreateNewItemPopUp.NewItemPopupForm; +import org.alfresco.po.share.site.dataLists.EventAgendaSelectedContentItem; +import org.alfresco.po.share.site.dataLists.MeetingAgendaListSelectedContentPage; +import org.alfresco.po.share.site.dataLists.CreateDataListDialog; import org.alfresco.po.share.site.dataLists.DataListsPage; -import org.alfresco.po.share.site.dataLists.EventAgendaSelectedContent; -import org.alfresco.po.share.site.dataLists.MeetingAgendaListSelectedContent; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; -public class DataListXSSTests extends ContextAwareWebTest -{ - //@Autowired - CreateNewItemPopUp createNewItemPopUp; +import static org.alfresco.po.share.dashlet.Dashlets.SITE_DATA_LISTS; - @Autowired - ContactListSelectedContent contactListSelectedContent; - - @Autowired - EventAgendaSelectedContent eventAgendaSelectedContent; +@Slf4j +public class DataListXSSTests extends BaseTest +{ @Autowired - MeetingAgendaListSelectedContent meetingAgendaListSelectedContent; - - //@Autowired - SiteDataListsDashlet siteDataListsDashlet; - - //@Autowired + protected DataListsService dataListsService; + CreateNewItemPopUp createNewItemPopUp; + ContactListSelectedContentPage contactListSelectedContentPage; + EventAgendaSelectedContentItem eventAgendaSelectedContentItem; + MeetingAgendaListSelectedContentPage meetingAgendaListSelectedContentPage; + CustomizeSiteDashboardPage customizeSiteDashboardPage; SiteDashboardPage siteDashboardPage; - - //@Autowired CreateDataListDialog createDataListDialog; - - //@Autowired DataListsPage dataListsPage; - + private UserModel testUser; private String uniqueIdentifier = RandomData.getRandomAlphanumeric(); - private String testUser = "TestUser_" + uniqueIdentifier; - private String siteName = "SiteName" + uniqueIdentifier; private String contactListName = "ContactList" + uniqueIdentifier; private String eventAgendaList = "EventAgendaList" + uniqueIdentifier; private String meetingAgendaList = "MeetingAgendaList" + uniqueIdentifier; + private String password = "password"; + private final ThreadLocal siteName = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) - private void beforeClass() + @BeforeMethod(alwaysRun = true) + private void beforeMethod() { - userService.create(adminUser, adminPassword, testUser, password, testUser + domain, "testUser_firstName", "testUser_lastName"); - siteService.create(testUser, password, domain, siteName, siteName, SiteService.Visibility.PUBLIC); - - LOG.info("Precondition : Any user logged in Share."); - setupAuthenticatedSession(testUser, password); - - LOG.info("Precondition: Create a new 'Contact List'."); - dataListsService.createDataList(testUser, password, siteName, DataList.CONTACT_LIST, contactListName, "Description."); - - LOG.info("Precondition: Create a new 'Event Agenda'."); - dataListsService.createDataList(testUser, password, siteName, DataList.EVENT_AGENDA, eventAgendaList, "Description."); - - LOG.info("Precondition: Create a new 'Meeting Agenda'."); - dataListsService.createDataList(testUser, password, siteName, DataList.MEETING_AGENDA, meetingAgendaList, "Description."); + log.info("PreCondition: Creating a TestUser1"); + String identifier = RandomData.getRandomAlphanumeric(); + final String user = "test" + identifier; + testUser = dataUser.usingAdmin().createUser(user, password); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a Random Site"); + siteName.set(getDataSite().usingUser(testUser).createPublicRandomSite()); + getCmisApi().authenticateUser(testUser); + + siteDashboardPage = new SiteDashboardPage(webDriver); + dataListsPage = new DataListsPage(webDriver); + createDataListDialog = new CreateDataListDialog(webDriver); + customizeSiteDashboardPage = new CustomizeSiteDashboardPage(webDriver); + contactListSelectedContentPage = new ContactListSelectedContentPage(webDriver); + createNewItemPopUp = new CreateNewItemPopUp(webDriver); + eventAgendaSelectedContentItem = new EventAgendaSelectedContentItem(webDriver); + meetingAgendaListSelectedContentPage = new MeetingAgendaListSelectedContentPage(webDriver); + + log.info("Precondition : Any user logged in Share."); + authenticateUsingLoginPage(testUser); + + log.info("Precondition: Create a new 'Contact List'."); + dataListsService.createDataList(testUser.getUsername(), password, siteName.get().getId(), DataList.CONTACT_LIST, contactListName, "Description."); + + log.info("Precondition: Create a new 'Event Agenda'."); + dataListsService.createDataList(testUser.getUsername(), password, siteName.get().getId(), DataList.EVENT_AGENDA, eventAgendaList, "Description."); + + log.info("Precondition: Create a new 'Meeting Agenda'."); + dataListsService.createDataList(testUser.getUsername(), password, siteName.get().getId(), DataList.MEETING_AGENDA, meetingAgendaList, "Description."); } - @AfterClass (alwaysRun = false) - private void afterClass() + @AfterMethod(alwaysRun = true) + private void afterMethod() { - dataListsService.deleteDataList(testUser, password, siteName, contactListName); - dataListsService.deleteDataList(testUser, password, siteName, eventAgendaList); - dataListsService.deleteDataList(testUser, password, siteName, meetingAgendaList); - - cleanupAuthenticatedSession(); - userService.delete(adminUser, adminPassword, testUser); + deleteSitesIfNotNull(siteName.get()); + deleteUsersIfNotNull(testUser); } @TestRail (id = "C286626") - @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests", "tobefixed" }, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class) + @Test(groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests"}, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class, enabled = false) public void creatingContactListWithXSS(String XSSString) { - LOG.info("Precondition 1: Navigate to site dashboard."); - siteDashboardPage.navigate(siteName); - - LOG.info("Precondition 2: Add 'Site Data List' dashlet to site dashboard."); - addSiteDataListDashletToSiteDashboard(); - - LOG.info("STEP 1: Click 'New List' button from 'Site Data List' dashlet."); + log.info("Precondition 1: Navigate to site dashboard."); + siteDashboardPage.navigate(siteName.get().getId()); + + log.info("Precondition 2: Add 'Site Data List' dashlet to site dashboard."); + customizeSiteDashboardPage + .navigate(siteName.get()) + .clickAddDashlet() + .addDashlet(SITE_DATA_LISTS, 1) + .clickOk(); + siteDashboardPage + .assertsiteDataListDashletIsAdded(); + + log.info("STEP 1: Click 'New List' button from 'Site Data List' dashlet."); dataListsPage.clickOnCreateDataListLink(); Assert.assertTrue(createDataListDialog.isNewListPopupDisplayed(), "'New List' PopUp is not displayed."); - LOG.info("Step 1.1 => Check if all the expected list types are displayed"); + log.info("Step 1.1 => Check if all the expected list types are displayed"); Assert.assertTrue(createDataListDialog.isDataListComplete(), "One or more list types from 'Data List' is missing."); - LOG.info("Step 1.2 => Check if Contact list contains the right description"); + log.info("Step 1.2 => Check if Contact list contains the right description"); Assert.assertEquals(createDataListDialog.getTypeOfListDescription(DataListTypes.CONTACT_LIST), DataListTypes.CONTACT_LIST.description, "'Contact List' description is not correct."); - LOG.info("Step 1.3 => Check if there are following controls: Title (mandatory) field, Description text area, Submit button (disable till Title is not filled, Cancel button available."); + log.info("Step 1.3 => Check if there are following controls: Title (mandatory) field, Description text area, Submit button (disable till Title is not filled, Cancel button available."); Assert.assertTrue(createDataListDialog.getTitleLabelText().contains("Title:"), "'Title input' label is not 'Title:'."); Assert.assertTrue(createDataListDialog.isTitleFieldDisplayed(), "'Title' input field is not displayed."); Assert.assertTrue(createDataListDialog.isTitleMandatoryIndicatorDisplayed(), "'Title' mandatory indicator is not displayed."); @@ -124,23 +140,27 @@ public void creatingContactListWithXSS(String XSSString) Assert.assertTrue(createDataListDialog.isSaveButtonDisplayed(), "'Save' button is not displayed."); Assert.assertTrue(createDataListDialog.isCancelButtonDisplayed(), "'Cancel' button is not displayed."); - LOG.info("STEP 2: Select the 'Contact list' type;"); + log.info("STEP 2: Select the 'Contact list' type;"); createDataListDialog.selectType(DataListTypes.CONTACT_LIST.title); Assert.assertTrue(createDataListDialog.isExpectedTypeSelected(DataListTypes.CONTACT_LIST.title), "'" + DataListTypes.CONTACT_LIST.title + "' is not highlighted."); - LOG.info("STEP 3: Enter XSS string '" + XSSString + "' into 'Title' (mandatory) field."); + log.info("STEP 3: Enter XSS string '" + XSSString + "' into 'Title' (mandatory) field."); createDataListDialog.typeTitle(XSSString); Assert.assertEquals(createDataListDialog.getTitleValue(), XSSString, "XSS string '" + XSSString + "' was not entered in 'Title' field."); Assert.assertTrue(createDataListDialog.isNewListPopupDisplayed(), "'New List' PopUp is not displayed."); - LOG.info("STEP 4: Enter XSS string '" + XSSString + "' into 'Description' field."); + log.info("STEP 4: Enter XSS string '" + XSSString + "' into 'Description' field."); createDataListDialog.typeDescription(XSSString); Assert.assertEquals(createDataListDialog.getDescriptionValue(), XSSString, "XSS string '" + XSSString + "' was not entered in 'Description' field."); Assert.assertTrue(createDataListDialog.isNewListPopupDisplayed(), "'New List' PopUp is not displayed."); - LOG.info("STEP 5: Click 'Submit' button."); + log.info("STEP 5: Click 'Submit' button."); createDataListDialog.clickSaveButton(); Assert.assertTrue(dataListsPage.getListsItemsTitle().contains(XSSString), "The created data list is not displayed in the list as created."); + + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), meetingAgendaList); + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), eventAgendaList); + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), contactListName); } @TestRail (id = "C286627") @@ -149,36 +169,38 @@ public void creatingContactListItemWithXSS(String XSSString) { List listOfXSSStrings = Arrays.asList(XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString); - LOG.info("Precondition: Go to 'Data Lists Page'."); - dataListsPage.navigate(siteName); + log.info("Precondition: Go to 'Data Lists Page'."); + dataListsPage.navigate(siteName.get().getId()); Assert.assertTrue(dataListsPage.getListsItemsTitle().contains(contactListName), "The created data list is not displayed in the list as created."); - LOG.info("STEP 1: Click on the created Contact list's name in Lists section;"); + log.info("STEP 1: Click on the created Contact list's name in Lists section;"); dataListsPage.clickContactListItem(contactListName); - LOG.info("STEP 1.1 => Check if: List is highlighted;"); + log.info("STEP 1.1 => Check if: List is highlighted;"); // Assert.assertTrue(dataListsPage.isExpectedListSelected(contactListName), "'" + contactListName + "' is not highlighted."); - LOG.info("STEP 1.2 => Check if: Correct information and description are displayed at the right;"); + log.info("STEP 1.2 => Check if: Correct information and description are displayed at the right;"); Assert.assertTrue(dataListsPage.getListsItemsTitle().contains(contactListName), "The actual and expected lists name are not the same."); Assert.assertTrue(dataListsPage.isNewItemButtonDisplayed(), "'New Item' button is not displayed."); - LOG.info("STEP 1.3 => Check if: New list button at the top is enabled;"); + log.info("STEP 1.3 => Check if: New list button at the top is enabled;"); // Assert.assertTrue(dataListsPage.assertNewListButtonIsDisplayed(), "'New List' button is not displayed."); - LOG.info("STEP 1.4 => Check if: Table with the contact lists is displayed;"); - Assert.assertTrue(contactListSelectedContent.isTableHeaderComplete(), "A column is missing from the 'Item List' table."); + log.info("STEP 1.4 => Check if: Table with the contact lists is displayed;"); + Assert.assertTrue(contactListSelectedContentPage.isTableHeaderComplete(), "A column is missing from the 'Item List' table."); - LOG.info("STEP 2: Click New Item button and fill all the fields :"); + log.info("STEP 2: Click New Item button and fill all the fields :"); dataListsPage.clickNewItemButton(); Assert.assertTrue(dataListsPage.isNewItemPopupFormDisplayed(CreateNewItemPopUp.NewItemPopupForm.ContactList), "'Create New Item' dialog for 'Contact List' is not displayed."); createNewItemPopUp.fillCreateNewContactItem(listOfXSSStrings); - LOG.info("STEP 3: Click 'Submit' button;"); + log.info("STEP 3: Click 'Submit' button;"); createNewItemPopUp.clickSave(); - contactListSelectedContent.setBrowser(getBrowser()); - Assert.assertTrue(contactListSelectedContent.isTableHeaderComplete(), "The table is not displayed."); - Assert.assertTrue(contactListSelectedContent.isListItemDisplayed(listOfXSSStrings), "The '" + XSSString + "' item was not found in the new item table list."); + Assert.assertTrue(contactListSelectedContentPage.isTableHeaderComplete(), "The table is not displayed."); + Assert.assertTrue(contactListSelectedContentPage.isListItemDisplayed(listOfXSSStrings), "The '" + XSSString + "' item was not found in the new item table list."); + + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), meetingAgendaList); + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), eventAgendaList); } @@ -188,21 +210,18 @@ public void creatingEventAgendaItemWithXSS(String XSSString) { List listOfXSSStrings = Arrays.asList(XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString); - LOG.info("Precondition 1: Navigate to site dashboard."); - siteDashboardPage.navigate(siteName); - - LOG.info("Precondition 2: Add 'Site Data List' dashlet to site dashboard."); - addSiteDataListDashletToSiteDashboard(); + log.info("Precondition 1: Navigate to site dashboard."); + siteDashboardPage.navigate(siteName.get().getId()); - LOG.info("STEP 1: Go to 'Data Lists Page'."); - dataListsPage.navigate(siteName); + log.info("STEP 1: Go to 'Data Lists Page'."); + dataListsPage.navigate(siteName.get().getId()); Assert.assertTrue(dataListsPage.getListsItemsTitle().contains(eventAgendaList), "The created '" + eventAgendaList + "' data list is not displayed in the list as created."); - LOG.info("STEP 2: Click on the created Data List"); + log.info("STEP 2: Click on the created Data List"); dataListsPage.clickEventAgendaListItem(eventAgendaList); - Assert.assertTrue(eventAgendaSelectedContent.isTableHeaderComplete(), "A column is missing from the 'Item List' table."); + Assert.assertTrue(eventAgendaSelectedContentItem.isTableHeaderComplete(), "A column is missing from the 'Item List' table."); - LOG.info("STEP 3: Click on New Item button."); + log.info("STEP 3: Click on New Item button."); dataListsPage.clickNewItemButton(); Assert.assertTrue(dataListsPage.isNewItemPopupFormDisplayed(NewItemPopupForm.EventAgenda), "'Create New Item' dialog for 'Event Agenda' is not displayed."); Assert.assertTrue(createNewItemPopUp.areNewItemEventAgendaFieldsDisplayed(), "A field is missing from 'Create New Event Agenda Item' Popup."); @@ -210,15 +229,17 @@ public void creatingEventAgendaItemWithXSS(String XSSString) Assert.assertTrue(createNewItemPopUp.isSaveButtonDisplayed(), "'Save Button' is not displayed in 'Create New Item' popup."); Assert.assertTrue(createNewItemPopUp.isCancelButtonDisplayed(), "'Cancel Button' is not displayed in 'Create New Item' popup."); - LOG.info("STEP 4: Fill in all the fields with '" + XSSString + "' string."); + log.info("STEP 4: Fill in all the fields with '" + XSSString + "' string."); createNewItemPopUp.fillCreateNewEventAgendaItem(Arrays.asList(XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString)); Assert.assertTrue(createNewItemPopUp.areAllEventAgendaFieldsFilledWithSpecificString(XSSString), "A field is not filled with the expected '" + XSSString + "' string."); - LOG.info("STEP 5: Click on Submit button."); + log.info("STEP 5: Click on Submit button."); createNewItemPopUp.clickSave(); - eventAgendaSelectedContent.setBrowser(getBrowser()); - Assert.assertTrue(eventAgendaSelectedContent.isTableHeaderComplete(), "The table is not displayed."); - Assert.assertTrue(eventAgendaSelectedContent.isListItemDisplayed(listOfXSSStrings), "The '" + XSSString + "' item was not found in the new item table list."); + Assert.assertTrue(eventAgendaSelectedContentItem.isTableHeaderComplete(), "The table is not displayed."); + Assert.assertTrue(eventAgendaSelectedContentItem.isListItemDisplayed(listOfXSSStrings), "The '" + XSSString + "' item was not found in the new item table list."); + + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), contactListName); + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), meetingAgendaList); } @TestRail (id = "C286629") @@ -227,21 +248,18 @@ public void creatingMeetingAgendaItemWithXSS(String XSSString) { List listOfXSSStrings = Arrays.asList(XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString, XSSString); - LOG.info("Precondition 1: Navigate to site dashboard."); - siteDashboardPage.navigate(siteName); + log.info("Precondition 1: Navigate to site dashboard."); + siteDashboardPage.navigate(siteName.get().getId()); - LOG.info("Precondition 2: Add 'Site Data List' dashlet to site dashboard."); - addSiteDataListDashletToSiteDashboard(); - - LOG.info("STEP 1: Go to 'Data Lists Page'."); - dataListsPage.navigate(siteName); + log.info("STEP 1: Go to 'Data Lists Page'."); + dataListsPage.navigate(siteName.get().getId()); Assert.assertTrue(dataListsPage.getListsItemsTitle().contains(meetingAgendaList), "The created '" + meetingAgendaList + "' data list is not displayed in the list as created."); - LOG.info("STEP 2: Click on the created Data List"); + log.info("STEP 2: Click on the created Data List"); dataListsPage.clickEventAgendaListItem(meetingAgendaList); - Assert.assertTrue(meetingAgendaListSelectedContent.isTableHeaderComplete(), "A column is missing from the 'Item List' table."); + Assert.assertTrue(meetingAgendaListSelectedContentPage.isTableHeaderComplete(), "A column is missing from the 'Item List' table."); - LOG.info("STEP 3: Click on New Item button."); + log.info("STEP 3: Click on New Item button."); dataListsPage.clickNewItemButton(); Assert.assertTrue(dataListsPage.isNewItemPopupFormDisplayed(NewItemPopupForm.MeetingAgenda), "'Create New Item' dialog for 'Meeting Agenda' is not displayed."); Assert.assertTrue(createNewItemPopUp.areNewItemMeetingAgendaFieldsDisplayed(), "A field is missing from 'Create New Meeting Agenda Item' Popup."); @@ -249,30 +267,16 @@ public void creatingMeetingAgendaItemWithXSS(String XSSString) Assert.assertTrue(createNewItemPopUp.isSaveButtonDisplayed(), "'Save Button' is not displayed in 'Create New Item' popup."); Assert.assertTrue(createNewItemPopUp.isCancelButtonDisplayed(), "'Cancel Button' is not displayed in 'Create New Item' popup."); - LOG.info("STEP 4: Fill in all the fields with '" + XSSString + "' string."); + log.info("STEP 4: Fill in all the fields with '" + XSSString + "' string."); createNewItemPopUp.fillCreateNewMeetingAgendaItem(Arrays.asList(XSSString, XSSString, XSSString, XSSString, XSSString), null, null); Assert.assertTrue(createNewItemPopUp.areAllMeetingAgendaFieldsFilledWithSpecificString(XSSString), "A field is not filled with the expected '" + XSSString + "' string."); - LOG.info("STEP 5: Click on Submit button."); + log.info("STEP 5: Click on Submit button."); createNewItemPopUp.clickSave(); - meetingAgendaListSelectedContent.setBrowser(getBrowser()); - Assert.assertTrue(meetingAgendaListSelectedContent.isTableHeaderComplete(), "The table is not displayed."); - Assert.assertTrue(meetingAgendaListSelectedContent.isListItemDisplayed(listOfXSSStrings), "The '" + XSSString + "' item was not found in the new item table list."); - } + Assert.assertTrue(meetingAgendaListSelectedContentPage.isTableHeaderComplete(), "The table is not displayed."); + Assert.assertTrue(meetingAgendaListSelectedContentPage.isListItemDisplayed(listOfXSSStrings), "The '" + XSSString + "' item was not found in the new item table list."); - - /** - * Add 'Site Data List' dashlet to user's site dashboard if it is not already displayed - * And then check if it was successfully added. - */ - private void addSiteDataListDashletToSiteDashboard() - { - if (!siteDataListsDashlet.isDashletDisplayed(DashletHelpIcon.DATA_LISTS)) - { - siteService.addDashlet(testUser, password, siteName, SiteDashlet.SITE_DATA_LIST, DashletLayout.THREE_COLUMNS, 3, 1); - } - Assert.assertEquals(siteDataListsDashlet.getDashletTitle(), "Site Data Lists", "'Site Data List' dashlet is not displayed in user's site dashboard."); + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), eventAgendaList); + dataListsService.deleteDataList(testUser.getUsername(), password, siteName.get().getId(), contactListName); } - - } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/LoginXSSTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/LoginXSSTests.java index b8be5a56ff..1058d83328 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/LoginXSSTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/LoginXSSTests.java @@ -1,45 +1,48 @@ package org.alfresco.share.security; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; import org.alfresco.common.DataProviderClass; import org.alfresco.po.share.LoginPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; + import org.testng.annotations.Test; +import static org.testng.Assert.assertTrue; +@Slf4j /** * @author Iulia.Burca */ -public class LoginXSSTests extends ContextAwareWebTest +public class LoginXSSTests extends BaseTest { - //@Autowired private LoginPage loginPage; - - @TestRail (id = "C286512, C286520") @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }, dataProvider = "XSSCredentials", dataProviderClass = DataProviderClass.class) public void loginWithXssStrings(String XSSUsername, String XSSPassword) { - LOG.info("STEP 1: Navigate to Login page"); - loginPage.navigate(); -// assertEquals(loginPage.getPageTitle(), "Alfresco » Login", "Displayed page="); + loginPage = new LoginPage(webDriver); - LOG.info("STEP 2: Enter into User name field text: '" + XSSUsername + "'."); - loginPage.typeUserName(XSSUsername); + log.info("STEP 1: Navigate to Login page"); + loginPage + .navigate().assertLoginPageTitleIsCorrect(); - LOG.info("STEP 3: Enter into Password field text: '" + XSSPassword + "'."); - loginPage.typePassword(XSSPassword); + log.info("STEP 2: Enter into User name field text: '" + XSSUsername + "'."); + loginPage + .typeUserName(XSSUsername); - LOG.info("STEP 4: Press 'Login' button;"); - loginPage.clickLogin(); -// assertEquals(loginPage.getPageTitle(), "Alfresco » Login", "Displayed page="); - assertTrue(loginPage.isAuthenticationErrorDisplayed(), "Authentication Error message is not displayed."); + log.info("STEP 3: Enter into Password field text: '" + XSSPassword + "'."); + loginPage + .typePassword(XSSPassword); - cleanupAuthenticatedSession(); - } + log.info("STEP 4: Press 'Login' button;"); + loginPage + .clickLogin(); + loginPage + .assertLoginPageTitleIsCorrect(); + log.info("STEP 5: Verify Notification Failed to Login appears"); + assertTrue(loginPage.isAuthenticationErrorDisplayed(), "Authentication Error message is not displayed."); + } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/SiteXSSTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/SiteXSSTests.java index af11ce11e3..17040d0764 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/SiteXSSTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/SiteXSSTests.java @@ -3,68 +3,74 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.common.DataProviderClass; import org.alfresco.po.share.site.CreateSiteDialog; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; -public class SiteXSSTests extends ContextAwareWebTest +@Slf4j +public class SiteXSSTests extends BaseTest { - //@Autowired private CreateSiteDialog createSiteDialog; - - //@Autowired private SiteDashboardPage siteDashboardPage; - - + private UserDashboardPage userDashboardPage; + private final ThreadLocal user1 = new ThreadLocal<>(); private String uniqueIdentifier = RandomData.getRandomAlphanumeric(); private String testUser = "TestUser_" + uniqueIdentifier; - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) private void beforeClass() { - userService.create(adminUser, adminPassword, testUser, password, testUser + domain, "testUser_firstName", "testUser_lastName"); + log.info("Precondition 1: Create a new user"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); - LOG.info("Precondition 1: Any user logged in Share."); - setupAuthenticatedSession(testUser, password); + createSiteDialog = new CreateSiteDialog(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + + + log.info("Precondition 2: Any user logged in Share."); + authenticateUsingLoginPage(user1.get()); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) private void afterClass() { - cleanupAuthenticatedSession(); - userService.delete(adminUser, adminPassword, testUser); + deleteUsersIfNotNull(user1.get()); } @TestRail (id = "C286607") - @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class) + @Test(groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }, dataProvider = "XSSSecurity", dataProviderClass = DataProviderClass.class) public void creatingSiteWithXSSSiteID(String XSSSiteID) { - LOG.info("STEP 1: Navigate to the Sites drop-down menu and select Create site link;"); + log.info("STEP 1: Navigate to the Sites drop-down menu and select Create site link;"); createSiteDialog.navigateByMenuBar(); assertTrue(createSiteDialog.isSiteIDInputFieldDisplayed(), "'SiteID' field is not displayed."); - LOG.info("STEP 2: Enter \"test\" in Name field;"); + log.info("STEP 2: Enter \"test\" in Name field;"); createSiteDialog.typeInNameInput("test"); assertEquals(createSiteDialog.getNameInputText(), "test", "Text could not be entered in 'Name' field."); - LOG.info("STEP 3: Enter into \"Site ID\" field XSS string, try the next cases: '" + XSSSiteID + "'."); + log.info("STEP 3: Enter into \"Site ID\" field XSS string, try the next cases: '" + XSSSiteID + "'."); createSiteDialog.typeInSiteID(XSSSiteID); assertEquals(createSiteDialog.getSiteIdInputText(), XSSSiteID, "Text could not be entered in 'Site ID' field."); - LOG.info("STEP 4: Check that OK button is disabled;"); + log.info("STEP 4: Check that OK button is disabled;"); assertEquals(createSiteDialog.getCreateButtonState(), "true", "'Create Button' is not disabled."); - LOG.info("Close PopUp."); + log.info("Close PopUp."); createSiteDialog.clickCloseXButton(); } @@ -76,27 +82,27 @@ public void creatingSiteWithXSSName(String XSSName) String siteId = "test" + RandomData.getRandomAlphanumeric(); String expectedRelativePath = "share/page/site/" + XSSName + "/dashboard"; - userDashboard.navigate(testUser); + userDashboardPage.navigate(testUser); - LOG.info("STEP 1: Navigate to the Sites drop-down menu and select Create site link;"); + log.info("STEP 1: Navigate to the Sites drop-down menu and select Create site link;"); createSiteDialog.navigateByMenuBar(); assertTrue(createSiteDialog.isSiteIDInputFieldDisplayed(), "'SiteID' field is not displayed."); - LOG.info("STEP 2: Enter into \"Name\" field XSS string, try the next cases: '" + XSSName + "'."); + log.info("STEP 2: Enter into \"Name\" field XSS string, try the next cases: '" + XSSName + "'."); createSiteDialog.typeInNameInput(XSSName); assertEquals(createSiteDialog.getNameInputText(), XSSName, "Text could not be entered in 'Name' field."); - LOG.info("STEP 3.1: Enter \"test\" in 'Site ID' field;"); + log.info("STEP 3.1: Enter \"test\" in 'Site ID' field;"); createSiteDialog.typeInSiteID(siteId); assertEquals(createSiteDialog.getSiteIdInputText(), siteId, "Text could not be entered in 'SiteID' field."); - LOG.info("STEP 3.2: Enter 'description' in 'Description' field."); + log.info("STEP 3.2: Enter 'description' in 'Description' field."); createSiteDialog.typeInDescription("description"); - LOG.info("STEP 3.3: Select visibility to 'public'."); + log.info("STEP 3.3: Select visibility to 'public'."); createSiteDialog.selectPublicVisibility(); - LOG.info("STEP 4: Press 'Create' button;"); + log.info("STEP 4: Press 'Create' button;"); createSiteDialog.clickCreateButton(); siteDashboardPage.setCurrentSiteName(XSSName); assertEquals(siteDashboardPage.getRelativePath(), expectedRelativePath, "User is not redirected to the created site."); @@ -109,28 +115,28 @@ public void creatingSiteWithXSSDescription(String XSSDescription) { String siteName = "test" + RandomData.getRandomAlphanumeric(); - userDashboard.navigate(testUser); + userDashboardPage.navigate(testUser); - LOG.info("STEP 1: Navigate to the Sites drop-down menu and select 'Create site' link;"); + log.info("STEP 1: Navigate to the Sites drop-down menu and select 'Create site' link;"); createSiteDialog.navigateByMenuBar(); assertTrue(createSiteDialog.isDescriptionInputFieldDisplayed(), "'Description' field is not displayed."); - LOG.info("STEP 2: Enter " + siteName + " in 'Name' field;"); + log.info("STEP 2: Enter " + siteName + " in 'Name' field;"); createSiteDialog.typeInNameInput(siteName); assertEquals(createSiteDialog.getNameInputText(), siteName, "Text '" + siteName + "' could not be entered in 'Name' field."); - LOG.info("STEP 3: Enter " + siteName + " in 'Site ID' field;"); + log.info("STEP 3: Enter " + siteName + " in 'Site ID' field;"); createSiteDialog.typeInSiteID(siteName); assertEquals(createSiteDialog.getSiteIdInputText(), siteName, "Text could not be entered in 'SiteID' field."); - LOG.info("STEP 4: Select visibility to 'public'."); + log.info("STEP 4: Select visibility to 'public'."); createSiteDialog.selectPublicVisibility(); - LOG.info("STEP 5: Enter XSS text in 'Description' field , try the next cases: '" + XSSDescription + "'."); + log.info("STEP 5: Enter XSS text in 'Description' field , try the next cases: '" + XSSDescription + "'."); createSiteDialog.typeInDescription(XSSDescription); assertEquals(createSiteDialog.getDescriptionInputText(), XSSDescription, "Text '" + XSSDescription + "' could not be entered in 'Description' field."); - LOG.info("STEP 4: Press 'Create' button;"); + log.info("STEP 4: Press 'Create' button;"); createSiteDialog.clickCreateButton(); siteDashboardPage.setCurrentSiteName(siteName); } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/WorkflowSecurityTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/WorkflowSecurityTests.java index f160b1bea2..cd2407a799 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/WorkflowSecurityTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/security/WorkflowSecurityTests.java @@ -2,12 +2,11 @@ import java.util.Date; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.CMISUtil.Priority; -import org.alfresco.dataprep.DashboardCustomization.DashletLayout; -import org.alfresco.dataprep.DashboardCustomization.UserDashlet; -import org.alfresco.dataprep.SiteService.Visibility; import org.alfresco.dataprep.WorkflowService; -import org.alfresco.po.enums.DashletHelpIcon; +import org.alfresco.po.share.dashlet.Dashlets; import org.alfresco.po.share.dashlet.MyTasksDashlet; import org.alfresco.po.share.site.SelectPopUpPage; import org.alfresco.po.share.tasksAndWorkflows.EditTaskPage; @@ -15,24 +14,32 @@ import org.alfresco.po.share.tasksAndWorkflows.TaskDetailsPage; import org.alfresco.po.share.tasksAndWorkflows.WorkflowDetailsPage; import org.alfresco.po.share.tasksAndWorkflows.WorkflowsIveStartedPage; -import org.alfresco.po.share.user.profile.UserProfilePage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.user.CustomizeUserDashboardPage; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; /** * @author andrei.ciubotaru */ -public class WorkflowSecurityTests extends ContextAwareWebTest +@Slf4j +public class WorkflowSecurityTests extends BaseTest { + CustomizeUserDashboardPage customizeUserDashboard; private final Date timeDate = new Date(); private final String taskMessage = "PRR Task"; + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal user2 = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); private final String[] xssStrings = new String[] { "\">", "", @@ -47,166 +54,172 @@ public class WorkflowSecurityTests extends ContextAwareWebTest }; @Autowired WorkflowService workflowService; - //@Autowired EditTaskPage editTaskPage; - //@Autowired MyTasksDashlet myTasksDashlet; - //@Autowired TaskDetailsPage taskDetailsPage; - //@Autowired - UserProfilePage userProfilePage; - //@Autowired StartWorkflowPage startWorkflowPage; - //@Autowired SelectPopUpPage selectPopUpPage; - //@Autowired WorkflowsIveStartedPage workflowsIveStartedPage; - //@Autowired WorkflowDetailsPage workflowDetailsPage; - String testUser = String.format("testUser%s", RandomData.getRandomAlphanumeric()); - String testUser2 = String.format("testUser2%s", RandomData.getRandomAlphanumeric()); - String testSite = String.format("testSite%s", RandomData.getRandomAlphanumeric()); + String password = "password"; - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, testUser, password, "alfresco@domain.com", "FirstName1", "LastName1"); - userService.create(adminUser, adminPassword, testUser2, password, "alfresco@domain.com", "FirstName2", "LastName2"); - siteService.create(testUser, password, null, testSite, "Test Site", Visibility.PUBLIC); + log.info("PreCondition: Creating a TestUser1"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + user2.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a Random Site"); + site.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + myTasksDashlet = new MyTasksDashlet(webDriver); + editTaskPage = new EditTaskPage(webDriver); + customizeUserDashboard = new CustomizeUserDashboardPage(webDriver); + taskDetailsPage = new TaskDetailsPage(webDriver); + startWorkflowPage = new StartWorkflowPage(webDriver); + selectPopUpPage = new SelectPopUpPage(webDriver); + workflowsIveStartedPage = new WorkflowsIveStartedPage(webDriver); + workflowDetailsPage = new WorkflowDetailsPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void afterClass() { - cleanupAuthenticatedSession(); - userService.delete(adminUser, adminPassword, testUser); - userService.delete(adminUser, adminPassword, testUser2); + deleteUsersIfNotNull(user1.get()); + deleteUsersIfNotNull(user2.get()); + deleteSitesIfNotNull(site.get()); + deleteAllCookiesIfNotNull(); } @TestRail (id = "C286553") - @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "tobefixed", "xsstests" }) - public void verifyEditTaskButtonSaveAndClose() - { - LOG.info("Precondition 3: Create a \"New Task\" with message, due date, assign it to yourself, uncheck \"Send Email Notifications"); - workflowService.startNewTask(testUser, password, taskMessage, timeDate, testUser, Priority.Normal, null, null, false); - LOG.info("Precondition 2: Add \"My Task\" dashlet to user dashboard if the dashlet is not present"); - setupAuthenticatedSession(testUser, password); - addMyTaskDashletToDashboard(testUser); + @Test(groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }) + public void verifyEditTaskButtonSaveAndClose() { + log.info("Precondition 3: Create a \"New Task\" with message, due date, assign it to yourself, uncheck \"Send Email Notifications"); + workflowService.startNewTask(user1.get().getUsername(), password, taskMessage, timeDate, user1.get().getUsername(), Priority.Normal, null, null, false); + log.info("Precondition 2: Add \"My Task\" dashlet to user dashboard if the dashlet is not present"); + authenticateUsingLoginPage(user1.get()); + addMyTaskDashletToDashboard(); for (String xssString : xssStrings) { - LOG.info("STEP1: Click \"Edit Task\" icon for created task on the \"My Tasks\" dashlet;"); + log.info("STEP1: Click \"Edit Task\" icon for created task on the \"My Tasks\" dashlet;"); myTasksDashlet.editTask(taskMessage); Assert.assertEquals(editTaskPage.getMessage(), taskMessage, "Edit Task page is not opened"); - LOG.info("STEP2: Into Your \"Response\" - \"Comment\" enter each XSS attack from the list. XSS attack: " + xssString); + log.info("STEP2: Into Your \"Response\" - \"Comment\" enter each XSS attack from the list. XSS attack: " + xssString); editTaskPage.writeComment(xssString); - LOG.info("STEP3: Click \"Save and Close\" button"); - //editTaskPage.clickOnSaveButton(userDashboardPage); -// Assert.assertTrue(myTasksDashlet.assertTaskNameEqualsTo(taskMessage), "Task is not present in \"My task\" dashlet"); - myTasksDashlet.viewTask(taskMessage); + log.info("STEP3: Click \"Save and Close\" button"); + editTaskPage.clickOnSaveButton(); + myTasksDashlet.assertTaskNameEqualsTo(taskMessage); + myTasksDashlet.view_Task(taskMessage); Assert.assertEquals(taskDetailsPage.getComment(), xssString, "Comment was not saved."); - userDashboard.navigate(testUser); + userDashboardPage.navigate(user1.get()); } } @TestRail (id = "C286584") @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }) - public void findGroupWithXSSPooledTask() - { - setupAuthenticatedSession(testUser, password); - LOG.info("PRECONDITION2: Open \"Start Workflow\" page"); - startWorkflowPage.navigate(testSite); - LOG.info("PRECONDITION3: Select \"Review and Approve (pooled review)\" from \"Workflow:\" drop-down"); + public void findGroupWithXSSPooledTask() throws InterruptedException { + authenticateUsingLoginPage(user1.get()); + log.info("PRECONDITION2: Open \"Start Workflow\" page"); + startWorkflowPage.navigate(site.get()); + log.info("PRECONDITION3: Select \"Review and Approve (pooled review)\" from \"Workflow:\" drop-down"); startWorkflowPage.selectAWorkflow("Review and Approve (pooled review)"); - LOG.info("STEP1: Click Select button in Assignee part;"); + log.info("STEP1: Click Select button in Assignee part;"); startWorkflowPage.clickGroupSelectButton(); for (String xssString : xssStrings) { - LOG.info("STEP2: Fill Search field with each XSS attack: " + xssString); - LOG.info("STEP3: Click \"Search button\""); + log.info("STEP2: Fill Search field with each XSS attack: " + xssString); + log.info("STEP3: Click \"Search button\""); selectPopUpPage.search(xssString); Assert.assertTrue(selectPopUpPage.isSearchButtonDisplayed(), "Search button is no longer displayed. XSS attack succeeded"); } - LOG.info("STEP4:Fill Search field with a existent group name and click \"Search button\""); + log.info("STEP4:Fill Search field with a existent group name and click \"Search button\""); selectPopUpPage.search("EMAIL_CONTRIBUTORS"); Assert.assertTrue(selectPopUpPage.isStringPresentInSearchList("EMAIL_CONTRIBUTORS"), "Group is not present in the search list"); } @TestRail (id = "C286704") - @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "tobefixed", "xsstests" }) - public void verifyEditTaskButtonReject() - { - LOG.info("Precondition 2: Add \"My Task\" dashlet to user dashboard if the dashlet is not present\n"); - setupAuthenticatedSession(testUser, password); - addMyTaskDashletToDashboard(testUser); + @Test (groups = { TestGroup.SANITY, TestGroup.SECURITY, "xsstests" }) + public void verifyEditTaskButtonReject() { + log.info("Precondition 2: Add \"My Task\" dashlet to user dashboard if the dashlet is not present\n"); + authenticateUsingLoginPage(user1.get()); + + addMyTaskDashletToDashboard(); - LOG.info("Precondition 3: Create as many \"Review and Approve (Single reviewer)\" workflows as the number of XSS attack you have, with message, due date, assign them to user2, uncheck \"Send Email Notifications\"\n"); + log.info("Precondition 3: Create as many \"Review and Approve (Single reviewer)\" workflows as the number of XSS attack you have, with message, due date, assign them to user2, uncheck \"Send Email Notifications\"\n"); for (int i = 0; i < xssStrings.length; i++) { - workflowService.startSingleReview(testUser, password, taskMessage + i, timeDate, testUser2, Priority.Normal, null, null, false); + workflowService.startSingleReview(user1.get().getUsername(), password, taskMessage + i, timeDate, user2.get().getUsername(), Priority.Normal, null, null, false); } - LOG.info("Precondition 4: Login with user2."); - setupAuthenticatedSession(testUser2, password); - + log.info("Precondition 4: Login with user2."); + authenticateUsingLoginPage(user2.get()); for (int i = 0; i < xssStrings.length; i++) { - LOG.info("STEP 1: Click \"Edit Task\" icon for the created task on the \"My Tasks\" dashlet;"); + log.info("STEP 1: Click \"Edit Task\" icon for the created task on the \"My Tasks\" dashlet;"); myTasksDashlet.editTask(taskMessage + i); Assert.assertEquals(editTaskPage.getMessage(), taskMessage + i, "Task message is not equal with the actual message or \"Edit Task\" page in not opened"); - LOG.info("STEP 2: Into Your \"Response\" - \"Comment\" enter each XSS attack from the list"); + log.info("STEP 2: Into Your \"Response\" - \"Comment\" enter each XSS attack from the list"); editTaskPage.writeComment(xssStrings[i]); Assert.assertTrue(editTaskPage.isReassignButtonPresent(), "The element cannot be found. XSS attack has occured."); - LOG.info("STEP 3: Click Reject button;"); -// editTaskPage.clickRejectButton(); - Assert.assertTrue(userDashboard.isNewAlfrescoLogoDisplayed(), "The User Dashboard page is not opened"); + log.info("STEP 3: Click Reject button;"); + editTaskPage.clickRejectButton(); + Assert.assertTrue(userDashboardPage.isNewAlfrescoLogoDisplayed(), "The User Dashboard page is not opened"); } - LOG.info("STEP 4: Log is as assigner: " + testUser); - setupAuthenticatedSession(testUser, password); + log.info("STEP 4: Log is as assigner: " + user1); + authenticateUsingLoginPage(user1.get()); workflowsIveStartedPage.navigate(); for (int i = 0; i < xssStrings.length; i++) { - LOG.info("STEP 5: Open Workflow details page; Task name: " + taskMessage + i); + log.info("STEP 5: Open Workflow details page; Task name: " + taskMessage + i); workflowsIveStartedPage.clickOnWorkflowTitle(taskMessage + i); Assert.assertEquals(workflowDetailsPage.getRecentComment(), xssStrings[i], "XSS string is not displayed in outcome"); - LOG.info("STEP 6: Open Edit task page"); + log.info("STEP 6: Open Edit task page"); workflowDetailsPage.clickEditTaskButton(); Assert.assertTrue(editTaskPage.getEditTaskHeader().contains("Rejected"), "Edit Task page is not opened"); - LOG.info("STEP 7: Click Task Done button;"); + log.info("STEP 7: Click Task Done button;"); editTaskPage.clickTaskDoneButton(); Assert.assertEquals(workflowDetailsPage.getRecentOutcome(), "Task Done", "Workflow Details page is not opened"); workflowsIveStartedPage.navigate(); } - - } - /** * If 'MyTask' dashlet is not displayed on user dashboard add it. * And then check if it was successfully added. */ - - private void addMyTaskDashletToDashboard(String testUser) - { - if (!myTasksDashlet.isDashletDisplayed(DashletHelpIcon.MY_TASKS)) - { - userService.addDashlet(testUser, password, UserDashlet.MY_TASKS, DashletLayout.THREE_COLUMNS, 2, 2); + private void addMyTaskDashletToDashboard(){ + customizeUserDashboard.navigate(); + if(userDashboardPage.isDashletAvailable("My Tasks")){ + customizeUserDashboard.clickOk(); + } + else { + customizeUserDashboard.navigate() + .clickAddDashlet() + .addDashlet(Dashlets.MY_TASKS, 1) + .assertDashletIsAddedInColumn(Dashlets.MY_TASKS, 1) + .clickOk(); + userDashboardPage.assertCustomizeUserDashboardIsDisplayed() + .assertDashletIsAddedInPosition(Dashlets.MY_TASKS, 1, 3); } -// Assert.assertEquals(myTasksDashlet.getDashletTitle(), "My Tasks", "'My Tasks' dashlet is not displayed in user's dashboard."); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/CustomizeSiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/CustomizeSiteTests.java index 5eeb8725bc..7aa417f393 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/CustomizeSiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/CustomizeSiteTests.java @@ -1,25 +1,33 @@ package org.alfresco.share.site; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.po.enums.Theme; import org.alfresco.po.share.dashlet.SiteContentDashlet; import org.alfresco.po.share.site.CustomizeSitePage; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.site.SitePageType; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; + import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; import org.alfresco.utility.model.UserModel; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class CustomizeSiteTests extends ContextAwareWebTest +@Slf4j +public class CustomizeSiteTests extends BaseTest { //@Autowired private CustomizeSitePage customizeSite; @@ -29,41 +37,47 @@ public class CustomizeSiteTests extends ContextAwareWebTest //@Autowired private SiteContentDashlet siteContentDashlet; + private final ThreadLocal user1 = new ThreadLocal<>(); - private UserModel user; - - @BeforeClass(alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setup() { - user = dataUser.usingAdmin().createRandomTestUser(); - setupAuthenticatedSession(user); + log.info("PreCondition: Creating test user"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + customizeSite = new CustomizeSitePage(webDriver); + siteContentDashlet = new SiteContentDashlet(webDriver); + siteDashboard = new SiteDashboardPage(webDriver); + + authenticateUsingLoginPage(user1.get()); } - @AfterClass(alwaysRun = true) + @AfterMethod(alwaysRun = true) public void removeUser() { - removeUserFromAlfresco(user); + deleteUsersIfNotNull(user1.get()); } @TestRail (id = "C2135") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) public void changeSiteTheme() { - SiteModel site2135 = dataSite.usingUser(user).createPublicRandomSite(); + SiteModel site2135 = dataSite.usingUser(user1.get()).createPublicRandomSite(); - LOG.info("Step 4 - Click 'Customize site'."); + log.info("Step 4 - Click 'Customize site'."); customizeSite.navigate(site2135); - LOG.info("Step 5 - Click 'Set Application Theme' drop-down and verify available options."); + log.info("Step 5 - Click 'Set Application Theme' drop-down and verify available options."); Assert.assertFalse(customizeSite.getThemeOptions().isEmpty()); - LOG.info("Step 6, 7 - Select 'Green Theme' and click 'OK' button. / Repeat steps 4-6 for all the other themes."); + log.info("Step 6, 7 - Select 'Green Theme' and click 'OK' button. / Repeat steps 4-6 for all the other themes."); for (Theme theme : Theme.values()) { customizeSite.navigate(site2135); customizeSite.selectTheme(theme); customizeSite.saveChanges(); - + if (theme.equals(Theme.APPLICATION_SET)) { continue; @@ -73,24 +87,24 @@ public void changeSiteTheme() Assert.assertTrue(siteContentDashlet.getDashletColor().equals(theme.dashletHexColor), theme.name + " is not set"); } } - dataSite.usingAdmin().deleteSite(site2135); + deleteSitesIfNotNull(site2135); } @TestRail (id = "C2148") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void cancelChangeSiteTheme() { - SiteModel site2148 = dataSite.usingUser(user).createPublicRandomSite(); + SiteModel site2148 = dataSite.usingUser(user1.get()).createPublicRandomSite(); - LOG.info("Step 3 - Navigate to the newly created site and click on the 'Settings' icon -> 'Customize site'."); + log.info("Step 3 - Navigate to the newly created site and click on the 'Settings' icon -> 'Customize site'."); customizeSite.navigate(site2148); - LOG.info("Step 4 - Select any theme except the default one"); + log.info("Step 4 - Select any theme except the default one"); customizeSite.selectTheme(Theme.GREEN); - LOG.info("Step 5 - Click 'Cancel' button."); + log.info("Step 5 - Click 'Cancel' button."); customizeSite.clickCancel(); - + Assert.assertFalse(siteContentDashlet.getDashletColor().equals(Theme.GREEN.dashletHexColor)); dataSite.usingAdmin().deleteSite(site2148); @@ -100,17 +114,17 @@ public void cancelChangeSiteTheme() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void verifyDefaultCurrentAndAvailablePages() { - SiteModel site2156 = dataSite.usingUser(user).createPublicRandomSite(); + SiteModel site2156 = dataSite.usingUser(user1.get()).createPublicRandomSite(); - LOG.info("Step 3 - Navigate to the newly created site and click on the 'Settings' icon -> 'Customize site'."); + log.info("Step 3 - Navigate to the newly created site and click on the 'Settings' icon -> 'Customize site'."); customizeSite.navigate(site2156); - LOG.info("Step 4 - Verify 'Current Site Pages' section."); + log.info("Step 4 - Verify 'Current Site Pages' section."); Assert.assertTrue(customizeSite.getCurrentPages().get(0).equals(SitePageType.DOCUMENT_LIBRARY), "Document Library is missing from Current Site Pages"); Assert.assertTrue(customizeSite.isRenameDisplayed(SitePageType.DOCUMENT_LIBRARY), "Rename action is missing from Document Library page"); Assert.assertTrue(customizeSite.isRemoveDisplayed(SitePageType.DOCUMENT_LIBRARY), "Remove action is missing from Document Library page"); - LOG.info("Step 5 - Verify 'Available Site Pages' section."); + log.info("Step 5 - Verify 'Available Site Pages' section."); List availablePages = customizeSite.getAvailablePages(); List pages = new ArrayList<>(); for (SitePageType page : SitePageType.values()) @@ -135,30 +149,30 @@ public void verifyDefaultCurrentAndAvailablePages() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void addAvailablePagesToSite() { - SiteModel site2164 = dataSite.usingUser(user).createPublicRandomSite(); + SiteModel site2164 = dataSite.usingUser(user1.get()).createPublicRandomSite(); - LOG.info("Step 3 - Navigate to the newly created site and click on the 'Settings' icon -> 'Customize site'."); + log.info("Step 3 - Navigate to the newly created site and click on the 'Settings' icon -> 'Customize site'."); customizeSite.navigate(site2164); - LOG.info("Step 4 - Drag any page from the 'Available Site Pages' section and drop it to the 'Current Site Pages' section."); + log.info("Step 4 - Drag any page from the 'Available Site Pages' section and drop it to the 'Current Site Pages' section."); customizeSite.addPageToSite(SitePageType.WIKI); customizeSite.addPageToSite(SitePageType.CALENDER); customizeSite.addPageToSite(SitePageType.DATA_LISTS); customizeSite.addPageToSite(SitePageType.DISCUSSIONS); - customizeSite.addPageToSite(SitePageType.LINKS); - customizeSite.addPageToSite(SitePageType.BLOG); +// customizeSite.addPageToSite(SitePageType.LINKS); +// customizeSite.addPageToSite(SitePageType.BLOG); Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.WIKI), SitePageType.WIKI.getDisplayText() + " is not added"); Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.CALENDER), SitePageType.CALENDER.getDisplayText() + " is not added"); Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.DATA_LISTS), SitePageType.DATA_LISTS.getDisplayText() + " is not added"); Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.DISCUSSIONS), SitePageType.DISCUSSIONS.getDisplayText() + " is not added"); - Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.LINKS), SitePageType.LINKS.getDisplayText() + " is not added"); - Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.BLOG), SitePageType.BLOG.getDisplayText() + " is not added"); +// Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.LINKS), SitePageType.LINKS.getDisplayText() + " is not added"); +// Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.BLOG), SitePageType.BLOG.getDisplayText() + " is not added"); - LOG.info("Step 5 - Click 'Ok' button."); + log.info("Step 5 - Click 'Ok' button."); customizeSite.saveChanges(); siteDashboard.waitUntilNotificationMessageDisappears(); - + Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.WIKI), SitePageType.WIKI.getDisplayText() + " is not added to site dashboard"); Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.CALENDER), SitePageType.CALENDER.getDisplayText() + " is not added to site dashboard"); @@ -166,42 +180,41 @@ public void addAvailablePagesToSite() + " is not added to site dashboard"); Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.DISCUSSIONS), SitePageType.DISCUSSIONS.getDisplayText() + " is not added to site dashboard"); - Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.LINKS), SitePageType.LINKS.getDisplayText() + " is not added to site dashboard"); - Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.BLOG), SitePageType.BLOG.getDisplayText() + " is not added to site dashboard"); +// Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.LINKS), SitePageType.LINKS.getDisplayText() + " is not added to site dashboard"); +// Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.BLOG), SitePageType.BLOG.getDisplayText() + " is not added to site dashboard"); dataSite.usingAdmin().deleteSite(site2164); } @TestRail (id = "C2171") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void removePageFromSite() - { - SiteModel site2171 = dataSite.usingUser(user).createPublicRandomSite(); + public void removePageFromSite() { + SiteModel site2171 = dataSite.usingUser(user1.get()).createPublicRandomSite(); - LOG.info("Step 2 - Create any site and add several site pages to it."); + log.info("Step 2 - Create any site and add several site pages to it."); customizeSite.navigate(site2171); customizeSite.addPageToSite(SitePageType.WIKI); customizeSite.addPageToSite(SitePageType.CALENDER); Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.WIKI), SitePageType.WIKI.getDisplayText() + " is not added"); Assert.assertTrue(customizeSite.isPageAddedToCurrentPages(SitePageType.CALENDER), SitePageType.CALENDER.getDisplayText() + " is not added"); customizeSite.saveChanges(); - + Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.WIKI), SitePageType.WIKI.getDisplayText() + " is not added to site dashboard"); Assert.assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.CALENDER), SitePageType.CALENDER.getDisplayText() + " is not added to site dashboard"); - LOG.info("Step 3 - Navigate to 'Customize site' page"); + log.info("Step 3 - Navigate to 'Customize site' page"); customizeSite.navigate(site2171); - LOG.info("Step 4 - Click 'Remove' button under any page available."); + log.info("Step 4 - Click 'Remove' button under any page available."); customizeSite.removePage(SitePageType.WIKI); customizeSite.removePage(SitePageType.CALENDER); Assert.assertFalse(customizeSite.isPageAddedToCurrentPages(SitePageType.WIKI), SitePageType.WIKI.getDisplayText() + " is not removed"); Assert.assertFalse(customizeSite.isPageAddedToCurrentPages(SitePageType.CALENDER), SitePageType.CALENDER.getDisplayText() + " is not removed"); - LOG.info("Step 5 - Click 'Ok' button."); + log.info("Step 5 - Click 'Ok' button."); customizeSite.saveChanges(); - + Assert.assertFalse(siteDashboard.isPageAddedToDashboard(SitePageType.WIKI), SitePageType.WIKI.getDisplayText() + " is not removed from site dashboard"); Assert.assertFalse(siteDashboard.isPageAddedToDashboard(SitePageType.CALENDER), SitePageType.CALENDER.getDisplayText() + " is not removed from site dashboard"); @@ -213,19 +226,19 @@ public void removePageFromSite() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void renamePage() { - SiteModel site2173 = dataSite.usingUser(user).createPublicRandomSite(); + SiteModel site2173 = dataSite.usingUser(user1.get()).createPublicRandomSite(); - LOG.info("Step 2 - Create any site and add several site pages to it."); + log.info("Step 2 - Create any site and add several site pages to it."); customizeSite.navigate(site2173); customizeSite.addPageToSite(SitePageType.WIKI); - LOG.info("Step 4 / 5 / 6 - Click 'Rename' button under any page / Type any name in the 'Display Name' text field / Click OK"); + log.info("Step 4 / 5 / 6 - Click 'Rename' button under any page / Type any name in the 'Display Name' text field / Click OK"); customizeSite.renameSitePage(SitePageType.WIKI, "Wiki-Edit"); Assert.assertTrue(customizeSite.getPageDisplayName(SitePageType.WIKI).equals("Wiki-Edit"), "Wiki display page name is not modified"); - LOG.info("Step 7 - Click OK"); + log.info("Step 7 - Click OK"); customizeSite.saveChanges(); - + Assert.assertTrue(siteDashboard.getPageDisplayName(SitePageType.WIKI).equals("Wiki-Edit"), "Wiki display page name is not modified"); dataSite.usingAdmin().deleteSite(site2173); diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/DeleteSiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/DeleteSiteTests.java index d5470fb903..3711f121ce 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/DeleteSiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/DeleteSiteTests.java @@ -1,8 +1,13 @@ package org.alfresco.share.site; +import lombok.extern.slf4j.Slf4j; import org.alfresco.common.EnvProperties; + import org.alfresco.dataprep.CMISUtil; +import org.alfresco.dataprep.ContentService; import org.alfresco.dataprep.SiteService; +import org.alfresco.dataprep.UserService; + import org.alfresco.po.share.SiteFinderPage; import org.alfresco.po.share.SystemErrorPage; import org.alfresco.po.share.dashlet.MySitesDashlet; @@ -10,25 +15,41 @@ import org.alfresco.po.share.site.DeleteSiteDialog; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.toolbar.Toolbar; +import org.alfresco.po.share.user.UserDashboardPage; import org.alfresco.po.share.user.admin.SitesManagerPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import org.testng.asserts.SoftAssert; -import static org.testng.Assert.*; - +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertFalse; +@Slf4j /** * @author Laura.Capsa */ -public class DeleteSiteTests extends ContextAwareWebTest +public class DeleteSiteTests extends BaseTest { + @Autowired + protected UserService userService; + + @Autowired + protected SiteService siteService; + + @Autowired + protected ContentService contentService; @Autowired EnvProperties envProperties; @@ -55,290 +76,329 @@ public class DeleteSiteTests extends ContextAwareWebTest //@Autowired SiteDashboardPage siteDashboardPage; - - String userC2280 = String.format("userC2280%s", RandomData.getRandomAlphanumeric()); - String siteNameC2280_1 = String.format("SiteNameC2280%s", RandomData.getRandomAlphanumeric()); + UserDashboardPage userDashboard; String fileNameC2280 = String.format("fileC2280-%s", RandomData.getRandomAlphanumeric()); String fileNameC2280_1 = String.format("fileC2280-%s", RandomData.getRandomAlphanumeric()); - String siteNameC2280_2 = String.format("siteName%s", RandomData.getRandomAlphanumeric()); - String description = String.format("description%s", RandomData.getRandomAlphanumeric()); - String userC2281 = String.format("1UserC2281%s", RandomData.getRandomAlphanumeric()); - String siteNameUserCanNotDelete = String.format("siteName%s", RandomData.getRandomAlphanumeric()); - String userc2282 = String.format("1UserC2282%s", RandomData.getRandomAlphanumeric()); - String userC2283 = String.format("1UserC2283%s", RandomData.getRandomAlphanumeric()); - String userC2284 = String.format("UserC2284%s", RandomData.getRandomAlphanumeric()); - String siteNameC2284 = String.format("siteName%s", RandomData.getRandomAlphanumeric()); - String userC2289_1 = String.format("1UserC2289%s", RandomData.getRandomAlphanumeric()); - String userC2289_2 = String.format("2UserC2289%s", RandomData.getRandomAlphanumeric()); - String userC2291 = String.format("userC2291%s", RandomData.getRandomAlphanumeric()); - String siteNameC2291 = String.format("0-C2291-%s", RandomData.getRandomAlphanumeric()); - String siteNameC2292 = String.format("0-C2292-%s", RandomData.getRandomAlphanumeric()); + private String adminUser = "admin"; + private String adminPassword = "admin"; + private String password= "password"; + private final ThreadLocal userC2280 = new ThreadLocal<>(); + private final ThreadLocal userC2281 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2280_1 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2280_2 = new ThreadLocal<>(); + private final ThreadLocal siteNameUserCanNotDelete = new ThreadLocal<>(); + private final ThreadLocal userC2282 = new ThreadLocal<>(); + private final ThreadLocal userC2283 = new ThreadLocal<>(); + private final ThreadLocal userC2284 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2284 = new ThreadLocal<>(); + private final ThreadLocal userC2289_1 = new ThreadLocal<>(); + private final ThreadLocal userC2289_2 = new ThreadLocal<>(); + private final ThreadLocal userC2291 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2291 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2292 = new ThreadLocal<>(); SoftAssert softAssert = new SoftAssert(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void testSetup() { - userService.create(adminUser, adminPassword, userC2280, password, userC2280 + domain, "firstName", "lastName"); - siteService.create(userC2280, password, domain, siteNameC2280_1, description, SiteService.Visibility.PUBLIC); - siteService.create(userC2280, password, domain, siteNameC2280_2, description, SiteService.Visibility.PUBLIC); - contentService.createDocument(userC2280, password, siteNameC2280_1, CMISUtil.DocumentType.TEXT_PLAIN, fileNameC2280, "fileC2280"); - contentService.createDocument(userC2280, password, siteNameC2280_2, CMISUtil.DocumentType.TEXT_PLAIN, fileNameC2280_1, "fileC2280"); - userService.create(adminUser, adminPassword, userC2281, password, userC2281 + domain, "firstName", "lastName"); - siteService.create(adminUser, adminPassword, domain, siteNameUserCanNotDelete, description, SiteService.Visibility.PUBLIC); - userService.createSiteMember(adminUser, adminPassword, userC2281, siteNameUserCanNotDelete, "SiteContributor"); - userService.create(adminUser, adminPassword, userc2282, password, userc2282 + domain, "firstName", "lastName"); - userService.createSiteMember(adminUser, adminPassword, userc2282, siteNameUserCanNotDelete, "SiteCollaborator"); - userService.create(adminUser, adminPassword, userC2283, password, userC2283 + domain, "firstName", "lastName"); - userService.createSiteMember(adminUser, adminPassword, userC2283, siteNameUserCanNotDelete, "SiteConsumer"); - userService.create(adminUser, adminPassword, userC2284, password, userC2284 + domain, "firstName", "lastName"); - siteService.create(userC2284, password, domain, siteNameC2284, description, SiteService.Visibility.PUBLIC); - userService.create(adminUser, adminPassword, userC2289_1, password, userC2289_1 + domain, "firstName", "lastName"); - userService.create(adminUser, adminPassword, userC2289_2, password, userC2289_2 + domain, "firstName", "lastName"); - userService.create(adminUser, adminPassword, userC2291, password, userC2291 + domain, "firstName", "lastName"); - siteService.create(userC2291, password, domain, siteNameC2291, description, SiteService.Visibility.PUBLIC); - siteService.create(adminUser, adminPassword, domain, siteNameC2292, description, SiteService.Visibility.PUBLIC); + log.info("Precondition: Test user userC2280 is created"); + userC2280.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Site siteNameC2280_1 is created"); + siteNameC2280_1.set(getDataSite().usingUser(userC2280.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(userC2280.get()); + + log.info("PreCondition: Site siteNameC2280_2 is created"); + siteNameC2280_2.set(getDataSite().usingUser(userC2280.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(userC2280.get()); + + contentService.createDocument(userC2280.get().getUsername(), password, siteNameC2280_1.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileNameC2280, "fileC2280"); + contentService.createDocument(userC2280.get().getUsername(), password, siteNameC2280_2.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileNameC2280_1, "fileC2280"); + + log.info("Precondition: Test user userC2281 is created"); + userC2281.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Site siteNameUserCanNotDelete is created "); + siteNameUserCanNotDelete.set(getDataSite().usingAdmin().createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + + userService.createSiteMember(adminUser, adminPassword, userC2281.get().getUsername(), siteNameUserCanNotDelete.get().getId(), "SiteContributor"); + + log.info("Precondition: User userC2282 is created"); + userC2282.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + userService.createSiteMember(adminUser, adminPassword, userC2282.get().getUsername(), siteNameUserCanNotDelete.get().getId(), "SiteCollaborator"); + + log.info("Precondition: User userC2283 is created"); + userC2283.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + userService.createSiteMember(adminUser, adminPassword, userC2283.get().getUsername(), siteNameUserCanNotDelete.get().getId(), "SiteConsumer"); + + log.info("Precondition: User userC2284 is created"); + userC2284.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Site siteNameC2284 is created"); + siteNameC2284.set(getDataSite().usingUser(userC2284.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Precondition: test user userC2289_1 is created"); + userC2289_1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Precondition: test user userC2289_2 is created"); + userC2289_2.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("Precondition: User userC2291 is created"); + userC2291.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Site siteNameC2291 is created"); + siteNameC2291.set(getDataSite().usingUser(userC2291.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Site siteNameC2292 is created"); + siteNameC2292.set(getDataSite().usingAdmin().createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + + siteFinderPage = new SiteFinderPage(webDriver); + deleteSiteDialog = new DeleteSiteDialog(webDriver); + userDashboard = new UserDashboardPage(webDriver); + toolbar = new Toolbar(webDriver); + searchFromToolbarPage = new SearchPage(webDriver); + systemErrorPage = new SystemErrorPage(webDriver); + mySitesDashlet = new MySitesDashlet(webDriver); + sitesManagerPage = new SitesManagerPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userC2280); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2280); - userService.delete(adminUser, adminPassword, userC2281); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2281); - userService.delete(adminUser, adminPassword, userc2282); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userc2282); - userService.delete(adminUser, adminPassword, userC2283); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2283); - userService.delete(adminUser, adminPassword, userC2284); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2284); - - userService.delete(adminUser, adminPassword, userC2289_1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2289_1); - userService.delete(adminUser, adminPassword, userC2289_2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2289_2); - userService.delete(adminUser, adminPassword, userC2291); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userC2291); - - - siteService.delete(adminUser, adminPassword, siteNameC2280_1); - siteService.delete(adminUser, adminPassword, siteNameC2280_2); - siteService.delete(adminUser, adminPassword, siteNameUserCanNotDelete); - siteService.delete(adminUser, adminPassword, siteNameC2284); - siteService.delete(adminUser, adminPassword, siteNameC2291); - siteService.delete(adminUser, adminPassword, siteNameC2292); + deleteSitesIfNotNull(siteNameC2280_1.get()); + deleteSitesIfNotNull(siteNameC2280_2.get()); + deleteSitesIfNotNull(siteNameUserCanNotDelete.get()); + deleteSitesIfNotNull(siteNameC2284.get()); + deleteSitesIfNotNull(siteNameC2291.get()); + deleteSitesIfNotNull(siteNameC2292.get()); + + deleteUsersIfNotNull(userC2280.get()); + deleteUsersIfNotNull(userC2281.get()); + deleteUsersIfNotNull(userC2282.get()); + deleteUsersIfNotNull(userC2283.get()); + deleteUsersIfNotNull(userC2284.get()); + deleteUsersIfNotNull(userC2289_1.get()); + deleteUsersIfNotNull(userC2289_2.get()); + deleteUsersIfNotNull(userC2291.get()); } @TestRail (id = "C2280") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) public void deleteSiteAsManagerFromSiteFinder() { - setupAuthenticatedSession(userC2280, password); + authenticateUsingLoginPage(userC2280.get()); - LOG.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); + log.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); siteFinderPage.navigate(); - assertEquals(getBrowser().getTitle(), "Alfresco » Site Finder", "Site Finder page is displayed."); + siteFinderPage.assertBrowserPageTitleIs("Alfresco » Site Finder"); - LOG.info("STEP2: Search for the created site"); - siteFinderPage.searchSiteWithName(siteNameC2280_1); -// assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2280_1), true, "Site is found."); + log.info("STEP2: Search for the created site"); + siteFinderPage.searchSiteWithName(siteNameC2280_1.get().getId()); + assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2280_1.get().getId()), true, "Site is found."); - LOG.info("STEP3: Verify options available for the site"); - assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameC2280_1, "Delete"), true, "Delete option is displayed."); - assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameC2280_1, "Leave"), true, "Leave option is displayed."); + log.info("STEP3: Verify options available for the site"); + assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameC2280_1.get().getId(), "Delete"), true, "Delete option is displayed."); + assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameC2280_1.get().getId(), "Leave"), true, "Leave option is displayed."); - LOG.info("STEP4: Click on 'Delete' button"); - siteFinderPage.clickSiteButton(siteNameC2280_1, "Delete"); + log.info("STEP4: Click on 'Delete' button"); + siteFinderPage.clickSiteButton(siteNameC2280_1.get().getId(), "Delete"); assertTrue(deleteSiteDialog.isPopupDisplayed(), "Delete popup is displayed."); - assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2280_1 + "''?"), true, "Confirm delete message is correct."); + assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2280_1.get().getId() + "''?"), true, "Confirm delete message is correct."); - LOG.info("STEP5: Click on \"Delete\" button from popup"); + log.info("STEP5: Click on \"Delete\" button from popup"); deleteSiteDialog.clickDelete(); assertEquals(deleteSiteDialog.getConfirmMessage().contains(language.translate("deleteSite.confirmAgain")), true, "Second confirm delete message is correct"); - LOG.info("STEP6: Click \"Yes\" button"); + log.info("STEP6: Click \"Yes\" button"); deleteSiteDialog.clickYes(); -// siteFinderPage.searchSite(siteNameC2280_1); - assertFalse(siteFinderPage.isSiteNameDisplayed(siteNameC2280_1), "The site isn't displayed on \"Site Finder\" page."); + assertFalse(siteFinderPage.isSiteNameDisplayed(siteNameC2280_1.get().getId()), "The site isn't displayed on \"Site Finder\" page."); - LOG.info("STEP7: Search for the file created within the site"); + log.info("STEP7: Search for the file created within the site"); userDashboard.navigateByMenuBar(); - toolbar.search(fileNameC2280); - assertFalse(searchFromToolbarPage.isResultFound(fileNameC2280), String.format("File is found %s", fileNameC2280)); + toolbar.searchAndEnterSearch(fileNameC2280); + searchFromToolbarPage.assertNoResultsFoundDisplayed(); +// assertFalse(searchFromToolbarPage.isResultFound(fileNameC2280), String.format("File is found %s", fileNameC2280)); - LOG.info("STEP8: Open created site by link"); - String url = envProperties.getShareUrl() + "/page/site/" + siteNameC2280_1 + "/dashboard"; - getBrowser().navigate().to(url); + log.info("STEP8: Open created site by link"); + String url = envProperties.getShareUrl() + "/page/site/" + siteNameC2280_1.get().getId() + "/dashboard"; + webDriver.get().navigate().to(url); assertEquals(systemErrorPage.getErrorHeader(), language.translate("systemError.header"), "Error message is displayed."); - cleanupAuthenticatedSession(); } @TestRail (id = "C2286") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void deleteSiteAsManagerFromDashlet() { - setupAuthenticatedSession(userC2280, password); - userDashboard.navigate(userC2280); + authenticateUsingLoginPage(userC2280.get()); + userDashboard.navigate(userC2280.get()); - LOG.info("STEP1&2: Hover over the created site from \"My sites\" dashlet. Click on \"Delete\" button"); - mySitesDashlet.clickDelete(siteNameC2280_2); + log.info("STEP1&2: Hover over the created site from \"My sites\" dashlet. Click on \"Delete\" button"); + mySitesDashlet.clickDelete(siteNameC2280_2.get().getId()); assertTrue(deleteSiteDialog.isPopupDisplayed(), "Delete popup is displayed."); - assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2280_2 + "''?"), true, "Confirm delete message is correct."); + assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2280_2.get().getId() + "''?"), true, "Confirm delete message is correct."); - LOG.info("STEP3: Click again on \"Delete\" button."); + log.info("STEP3: Click again on \"Delete\" button."); deleteSiteDialog.clickDelete(); assertEquals(deleteSiteDialog.getConfirmMessage().contains(language.translate("deleteSite.confirmAgain")), true, "Second confirm delete message is correct"); - LOG.info("STEP4: Click \"Yes\" button"); + log.info("STEP4: Click \"Yes\" button"); deleteSiteDialog.clickYes(); - assertFalse(mySitesDashlet.isSitePresent(siteNameC2280_2), "Site isn't displayed in 'MySites' dashlet."); + assertFalse(mySitesDashlet.isSitePresent(siteNameC2280_2.get().getId()), "Site isn't displayed in 'MySites' dashlet."); - LOG.info("STEP5: Search for the file created within the site"); - toolbar.search(siteNameC2280_2); + log.info("STEP5: Search for the file created within the site"); + toolbar.search(siteNameC2280_2.get().getId()); assertEquals(searchFromToolbarPage.getNumberOfResultsText(), "0 - results found", "No results"); - LOG.info("STEP6: Open created site by link"); - String url = envProperties.getShareUrl() + "/page/site/" + siteNameC2280_2 + "/dashboard"; - getBrowser().navigate().to(url); + log.info("STEP6: Open created site by link"); + String url = envProperties.getShareUrl() + "/page/site/" + siteNameC2280_2.get().getId() + "/dashboard"; + webDriver.get().navigate().to(url); assertEquals(systemErrorPage.getErrorHeader(), language.translate("systemError.header"), "Error message is displayed."); - cleanupAuthenticatedSession(); } @TestRail (id = "C2281, C2287") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void deleteSiteAsContributorFromSiteFinder() { - setupAuthenticatedSession(userC2281, password); + authenticateUsingLoginPage(userC2281.get()); - LOG.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); + log.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); toolbar.clickSites().clickSiteFinder(); softAssert.assertEquals(siteFinderPage.isSearchFieldDisplayed(), true, "Site Finder page is displayed."); - LOG.info("STEP2: Search for the created site"); - siteFinderPage.searchSiteWithName(siteNameUserCanNotDelete); -// softAssert.assertEquals(siteFinderPage.checkSiteWasFound(siteNameUserCanNotDelete), true, "Site is found."); + log.info("STEP2: Search for the created site"); + siteFinderPage.searchSiteWithName(siteNameUserCanNotDelete.get().getId()); + softAssert.assertEquals(siteFinderPage.checkSiteWasFound(siteNameUserCanNotDelete.get().getId()), true, "Site is found."); - LOG.info("STEP3: Verify options available for the site"); - softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete, "Delete"), false, "Delete option is not displayed."); - softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete, "Leave"), true, "Leave option is displayed."); - userDashboard.navigate(userC2281); + log.info("STEP3: Verify options available for the site"); + softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete.get().getId(), "Delete"), false, "Delete option is not displayed."); + softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete.get().getId(), "Leave"), true, "Leave option is displayed."); + userDashboard.navigate(userC2281.get()); - LOG.info("Step 4: Verify options available on My Sites Dashlet"); - mySitesDashlet.hoverSite(siteNameUserCanNotDelete); + log.info("Step 4: Verify options available on My Sites Dashlet"); + mySitesDashlet.hoverSite(siteNameUserCanNotDelete.get().getId()); softAssert.assertEquals(mySitesDashlet.isDeleteButtonDisplayed(), false, "Delete button isn't displayed."); softAssert.assertAll(); - cleanupAuthenticatedSession(); } @TestRail (id = "C2282, C2288") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void deleteSiteAsCollaboratorFromSiteFinder() { - setupAuthenticatedSession(userc2282, password); + authenticateUsingLoginPage(userC2282.get()); - LOG.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); + log.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); toolbar.clickSites().clickSiteFinder(); softAssert.assertEquals(siteFinderPage.isSearchFieldDisplayed(), true, "Site Finder page is displayed."); - LOG.info("STEP2: Search for the created site"); - siteFinderPage.searchSiteWithName(siteNameUserCanNotDelete); -// softAssert.assertEquals(siteFinderPage.checkSiteWasFound(siteNameUserCanNotDelete), true, "Site is found."); + log.info("STEP2: Search for the created site"); + siteFinderPage.searchSiteWithName(siteNameUserCanNotDelete.get().getId()); + softAssert.assertEquals(siteFinderPage.checkSiteWasFound(siteNameUserCanNotDelete.get().getId()), true, "Site is found."); - LOG.info("STEP3: Verify options available for the site"); - softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete, "Delete"), false, "Delete option is not displayed."); - softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete, "Leave"), true, "Leave option is displayed."); + log.info("STEP3: Verify options available for the site"); + softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete.get().getId(), "Delete"), false, "Delete option is not displayed."); + softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete.get().getId(), "Leave"), true, "Leave option is displayed."); - LOG.info("Step 4: Verify options available on My Sites Dashlet"); + log.info("Step 4: Verify options available on My Sites Dashlet"); userDashboard.navigateByMenuBar(); - mySitesDashlet.hoverSite(siteNameUserCanNotDelete); + mySitesDashlet.hoverSite(siteNameUserCanNotDelete.get().getId()); softAssert.assertEquals(mySitesDashlet.isDeleteButtonDisplayed(), false, "Delete button isn't displayed."); softAssert.assertAll(); - cleanupAuthenticatedSession(); } @TestRail (id = "C2283, C2289") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void deleteSiteAsConsumerFromSiteFinder() { - setupAuthenticatedSession(userC2283, password); + authenticateUsingLoginPage(userC2283.get()); - LOG.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); + log.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); siteFinderPage.navigateByMenuBar(); softAssert.assertEquals(siteFinderPage.isSearchFieldDisplayed(), true, "Site Finder page is displayed."); - LOG.info("STEP2: Search for the created site"); - siteFinderPage.searchSiteWithName(siteNameUserCanNotDelete); -// softAssert.assertEquals(siteFinderPage.checkSiteWasFound(siteNameUserCanNotDelete), true, "Site is found."); + log.info("STEP2: Search for the created site"); + siteFinderPage.searchSiteWithName(siteNameUserCanNotDelete.get().getId()); + softAssert.assertEquals(siteFinderPage.checkSiteWasFound(siteNameUserCanNotDelete.get().getId()), true, "Site is found."); - LOG.info("STEP3: Verify options available for the site"); - softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete, "Delete"), false, "Delete option is not displayed."); - softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete, "Leave"), true, "Leave option is displayed."); + log.info("STEP3: Verify options available for the site"); + softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete.get().getId(), "Delete"), false, "Delete option is not displayed."); + softAssert.assertEquals(siteFinderPage.isButtonDisplayedForSite(siteNameUserCanNotDelete.get().getId(), "Leave"), true, "Leave option is displayed."); - LOG.info("Step 4: Verify options available on My Sites Dashlet"); - userDashboard.navigate(userC2283); - mySitesDashlet.hoverSite(siteNameUserCanNotDelete); + log.info("Step 4: Verify options available on My Sites Dashlet"); + userDashboard.navigate(userC2283.get()); + mySitesDashlet.hoverSite(siteNameUserCanNotDelete.get().getId()); assertEquals(mySitesDashlet.isDeleteButtonDisplayed(), false, "Delete button isn't displayed."); softAssert.assertAll(); - cleanupAuthenticatedSession(); } @TestRail (id = "C2284") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void cancelDeleteSiteFromSiteFinder() { - setupAuthenticatedSession(userC2284, password); + authenticateUsingLoginPage(userC2284.get()); - LOG.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); + log.info("STEP1: Navigate to \"Site Finder\" page (from Alfresco Toolbar -> Sites menu -> Site Finder)"); siteFinderPage.navigateByMenuBar(); assertEquals(siteFinderPage.isSearchFieldDisplayed(), true, "Site Finder page is displayed."); - LOG.info("STEP2: Search for the created site"); - siteFinderPage.searchSiteWithName(siteNameC2284); -// assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2284), true, "Site is found."); + log.info("STEP2: Search for the created site"); + siteFinderPage.searchSiteWithName(siteNameC2284.get().getId()); + assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2284.get().getId()), true, "Site is found."); - LOG.info("STEP3: Click on 'Delete' button"); - siteFinderPage.clickSiteButton(siteNameC2284, "Delete"); + log.info("STEP3: Click on 'Delete' button"); + siteFinderPage.clickSiteButton(siteNameC2284.get().getId(), "Delete"); assertEquals(deleteSiteDialog.isPopupDisplayed(), true, "Delete popup is displayed."); - assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2284 + "''?"), true, "Confirm delete message is correct."); + assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2284.get().getId() + "''?"), true, "Confirm delete message is correct."); - LOG.info("STEP4: Click on 'Cancel' button"); + log.info("STEP4: Click on 'Cancel' button"); deleteSiteDialog.clickCancel(); - siteFinderPage.searchSiteWithName(siteNameC2284); -// assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2284), true, "Site is found, it wasn't deleted."); + siteFinderPage.searchSiteWithName(siteNameC2284.get().getId()); + assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2284.get().getId()), true, "Site is found, it wasn't deleted."); - LOG.info("STEP5: Click again on 'Delete' button"); - siteFinderPage.clickSiteButton(siteNameC2284, "Delete"); + log.info("STEP5: Click again on 'Delete' button"); + siteFinderPage.clickSiteButton(siteNameC2284.get().getId(), "Delete"); assertEquals(deleteSiteDialog.isPopupDisplayed(), true, "Delete popup is displayed."); - assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2284 + "''?"), true, "Confirm delete message is correct."); + assertEquals(deleteSiteDialog.getConfirmMessage().equals(language.translate("deleteSite.confirm") + siteNameC2284.get().getId() + "''?"), true, "Confirm delete message is correct."); - LOG.info("STEP6: Click on 'Delete' button"); + log.info("STEP6: Click on 'Delete' button"); deleteSiteDialog.clickDelete(); assertEquals(deleteSiteDialog.getConfirmMessage().contains(language.translate("deleteSite.confirmAgain")), true, "Second confirm delete message is correct"); deleteSiteDialog.clickNo(); - siteFinderPage.searchSiteWithName(siteNameC2284); -// assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2284), true, "Site is found, it wasn't deleted."); - cleanupAuthenticatedSession(); + siteFinderPage.searchSiteWithName(siteNameC2284.get().getId()); + assertEquals(siteFinderPage.checkSiteWasFound(siteNameC2284.get().getId()), true, "Site is found, it wasn't deleted."); } @TestRail (id = "C2292") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void cancelDeleteSiteFromSitesManager() - { - setupAuthenticatedSession(adminUser, adminPassword); + @Test (groups = { TestGroup.SANITY, TestGroup.SITES }, enabled = true) + public void cancelDeleteSiteFromSitesManager() { - LOG.info("STEP1: Open \"Site Manager\" page"); + authenticateUsingLoginPage(getAdminUser()); + log.info("STEP1: Open \"Site Manager\" page"); sitesManagerPage.navigate(); assertEquals(sitesManagerPage.isSitesTableDisplayed(), true, "Site Manager page is displayed."); - LOG.info("STEP2: Click on \"Actions\" -> \"Delete\" button for \"siteA\""); -// sitesManagerPage.usingSite(siteModel).clickDelete().assertConfirmMessageFromSiteManagerIsCorrect(siteNameC2292) -// .clickCancelFromSitesManager(); -// sitesManagerPage.usingSite(siteNameC2292).assertSiteIsDisplayed(); + log.info("STEP2: Click on \"Actions\" -> \"Delete\" button for \"siteA\""); + sitesManagerPage.usingSite(siteNameC2292.get()).clickDelete().assertConfirmMessageFromSiteManagerIsCorrect(siteNameC2292.get().getId()) + .clickCancelFromSitesManager(); + sitesManagerPage.usingSite(siteNameC2292.get()).assertSiteIsDisplayed(siteNameC2292.get().getId()); - LOG.info("STEP4: Open the created site by link"); - String url = envProperties.getShareUrl() + "/page/site/" + siteNameC2292 + "/dashboard"; - getBrowser().navigate().to(url); -// assertEquals(siteDashboardPage.getCurrentUrl(), url.replace(":80/", "/"), "User is successfully redirected to the site dashboard."); - cleanupAuthenticatedSession(); + log.info("STEP4: Open the created site by link"); + String url = envProperties.getShareUrl() + "/page/site/" + siteNameC2292.get().getId() + "/dashboard"; + webDriver.get().navigate().to(url); + siteDashboardPage.assertSiteHeaderTitleIs(siteNameC2292.get()); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/EditSiteDetailsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/EditSiteDetailsTests.java index 3004633c72..fecf8a2172 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/EditSiteDetailsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/EditSiteDetailsTests.java @@ -3,68 +3,75 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.DashboardCustomization; -import org.alfresco.dataprep.SiteService; + import org.alfresco.po.share.dashlet.SiteProfileDashlet; -import org.alfresco.po.share.site.EditSiteDetailsDialog; +import org.alfresco.po.share.site.EditSiteDetails; import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; +@Slf4j /** * @author Laura.Capsa */ -public class EditSiteDetailsTests extends ContextAwareWebTest +public class EditSiteDetailsTests extends BaseTest { //@Autowired SiteDashboardPage siteDashboardPage; - - @Autowired - EditSiteDetailsDialog editSiteDetailsDialog; - - //@Autowired + EditSiteDetails editSiteDetailsDialog; SiteProfileDashlet siteProfileDashlet; - - private String user = String.format("profileUser%s", RandomData.getRandomAlphanumeric()); - private String siteName = String.format("siteName%s", RandomData.getRandomAlphanumeric()); - private String description = String.format("description%s", RandomData.getRandomAlphanumeric()); private String newSiteName = String.format("New Site Name %s", RandomData.getRandomAlphanumeric()); private String newDescription = String.format("New description %s", RandomData.getRandomAlphanumeric()); + private static final String VISIBILITY_LABEL = "siteProfileDashlet.visibilityLabel"; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user, password, user + domain, "firstName", "lastName"); - siteService.create(user, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - siteService.addDashlet(user, password, siteName, DashboardCustomization.SiteDashlet.SITE_PROFILE, - DashboardCustomization.DashletLayout.TWO_COLUMNS_WIDE_RIGHT, 1, 1); - setupAuthenticatedSession(user, password); + siteDashboardPage = new SiteDashboardPage(webDriver); + editSiteDetailsDialog = new EditSiteDetails(webDriver); + siteProfileDashlet = new SiteProfileDashlet(webDriver); + + user.set(getDataUser().usingAdmin().createRandomTestUser()); + site.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + + addDashlet(user.get(), site.get(), DashboardCustomization.SiteDashlet.SITE_PROFILE, 1, 2); + + authenticateUsingLoginPage(user.get()); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); - siteService.delete(adminUser, adminPassword, siteName); + deleteUsersIfNotNull(user.get()); + deleteSitesIfNotNull(site.get()); } @TestRail (id = "C2210") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) public void verifyEditSiteDetailsForm() { - LOG.info("STEP1: Go to the created site. Click 'Settings' icon -> 'Edit Site Details'"); - siteDashboardPage.navigateToEditSiteDetailsDialog(siteName); + log.info("STEP1: Go to the created site. Click 'Settings' icon -> 'Edit Site Details'"); + siteDashboardPage.navigateToEditSiteDetailsDialog(site.get().getId()); - LOG.info("STEP2: Verify the items from 'Edit Site Details' form"); + log.info("STEP2: Verify the items from 'Edit Site Details' form"); assertTrue(editSiteDetailsDialog.isNameInputDisplayed(), "Name field is displayed"); assertEquals(editSiteDetailsDialog.getNameLabel(), language.translate("siteDetails.title"), "Name label is correct"); @@ -82,7 +89,7 @@ public void verifyEditSiteDetailsForm() assertTrue(editSiteDetailsDialog.isSaveButtonDisplayed(), "Save button is displayed"); assertTrue(editSiteDetailsDialog.isCancelButtonDisplayed(), "Cancel button is displayed"); - LOG.info("STEP3: Verify the description for the visibility options"); + log.info("STEP3: Verify the description for the visibility options"); assertEquals(editSiteDetailsDialog.getPublicVisibilityDescription(), language.translate("siteDetails.publicVisibilityDescription"), "Public option has correct description"); assertEquals(editSiteDetailsDialog.getModeratedVisibilityDescription(), language.translate("siteDetails.moderatedVisibilityDescription"), @@ -95,21 +102,21 @@ public void verifyEditSiteDetailsForm() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void cancelEditSiteDetails() { - LOG.info("STEP1: Go to the created site. Click 'Settings' icon -> 'Edit Site Details'"); - siteDashboardPage.navigateToEditSiteDetailsDialog(siteName); + log.info("STEP1: Go to the created site. Click 'Settings' icon -> 'Edit Site Details'"); + siteDashboardPage.navigateToEditSiteDetailsDialog(site.get().getId()); - LOG.info("STEP2: Type new name and description for the site"); + log.info("STEP2: Type new name and description for the site"); editSiteDetailsDialog.typeDetails(newSiteName, newDescription); assertEquals(editSiteDetailsDialog.getTitleInputText(), newSiteName, "The new site title is filled in."); - LOG.info("STEP3: Select \"Private\" visibility for the site"); + log.info("STEP3: Select \"Private\" visibility for the site"); editSiteDetailsDialog.selectPrivateVisibility(); assertEquals(editSiteDetailsDialog.isPrivateVisibilitySelected(), true, "Private visibility is selected."); - LOG.info("STEP4: Click \"Cancel\" button"); + log.info("STEP4: Click \"Cancel\" button"); editSiteDetailsDialog.clickCancelButton(); -// assertEquals(siteProfileDashlet.getWelcomeMessageText(), "Welcome to " + siteName, "Site name is not updated."); -// assertEquals(siteProfileDashlet.getSiteDescription(description).getText(), description, "Description is not updated."); -// assertEquals(siteProfileDashlet.getSiteVisibility(language.translate("siteProfile.PublicVisibility")).getText().equals(language.translate("siteProfile.PublicVisibility")), true, "Visibility is not updated."); + siteProfileDashlet.assertSiteWelcomeMessageEquals("Welcome to " + site.get().getId()); + siteProfileDashlet.assertSiteDescriptionEquals(site.get().getDescription()); + siteProfileDashlet.assertSiteVisibilityEquals(language.translate(VISIBILITY_LABEL), site.get().getVisibility().name()); } } \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/FavoriteSiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/FavoriteSiteTests.java index 279958fec2..4aa9e13346 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/FavoriteSiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/FavoriteSiteTests.java @@ -1,26 +1,34 @@ package org.alfresco.share.site; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.SiteService; import org.alfresco.po.share.dashlet.MySitesDashlet; import org.alfresco.po.share.site.SiteDashboardPage; +import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; + import org.alfresco.utility.constants.UserRole; -import org.alfresco.utility.data.DataSite; import org.alfresco.utility.data.DataUser; -import org.alfresco.utility.data.RandomData; import org.alfresco.utility.exception.DataPreparationException; import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; + import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; -public class FavoriteSiteTests extends ContextAwareWebTest +@Slf4j +public class FavoriteSiteTests extends BaseTest { //Autowired UserDashboardPage userDashboardPage; @@ -31,86 +39,106 @@ public class FavoriteSiteTests extends ContextAwareWebTest //@Autowired MySitesDashlet mySitesDashlet; + Toolbar toolbar; + @Autowired DataUser dataUser; @Autowired - DataSite dataSite; + protected SiteService siteService; - private String userName = "favoriteSitesUser" + RandomData.getRandomAlphanumeric(); + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal siteC2216 = new ThreadLocal<>(); + private final ThreadLocal siteC2217 = new ThreadLocal<>(); + private final ThreadLocal siteC2220 = new ThreadLocal<>(); + private final ThreadLocal siteC2221 = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, userName, password, userName + domain, userName, userName); + log.info("Precondition: Any Test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + siteDashboardPage = new SiteDashboardPage(webDriver); + toolbar = new Toolbar(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + mySitesDashlet = new MySitesDashlet(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, userName); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + userName); - + deleteUsersIfNotNull(user.get()); } @TestRail (id = "C2216") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void addCurrentSiteToFavoritesUsingSitesMenu() throws DataPreparationException { - UserModel testUser = dataUser.createRandomTestUser(); - SiteModel testSite = dataSite.createPublicRandomSite(); - dataUser.addUserToSite(testUser, testSite, UserRole.SiteManager); - setupAuthenticatedSession(testUser.getUsername(), password); - LOG.info("STEP 1 - Navigate to the created site"); - siteDashboardPage.navigate(testSite.getTitle()); + log.info("PreCondition: Site siteNameC2216 is created"); + siteC2216.set(getDataSite().usingAdmin().createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + + dataUser.addUserToSite(user.get(), siteC2216.get(), UserRole.SiteManager); + + authenticateUsingLoginPage(user.get()); + + log.info("STEP 1 - Navigate to the created site"); + siteDashboardPage.navigate(siteC2216.get().getId()); Assert.assertTrue(siteDashboardPage.isAlfrescoLogoDisplayed(), "Alfresco logo is displayed"); - LOG.info("STEP 2 - Click \"Sites\" menu from Alfresco Toolbar"); + log.info("STEP 2 - Click \"Sites\" menu from Alfresco Toolbar"); toolbar.clickSites().assertAddCurrentSiteToFavoritesDisplayed(); - LOG.info("STEP 3 - Click \"Add current site to Favorites\"."); + log.info("STEP 3 - Click \"Add current site to Favorites\"."); toolbar.clickSites().clickAddCurrentSiteToFavorites(); toolbar.clickSites().assertRemoveCurrentSiteFromFavoritesIsDisplayed(); - LOG.info("STEP 4 - Click again \"Sites\" menu. Click on \"Favorites\" icon."); - toolbar.clickSites().assertSiteIsFavorite(testSite.getTitle()); + log.info("STEP 4 - Click again \"Sites\" menu. Click on \"Favorites\" icon."); + toolbar.clickSites().assertSiteIsFavorite(siteC2216.get().getId()); - LOG.info("STEP 5 - Click on the site."); - toolbar.clickSites().clickFavoriteSite(testSite).assertSiteDashboardPageIsOpened(); + log.info("STEP 5 - Click on the site."); + toolbar.clickSites().clickFavoriteSite(siteC2216.get().getId()).assertSiteDashboardPageIsOpened(); - LOG.info("STEP 6 - Go to User Dashboard page. Verify \"My Sites\" dashlet."); - userDashboardPage.navigate(testUser.getUsername()); + log.info("STEP 6 - Go to User Dashboard page. Verify \"My Sites\" dashlet."); + userDashboardPage.navigate(user.get().getUsername()); Assert.assertTrue(userDashboardPage.isCustomizeUserDashboardDisplayed(), "\"Customize User Dashboard\" is displayed"); - Assert.assertTrue(mySitesDashlet.isSiteFavorite(testSite.getTitle()), testSite.getTitle() + " is favorite"); - userService.delete(adminUser, adminPassword, testUser.getUsername()); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + testUser.getUsername()); - siteService.delete(adminUser, adminPassword, testSite.getTitle()); + Assert.assertTrue(mySitesDashlet.isSiteFavorite(siteC2216.get().getId()), siteC2216.get().getId() + " is favorite"); + + deleteSitesIfNotNull(siteC2216.get()); } @TestRail (id = "C2217") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) public void removeCurrentSiteFromFavoritesUsingSitesMenu() { - String siteName = String.format("Site1%s", RandomData.getRandomAlphanumeric()); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); - setupAuthenticatedSession(userName, password); - LOG.info("STEP 1 - Navigate to the created site. Click \"Sites\" menu from Alfresco Toolbar"); - siteDashboardPage.navigate(siteName); + log.info("PreCondition: Site siteNameC2217 is created"); + siteC2217.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + + authenticateUsingLoginPage(user.get()); + + log.info("STEP 1 - Navigate to the created site. Click \"Sites\" menu from Alfresco Toolbar"); + siteDashboardPage.navigate(siteC2217.get()); Assert.assertTrue(siteDashboardPage.isAlfrescoLogoDisplayed(), "Alfresco logo is displayed"); toolbar.clickSites().assertRemoveCurrentSiteFromFavoritesIsDisplayed(); - LOG.info("STEP 2 - Click \"Remove current site from Favorites\". Click again \"Sites\" menu"); + log.info("STEP 2 - Click \"Remove current site from Favorites\". Click again \"Sites\" menu"); toolbar.clickSites().clickRemoveCurrentSiteFromFavorites(); toolbar.clickSites().assertAddCurrentSiteToFavoritesDisplayed(); - LOG.info("STEP 3 - Click on \"Favorites\" icon"); - toolbar.clickSites().assertSiteIsNotFavorite(siteName); - LOG.info("STEP 4 - Go to User Dashboard page. Verify \"My Sites\" dashlet"); - userDashboardPage.navigate(userName); + log.info("STEP 3 - Click on \"Favorites\" icon"); + toolbar.clickSites().assertVerifySiteIsNotInFavorite(siteC2217.get().getId()); + + log.info("STEP 4 - Go to User Dashboard page. Verify \"My Sites\" dashlet"); + userDashboardPage.navigate(user.get()); Assert.assertTrue(userDashboardPage.isCustomizeUserDashboardDisplayed(), "\"Customize User Dashboard\" is displayed"); - Assert.assertFalse(mySitesDashlet.isSiteFavorite(siteName), siteName + " isn't favorite"); - siteService.delete(adminUser, adminPassword, siteName); + Assert.assertFalse(mySitesDashlet.isSiteFavorite(siteC2217.get().getId()), siteC2217.get().getId() + " isn't favorite"); + + deleteSitesIfNotNull(siteC2217.get()); } @@ -118,43 +146,57 @@ public void removeCurrentSiteFromFavoritesUsingSitesMenu() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void addSiteToFavoritesUsingMySitesDashlet() throws DataPreparationException { - UserModel testUser = dataUser.createRandomTestUser(); - SiteModel testSite = dataSite.createPublicRandomSite(); - dataUser.addUserToSite(testUser, testSite, UserRole.SiteManager); - setupAuthenticatedSession(testUser.getUsername(), password); - LOG.info("STEP 1 - Go to \"User Dashboard\" page"); - userDashboardPage.navigate(testUser.getUsername()); + log.info("PreCondition: Site siteNameC2220 is created"); + siteC2220.set(getDataSite().usingAdmin().createPublicRandomSite()); + getCmisApi().authenticateUser(getAdminUser()); + + dataUser.addUserToSite(user.get(), siteC2220.get(), UserRole.SiteManager); + + authenticateUsingLoginPage(user.get()); + + log.info("STEP 1 - Go to \"User Dashboard\" page"); + userDashboardPage.navigate(user.get().getUsername()); Assert.assertTrue(userDashboardPage.isCustomizeUserDashboardDisplayed(), "\"Customize User Dashboard\" is displayed"); - LOG.info("STEP 2 - Verify \"My Sites\" dashlet"); - Assert.assertFalse(mySitesDashlet.isSiteFavorite(testSite.getTitle()), testSite.getTitle() + " isn't favorite"); - LOG.info("STEP 3 - Click on \"Favorite\" link"); - mySitesDashlet.clickFavorite(testSite.getTitle()); - Assert.assertTrue(mySitesDashlet.isSiteFavorite(testSite.getTitle()), testSite.getTitle() + " is favorite"); - LOG.info("STEP 4 - Go to Alfresco Toolbar -> \"Sites\" menu. Click on \"Favorites\""); - toolbar.clickSites().assertSiteIsFavorite(testSite); - userService.delete(adminUser, adminPassword, testUser.getUsername()); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + testUser.getUsername()); - siteService.delete(adminUser, adminPassword, testSite.getTitle()); + + log.info("STEP 2 - Verify \"My Sites\" dashlet"); + Assert.assertFalse(mySitesDashlet.isSiteFavorite(siteC2220.get().getId()), siteC2220.get().getId() + " isn't favorite"); + + log.info("STEP 3 - Click on \"Favorite\" link"); + mySitesDashlet.clickFavorite(siteC2220.get().getId()); + Assert.assertTrue(mySitesDashlet.isSiteFavorite(siteC2220.get().getId()), siteC2220.get().getId() + " is favorite"); + + log.info("STEP 4 - Go to Alfresco Toolbar -> \"Sites\" menu. Click on \"Favorites\""); + toolbar.clickSites().assertSiteIsFavorite(siteC2220.get().getId()); + + deleteSitesIfNotNull(siteC2220.get()); } @TestRail (id = "C2221") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void removeSiteFromFavoritesUsingMySitesDashlet() { - String siteName = String.format("Site1%s", RandomData.getRandomAlphanumeric()); - siteService.create(userName, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); - siteService.setFavorite(userName, password, siteName); - setupAuthenticatedSession(userName, password); - LOG.info("STEP 1 - Go to \"User Dashboard\" page"); - userDashboardPage.navigate(userName); + log.info("PreCondition: Site siteNameC2221 is created"); + siteC2221.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + + siteService.setFavorite(user.get().getUsername(), user.get().getPassword(), siteC2221.get().getId()); + + authenticateUsingLoginPage(user.get()); + + log.info("STEP 1 - Go to \"User Dashboard\" page"); + userDashboardPage.navigate(user.get()); Assert.assertTrue(userDashboardPage.isCustomizeUserDashboardDisplayed(), "\"Customize User Dashboard\" is displayed"); - LOG.info("STEP 2 - Verify \"My Sites\" dashlet"); - Assert.assertTrue(mySitesDashlet.isSiteFavorite(siteName), siteName + " is favorite"); - LOG.info("STEP 3 - Click on yellow star (\"Remove site from favorites\" option)"); - mySitesDashlet.clickFavorite(siteName); - Assert.assertFalse(mySitesDashlet.isSiteFavorite(siteName), siteName + " isn't favorite"); - LOG.info("STEP 4 - Go to Alfresco Toolbar -> \"Sites\" menu. Click on \"Favorites\""); - toolbar.clickSites().assertSiteIsNotFavorite(siteName); - siteService.delete(adminUser, adminPassword, siteName); + + log.info("STEP 2 - Verify \"My Sites\" dashlet"); + Assert.assertTrue(mySitesDashlet.isSiteFavorite(siteC2221.get().getId()), siteC2221.get().getId() + " is favorite"); + + log.info("STEP 3 - Click on yellow star (\"Remove site from favorites\" option)"); + mySitesDashlet.clickFavorite(siteC2221.get().getId()); + Assert.assertFalse(mySitesDashlet.isSiteFavorite(siteC2221.get().getId()), siteC2221.get().getId() + " isn't favorite"); + + log.info("STEP 4 - Go to Alfresco Toolbar -> \"Sites\" menu. Click on \"Favorites\""); + toolbar.clickSites().assertVerifySiteIsNotInFavorite(siteC2221.get().getId()); + + deleteSitesIfNotNull(siteC2221.get()); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/EnteringSiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/EnteringSiteTests.java index 40b25d8914..46b8a3d685 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/EnteringSiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/EnteringSiteTests.java @@ -1,107 +1,104 @@ package org.alfresco.share.site.accessingExistingSites; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.SiteFinderPage; import org.alfresco.po.share.dashlet.MySitesDashlet; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.toolbar.Toolbar; import org.alfresco.po.share.user.UserDashboardPage; import org.alfresco.po.share.user.profile.UserSitesListPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.testng.Assert.assertTrue; -/** - * Created by Claudia Agache on 7/6/2016. - */ -public class EnteringSiteTests extends ContextAwareWebTest +@Slf4j +public class EnteringSiteTests extends BaseTest { - //@Autowired SiteFinderPage siteFinderPage; - - //@Autowired MySitesDashlet mySitesDashlet; - - // @Autowired UserSitesListPage userSitesListPage; - - //@Autowired Toolbar toolbar; - - //@Autowired SiteDashboardPage siteDashboardPage; - - //@Autowired UserDashboardPage userDashboardPage; - - private String user1 = String.format("testUser1%s", RandomData.getRandomAlphanumeric()); - private String siteName = String.format("siteName%s", RandomData.getRandomAlphanumeric()); - private String description = String.format("description%s", RandomData.getRandomAlphanumeric()); - - @BeforeClass (alwaysRun = true) + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal site = new ThreadLocal<>(); + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user1, password, user1 + domain, "firstName", "lastName"); - siteService.create(user1, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - siteService.setFavorite(user1, password, siteName); - setupAuthenticatedSession(user1, password); + log.info("PreCondition: Creating a TestUser1"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a Random Site"); + site.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + userDashboardPage = new UserDashboardPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + mySitesDashlet = new MySitesDashlet(webDriver); + siteFinderPage = new SiteFinderPage(webDriver); + toolbar = new Toolbar(webDriver); + userSitesListPage = new UserSitesListPage(webDriver); + + log.info("Precondition 1: Any user logged in Share."); + authenticateUsingLoginPage(user1.get()); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); - siteService.delete(adminUser, adminPassword, siteName); + deleteUsersIfNotNull(user1.get()); + deleteSitesIfNotNull(site.get()); + deleteAllCookiesIfNotNull(); } @TestRail (id = "C2977") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) public void accessSiteUsingMySitesDashlet() { - userDashboardPage.navigate(user1); - LOG.info("STEP 1: Verify 'My Sites' dashlet."); - assertTrue(mySitesDashlet.isSitePresent(siteName), siteName + " should be displayed in 'My Sites' dashlet."); + userDashboardPage.navigate(user1.get()); + log.info("STEP 1: Verify 'My Sites' dashlet."); + assertTrue(mySitesDashlet.isSitePresent(site.get().getId()), site.get() + " should be displayed in 'My Sites' dashlet."); - LOG.info("STEP 2: Click on '" + siteName + "' link."); - mySitesDashlet.accessSite(siteName); - //assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + siteName + "/dashboard"), "User should be redirected to " + siteName + "'s dashboard page."); + log.info("STEP 2: Click on '" + site.get() + "' link."); + mySitesDashlet.accessSite(site.get().getId()); + assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + site.get().getTitle() + "/dashboard"), "User should be redirected to " + site.get().getTitle() + "'s dashboard page."); } @TestRail (id = "C2978") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void accessSiteUsingSiteFinderPage() { - userDashboardPage.navigate(user1); + userDashboardPage.navigate(user1.get()); siteFinderPage.navigate(); - LOG.info("STEP 1: Search for '" + siteName + "'."); - siteFinderPage.searchSiteWithName(siteName); -// assertTrue(siteFinderPage.checkSiteWasFound(siteName), siteName + " should be found."); + log.info("STEP 1: Search for '" + site.get().getId() + "'."); + siteFinderPage.searchSiteNameWithRetry(site.get().getId()); + assertTrue(siteFinderPage.checkSiteWasFound(site.get().getId()), site.get().getId() + " should be found."); - LOG.info("STEP 2: Click on '" + siteName + "' link."); - siteFinderPage.accessSite(siteName); -// assertTrue(siteFinderPage.getCurrentUrl().endsWith("site/" + siteName + "/dashboard"), "User should be redirected to " + siteName + "'s dashboard page."); + log.info("STEP 2: Click on '" + site.get() + "' link."); + siteFinderPage.accessSite(site.get().getId()); + assertTrue(siteFinderPage.getCurrentUrl().endsWith("site/" + site.get().getId() + "/dashboard"), "User should be redirected to " + site.get().getId() + "'s dashboard page."); } @TestRail (id = "C2979") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void accessSiteUsingSitesMenuFavorites() { - userDashboardPage.navigate(user1); - LOG.info("Click on 'Sites' menu -> 'Favorites' link."); - toolbar.clickSites().assertSiteIsFavorite(siteName); + userDashboardPage.navigate(user1.get()); + log.info("Click on 'Sites' menu -> 'Favorites' link."); + toolbar.clickSites().assertSiteIsFavorite(site.get()); - LOG.info("STEP 2: Click on '" + siteName + "' link."); - toolbar.clickSites().clickFavoriteSite(siteName).assertSiteDashboardPageIsOpened(); + log.info("STEP 2: Click on '" + site.get() + "' link."); + toolbar.clickSites().clickFavoriteSite(site.get()).assertSiteDashboardPageIsOpened(); } @TestRail (id = "C2980") @@ -109,54 +106,53 @@ public void accessSiteUsingSitesMenuFavorites() public void accessSiteUsingSitesMenuRecentSites() { //precondition: site is recently accessed by current user - siteDashboardPage.navigate(siteName); + siteDashboardPage.navigate(site.get()); toolbar.clickHome(); - LOG.info("Click on 'Sites' and verify 'Recent Sites' section."); - toolbar.clickSites().assertSiteIsInRecentSites(siteName); + log.info("Click on 'Sites' and verify 'Recent Sites' section."); + toolbar.clickSites().assertSiteIsInRecentSites(site.get()); - LOG.info("STEP 2: Click on '" + siteName + "' link."); - toolbar.clickSites().clickRecentSite(siteName); - //assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + siteName + "/dashboard"), "User should be redirected to " + siteName + "'s dashboard page."); + log.info("STEP 2: Click on '" + site.get() + "' link."); + toolbar.clickSites().clickRecentSite(site.get()); + assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + site.get().getTitle() + "/dashboard"), "User should be redirected to " + site.get() + "'s dashboard page."); } @TestRail (id = "C2981") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void accessSiteUsingMyProfileSites() { - userSitesListPage.navigate(user1) - .assertSiteIsDisplayed(new SiteModel(siteName)); + userSitesListPage.navigate(user1.get()) + .assertSiteIsDisplayed(new SiteModel(site.get().getTitle())); - LOG.info("STEP 2: Click on '" + siteName + "' link."); - userSitesListPage.clickSite(new SiteModel(siteName)).assertSiteDashboardPageIsOpened(); + log.info("STEP 2: Click on '" + site.get() + "' link."); + userSitesListPage.clickSite(new SiteModel(site.get().getTitle())).assertSiteDashboardPageIsOpened(); } @TestRail (id = "C2982") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void accessSiteUsingSitesMenuMySites() { - userDashboardPage.navigate(user1); + userDashboardPage.navigate(user1.get()); toolbar.clickSites().clickMySites() - .assertSiteIsDisplayed(new SiteModel(siteName)); - LOG.info("STEP 1: Verify the sites from 'User Sites List' list."); + .assertSiteIsDisplayed(new SiteModel(site.get().getTitle())); + log.info("STEP 1: Verify the sites from 'User Sites List' list."); - LOG.info("STEP 2: Click on '" + siteName + "' link."); - userSitesListPage.clickSite(new SiteModel(siteName)); - // assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + siteName + "/dashboard"), "User should be redirected to " + siteName + "'s dashboard page."); + log.info("STEP 2: Click on '" + site.get() + "' link."); + userSitesListPage.clickSite(new SiteModel(site.get().getTitle())); + assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + site.get().getTitle() + "/dashboard"), "User should be redirected to " + site.get() + "'s dashboard page."); } @TestRail (id = "C3006") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void accessSiteUsingSearchBoxOnTheToolbar() { - userDashboardPage.navigate(user1); - getBrowser().refresh(); - LOG.info("STEP 1: Go to search box on the toolbar and type '" + siteName + "'."); - toolbar.searchInToolbar(siteName); - assertTrue(toolbar.isResultDisplayedInLiveSearch(siteName), siteName + " should be found."); - - LOG.info("STEP 2: Click on '" + siteName + "' link."); - toolbar.clickResult(siteName); - //assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + siteName + "/dashboard"), "User should be redirected to " + siteName + "'s dashboard page."); + userDashboardPage.navigate(user1.get()); + log.info("STEP 1: Go to search box on the toolbar and type '" + site.get() + "'."); + toolbar.searchInToolbar(site.get().getId()); + assertTrue(toolbar.isResultDisplayedLiveSearch(site.get().getId()), site.get() + " should be found."); + + log.info("STEP 2: Click on '" + site.get().getId() + "' link."); + toolbar.clickResult(site.get().getId()); + assertTrue(mySitesDashlet.getCurrentUrl().endsWith("site/" + site.get().getId() + "/dashboard"), "User should be redirected to " + site.get() + "'s dashboard page."); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/JoiningSiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/JoiningSiteTests.java index e68d219a46..280ce8f1a1 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/JoiningSiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/JoiningSiteTests.java @@ -1,7 +1,6 @@ package org.alfresco.share.site.accessingExistingSites; -import org.alfresco.dataprep.SiteService; -import org.alfresco.po.share.Notification; +import lombok.extern.slf4j.Slf4j; import org.alfresco.po.share.SiteFinderPage; import org.alfresco.po.share.dashlet.MySitesDashlet; import org.alfresco.po.share.site.SiteDashboardPage; @@ -10,21 +9,24 @@ import org.alfresco.po.share.tasksAndWorkflows.EditTaskPage; import org.alfresco.po.share.tasksAndWorkflows.MyTasksPage; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; -import static org.testng.Assert.*; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertEquals; -public class JoiningSiteTests extends ContextAwareWebTest +@Slf4j +public class JoiningSiteTests extends BaseTest { - private final String randomData = RandomData.getRandomAlphanumeric(); - //@Autowired SiteFinderPage siteFinderPage; @@ -47,236 +49,286 @@ public class JoiningSiteTests extends ContextAwareWebTest //@Autowired RequestSentDialog requestSentDialog; - - @Autowired - Notification notification; - private String user1 = String.format("testUser1%s", randomData); - private String user2 = String.format("testUser2%s", randomData); - private String user2FirstName = "user2_firstName"; - private String user2LastName = "user2_lastName"; - private String siteNameC2833 = String.format("SiteName-C2833-%s", randomData); - private String description = String.format("description%s", randomData); - private String siteNameC2823 = String.format("SiteName-C2823-%s", randomData); - private String siteNameC3053 = String.format("SiteName-C3053-%s", randomData); - private String siteNameC2831 = String.format("SiteName-C2831-%s", randomData); - private String siteNameC3059 = String.format("SiteName-C3059-%s", randomData); - - @BeforeClass (alwaysRun = true) + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal user2 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2833 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2823 = new ThreadLocal<>(); + private final ThreadLocal siteNameC3053 = new ThreadLocal<>(); + private final ThreadLocal siteNameC2831 = new ThreadLocal<>(); + private final ThreadLocal siteNameC3059 = new ThreadLocal<>(); + + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user1, password, user1 + domain, "firstName", "lastName"); - userService.create(adminUser, adminPassword, user2, password, user2 + domain, user2FirstName, user2LastName); - siteService.create(user1, password, domain, siteNameC2833, description, SiteService.Visibility.MODERATED); - siteService.create(user1, password, domain, siteNameC2823, description, SiteService.Visibility.PUBLIC); - siteService.create(user1, password, domain, siteNameC3053, description, SiteService.Visibility.PUBLIC); - siteService.create(user1, password, domain, siteNameC2831, description, SiteService.Visibility.MODERATED); - siteService.create(user1, password, domain, siteNameC3059, description, SiteService.Visibility.MODERATED); + log.info("PreCondition: Creating two users"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + user2.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating few Random Sites"); + siteNameC2833.set(getDataSite().usingUser(user1.get()).createModeratedRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + siteNameC2823.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + siteNameC3053.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + siteNameC2831.set(getDataSite().usingUser(user1.get()).createModeratedRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + siteNameC3059.set(getDataSite().usingUser(user1.get()).createModeratedRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + siteFinderPage = new SiteFinderPage(webDriver); + siteUsersPage = new SiteUsersPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + mySitesDashlet = new MySitesDashlet(webDriver); + myTasksPage = new MyTasksPage(webDriver); + editTaskPage = new EditTaskPage(webDriver); + requestSentDialog = new RequestSentDialog(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); - userService.delete(adminUser, adminPassword, user2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2); - siteService.delete(adminUser, adminPassword, siteNameC2833); - siteService.delete(adminUser, adminPassword, siteNameC2823); - siteService.delete(adminUser, adminPassword, siteNameC3053); - siteService.delete(adminUser, adminPassword, siteNameC2831); - siteService.delete(adminUser, adminPassword, siteNameC3059); + deleteUsersIfNotNull(user1.get()); + deleteUsersIfNotNull(user2.get()); + deleteSitesIfNotNull(siteNameC2833.get()); + deleteSitesIfNotNull(siteNameC2823.get()); + deleteSitesIfNotNull(siteNameC3053.get()); + deleteSitesIfNotNull(siteNameC2831.get()); + deleteSitesIfNotNull(siteNameC3059.get()); + deleteAllCookiesIfNotNull(); } @TestRail (id = "C2823") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void joinPublicSiteFromSiteFinderPage() - { - setupAuthenticatedSession(user2, password); - siteFinderPage.navigate(); - - LOG.info("STEP 1: Enter site name (" + siteNameC2823 + ") in textbox and click on 'Search' button."); - siteFinderPage.searchSiteWithName(siteNameC2823); -// assertTrue(siteFinderPage.checkSiteWasFound(siteNameC2823), "Site is expected to be found."); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteNameC2823, "Join"), "'Join' button is expected to be displayed for " + siteNameC2823); + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) + public void joinPublicSiteFromSiteFinderPage() { - LOG.info("STEP 2: Click on " + siteNameC2823 + "'s name link. Click on 'Site Members' link."); - siteUsersPage.navigate(siteNameC2823); -// assertFalse(siteUsersPage.assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName), user2 + " should not be displayed in the list of members for " + siteNameC2823); + String user2FirstName = user2.get().getFirstName(); + String user2LastName = user2.get().getLastName(); - LOG.info("STEP 3: Return to 'Site Finder' page and click 'Join' button for " + siteNameC2823); + authenticateUsingLoginPage(user2.get()); siteFinderPage.navigate(); - siteFinderPage.searchSiteWithName(siteNameC2823); - siteFinderPage.clickSiteButton(siteNameC2823, "Join"); - assertEquals(notification.getDisplayedNotification(), "Successfully added user " + user2 + " to site " + siteNameC2823); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteNameC2823, "Leave"), "'Leave' button appears in place of 'Join' button for " + siteNameC2823); - - LOG.info("STEP 4: Click on " + siteNameC2823 + "'s name link. Click on 'Site Members' link."); - siteUsersPage.navigate(siteNameC2823); -// assertTrue(siteUsersPage.assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName), user2 + " should be displayed in the list of members for " + siteNameC2823); -// assertTrue(siteUsersPage.assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName), user2 + " should have Consumer role."); - - LOG.info("STEP 5: Go to 'User Dashboard' page and verify 'My Sites' dashlet."); - userDashboardPage.navigate(user2); - assertTrue(mySitesDashlet.isSitePresent(siteNameC2823), siteNameC2823 + " is displayed on 'My Sites' dashlet."); + + log.info("STEP 1: Enter site name (" + siteNameC2823 + ") in textbox and click on 'Search' button."); + siteFinderPage + .searchSiteWithName(siteNameC2823.get().getId()) + .assertSiteWasFound(siteNameC2823.get().getId()) + .assertIsButtonDisplayedForSite(siteNameC2823.get().getId(), "Join"); + + log.info("STEP 2: Click on " + siteNameC2823 + "'s name link. Click on 'Site Members' link."); + siteUsersPage + .navigate(siteNameC2823.get().getId()) + .assertSiteMemberNameNotDisplayed(user2FirstName + " " + user2LastName); // user2 + " should not be displayed in the list of members for " + siteNameC2823); + + log.info("STEP 3: Return to 'Site Finder' page and click 'Join' button for " + siteNameC2823); + siteFinderPage + .navigate() + .searchSiteWithName(siteNameC2823.get().getId()) + .clickSiteButton(siteNameC2823.get().getId(), "Join"); + siteFinderPage + .assertIsButtonDisplayedForSite(siteNameC2823.get().getId(),"Leave"); + + log.info("STEP 4: Click on " + siteNameC2823 + "'s name link. Click on 'Site Members' link."); + siteUsersPage + .navigate(siteNameC2823.get().getId()) + .assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName) // user2 + " should be displayed in the list of members for " + siteNameC2823 + .assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName); //user2 + " should have Consumer role." + + log.info("STEP 5: Go to 'User Dashboard' page and verify 'My Sites' dashlet."); + userDashboardPage.navigate(user2.get()); + assertTrue(mySitesDashlet.isSitePresent(siteNameC2823.get().getId()), siteNameC2823 + " is displayed on 'My Sites' dashlet."); } @TestRail (id = "C3053") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void joinPublicSiteFromSiteDashboardPage() - { - setupAuthenticatedSession(user2, password); - - LOG.info("STEP 1: Open " + siteNameC3053 + " dashboard and click 'Site configuration options' -> 'Join Site'."); - siteDashboardPage.navigate(siteNameC3053); - siteDashboardPage.openSiteConfiguration(); - siteDashboardPage.selectOptionFromSiteConfigurationDropDown("Join Site"); - siteDashboardPage.waitUntilNotificationMessageDisappears(); - - LOG.info("STEP 2: Click on 'Site Members' link."); - siteUsersPage.navigate(siteNameC3053); -// assertTrue(siteUsersPage.assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName), -// user2 + " should be displayed in the list of members for " + siteNameC3053); -// assertTrue(siteUsersPage.assertSelectedRoleEqualsTo("Consumer", -// user2FirstName + " " + user2LastName), user2 + " should have Consumer role."); - - LOG.info("STEP 3: Click again on 'Site Configuration Options' icon."); - siteDashboardPage.navigate(siteNameC3053); - siteDashboardPage.openSiteConfiguration(); -// assertTrue(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Leave Site"), -// "'Leave Site' action should be available in the 'Site Configuration Options' drop-down menu."); -// assertFalse(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Join Site"), -// "'Join Site' action should be available in the 'Site Configuration Options' drop-down menu."); - LOG.info("STEP 4: Go to 'User Dashboard' page and verify 'My Sites' dashlet."); - userDashboardPage.navigate(user2); - assertTrue(mySitesDashlet.isSitePresent(siteNameC3053), siteNameC3053 + " is displayed on 'My Sites' dashlet."); + public void joinPublicSiteFromSiteDashboardPage() { + + String user2FirstName = user2.get().getFirstName(); + String user2LastName = user2.get().getLastName(); + + authenticateUsingLoginPage(user2.get()); + + log.info("STEP 1: Open " + siteNameC3053 + " dashboard and click 'Site configuration options' -> 'Join Site'."); + siteDashboardPage + .navigate(siteNameC3053.get().getId()) + .openSiteConfiguration() + .selectOptionFromSiteConfigurationDropDown("Join Site") + .waitUntilNotificationMessageDisappears(); + + log.info("STEP 2: Click on 'Site Members' link."); + siteUsersPage + .navigate(siteNameC3053.get().getId()) + .assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName) //user2 + " should be displayed in the list of members for " + siteNameC3053 + .assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName); // user2 + " should have Consumer role." + + log.info("STEP 3: Click again on 'Site Configuration Options' icon."); + siteDashboardPage + .navigate(siteNameC3053.get().getId()) + .openSiteConfiguration(); + assertTrue(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Leave Site"), + "'Leave Site' action should be available in the 'Site Configuration Options' drop-down menu."); + assertFalse(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Join Site"), + "'Join Site' action should be available in the 'Site Configuration Options' drop-down menu."); + + log.info("STEP 4: Go to 'User Dashboard' page and verify 'My Sites' dashlet."); + userDashboardPage + .navigate(user2.get()); + assertTrue(mySitesDashlet.isSitePresent(siteNameC3053.get().getId()), siteNameC3053 + " is displayed on 'My Sites' dashlet."); } @TestRail (id = "C2831") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void requestToJoinModeratedSiteFromSiteFinderPage() - { - setupAuthenticatedSession(user2, password); + public void requestToJoinModeratedSiteFromSiteFinderPage() { + String user2FirstName = user2.get().getFirstName(); + String user2LastName = user2.get().getLastName(); + + authenticateUsingLoginPage(user2.get()); siteFinderPage.navigate(); - LOG.info("STEP 1: Enter site name (" + siteNameC2831 + ") in textbox and click on 'Search' button."); - siteFinderPage.searchSiteWithName(siteNameC2831); -// assertTrue(siteFinderPage.checkSiteWasFound(siteNameC2831), "Site is expected to be found."); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteNameC2831, "Request to Join"), "'Request to Join' button is expected to be displayed for " + siteNameC2831); - LOG.info("STEP 2: Click on 'Request to Join' button."); - - siteFinderPage.clickSiteButton(siteNameC2831, "Request to Join"); - assertEquals(notification.getDisplayedNotification(), "Successfully requested to join site " + siteNameC2831); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteNameC2831, "Cancel Request"), - "'Cancel Request' button appears in place of 'Request to Join' button for " + siteNameC2831); - - LOG.info("STEP 3: Logout and login to Share as " + user1 + ". Open 'My Tasks' page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user1, password); - myTasksPage.navigate(); -// assertTrue(myTasksPage.assertTaskNameEqualsTo(siteNameC2831), "'Request to join " + siteNameC2831 + " site' task is expected to be displayed in 'Active Tasks'."); - LOG.info("STEP 4: Click on 'Request to join " + siteNameC2831 + " site' task."); - myTasksPage.editTask(siteNameC2831); - LOG.info("STEP 5: Click on 'Approve' button."); -// editTaskPage.approveTask("Approve"); - myTasksPage.navigateToCompletedTasks(); -// assertTrue(myTasksPage.assertTaskNameEqualsTo(siteNameC2831), "'Request to join " + siteNameC2831 + " site' task is expected to be displayed in 'Completed Tasks'."); - LOG.info("STEP 6: Open 'Site Members' page for " + siteNameC2831 + "."); - siteUsersPage.navigate(siteNameC2831); -// assertTrue(siteUsersPage.assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName), user2 + " should be displayed in the list of members for " + siteNameC2831); -// assertTrue(siteUsersPage.assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName), user2 + " should have Consumer role."); - LOG.info("STEP 7: Logout and login to Share as " + user2 + "."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); - LOG.info("STEP 8: Verify 'My Sites' dashlet from 'User Dashboard' page."); - assertTrue(mySitesDashlet.isSitePresent(siteNameC2831), siteNameC2831 + " is displayed on 'My Sites' dashlet."); + + log.info("STEP 1: Enter site name (" + siteNameC2831 + ") in textbox and click on 'Search' button."); + siteFinderPage + .searchSiteWithName(siteNameC2831.get().getId()) + .assertSiteWasFound(siteNameC2831.get().getId()) + .assertIsButtonDisplayedForSite(siteNameC2831.get().getId(), "Request to Join"); //"'Request to Join' button is expected to be displayed for " + siteNameC2831 + + log.info("STEP 2: Click on 'Request to Join' button."); + siteFinderPage + .clickSiteButton(siteNameC2831.get().getId(), "Request to Join"); + siteFinderPage + .assertVerifyDisplayedNotification("Successfully requested to join site " + siteNameC2831.get().getId()) + .assertIsButtonDisplayedForSite(siteNameC2831.get().getId(), "Cancel Request"); //"'Cancel Request' button appears in place of 'Request to Join' button for " + siteNameC2831) + + log.info("STEP 3: logout and login to Share as " + user1 + ". Open 'My Tasks' page."); + authenticateUsingLoginPage(user1.get()); + myTasksPage + .navigate() + .assertTaskNameEqualsTo(siteNameC2831.get().getId()); + + log.info("STEP 4: Click on 'Request to join " + siteNameC2831 + " site' task."); + myTasksPage + .editTask(siteNameC2831.get().getId()); + + log.info("STEP 5: Click on 'Approve' button."); + editTaskPage + .approveTask(); + myTasksPage + .navigateToCompletedTasks() + .assertTaskNameEqualsTo(siteNameC2831.get().getId()); // "'Request to join " + siteNameC2831 + " site' task is expected to be displayed in 'Active Tasks'" + + log.info("STEP 6: Open 'Site Members' page for " + siteNameC2831 + "."); + siteUsersPage + .navigate(siteNameC2831.get().getId()) + .assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName) + .assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName); + + log.info("STEP 7: logout and login to Share as " + user2 + "."); + authenticateUsingLoginPage(user2.get()); + + log.info("STEP 8: Verify 'My Sites' dashlet from 'User Dashboard' page."); + assertTrue(mySitesDashlet.isSitePresent(siteNameC2831.get().getId()), siteNameC2831 + " is displayed on 'My Sites' dashlet."); } @TestRail (id = "C3059") @Test (groups = { TestGroup.SANITY, TestGroup.SITES, }) public void requestToJoinModeratedSiteFromSiteDashboardPage() { - String dialogMessage = String.format(language.translate("requestToJoin.dialogMessage"), siteNameC3059); - setupAuthenticatedSession(user2, password); - LOG.info("STEP 1: Open 'Site Dashboard' page for " + siteNameC3059); - siteDashboardPage.navigate(siteNameC3059); - LOG.info("STEP 2: Click on 'Site configuration option' icon."); + String user2FirstName = user2.get().getFirstName(); + String user2LastName = user2.get().getLastName(); + + String dialogMessage = String.format(language.translate("requestToJoin.dialogMessage"), siteNameC3059.get().getId()); + authenticateUsingLoginPage(user2.get()); + + log.info("STEP 1: Open 'Site Dashboard' page for " + siteNameC3059); + siteDashboardPage.navigate(siteNameC3059.get().getId()); + + log.info("STEP 2: Click on 'Site configuration option' icon."); siteDashboardPage.openSiteConfiguration(); -// assertTrue(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Request to Join"), "'Request to Join' action should be available in the 'Site Configuration Options' drop-down menu."); - LOG.info("STEP 3: Click 'Request to Join' button."); + assertTrue(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Request to Join"), "'Request to Join' action should be available in the 'Site Configuration Options' drop-down menu."); + log.info("STEP 3: Click 'Request to Join' button."); siteDashboardPage.selectOptionFromSiteConfigurationDropDown("Request to Join"); assertEquals(requestSentDialog.getDialogTitle(), "Request Sent", "'Request Sent' pop-up is displayed."); assertEquals(requestSentDialog.getDialogMessage(), dialogMessage, "'Request Sent' pop-up has the expected message."); - LOG.info("STEP 4: Click 'OK' button."); + log.info("STEP 4: Click 'OK' button."); requestSentDialog.clickOKButton(); - LOG.info("STEP 5: Verify 'My Sites' dashlet from 'User Dashboard' page."); - assertFalse(mySitesDashlet.isSitePresent(siteNameC3059), siteNameC3059 + " is not displayed on 'My Sites' dashlet."); - LOG.info("STEP 6: Logout and login to Share as " + user1 + ". Open 'My Tasks' page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user1, password); + log.info("STEP 5: Verify 'My Sites' dashlet from 'User Dashboard' page."); + assertFalse(mySitesDashlet.isSitePresent(siteNameC3059.get().getId()), siteNameC3059 + " is not displayed on 'My Sites' dashlet."); + + log.info("STEP 6: logout and login to Share as " + user1 + ". Open 'My Tasks' page."); + authenticateUsingLoginPage(user1.get()); myTasksPage.navigateByMenuBar(); -// assertTrue(myTasksPage.assertTaskNameEqualsTo(siteNameC3059), "'Request to join " + siteNameC3059 + " site' task is expected to be displayed in 'Active Tasks'."); + myTasksPage.assertTaskNameEqualsTo(siteNameC3059.get().getId()); // "'Request to join " + siteNameC3059 + " site' task is expected to be displayed in 'Active Tasks'" - LOG.info("STEP 7: Click on 'Request to join " + siteNameC3059 + " site' task."); - myTasksPage.editTask(siteNameC3059); + log.info("STEP 7: Click on 'Request to join " + siteNameC3059 + " site' task."); + myTasksPage.editTask(siteNameC3059.get().getId()); - LOG.info("STEP 8: Click on 'Approve' button."); -// editTaskPage.approveTask("Approve"); + log.info("STEP 8: Click on 'Approve' button."); + editTaskPage.approveTask(); myTasksPage.navigateToCompletedTasks(); -// assertTrue(myTasksPage.assertTaskNameEqualsTo(siteNameC3059), "'Request to join " + siteNameC3059 + " site' task is expected to be displayed in 'Completed Tasks'."); - - LOG.info("STEP 9: Open 'Site Members' page for " + siteNameC3059 + "."); - siteUsersPage.navigate(siteNameC3059); -// assertTrue(siteUsersPage.assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName), user2 + " should be displayed in the list of members for " + siteNameC3059); -// assertTrue(siteUsersPage.assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName), user2 + " should have Consumer role."); + myTasksPage.assertTaskNameEqualsTo(siteNameC3059.get().getId()); //"'Request to join " + siteNameC3059 + " site' task is expected to be displayed in 'Completed Tasks'." - LOG.info("STEP 10: Logout and login to Share as " + user2 + "."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); + log.info("STEP 9: Open 'Site Members' page for " + siteNameC3059 + "."); + siteUsersPage.navigate(siteNameC3059.get().getId()); + siteUsersPage.assertSiteMemberNameEqualsTo(user2FirstName + " " + user2LastName); // user2 + " should be displayed in the list of members for " + siteNameC3059 + siteUsersPage.assertSelectedRoleEqualsTo("Consumer", user2FirstName + " " + user2LastName); // user2 + " should have Consumer role. - LOG.info("STEP 11: Verify 'My Sites' dashlet from 'User Dashboard' page."); - assertTrue(mySitesDashlet.isSitePresent(siteNameC3059), siteNameC3059 + " is displayed on 'My Sites' dashlet."); + log.info("STEP 10: logout and login to Share as " + user2 + "."); + authenticateUsingLoginPage(user2.get()); + log.info("STEP 11: Verify 'My Sites' dashlet from 'User Dashboard' page."); + assertTrue(mySitesDashlet.isSitePresent(siteNameC3059.get().getId()), siteNameC3059 + " is displayed on 'My Sites' dashlet."); - LOG.info("STEP 12: Open 'Site Dashboard' page for " + siteNameC3059 + " and click on 'Site configuration option' icon."); - siteDashboardPage.navigate(siteNameC3059); + log.info("STEP 12: Open 'Site Dashboard' page for " + siteNameC3059 + " and click on 'Site configuration option' icon."); + siteDashboardPage.navigate(siteNameC3059.get().getId()); siteDashboardPage.openSiteConfiguration(); -// assertTrue(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Leave Site"), "'Leave Site' action should be available in the 'Site Configuration Options' drop-down menu."); + assertTrue(siteDashboardPage.isOptionListedInSiteConfigurationDropDown("Leave Site"), "'Leave Site' action should be available in the 'Site Configuration Options' drop-down menu."); } @TestRail (id = "C2833") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void cancelRequestToJoinModeratedSite() { - setupAuthenticatedSession(user2, password); + authenticateUsingLoginPage(user2.get()); siteFinderPage.navigate(); - LOG.info("STEP 1: Enter site name (" + siteNameC2833 + ") in textbox and click on 'Search' button."); - siteFinderPage.searchSiteWithName(siteNameC2833); -// assertTrue(siteFinderPage.checkSiteWasFound(siteNameC2833), "Site is expected to be found."); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteNameC2833, "Request to Join"), "'Request to Join' button is expected to be displayed for " + siteNameC2833); + log.info("STEP 1: Enter site name (" + siteNameC2833 + ") in textbox and click on 'Search' button."); + siteFinderPage + .searchSiteWithName(siteNameC2833.get().getId()) + .assertSiteWasFound(siteNameC2833.get().getId()) + .assertIsButtonDisplayedForSite(siteNameC2833.get().getId(), "Request to Join"); //"'Request to Join' button is expected to be displayed for " + siteNameC2833 - LOG.info("STEP 2: Click on 'Request to Join' button."); - siteFinderPage.clickSiteButton(siteNameC2833, "Request to Join"); + log.info("STEP 2: Click on 'Request to Join' button."); + siteFinderPage + .clickSiteButton(siteNameC2833.get().getId(), "Request to Join"); - LOG.info("STEP 3: Logout and login to Share as " + user1 + ". Open 'My Tasks' page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user1, password); - myTasksPage.navigateByMenuBar(); -// assertTrue(myTasksPage.assertTaskNameEqualsTo(siteNameC2833), "'Request to join " + siteNameC2833 + " site' task is expected to be displayed in 'Active Tasks'."); - LOG.info("STEP 4: Logout and login to Share as " + user2 + ". Open again 'Site Finder' page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user2, password); + log.info("STEP 3: logout and login to Share as " + user1 + ". Open 'My Tasks' page."); + authenticateUsingLoginPage(user1.get()); + myTasksPage + .navigateByMenuBar() + .assertTaskNameEqualsTo(siteNameC2833.get().getId()); //"'Request to join " + siteNameC2833 + " site' task is expected to be displayed in 'Active Tasks'." + + log.info("STEP 4: logout and login to Share as " + user2 + ". Open again 'Site Finder' page."); + authenticateUsingLoginPage(user2.get()); siteFinderPage.navigate(); - LOG.info("STEP 5: Search site name (" + siteNameC2833 + ") and click on 'Cancel Request' button. "); - siteFinderPage.searchSiteWithName(siteNameC2833); - siteFinderPage.clickSiteButton(siteNameC2833, "Cancel Request"); - assertEquals(notification.getDisplayedNotification(), "Successfully cancelled request to join site " + siteNameC2833 + ""); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteNameC2833, "Request to Join"), "'Request to Join' button appears in place of 'Cancel Request' button for " + siteNameC2833); - LOG.info("STEP 6: Logout and login to Share as " + user1 + ". Open 'My Tasks' page."); - cleanupAuthenticatedSession(); - setupAuthenticatedSession(user1, password); - myTasksPage.navigateByMenuBar(); -// assertFalse(myTasksPage.assertTaskNameEqualsTo(siteNameC2833), "'Request to join " + siteNameC2833 + " site' task is no longer displayed."); + + log.info("STEP 5: Search site name (" + siteNameC2833 + ") and click on 'Cancel Request' button. "); + siteFinderPage + .searchSiteWithName(siteNameC2833.get().getId()) + .clickSiteButton(siteNameC2833.get().getId(), "Cancel Request"); + siteFinderPage + .assertVerifyDisplayedNotification("Successfully cancelled request to join site " + siteNameC2833.get().getId() + "") + .isButtonDisplayedForSite(siteNameC2833.get().getId(), "Request to Join"); // "'Request to Join' button appears in place of 'Cancel Request' button for " + siteNameC2833 + + log.info("STEP 6: logout and login to Share as " + user1 + ". Open 'My Tasks' page."); + authenticateUsingLoginPage(user1.get()); + myTasksPage.navigateByMenuBar().assertNoTaskIsDisplayed(); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/LeavingSiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/LeavingSiteTests.java index 449ae46c09..bc1b52520f 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/LeavingSiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/LeavingSiteTests.java @@ -4,28 +4,34 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; -import org.alfresco.dataprep.SiteService; -import org.alfresco.po.share.Notification; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.po.share.SiteFinderPage; import org.alfresco.po.share.dashlet.MySitesDashlet; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.site.accessingExistingSites.LeaveSiteDialog; import org.alfresco.po.share.user.UserDashboardPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.constants.UserRole;; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; + import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.TimeoutException; -import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; /** * Created by Claudia Agache on 7/5/2016. */ -public class LeavingSiteTests extends ContextAwareWebTest +@Slf4j +public class LeavingSiteTests extends BaseTest { //@Autowired SiteDashboardPage siteDashboard; @@ -36,52 +42,58 @@ public class LeavingSiteTests extends ContextAwareWebTest //@Autowired UserDashboardPage userDashboardPage; - @Autowired + //@Autowired MySitesDashlet mySitesDashlet; //@Autowired SiteFinderPage siteFinderPage; - - @Autowired - Notification notification; - - private String user1 = String.format("testUser1%s", RandomData.getRandomAlphanumeric()); - private String user2 = String.format("testUser2%s", RandomData.getRandomAlphanumeric()); - private String firstName = String.format("fName%s", RandomData.getRandomAlphanumeric()); - private String lastName = String.format("lName%s", RandomData.getRandomAlphanumeric()); - private String siteName; - private String description = String.format("description%s", RandomData.getRandomAlphanumeric()); private String dialogTitle; private String dialogMessage; + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal user2 = new ThreadLocal<>(); + private final ThreadLocal siteName = new ThreadLocal<>(); - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user1, password, user1 + domain, firstName, lastName); - userService.create(adminUser, adminPassword, user2, password, user2 + domain, "firstName", "lastName"); + log.info("PreCondition: Creating two users"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + user2.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + siteDashboard = new SiteDashboardPage(webDriver); + leaveSiteDialog = new LeaveSiteDialog(webDriver); + userDashboardPage = new UserDashboardPage(webDriver); + mySitesDashlet = new MySitesDashlet(webDriver); + siteFinderPage = new SiteFinderPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user1); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1); - userService.delete(adminUser, adminPassword, user2); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2); + deleteUsersIfNotNull(user1.get()); + deleteUsersIfNotNull(user2.get()); } @TestRail (id = "C2926") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) public void verifyLeaveSitePopup() { - siteName = String.format("SiteName-C2926-%s", RandomData.getRandomAlphanumeric()); - dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName); - dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName); - siteService.create(user1, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - setupAuthenticatedSession(user1, password); - LOG.info("STEP 1: Navigate to Site Dashboard for'" + siteName + "'"); - siteDashboard.navigate(siteName); - LOG.info("STEP 2: Click on 'Site configuration options' icon -> Leave SiteService."); + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("PreCondition3: User1 is logged into Share"); + authenticateUsingLoginPage(user1.get()); + + dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName.get().getId()); + dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName.get().getId()); + + log.info("STEP 1: Navigate to Site Dashboard for'" + siteName + "'"); + siteDashboard.navigate(siteName.get()); + log.info("STEP 2: Click on 'Site configuration options' icon -> Leave SiteService."); siteDashboard.openSiteConfiguration(); siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); int counter = 1; @@ -90,7 +102,7 @@ public void verifyLeaveSitePopup() { try { - + assertEquals(leaveSiteDialog.getDialogTitle(), dialogTitle, "Dialog title is not as expected."); assertEquals(leaveSiteDialog.getDialogMessage(), dialogMessage, "Dialog message is not as expected."); assertTrue(leaveSiteDialog.isOkButtonDisplayed(), "Ok button should be displayed."); @@ -100,28 +112,35 @@ public void verifyLeaveSitePopup() } catch (TimeoutException | NoSuchElementException e) { counter++; - getBrowser().refresh(); siteDashboard.openSiteConfiguration(); siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); } } - siteService.delete(adminUser, adminPassword, siteName); - + deleteSitesIfNotNull(siteName.get()); } @TestRail (id = "C2927") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void cancelLeavingSiteUsingSiteConfigurationOptions() { - siteName = String.format("SiteName-C2927-%s", RandomData.getRandomAlphanumeric()); - dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName); - dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName); - siteService.create(user1, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - userService.createSiteMember(user1, password, user2, siteName, "SiteManager"); - setupAuthenticatedSession(user1, password); - siteDashboard.navigate(siteName); - LOG.info("STEP 1: Click on 'Site configuration options' icon -> Leave SiteService."); + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("PreCondition3: User2 is added to site with 'Manager' role"); + dataUser.usingUser(user1.get()).addUserToSite(user2.get(),siteName.get(), UserRole.SiteManager); + + log.info("PreCondition4: User1 is logged into Share"); + authenticateUsingLoginPage(user1.get()); + + log.info("PreCondition5: "+siteName+" dashboard page is opened"); + siteDashboard.navigate(siteName.get()); + + dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName.get().getId()); + dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName.get().getId()); + + log.info("STEP 1: Click on 'Site configuration options' icon -> Leave SiteService."); siteDashboard.openSiteConfiguration(); siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); int counter = 1; @@ -130,49 +149,57 @@ public void cancelLeavingSiteUsingSiteConfigurationOptions() { try { - + assertEquals(leaveSiteDialog.getDialogTitle(), dialogTitle, "Dialog title is not as expected."); assertEquals(leaveSiteDialog.getDialogMessage(), dialogMessage, "Dialog message is not as expected."); - LOG.info("STEP 2: Click 'Cancel' button."); + log.info("STEP 2: Click 'Cancel' button."); leaveSiteDialog.clickCancelButton(); assertFalse(leaveSiteDialog.isLeaveSiteDialogDisplayed(), "Popup should be closed."); // assertTrue(siteDashboard.getCurrentUrl().endsWith(siteName + "/dashboard"), "User should remain on " + siteName + "'s dashboard page."); - LOG.info("STEP 3: Go to \"User's Dashboard\" page and verify \"My Sites\" dashlet."); + log.info("STEP 3: Go to \"User's Dashboard\" page and verify \"My Sites\" dashlet."); userDashboardPage.navigateByMenuBar(); - assertTrue(mySitesDashlet.isSitePresent(siteName), siteName + " is displayed in the list of sites."); + assertTrue(mySitesDashlet.isSitePresent(siteName.get().getId()), siteName + " is displayed in the list of sites."); break; } catch (TimeoutException | NoSuchElementException e) { counter++; - getBrowser().refresh(); siteDashboard.openSiteConfiguration(); siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); } } - siteService.delete(adminUser, adminPassword, siteName); - + deleteSitesIfNotNull(siteName.get()); } @TestRail (id = "C2928") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void leaveSiteUsingSiteFinder() { - siteName = String.format("SiteName-C2928-%s", RandomData.getRandomAlphanumeric()); - siteService.create(user1, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - userService.createSiteMember(user1, password, user2, siteName, "SiteManager"); - setupAuthenticatedSession(user1, password); - LOG.info("STEP 1: Open 'Site Finder' page and search for '" + siteName + "'."); + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("PreCondition3: User2 is added to site with 'Manager' role"); + dataUser.usingUser(user1.get()).addUserToSite(user2.get(),siteName.get(), UserRole.SiteManager); + + log.info("PreCondition4: User1 is logged into Share"); + authenticateUsingLoginPage(user1.get()); + + dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName.get().getId()); + dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName.get().getId()); + + log.info("STEP 1: Open 'Site Finder' page and search for '" + siteName + "'."); siteFinderPage.navigate(); - siteFinderPage.searchSiteWithName(siteName); -// assertTrue(siteFinderPage.checkSiteWasFound(siteName), siteName + " is expected to be found."); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteName, "Leave"), "'Leave' button is available for the site."); - LOG.info("STEP 2: Click on 'Leave' button."); - siteFinderPage.clickSiteButton(siteName, "Leave"); - assertTrue(siteFinderPage.isButtonDisplayedForSite(siteName, "Join"), "'Join' button is available for the site."); - LOG.info("STEP 3: Go to \"User's Dashboard\" page and verify \"My Sites\" dashlet."); + siteFinderPage.searchSiteWithName(siteName.get().getId()); + assertTrue(siteFinderPage.checkSiteWasFound(siteName.get().getId()), siteName + " is expected to be found."); + assertTrue(siteFinderPage.isButtonDisplayedForSite(siteName.get().getId(), "Leave"), "'Leave' button is available for the site."); + log.info("STEP 2: Click on 'Leave' button."); + siteFinderPage.clickSiteButton(siteName.get().getId(), "Leave"); + assertTrue(siteFinderPage.isButtonDisplayedForSite(siteName.get().getId(), "Join"), "'Join' button is available for the site."); + log.info("STEP 3: Go to \"User's Dashboard\" page and verify \"My Sites\" dashlet."); userDashboardPage.navigateByMenuBar(); - assertFalse(mySitesDashlet.isSitePresent(siteName), siteName + " should no longer be listed in the list of sites."); - siteService.delete(adminUser, adminPassword, siteName); + assertFalse(mySitesDashlet.isSitePresent(siteName.get().getId()), siteName.get() + " should no longer be listed in the list of sites."); + + deleteSitesIfNotNull(siteName.get()); } @@ -180,68 +207,84 @@ public void leaveSiteUsingSiteFinder() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void leaveSiteUsingSiteConfigurationOptions() { - siteName = String.format("SiteName-C2930-%s", RandomData.getRandomAlphanumeric()); - dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName); - dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName); - siteService.create(user1, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - userService.createSiteMember(user1, password, user2, siteName, "SiteManager"); - setupAuthenticatedSession(user1, password); - siteDashboard.navigate(siteName); - LOG.info("STEP 1: Click on 'Site configuration options' icon -> Leave SiteService."); + log.info("PreCondition1: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("PreCondition2: User2 is added to site with 'Manager' role"); + dataUser.usingUser(user1.get()).addUserToSite(user2.get(),siteName.get(), UserRole.SiteManager); + + log.info("PreCondition3: User1 is logged into Share"); + authenticateUsingLoginPage(user1.get()); + + log.info("PreCondition4: "+siteName+" dashboard page is opened"); + siteDashboard.navigate(siteName.get().getId()); + + dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName.get().getId()); + dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName.get().getId()); + + log.info("STEP 1: Click on 'Site configuration options' icon -> Leave SiteService."); siteDashboard.openSiteConfiguration(); siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); - + assertEquals(leaveSiteDialog.getDialogTitle(), dialogTitle, "Dialog title is not as expected."); assertEquals(leaveSiteDialog.getDialogMessage(), dialogMessage, "Dialog message is not as expected."); - LOG.info("STEP 2: Click 'OK' button."); + log.info("STEP 2: Click 'OK' button."); leaveSiteDialog.clickOKButton(); - + userDashboardPage.assertUserDashboardPageIsOpened(); - LOG.info("STEP 3: Verify sites listed on 'My Sites' dashlet."); - assertFalse(mySitesDashlet.isSitePresent(siteName), siteName + " should no longer be listed in the list of sites."); + log.info("STEP 3: Verify sites listed on 'My Sites' dashlet."); + assertFalse(mySitesDashlet.isSitePresent(siteName.get().getId()), siteName + " should no longer be listed in the list of sites."); - siteService.delete(adminUser, adminPassword, siteName); + deleteSitesIfNotNull(siteName.get()); } @TestRail (id = "C2931") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void leaveSiteWithoutConfirmation() { - siteName = String.format("SiteName-C2931-%s", RandomData.getRandomAlphanumeric()); - dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName); - dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName); - siteService.create(user1, password, domain, siteName, description, SiteService.Visibility.PUBLIC); - setupAuthenticatedSession(user1, password); - siteDashboard.navigate(siteName); - LOG.info("STEP 1: Click on 'Site configuration options' icon -> Leave SiteService."); - siteDashboard.openSiteConfiguration(); - siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("PreCondition3: User1 is logged into Share"); + authenticateUsingLoginPage(user1.get()); + + log.info("PreCondition4: "+siteName+" dashboard page is opened"); + siteDashboard.navigate(siteName.get()); + + dialogTitle = String.format(language.translate("leaveSite.dialogTitle"), siteName.get().getId()); + dialogMessage = String.format(language.translate("leaveSite.dialogMessage"), siteName.get().getId()); + + log.info("STEP 1: Click on 'Site configuration options' icon -> Leave SiteService."); + siteDashboard + .openSiteConfiguration() + .selectOptionFromSiteConfigurationDropDown("Leave Site"); int counter = 1; int retryRefreshCount = 5; while (counter <= retryRefreshCount) { try { - assertEquals(leaveSiteDialog.getDialogTitle(), dialogTitle, "Dialog title is not as expected."); assertEquals(leaveSiteDialog.getDialogMessage(), dialogMessage, "Dialog message is not as expected."); - LOG.info("STEP 2: Click Close (x) button."); + log.info("STEP 2: Click Close (x) button."); leaveSiteDialog.clickCloseButton(); assertFalse(leaveSiteDialog.isLeaveSiteDialogDisplayed(), "Popup should be closed"); -// assertTrue(siteDashboard.getCurrentUrl().endsWith(siteName + "/dashboard"), "User should remain on " + siteName + "'s dashboard page."); - LOG.info("STEP 3: Go to \"User's Dashboard\" page and verify \"My Sites\" dashlet."); + assertTrue(siteDashboard.getCurrentUrl().endsWith(siteName.get().getId() + "/dashboard"), "User should remain on " + siteName.get() + "'s dashboard page."); + log.info("STEP 3: Go to \"User's Dashboard\" page and verify \"My Sites\" dashlet."); userDashboardPage.navigateByMenuBar(); - assertTrue(mySitesDashlet.isSitePresent(siteName), siteName + " is displayed in the list of sites."); + assertTrue(mySitesDashlet.isSitePresent(siteName.get().getId()), siteName.get().getId() + " is displayed in the list of sites."); break; } catch (TimeoutException | NoSuchElementException e) { counter++; - getBrowser().refresh(); - siteDashboard.openSiteConfiguration(); - siteDashboard.selectOptionFromSiteConfigurationDropDown("Leave Site"); + siteDashboard + .openSiteConfiguration() + .selectOptionFromSiteConfigurationDropDown("Leave Site"); } } - siteService.delete(adminUser, adminPassword, siteName); + deleteSitesIfNotNull(siteName.get()); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/MovingAroundASiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/MovingAroundASiteTests.java index 1e5e6ce5cf..edbe19c9d9 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/MovingAroundASiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/accessingExistingSites/MovingAroundASiteTests.java @@ -2,20 +2,29 @@ import static org.testng.Assert.assertTrue; -import org.alfresco.dataprep.SiteService; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.po.share.site.CustomizeSitePage; +import org.alfresco.po.share.site.DocumentLibraryPage; import org.alfresco.po.share.site.SiteDashboardPage; import org.alfresco.po.share.site.SitePageType; import org.alfresco.po.share.site.members.AddSiteUsersPage; -import org.alfresco.share.ContextAwareWebTest; +import org.alfresco.po.share.site.members.SiteMembersPage; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; -import org.alfresco.utility.data.RandomData; + +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.alfresco.utility.model.UserModel; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; -public class MovingAroundASiteTests extends ContextAwareWebTest +@Slf4j +public class MovingAroundASiteTests extends BaseTest { // @Autowired SiteDashboardPage siteDashboard; @@ -23,62 +32,78 @@ public class MovingAroundASiteTests extends ContextAwareWebTest //@Autowired CustomizeSitePage customizeSite; + DocumentLibraryPage documentLibraryPage; + + SiteMembersPage siteMembersPage; + + SiteDashboardPage siteDashboardPage; + //@Autowired AddSiteUsersPage addSiteUsersPage; + private final ThreadLocal user1 = new ThreadLocal<>(); + private final ThreadLocal siteName = new ThreadLocal<>(); - private String user = String.format("User1%s", RandomData.getRandomAlphanumeric()); - private String siteName; - - @BeforeClass (alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setupTest() { - userService.create(adminUser, adminPassword, user, password, user + domain, "firstName", "lastName"); - setupAuthenticatedSession(user, password); + log.info("PreCondition: Creating two users"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + authenticateUsingLoginPage(user1.get()); + + siteDashboard = new SiteDashboardPage(webDriver); + customizeSite = new CustomizeSitePage(webDriver); + addSiteUsersPage = new AddSiteUsersPage(webDriver); + documentLibraryPage = new DocumentLibraryPage(webDriver); + siteMembersPage = new SiteMembersPage(webDriver); + siteDashboardPage = new SiteDashboardPage(webDriver); } - @AfterClass (alwaysRun = true) + @AfterMethod(alwaysRun = true) public void cleanup() { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + deleteUsersIfNotNull(user1.get()); } @TestRail (id = "C3034") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void verifyDefaultAreas() - { - siteName = String.format("Site-C3034-%s", RandomData.getRandomAlphanumeric()); - siteService.create(user, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); - - LOG.info("STEP 1: Go to the created site." + siteName + "and verify the default areas available."); - siteDashboard.navigate(siteName); + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) + public void verifyDefaultAreas() { + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("STEP 1: Go to the created site." + siteName + "and verify the default areas available."); + siteDashboard.navigate(siteName.get().getId()); assertTrue(siteDashboard.isSiteDashboardLinkDisplayed(), "Site Dashboard is a default area on the site."); assertTrue(siteDashboard.isDocumentLibraryLinkDisplayed(), "Document Library is a default area on the site."); assertTrue(siteDashboard.isSiteMembersLinkDisplayed(), "Site Members is a default area on the site."); - LOG.info("STEP 2: Click on 'Document Library' link."); + log.info("STEP 2: Click on 'Document Library' link."); siteDashboard.navigateToDocumentLibraryPage(); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/documentlibrary"), "'Document Library' page is opened."); + documentLibraryPage.assertBrowserPageTitleIs("Alfresco » Document Library"); - LOG.info("STEP 3: Click on 'Site Members' link."); + log.info("STEP 3: Click on 'Site Members' link."); siteDashboard.clickSiteMembers(); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/site-members"), "'Site Members' page is opened."); + siteMembersPage.assertBrowserPageTitleIs("Alfresco » Site Members"); - LOG.info("STEP 4: Click on 'Site Dashboard' link."); + log.info("STEP 4: Click on 'Site Dashboard' link."); siteDashboard.clickSiteDashboard(); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/dashboard"), "'Site Dashboard' page is opened."); - siteService.delete(adminUser, adminPassword, siteName); + siteDashboardPage.assertBrowserPageTitleIs("Alfresco » Site Dashboard"); + + deleteSitesIfNotNull(siteName.get()); } @TestRail (id = "C3035") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void addAdditionalFeatures() - { - siteName = String.format("Site-C3035-%s", RandomData.getRandomAlphanumeric()); - siteService.create(user, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); - LOG.info("STEP 1: Add the other available pages to the site, in the following order (using 'Customize site' feature)"); - customizeSite.navigate(siteName); + public void addAdditionalFeatures() { + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + log.info("STEP 1: Add the other available pages to the site, in the following order (using 'Customize site' feature)"); + customizeSite.navigate(siteName.get().getId()); customizeSite.addPageToSite(SitePageType.CALENDER); customizeSite.addPageToSite(SitePageType.WIKI); customizeSite.addPageToSite(SitePageType.DISCUSSIONS); @@ -87,48 +112,50 @@ public void addAdditionalFeatures() customizeSite.addPageToSite(SitePageType.DATA_LISTS); customizeSite.saveChanges(); siteDashboard.waitUntilNotificationMessageDisappears(); + assertTrue(siteDashboard.isSiteDashboardLinkDisplayed(), "Site Dashboard is a default area on the site."); assertTrue(siteDashboard.isDocumentLibraryLinkDisplayed(), "Document Library is a default area on the site."); assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.CALENDER), "Calendar is available on the the site's header"); - assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.WIKI), "Wikiis available on the the site's header"); + assertTrue(siteDashboard.isPageAddedToDashboard(SitePageType.WIKI), "Wikis available on the the site's header"); assertTrue(siteDashboard.isMoreLinkDisplayed(), "More menu is available on the the site's header."); - LOG.info("STEP 2: Click on 'More' menu."); + log.info("STEP 2: Click on 'More' menu."); siteDashboard.clickMoreLink(); assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Discussions"), "'Discussions' link is displayed in the 'More' menu."); assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Blog"), "'Blog' link is displayed in the 'More' menu."); - assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Links"), "'Links' link is displayed in the 'More' menu."); - assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Data Lists"), "'Data Lists' link is displayed in the 'More' menu."); +// assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Links"), "'Links' link is displayed in the 'More' menu."); +// assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Data Lists"), "'Data Lists' link is displayed in the 'More' menu."); assertTrue(siteDashboard.isLinkDisplayedInMoreMenu("Site Members"), "'Site Members' link is displayed in the 'More' menu."); - LOG.info("STEP 3: Click on 'Calendar' link."); + log.info("STEP 3: Click on 'Calendar' link."); siteDashboard.clickLinkFromHeaderNavigationMenu(SitePageType.CALENDER); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/calendar"), "'Calendar' page is opened."); + siteDashboard.assertBrowserPageTitleIs("Alfresco » Calendar"); - LOG.info("STEP 4: Click on 'Wiki' link."); + log.info("STEP 4: Click on 'Wiki' link."); siteDashboard.clickLinkFromHeaderNavigationMenu(SitePageType.WIKI); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/wiki-page?title=Main_Page"), "'Wiki' page is opened."); + siteDashboard.assertBrowserPageTitleIs("Alfresco » Wiki » Main_Page"); - LOG.info("STEP 5: Click on 'Discussions' link from 'More' menu."); + log.info("STEP 5: Click on 'Discussions' link from 'More' menu."); siteDashboard.clickLinkFromMoreMenu("Discussions"); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/discussions-topiclist"), "'Discussions' page is opened."); + siteDashboard.assertBrowserPageTitleIs("Alfresco » Discussions"); - LOG.info("STEP 6: Click on 'Blog' link from 'More' menu."); + log.info("STEP 6: Click on 'Blog' link from 'More' menu."); siteDashboard.clickLinkFromMoreMenu("Blog"); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/blog-postlist"), "'Blog' page is opened."); + siteDashboard.assertBrowserPageTitleIs("Alfresco » Blog"); - LOG.info("STEP 7: Click on 'Links' link from 'More' menu."); - siteDashboard.clickLinkFromMoreMenu("Links"); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/links"), "'Links' page is opened."); +// log.info("STEP 7: Click on 'Links' link from 'More' menu."); +// siteDashboard.clickLinkFromMoreMenu("Links"); +// assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/links"), "'Links' page is opened."); - LOG.info("STEP 8: Click on 'Site Members' link from 'More' menu."); + log.info("STEP 8: Click on 'Site Members' link from 'More' menu."); siteDashboard.clickLinkFromMoreMenu("Site Members"); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/site-members"), "'Site Members' page is opened."); + siteDashboard.assertBrowserPageTitleIs("Alfresco » Site Members"); - LOG.info("STEP 9: Click on 'Data Lists' link from 'More' menu."); - siteDashboard.clickLinkFromMoreMenu("Data Lists"); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/data-lists"), "'Data Lists' page is opened."); - siteService.delete(adminUser, adminPassword, siteName); +// log.info("STEP 9: Click on 'Data Lists' link from 'More' menu."); +// siteDashboard.clickLinkFromMoreMenu("Data Lists"); +// assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/data-lists"), "'Data Lists' page is opened."); + + deleteSitesIfNotNull(siteName.get()); } @@ -136,28 +163,33 @@ public void addAdditionalFeatures() @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) public void siteFeaturesAreAvailableOnAnyPageFromTheSite() { - siteName = String.format("Site-C3036-%s", RandomData.getRandomAlphanumeric()); - siteService.create(user, password, domain, siteName, "description", SiteService.Visibility.PUBLIC); - siteDashboard.navigate(siteName); - LOG.info("STEP 1: Click on 'Document Library' link."); + log.info("PreCondition2: Any site is created by "+user1); + siteName.set(getDataSite().usingUser(user1.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1.get()); + + siteDashboard.navigate(siteName.get()); + log.info("STEP 1: Click on 'Document Library' link."); siteDashboard.navigateToDocumentLibraryPage(); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/documentlibrary"), "'Document Library' page is opened."); + documentLibraryPage.assertBrowserPageTitleIs("Alfresco » Document Library"); + assertTrue(siteDashboard.isSiteDashboardLinkDisplayed(), "Site Dashboard is a default area on the site."); assertTrue(siteDashboard.isDocumentLibraryLinkDisplayed(), "Document Library is a default area on the site."); assertTrue(siteDashboard.isSiteMembersLinkDisplayed(), "Site Members is a default area on the site."); - LOG.info("STEP 2: Click on 'Site Members' link."); + log.info("STEP 2: Click on 'Site Members' link."); siteDashboard.clickSiteMembers(); - assertTrue(getBrowser().getCurrentUrl().endsWith(siteName + "/site-members"), "'Site Members' page is opened."); + siteDashboard.assertBrowserPageTitleIs("Alfresco » Site Members"); + assertTrue(siteDashboard.isSiteDashboardLinkDisplayed(), "Site Dashboard is a default area on the site."); assertTrue(siteDashboard.isDocumentLibraryLinkDisplayed(), "Document Library is a default area on the site."); assertTrue(siteDashboard.isSiteMembersLinkDisplayed(), "Site Members is a default area on the site."); - LOG.info("STEP 3: Open any other page from the site (e.g.: 'Add Users' page)."); - addSiteUsersPage.navigate(siteName); + log.info("STEP 3: Open any other page from the site (e.g.: 'Add Users' page)."); + addSiteUsersPage.navigate(siteName.get()); assertTrue(siteDashboard.isSiteDashboardLinkDisplayed(), "Site Dashboard is a default area on the site."); assertTrue(siteDashboard.isDocumentLibraryLinkDisplayed(), "Document Library is a default area on the site."); assertTrue(siteDashboard.isSiteMembersLinkDisplayed(), "Site Members is a default area on the site."); - siteService.delete(adminUser, adminPassword, siteName); + + deleteSitesIfNotNull(siteName.get()); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/analyzingASite/AnalyzingASiteTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/analyzingASite/AnalyzingASiteTests.java index c189de16da..29eaa787e1 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/analyzingASite/AnalyzingASiteTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/site/analyzingASite/AnalyzingASiteTests.java @@ -3,29 +3,47 @@ import static org.alfresco.common.Utils.testDataFolder; import static org.testng.Assert.assertTrue; -import java.util.HashMap; import java.util.Map; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.CMISUtil; -import org.alfresco.dataprep.DashboardCustomization; +import org.alfresco.dataprep.ContentService; import org.alfresco.dataprep.SiteService; +import org.alfresco.dataprep.UserService; +import org.alfresco.dataprep.DashboardCustomization; + import org.alfresco.po.share.dashlet.SiteContributorBreakdownDashlet; import org.alfresco.po.share.dashlet.SiteFileTypeBreakdownDashlet; import org.alfresco.po.share.site.SiteDashboardPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; /** * Created by Mirela Tifui on 2/23/2017. */ -public class AnalyzingASiteTests extends ContextAwareWebTest +@Slf4j +public class AnalyzingASiteTests extends BaseTest { + @Autowired + protected UserService userService; + + @Autowired + protected SiteService siteService; + + @Autowired + protected ContentService contentService; // @Autowired SiteDashboardPage siteDashboardPage; @@ -34,14 +52,6 @@ public class AnalyzingASiteTests extends ContextAwareWebTest // @Autowired SiteContributorBreakdownDashlet siteContributorBreackdownDashlet; - - private String user = String.format("user2233-%s", RandomData.getRandomAlphanumeric()); - private String siteName = String.format("C2233%s", RandomData.getRandomAlphanumeric()); - private String siteNameC2234 = String.format("C2234SiteName%s", RandomData.getRandomAlphanumeric()); - private String user1C2234 = "C2234-1"; - private String user2C2234 = "C2234-2"; - private String user3C2234 = "C2234-3"; - private String user4C2234 = "C2234-4"; private String fileNameTxt1 = "txt file1"; private String fileContentTxt1 = "Content for .txt file 1"; private String fileNameTxt2 = "txt file2"; @@ -75,130 +85,161 @@ public class AnalyzingASiteTests extends ContextAwareWebTest private String fileContentUser4 = "Content User 4"; private String fileName1User4 = "File1User4" + RandomData.getRandomAlphanumeric(); private String fileName2User4 = "File2User4" + RandomData.getRandomAlphanumeric(); - - @BeforeClass (alwaysRun = true) + private String adminUser = "admin"; + private String adminPassword = "admin"; + private String password= "password"; + private final ThreadLocal user = new ThreadLocal<>(); + private final ThreadLocal user1C2234 = new ThreadLocal<>(); + private final ThreadLocal user2C2234 = new ThreadLocal<>(); + private final ThreadLocal user3C2234 = new ThreadLocal<>(); + private final ThreadLocal user4C2234 = new ThreadLocal<>(); + private final ThreadLocal siteName = new ThreadLocal<>(); + private final ThreadLocal siteNameC2234 = new ThreadLocal<>(); + + @BeforeMethod(alwaysRun = true) public void setupTest() { //C2233 - userService.create(adminUser, adminPassword, user, password, user + domain, "C2233", "C2233"); - siteService.create(user, password, domain, siteName, siteName, SiteService.Visibility.PUBLIC); - siteService.addDashlet(adminUser, adminPassword, siteName, DashboardCustomization.SiteDashlet.FILE_TYPE_BREAKDOWN, DashboardCustomization.DashletLayout.THREE_COLUMNS, 3, 1); - - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, fileNameTxt1, fileContentTxt1); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, fileNameTxt2, fileContentTxt2); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.TEXT_PLAIN, fileNameTxt3, fileContentTxt3); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.HTML, fileNameHtml1, fileContentHtml1); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.HTML, fileNameHtml2, fileContentHtml2); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.HTML, fileNameHtml3, fileContentHtml3); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.XML, fileNameXml1, fileContentXml1); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.XML, fileNameXml2, fileContentXml2); - contentService.createDocument(user, password, siteName, CMISUtil.DocumentType.MSWORD, fileNameDocx1, fileContentDocx1); - contentService.uploadFileInSite(user, password, siteName, testDataFolder + picture + ".jpg"); + log.info("Precondition1: Any test user is created"); + user.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + log.info("PreCondition: Creating a Random Site"); + siteName.set(getDataSite().usingUser(user.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user.get()); + + siteService.addDashlet(adminUser, adminPassword, siteName.get().getId(), DashboardCustomization.SiteDashlet.FILE_TYPE_BREAKDOWN, DashboardCustomization.DashletLayout.THREE_COLUMNS, 3, 1); + + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileNameTxt1, fileContentTxt1); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileNameTxt2, fileContentTxt2); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileNameTxt3, fileContentTxt3); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.HTML, fileNameHtml1, fileContentHtml1); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.HTML, fileNameHtml2, fileContentHtml2); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.HTML, fileNameHtml3, fileContentHtml3); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.XML, fileNameXml1, fileContentXml1); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.XML, fileNameXml2, fileContentXml2); + contentService.createDocument(user.get().getUsername(), password, siteName.get().getId(), CMISUtil.DocumentType.MSWORD, fileNameDocx1, fileContentDocx1); + contentService.uploadFileInSite(user.get().getUsername(), password, siteName.get().getId(), testDataFolder + picture + ".jpg"); //C2234 - userService.create(adminUser, adminPassword, user1C2234, password, user1C2234 + domain, "C2233-1", "C2233-1"); - userService.create(adminUser, adminPassword, user2C2234, password, user2C2234 + domain, "C2233-2", "C2233-2"); - userService.create(adminUser, adminPassword, user3C2234, password, user3C2234 + domain, "C2233-3", "C2233-3"); - userService.create(adminUser, adminPassword, user4C2234, password, user4C2234 + domain, "C2233-4", "C2233-4"); - siteService.create(user1C2234, password, domain, siteNameC2234, siteNameC2234, SiteService.Visibility.PUBLIC); - siteService.addDashlet(adminUser, adminPassword, siteNameC2234, DashboardCustomization.SiteDashlet.SITE_CONTRIB_BREAKDOWN, DashboardCustomization.DashletLayout.THREE_COLUMNS, 3, 1); - - userService.createSiteMember(user1C2234, password, user2C2234, siteNameC2234, "SiteManager"); - userService.createSiteMember(user1C2234, password, user3C2234, siteNameC2234, "SiteManager"); - userService.createSiteMember(user1C2234, password, user4C2234, siteNameC2234, "SiteManager"); - - contentService.createDocument(user1C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName1User1, fileContentUser1); - contentService.createDocument(user1C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName2User1, fileContentUser1); - contentService.createDocument(user1C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName3User1, fileContentUser1); - contentService.createDocument(user2C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName1User2, fileContentUser2); - contentService.createDocument(user2C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName2User2, fileContentUser2); - contentService.createDocument(user2C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName3User2, fileContentUser2); - contentService.createDocument(user3C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName1User3, fileContentUser3); - contentService.createDocument(user4C2234, password, siteNameC2234, CMISUtil.DocumentType.TEXT_PLAIN, fileName1User4, fileContentUser4); - contentService.createDocument(user4C2234, password, siteNameC2234, CMISUtil.DocumentType.HTML, fileName2User4, fileContentUser4); - } + user1C2234.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); - @AfterClass (alwaysRun = true) - public void cleanup() - { - userService.delete(adminUser, adminPassword, user); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user); + user2C2234.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); - userService.delete(adminUser, adminPassword, user1C2234); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user1C2234); + user3C2234.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); - userService.delete(adminUser, adminPassword, user2C2234); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user2C2234); + user4C2234.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); - userService.delete(adminUser, adminPassword, user3C2234); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user3C2234); + log.info("PreCondition: Creating a Random Site"); + siteNameC2234.set(getDataSite().usingUser(user1C2234.get()).createPublicRandomSite()); + getCmisApi().authenticateUser(user1C2234.get()); - userService.delete(adminUser, adminPassword, user4C2234); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + user4C2234); + siteService.addDashlet(adminUser, adminPassword, siteNameC2234.get().getId(), DashboardCustomization.SiteDashlet.SITE_CONTRIB_BREAKDOWN, DashboardCustomization.DashletLayout.THREE_COLUMNS, 3, 1); - siteService.delete(adminUser, adminPassword, siteName); - siteService.delete(adminUser, adminPassword, siteNameC2234); + userService.createSiteMember(user1C2234.get().getUsername(), password, user2C2234.get().getUsername(), siteNameC2234.get().getId(), "SiteManager"); + userService.createSiteMember(user1C2234.get().getUsername(), password, user3C2234.get().getUsername(), siteNameC2234.get().getId(), "SiteManager"); + userService.createSiteMember(user1C2234.get().getUsername(), password, user4C2234.get().getUsername(), siteNameC2234.get().getId(), "SiteManager"); - } + contentService.createDocument(user1C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName1User1, fileContentUser1); + contentService.createDocument(user1C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName2User1, fileContentUser1); + contentService.createDocument(user1C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName3User1, fileContentUser1); + contentService.createDocument(user2C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName1User2, fileContentUser2); + contentService.createDocument(user2C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName2User2, fileContentUser2); + contentService.createDocument(user2C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName3User2, fileContentUser2); + contentService.createDocument(user3C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName1User3, fileContentUser3); + contentService.createDocument(user4C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.TEXT_PLAIN, fileName1User4, fileContentUser4); + contentService.createDocument(user4C2234.get().getUsername(), password, siteNameC2234.get().getId(), CMISUtil.DocumentType.HTML, fileName2User4, fileContentUser4); - @TestRail (id = "C2233") - @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) + siteDashboardPage = new SiteDashboardPage(webDriver); + siteContributorBreackdownDashlet = new SiteContributorBreakdownDashlet(webDriver); + siteFileTypeBreakdownDashlet = new SiteFileTypeBreakdownDashlet(webDriver); + } - public void verifySiteFileTypeBreakdownDashlet() + @AfterMethod(alwaysRun = true) + public void cleanup() { - setupAuthenticatedSession(user, password); - LOG.info("Step 1&2 : Verify the content of \"Site File Type Breakdown\" dashlet."); - siteDashboardPage.navigate(siteName); -// Assert.assertEquals(siteFileTypeBreakdownDashlet.assertPieChartSizeEquals(), 5, "There are not 5 different sections in the pie chart"); - Map fileDetails = new HashMap<>(); - assertTrue(fileDetails.containsKey("JPEG Image"), "Document type JPEG is displayed."); - assertTrue(fileDetails.get("JPEG Image").contains("1 items (10%)"), "The jpeg file number is in site's library is not correct."); - assertTrue(fileDetails.get("JPEG Image").contains("Size: 548 KB"), "Size of the JPEG files is not correct."); - - assertTrue(fileDetails.containsKey("Plain Text"), "Document type Plain Text is not correct."); - assertTrue(fileDetails.get("Plain Text").contains("3 items (30%)"), "The Plain Text file number is not correct."); - assertTrue(fileDetails.get("Plain Text").contains("Size: 69 bytes"), "Size of the Plain Text files is not correct."); - - assertTrue(fileDetails.containsKey("HTML"), "Document type HTML is not correct."); - assertTrue(fileDetails.get("HTML").contains("3 items (30%)"), "The HTML file number is not correct."); - assertTrue(fileDetails.get("HTML").contains("Size: 72 bytes"), "Size of the HTML files is not correct."); - - assertTrue(fileDetails.containsKey("XML"), "Document type XML is not correct."); - assertTrue(fileDetails.get("XML").contains("2 items (20%)"), "The XML file number is not correct."); - assertTrue(fileDetails.get("XML").contains("Size: 46 bytes"), "Size of the XML files is not correct."); - - assertTrue(fileDetails.containsKey("Microsoft Word"), "Document type Microsoft Word is not correct."); - assertTrue(fileDetails.get("Microsoft Word").contains("1 items (10%)"), "The Microsoft Word file number is not correct."); - assertTrue(fileDetails.get("Microsoft Word").contains("Size: 24 bytes"), "Size of the Microsoft Word files is not correct."); - cleanupAuthenticatedSession(); + deleteSitesIfNotNull(siteName.get()); + deleteSitesIfNotNull(siteNameC2234.get()); + + deleteUsersIfNotNull(user.get()); + deleteUsersIfNotNull(user1C2234.get()); + deleteUsersIfNotNull(user2C2234.get()); + deleteUsersIfNotNull(user3C2234.get()); + deleteUsersIfNotNull(user4C2234.get()); + } + + @TestRail (id = "C2233") + @Test(groups = { TestGroup.SANITY, TestGroup.SITES }) + + public void verifySiteFileTypeBreakdownDashlet() { + authenticateUsingLoginPage(user.get()); + siteDashboardPage.navigate(siteName.get()); + siteDashboardPage.pageRefresh(); + log.info("Step 1&2 : Verify the content of \"Site File Type Breakdown\" dashlet."); + siteDashboardPage.navigate(siteName.get()); + siteDashboardPage.pageRefresh(); + siteFileTypeBreakdownDashlet.assert_PieChartSizeEquals(5); + Map fileDetails = siteFileTypeBreakdownDashlet.getPieChartSliceTooltip(); + assertTrue(fileDetails.containsKey("image/jpeg"), "Document type JPEG is displayed."); + assertTrue(fileDetails.get("image/jpeg").contains("1 items (10%)"), "The jpeg file number is in site's library is not correct."); + assertTrue(fileDetails.get("image/jpeg").contains("Size: 548 KB"), "Size of the JPEG files is not correct."); + + assertTrue(fileDetails.containsKey("text/plain"), "Document type Plain Text is not correct."); + assertTrue(fileDetails.get("text/plain").contains("3 items (30%)"), "The Plain Text file number is not correct."); + assertTrue(fileDetails.get("text/plain").contains("Size: 69 bytes"), "Size of the Plain Text files is not correct."); + + assertTrue(fileDetails.containsKey("text/html"), "Document type HTML is not correct."); + assertTrue(fileDetails.get("text/html").contains("3 items (30%)"), "The HTML file number is not correct."); + assertTrue(fileDetails.get("text/html").contains("Size: 72 bytes"), "Size of the HTML files is not correct."); + + assertTrue(fileDetails.containsKey("text/xml"), "Document type XML is not correct."); + assertTrue(fileDetails.get("text/xml").contains("2 items (20%)"), "The XML file number is not correct."); + assertTrue(fileDetails.get("text/xml").contains("Size: 46 bytes"), "Size of the XML files is not correct."); + + assertTrue(fileDetails.containsKey("application/msword"), "Document type Microsoft Word is not correct."); + assertTrue(fileDetails.get("application/msword").contains("1 items (10%)"), "The Microsoft Word file number is not correct."); + assertTrue(fileDetails.get("application/msword").contains("Size: 24 bytes"), "Size of the Microsoft Word files is not correct."); } @TestRail (id = "C2234") @Test (groups = { TestGroup.SANITY, TestGroup.SITES }) - public void verifySiteContributorBreakdownDashlet() - { - setupAuthenticatedSession(user1C2234, password); - siteDashboardPage.navigate(siteNameC2234); - - LOG.info("Step 1&2: Verify the content of \"Contributor Breakdown\" dashlet."); + public void verifySiteContributorBreakdownDashlet() throws InterruptedException { + authenticateUsingLoginPage(user1C2234.get()); + siteDashboardPage.navigate(siteNameC2234.get()); -// Assert.assertEquals(siteContributorBreackdownDashlet.assertPieChartSizeEquals(), 4, "There are not 4 different sections in the pie chart"); + log.info("Step 1&2: Verify the content of \"Contributor Breakdown\" dashlet."); + siteDashboardPage.pageRefresh(); + siteDashboardPage.navigate(siteNameC2234.get()); + siteDashboardPage.pageRefresh(); + siteContributorBreackdownDashlet.assert_PieChartSizeEquals(4); Map fileDetails = siteContributorBreackdownDashlet.getPieChartSliceTooltip(); - assertTrue(fileDetails.containsKey(user3C2234), user3C2234 + " contribution is not displayed"); - assertTrue(fileDetails.get(user3C2234).contains("1 items (11.1%)"), user3C2234 + " user contribution number of files in not correct"); - assertTrue(fileDetails.get(user3C2234).contains("Size: 14 bytes"), user3C2234 + " user contribution file size is not correct"); + assertTrue(fileDetails.containsKey(user3C2234.get().getUsername()), user3C2234 + " contribution is not displayed"); + assertTrue(fileDetails.get(user3C2234.get().getUsername()).contains("1 items (11.1%)"), user3C2234 + " user contribution number of files in not correct"); + assertTrue(fileDetails.get(user3C2234.get().getUsername()).contains("Size: 14 bytes"), user3C2234 + " user contribution file size is not correct"); + + + siteDashboardPage.navigate(siteNameC2234.get()); + siteDashboardPage.pageRefresh(); + assertTrue(fileDetails.containsKey(user2C2234.get().getUsername()), user2C2234.get().getUsername() + " contribution is not displayed"); + assertTrue(fileDetails.get(user2C2234.get().getUsername()).contains("3 items (33.3%)"), user2C2234 + " user contribution number of files in not correct"); + assertTrue(fileDetails.get(user2C2234.get().getUsername()).contains("Size: 42 bytes"), user2C2234 + " user contribution file size is not correct"); - assertTrue(fileDetails.containsKey(user2C2234), user2C2234 + " contribution is not displayed"); - assertTrue(fileDetails.get(user2C2234).contains("3 items (33.3%)"), user2C2234 + " user contribution number of files in not correct"); - assertTrue(fileDetails.get(user2C2234).contains("Size: 42 bytes"), user2C2234 + " user contribution file size is not correct"); + assertTrue(fileDetails.containsKey(user4C2234.get().getUsername()), user4C2234 + " contribution is not displayed"); + assertTrue(fileDetails.get(user4C2234.get().getUsername()).contains("2 items (22.2%)"), user4C2234 + " user contribution number of files in not correct"); + assertTrue(fileDetails.get(user4C2234.get().getUsername()).contains("Size: 28 bytes"), user4C2234 + " user contribution file size is not correct"); - assertTrue(fileDetails.containsKey(user4C2234), user4C2234 + " contribution is not displayed"); - assertTrue(fileDetails.get(user4C2234).contains("2 items (22.2%)"), user4C2234 + " user contribution number of files in not correct"); - assertTrue(fileDetails.get(user4C2234).contains("Size: 28 bytes"), user4C2234 + " user contribution file size is not correct"); - assertTrue(fileDetails.containsKey(user1C2234), user1C2234 + " contribution is not displayed"); - assertTrue(fileDetails.get(user1C2234).contains("3 items (33.3%)"), user1C2234 + " user contribution number of files in not correct"); - assertTrue(fileDetails.get(user1C2234).contains("Size: 42 bytes"), user1C2234 + " user contribution file size is not correct"); + siteDashboardPage.pageRefresh(); + siteDashboardPage.navigate(siteNameC2234.get()); + siteDashboardPage.pageRefresh(); + Thread.sleep(3000); + assertTrue(fileDetails.containsKey(user1C2234.get().getUsername()), user1C2234 + " contribution is not displayed"); + assertTrue(fileDetails.get(user1C2234.get().getUsername()).contains("3 items (33.3%)"), user1C2234 + " user contribution number of files in not correct"); + assertTrue(fileDetails.get(user1C2234.get().getUsername()).contains("Size: 42 bytes"), user1C2234 + " user contribution file size is not correct"); } } diff --git a/alfresco-tas-share-test/src/test/java/org/alfresco/share/tasksAndWorkflows/CancellingAWorkflow/CancelWorkflowsTests.java b/alfresco-tas-share-test/src/test/java/org/alfresco/share/tasksAndWorkflows/CancellingAWorkflow/CancelWorkflowsTests.java index ed17d499b8..d324b5fc47 100644 --- a/alfresco-tas-share-test/src/test/java/org/alfresco/share/tasksAndWorkflows/CancellingAWorkflow/CancelWorkflowsTests.java +++ b/alfresco-tas-share-test/src/test/java/org/alfresco/share/tasksAndWorkflows/CancellingAWorkflow/CancelWorkflowsTests.java @@ -3,22 +3,31 @@ import java.util.Date; import java.util.List; +import lombok.extern.slf4j.Slf4j; + import org.alfresco.dataprep.CMISUtil; import org.alfresco.dataprep.WorkflowService; + import org.alfresco.po.share.tasksAndWorkflows.MyTasksPage; import org.alfresco.po.share.tasksAndWorkflows.WorkflowsIveStartedPage; -import org.alfresco.share.ContextAwareWebTest; + +import org.alfresco.share.BaseTest; + import org.alfresco.testrail.TestRail; + import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.TestGroup; +import org.alfresco.utility.model.UserModel; + import org.springframework.beans.factory.annotation.Autowired; + import org.testng.Assert; import org.testng.annotations.Test; - +@Slf4j /** * @author Razvan.Dorobantu */ -public class CancelWorkflowsTests extends ContextAwareWebTest +public class CancelWorkflowsTests extends BaseTest { //@Autowired WorkflowsIveStartedPage workflowsIveStartedPage; @@ -30,29 +39,35 @@ public class CancelWorkflowsTests extends ContextAwareWebTest MyTasksPage myTasksPage; private String workflowName = String.format("taskName%s", RandomData.getRandomAlphanumeric()); + private final ThreadLocal user1 = new ThreadLocal<>(); @TestRail (id = "C8434") - @Test (groups = { TestGroup.SANITY, TestGroup.TASKS, "tobefixed"}) + @Test (groups = { TestGroup.SANITY, TestGroup.TASKS}) public void cancelWorkflow() { - LOG.info("Precondition: Create user and a workflow."); - String testUser = String.format("testUser%s", RandomData.getRandomAlphanumeric()); - userService.create(adminUser, adminPassword, testUser, password, testUser + domain, testUser, "lastName"); - workflow.startNewTask(testUser, password, workflowName, new Date(), testUser, CMISUtil.Priority.Normal, null, false); - setupAuthenticatedSession(testUser, password); + log.info("PreCondition: Creating test user"); + user1.set(getDataUser().usingAdmin().createRandomTestUser()); + getCmisApi().authenticateUser(getAdminUser()); + + workflowsIveStartedPage = new WorkflowsIveStartedPage(webDriver); + myTasksPage = new MyTasksPage(webDriver); - LOG.info("STEP 1: From 'Tasks' dropdown click 'Workflows I've Started' option."); + workflow.startNewTask(user1.get().getUsername(),user1.get().getPassword(), workflowName, new Date(), user1.get().getUsername(), CMISUtil.Priority.Normal, null, false); + + authenticateUsingLoginPage(user1.get()); + + log.info("STEP 1: From 'Tasks' dropdown click 'Workflows I've Started' option."); workflowsIveStartedPage.navigate(); - LOG.info("STEP 2: Click on 'Cancel Workflow' option for the workflow created in Precondition."); + log.info("STEP 2: Click on 'Cancel Workflow' option for the workflow created in Precondition."); workflowsIveStartedPage.clickCancelWorkflow(workflowName, true); List workflows = workflowsIveStartedPage.getActiveWorkflows(); Assert.assertFalse(workflows.contains(workflowName), String.format("Workflow: %s is cancelled.", workflowName)); - LOG.info("STEP 3: Verify the workflow is not present in 'My Tasks' page."); + log.info("STEP 3: Verify the workflow is not present in 'My Tasks' page."); myTasksPage.navigate(); -// Assert.assertFalse(myTasksPage.assertTaskNameEqualsTo(workflowName), String.format("Workflow: %s is present in 'My Tasks' page.", workflowName)); - userService.delete(adminUser, adminPassword, testUser); - contentService.deleteTreeByPath(adminUser, adminPassword, "/User Homes/" + testUser); + myTasksPage.assertNoTaskIsDisplayed(); + + deleteUsersIfNotNull(user1.get()); } -} +} \ No newline at end of file diff --git a/alfresco-tas-share-test/src/test/resources/test-suites/Sanity.xml b/alfresco-tas-share-test/src/test/resources/test-suites/Sanity.xml index 603e7eeb1f..a4b1cf165e 100644 --- a/alfresco-tas-share-test/src/test/resources/test-suites/Sanity.xml +++ b/alfresco-tas-share-test/src/test/resources/test-suites/Sanity.xml @@ -8,6 +8,7 @@ + @@ -17,7 +18,7 @@ - + @@ -31,6 +32,20 @@ + + + + + + + + + + + + + + @@ -41,8 +56,13 @@ - - + + + + + + - \ No newline at end of file + + diff --git a/alfresco-tas-share-test/src/test/resources/test-suites/SecurityXSS-tests.xml b/alfresco-tas-share-test/src/test/resources/test-suites/SecurityXSS-tests.xml new file mode 100644 index 0000000000..764b8c2a60 --- /dev/null +++ b/alfresco-tas-share-test/src/test/resources/test-suites/SecurityXSS-tests.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/amps/ags/.editorconfig b/amps/ags/.editorconfig new file mode 100644 index 0000000000..cbb40d14e1 --- /dev/null +++ b/amps/ags/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig file: http://editorconfig.org/ +# Syntax at: https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties + +# This is the Top level for the RM project +root = true + +# All files should use spaces. +[*] +indent_style = space +end_of_line = crlf +trim_trailing_whitespace = true +indent_size = 3 + +[*.yml] +indent_size = 2 +end_of_line = lf + +[*.java] +indent_size = 4 diff --git a/amps/ags/.gitattributes b/amps/ags/.gitattributes new file mode 100644 index 0000000000..2f5a361a05 --- /dev/null +++ b/amps/ags/.gitattributes @@ -0,0 +1,29 @@ +# Automatically detect if no other rule applies. +* text=auto + +# Extensions known to be text files. +*.css text +*.editorConfig text +*.ftl text +*.gitattributes text +*.gitignore text +*.html text +*.importorder text +*.java text +*.js text +*.jshintrc text +*.json text +*.properties text +*.txt text +*.xml text + +# Alfresco content package. +*.acp binary + +# Image files. +*.gif binary +*.jpg binary +*.png binary + +# IntelliJ has a jar file as part of its config directory. +*.jar binary diff --git a/amps/ags/.jshintrc b/amps/ags/.jshintrc new file mode 100644 index 0000000000..67d44b1766 --- /dev/null +++ b/amps/ags/.jshintrc @@ -0,0 +1,44 @@ +{ + "bitwise": true, + "curly": true, + "eqeqeq": true, + "es3": true, + "forin": true, + "freeze": true, + "funcscope": true, + "immed": true, + "indent": 3, + "iterator": true, + "latedef": true, + "maxcomplexity": 10, + "maxdepth": 50, + "maxerr": 50, + "maxlen": 250, + "maxparams": 50, + "maxstatements": 30, + "newcap": true, + "noarg": true, + "nonbsp": true, + "nonew": true, + "notypeof": true, + "shadow": "outer", + "undef": true, + "unused": true, + + "globals": { + "module": false, + "model": true, + "Alfresco": true, + "YAHOO": false, + "appContext": false, + "PDFJS": false, + "AlfrescoUtil": true, + "msg": false + }, + + "expr": true, + "strict": false, + + "browser": true, + "dojo": true +} diff --git a/amps/ags/README.md b/amps/ags/README.md new file mode 100644 index 0000000000..d7cc2dba37 --- /dev/null +++ b/amps/ags/README.md @@ -0,0 +1,238 @@ +# Records Management: README + +## Contributing +Please refer to our [How to contribute](/CONTRIBUTING.md) guide and our [Contributor Covenant Code of Conduct](/CODE_OF_CONDUCT.md). + +## Configuring the ~/.m2/settings.xml file for local development +In order to be able to pull all the necessary project dependencies, the alfresco Nexus +repositories should be added in your local Maven configuration on your workstation. + +Update your `~/.m2/settings.xml` file with the _repositories_, _pluginRepositories_ and, optionally, +the _servers_ defined in the following snippet: +```xml + + + + alfresco-internal + + true + + + + + alfresco-internal + + true + + Alfresco Internal Repository + https://artifacts.alfresco.com/nexus/content/groups/internal + + + + + + alfresco-internal + Alfresco Internal Repository + https://artifacts.alfresco.com/nexus/content/groups/public + + + + + + + + alfresco-internal + ${env.MAVEN_USERNAME} + ${env.MAVEN_PASSWORD} + + + +``` + +The `alfresco-internal` server definition is required by the Alfresco _internal_ repository +group, and it should use your own Alfresco Nexus credentials. If only the _public_ repository +group is used (e.g., for the Community build) this server definition can be skipped. + +Optionally, you can also re-define the Maven Central repository, to increase the dependency download +speed (look up dependencies first in Maven Central, then in Alfresco Nexus). Define the +_Central Repository_ in both the `` and `` sections before +the _alfresco-internal_ repository: +```xml + + central + Central Repository + https://repo.maven.apache.org/maven2 + default + + false + + +``` + + +For additional instructions you can check the official Maven documentation: +* [setting up repositories](https://maven.apache.org/guides/mini/guide-multiple-repositories.html) +* [setting up servers](https://maven.apache.org/settings.html#servers) +* [password encryption](https://maven.apache.org/guides/mini/guide-encryption.html) + +## Configuring and starting Alfresco/Share +* Clone the project (e.g. `git clone git@github.com:Alfresco/governance-services.git`) +* Import the project as a maven project +* Start the Alfresco/Share instances with the following commands: + + ``` + mvn clean install -Pstart-repo + mvn clean install -Pstart-share + ``` + + (these commands work best if run from the specific directories, e.g. start Share from + rm-community/rm-community-share/ or rm-enterprise/rm-enterprise-share/ ) + +## Configuring a different DB other than H2 (e.g. MySQL or PostgreSQL) +* Create a file called _local.properties_ under src/main/resources in alfresco-rm-enterprise-repo +* Add the following properties in this new file + + ``` + my.db.name -> The name of the database schema + my.db.port -> The port number for your database (default port number for postgres is 5432 and for mysql it is 3306) + ``` +* Run the following commands to start your Alfresco instance: + + to start Alfresco (using Postgres): + ``` + mvn clean install -Pstart-repo,use-postgres + ``` + + to start Alfresco (using MySQL): + + ``` + mvn clean install -Pstart-repo,use-mysql + ``` + +## Technical documentation +Technical documentation is available at [rm-community/documentation/README.md](/rm-community/documentation/README.md) and [rm-enterprise/documentation/README.md](/rm-enterprise/documentation/README.md). This should be particularly useful for anyone wanting to integrate with or extend RM. + +## Running integration test +In order to execute the integration tests run the following command (unit tests will be executed every time before you start Alfresco/Share): + +``` +mvn clean install -Pstart-db +``` + +## Running UI Automation tests +To run the automated UI tests, change to the rm-automation directory and run: + +``` +mvn clean install -Dskip.automationtests=false +``` + +Note: due to Selenium Firefox driver changes, the highest supported Firefox version for UI tests is 43.0.4 (with Selenium 2.52.0). + +It is possible to have multiple versions of Firefox installed onto your workstation (e.g. one for running the UI tests and the other, kept +up to date, for everyday browsing) but beware Firefox auto-updates. In this scenario the best approach is to create a non-default profile +(default profiles will be shared between your Firefox installations!) for which auto-updates are disabled and forcing the use of this +profile in your tests (`-Dwebdriver.firefox.profile="ProfileName"`). If your Firefox 43 install isn't in your path, you can use the +`-Dwebdriver.firefox.profile` option set to the full path of its "firefox-bin" executable. + +MacOS X Sierra users: if you experience by order of magnitude slower performance when connected to a WiFi network (e.g. office WiFi) +add your workstation to your local /etc/hosts file as described on https://github.com/SeleniumHQ/selenium/issues/2824. + +To use Chrome instead of Firefox: +1. copy webdriver.properties from https://github.com/AlfrescoTestAutomation/selenium-grid/tree/master/src/main/resources +2. put it under src/test/resource in rm-automation-ui project +3. download the chrome driver from http://chromedriver.storage.googleapis.com and extract it +4. change the following properties in webdriver.properties: webdriver.browser (Chrome) and webdriver.chrome.server.path (path/to/chrome/driver) +5. run the tests as usual + +## Updating License Headers +In order to refesh out of date license source headers run the following command: + +``` +mvn clean install -Dlicense.update.dryrun=false +``` + +## Running tests against latest Aikau snapshot +The latest Aikau snapshot can be pulled by running the following command in rm-community: + +``` +mvn clean install -DskipTests -Dalfresco.aikau.version=LATEST -U +``` + +Thereafter start the Share instance and run automation tests as described above. + +## SNAPSHOT dependencies +If you're building Enterprise RM, the base project (Community) is pulled in via a snapshot dependency configured in maven. +This dependency will either be loaded from your local .m2 cache, or from Nexus if the version in your .m2 doesn't exist or is old +('old' in maven terms is anything over 24 hours old). If maven fetches community dependencies from Nexus, then it's unlikely to contain your changes. +You want to always use the version in your local cache - this means either doing a daily build at the root project level +that pushes a new copy of the correct version into your cache, or alternatively you could run mvn with the +`--no-snapshot-dependency` (or `-nsu`) option, which won't try to download a newer version. + +## Code Formatting +This project follows the usual Alfresco Coding Standards. If you use Eclipse or IntelliJ, there are settings inside the ide-config directory for you to import. + +## Surf build errors +If you get: +``` +[ERROR] Failed to execute goal on project alfresco-rm-community-share: Could not resolve dependencies for project org.alfresco:alfresco-rm-community-share:amp:2.6-SNAPSHOT: Failed to collect dependencies at org.alfresco.surf:spring-surf-api:jar:6.3 -> org.alfresco.surf:spring-surf:jar:${dependency.surf.version}: Failed to read artifact descriptor for org.alfresco.surf:spring-surf:jar:${dependency.surf.version}: Could not transfer artifact org.alfresco.surf:spring-surf:pom:${dependency.surf.version} from/to alfresco-internal (https://artifacts.alfresco.com/nexus/content/groups/private): Not authorized , ReasonPhrase:Unauthorized. -> [Help 1] +``` + +then please re-run with `-Ddependency.surf.version=6.3` + +## Install lombok plugin for IDEs +To allow automation and benchmark projects to be built within an IDE the lombok 'plugin' needs to be installed. +Execute lombok.jar (doubleclick it, or run `java -jar lombok.jar`). Follow the instructions. + +## Use Solr 6 with Alfresco 5.2.x +In alfresco-global.properties (depending on the RM edition `/records-management/rm-community/rm-community-repo/src/test/properties/local` or `/records-management/rm-enterprise/rm-enterprise-repo/src/test/properties/local`) +change the value for "index.subsystem.name" from "solr4" to "solr6". +Add also the following property "solr.port=8983". + +Download the latest Alfresco Search Services from +[https://nexus.alfresco.com/nexus/#nexus-search;gav\~\~alfresco-search-services\~\~\~](https://nexus.alfresco.com/nexus/#nexus-search;gav~~alfresco-search-services~~~) +Currently it's 1.0.0 (alfresco-search-services-1.0.0.zip) + +Unzip it and change to the "solr" folder within it. Start the Solr server using the following command: +``` +solr start -a "-Dcreate.alfresco.defaults=alfresco,archive" +``` +Start your repository + +## Build Docker images for RM Repo and Share +A first step is checking that you have installed a working version of Docker that can be downloaded from here: +[https://docs.docker.com/install/] + +The second step, in case you already have Docker installed, the current running images must be checked in order to be sure that they are not occupying any of the ports that +ACS and Share use. + +To kill and clean all the images and containers the following command can be used: + +``` +docker system prune --volumes +``` + > Note that this will also remove all the stopped containers, containers, networks, volumes and build cache. + +Depending on which version of AGS you want to start, Community or Enterprise, **you must first build the docker images**. +From the root folder of the project you can create both the Repo and the Share images for Community and Enterprise. +To build all the images use the following command: +``` +mvn install -PbuildDockerImage +``` +If only the Community or Enterprise images need to be built than the same command as above must be run either in the rm-community or rm-enterprise modules. + +## Start the Docker images + +The Docker images of the Repo can be started independently from Share running the following command in the rm-repo-enterprise or rm-repo-community folder which contains the Docker-compose.yml file: +``` +docker-compose up +``` +> Be aware of the fact that the Share images can not be started independently from Repo + +e.g. In order to start an instance of rm-enterprise-repo and rm-enterprise-share, the above command must be run in rm-enterprise-share after the images have been built. + +## Start the Docker images with jRebel in remote server mode + +If you have a license for jRebel then this can be used from the rm-community-share or rm-enterprise-share directories with: +``` +docker-compose -f docker-compose.yml -f jrebel-docker-compose.yml --project-name agsdev up --build --force-recreate +``` diff --git a/amps/ags/ide-config/eclipse/alfresco-java-profile.xml b/amps/ags/ide-config/eclipse/alfresco-java-profile.xml new file mode 100644 index 0000000000..4b56772b4a --- /dev/null +++ b/amps/ags/ide-config/eclipse/alfresco-java-profile.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/amps/ags/ide-config/eclipse/alfresco-javascript-profile.xml b/amps/ags/ide-config/eclipse/alfresco-javascript-profile.xml new file mode 100644 index 0000000000..eb0edaa553 --- /dev/null +++ b/amps/ags/ide-config/eclipse/alfresco-javascript-profile.xml @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/amps/ags/ide-config/eclipse/rm.eclipse.importorder b/amps/ags/ide-config/eclipse/rm.eclipse.importorder new file mode 100644 index 0000000000..c1558e39e3 --- /dev/null +++ b/amps/ags/ide-config/eclipse/rm.eclipse.importorder @@ -0,0 +1,10 @@ +#Organize Import Order +#Thu Jan 28 11:20:46 GMT 2016 +6=com +5=javax +4=java +3=\#org +2=\#com +1=\#javax +0=\#java +7=org diff --git a/amps/ags/ide-config/intellij/RM-IntelliJ-settings.jar b/amps/ags/ide-config/intellij/RM-IntelliJ-settings.jar new file mode 100644 index 0000000000..153947afb6 Binary files /dev/null and b/amps/ags/ide-config/intellij/RM-IntelliJ-settings.jar differ diff --git a/amps/ags/license/alfresco_community/header.txt b/amps/ags/license/alfresco_community/header.txt new file mode 100644 index 0000000000..d850cee1ea --- /dev/null +++ b/amps/ags/license/alfresco_community/header.txt @@ -0,0 +1,18 @@ +This file is part of the Alfresco software. +- +If the software was purchased under a paid Alfresco license, the terms of +the paid license agreement will prevail. Otherwise, the software is +provided under the following open source license terms: +- +Alfresco is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +- +Alfresco is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. +- +You should have received a copy of the GNU Lesser General Public License +along with Alfresco. If not, see . \ No newline at end of file diff --git a/amps/ags/license/alfresco_community/license.txt b/amps/ags/license/alfresco_community/license.txt new file mode 100644 index 0000000000..cca7fc278f --- /dev/null +++ b/amps/ags/license/alfresco_community/license.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/amps/ags/license/alfresco_enterprise/header.txt b/amps/ags/license/alfresco_enterprise/header.txt new file mode 100644 index 0000000000..5f60c29637 --- /dev/null +++ b/amps/ags/license/alfresco_enterprise/header.txt @@ -0,0 +1,3 @@ +License rights for this program may be obtained from Alfresco Software, Ltd. +pursuant to a written agreement and any use of this program without such an +agreement is prohibited. \ No newline at end of file diff --git a/amps/ags/license/alfresco_enterprise/license.txt b/amps/ags/license/alfresco_enterprise/license.txt new file mode 100644 index 0000000000..7e8745896f --- /dev/null +++ b/amps/ags/license/alfresco_enterprise/license.txt @@ -0,0 +1 @@ +TODO - need enterprise license here \ No newline at end of file diff --git a/amps/ags/license/description.ftl b/amps/ags/license/description.ftl new file mode 100644 index 0000000000..fc0de7cfef --- /dev/null +++ b/amps/ags/license/description.ftl @@ -0,0 +1 @@ +Alfresco Records Management Module \ No newline at end of file diff --git a/amps/ags/license/licenses.properties b/amps/ags/license/licenses.properties new file mode 100644 index 0000000000..19b06c5c37 --- /dev/null +++ b/amps/ags/license/licenses.properties @@ -0,0 +1,2 @@ +alfresco_community=Alfresco Community +alfresco_enterprise=Alfresco Enterprise \ No newline at end of file diff --git a/amps/ags/pom.xml b/amps/ags/pom.xml new file mode 100644 index 0000000000..0c9d13cc35 --- /dev/null +++ b/amps/ags/pom.xml @@ -0,0 +1,251 @@ + + 4.0.0 + alfresco-governance-services-share-parent + pom + Alfresco Governance Services Share Parent + + + org.alfresco + alfresco-share-amps + 23.1.0.156-SNAPSHOT + + + + rm-community + + + + UTF-8 + UTF-8 + -Xmx1024m -XX:MaxPermSize=256m -Duser.language=en -Dcom.sun.management.jmxremote + + true + false + true + + ${project.build.directory}/ + WARN + + + + + + org.mockito + mockito-all + 1.10.19 + + + org.springframework + spring-test + ${dependency.spring.version} + + + com.fasterxml.jackson.core + jackson-core + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${dependency.jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${dependency.jackson.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${dependency.jackson.version} + + + junit + junit + 4.13.2 + test + + + org.apache.bcel + bcel + 6.2.99 + provided + + + + + + + + + maven-surefire-plugin + + + --illegal-access=permit + --add-opens=java.base/java.lang=ALL-UNNAMED + + + + + + org.codehaus.mojo + license-maven-plugin + + + first + + update-file-header + + process-sources + + ${license.verbose} + false + false + + + Alfresco Software Limited + ${maven.multiModuleProjectDirectory}/amps/ags/license/description.ftl + true + true + + + file:${maven.multiModuleProjectDirectory}/amps/ags/license + + + ${license.update.dryrun} + true + ${license.failOnNotUptodateHeader} + + + + src + + + + + **/package-info.java + **/*.properties + **/*.css + **/*.xml + **/*.json + **/*.txt + **/*.html + + + + + + + + maven-resources-plugin + + UTF-8 + + ftl + acp + jpg + png + gif + svg + pdf + doc + docx + xls + xlsx + ppt + pptx + bin + lic + swf + zip + msg + jar + ttf + eot + woff + woff2 + css + ico + psd + + + + + + net.alchim31.maven + yuicompressor-maven-plugin + + + compress-js + process-resources + + compress + + + + **/webscripts/** + **/site-webscripts/** + **/*.lib.js + **/*.css + + src/main/resources/META-INF + false + + + + + + + + + org.codehaus.mojo + license-maven-plugin + + + first + none + + + + + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + rm-enterprise + + + rm-enterprise/pom.xml + + + + rm-enterprise + + + + rm-automation + + + rm-automation/pom.xml + + + + rm-automation + + + + diff --git a/amps/ags/rm-community/.jshintrc b/amps/ags/rm-community/.jshintrc new file mode 100644 index 0000000000..a54fb37ca2 --- /dev/null +++ b/amps/ags/rm-community/.jshintrc @@ -0,0 +1,45 @@ + +{ + "bitwise": true, + "curly": true, + "eqeqeq": true, + "es3": true, + "forin": true, + "freeze": true, + "funcscope": true, + "immed": true, + "indent": 3, + "iterator": true, + "latedef": true, + "maxcomplexity": 10, + "maxdepth": 50, + "maxerr": 50, + "maxlen": 250, + "maxparams": 50, + "maxstatements": 30, + "newcap": true, + "noarg": true, + "nonbsp": true, + "nonew": true, + "notypeof": true, + "shadow": "outer", + "undef": true, + "unused": true, + + "globals": { + "module": false, + "model": true, + "Alfresco": true, + "YAHOO": false, + "appContext": false, + "PDFJS": false, + "AlfrescoUtil": true, + "msg": false + }, + + "expr": true, + "strict": false, + + "browser": true, + "dojo": true +} \ No newline at end of file diff --git a/amps/ags/rm-community/LICENSE.txt b/amps/ags/rm-community/LICENSE.txt new file mode 100644 index 0000000000..cca7fc278f --- /dev/null +++ b/amps/ags/rm-community/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/amps/ags/rm-community/documentation/PatchService.md b/amps/ags/rm-community/documentation/PatchService.md new file mode 100644 index 0000000000..3472dde7fe --- /dev/null +++ b/amps/ags/rm-community/documentation/PatchService.md @@ -0,0 +1,14 @@ +# RM Patch Service + +The RM Patch service operates independently of the Core Patch service & behaves differently. + +Schema numbering is sequential, it’s a 4 digit number, prefixed with the major/minor version number, e.g. schema from a 2.4 version will be 24xx. This is a different policy to the core numbering (which bumps the schema number by 10 for each release). + +Patches run in a single transaction. They may process data in batches, but it’s all wrapped in a single transaction, which is rolled back if the patch fails or is interrupted. AbstractModulePatch#245. When we implement applyInternal within a patch, that whole method runs inside a transaction. + +DB Schema numbers update only after every patch runs. This means if a patch fails, earlier patches will re run. (see: ModulePatchExecuterImpl.executeInternal#140). This behaviour is different than core’s behaviour, which updates the schema number after each successful patch. + +DB Schema number is stored in the attribute service (key: “module-schemaâ€) against the RM’s module ID. This is not exposed in the UI. Nor in a REST API. The attribute service stores it directly in the DB, so isn’t even accessible via the node browser. +If a customer wants to determine the schema number for a running system, they’ll need to execute a DB query. + +It's possible to configure a patch not to run if being upgraded from a earlier schema version by setting `fixesFromSchema` in the patch config xml. diff --git a/amps/ags/rm-community/documentation/README.md b/amps/ags/rm-community/documentation/README.md new file mode 100644 index 0000000000..8e5cf85337 --- /dev/null +++ b/amps/ags/rm-community/documentation/README.md @@ -0,0 +1,31 @@ +## Community Technical Documentation Index + +* [Enterprise Technical Documentation](../../rm-enterprise/documentation/README.md) (the link will only work if this repository contains the enterprise code) +* [Overview of the design of RM](overview.md) +* Records Management + * File Plan + * List of Values + * Records + * EMail Records + * Filed and Unfiled Records + * Easy Access Records + * Physical Records + * Record Import and Export + * [Version Records](./versionRecords) + * Retention + * [Destruction](./destruction) + * Retention Schedules and Events + * Transfer and Accession +* Security + * [Extended permission service](security/extendedPermissionService.md) + * [Roles and Capabilities](security/rolesAndCapabilities.md) +* Discovery + * Governance Search + * Legal Holds +* Compliance + * Governance Audit + * Governance Rules +* Core Module Services + * [RM Patch Service](./PatchService.md) +* Build and Release + * [Build](./build) diff --git a/amps/ags/rm-community/documentation/build/README.md b/amps/ags/rm-community/documentation/build/README.md new file mode 100644 index 0000000000..8a50c3219a --- /dev/null +++ b/amps/ags/rm-community/documentation/build/README.md @@ -0,0 +1,6 @@ +## GS Build ![](https://img.shields.io/badge/Document_Level-In_Progress-yellow.svg?style=flat-square) + +Build location: https://bamboo.alfresco.com/bamboo/browse/RM (not externally accessible.) + +Build Flow: +![build](./resource/build.png) \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/build/resource/build.png b/amps/ags/rm-community/documentation/build/resource/build.png new file mode 100644 index 0000000000..902e37424b Binary files /dev/null and b/amps/ags/rm-community/documentation/build/resource/build.png differ diff --git a/amps/ags/rm-community/documentation/build/resource/build.puml b/amps/ags/rm-community/documentation/build/resource/build.puml new file mode 100644 index 0000000000..7c56bef154 --- /dev/null +++ b/amps/ags/rm-community/documentation/build/resource/build.puml @@ -0,0 +1,66 @@ +@startuml + +Title: Governance Services Build Pipeline (RM HEAD) + +'build plans: +'Ent UI: Automated UI Tests Enterprise +'Com API: Automation Community REST API +'Ent API: Automation Enterprise REST API +'Community +'Com UI: Community Automated UI Tests +'Enterprise +'Ent L1: Enterprise Level 1 Automated UI Tests +'Ent L2: Level 2 Automated UI Tests Enterprise +'RM Benchmark Driver + + +start + +if(Trigger) then (commit to path) + if (rm-community/*) + :Community; + fork + :Ent L1; + fork again + :Enterprise; + fork + :Ent L2; + fork again + :Ent UI; + end fork + end fork + elseif (rm-enterprise/*) + :Enterprise; + fork + :Ent L2; + fork again + :Ent UI; + end fork + elseif (rm-automation/*) + fork + :Ent L1; + fork again + :Ent L2; + fork again + :Ent UI; + end fork + stop + elseif (rm-community-rest-api/*) + :Com API; + stop + elseif (rm-enterprise-rest-api/*) + :Ent API; + stop + elseif (rm-benchmark-driver/*) + :Benchmark; + stop + else + end + endif +else (Time: 1am) + :Community UI; + stop +endif +:Release Step; +end +@enduml \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/destruction/README.md b/amps/ags/rm-community/documentation/destruction/README.md new file mode 100644 index 0000000000..67c3cd923a --- /dev/null +++ b/amps/ags/rm-community/documentation/destruction/README.md @@ -0,0 +1,60 @@ +## Destruction + +### Purpose + +Ensure the immediate and permanent destruction of sensitive content. + +This includes: + + * Records + * Classified content + +### Overview + +Sensitive content is immediately deleted from the content store. It does not get added to the trashcan or any other recoverable location and as such should not be recoverable. + +It is possible to configure the component to include a cleansing step prior to content deletion. This allows the binary content to be repeatedly overwritten prior to deletion to make it harder to forensically recover the binary data. + +Recorded content can be explicitly destroyed whilst maintaining the original node and associated meta-data. This is configured as a characteristic of the destruction step within a retention schedule. + +### Artifacts and Guidance + +* Source Code Link: [GitHub](https://github.com/Alfresco/records-management) +* License: Alfresco Community +* Issue Tracker Link: [JIRA RM](https://issues.alfresco.com/jira/projects/RM/summary) +* Contribution Model: Alfresco Closed Source +* Documentation: [docs.alfresco.com (Records Management)](http://docs.alfresco.com/rm2.4/concepts/welcome-rm.html) + +*** + +### Design + +#### Component Model + +#### Content Model + +* uri - http://www.alfresco.org/model/recordsmanagement/1.0 +* prefix - rma +* rma:ghosted - aspect that indicates that a records content has been destroyed, but the records meta-data is still available. + +#### Flows + +![Alfresco Destruction Flow Diagram](./resource/sequence/destruction-sequence.png) + +#### Class Diagram + +![Alfresco Destruction Class Diagram](./resource/class/destruction-class.png) + +*** + +### Interfaces and APIs + +*** + +### Configuration + +*** + +### Considerations + +*** diff --git a/amps/ags/rm-community/documentation/destruction/resource/class/destruction-class.png b/amps/ags/rm-community/documentation/destruction/resource/class/destruction-class.png new file mode 100644 index 0000000000..1b8b0e3832 Binary files /dev/null and b/amps/ags/rm-community/documentation/destruction/resource/class/destruction-class.png differ diff --git a/amps/ags/rm-community/documentation/destruction/resource/class/destruction-class.puml b/amps/ags/rm-community/documentation/destruction/resource/class/destruction-class.puml new file mode 100644 index 0000000000..f2377c0ffb --- /dev/null +++ b/amps/ags/rm-community/documentation/destruction/resource/class/destruction-class.puml @@ -0,0 +1,43 @@ +@startuml + +DestroyAction --> ContentDestructionComponent +ContentDestructionComponent <|-- ExtendedContentDestructionComponent +ContentDestructionComponent --> EagerContentStoreCleaner +EagerContentStoreCleaner --> ContentCleanser +ContentCleanser <|-- ContentCleanser522022M +ContentCleanser +-- OverwriteOperation + +class DestroyAction { + + boolean ghostingEnabled +} + +class ContentDestructionComponent { + + boolean cleansingEnabled + + void destroyContent(NodeRef nodeRef) + + void destroyContent(NodeRef nodeRef, boolean includeRenditions) + + void registerAllContentForDestruction(NodeRef nodeRef, boolean clearContentProperty) +} + +class ExtendedContentDestructionComponent { + + void onBeforeNodeDelete(NodeRef nodeRef) +} + +class EagerContentStoreCleaner { + + void registerOrphanedContentUrlForCleansing(String contentUrl) + # boolean deleteFromStore(String contentUrl, ContentStore store) +} + +abstract class ContentCleanser { + # OverwriteOperation overwriteZeros + # OverwriteOperation overwriteOnes + # OverwriteOperation overwriteRandom + + {abstract} void cleanse(File file) + # void overwrite(File file, OverwriteOperation overwriteOperation) +} + +abstract class OverwriteOperation { + + {abstract} void operation(OutputStream os) throws IOException +} + +@enduml + diff --git a/amps/ags/rm-community/documentation/destruction/resource/sequence/destruction-sequence.png b/amps/ags/rm-community/documentation/destruction/resource/sequence/destruction-sequence.png new file mode 100644 index 0000000000..06d4fb4426 Binary files /dev/null and b/amps/ags/rm-community/documentation/destruction/resource/sequence/destruction-sequence.png differ diff --git a/amps/ags/rm-community/documentation/destruction/resource/sequence/destruction-sequence.puml b/amps/ags/rm-community/documentation/destruction/resource/sequence/destruction-sequence.puml new file mode 100644 index 0000000000..3dc04692c2 --- /dev/null +++ b/amps/ags/rm-community/documentation/destruction/resource/sequence/destruction-sequence.puml @@ -0,0 +1,40 @@ +@startuml + +Title: Content Destruction and Cleansing Flow + +participant "Repository" as R +participant "Behaviour" as B +participant "ContentDestructionComponent" as CDC +participant "EagerContentStoreCleaner" as ECSC +participant ConentCleanser as CC +participant ContentStore as CS + +R->B:beforeNodeDelete +activate B + +note right of B: sensitive content +B->CDC:registerAllContentForDestruction +deactivate B +activate CDC +note right of CDC: cleansing enabled + +CDC->ECSC:registerOrphanedContentUrlForCleansing +deactivate CDC +activate ECSC + +ECSC->ECSC: registerOrphanedContentUrl + +R->ECSC:afterCommit + +ECSC->CC:cleanse +activate CC +CC->ECSC +deactivate CC + +ECSC->CS:delete +activate CS +CS->ECSC +deactivate CS +deactivate ECSC + +@enduml \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/overview.md b/amps/ags/rm-community/documentation/overview.md new file mode 100644 index 0000000000..c5918e396a --- /dev/null +++ b/amps/ags/rm-community/documentation/overview.md @@ -0,0 +1,77 @@ +## Records Management Technical Overview + +![Completeness Badge](https://img.shields.io/badge/Document_Level-Complete-green.svg?style=flat-square) + +![Version Badge](https://img.shields.io/badge/Version-Current-blue.svg?style=flat-square) + +### Purpose +The Alfresco Records Management (RM) modules are installed on top of Alfresco Content Services and use a similar REST API and service architecture. This document provides an overview of the standard patterns that have been used throughout the RM modules. + +*** + +### Overview +RM is split into two main parts - a repository integration and a Share integration. The Share module communicates with the repository module using REST API calls. The repository module includes integration with the Alfresco database. + +*** + +### Artifacts and Guidance + +* [Community Source Code](https://github.com/Alfresco/records-management) +* [Enterprise Source Code](https://github.com/Alfresco/governance-services) (for partners and customers) +* [Community License](../LICENSE.txt) +* [Enterprise License](../../rm-enterprise/LICENSE.txt) (this file will only be present in clones of the Enterprise repository) +* [Issue Tracker Link](https://issues.alfresco.com/jira/projects/RM) +* [Community Documentation Link](http://docs.alfresco.com/rm-community/concepts/welcome-rm.html) +* [Enterprise Documentation Link](http://docs.alfresco.com/rm/concepts/welcome-rm.html) +* [Contribution Model](../../CONTRIBUTING.md) + +*** + +### Prerequisite Knowledge +An understanding of Alfresco Content Services is assumed. The following pages from the [developer documentation](http://docs.alfresco.com/5.2/concepts/dev-for-developers.html) give useful background information: + +* [ACS Architecture](http://docs.alfresco.com/5.2/concepts/dev-arch-overview.html) +* [Platform Extensions](http://docs.alfresco.com/5.2/concepts/dev-platform-extensions.html) +* [Share Extensions](http://docs.alfresco.com/5.2/concepts/dev-extensions-share.html) + +*** + +### APIs and Interfaces +The RM Share module communicates with the repository module via REST APIs. Internally the RM repository module uses a three layer model: + +* A REST API layer responsible for converting API requests into service calls. +* A Java service layer responsible for handling business logic. +* A DAO layer responsible for CRUD operations against the database. + +#### REST API +The REST API endpoints fall into two main types - v0 (Webscripts) and v1. The [v0 API](http://docs.alfresco.com/5.2/references/dev-extension-points-webscripts.html) is older and not recommended for integrations. The [v1 API](http://docs.alfresco.com/5.1/pra/1/topics/pra-welcome-aara.html) is newer but isn't yet feature complete. If you are running RM locally then the GS API Explorer will be available at [this link](http://localhost:8080/gs-api-explorer/). + +Internally the GS v1 REST API is built on the [Alfresco v1 REST API framework](https://community.alfresco.com/community/ecm/blog/2016/10/11/v1-rest-api-part-1-introduction). It aims to be consistent with this in terms of behaviour and naming. + +#### Java Public API +The Java service layer is fronted by a [Java Public API](http://docs.alfresco.com/5.2/concepts/java-public-api-list.html), which we will ensure backward compatible with previous releases. Before we remove any methods there will first be a release containing that method deprecated to allow third party integrations to migrate to a new method. The Java Public API also includes a set of POJO objects which are needed to communicate with the services. It is easy to identify classes that are part of the Java Public API as they are annotated `@AlfrescoPublicApi`. + +Each Java service will have at least four beans defined for it: + +* A 'lowerCase' inner bean, which is the actual service implementation. +* An 'UpperCase' wrapper bean, which includes security and transaction management. This is the bean that should be used by third party integrations. +* A bean to handle transactions on the service methods. +* A bean to handle security restricting who can call different service methods. + +#### DAOs +The DAOs are not part of the Java Public API, but handle CRUD operations against RM stored data. We have some custom queries to improve performance for particularly heavy operations. + +We use standard Alfresco [data modelling](http://docs.alfresco.com/5.2/references/dev-extension-points-content-model.html) to store RM metadata. We extend the [Alfresco patching mechanism](http://docs.alfresco.com/5.2/references/dev-extension-points-patch.html) to provide community and enterprise schema upgrades. + +*** + +### Component Overview +![Information Governance Component Overview](./resource/component/ig-component.png) + +*** + +### Design Decisions + +| Decision | Rationale | Date | +| --------------- |:--------------------------:| ------------:| +| | | | diff --git a/amps/ags/rm-community/documentation/resource/class/governance-services.png b/amps/ags/rm-community/documentation/resource/class/governance-services.png new file mode 100644 index 0000000000..f682a9d1eb Binary files /dev/null and b/amps/ags/rm-community/documentation/resource/class/governance-services.png differ diff --git a/amps/ags/rm-community/documentation/resource/class/governance-services.puml b/amps/ags/rm-community/documentation/resource/class/governance-services.puml new file mode 100644 index 0000000000..2dda190d31 --- /dev/null +++ b/amps/ags/rm-community/documentation/resource/class/governance-services.puml @@ -0,0 +1,308 @@ +@startuml + +'Core ACS entities + +package "ACS core - content" { + + class Content { + } + + class Folder { + } + + class File { + } + + class Site { + } + +} + +package "RM Core" { + + class FilePlanComponent { + rootNodeRef: NodeRef + } + + class RecordsManagementContainer { + recordComponentIdentifier: String + } + + class RmSite { + } + + class FilePlan { + } + + class RecordCategory { + } + + class RecordFolder { + recordComponentIdentifier: String + } + + class Record { + recordComponentIdentifier: String + dateFiled: Date + originalName: String + location: String + } + + class DodRecord { + publicationDate: Date + originator: String + originatingOrganization: String + mediaType: String + format: String + dateReceived: Date + address: String + otherAddress: String + } + + class NonElectronicRecord { + physicalSize: Int + numberOfCopies: Int + storageLocation: String + shelf: String + box: String + file: String + } + + class EasyAccessRecord { + } + + class UnfiledRecordContainer { + } + + class UnfiledRecordFolder { + } + +} + +package "ACS core - people" { + + class User { + } + + class Group { + } +} + +package "RM Roles and Capabilities" { + class Role { + } + + class Capability { + name:String + } + +} + +package "Information Lifecycle Management" { + + class TransferContainer { + } + + class Transfer { + location : String + pdfIndicator : boolean + } + + class RetentionSchedule { + authority: String + instructions: String + recordLevelDisposition: Boolean + } + + class DispositionActionDefinition { + dispositionActionName: String + dispositionDescription: String + dispositionLocation: String + dispositionPeriod: Period + dispositionPeriodProperty: String + dispositionEvent: String + dispositionEventCombination: String + combineDispositionStepConditions: String + } + + class DispositionEvent { + } + + class DispositionLifecycle { + } + + class DispositionAction { + dispositionActionId: String + dispositionAction: String + dispositionAsOf: Date + manuallySetAsOf: Date + dispositionEventsEligible: Boolean + dispositionActionStartedAt: Date + dispositionActionStartedBy: String + dispositionActionCompletedAt: Date + dispositionActionCompletedBy: String + } + + class EventExecution { + } + +} + +note bottom of RetentionSchedule { + Retention is the new name for disposition. + Retention is the user facing name, + code refers to disposition +} + +note bottom of Transfer { + A holding pen for records + that are being transferred + out of the system +} + +package "Legal Holds" { + class HoldContainer { + } + + class Hold { + holdReason: String + } + + class Frozen { + frozenAt: Date + frozenBy: String + } + +} + +package "Security Controls" { + + class SecurityGroup <> { + enum groupType + {HIERARCHICAL, + USER_REQUIRES_ANY, + USER_REQUIRES_ALL} + unmarkedMark: SecurityMark + } + + class SecurityMark <> { + } + + class SecurityClassification <> { + } + + class ClassificationReason <> { + } + + class ClassificationExemption <> { + } + + class ClassificationInfo <> { + classification: SecurityClassification + reason:ClassificationReason[] + classifiedBy: String + agency:String + } + + class SourceReference <> { + name:String + originatingOrg:String + publicationDate:Date + } + + class DowngradeSchedule <> { + date:Date + event:String + instructions:String + } + + class DeclassificationSchedule <> { + date:Date + event:String + exemption:Exemption[] + } + + class ClassificationGuide <> { + } + + class DeclassificationTimeframe <> { + } +} + +Content <|-- Folder +Content <|-- File + +File <|-- Record +Folder <|-- RecordFolder + +Site <|-- RmSite + +Record <|- EasyAccessRecord +Folder "1" o-- "*" EasyAccessRecord + +Record <|-- DodRecord + +FilePlanComponent <|-- RecordsManagementContainer +FilePlanComponent <|-- RecordFolder +FilePlanComponent <|-- NonElectronicRecord +FilePlanComponent <|-- Record +RecordsManagementContainer <|-- Hold +RecordsManagementContainer <|-- UnfiledRecordContainer +RecordsManagementContainer <|-- HoldContainer +RecordsManagementContainer <|-- TransferContainer +RecordsManagementContainer <|-- FilePlan +RecordsManagementContainer <|-- RecordCategory + +RecordCategory "1" *- "*" RecordFolder +RecordCategory *- "*" RecordCategory + +note bottom of RecordCategory { + A RecordCategory may contain either RecordFolders or + RecordCategories but not both. A RecordCategory may only exist + as the child of either another RecordCategory or the FilePlan +} + +RecordFolder *- "*" Record : contains +RecordFolder *-- "*" NonElectronicRecord : contains + +UnfiledRecordContainer *-- "*" UnfiledRecordFolder +UnfiledRecordFolder *-- "*" Record + +FilePlan *- "*" RecordsManagementContainer +FilePlan "1" *- "*" RecordCategory + +RmSite "1" *- "1" FilePlan + +Hold "*" o- "*" FilePlanComponent : contains +HoldContainer *- "*" Hold +(FilePlanComponent, Hold) .. Frozen + +TransferContainer *- "*" Transfer +Transfer *- "*" Record + +DispositionLifecycle o- "0..1" DispositionAction: nextDispositionAction +DispositionLifecycle o- "*" DispositionAction: dispositionActionHistory + +RetentionSchedule o- "*" DispositionActionDefinition +RetentionSchedule o- "*" FilePlanComponent + +DispositionAction O-- "*" EventExecution + +Role o- "*" Capability +User o- "*" Role +Group o- "*" Role + +Content o-- "*" SecurityMark : securityControls +User o-- "*" SecurityMark : clearance +Group o-- "*" SecurityMark : clearance + +SecurityGroup "1" *- "*" SecurityMark +SecurityMark <|-- SecurityClassification +Content o- "0..1" SecurityClassification + +(Content, SecurityClassification) .. ClassificationInfo + +ClassificationInfo *-- "*" SourceReference +ClassificationInfo *-- "0..1" DowngradeSchedule + +@enduml \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/resource/component/ig-component.png b/amps/ags/rm-community/documentation/resource/component/ig-component.png new file mode 100644 index 0000000000..788642c604 Binary files /dev/null and b/amps/ags/rm-community/documentation/resource/component/ig-component.png differ diff --git a/amps/ags/rm-community/documentation/resource/component/ig-component.puml b/amps/ags/rm-community/documentation/resource/component/ig-component.puml new file mode 100644 index 0000000000..1c446ccb46 --- /dev/null +++ b/amps/ags/rm-community/documentation/resource/component/ig-component.puml @@ -0,0 +1,58 @@ +@startuml + +skinparam componentArrowColor white + +' IG Component Breakdown +rectangle "Information Governance" as IG { + + rectangle "Records Management" as RM { + + component "File Plan" as FP + + rectangle "Records" as Rec { + component "Filed and Unfiled Records" + component "Easy Access Records" + component "Version Records" + component "Physical Records" + component "Email Records" + component "Record Import and Export" + } + + rectangle "Retention" as Ret { + component "Retention Schedules and Events" + component "Transfer and Accession" + component "Destruction" + } + component "List of Values" as LOV + } + + rectangle "Security" as Sec { + component "Roles, Capabilities and Permissions" + component "Security Marks" + component "Content Classification" + } + + rectangle "Discovery" as Dis { + component "Search" + component "Legal Holds" + } + + rectangle "Compliance" as Comp { + component "Audit" + component "DoD 5015.2" + } + + rectangle "Automation" as Auto { + component "Rules" + } +} + +' Fomatting +RM -[hidden]---- Sec +RM -[hidden]---- Dis +Dis -[hidden]- Comp +Rec -[hidden]-- Ret +FP -[hidden]- LOV +Sec -[hidden]-- Auto + +@enduml \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/resource/image/CapabilitiesAndRoles.png b/amps/ags/rm-community/documentation/resource/image/CapabilitiesAndRoles.png new file mode 100644 index 0000000000..606a7d3a73 Binary files /dev/null and b/amps/ags/rm-community/documentation/resource/image/CapabilitiesAndRoles.png differ diff --git a/amps/ags/rm-community/documentation/security/extendedPermissionService.md b/amps/ags/rm-community/documentation/security/extendedPermissionService.md new file mode 100644 index 0000000000..abc7d4a7d5 --- /dev/null +++ b/amps/ags/rm-community/documentation/security/extendedPermissionService.md @@ -0,0 +1,68 @@ +## Alfresco Governance Services' Extended Permission Service + +![Completeness Badge](https://img.shields.io/badge/Document_Level-Complete-green.svg?style=flat-square) + +![Version Badge](https://img.shields.io/badge/Version-Current-blue.svg?style=flat-square) + +### Purpose + +When working on the Records Management module, we needed additional functionality around permissions, and therefore +introduced the [ExtendedPermissionService](../../rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/impl/ExtendedPermissionServiceImpl.java). + +### Overview + +The ExtendedPermissionService is wired in, via [Spring config](../../rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml), +to extend Alfresco's core PermissionService, and adds support for: +* the [RMPermissionModel](../../rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMPermissionModel.java), which defines the available permissions capabilities. +* the [PermissionProcessorRegistry](../../rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/processor/PermissionProcessorRegistry.java), which introduces pre- and post- processors. +* other minor method extensions (e.g. to setInheritParentPermissions) + +### Permission Processor Registry + +This was added in RM 2.4 to support the requirements around the additional security classifications and markings. + +The registry is simply two array lists, one for pre-processors and one for post-processors, which are iterated around +before / after (respectively) the wrapped call PermissionService.hasPermission + +Out of the box, a system with the RM module installed will have the following permissions processors defined: + +#### Community: + +##### Pre-processors: +* None. + +##### Post-processors: +* [RecordsManagementPermissionPostProcessor](../../rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/permission/RecordsManagementPermissionPostProcessor.java) + * If the node is an RM node (i.e. it has the [RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT](../../rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java) marker aspect) and the + core permissions evaluates to DENIED, then this post processor allows read/writes if the appropriate read/file + permissions are present. + +#### Enterprise: +(links only work in clones of Enterprise repos) + +##### Pre-processors: +* [SecurityMarksPermissionPreProcessor](../../rm-enterprise/rm-enterprise-repo/src/main/java/org/alfresco/module/org_alfresco_module_rm/securitymarks/permission/SecurityMarksPermissionPreProcessor.java) + * For all content: denies the result if the required security clearance rules (for classification or marks) are not satisfied. (uses +[securityClearanceService.isClearedFor](../../rm-enterprise/rm-enterprise-repo/src/main/java/org/alfresco/module/org_alfresco_module_rm/securitymarks/SecurityClearanceServiceImpl.java)) + +##### Post-processors: +* None. + + +### Configuration and Extension points + +Additional processors can be defined by extending either [PermissionPreProcessorBaseImpl](../../rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/processor/impl/PermissionPreProcessorBaseImpl.java) +or [PermissionPostProcessorBaseImpl](../../rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/processor/impl/PermissionPostProcessorBaseImpl.java) +which call the add method on the appropriate list during init. + +### Performance Implications + +There is certainly a performance overhead when adding additional processing to permission checks. This is most noticeable + in the SecurityMarksPermissionPreProcessor where we need to call out to an external service. This has been profiled + heavily and optimised during 2.5 and 2.6 development. + + ###TODO: + Not yet documented (in related areas of the code) are: + * Capabilities (see rm-capabilities-*.xml, declarativeCapability.java and DeclarativeCompositeCapability.java) + * RM's permission system has an any allow allows policy unlike alfresco which policy is any deny denies + \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/security/rolesAndCapabilities.md b/amps/ags/rm-community/documentation/security/rolesAndCapabilities.md new file mode 100644 index 0000000000..c3372d5b1c --- /dev/null +++ b/amps/ags/rm-community/documentation/security/rolesAndCapabilities.md @@ -0,0 +1,41 @@ +## Alfresco Governance Services' Roles and Capabilities + +![Completeness Badge](https://img.shields.io/badge/Document_Level-InProgress-yellow.svg?style=flat-square) + +![Version Badge](https://img.shields.io/badge/Version-Current-blue.svg?style=flat-square) + +### Purpose + +Roles and capabilities allow the GS system to provide a finer grain security evaluation, determining whether an authority has the capability to perform a perticular action on a node. + +### Overview + +Roles are defined as a collection of capabilities. A capability, generally, has a one to one relationship with an action within the system. + +Authorities are assigned roles. If an authority is assigned to a role then it that authority has the capabilities contained within that role, allowing them to perform the related actions. + +An authority can be assigned many roles, with the associated capabilities being additive. + +Capabilties are evaluated in addition to any ACLs attached to a node, but they are mutally exclusive. A authority may have the capability, but not the permissions on a node and vice versa. + +### Design + +Roles are implementented as groups. So for every role that is created, there is a corresponding group within the system. + +Capabilities are implemented as permissions. In order add a new capability to the system, the extended RM permission model needs to be extended. + +When a capability is added to a role, then the capability group is assigned the capability role on the root file plan node. + +In this way the permissions of the systems roles reflect their capabilities on the file plan via the capability permissions assigned. + +When an authority is assigned to a role, that authority is added as a member of the corresponding role group. In this way they inherit the capability permissions on the file plan that relate to that role group. + +If a user attempts to perform an action on a records management artifact which has a related capability. Assuming the user has permission to see the artifact in the first place, then the users capability to perform the action is evaluated. + +This is done by firstly determining whether the capability is relevant for this 'kind' of records management artifact. For example the addHold capability is not relevant for a record category. + +Then the capability permission is evaluated by traversing to the file plan node and checking whether the current user has the capabilty permission byt virtue of it's membership of the right role group. + +Finally any further conditions attached to the capability are evaluated. + +![](../resource/image/CapabilitiesAndRoles.png) \ No newline at end of file diff --git a/amps/ags/rm-community/documentation/versionRecords/README.md b/amps/ags/rm-community/documentation/versionRecords/README.md new file mode 100644 index 0000000000..405827ed13 --- /dev/null +++ b/amps/ags/rm-community/documentation/versionRecords/README.md @@ -0,0 +1,20 @@ +## Version Records ![](https://img.shields.io/badge/Document_Level-In_Progress-yellow.svg?style=flat-square) + +### Notes: + +NodesService varies depending on store. Version Service has a different service that hydrates effectively fake nodes (which contain url, version details, associations, aspects, as denormalised meta data) back into a full node + +Recorded Versions take content out of version store and create a record by version store implementation extension. + +Declaring record as version - standard use case is auto declaring or via records. Head version is extracted to a record, rather than a new version being created + +Records are linked by association + +Disposition events can be triggered automatically from versioning events. + +### Diagram: + +![Version Records Primer](./RecordedVersions.png) + + + diff --git a/amps/ags/rm-community/documentation/versionRecords/RecordedVersions.png b/amps/ags/rm-community/documentation/versionRecords/RecordedVersions.png new file mode 100644 index 0000000000..7ac208b9e2 Binary files /dev/null and b/amps/ags/rm-community/documentation/versionRecords/RecordedVersions.png differ diff --git a/amps/ags/rm-community/pom.xml b/amps/ags/rm-community/pom.xml new file mode 100644 index 0000000000..d0cceb9528 --- /dev/null +++ b/amps/ags/rm-community/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + alfresco-governance-services-community-share-parent + pom + Alfresco Governance Services Community + + + org.alfresco + alfresco-governance-services-share-parent + 23.1.0.156-SNAPSHOT + + + + rm-community-share + + + + + LGPL 3 + + + diff --git a/amps/ags/rm-community/rm-community-share/.env b/amps/ags/rm-community/rm-community-share/.env new file mode 100644 index 0000000000..8a15914642 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/.env @@ -0,0 +1,3 @@ +SOLR6_TAG=2.0.7-A5 +POSTGRES_TAG=13.1 +ACTIVEMQ_TAG=5.16.1 diff --git a/amps/ags/rm-community/rm-community-share/.maven-dockerignore b/amps/ags/rm-community/rm-community-share/.maven-dockerignore new file mode 100644 index 0000000000..112bd18249 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/.maven-dockerignore @@ -0,0 +1 @@ +target/docker/ \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/Dockerfile b/amps/ags/rm-community/rm-community-share/Dockerfile new file mode 100644 index 0000000000..bdf561a220 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/Dockerfile @@ -0,0 +1,12 @@ +### Apply AGS community share AMP to Share image +ARG BASE_IMAGE +FROM ${BASE_IMAGE} + +### Copy the AMP from build context to amps_share +COPY target/alfresco-governance-services-community-share-*.amp /usr/local/tomcat/amps_share/ + +### Install AMP on share +RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \ + /usr/local/tomcat/amps_share/alfresco-governance-services-community-share-*.amp /usr/local/tomcat/webapps/share -nobackup -force + +LABEL quay.expires-after=${docker.quay-expires.value} diff --git a/amps/ags/rm-community/rm-community-share/config/META-INF/resources/components/dm/rules/config/rule-config-action-custom.js b/amps/ags/rm-community/rm-community-share/config/META-INF/resources/components/dm/rules/config/rule-config-action-custom.js new file mode 100644 index 0000000000..7c363a917a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/META-INF/resources/components/dm/rules/config/rule-config-action-custom.js @@ -0,0 +1,258 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RuleConfigActionCustom. + * + * @namespace + * @class DM.RuleConfigActionCustom + */ +if (typeof DM == "undefined" || !DM) +{ + var DM = {}; +} +(function () { + /** + * Alfresco Slingshot aliases + */ + var $hasEventInterest = Alfresco.util.hasEventInterest; + + DM.RuleConfigActionCustom = function (htmlId) { + DM.RuleConfigActionCustom.superclass.constructor.call(this, htmlId); + + // Re-register with our own name + this.name = "DM.RuleConfigActionCustom"; + Alfresco.util.ComponentManager.reregister(this); + + // Instance variables + this.customisations = YAHOO.lang.merge(this.customisations, DM.RuleConfigActionCustom.superclass.customisations); + this.renderers = YAHOO.lang.merge(this.renderers, DM.RuleConfigActionCustom.superclass.renderers); + + return this; + }; + + YAHOO.extend(DM.RuleConfigActionCustom, Alfresco.RuleConfigAction, + { + customisations: + { + DeclareAndFileRecord: + { + text: function (configDef, ruleConfig, configEl) { + this._getParamDef(configDef, "path").displayLabel = this.msg("create-record.path.label"); + this._getParamDef(configDef, "hide-record").displayLabel = this.msg("create-record.hide-record.label"); + return configDef; + }, + edit: function (configDef, ruleConfig, configEl) { + this._hideParameters(configDef.parameterDefinitions); + + configDef.parameterDefinitions.splice(0, 0, + { + type: "arca:dm-fileTo-destination-dialog-button", + _buttonLabel: this.msg("button.select-folder"), + _destinationParam: "destination-folder" + }); + + configDef.parameterDefinitions.splice(1, 0, + { + type: "arca:record-path-help-icon" + }); + + var path = this._getParamDef(configDef, "path"); + path._type = "hidden"; + path.displayLabel = this.msg("create-record.path.label"), + path._displayLabelToRight = false; + path._hideColon = true; + + var hideRecord = this._getParamDef(configDef, "hide-record"); + hideRecord._type = null; + hideRecord.displayLabel = this.msg("create-record.hide-record.label"), + hideRecord._displayLabelToRight = true; + hideRecord._hideColon = true; + + return configDef; + } + }, + DeclareAndFileVersionRecord: + { + text: function (configDef, ruleConfig, configEl) { + this._getParamDef(configDef, "path").displayLabel = this.msg("declare-as-version-record.path.label"); + return configDef; + }, + + edit: function (configDef, ruleConfig, configEl) { + this._hideParameters(configDef.parameterDefinitions); + + configDef.parameterDefinitions.splice(0, 0, + { + type: "arca:dm-fileTo-destination-dialog-button", + _buttonLabel: this.msg("button.select-folder"), + _destinationParam: "destination-folder" + }); + + configDef.parameterDefinitions.splice(1, 0, + { + type: "arca:record-path-help-icon" + }); + + var path = this._getParamDef(configDef, "path"); + path._type = "hidden"; + path.displayLabel = this.msg("declare-as-version-record.path.label"), + path._displayLabelToRight = false; + path._hideColon = true; + + return configDef; + } + } + }, + renderers: + { + "arca:dm-fileTo-destination-dialog-button": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + var mode = "declareAndFile"; + + var selectedPath = ruleConfig.parameterValues && ruleConfig.parameterValues.path; + this._createButton(containerEl, configDef, paramDef, ruleConfig, function RCA_destinationDialogButton_onClick(type, obj) + { + this.renderers["arca:dm-fileTo-destination-dialog-button"].currentCtx = + { + configDef: obj.configDef, + ruleConfig: obj.ruleConfig, + paramDef: obj.paramDef + }; + this.widgets.copyMoveLinkFileToDialog = new Alfresco.rm.module.CopyMoveLinkFileTo(this.id + "-destinationDialog"); + this.widgets.copyMoveLinkFileToDialog.setOptions( + { + title: this.msg("dialog.destination.title"), + mode: mode, + files: "", + siteId: "rm", + path: selectedPath, + unfiled: false + }); + + YAHOO.Bubbling.on("folderSelected", function (layer, args) + { + if ($hasEventInterest(this.widgets.copyMoveLinkFileToDialog, args)) + { + var selectedFolder = args[1].selectedFolder; + if (selectedFolder !== null) + { + var ctx = this.renderers["arca:dm-fileTo-destination-dialog-button"].currentCtx; + var path = (selectedFolder.path !== "/") ? selectedFolder.path : ""; + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "path", path); + Dom.get(this.id + "-recordFolderPath").value = path; + this._updateSubmitElements(ctx.configDef); + this.widgets.copyMoveLinkFileToDialog.setOptions({ + path: selectedFolder.path + }); + } + } + }, this); + var pathNodeRef = this._getParameters(obj.configDef)["destination-folder"], + allowedViewModes = + [ + Alfresco.module.DoclibGlobalFolder.VIEW_MODE_SITE + ]; + + if (this.options.repositoryBrowsing === true) + { + allowedViewModes.push(Alfresco.module.DoclibGlobalFolder.VIEW_MODE_REPOSITORY, Alfresco.module.DoclibGlobalFolder.VIEW_MODE_USERHOME); + } + this.widgets.copyMoveLinkFileToDialog.setOptions( + { + allowedViewModes: allowedViewModes, + nodeRef: this.options.rootNode, + pathNodeRef: pathNodeRef ? new Alfresco.util.NodeRef(pathNodeRef) : null + }); + + this.widgets.copyMoveLinkFileToDialog.onOK = function() + { + YAHOO.Bubbling.fire("folderSelected", + { + selectedFolder: this.selectedNode ? this.selectedNode.data : null, + eventGroup: this + }); + this.widgets.dialog.hide(); + } + + var me = this; + this.widgets.copyMoveLinkFileToDialog._showDialog = function() + { + this.widgets.okButton.set("label", me.msg("create-record.button")); + return Alfresco.rm.module.CopyMoveLinkFileTo.superclass._showDialog.apply(this, arguments); + } + + this.widgets.copyMoveLinkFileToDialog.showDialog(); + }); + this._createLabel(this._getParamDef(configDef, "path").displayLabel, containerEl); + var el = document.createElement("input"); + el.setAttribute("type", "text"); + el.setAttribute("name", "-"); + el.setAttribute("title", paramDef.displayLabel ? paramDef.displayLabel : paramDef.name); + el.setAttribute("param", paramDef.name); + el.setAttribute("value", (selectedPath != undefined && selectedPath != null) ? selectedPath : ""); + el.setAttribute("id", this.id + "-recordFolderPath"); + el.addEventListener("blur", function() + { + Selector.query("[param=" + "path" + "]")[0].value = this.value; + }, false); + + containerEl.appendChild(el); + + } + }, + "arca:record-path-help-icon": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + var me = this, + image = document.createElement("img"); + image.src = Alfresco.constants.URL_CONTEXT + "res/components/form/images/help.png"; + image.title = this.msg("record.folder.path.title"); + image.onclick = function() + { + var balloon = Alfresco.util.createInfoBalloon(this, { + html: me.msg("record.folder.path.help"), + width: "25em" + }); + balloon.show(); + }; + + var helpIcon = document.createElement("span"); + helpIcon.setAttribute('class', 'help-icon'); + helpIcon.appendChild(image); + containerEl.appendChild(helpIcon); + } + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-context.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-context.xml new file mode 100644 index 0000000000..6591c871b3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-context.xml @@ -0,0 +1,55 @@ + + + + + + + + alfresco.dod5015.messages.dod5015 + + + + + + + + + classpath:alfresco/dod5015/dod5015-share-config.xml + classpath:alfresco/dod5015/dod5015-form-config.xml + + + + + + + + dod:digitalPhotographRecord + + + + + + + dod:pdfRecord + + + + + + + dod:scannedRecord + + + + + + + dod:webRecord + + + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-form-config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-form-config.xml new file mode 100644 index 0000000000..6a0e9041a3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-form-config.xml @@ -0,0 +1,43 @@ + + + + +
+ + + + + + true + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + true + + + +
+
+
+ +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-share-config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-share-config.xml new file mode 100644 index 0000000000..c17d287183 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/dod5015-share-config.xml @@ -0,0 +1,30 @@ + + + + + + + + + + evaluator.dod5015.indicator.digitalPhotographRecord + + + + evaluator.dod5015.indicator.pdfRecord + + + + evaluator.dod5015.indicator.scannedRecord + + + + evaluator.dod5015.indicator.webRecord + + + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015.properties new file mode 100644 index 0000000000..329de33092 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=DOD5015 Record +label.set.rm-metadata-dod-scannedRecord=Scanned Record +label.set.rm-metadata-dod-pdfRecord=PDF Record +label.set.rm-metadata-dod-digitalPhotographRecord=Digital Photograph Record +label.set.rm-metadata-dod-webRecord=Web Record \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_de.properties new file mode 100644 index 0000000000..6a34bd04ba --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_de.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=DoD 5015-konformer Record +label.set.rm-metadata-dod-scannedRecord=Eingescannter Record +label.set.rm-metadata-dod-pdfRecord=PDF-Record +label.set.rm-metadata-dod-digitalPhotographRecord=Record - Digitales Bild +label.set.rm-metadata-dod-webRecord=Web-Record diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_es.properties new file mode 100644 index 0000000000..1dfbcb71d5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_es.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=Documento de archivo de DOD5015 +label.set.rm-metadata-dod-scannedRecord=Documento de archivo escaneado +label.set.rm-metadata-dod-pdfRecord=Documento de archivo PDF +label.set.rm-metadata-dod-digitalPhotographRecord=Documento de archivo fotogr\u00e1fico digital +label.set.rm-metadata-dod-webRecord=Documento de archivo web diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_fr.properties new file mode 100644 index 0000000000..7277a3c785 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_fr.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=Document d'archives DOD5015 +label.set.rm-metadata-dod-scannedRecord=Document d'archives num\u00e9ris\u00e9 +label.set.rm-metadata-dod-pdfRecord=Document d'archives PDF +label.set.rm-metadata-dod-digitalPhotographRecord=Archive de photo num\u00e9rique +label.set.rm-metadata-dod-webRecord=Document d'archives Web diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_it.properties new file mode 100644 index 0000000000..e4f65f7ee7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_it.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=Record DOD5015 +label.set.rm-metadata-dod-scannedRecord=Record scansionato +label.set.rm-metadata-dod-pdfRecord=Record PDF +label.set.rm-metadata-dod-digitalPhotographRecord=Record fotografia digitale +label.set.rm-metadata-dod-webRecord=Record Web diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_ja.properties new file mode 100644 index 0000000000..032227d072 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_ja.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=DOD5015\u30ec\u30b3\u30fc\u30c9 +label.set.rm-metadata-dod-scannedRecord=\u30b9\u30ad\u30e3\u30f3\u6e08\u307f\u30ec\u30b3\u30fc\u30c9 +label.set.rm-metadata-dod-pdfRecord=PDF\u30ec\u30b3\u30fc\u30c9 +label.set.rm-metadata-dod-digitalPhotographRecord=\u30c7\u30b8\u30bf\u30eb\u5199\u771f\u30ec\u30b3\u30fc\u30c9 +label.set.rm-metadata-dod-webRecord=Web\u30ec\u30b3\u30fc\u30c9 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_nb.properties new file mode 100644 index 0000000000..1041d0eb85 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_nb.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=DOD5015-oppf\u00f8ring +label.set.rm-metadata-dod-scannedRecord=Skannet oppf\u00f8ring +label.set.rm-metadata-dod-pdfRecord=PDF-oppf\u00f8ring +label.set.rm-metadata-dod-digitalPhotographRecord=Digital bildeoppf\u00f8ring +label.set.rm-metadata-dod-webRecord=Nettoppf\u00f8ring diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_nl.properties new file mode 100644 index 0000000000..ffb5f0fbff --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_nl.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=DOD5015-archiefstuk +label.set.rm-metadata-dod-scannedRecord=Gescand archiefstuk +label.set.rm-metadata-dod-pdfRecord=PDF-archiefstuk +label.set.rm-metadata-dod-digitalPhotographRecord=Digitaal fotoarchiefstuk +label.set.rm-metadata-dod-webRecord=Web-archiefstuk diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_pt_BR.properties new file mode 100644 index 0000000000..43a661e505 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_pt_BR.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=Documento arquiv\u00edstico DOD5015 +label.set.rm-metadata-dod-scannedRecord=Documento arquiv\u00edstico escaneado +label.set.rm-metadata-dod-pdfRecord=Arquivo PDF +label.set.rm-metadata-dod-digitalPhotographRecord=Documento arquiv\u00edstico fotogr\u00e1fico digital +label.set.rm-metadata-dod-webRecord=Documento arquiv\u00edstico da Web diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_ru.properties new file mode 100644 index 0000000000..64ec0732f6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_ru.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=\u0417\u0430\u043f\u0438\u0441\u044c DOD5015 +label.set.rm-metadata-dod-scannedRecord=\u041e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +label.set.rm-metadata-dod-pdfRecord=\u0417\u0430\u043f\u0438\u0441\u044c PDF +label.set.rm-metadata-dod-digitalPhotographRecord=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 +label.set.rm-metadata-dod-webRecord=\u0412\u0435\u0431-\u0437\u0430\u043f\u0438\u0441\u044c diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_zh_CN.properties new file mode 100644 index 0000000000..30e41b2abf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/dod5015/messages/dod5015_zh_CN.properties @@ -0,0 +1,5 @@ +label.set.rm-metadata-dod-dod5015record=DOD5015 \u8bb0\u5f55 +label.set.rm-metadata-dod-scannedRecord=\u626b\u63cf\u7684\u8bb0\u5f55 +label.set.rm-metadata-dod-pdfRecord=PDF \u8bb0\u5f55 +label.set.rm-metadata-dod-digitalPhotographRecord=\u6570\u7801\u7167\u7247\u8bb0\u5f55 +label.set.rm-metadata-dod-webRecord=Web \u8bb0\u5f55 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm.properties new file mode 100644 index 0000000000..c132b9ab85 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=File Plan +page.rmDocumentLibrary.description=Records Management File Plan +page.rmSearch.title=Records Search +page.rmSearch.description=Records Search page +page.rmSiteDashboard.title=Records Management Site Dashboard +page.rmSiteDashboard.description=Records Management site dashboard page +page.rmAudit.title=Audit Log +page.rmAudit.description=Audit Log page +page.rmNewReference.title=New Reference +page.rmNewReference.description=New Reference between records +page.rmDispositionEdit.title=Edit Retention Schedule +page.rmDispositionEdit.description=Page for editing the retention schedule +page.rmPermissions.title=Manage Permissions +page.rmPermissions.description=Page for managing permissions +page.rmConsole.title=RM Admin Tools +page.rmConsole.description=Records Management Administration Tools + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Record Series Details +page.rmRecordSeriesDetails.description=Record Series Details page for Records Management +page.rmRecordCategoryDetails.title=Record Category Details +page.rmRecordCategoryDetails.description=Record Category Details page for Records Management +page.rmRecordFolderDetails.title=Record Folder Details +page.rmRecordFolderDetails.description=Record Folder Details page for Records Management + +## Forms +label.set.idStatus=Identification and Status +label.set.general=General +label.set.record=Record +label.set.correspondence=Correspondence +label.set.security=Security +label.set.vitalRecord=Vital Record +label.set.disposition=Retention Schedule +label.set.customMetadata=Custom Properties +label.set.recordVersion=Record Version +label.set.recordFolder=Record Folder +label.set.recordCategory=Record Category +label.hold.reason=Reason +label.hold.delete.empty=Delete Hold When Empty +label.recordLevelDisposition=Applied to +label.record=Record +label.folder=Record Folder +label.declared=Completed +label.recordType=Record Type +label.seriesIdentifier=Record Series ID +label.categoryIdentifier=Record Category ID +label.folderIdentifier=Record Folder ID +label.recordIdentifier=Record ID +label.dispositionInstructions=Retention Instructions +label.dispositionAsOfDate=Disposition as of Date +label.physicalSize=Physical Size +label.numberOfCopies=Number of Copies +label.storageLocation=Storage Location +label.shelf=Shelf +label.file=File +label.box=Box +label.versionDescription=Version Description +label.VersionLabel=Version Label + +## Common Property Selector +label.menu.content=Content +label.menu.records=Record +label.menu.disposition=Retention Schedule +label.menu.specialtypes=Special Types +label.menu.imap=IMAP +label.menu.custom=Custom Properties + +## Buttons +button.reject.record=Reject Record +button.request-info=Request Information + +## Pop-up Messages +message.confirm.delete.title=Delete Confirmation +message.confirm.delete=Are you sure you want to delete ''{0}''? +message.confirm.destroy.title=Destroy Confirmation +message.confirm.destroy=Are you sure you want to destroy ''{0}''? +message.confirm.destroyMultiple=Are you sure you want to destroy the {0} selected files? +message.confirm2.destroy.title=Destroy Confirmation +message.confirm2.destroy=The content for the file will be permanently deleted, are you sure you want to continue? +message.confirm2.destroyMultiple=The content for the files will be permanently deleted, are you sure you want to continue? +message.confirm.hide.record.title=Hide Record +message.confirm.hide.record=This file has been made a record. Click OK to hide it so that it can't be seen here. +message.select=Select... +message.pdf-record-fonts.title=PDF Records: Embedded Font Check +message.pdf-record-fonts.accession=Check that any PDF records just accessioned include the applicable embedded fonts. +message.pdf-record-fonts.transfer=Check that any PDF records just transferred include the applicable embedded fonts. +message.pdf-record-fonts.unknown=If the transfer or accession included PDF records, you should check that the applicable embedded fonts have been included. +message.request-info-success=Information requested successfully +message.request-info-failure=We hit a problem with the information request. +message.confirm.delete-hold.title=Delete Hold +message.confirm.delete-hold=If you delete hold ''{0}'' then all the items it's holding will be released. +message.confirm.close-rejected-record.title=Confirm +message.confirm.close-rejected-record=If you remove the rejected record warning then the options to declare the file as a record will be available again. +message.confirm.unlink.title=Unlink Confirmation +message.confirm.unlink.text=Are you sure you want to unlink the record? +message.confirm.close-child-classification-complete.title=Child Classifying is complete +message.confirm.close-child-classification-complete=Are you sure you want to hide this message? + +## Admin Console +message.admin-console-access-denied=You need additional permissions to access this page. Check with your I.T. Dept. + +# Document path +path.fileplan=File Plan + +## File Plan Actions +actions.more=More... +actions.accession=Accession +actions.close-folder=Close Folder +actions.copy-to=Copy to... +actions.cutoff=Cut Off +actions.declare=Complete Record +actions.delete=Delete +actions.destroy=Destroy +actions.download=Download +actions.download-zip=Download Zip +actions.edit-details=Edit Metadata +actions.edit-disposition-as-of-date=Edit Retention Date +actions.edit-disposition-schedule=Edit Retention Schedule +actions.edit-reason=Edit Hold Details +actions.edit-review-as-of-date=Edit Review Date +actions.file-report=File Report +actions.link-to=Link to... +actions.unlink-from=Unlink Record +actions.file-to=File to... +actions.manage-permissions=Manage Permissions +actions.move-to=Move to... +actions.open-folder=Reopen Folder +actions.review-all=Review All +actions.reviewed=Reviewed +actions.add-record-metadata=Add Record Metadata +actions.split-email=Split Email Attachments +actions.transfer=Transfer +actions.transfer-complete=Complete Transfer +actions.undeclare=Reopen Record +actions.undo-cutoff=Undo Cut Off +actions.create-disposition-schedule=Create Retention Schedule +actions.upload-new-version=Upload New Version +actions.view-details=View Details +actions.view-audit-log=View Audit Log +actions.declare-file-to=File as Record +actions.declare-file-version-to=File Version as Record +actions.hide-record=Hide Record +actions.reject=Reject +actions.request-info=Request Information +actions.file-destruction-report=Generate Destruction Report +actions.end-retention=End Retention +action.edit.hold=Edit Hold +actions.delete.hold=Delete Hold +actions.add-to-hold=Add to Hold +actions.remove-from-hold=Remove from Hold +actions.file-hold-report=Generate Hold Report +actions.move-dm-record=Move Record +actions.recorded-version-config=Auto-Declare Options +actions.add-relationship=Add Relationship + +## File Plan Action Outcomes +message.multi-select={0} selected items +message.accession.failure=Couldn't accession ''{0}''. Contact your I.T. Dept. +message.accession.success=''{0}'' successfully accessioned +message.accession-complete.failure=Couldn't complete accession ''{0}''. Contact your I.T. Dept. +message.accession-complete.success=''{0}'' accession completed +message.close.failure=Couldn't close ''{0}''. Contact your I.T. Dept. +message.close.success=''{0}'' successfully closed +message.cutoff.failure=Couldn't cut off ''{0}''. Contact your I.T. Dept. +message.cutoff.success=''{0}'' successfully cut off +message.declare.failure=Couldn't complete ''{0}'' record +message.declare.failure.more=The record has metadata that needs to be completed. +message.declare.success=''{0}'' was completed +message.delete.failure=Couldn't delete ''{0}''. Try speaking with your I.T. Dept. +message.delete.success=''{0}'' successfully deleted +message.destroy.failure=Couldn't destroy ''{0}''. Contact your I.T. Dept. +message.destroy.success=''{0}'' successfully destroyed +message.edit-disposition-as-of-date.title=Edit Retention Date +message.edit-disposition-as-of-date.failure=Couldn't update retention as of date. Contact your I.T. Dept. +message.edit-disposition-as-of-date.success=Successfully updated retention as of date for ''{0}'' +message.edit-hold.reason.label=Reason: +message.edit-hold.title=Update Hold Details +message.edit-hold.failure=Couldn't update hold details. Contact your I.T. Dept. +message.edit-hold.success=Successfully updated hold +message.edit-review-as-of-date.title=Edit Review Date +message.edit-review-as-of-date.failure=Couldn't update review as of date. Contact your I.T. Dept. +message.edit-review-as-of-date.success=Successfully updated review as of date for ''{0}'' +message.open-folder.failure=Couldn't open record folder ''{0}''. Contact your I.T. Dept. +message.open-folder.success=Record folder ''{0}'' was opened +message.review-all.failure=Couldn't review records in folder ''{0}''. Contact your I.T. Dept. +message.review-all.success=Records in folder ''{0}'' have been reviewed +message.reviewed.failure=Couldn't review ''{0}''. Contact your I.T. Dept. +message.reviewed.success=''{0}'' successfully reviewed +message.split-email.failure=Couldn't separate attachments from ''{0}'' +message.split-email.success=Successfully separated attachments from ''{0}''. Contact your I.T. Dept. +message.transfer.failure=Couldn't transfer ''{0}''. Contact your I.T. Dept. +message.transfer.success=''{0}'' successfully transferred +message.transfer-complete.failure=Couldn't complete transfer ''{0}''. Contact your I.T. Dept. +message.transfer-complete.success=''{0}'' transfer has been completed +message.undeclare.failure=Couldn't reopen ''{0}''. Contact your I.T. Dept. +message.undeclare.success=''{0}'' is no longer a complete record +message.undo-cutoff.failure=Couldn't undo cut off for ''{0}''. Contact your I.T. Dept. +message.undo-cutoff.success=Undo cut off on ''{0}'' +message.create-disposition-schedule.failure=Couldn't create retention schedule for ''{0}''. Contact your I.T. Dept. +message.create-disposition-schedule.success=Retention schedule for ''{0}'' created +message.create-record.success=This file has been made a record and has limited actions available +message.create-record.failure=Couldn't declare as record. Contact your I.T. Dept. +message.declare-version-as-record.success=This version of the file has been declared as record +message.declare-version-as-record.failure=Couldn't declare version as record. Contact your I.T. Dept. +message.hide-record.success=Record ''{0}'' successfully hidden +message.hide-record.failure=Couldn't hide record ''{0}''. Contact your I.T. Dept. +message.reject.reason=Reason: +message.reject.title=Reason for Rejection +message.reject.failure=Couldn't reject ''{0}''. Contact your I.T. Dept. +message.reject.success=''{0}'' rejected +message.file-destruction-report.failure=Couldn't generate destruction report. Contact your I.T. Dept. +message.file-destruction-report.success=Destruction report generated +message.end-retention.failure=Couldn't end retention. Contact your I.T. Dept. +message.end-retention.success=Retention ended +message.file-success=Successfully filed report as ''{0}'' +message.file-failure=Couldn't complete the file operation. Contact your I.T. Dept. +message.file-hold-report.failure=Couldn't generate hold report. Contact your I.T. Dept. +message.file-hold-report.success=Hold report generated +message.delete-hold.failure=Couldn't delete hold. Contact your I.T. Dept. +message.delete-hold.success=Hold deleted +message.moveDmRecord.failure=Couldn't move record ''{0}''. Contact your I.T. Dept. +message.moveDmRecord.success=Record ''{0}'' successfully moved +message.recordedVersionConfig.success=Auto-declare options set successfully +message.recordedVersionConfig.failure=Couldn't set auto-declare options. Contact your I.T. Dept. +message.unlink.success=Record successfully unlinked +message.unlink.failure=Couldn't unlink record. Contact your I.T. Dept. + +## File Plan Status Indicators +status.active-workflows=Belongs to {0} active workflows +status.rm-accession=Accession Pending +status.rm-accessioned=Accessioned +status.rm-closed=Closed +status.rm-cutoff=Cut Off +status.rm-cutoff-folder=Cut Off +status.rm-destroyed=Destroyed +status.rm-frozen=On Hold +status.rm-multi-parent=Linked in Multiple Record Folders +status.rm-open=Open +status.rm-transfer=Transfer Pending +status.rm-transferred=Transferred +status.rm-vital-record=Vital Record +status.rm-rejected-record=Rejected +status.rm-disposition-schedule=Record Category has a retention schedule defined +status.rm-digital-photograph-record=Digital Photograph Record +status.rm-pdf-record=PDF Record +status.rm-scanned-record=Scanned Record +status.rm-web-record=Web Record +status.rm-is-record=Record +status.rules=Folder has rules applied +status.rm-version-record=Version Record +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=All revisions will be recorded +status.rm-recorded-version-history-major-revisions=Only major revisions will be recorded + +# Exif +status.exif=EXIF metadata available +status.geographic=Geolocation metadata available +status.dod5015-digital-photograph-record=Digital Photograph Record +status.dod5015-pdf-record=PDF Record +status.dod5015-scanned-record=Scanned Record +status.dod5015-web-record=Web Record + +# RMA model metadata fields +label.all=All +label.keywords=Keywords (text and name) +label.identifier=ID +label.dateFiled=Date Filed +label.publicationDate=Publication Date +label.originator=Originator +label.originatingOrganization=Originating Organization +label.mediaType=Media Type +label.format=Format +label.dateReceived=Date Received +label.supplementalMarkingList=Supplemental Marking List +label.vitalRecord=Vital Record +label.reviewDate=Review Date +label.address=Addressee +label.otherAddress=Other Addressee +label.unpublishedUpdates=Unpublished Updates +label.publishInProgress=Publish In Progress + +# IMAP model metadata fields +label.imap.threadIndex=IMAP ThreadIndex +label.imap.messageFrom=IMAP Message From +label.imap.messageTo=IMAP Message To +label.imap.messageCc=IMAP Message Cc +label.imap.messageSubject=IMAP Message Subject +label.imap.dateReceived=IMAP Date Received +label.imap.dateSent=IMAP Date Sent + +# DOD model metadata fields +label.dod.scannedFormatVersion=Image Format and Version +label.dod.resolutionX=Image Resolution X +label.dod.resolutionY=Image Resolution Y +label.dod.scannedBitDepth=Scanned Bit Depth +label.dod.producingApplication=Producing Application +label.dod.producingApplicationVersion=Producing Application Version +label.dod.pdfVersion=PDF Version +label.dod.creatingApplication=Creating Application +label.dod.documentSecuritySettings=Document Security Settings +label.dod.caption=Caption +label.dod.photographer=Photographer +label.dod.copyright=Copyright +label.dod.bitDepth=Bit Depth +label.dod.imageSizeX=Image Size X +label.dod.imageSizeY=Image Size Y +label.dod.imageSource=Image Source +label.dod.compression=Compression +label.dod.iccIcmProfile=ICC/ICM Profile +label.dod.exifInformation=EXIF Information +label.dod.webFileName=Web File Name +label.dod.webPlatform=Web Platform +label.dod.webSiteName=Web Site Name +label.dod.webSiteURL=Web Site URL +label.dod.captureMethod=Capture Method +label.dod.captureDate=Capture Date +label.dod.contact=Contact +label.dod.contentManagementSystem=Content Management System + +# RM Admin Console tools +tool.rm-define-roles.label=Define Roles +tool.rm-define-roles.description=Create and edit roles +tool.rm-custom-metadata.label=Custom Metadata +tool.rm-custom-metadata.description=Custom metadata +tool.rm-list-of-values.label=List of Values +tool.rm-list-of-values.description=List of values definitions +tool.rm-references.label=Relationships +tool.rm-references.description=Relationships definitions +tool.rm-events.label=Events +tool.rm-events.description=Event definitions +tool.rm-audit.label=Audit +tool.rm-audit.description=Records Management Audit +tool.rm-email-mappings.label=Email Mappings +tool.rm-email-mappings.description=Email Mappings definitions +tool.rm-user-rights.label=User Rights Report +tool.rm-user-rights.description=User rights report +tool.rm-users-and-groups.label=Users and Groups +tool.rm-users-and-groups.description=Users and groups + +## Buttons +button.sort.ascending=Sort Ascending +button.sort.descending=Sort Descending +button.folders.show=Show Folders +button.folders.hide=Hide Folders +button.view.simple=Simple View +button.view.detailed=Detailed View + +## Drop-down Menus +menu.select=Select +menu.select.all=All +menu.select.none=None +menu.select.invert=Invert Selection +menu.select.folders=Folders +menu.select.documents=Documents +menu.select.records=Records +menu.select.undeclaredRecords=Incomplete Records +menu.select.recordFolders=Record Folders +menu.select.recordCategories=Record Categories + +## Metadata Fields +# Generic +details.created.on=Created on +details.created.by=Created by +details.modified.on=Modified on +details.modified.by=Modified by +details.by=By +details.size=Size +details.description=Description +details.description.none=(None) +# Record Category +details.category.identifier=Record Category ID +details.category.disposition-authority=Retention Authority +details.category.disposition-instructions=Retention Instructions +details.category.vital-record-indicator=Vital Record Indicator +# Record Folder +details.folder.identifier=Record Folder ID +details.folder.vital-record-indicator=Vital Record Indicator +# Record +details.record.identifier=Unique Record ID +details.record.date-filed=Date Filed +details.record.publication-date=Publication Date +details.record.originator=Originator +details.record.originating-organization=Originating Organization +details.version.label=Version +# Incomplete Record +details.undeclared-record.info=Incomplete Record +# Rejected Record +details.rejected-record.info=Rejected Record +# Transfer Container +details.transfer-container.title=Transfer {0} +details.transfer-container.is-accession=Note: Transfer type is Accession +# Hold Container +details.hold.title=Hold created on {0} +details.hold.title.date-format=dd mmmm yyyy 'at' HH:MM:ss +details.hold.reason=Reason for Hold +details.hold.reason.none=Not Available +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=Folder ID + +## File Upload (upload new version) +label.filter-description=Same type as {0} + +## Empty List +no.items.title=No items + +## Tips +tip.insitu-rename=Rename +tip.insitu-tag=Tag + +## Help panels, including Drag and Drop +show.folders=Show {0} subfolder(s) + +## Create site dialog +description.recordsManagementSite=Records Management Site +title.recordsManagementSite=Records Management +type.recordsManagementSite=Records Management Site +compliance.standard=Standard +compliance.dod5015=DoD 5015.2-STD +label.compliance=Compliance + +## Console title +link.managementConsole=Management Console + +## Rules +customise.reject.text=Reject records with comment ''{param.reason}'' +customise.requestInfo.text=Creates a workflow task for a list of specified people and requests the following info ''{param.requestedInfo}'' +customise.sendEmail.text=Send email with subject ''{param.subject}'' to specified recipients + +## Records Management Admin Tools +header.rm-console.label=Records Management... +header.rm-management.label=Management Console +header.rm-management.description=Management Console + +## Request Info Workflow +rm.wf.information-requested-for-record=Information requested for record +rm.wf.request-information-from=Request information from +rm.wf.requested-information=Requested information +rm.wf.record=Record +rm.wf.selected-users-and-groups=Users and groups +rm.wf.give-details=Provide information +rm.wf.message=Message +rm.wf.details=Details + +## Text length validation +message.max.text.length.validation=Enter text less than than {max} characters + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=Select a review period + +## Forms +form.control.object-picker.items-list.empty=No Items +form.control.object-picker.items-list.loading=Loading ... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=Title +file-to.substitution.node.cm.description.label=Description +file-to.substitution.node.cm.accessed.label=Last accessed +file-to.substitution.node.cm.created.label=When created +file-to.substitution.node.cm.creator.label=Creator +file-to.substitution.node.cm.modified.label=Last modified +file-to.substitution.node.cm.modifier.label=Modifier +file-to.substitution.node.cm.name.label=Name +file-to.substitution.node.rma.origionalName.label=Original node name +file-to.substitution.node.rma.dateFiled.label=Date filed +file-to.substitution.node.rma.location.label=Location +file-to.substitution.node.rma.dbUniquenessId.label=Unique database ID +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=Node ID +file-to.substitution.node.sys.store-identifier.label=Store ID +file-to.substitution.node.sys.store-protocol.label=Store protocol +file-to.substitution.date.day.short.label=Short Day (e.g. Mon) +file-to.substitution.date.day.label=Day (e.g. Mon) +file-to.substitution.date.day.long.label=Long Day (e.g. Monday) +file-to.substitution.date.day.number.label=Day Number (e.g. 1) +file-to.substitution.date.day.year.label=Day of Year (e.g. 216) +file-to.substitution.date.day.month.label=Day of Month (e.g. 18) +file-to.substitution.date.month.short.label=Short Month (e.g. Jan) +file-to.substitution.date.month.label=Month (e.g. Jan) +file-to.substitution.date.month.long.label=Long Month (e.g. January) +file-to.substitution.date.month.number.label=Month Number (e.g. 01) +file-to.substitution.date.year.short.label=Short Year (e.g. 14) +file-to.substitution.date.year.label=Year (e.g. 14) +file-to.substitution.date.year.long.label=Long Year (e.g. 2014) +file-to.substitution.date.year.week.label=Week of Year (e.g. 31) + +## Banner icon messages +banner.rejected-record.info=See information about the rejected record +banner.rejected-record.close=Remove the rejected record warning +banner.child-classification-in-progress.info=Child Classifying in progress +banner.child-classification-complete.info=Child Classifying complete +banner.child-classification-complete.close=Remove the message + +## Recordable Versions +label.destroyed-version=Version Destroyed +label.recorded-version=Recorded Version \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_de.properties new file mode 100644 index 0000000000..689ace4c73 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_de.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Ablageplan +page.rmDocumentLibrary.description=Records Management Ablageplan +page.rmSearch.title=Record-Suche +page.rmSearch.description=Seite 'Record-Suche' +page.rmSiteDashboard.title=Records Management Site-Dashboard +page.rmSiteDashboard.description=Seite 'Records Management Site-Dashboard' +page.rmAudit.title=Audit-Protokoll +page.rmAudit.description=Seite 'Audit-Protokoll' +page.rmNewReference.title=Neue Referenz +page.rmNewReference.description=Neue Referenz zwischen Records +page.rmDispositionEdit.title=Aufbewahrungsplan bearbeiten +page.rmDispositionEdit.description=Seite zum Bearbeiten des Aufbewahrungsplans +page.rmPermissions.title=Berechtigungen verwalten +page.rmPermissions.description=Seite zum Verwalten von Berechtigungen +page.rmConsole.title=RM Admin-Tools +page.rmConsole.description=Records Management Administratortools + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Details zur Record-Serie +page.rmRecordSeriesDetails.description=Seite 'Details zur Record-Serie' f\u00fcr Records Management +page.rmRecordCategoryDetails.title=Details zur Record-Kategorie +page.rmRecordCategoryDetails.description=Seite 'Details zur Record-Kategorie' f\u00fcr Records Management +page.rmRecordFolderDetails.title=Details zum Record-Ordner +page.rmRecordFolderDetails.description=Seite 'Details zum Record-Ordner' f\u00fcr Records Management + +## Forms +label.set.idStatus=Identifizierung und Status +label.set.general=Allgemein +label.set.record=Record +label.set.correspondence=Korrespondenz +label.set.security=Sicherheit +label.set.vitalRecord=Besonders relevanter Record +label.set.disposition=Aufbewahrungsplan +label.set.customMetadata=Benutzerdefinierte Eigenschaften +label.set.recordVersion=Record-Version +label.set.recordFolder=Record-Ordner +label.set.recordCategory=Record-Kategorie +label.hold.reason=Grund +label.hold.delete.empty=Legal Hold l\u00f6schen, wenn leer +label.recordLevelDisposition=Angewendet auf +label.record=Record +label.folder=Record-Ordner +label.declared=Abgeschlossen +label.recordType=Record-Typ +label.seriesIdentifier=ID der Record-Serie +label.categoryIdentifier=ID der Record-Kategorie +label.folderIdentifier=ID des Record-Ordners +label.recordIdentifier=Record-ID +label.dispositionInstructions=Aufbewahrungsanweisungen +label.dispositionAsOfDate=Startdatum der Aufbewahrung +label.physicalSize=Physikalische Gr\u00f6\u00dfe +label.numberOfCopies=Anzahl der Kopien +label.storageLocation=Speicherort +label.shelf=Regal +label.file=Datei +label.box=Feld +label.versionDescription=Versionsbeschreibung +label.VersionLabel=Versionsbezeichnung + +## Common Property Selector +label.menu.content=Inhalt +label.menu.records=Record +label.menu.disposition=Aufbewahrungsplan +label.menu.specialtypes=Sondertypen +label.menu.imap=IMAP +label.menu.custom=Benutzerdefinierte Eigenschaften + +## Buttons +button.reject.record=Record ablehnen +button.request-info=Informationen anfordern + +## Pop-up Messages +message.confirm.delete.title=Best\u00e4tigung l\u00f6schen +message.confirm.delete=M\u00f6chten Sie ''{0}'' wirklich l\u00f6schen? +message.confirm.destroy.title=Best\u00e4tigung vernichten +message.confirm.destroy=M\u00f6chten Sie ''{0}'' wirklich vernichten? +message.confirm.destroyMultiple=M\u00f6chten Sie die {0} ausgew\u00e4hlten Dateien wirklich vernichten? +message.confirm2.destroy.title=Best\u00e4tigung vernichten +message.confirm2.destroy=Der Inhalt f\u00fcr die Datei wird dauerhaft gel\u00f6scht. M\u00f6chten Sie wirklich fortfahren? +message.confirm2.destroyMultiple=Der Inhalt f\u00fcr die Dateien wird dauerhaft gel\u00f6scht. M\u00f6chten Sie wirklich fortfahren? +message.confirm.hide.record.title=Record ausblenden +message.confirm.hide.record=Diese Datei wurde als Record deklariert. Klicken Sie auf 'OK', damit sie hier nicht angezeigt wird. +message.select=Ausw\u00e4hlen... +message.pdf-record-fonts.title=PDF-Records: Pr\u00fcfung eingebetteter Schriften +message.pdf-record-fonts.accession=\u00dcberpr\u00fcfen Sie, ob alle soeben f\u00fcr eine Aufnahme verarbeiteten PDF-Records die entsprechenden eingebetteten Schriften beinhalten. +message.pdf-record-fonts.transfer=\u00dcberpr\u00fcfen Sie, ob alle soeben \u00fcbertragenen PDF-Records die entsprechenden eingebetteten Schriften beinhalten. +message.pdf-record-fonts.unknown=Wenn die \u00dcbertragung oder Aufnahme PDF-Records umfasst hat, sollten Sie \u00fcberpr\u00fcfen, ob die entsprechenden eingebetteten Schriften enthalten waren. +message.request-info-success=Informationen erfolgreich angefordert +message.request-info-failure=Bei der Informationsanfrage ist ein Problem aufgetreten. +message.confirm.delete-hold.title=Legal Hold l\u00f6schen +message.confirm.delete-hold=Wenn Sie den Legal Hold ''{0}'' l\u00f6schen, werden alle darin enthaltenen Elemente freigegeben. +message.confirm.close-rejected-record.title=Best\u00e4tigen +message.confirm.close-rejected-record=Wenn Sie den Warnung f\u00fcr den abgelehnten Record entfernen, sind die Optionen f\u00fcr die Deklaration der Datei als Record wieder verf\u00fcgbar. +message.confirm.unlink.title=Aufheben der Verkn\u00fcpfung best\u00e4tigen +message.confirm.unlink.text=M\u00f6chten Sie die Verkn\u00fcpfung zum Record wirklich aufheben? +message.confirm.close-child-classification-complete.title=Klassifizierung untergeordneter Elemente abgeschlossen +message.confirm.close-child-classification-complete=M\u00f6chten Sie diese Nachricht wirklich ausblenden? + +## Admin Console +message.admin-console-access-denied=Sie ben\u00f6tigen zus\u00e4tzliche Berechtigungen, um auf diese Seite zuzugreifen. Kontakten Sie Ihre IT-Abteilung. + +# Document path +path.fileplan=Ablageplan + +## File Plan Actions +actions.more=Mehr... +actions.accession=Aufnahme +actions.close-folder=Ordner schlie\u00dfen +actions.copy-to=Kopieren nach... +actions.cutoff=Trennen +actions.declare=Record abschlie\u00dfen +actions.delete=L\u00f6schen +actions.destroy=Vernichten +actions.download=Herunterladen +actions.download-zip=ZIP herunterladen +actions.edit-details=Metadaten bearbeiten +actions.edit-disposition-as-of-date=Aufbewahrungsdatum bearbeiten +actions.edit-disposition-schedule=Aufbewahrungsplan bearbeiten +actions.edit-reason=Legal-Hold-Details bearbeiten +actions.edit-review-as-of-date=\u00dcberpr\u00fcfungsdatum bearbeiten +actions.file-report=Bericht ablegen +actions.link-to=Link zu... +actions.unlink-from=Verkn\u00fcpfung zu Records aufheben +actions.file-to=Ablegen unter... +actions.manage-permissions=Berechtigungen verwalten +actions.move-to=Verschieben nach... +actions.open-folder=Ordner erneut \u00f6ffnen +actions.review-all=Alle \u00fcberpr\u00fcfen +actions.reviewed=\u00dcberpr\u00fcft +actions.add-record-metadata=Record-Metadaten hinzuf\u00fcgen +actions.split-email=E-Mail-Anh\u00e4nge teilen +actions.transfer=\u00dcbertragen +actions.transfer-complete=\u00dcbertragung abschlie\u00dfen +actions.undeclare=Record neu \u00f6ffnen +actions.undo-cutoff=Trennung aufheben +actions.create-disposition-schedule=Aufbewahrungsplan erstellen +actions.upload-new-version=Neue Version hochladen +actions.view-details=Details anzeigen +actions.view-audit-log=Audit-Protokoll anzeigen +actions.declare-file-to=Als Record ablegen +actions.declare-file-version-to=Version als Record ablegen +actions.hide-record=Record ausblenden +actions.reject=Ablehnen +actions.request-info=Informationen anfordern +actions.file-destruction-report=Vernichtungsprotokoll generieren +actions.end-retention=Aufbewahrung beenden +action.edit.hold=Legal Hold bearbeiten +actions.delete.hold=Legal Hold l\u00f6schen +actions.add-to-hold=Zum Legal Hold hinzuf\u00fcgen +actions.remove-from-hold=Vom Legal Hold entfernen +actions.file-hold-report=Legal-Hold-Bericht generieren +actions.move-dm-record=Record verschieben +actions.recorded-version-config=Optionen f\u00fcr automatische Deklaration +actions.add-relationship=Beziehung hinzuf\u00fcgen + +## File Plan Action Outcomes +message.multi-select={0} ausgew\u00e4hlte Elemente +message.accession.failure=''{0}'' konnte nicht aufgenommen werden. Kontakten Sie Ihre IT-Abteilung. +message.accession.success=''{0}'' erfolgreich aufgenommen. +message.accession-complete.failure=Aufnahme von ''{0}'' konnte nicht abgeschlossen werden. Kontakten Sie Ihre IT-Abteilung. +message.accession-complete.success=Aufnahme von ''{0}'' abgeschlossen. +message.close.failure=''{0}'' konnte nicht geschlossen werden. Kontakten Sie Ihre IT-Abteilung. +message.close.success=''{0}'' erfolgreich geschlossen. +message.cutoff.failure=''{0}'' konnte nicht getrennt werden. Kontakten Sie Ihre IT-Abteilung. +message.cutoff.success=''{0}'' erfolgreich getrennt +message.declare.failure=Record ''{0}'' konnte nicht abgeschlossen werden. +message.declare.failure.more=Der Record weist Metadaten auf, die abgeschlossen werden m\u00fcssen. +message.declare.success=''{0}'' wurde abgeschlossen. +message.delete.failure=''{0}'' konnte nicht gel\u00f6scht werden. Wenden Sie sich an Ihre IT-Abteilung. +message.delete.success=''{0}'' erfolgreich gel\u00f6scht. +message.destroy.failure=''{0}'' konnte nicht vernichtet werden. Kontakten Sie Ihre IT-Abteilung. +message.destroy.success=''{0}'' erfolgreich vernichtet. +message.edit-disposition-as-of-date.title=Aufbewahrungsdatum bearbeiten +message.edit-disposition-as-of-date.failure=Startdatum der Aufbewahrung konnte nicht aktualisiert werden. Kontakten Sie Ihre IT-Abteilung. +message.edit-disposition-as-of-date.success=Startdatum der Aufbewahrung f\u00fcr ''{0}'' erfolgreich aktualisiert. +message.edit-hold.reason.label=Grund: +message.edit-hold.title=Legal-Hold-Details aktualisieren +message.edit-hold.failure=Legal-Hold-Details konnten nicht aktualisiert werden. Kontakten Sie Ihre IT-Abteilung. +message.edit-hold.success=Legal Hold erfolgreich aktualisiert +message.edit-review-as-of-date.title=\u00dcberpr\u00fcfungsdatum bearbeiten +message.edit-review-as-of-date.failure=Startdatum der \u00dcberpr\u00fcfung konnte nicht aktualisiert werden. Kontakten Sie Ihre IT-Abteilung. +message.edit-review-as-of-date.success=Startdatum der \u00dcberpr\u00fcfung f\u00fcr ''{0}'' erfolgreich aktualisiert. +message.open-folder.failure=Record-Ordner ''{0}'' konnte nicht ge\u00f6ffnet werden. Kontakten Sie Ihre IT-Abteilung. +message.open-folder.success=Record-Ordner ''{0}'' wurde ge\u00f6ffnet. +message.review-all.failure=Records in Ordner ''{0}'' konnten nicht \u00fcberpr\u00fcft werden. Kontakten Sie Ihre IT-Abteilung. +message.review-all.success=Records in Ordner ''{0}'' wurden \u00fcberpr\u00fcft. +message.reviewed.failure=''{0}'' konnte nicht \u00fcberpr\u00fcft werden. Kontakten Sie Ihre IT-Abteilung. +message.reviewed.success=''{0}'' erfolgreich \u00fcberpr\u00fcft. +message.split-email.failure=Anh\u00e4nge von ''{0}'' konnten nicht getrennt werden. +message.split-email.success=Anh\u00e4nge von ''{0}'' erfolgreich getrennt. Kontakten Sie Ihre IT-Abteilung. +message.transfer.failure=''{0}'' konnte nicht \u00fcbertragen werden. Kontakten Sie Ihre IT-Abteilung. +message.transfer.success=''{0}'' erfolgreich \u00fcbertragen. +message.transfer-complete.failure=\u00dcbertragung von ''{0}'' konnte nicht abgeschlossen werden. Kontakten Sie Ihre IT-Abteilung. +message.transfer-complete.success=\u00dcbertragung von ''{0}'' wurde abgeschlossen. +message.undeclare.failure=''{0}'' konnte nicht neu ge\u00f6ffnet werden. Kontakten Sie Ihre IT-Abteilung. +message.undeclare.success=''{0}'' ist nicht l\u00e4nger ein abgeschlossener Record. +message.undo-cutoff.failure=Trennung f\u00fcr ''{0}'' konnte nicht aufgehoben werden. Kontakten Sie Ihre IT-Abteilung. +message.undo-cutoff.success=Trennung f\u00fcr ''{0}'' aufheben +message.create-disposition-schedule.failure=Aufbewahrungsplan f\u00fcr ''{0}'' konnte nicht erstellt werden. Kontakten Sie Ihre IT-Abteilung. +message.create-disposition-schedule.success=Aufbewahrungsplan f\u00fcr ''{0}'' erstellt. +message.create-record.success=Diese Datei wurde als Record deklariert. F\u00fcr sie sind nur eingeschr\u00e4nkte Aktionsm\u00f6glichkeiten verf\u00fcgbar. +message.create-record.failure=Deklarieren als Record nicht m\u00f6glich. Kontakten Sie Ihre IT-Abteilung. +message.declare-version-as-record.success=Diese Version der Datei wurde als Record deklariert. +message.declare-version-as-record.failure=Deklarieren der Version als Record nicht m\u00f6glich. Kontakten Sie Ihre IT-Abteilung. +message.hide-record.success=Record ''{0}'' erfolgreich ausgeblendet +message.hide-record.failure=Record ''{0}'' konnte nicht ausgeblendet werden. Kontakten Sie Ihre IT-Abteilung. +message.reject.reason=Grund: +message.reject.title=Grund f\u00fcr Ablehnung +message.reject.failure=''{0}'' konnte nicht abgelehnt werden. Kontakten Sie Ihre IT-Abteilung. +message.reject.success=''{0}'' abgelehnt. +message.file-destruction-report.failure=Vernichtungsprotokoll konnte nicht generiert werden. Kontakten Sie Ihre IT-Abteilung. +message.file-destruction-report.success=Vernichtungsprotokoll generiert. +message.end-retention.failure=Aufbewahrung konnte nicht beendet werden. Kontakten Sie Ihre IT-Abteilung. +message.end-retention.success=Aufbewahrung beendet +message.file-success=Bericht als ''{0}''erfolgreich abgelegt +message.file-failure=Ablageaktion konnte nicht abgeschlossen werden. Kontakten Sie Ihre IT-Abteilung. +message.file-hold-report.failure=Legal-Hold-Bericht konnte nicht generiert werden. Kontakten Sie Ihre IT-Abteilung. +message.file-hold-report.success=Legal-Hold-Bericht generiert +message.delete-hold.failure=Legal Hold konnte nicht gel\u00f6scht werden. Kontakten Sie Ihre IT-Abteilung. +message.delete-hold.success=Legal Hold gel\u00f6scht +message.moveDmRecord.failure=Record ''{0}'' konnte nicht verschoben werden. Kontakten Sie Ihre IT-Abteilung. +message.moveDmRecord.success=Record ''{0}'' erfolgreich verschoben +message.recordedVersionConfig.success=Optionen f\u00fcr automatische Deklaration erfolgreich eingerichtet +message.recordedVersionConfig.failure=Optionen f\u00fcr automatische Deklaration konnten nicht eingerichtet werden. Kontakten Sie Ihre IT-Abteilung. +message.unlink.success=Verkn\u00fcpfung zu Record erfolgreich aufgehoben +message.unlink.failure=Verkn\u00fcpfung zu Record konnte nicht aufgehoben werden. Kontakten Sie Ihre IT-Abteilung. + +## File Plan Status Indicators +status.active-workflows=Geh\u00f6rt zu {0} aktiven Workflows +status.rm-accession=Aufnahme ausstehend +status.rm-accessioned=Aufnahme durchgef\u00fchrt +status.rm-closed=Geschlossen +status.rm-cutoff=Trennen +status.rm-cutoff-folder=Trennen +status.rm-destroyed=Vernichtet +status.rm-frozen=Mit Legal Hold belegt +status.rm-multi-parent=Verkn\u00fcpft in mehreren Record-Ordnern +status.rm-open=\u00d6ffnen +status.rm-transfer=\u00dcbertragung ausstehend +status.rm-transferred=\u00dcbertragen +status.rm-vital-record=Besonders relevanter Record +status.rm-rejected-record=Abgelehnt +status.rm-disposition-schedule=Record-Kategorie verf\u00fcgt \u00fcber einen definierten Aufbewahrungsplan. +status.rm-digital-photograph-record=Record - Digitales Bild +status.rm-pdf-record=PDF-Record +status.rm-scanned-record=Eingescannter Record +status.rm-web-record=Web-Record +status.rm-is-record=Record +status.rules=Diesem Ordner sind Regeln zugeordnet +status.rm-version-record=Versions-Record +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Alle Revisionen werden als Record deklariert +status.rm-recorded-version-history-major-revisions=Nur Hauptrevisionen werden als Record deklariert + +# Exif +status.exif=EXIF-Metadaten verf\u00fcgbar +status.geographic=Geolocation-Metadaten verf\u00fcgbar +status.dod5015-digital-photograph-record=Record - Digitales Bild +status.dod5015-pdf-record=PDF-Record +status.dod5015-scanned-record=Eingescannter Record +status.dod5015-web-record=Web-Record + +# RMA model metadata fields +label.all=Alle +label.keywords=Stichworte (Text und Name) +label.identifier=ID +label.dateFiled=Ablagedatum +label.publicationDate=Ver\u00f6ffentlichungsdatum +label.originator=Ersteller +label.originatingOrganization=Erstellende Organisation +label.mediaType=Medientyp +label.format=Format +label.dateReceived=Eingangsdatum +label.supplementalMarkingList=Zus\u00e4tzliche Markierungsliste +label.vitalRecord=Besonders relevanter Record +label.reviewDate=\u00dcberpr\u00fcfungsdatum +label.address=Empf\u00e4nger +label.otherAddress=Anderer Empf\u00e4nger +label.unpublishedUpdates=Nicht ver\u00f6ffentlichte Aktualisierungen +label.publishInProgress=Laufende Ver\u00f6ffentlichung + +# IMAP model metadata fields +label.imap.threadIndex=IMAP-Thread-Index +label.imap.messageFrom=IMAP-Nachricht von +label.imap.messageTo=IMAP-Nachricht an +label.imap.messageCc=IMAP-Nachricht Cc +label.imap.messageSubject=IMAP-Nachricht Betreff +label.imap.dateReceived=IMAP-Eingangsdatum +label.imap.dateSent=IMAP-Sendedatum + +# DOD model metadata fields +label.dod.scannedFormatVersion=Bildformat und Version +label.dod.resolutionX=Bildaufl\u00f6sung X +label.dod.resolutionY=Bildaufl\u00f6sung Y +label.dod.scannedBitDepth=Bittiefe des Scans +label.dod.producingApplication=Quellanwendung +label.dod.producingApplicationVersion=Version der Quellanwendung +label.dod.pdfVersion=PDF-Version +label.dod.creatingApplication=Quellsystem +label.dod.documentSecuritySettings=Sicherheitseinstellungen des Dokuments +label.dod.caption=Beschriftung +label.dod.photographer=Fotograf +label.dod.copyright=Copyright +label.dod.bitDepth=Bittiefe +label.dod.imageSizeX=Bildgr\u00f6\u00dfe X +label.dod.imageSizeY=Bildgr\u00f6\u00dfe Y +label.dod.imageSource=Bildquelle +label.dod.compression=Komprimierung +label.dod.iccIcmProfile=ICC/ICM-Profil +label.dod.exifInformation=EXIF-Informationen +label.dod.webFileName=Webdateiname +label.dod.webPlatform=Webplattform +label.dod.webSiteName=Website-Name +label.dod.webSiteURL=Website-URL +label.dod.captureMethod=Erfassungsmethode +label.dod.captureDate=Erfassungsdatum +label.dod.contact=Kontakt +label.dod.contentManagementSystem=Content-Management-System + +# RM Admin Console tools +tool.rm-define-roles.label=Rollen definieren +tool.rm-define-roles.description=Rollen erstellen und bearbeiten +tool.rm-custom-metadata.label=Benutzerdefinierte Metadaten +tool.rm-custom-metadata.description=Benutzerdefinierte Metadaten +tool.rm-list-of-values.label=Werteliste +tool.rm-list-of-values.description=Definitionen von Werteliste +tool.rm-references.label=Beziehungen +tool.rm-references.description=Beziehungsdefinitionen +tool.rm-events.label=Ereignisse +tool.rm-events.description=Ereignisdefinitionen +tool.rm-audit.label=Audit +tool.rm-audit.description=Audit f\u00fcr Records Management +tool.rm-email-mappings.label=E-Mail-Zuordnungen +tool.rm-email-mappings.description=Definitionen von E-Mail-Zuordnungen +tool.rm-user-rights.label=Berichte \u00fcber Benutzerrechte +tool.rm-user-rights.description=Berichte \u00fcber Benutzerrechte +tool.rm-users-and-groups.label=Benutzer und Gruppen +tool.rm-users-and-groups.description=Benutzer und Gruppen + +## Buttons +button.sort.ascending=Aufsteigend sortieren +button.sort.descending=Absteigend sortieren +button.folders.show=Ordner anzeigen +button.folders.hide=Ordner ausblenden +button.view.simple=Einfache Ansicht +button.view.detailed=Detaillierte Ansicht + +## Drop-down Menus +menu.select=Ausw\u00e4hlen +menu.select.all=Alle +menu.select.none=Keine +menu.select.invert=Auswahl umkehren +menu.select.folders=Ordner +menu.select.documents=Dokumente +menu.select.records=Records +menu.select.undeclaredRecords=Nicht abgeschlossene Records +menu.select.recordFolders=Record-Ordner +menu.select.recordCategories=Record-Kategorien + +## Metadata Fields +# Generic +details.created.on=Erstellt am +details.created.by=Erstellt von +details.modified.on=Ge\u00e4ndert am +details.modified.by=Ge\u00e4ndert von: +details.by=Von +details.size=Gr\u00f6\u00dfe +details.description=Beschreibung +details.description.none=(Keine) +# Record Category +details.category.identifier=ID der Record-Kategorie +details.category.disposition-authority=Aufbewahrungs-Authority +details.category.disposition-instructions=Aufbewahrungsanweisungen +details.category.vital-record-indicator=Kennzeichen f\u00fcr besonders relevante Records +# Record Folder +details.folder.identifier=ID des Record-Ordners +details.folder.vital-record-indicator=Kennzeichen f\u00fcr besonders relevante Records +# Record +details.record.identifier=Eindeutige Record-ID +details.record.date-filed=Ablagedatum +details.record.publication-date=Ver\u00f6ffentlichungsdatum +details.record.originator=Ersteller +details.record.originating-organization=Erstellende Organisation +details.version.label=Version +# Incomplete Record +details.undeclared-record.info=Nicht abgeschlossener Record +# Rejected Record +details.rejected-record.info=Abgelehnter Record +# Transfer Container +details.transfer-container.title={0} \u00fcbertragen +details.transfer-container.is-accession=Hinweis: \u00dcbertragungstyp ist 'Aufnahme'. +# Hold Container +details.hold.title=Legal Hold erstellt am {0} +details.hold.title.date-format=dd mmmm yyyy 'um' HH:MM:ss +details.hold.reason=Grund f\u00fcr Legal Hold +details.hold.reason.none=Nicht verf\u00fcgbar +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=Ordner-ID + +## File Upload (upload new version) +label.filter-description=Gleicher Typ wie {0} + +## Empty List +no.items.title=Keine Elemente + +## Tips +tip.insitu-rename=Umbenennen +tip.insitu-tag=Tag + +## Help panels, including Drag and Drop +show.folders={0} Unterordner anzeigen + +## Create site dialog +description.recordsManagementSite=Seite f\u00fcr Records Management +title.recordsManagementSite=Records Management +type.recordsManagementSite=Seite f\u00fcr Records Management +compliance.standard=Standard +compliance.dod5015=DoD 5015.2-STD +label.compliance=Compliance + +## Console title +link.managementConsole=Verwaltungskonsole + +## Rules +customise.reject.text=Records mit Kommentar ''{param.reason}'' ablehnen +customise.requestInfo.text=Erstellt eine Workflow-Aufgabe f\u00fcr eine Liste festgelegter Benutzer und fordert die folgenden Informationen ''{param.requestedInfo}'' an. +customise.sendEmail.text=E-Mail mit dem Betreff ''{param.subject}'' an ausgew\u00e4hlte Empf\u00e4nger versenden + +## Records Management Admin Tools +header.rm-console.label=Records Management... +header.rm-management.label=Verwaltungskonsole +header.rm-management.description=Verwaltungskonsole + +## Request Info Workflow +rm.wf.information-requested-for-record=Informationen f\u00fcr Record angefordert +rm.wf.request-information-from=Informationen anfordern von +rm.wf.requested-information=Angeforderte Informationen +rm.wf.record=Record +rm.wf.selected-users-and-groups=Benutzer und Gruppen +rm.wf.give-details=Informationen bereitstellen +rm.wf.message=Nachricht +rm.wf.details=Details + +## Text length validation +message.max.text.length.validation=Text mit weniger als {max} Zeichen eingeben + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=\u00dcberpr\u00fcfungszeitraum ausw\u00e4hlen + +## Forms +form.control.object-picker.items-list.empty=Keine Elemente +form.control.object-picker.items-list.loading=Laden... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=Titel +file-to.substitution.node.cm.description.label=Beschreibung +file-to.substitution.node.cm.accessed.label=Letzter Zugriff +file-to.substitution.node.cm.created.label=Beim Erstellen +file-to.substitution.node.cm.creator.label=Ersteller +file-to.substitution.node.cm.modified.label=Letzte \u00c4nderung +file-to.substitution.node.cm.modifier.label=Bearbeiter +file-to.substitution.node.cm.name.label=Name +file-to.substitution.node.rma.origionalName.label=Urspr\u00fcnglicher Node-Name +file-to.substitution.node.rma.dateFiled.label=Ablagedatum +file-to.substitution.node.rma.location.label=Speicherort +file-to.substitution.node.rma.dbUniquenessId.label=Eindeutige Datenbank-ID +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=Node-ID +file-to.substitution.node.sys.store-identifier.label=Speicher-ID +file-to.substitution.node.sys.store-protocol.label=Speicherprotokoll +file-to.substitution.date.day.short.label=Tag kurz (z. B. Mo) +file-to.substitution.date.day.label=Tag (z. B. Mo) +file-to.substitution.date.day.long.label=Tag lang (z. B. Montag) +file-to.substitution.date.day.number.label=Tag Nummer (z. B. 1) +file-to.substitution.date.day.year.label=Tag des Jahres (z. B. 216) +file-to.substitution.date.day.month.label=Tag des Monats (z. B. 18) +file-to.substitution.date.month.short.label=Monat kurz (z. B. Jan) +file-to.substitution.date.month.label=Monat (z. B. Jan) +file-to.substitution.date.month.long.label=Monat lang (z. B. Januar) +file-to.substitution.date.month.number.label=Monat Nummer (z. B. 01) +file-to.substitution.date.year.short.label=Jahr kurz (z. B. 14) +file-to.substitution.date.year.label=Jahr (z. B. 14) +file-to.substitution.date.year.long.label=Jahr lang (z. B. 2014) +file-to.substitution.date.year.week.label=Woche des Jahres (z. B. 31) + +## Banner icon messages +banner.rejected-record.info=Angaben zu abgelehntem Record anzeigen +banner.rejected-record.close=Warnung f\u00fcr abgelehnten Record entfernen +banner.child-classification-in-progress.info=Klassifizierung untergeordneter Elemente l\u00e4uft +banner.child-classification-complete.info=Klassifizierung untergeordneter Elemente abgeschlossen +banner.child-classification-complete.close=Nachricht entfernen + +## Recordable Versions +label.destroyed-version=Vernichtete Version +label.recorded-version=Als Record deklarierte Version diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_es.properties new file mode 100755 index 0000000000..0815e476b3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_es.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Cuadro de clasificaci\u00f3n +page.rmDocumentLibrary.description=Cuadro de clasificaci\u00f3n de Records Management +page.rmSearch.title=B\u00fasqueda de documentos de archivo +page.rmSearch.description=P\u00e1gina de b\u00fasqueda de documentos de archivo +page.rmSiteDashboard.title=Panel de inicio del sitio de Records Management +page.rmSiteDashboard.description=P\u00e1gina del panel del sitio de Records Management +page.rmAudit.title=Registro de auditor\u00edas +page.rmAudit.description=P\u00e1gina de registros de auditor\u00edas +page.rmNewReference.title=Nueva referencia +page.rmNewReference.description=Nueva referencia entre documentos de archivo +page.rmDispositionEdit.title=Editar calendario de retenci\u00f3n +page.rmDispositionEdit.description=P\u00e1gina para la edici\u00f3n de calendario de retenci\u00f3n +page.rmPermissions.title=Gestionar permisos +page.rmPermissions.description=P\u00e1gina para administraci\u00f3n de permisos +page.rmConsole.title=Herramientas de administraci\u00f3n de RM +page.rmConsole.description=Herramientas de administraci\u00f3n de Records Management + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Detalles de series de documentos de archivo +page.rmRecordSeriesDetails.description=P\u00e1gina de detalles de series de documentos de archivo para Records Management +page.rmRecordCategoryDetails.title=Detalles de categor\u00eda de documentos de archivo +page.rmRecordCategoryDetails.description=P\u00e1gina de detalles de categor\u00edas para Records Management +page.rmRecordFolderDetails.title=Detalles de carpeta de documentos de archivo +page.rmRecordFolderDetails.description=P\u00e1gina de detalles de carpeta de documentos de archivo para Records Management + +## Forms +label.set.idStatus=Identificaci\u00f3n y estado +label.set.general=General +label.set.record=Documento de archivo +label.set.correspondence=Correspondencia +label.set.security=Seguridad +label.set.vitalRecord=Documento de archivo vital +label.set.disposition=Calendario de retenci\u00f3n +label.set.customMetadata=Propiedades personalizadas +label.set.recordVersion=Versi\u00f3n del documento de archivo +label.set.recordFolder=Carpeta de documentos de archivo +label.set.recordCategory=Categor\u00eda de documentos de archivo +label.hold.reason=Raz\u00f3n +label.hold.delete.empty=Eliminar retenci\u00f3n legal al vaciar +label.recordLevelDisposition=Aplicado a +label.record=Documento de archivo +label.folder=Carpeta de documentos de archivo +label.declared=Completado +label.recordType=Tipo de documento de archivo +label.seriesIdentifier=ID de serie de documento de archivo +label.categoryIdentifier=ID de categor\u00eda de documento de archivo +label.folderIdentifier=ID de carpeta de documento de archivo +label.recordIdentifier=ID de documento de archivo +label.dispositionInstructions=Instrucciones de retenci\u00f3n +label.dispositionAsOfDate=Fecha de inicio de retenci\u00f3n +label.physicalSize=Tama\u00f1o f\u00edsico +label.numberOfCopies=N\u00famero de copias +label.storageLocation=Ubicaci\u00f3n de almacenamiento +label.shelf=Anaquel +label.file=Fichero +label.box=Caja +label.versionDescription=Descripci\u00f3n de la versi\u00f3n +label.VersionLabel=Etiqueta de la versi\u00f3n + +## Common Property Selector +label.menu.content=Contenido +label.menu.records=Documento de archivo +label.menu.disposition=Calendario de retenci\u00f3n +label.menu.specialtypes=Tipos especiales +label.menu.imap=IMAP +label.menu.custom=Propiedades personalizadas + +## Buttons +button.reject.record=Rechazar documento de archivo +button.request-info=Solicitar informaci\u00f3n + +## Pop-up Messages +message.confirm.delete.title=Eliminar confirmaci\u00f3n +message.confirm.delete=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}''? +message.confirm.destroy.title=Confirmaci\u00f3n de destrucci\u00f3n +message.confirm.destroy=\u00bfEst\u00e1 seguro de que desea destruir ''{0}''? +message.confirm.destroyMultiple=\u00bfEst\u00e1 seguro de que desea destruir los ficheros seleccionados {0}? +message.confirm2.destroy.title=Confirmaci\u00f3n de destrucci\u00f3n +message.confirm2.destroy=El contenido del fichero se eliminar\u00e1 permanentemente, \u00bfest\u00e1 seguro de que desea continuar? +message.confirm2.destroyMultiple=El contenido de los ficheros se eliminar\u00e1 permanentemente, \u00bfest\u00e1 seguro de que desea continuar? +message.confirm.hide.record.title=Ocultar documento de archivo +message.confirm.hide.record=Este fichero se ha convertido en un documento de archivo. Haga clic en Aceptar para ocultarlo de forma que no pueda verse aqu\u00ed. +message.select=Seleccionar... +message.pdf-record-fonts.title=Documentos de archivo PDF: comprobaci\u00f3n de fuente incrustada +message.pdf-record-fonts.accession=Aseg\u00farese de que todos los documentos de archivo PDF que se acaban de incorporar incluyen las fuentes incrustadas aplicables. +message.pdf-record-fonts.transfer=Aseg\u00farese de que todos los documentos de archivo PDF que se acaban de transferir incluyen las fuentes incrustadas aplicables. +message.pdf-record-fonts.unknown=Si la transferencia o la incorporaci\u00f3n incluyen documentos de archivo PDF deber\u00eda comprobar que todas las fuentes incrustadas aplicables se han incluido. +message.request-info-success=Informaci\u00f3n solicitada correctamente +message.request-info-failure=Se ha producido un problema con la solicitud de informaci\u00f3n. +message.confirm.delete-hold.title=Eliminar retenci\u00f3n legal +message.confirm.delete-hold=Si elimina la retenci\u00f3n legal ''{0}'', se liberar\u00e1n todos los elementos que contiene dicha retenci\u00f3n legal. +message.confirm.close-rejected-record.title=Confirmar +message.confirm.close-rejected-record=Si elimina el aviso de documento de archivo rechazado, todas las opciones para declarar el fichero como documento de archivo estar\u00e1n otra vez disponibles. +message.confirm.unlink.title=Desvincular confirmaci\u00f3n +message.confirm.unlink.text=\u00bfEst\u00e1 seguro de que desea desvincular el documento de archivo? +message.confirm.close-child-classification-complete.title=Clasificaci\u00f3n de elementos secundarios completa +message.confirm.close-child-classification-complete=\u00bfEst\u00e1 seguro de que desea ocultar este mensaje? + +## Admin Console +message.admin-console-access-denied=Necesita permisos adicionales para acceder a esta p\u00e1gina. Compru\u00e9belo con su dep. de TI. + +# Document path +path.fileplan=Cuadro de clasificaci\u00f3n + +## File Plan Actions +actions.more=M\u00e1s... +actions.accession=Incorporaci\u00f3n +actions.close-folder=Cerrar carpeta +actions.copy-to=Copiar a... +actions.cutoff=Inicio de retenci\u00f3n +actions.declare=Documento de archivo completo +actions.delete=Eliminar +actions.destroy=Destruir +actions.download=Descargar +actions.download-zip=Descargar Zip +actions.edit-details=Editar metadatos +actions.edit-disposition-as-of-date=Editar fecha de retenci\u00f3n +actions.edit-disposition-schedule=Editar calendario de retenci\u00f3n +actions.edit-reason=Editar detalles de retenci\u00f3n legal +actions.edit-review-as-of-date=Editar fecha de revisi\u00f3n +actions.file-report=Archivar informe +actions.link-to=Enlazar a... +actions.unlink-from=Desvincular documento de archivo +actions.file-to=Archivar en... +actions.manage-permissions=Gestionar permisos +actions.move-to=Mover a... +actions.open-folder=Reabrir carpeta +actions.review-all=Revisar todo +actions.reviewed=Revisado +actions.add-record-metadata=A\u00f1adir metadatos de documento de archivo +actions.split-email=Separar adjuntos de correo electr\u00f3nico +actions.transfer=Transferencia +actions.transfer-complete=Completar transferencia +actions.undeclare=Reabrir documento de archivo +actions.undo-cutoff=Deshacer inicio de retenci\u00f3n +actions.create-disposition-schedule=Crear calendario de retenci\u00f3n +actions.upload-new-version=Cargar nueva versi\u00f3n +actions.view-details=Ver detalles +actions.view-audit-log=Ver registro de auditor\u00edas +actions.declare-file-to=Archivar como documento de archivo +actions.declare-file-version-to=Archivar versi\u00f3n como documento de archivo +actions.hide-record=Ocultar documento de archivo +actions.reject=Rechazar +actions.request-info=Solicitar informaci\u00f3n +actions.file-destruction-report=Generar informe de destrucci\u00f3n +actions.end-retention=Terminar retenci\u00f3n +action.edit.hold=Editar retenci\u00f3n legal +actions.delete.hold=Eliminar retenci\u00f3n legal +actions.add-to-hold=A\u00f1adir a retenci\u00f3n legal +actions.remove-from-hold=Eliminar de retenci\u00f3n legal +actions.file-hold-report=Generar informe de retenci\u00f3n legal +actions.move-dm-record=Mover documento de archivo +actions.recorded-version-config=Opciones de declaraci\u00f3n autom\u00e1tica +actions.add-relationship=A\u00f1adir relaci\u00f3n + +## File Plan Action Outcomes +message.multi-select={0} elementos seleccionados +message.accession.failure=No se pudo incorporar ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.accession.success=''{0}'' incorporado correctamente +message.accession-complete.failure=No se pudo completar la incorporaci\u00f3n de ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.accession-complete.success=Incorporaci\u00f3n de ''{0}'' completada +message.close.failure=No se pudo cerrar ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.close.success=''{0}'' cargado correctamente +message.cutoff.failure=No se pudo iniciar la retenci\u00f3n de ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.cutoff.success=Inicio de retenci\u00f3n de ''{0}'' correcto +message.declare.failure=No se pudo completar el documento de archivo ''{0}'' +message.declare.failure.more=El documento de archivo tiene metadatos que son necesarios completar. +message.declare.success=''{0}'' se ha completado +message.delete.failure=No se pudo eliminar ''{0}''. Intente hablar con el dep. de TI. +message.delete.success=''{0}'' eliminado correctamente +message.destroy.failure=No se pudo destruir ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.destroy.success=''{0}'' destruido correctamente +message.edit-disposition-as-of-date.title=Editar fecha de retenci\u00f3n +message.edit-disposition-as-of-date.failure=No se pudo actualizar la fecha de inicio de retenci\u00f3n. P\u00f3ngase en contacto con el dep. de TI. +message.edit-disposition-as-of-date.success=Fecha de inicio de retenci\u00f3n actualizada correctamente para ''{0}'' +message.edit-hold.reason.label=Raz\u00f3n: +message.edit-hold.title=Actualizar detalles de retenci\u00f3n legal +message.edit-hold.failure=No se pudieron actualizar los detalles de retenci\u00f3n legal. P\u00f3ngase en contacto con el dep. de TI. +message.edit-hold.success=Retenci\u00f3n legal actualizada correctamente +message.edit-review-as-of-date.title=Editar fecha de revisi\u00f3n +message.edit-review-as-of-date.failure=No se pudo actualizar la fecha de inicio de revisi\u00f3n. P\u00f3ngase en contacto con el dep. de TI. +message.edit-review-as-of-date.success=Fecha de inicio de revisi\u00f3n actualizada correctamente para ''{0}'' +message.open-folder.failure=No se pudo abrir la carpeta de documentos de archivo ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.open-folder.success=Se ha abierto la carpeta de documentos de archivo ''{0}'' +message.review-all.failure=No se pudieron revisar los documentos de archivo de la carpeta ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.review-all.success=Los documentos de archivo de la carpeta ''{0}'' se han revisado +message.reviewed.failure=No se pudo revisar ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.reviewed.success=''{0}'' revisado correctamente +message.split-email.failure=No se pudieron separar los adjuntos de ''{0}'' +message.split-email.success=Adjuntos separados correctamente de ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.transfer.failure=No se pudo transferir ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.transfer.success=''{0}'' transferido correctamente +message.transfer-complete.failure=No se pudo completar la transferencia ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.transfer-complete.success=La trasferencia de ''{0}'' se ha completado +message.undeclare.failure=No se pudo reabrir ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.undeclare.success=''{0}'' ya no es un documento de archivo completo +message.undo-cutoff.failure=No se pudo deshacer el inicio de retenci\u00f3n de ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.undo-cutoff.success=Deshacer inicio de retenci\u00f3n de ''{0}'' +message.create-disposition-schedule.failure=No se pudo crear el calendario de retenci\u00f3n de ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.create-disposition-schedule.success=Se ha creado el calendario de retenci\u00f3n para ''{0}'' +message.create-record.success=Este fichero se ha convertido en documento de archivo y tiene acciones limitadas disponibles +message.create-record.failure=No se pudo declarar como documento de archivo. P\u00f3ngase en contacto con el dep. de TI. +message.declare-version-as-record.success=Esta versi\u00f3n del fichero se ha declarado como documento de archivo +message.declare-version-as-record.failure=No se pudo declarar la versi\u00f3n como documento de archivo. P\u00f3ngase en contacto con el dep. de TI. +message.hide-record.success=Documento de archivo ''{0}'' ocultado correctamente +message.hide-record.failure=No se ha podido ocultar el documento de archivo ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.reject.reason=Raz\u00f3n: +message.reject.title=Raz\u00f3n del rechazo +message.reject.failure=No se pudo rechazar ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.reject.success=''{0}'' rechazado +message.file-destruction-report.failure=No se pudo generar el informe de destrucci\u00f3n. P\u00f3ngase en contacto con el dep. de TI. +message.file-destruction-report.success=Informe de destrucci\u00f3n generado +message.end-retention.failure=No se pudo terminar la retenci\u00f3n. P\u00f3ngase en contacto con el dep. de TI. +message.end-retention.success=Retenci\u00f3n terminada +message.file-success=Informe archivado correctamente como ''{0}'' +message.file-failure=No se pudo completar la operaci\u00f3n del fichero. P\u00f3ngase en contacto con el dep. de TI. +message.file-hold-report.failure=No se pudo generar el informe de retenci\u00f3n legal. P\u00f3ngase en contacto con el dep. de TI. +message.file-hold-report.success=Informe de retenci\u00f3n legal generado +message.delete-hold.failure=No se pudo eliminar la retenci\u00f3n legal. P\u00f3ngase en contacto con el dep. de TI. +message.delete-hold.success=Retenci\u00f3n legal eliminada +message.moveDmRecord.failure=No se pudo mover el documento de archivo ''{0}''. P\u00f3ngase en contacto con el dep. de TI. +message.moveDmRecord.success=Documento de archivo ''{0}'' movido correctamente +message.recordedVersionConfig.success=Opciones de declaraci\u00f3n autom\u00e1tica configuradas correctamente +message.recordedVersionConfig.failure=No se pudieron configurar las opciones de declaraci\u00f3n autom\u00e1tica. P\u00f3ngase en contacto con el dep. de TI. +message.unlink.success=Documento de archivo desvinculado correctamente +message.unlink.failure=No se pudo desvincular el documento de archivo. P\u00f3ngase en contacto con el dep. de TI. + +## File Plan Status Indicators +status.active-workflows=Pertenece a {0} flujos de trabajo activos +status.rm-accession=Incorporaci\u00f3n pendiente +status.rm-accessioned=Incorporado +status.rm-closed=Cerrado +status.rm-cutoff=Inicio de retenci\u00f3n +status.rm-cutoff-folder=Inicio de retenci\u00f3n +status.rm-destroyed=Destruido +status.rm-frozen=En retenci\u00f3n legal +status.rm-multi-parent=Enlazado a m\u00faltiples carpetas de documentos de archivo +status.rm-open=Abrir +status.rm-transfer=Transferencia pendiente +status.rm-transferred=Transferido +status.rm-vital-record=Documento de archivo vital +status.rm-rejected-record=Rechazado +status.rm-disposition-schedule=La categor\u00eda de documento de archivo tiene un calendario de retenci\u00f3n definido +status.rm-digital-photograph-record=Documento de archivo fotogr\u00e1fico digital +status.rm-pdf-record=Documento de archivo PDF +status.rm-scanned-record=Documento de archivo escaneado +status.rm-web-record=Documento de archivo web +status.rm-is-record=Documento de archivo +status.rules=Carpetas con reglas aplicadas +status.rm-version-record=Documento de archivo versionado +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Todas las revisiones se guardar\u00e1n como documento de archivo +status.rm-recorded-version-history-major-revisions=Solo las revisiones importantes se guardar\u00e1n como documento de archivo + +# Exif +status.exif=Metadatos EXIF disponibles +status.geographic=Metadatos de geolocalizaci\u00f3n disponibles +status.dod5015-digital-photograph-record=Documento de archivo fotogr\u00e1fico digital +status.dod5015-pdf-record=Documento de archivo PDF +status.dod5015-scanned-record=Documento de archivo escaneado +status.dod5015-web-record=Documento de archivo web + +# RMA model metadata fields +label.all=Todos +label.keywords=Palabras clave (texto y nombre) +label.identifier=ID +label.dateFiled=Fecha de archivado +label.publicationDate=Fecha de publicaci\u00f3n +label.originator=Creador +label.originatingOrganization=Organizaci\u00f3n creadora +label.mediaType=Tipo de medio +label.format=Formato +label.dateReceived=Fecha de recepci\u00f3n +label.supplementalMarkingList=Lista de marcado suplementaria +label.vitalRecord=Documento de archivo vital +label.reviewDate=Fecha de revisi\u00f3n +label.address=Destinatario +label.otherAddress=Otro destinatario +label.unpublishedUpdates=Actualizaciones sin publicar +label.publishInProgress=Publicaci\u00f3n en curso + +# IMAP model metadata fields +label.imap.threadIndex=\u00cdndice de subprocesos IMAP +label.imap.messageFrom=Mensaje IMAP de +label.imap.messageTo=Mensaje IMAP para +label.imap.messageCc=Mensaje IMAP cc +label.imap.messageSubject=Asunto de mensaje IMAP +label.imap.dateReceived=Fecha de recepci\u00f3n de IMAP +label.imap.dateSent=Fecha de env\u00edo de IMAP + +# DOD model metadata fields +label.dod.scannedFormatVersion=Formato de imagen y versi\u00f3n +label.dod.resolutionX=Resoluci\u00f3n de imagen X +label.dod.resolutionY=Resoluci\u00f3n de imagen Y +label.dod.scannedBitDepth=Profundidad de bits de escaneado +label.dod.producingApplication=Produciendo aplicaci\u00f3n +label.dod.producingApplicationVersion=Produciendo versi\u00f3n de la aplicaci\u00f3n +label.dod.pdfVersion=Versi\u00f3n PDF +label.dod.creatingApplication=Creando aplicaci\u00f3n +label.dod.documentSecuritySettings=Configuraci\u00f3n de seguridad del documento +label.dod.caption=T\u00edtulo +label.dod.photographer=Fot\u00f3grafo +label.dod.copyright=Copyright +label.dod.bitDepth=Profundidad de bits +label.dod.imageSizeX=Tama\u00f1o de imagen X +label.dod.imageSizeY=Tama\u00f1o de imagen Y +label.dod.imageSource=Procedencia de la imagen +label.dod.compression=Compresi\u00f3n +label.dod.iccIcmProfile=Perfil ICC/ICM +label.dod.exifInformation=Informaci\u00f3n EXIF +label.dod.webFileName=Nombre del fichero web +label.dod.webPlatform=Plataforma web +label.dod.webSiteName=Nombre del sitio web +label.dod.webSiteURL=URL del sitio web +label.dod.captureMethod=M\u00e9todo de captura +label.dod.captureDate=Fecha de captura +label.dod.contact=Contacto +label.dod.contentManagementSystem=Sistema de gesti\u00f3n de contenidos + +# RM Admin Console tools +tool.rm-define-roles.label=Definir funciones +tool.rm-define-roles.description=Crear y editar funciones +tool.rm-custom-metadata.label=Metadatos personalizados +tool.rm-custom-metadata.description=Metadatos personalizados +tool.rm-list-of-values.label=Lista de valores +tool.rm-list-of-values.description=Lista de definiciones de valores +tool.rm-references.label=Relaciones +tool.rm-references.description=Definiciones de relaciones +tool.rm-events.label=Eventos +tool.rm-events.description=Definiciones de eventos +tool.rm-audit.label=Auditor\u00eda +tool.rm-audit.description=Auditor\u00eda de Records Management +tool.rm-email-mappings.label=Asignaciones de correo electr\u00f3nico +tool.rm-email-mappings.description=Definiciones de asignaciones de correo electr\u00f3nico +tool.rm-user-rights.label=Informe de derechos de usuario +tool.rm-user-rights.description=Informe de derechos de usuario +tool.rm-users-and-groups.label=Usuarios y grupos +tool.rm-users-and-groups.description=Usuarios y grupos + +## Buttons +button.sort.ascending=Orden ascendente +button.sort.descending=Orden descendente +button.folders.show=Mostrar carpetas +button.folders.hide=Ocultar carpetas +button.view.simple=Vista sencilla +button.view.detailed=Vista detallada + +## Drop-down Menus +menu.select=Seleccionar +menu.select.all=Todos +menu.select.none=Ninguno +menu.select.invert=Invertir la selecci\u00f3n +menu.select.folders=Carpetas +menu.select.documents=Documentos +menu.select.records=Documentos de archivo +menu.select.undeclaredRecords=Documentos de archivo incompletos +menu.select.recordFolders=Carpetas de documentos de archivo +menu.select.recordCategories=Categor\u00edas de documentos de archivo + +## Metadata Fields +# Generic +details.created.on=Creado +details.created.by=Creado por +details.modified.on=Modificado +details.modified.by=Modificado por +details.by=Por +details.size=Tama\u00f1o +details.description=Descripci\u00f3n +details.description.none=(Ninguno) +# Record Category +details.category.identifier=ID de categor\u00eda de documento de archivo +details.category.disposition-authority=Autoridad de retenci\u00f3n +details.category.disposition-instructions=Instrucciones de retenci\u00f3n +details.category.vital-record-indicator=Indicador de documento de archivo vital +# Record Folder +details.folder.identifier=ID de carpeta de documento de archivo +details.folder.vital-record-indicator=Indicador de documento de archivo vital +# Record +details.record.identifier=ID de documento de archivo \u00fanico +details.record.date-filed=Fecha de archivado +details.record.publication-date=Fecha de publicaci\u00f3n +details.record.originator=Creador +details.record.originating-organization=Organizaci\u00f3n creadora +details.version.label=Versi\u00f3n +# Incomplete Record +details.undeclared-record.info=Documento de archivo incompleto +# Rejected Record +details.rejected-record.info=Documento de archivo de rechazado +# Transfer Container +details.transfer-container.title=Transferir {0} +details.transfer-container.is-accession=Nota: el tipo de transferencia es incorporaci\u00f3n +# Hold Container +details.hold.title=Retenci\u00f3n legal creada {0} +details.hold.title.date-format=dd mmmm yyyy 'a las' HH:MM:ss +details.hold.reason=Raz\u00f3n de retenci\u00f3n legal +details.hold.reason.none=No disponible +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=ID de carpeta + +## File Upload (upload new version) +label.filter-description=Mismo tipo que {0} + +## Empty List +no.items.title=No hay elementos + +## Tips +tip.insitu-rename=Cambiar nombre +tip.insitu-tag=Etiqueta + +## Help panels, including Drag and Drop +show.folders=Mostrar {0} subcarpeta(s) + +## Create site dialog +description.recordsManagementSite=Sitio de gesti\u00f3n de documentos de archivo +title.recordsManagementSite=Records Management +type.recordsManagementSite=Sitio de gesti\u00f3n de documentos de archivo +compliance.standard=Norma +compliance.dod5015=DoD 5015.2-STD +label.compliance=Cumplimiento normativo + +## Console title +link.managementConsole=Consola de gesti\u00f3n + +## Rules +customise.reject.text=Rechazar documentos de archivo con comentario ''{param.reason}'' +customise.requestInfo.text=Crea una tarea del flujo de trabajo para una lista de personas especificadas y solicita la siguiente informaci\u00f3n ''{param.requestedInfo}'' +customise.sendEmail.text=Enviar correo electr\u00f3nico con asunto ''{param.subject}'' a destinatarios especificados + +## Records Management Admin Tools +header.rm-console.label=Records Management... +header.rm-management.label=Consola de gesti\u00f3n +header.rm-management.description=Consola de gesti\u00f3n + +## Request Info Workflow +rm.wf.information-requested-for-record=Informaci\u00f3n solicitada para el documento de archivo +rm.wf.request-information-from=Solicitar informaci\u00f3n de +rm.wf.requested-information=Informaci\u00f3n solicitada +rm.wf.record=Documento de archivo +rm.wf.selected-users-and-groups=Usuarios y grupos +rm.wf.give-details=Proporciona informaci\u00f3n +rm.wf.message=Mensaje +rm.wf.details=Detalles + +## Text length validation +message.max.text.length.validation=Introduzca texto con menos de {max} caracteres + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=Seleccione un periodo de revisi\u00f3n + +## Forms +form.control.object-picker.items-list.empty=No hay elementos +form.control.object-picker.items-list.loading=Cargando... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=T\u00edtulo +file-to.substitution.node.cm.description.label=Descripci\u00f3n +file-to.substitution.node.cm.accessed.label=\u00daltimo acceso +file-to.substitution.node.cm.created.label=Fecha de creaci\u00f3n +file-to.substitution.node.cm.creator.label=Creador +file-to.substitution.node.cm.modified.label=\u00daltima fecha de modificaci\u00f3n +file-to.substitution.node.cm.modifier.label=Modificador +file-to.substitution.node.cm.name.label=Nombre +file-to.substitution.node.rma.origionalName.label=Nombre de nodo original +file-to.substitution.node.rma.dateFiled.label=Fecha de archivado +file-to.substitution.node.rma.location.label=Ubicaci\u00f3n +file-to.substitution.node.rma.dbUniquenessId.label=ID \u00fanico de base de datos +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=ID de nodo +file-to.substitution.node.sys.store-identifier.label=ID de almac\u00e9n +file-to.substitution.node.sys.store-protocol.label=Protocolo de almacenamiento +file-to.substitution.date.day.short.label=D\u00eda abreviado (por ejemplo, lu) +file-to.substitution.date.day.label=D\u00eda (por ejemplo, lun) +file-to.substitution.date.day.long.label=D\u00eda completo (por ejemplo, lunes) +file-to.substitution.date.day.number.label=N\u00famero de d\u00eda (por ejemplo, 1) +file-to.substitution.date.day.year.label=D\u00eda del a\u00f1o (por ejemplo, 216) +file-to.substitution.date.day.month.label=D\u00eda del mes (por ejemplo, 18) +file-to.substitution.date.month.short.label=Mes abreviado (por ejemplo, en) +file-to.substitution.date.month.label=Mes (por ejemplo, en) +file-to.substitution.date.month.long.label=Mes completo (por ejemplo, enero) +file-to.substitution.date.month.number.label=N\u00famero de mes (por ejemplo, 01) +file-to.substitution.date.year.short.label=A\u00f1o abreviado (por ejemplo, 14) +file-to.substitution.date.year.label=A\u00f1o (por ejemplo, 14) +file-to.substitution.date.year.long.label=A\u00f1o completo (por ejemplo, 2014) +file-to.substitution.date.year.week.label=Semana del a\u00f1o (por ejemplo, 31) + +## Banner icon messages +banner.rejected-record.info=Ver informaci\u00f3n sobre el documento de archivo rechazado +banner.rejected-record.close=Eliminar el aviso de documento de archivo rechazado +banner.child-classification-in-progress.info=Clasificaci\u00f3n de elementos secundarios en curso +banner.child-classification-complete.info=Clasificaci\u00f3n de elementos secundarios completa +banner.child-classification-complete.close=Eliminar el mensaje + +## Recordable Versions +label.destroyed-version=Versi\u00f3n destruida +label.recorded-version=Versi\u00f3n guardada como documento de archivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_fr.properties new file mode 100644 index 0000000000..3d2616b7fb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_fr.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Plan de classement +page.rmDocumentLibrary.description=Plan de classement de gestion des archives +page.rmSearch.title=Recherche des documents d'archives +page.rmSearch.description=Page de recherche des documents d'archives +page.rmSiteDashboard.title=Tableau de bord du site de gestion des archives +page.rmSiteDashboard.description=Page du tableau de bord du site de gestion des archives +page.rmAudit.title=Journal d'audit +page.rmAudit.description=Page de journal d'audit +page.rmNewReference.title=Nouvelle r\u00e9f\u00e9rence +page.rmNewReference.description=Nouvelle r\u00e9f\u00e9rence entre les documents d'archives +page.rmDispositionEdit.title=Modifier la r\u00e8gle de conservation +page.rmDispositionEdit.description=Page de modification de la r\u00e8gle de conservation +page.rmPermissions.title=G\u00e9rer les autorisations +page.rmPermissions.description=Page de gestion des autorisations +page.rmConsole.title=Outils d'administration RM +page.rmConsole.description=Outils d'administration du module de gestion des archives (RM) + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=D\u00e9tails de s\u00e9rie des documents d'archives +page.rmRecordSeriesDetails.description=Page de d\u00e9tails de s\u00e9rie de document d'archives de la gestion des archives +page.rmRecordCategoryDetails.title=D\u00e9tails de la cat\u00e9gorie de classement +page.rmRecordCategoryDetails.description=Page de d\u00e9tails de la cat\u00e9gorie de classement pour la gestion des archives +page.rmRecordFolderDetails.title=D\u00e9tails du dossier d'archives +page.rmRecordFolderDetails.description=Page de d\u00e9tails du dossier d'archives de la gestion des archives + +## Forms +label.set.idStatus=Identification et statut +label.set.general=G\u00e9n\u00e9ral +label.set.record=Document d'archives +label.set.correspondence=Correspondance +label.set.security=S\u00e9curit\u00e9 +label.set.vitalRecord=Document d'archives essentiel +label.set.disposition=R\u00e8gle de conservation +label.set.customMetadata=Propri\u00e9t\u00e9s personnalis\u00e9es +label.set.recordVersion=Version du document d'archive +label.set.recordFolder=Dossier d'archives +label.set.recordCategory=Cat\u00e9gorie de document d'archives +label.hold.reason=Motif +label.hold.delete.empty=Supprimer la suspension lorsque vide +label.recordLevelDisposition=Appliqu\u00e9 \u00e0 +label.record=Document d'archives +label.folder=Dossier d'archives +label.declared=Termin\u00e9 +label.recordType=Type de document d'archives +label.seriesIdentifier=ID de la s\u00e9rie de documents d'archives +label.categoryIdentifier=ID de la cat\u00e9gorie de document d'archives +label.folderIdentifier=ID du dossier d'archives +label.recordIdentifier=ID du document d'archives +label.dispositionInstructions=Instructions de conservation +label.dispositionAsOfDate=Date de d\u00e9but de conservation +label.physicalSize=Taille physique +label.numberOfCopies=Nombre de copies +label.storageLocation=Emplacement de stockage +label.shelf=Etag\u00e8re +label.file=Fichier +label.box=Bo\u00eete +label.versionDescription=Description de la version +label.VersionLabel=Etiquette de la version + +## Common Property Selector +label.menu.content=Contenu +label.menu.records=Document d'archives +label.menu.disposition=R\u00e8gle de conservation +label.menu.specialtypes=Types sp\u00e9ciaux +label.menu.imap=IMAP +label.menu.custom=Propri\u00e9t\u00e9s personnalis\u00e9es + +## Buttons +button.reject.record=Rejeter le document d'archives +button.request-info=Demander des informations + +## Pop-up Messages +message.confirm.delete.title=Confirmation de la suppression +message.confirm.delete=Voulez-vous vraiment supprimer ''{0}''\u00a0? +message.confirm.destroy.title=Confirmation de la destruction +message.confirm.destroy=Voulez-vous vraiment d\u00e9truire ''{0}'' ? +message.confirm.destroyMultiple=Voulez-vous vraiment d\u00e9truire les {0} fichiers s\u00e9lectionn\u00e9s ? +message.confirm2.destroy.title=Confirmation de la destruction +message.confirm2.destroy=Le contenu du fichier sera supprim\u00e9 d\u00e9finitivement. Voulez-vous continuer ? +message.confirm2.destroyMultiple=Le contenu des fichiers sera supprim\u00e9 d\u00e9finitivement. Voulez-vous continuer ? +message.confirm.hide.record.title=Masquer le document d'archives +message.confirm.hide.record=Le fichier est d\u00e9sormais un document d'archives. Cliquez sur OK pour le masquer pour qu'il ne soit plus visible ici. +message.select=S\u00e9lectionner... +message.pdf-record-fonts.title=Documents d'archives PDF\u00a0: v\u00e9rification de la police int\u00e9gr\u00e9e +message.pdf-record-fonts.accession=V\u00e9rifier que les documents d'archives PDF qui viennent d'\u00eatre vers\u00e9s \u00e0 un autre organisme contiennent les polices int\u00e9gr\u00e9es applicables. +message.pdf-record-fonts.transfer=V\u00e9rifier que les documents d'archives PDF qui viennent d'\u00eatre transf\u00e9r\u00e9s contiennent les polices int\u00e9gr\u00e9es applicables. +message.pdf-record-fonts.unknown=Si le transfert ou le versement \u00e0 un autre organisme comprend des documents d'archives PDF, v\u00e9rifiez que les polices int\u00e9gr\u00e9es applicables ont \u00e9t\u00e9 incluses. +message.request-info-success=La demande d'informations a bien \u00e9t\u00e9 effectu\u00e9e +message.request-info-failure=Un probl\u00e8me est survenu pendant la demande d'informations. +message.confirm.delete-hold.title=Supprimer la suspension +message.confirm.delete-hold=Si vous supprimez la suspension ''{0}'', tous les \u00e9l\u00e9ments qu''elle contient seront lib\u00e9r\u00e9s. +message.confirm.close-rejected-record.title=Confirmer +message.confirm.close-rejected-record=Si vous supprimez l'avertissement associ\u00e9 au rejet du document d'archives, les options permettant de d\u00e9clarer le fichier comme document d'archives seront de nouveau disponibles. +message.confirm.unlink.title=Confirmation de suppression de lien +message.confirm.unlink.text=Voulez-vous vraiment supprimer le lien du document d'archives ? +message.confirm.close-child-classification-complete.title=Classification du sous-dossier termin\u00e9e +message.confirm.close-child-classification-complete=Voulez-vous vraiment masquer ce message\u00a0? + +## Admin Console +message.admin-console-access-denied=Vous devez disposer d'autorisations suppl\u00e9mentaires pour acc\u00e9der \u00e0 cette page. V\u00e9rifiez aupr\u00e8s de votre service informatique. + +# Document path +path.fileplan=Plan de classement + +## File Plan Actions +actions.more=Plus... +actions.accession=Versement \u00e0 un autre organisme +actions.close-folder=Fermer le dossier +actions.copy-to=Copier vers... +actions.cutoff=D\u00e9but de conservation +actions.declare=Compl\u00e9ter un document d'archives +actions.delete=Supprimer +actions.destroy=D\u00e9truire +actions.download=T\u00e9l\u00e9charger +actions.download-zip=T\u00e9l\u00e9charger Zip +actions.edit-details=Modifier les m\u00e9tadonn\u00e9es +actions.edit-disposition-as-of-date=Modifier la date de conservation +actions.edit-disposition-schedule=Modifier la r\u00e8gle de conservation +actions.edit-reason=Modifier les informations sur la suspension +actions.edit-review-as-of-date=Modifier la date de r\u00e9vision +actions.file-report=Archiver le rapport +actions.link-to=Lier \u00e0... +actions.unlink-from=Supprimer le lien du document d'archives +actions.file-to=Archiver dans... +actions.manage-permissions=G\u00e9rer les autorisations +actions.move-to=D\u00e9placer vers... +actions.open-folder=Rouvrir le dossier +actions.review-all=V\u00e9rifier tout +actions.reviewed=V\u00e9rifi\u00e9 +actions.add-record-metadata=Ajouter des m\u00e9tadonn\u00e9es de document d'archives +actions.split-email=Partager les pi\u00e8ces jointes d'email +actions.transfer=Transf\u00e9rer +actions.transfer-complete=Compl\u00e9ter le transfert +actions.undeclare=Rouvrir un document d'archives +actions.undo-cutoff=Annuler le d\u00e9but de conservation +actions.create-disposition-schedule=Cr\u00e9er une r\u00e8gle de conservation +actions.upload-new-version=Importer une nouvelle version +actions.view-details=Afficher les d\u00e9tails +actions.view-audit-log=Afficher le journal d'audit +actions.declare-file-to=Archiver comme document d'archives +actions.declare-file-version-to=Classer la version comme document d'archives +actions.hide-record=Masquer le document d'archives +actions.reject=Rejeter +actions.request-info=Demander des informations +actions.file-destruction-report=G\u00e9n\u00e9rer un rapport de destruction +actions.end-retention=Mettre fin \u00e0 la conservation +action.edit.hold=Modifier la suspension +actions.delete.hold=Supprimer la suspension +actions.add-to-hold=Ajouter \u00e0 la suspension +actions.remove-from-hold=Supprimer de la suspension +actions.file-hold-report=G\u00e9n\u00e9rer un rapport de suspension +actions.move-dm-record=D\u00e9placer le document d'archives +actions.recorded-version-config=Options de d\u00e9claration automatique +actions.add-relationship=Ajouter une relation + +## File Plan Action Outcomes +message.multi-select={0} \u00e9l\u00e9ments s\u00e9lectionn\u00e9s +message.accession.failure=Impossible de verser ''{0}'' \u00e0 un autre organisme. Contactez votre DSI. +message.accession.success=''{0}'' a bien \u00e9t\u00e9 vers\u00e9 \u00e0 un autre organisme +message.accession-complete.failure=Impossible de compl\u00e9ter le versement de ''{0}'' \u00e0 un autre organisme. Contactez votre DSI. +message.accession-complete.success=Versement de ''{0}'' \u00e0 un autre organisme effectu\u00e9 +message.close.failure=Impossible de fermer ''{0}''. Contactez votre DSI. +message.close.success=''{0}'' a bien \u00e9t\u00e9 ferm\u00e9 +message.cutoff.failure=Impossible d''initier le d\u00e9but de conservation de ''{0}''. Contactez votre DSI. +message.cutoff.success=D\u00e9but de conservation de ''{0}'' r\u00e9ussi +message.declare.failure=Impossible de compl\u00e9ter le document d''archives ''{0}'' +message.declare.failure.more=Le document d'archives dispose de m\u00e9tadonn\u00e9es qui doivent \u00eatre compl\u00e9t\u00e9es. +message.declare.success=''{0}'' a \u00e9t\u00e9 compl\u00e9t\u00e9 +message.delete.failure=Impossible de supprimer ''{0}''. Contactez votre DSI. +message.delete.success=''{0}'' a bien \u00e9t\u00e9 supprim\u00e9 +message.destroy.failure=Impossible de d\u00e9truire ''{0}''. Contactez votre DSI. +message.destroy.success=''{0}'' a bien \u00e9t\u00e9 d\u00e9truit +message.edit-disposition-as-of-date.title=Modifier la date de conservation +message.edit-disposition-as-of-date.failure=Impossible de mettre \u00e0 jour la date de conservation +message.edit-disposition-as-of-date.success=La date de conservation a bien \u00e9t\u00e9 mise \u00e0 jour pour ''{0}'' +message.edit-hold.reason.label=Motif : +message.edit-hold.title=Mettre \u00e0 jour les informations sur la suspension +message.edit-hold.failure=Impossible de mettre \u00e0 jour les informations sur la suspension. Contactez votre DSI. +message.edit-hold.success=La suspension a bien \u00e9t\u00e9 mise \u00e0 jour +message.edit-review-as-of-date.title=Modifier la date de r\u00e9vision +message.edit-review-as-of-date.failure=Impossible de mettre \u00e0 jour la date de d\u00e9but de la r\u00e9vision. Contactez votre DSI. +message.edit-review-as-of-date.success=La date de d\u00e9but de la r\u00e9vision a bien \u00e9t\u00e9 mise \u00e0 jour pour ''{0}'' +message.open-folder.failure=Impossible d''ouvrir le dossier d''archives ''{0}''. Contactez votre DSI. +message.open-folder.success=Le dossier d''archives ''{0}'' \u00e9tait ouvert +message.review-all.failure=Impossible de v\u00e9rifier les documents d''archives dans le dossier ''{0}''. Contactez votre DSI. +message.review-all.success=Les documents d''archives dans le dossier ''{0}'' ont \u00e9t\u00e9 v\u00e9rifi\u00e9s +message.reviewed.failure=Impossible de v\u00e9rifier ''{0}''. Contactez votre DSI. +message.reviewed.success=''{0}'' a bien \u00e9t\u00e9 v\u00e9rifi\u00e9 +message.split-email.failure=Impossible de s\u00e9parer les pi\u00e8ces jointes de ''{0}'' +message.split-email.success=Les pi\u00e8ces jointes ont bien \u00e9t\u00e9 s\u00e9par\u00e9es de ''{0}''. Contactez votre DSI. +message.transfer.failure=Impossible de transf\u00e9rer ''{0}''. Contactez votre DSI. +message.transfer.success=''{0}'' a bien \u00e9t\u00e9 transf\u00e9r\u00e9 +message.transfer-complete.failure=Impossible de compl\u00e9ter le transfert de ''{0}''. Contactez votre DSI. +message.transfer-complete.success=Le transfert de ''{0}'' est compl\u00e9t\u00e9 +message.undeclare.failure=Impossible de rouvrir ''{0}''. Contactez votre DSI. +message.undeclare.success=''{0}'' n''est plus un document d''archives complet +message.undo-cutoff.failure=Impossible d''annuler le d\u00e9but de conservation de ''{0}''. Contactez votre DSI. +message.undo-cutoff.success=Annuler le d\u00e9but de conservation sur ''{0}'' +message.create-disposition-schedule.failure=Impossible de cr\u00e9er la r\u00e8gle de conservation pour ''{0}''. Contactez votre DSI. +message.create-disposition-schedule.success=La r\u00e8gle de conservation a \u00e9t\u00e9 cr\u00e9\u00e9e pour ''{0}'' +message.create-record.success=Ce fichier est d\u00e9sormais un document d'archives et les actions dont il peut faire l'objet sont limit\u00e9es +message.create-record.failure=Impossible de d\u00e9clarer comme document d'archives. Contactez votre DSI. +message.declare-version-as-record.success=Cette version du fichier a \u00e9t\u00e9 d\u00e9clar\u00e9e comme document d'archives +message.declare-version-as-record.failure=Impossible de d\u00e9clarer cette version comme document d'archives. Contactez votre DSI. +message.hide-record.success=Le document d''archives ''{0}'' a bien \u00e9t\u00e9 masqu\u00e9 +message.hide-record.failure=Impossible de masquer le document d''archives ''{0}''. Contactez votre DSI. +message.reject.reason=Motif : +message.reject.title=Motif du rejet +message.reject.failure=Impossible de rejeter ''{0}''. Contactez votre DSI. +message.reject.success=''{0}''rejet\u00e9 +message.file-destruction-report.failure=Impossible de g\u00e9n\u00e9rer le rapport de destruction. Contactez votre DSI. +message.file-destruction-report.success=Rapport de destruction g\u00e9n\u00e9r\u00e9 +message.end-retention.failure=Impossible de mettre fin \u00e0 la conservation. Contactez votre DSI. +message.end-retention.success=Conservation finie +message.file-success=Le rapport a bien \u00e9t\u00e9 class\u00e9 en tant que ''{0}'' +message.file-failure=Impossible de compl\u00e9ter l'archivage du fichier. Contactez votre DSI. +message.file-hold-report.failure=Impossible de g\u00e9n\u00e9rer le rapport de suspension. Contactez votre DSI. +message.file-hold-report.success=Rapport de suspension g\u00e9n\u00e9r\u00e9 +message.delete-hold.failure=Impossible de supprimer la suspension. Contactez votre DSI. +message.delete-hold.success=Suspension supprim\u00e9e +message.moveDmRecord.failure=Impossible de d\u00e9placer le document d''archives ''{0}''. Contactez votre DSI. +message.moveDmRecord.success=Le document d''archives ''{0}'' a bien \u00e9t\u00e9 d\u00e9plac\u00e9 +message.recordedVersionConfig.success=Les options de d\u00e9claration automatique ont bien \u00e9t\u00e9 d\u00e9finies +message.recordedVersionConfig.failure=Impossible de d\u00e9finir les options de d\u00e9claration automatique. Contactez votre DSI. +message.unlink.success=Le lien du document d'archives a bien \u00e9t\u00e9 supprim\u00e9 +message.unlink.failure=Impossible de supprimer le lien du document d'archives. Contactez votre DSI. + +## File Plan Status Indicators +status.active-workflows=Associ\u00e9 \u00e0 {0} workflow(s) actif(s) +status.rm-accession=Versement \u00e0 un autre organisme en attente +status.rm-accessioned=Vers\u00e9 \u00e0 un autre organisme +status.rm-closed=Ferm\u00e9 +status.rm-cutoff=D\u00e9but de conservation +status.rm-cutoff-folder=D\u00e9but de conservation +status.rm-destroyed=D\u00e9truit +status.rm-frozen=Suspendu +status.rm-multi-parent=Li\u00e9 dans plusieurs dossiers d'archives +status.rm-open=Ouvrir +status.rm-transfer=Transfert en attente +status.rm-transferred=Transf\u00e9r\u00e9 +status.rm-vital-record=Document d'archives essentiel +status.rm-rejected-record=Rejet\u00e9 +status.rm-disposition-schedule=Une r\u00e8gle de conservation est d\u00e9finie pour la cat\u00e9gorie de document d'archives +status.rm-digital-photograph-record=Archive de photo num\u00e9rique +status.rm-pdf-record=Document d'archives PDF +status.rm-scanned-record=Document d'archives num\u00e9ris\u00e9 +status.rm-web-record=Document d'archives Web +status.rm-is-record=Document d'archives +status.rules=Des r\u00e8gles sont appliqu\u00e9es au dossier +status.rm-version-record=Document d'archive versionn\u00e9 +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Toutes les r\u00e9visions seront enregistr\u00e9es +status.rm-recorded-version-history-major-revisions=Seules les r\u00e9visions majeures seront enregistr\u00e9es + +# Exif +status.exif=M\u00e9tadonn\u00e9es EXIF disponibles +status.geographic=M\u00e9tadonn\u00e9es de g\u00e9olocalisation disponibles +status.dod5015-digital-photograph-record=Archive de photo num\u00e9rique +status.dod5015-pdf-record=Document d'archives PDF +status.dod5015-scanned-record=Document d'archives num\u00e9ris\u00e9 +status.dod5015-web-record=Document d'archives Web + +# RMA model metadata fields +label.all=Tout +label.keywords=Mots cl\u00e9s (texte et nom) +label.identifier=ID +label.dateFiled=Date de versement au site des archives +label.publicationDate=Date de publication +label.originator=Emetteur +label.originatingOrganization=Organisation \u00e9mettrice +label.mediaType=Type de support +label.format=Format +label.dateReceived=Date de r\u00e9ception +label.supplementalMarkingList=Liste de marquage compl\u00e9mentaire +label.vitalRecord=Document d'archives essentiel +label.reviewDate=Date de r\u00e9vision +label.address=Destinataire +label.otherAddress=Autre destinataire +label.unpublishedUpdates=Mises \u00e0 jour non publi\u00e9es +label.publishInProgress=Publication en cours + +# IMAP model metadata fields +label.imap.threadIndex=Index de thread IMAP +label.imap.messageFrom=Message IMAP de +label.imap.messageTo=Message IMAP \u00e0 +label.imap.messageCc=Cc le message IMAP +label.imap.messageSubject=Objet du message IMAP +label.imap.dateReceived=Date de r\u00e9ception IMAP +label.imap.dateSent=Date d'envoi IMAP + +# DOD model metadata fields +label.dod.scannedFormatVersion=Format et version d'image +label.dod.resolutionX=R\u00e9solution d'image X +label.dod.resolutionY=R\u00e9solution d'image Y +label.dod.scannedBitDepth=Profondeur de couleur num\u00e9ris\u00e9e +label.dod.producingApplication=Application native +label.dod.producingApplicationVersion=Version de l'application native +label.dod.pdfVersion=Version PDF +label.dod.creatingApplication=Application native +label.dod.documentSecuritySettings=Param\u00e8tres de s\u00e9curit\u00e9 du document +label.dod.caption=L\u00e9gende +label.dod.photographer=Photographe +label.dod.copyright=Copyright +label.dod.bitDepth=Profondeur de couleur +label.dod.imageSizeX=Taille d'image X +label.dod.imageSizeY=Taille d'image Y +label.dod.imageSource=Source de l'image +label.dod.compression=Compression +label.dod.iccIcmProfile=Profil ICC/ICM +label.dod.exifInformation=Informations EXIF +label.dod.webFileName=Nom de fichier Web +label.dod.webPlatform=Plate-forme Web +label.dod.webSiteName=Nom du site Web +label.dod.webSiteURL=URL de site Web +label.dod.captureMethod=M\u00e9thode de capture +label.dod.captureDate=Date de capture +label.dod.contact=Contact +label.dod.contentManagementSystem=Syst\u00e8me de gestion de contenu + +# RM Admin Console tools +tool.rm-define-roles.label=D\u00e9finir des r\u00f4les +tool.rm-define-roles.description=Cr\u00e9er et modifier des r\u00f4les +tool.rm-custom-metadata.label=M\u00e9tadonn\u00e9es personnalis\u00e9es +tool.rm-custom-metadata.description=M\u00e9tadonn\u00e9es personnalis\u00e9es +tool.rm-list-of-values.label=Liste de valeurs +tool.rm-list-of-values.description=Liste de d\u00e9finitions de valeurs +tool.rm-references.label=Relations +tool.rm-references.description=D\u00e9finitions de relations +tool.rm-events.label=Ev\u00e9nements +tool.rm-events.description=D\u00e9finitions d'\u00e9v\u00e9nements +tool.rm-audit.label=Audit +tool.rm-audit.description=Audit de gestion des archives +tool.rm-email-mappings.label=Configurations emails +tool.rm-email-mappings.description=D\u00e9finitions de configurations emails +tool.rm-user-rights.label=Rapport des droits d'utilisateur +tool.rm-user-rights.description=Rapport des droits d'utilisateur +tool.rm-users-and-groups.label=Utilisateurs et groupes +tool.rm-users-and-groups.description=Utilisateurs et groupes + +## Buttons +button.sort.ascending=Tri croissant +button.sort.descending=Tri d\u00e9croissant +button.folders.show=Afficher les dossiers +button.folders.hide=Cacher les dossiers +button.view.simple=Vue simplifi\u00e9e +button.view.detailed=Vue d\u00e9taill\u00e9e + +## Drop-down Menus +menu.select=S\u00e9lectionner +menu.select.all=Tout +menu.select.none=Aucun +menu.select.invert=Inverser la s\u00e9lection +menu.select.folders=Dossiers +menu.select.documents=Documents +menu.select.records=Archives +menu.select.undeclaredRecords=Documents d'archives incomplets +menu.select.recordFolders=Dossiers d'archives +menu.select.recordCategories=Cat\u00e9gories de document d'archives + +## Metadata Fields +# Generic +details.created.on=Cr\u00e9\u00e9 le +details.created.by=Cr\u00e9\u00e9 par +details.modified.on=Modifi\u00e9 le +details.modified.by=Modifi\u00e9 par +details.by=Par +details.size=Taille +details.description=Description +details.description.none=(Aucun) +# Record Category +details.category.identifier=ID de la cat\u00e9gorie de document d'archives +details.category.disposition-authority=D\u00e9tenteur principal +details.category.disposition-instructions=Instructions de conservation +details.category.vital-record-indicator=Identifiant de document d'archives essentiel +# Record Folder +details.folder.identifier=ID du dossier d'archives +details.folder.vital-record-indicator=Identifiant de document d'archives essentiel +# Record +details.record.identifier=ID unique de document d'archives +details.record.date-filed=Date de versement au site des archives +details.record.publication-date=Date de publication +details.record.originator=Emetteur +details.record.originating-organization=Organisation \u00e9mettrice +details.version.label=Version +# Incomplete Record +details.undeclared-record.info=Document d'archives incomplet +# Rejected Record +details.rejected-record.info=Document d'archives rejet\u00e9 +# Transfer Container +details.transfer-container.title=Transf\u00e9rer {0} +details.transfer-container.is-accession=Remarque : Le type de transfert est Versement \u00e0 un autre organisme +# Hold Container +details.hold.title=Suspension cr\u00e9\u00e9e le {0} +details.hold.title.date-format=jj mmmm aaaa '\u00e0' HH:MM:ss +details.hold.reason=Motif de la suspension +details.hold.reason.none=Non disponible +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=ID du dossier + +## File Upload (upload new version) +label.filter-description=Type identique \u00e0 {0} + +## Empty List +no.items.title=Aucun \u00e9l\u00e9ment + +## Tips +tip.insitu-rename=Renommer +tip.insitu-tag=Balise + +## Help panels, including Drag and Drop +show.folders=Afficher {0} sous-dossier(s) + +## Create site dialog +description.recordsManagementSite=Site de gestion des archives +title.recordsManagementSite=Gestion des archives +type.recordsManagementSite=Site de gestion des archives +compliance.standard=Standard +compliance.dod5015=DoD 5015.2-STD +label.compliance=Conformit\u00e9 + +## Console title +link.managementConsole=Console de gestion + +## Rules +customise.reject.text=Rejeter les documents d''archives avec le commentaire ''{param.reason}'' +customise.requestInfo.text=Cr\u00e9e une t\u00e2che de workflow pour une liste de personnes d\u00e9finies et demande les informations suivantes ''{param.requestedInfo}'' +customise.sendEmail.text=Envoyer un e-mail avec l''objet ''{param.subject}'' \u00e0 des destinataires sp\u00e9cifi\u00e9s + +## Records Management Admin Tools +header.rm-console.label=Gestion des archives... +header.rm-management.label=Console de gestion +header.rm-management.description=Console de gestion + +## Request Info Workflow +rm.wf.information-requested-for-record=Demande d'informations pour le document d'archives +rm.wf.request-information-from=Demander des informations \u00e0 +rm.wf.requested-information=Informations demand\u00e9es +rm.wf.record=Document d'archives +rm.wf.selected-users-and-groups=Utilisateurs et groupes +rm.wf.give-details=Fournir des informations +rm.wf.message=Message +rm.wf.details=D\u00e9tails + +## Text length validation +message.max.text.length.validation=Entrez un texte de moins de {max} caract\u00e8res + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=S\u00e9lectionnez une p\u00e9riode de r\u00e9vision + +## Forms +form.control.object-picker.items-list.empty=Aucun \u00e9l\u00e9ment +form.control.object-picker.items-list.loading=Chargement... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=Titre +file-to.substitution.node.cm.description.label=Description +file-to.substitution.node.cm.accessed.label=Dernier acc\u00e8s +file-to.substitution.node.cm.created.label=Date de cr\u00e9ation +file-to.substitution.node.cm.creator.label=Cr\u00e9ateur +file-to.substitution.node.cm.modified.label=Derni\u00e8re modification +file-to.substitution.node.cm.modifier.label=Modificateur +file-to.substitution.node.cm.name.label=Nom +file-to.substitution.node.rma.origionalName.label=Nom d'origine du n\u0153ud +file-to.substitution.node.rma.dateFiled.label=Date de versement au site des archives +file-to.substitution.node.rma.location.label=Emplacement +file-to.substitution.node.rma.dbUniquenessId.label=ID unique de base de donn\u00e9es +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=ID de n\u0153ud +file-to.substitution.node.sys.store-identifier.label=ID de stockage +file-to.substitution.node.sys.store-protocol.label=Protocole de stockage +file-to.substitution.date.day.short.label=Jour en abr\u00e9g\u00e9 (p.ex., lun) +file-to.substitution.date.day.label=Jour (p.ex., lun) +file-to.substitution.date.day.long.label=Jour en long (p.ex., lundi) +file-to.substitution.date.day.number.label=Quanti\u00e8me (p.ex., 1) +file-to.substitution.date.day.year.label=Jour de l'ann\u00e9e (p.ex., 216) +file-to.substitution.date.day.month.label=Jour du mois (p.ex., 18) +file-to.substitution.date.month.short.label=Mois en abr\u00e9g\u00e9 (p.ex., jan) +file-to.substitution.date.month.label=Mois (p.ex., jan) +file-to.substitution.date.month.long.label=Mois en long (p.ex., janvier) +file-to.substitution.date.month.number.label=Num\u00e9ro du mois (p.ex., 01) +file-to.substitution.date.year.short.label=Ann\u00e9e en abr\u00e9g\u00e9 (p.ex., 14) +file-to.substitution.date.year.label=Ann\u00e9e (p.ex., 14) +file-to.substitution.date.year.long.label=Ann\u00e9e en long (p.ex., 2014) +file-to.substitution.date.year.week.label=Semaine de l'ann\u00e9e (p.ex., 31) + +## Banner icon messages +banner.rejected-record.info=Voir les informations sur le document d'archives rejet\u00e9 +banner.rejected-record.close=Supprimer l'avertissement associ\u00e9 au rejet du document d'archives +banner.child-classification-in-progress.info=Classification du sous-dossier en cours +banner.child-classification-complete.info=Classification du sous-dossier termin\u00e9e +banner.child-classification-complete.close=Supprimer le message + +## Recordable Versions +label.destroyed-version=Version d\u00e9truite +label.recorded-version=Version enregistr\u00e9e comme document d'archives diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_it.properties new file mode 100644 index 0000000000..c89c38d0e7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_it.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Piano di fascicolazione +page.rmDocumentLibrary.description=Piano di fascicolazione di Records Management +page.rmSearch.title=Ricerca record +page.rmSearch.description=Pagina di ricerca record +page.rmSiteDashboard.title=Pannello di controllo del sito di Records Management +page.rmSiteDashboard.description=Pagina del pannello di controllo del sito di Records Management +page.rmAudit.title=Log di audit +page.rmAudit.description=Pagina del log di audit +page.rmNewReference.title=Nuovo riferimento +page.rmNewReference.description=Nuovo riferimento tra record +page.rmDispositionEdit.title=Modifica Programma di conservazione +page.rmDispositionEdit.description=Pagina per la modifica del programma di conservazione +page.rmPermissions.title=Gestisci Autorizzazioni +page.rmPermissions.description=Pagina per la gestione delle autorizzazioni +page.rmConsole.title=Strumenti di amministrazione RM +page.rmConsole.description=Strumenti di amministrazione di Records Management + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Dettagli delle serie di record +page.rmRecordSeriesDetails.description=Pagina dei dettagli delle serie di record di Records Management +page.rmRecordCategoryDetails.title=Dettagli categoria record +page.rmRecordCategoryDetails.description=Pagina dei dettagli categoria record di Records Management +page.rmRecordFolderDetails.title=Dettagli cartella di record +page.rmRecordFolderDetails.description=Pagina dei dettagli cartella di record di Records Management + +## Forms +label.set.idStatus=Identificazione e stato +label.set.general=Generale +label.set.record=Record +label.set.correspondence=Corrispondenza +label.set.security=Sicurezza +label.set.vitalRecord=Record fondamentale +label.set.disposition=Programma di conservazione +label.set.customMetadata=Propriet\u00e0 personalizzate +label.set.recordVersion=Versione record +label.set.recordFolder=Cartella di record +label.set.recordCategory=Categoria record +label.hold.reason=Motivo +label.hold.delete.empty=Annulla sospensione quando vuoto +label.recordLevelDisposition=Applicato a +label.record=Record +label.folder=Cartella di record +label.declared=Operazione completata +label.recordType=Tipo di record +label.seriesIdentifier=ID Serie record +label.categoryIdentifier=ID Categoria record +label.folderIdentifier=ID Cartella di record +label.recordIdentifier=ID Record +label.dispositionInstructions=Istruzioni per la conservazione +label.dispositionAsOfDate=Data di inizio conservazione +label.physicalSize=Dimensioni fisiche +label.numberOfCopies=Numero di copie +label.storageLocation=Posizione di archiviazione +label.shelf=Scaffale +label.file=File +label.box=Casella +label.versionDescription=Descrizione versione +label.VersionLabel=Etichetta versione + +## Common Property Selector +label.menu.content=Contenuto +label.menu.records=Record +label.menu.disposition=Programma di conservazione +label.menu.specialtypes=Tipi speciali +label.menu.imap=IMAP +label.menu.custom=Propriet\u00e0 personalizzate + +## Buttons +button.reject.record=Respingi record +button.request-info=Richiedi informazioni + +## Pop-up Messages +message.confirm.delete.title=Conferma di eliminazione +message.confirm.delete=Eliminare ''{0}''? +message.confirm.destroy.title=Conferma di eliminazione definitiva +message.confirm.destroy=Procedere con l''eliminazione definitiva di ''{0}''? +message.confirm.destroyMultiple=Procedere con l''eliminazione definitiva dei {0} file selezionati? +message.confirm2.destroy.title=Conferma di eliminazione definitiva +message.confirm2.destroy=Il contenuto del file sar\u00e0 eliminato definitivamente. Continuare? +message.confirm2.destroyMultiple=Il contenuto dei file sar\u00e0 eliminato definitivamente. Continuare? +message.confirm.hide.record.title=Nascondi record +message.confirm.hide.record=Questo file \u00e8 stato trasformato in record. Fare clic su OK per nasconderlo in modo che non possa pi\u00f9 essere visualizzato qui. +message.select=Seleziona... +message.pdf-record-fonts.title=Record PDF: controllo dei caratteri incorporati +message.pdf-record-fonts.accession=Controllare che tutti i record PDF appena trasferiti ad altri includano i caratteri incorporati applicabili. +message.pdf-record-fonts.transfer=Controllare che tutti i record PDF appena trasferiti includano i caratteri incorporati applicabili. +message.pdf-record-fonts.unknown=Se il trasferimento o il trasferimento ad altri ha interessato record PDF, \u00e8 necessario controllare che siano stati inclusi i caratteri incorporati applicabili. +message.request-info-success=Richiesta di informazioni riuscita +message.request-info-failure=Si \u00e8 verificato un problema durante la richiesta di informazioni. +message.confirm.delete-hold.title=Annulla sospensione +message.confirm.delete-hold=Se si elimina la sospensione "{0}" tutti gli elementi in sospeso verranno rilasciati. +message.confirm.close-rejected-record.title=Conferma +message.confirm.close-rejected-record=Rimuovendo l'avviso del record respinto le opzioni per dichiarare il file come record saranno nuovamente disponibili. +message.confirm.unlink.title=Scollega conferma +message.confirm.unlink.text=Procedere con lo scollegamento del record? +message.confirm.close-child-classification-complete.title=La classificazione di elementi figlio \u00e8 completata +message.confirm.close-child-classification-complete=Nascondere il messaggio? + +## Admin Console +message.admin-console-access-denied=\u00c8 necessario disporre di autorizzazioni aggiuntive per accedere a questa pagina. Verificare con il proprio reparto IT. + +# Document path +path.fileplan=Piano di fascicolazione + +## File Plan Actions +actions.more=Segue... +actions.accession=Trasferimento ad altri +actions.close-folder=Chiudi cartella +actions.copy-to=Copia in... +actions.cutoff=Cut off +actions.declare=Completa record +actions.delete=Elimina +actions.destroy=Elimina definitivamente +actions.download=Scarica +actions.download-zip=Scarica zip +actions.edit-details=Modifica metadati +actions.edit-disposition-as-of-date=Modifica data di conservazione +actions.edit-disposition-schedule=Modifica Programma di conservazione +actions.edit-reason=Modifica dettagli sospensione +actions.edit-review-as-of-date=Modifica data di esame +actions.file-report=Archivia rapporto +actions.link-to=Collega a... +actions.unlink-from=Scollega record +actions.file-to=Archivia su... +actions.manage-permissions=Gestisci autorizzazioni +actions.move-to=Sposta in... +actions.open-folder=Riapri cartella +actions.review-all=Esamina tutto +actions.reviewed=Esaminato +actions.add-record-metadata=Aggiungi metadati del record +actions.split-email=Dividi allegati e-mail +actions.transfer=Trasferisci +actions.transfer-complete=Completa trasferimento +actions.undeclare=Riapri record +actions.undo-cutoff=Annulla cut off +actions.create-disposition-schedule=Crea Programma di conservazione +actions.upload-new-version=Carica nuova versione +actions.view-details=Visualizza dettagli +actions.view-audit-log=Visualizza log di audit +actions.declare-file-to=Archivia come record +actions.declare-file-version-to=Archivia versione come record +actions.hide-record=Nascondi record +actions.reject=Respingi +actions.request-info=Richiedi informazioni +actions.file-destruction-report=Genera rapporto di eliminazione definitiva +actions.end-retention=Termina conservazione +action.edit.hold=Modifica sospensione +actions.delete.hold=Annulla sospensione +actions.add-to-hold=Aggiungi a sospesi +actions.remove-from-hold=Rimuovi da sospesi +actions.file-hold-report=Genera rapporto di sospensione +actions.move-dm-record=Sposta record +actions.recorded-version-config=Opzioni di dichiarazione automatica +actions.add-relationship=Aggiungi relazione + +## File Plan Action Outcomes +message.multi-select={0} elementi selezionati +message.accession.failure=Impossibile trasferire ad altri ''{0}''. Contattare il proprio reparto IT. +message.accession.success=Trasferimento ad altri ''{0}'' riuscito +message.accession-complete.failure=Impossibile completare il trasferimento ad altri ''{0}''. Contattare il proprio reparto IT. +message.accession-complete.success=Trasferimento ad altri ''{0}'' completato +message.close.failure=Impossibile chiudere ''{0}''. Contattare il proprio reparto IT. +message.close.success=Chiusura di ''{0}'' riuscita +message.cutoff.failure=Impossibile eseguire il cut off di ''{0}''. Contattare il proprio reparto IT. +message.cutoff.success=Cut off di ''{0}'' riuscito +message.declare.failure=Impossibile completare il record ''{0}'' +message.declare.failure.more=Il record contiene metadati che devono essere completati. +message.declare.success=''{0}'' \u00e8 stato completato +message.delete.failure=Impossibile eliminare ''{0}''. Provare a contattare il proprio reparto IT. +message.delete.success=Eliminazione ''{0}'' riuscita +message.destroy.failure=Impossibile eliminare definitivamente ''{0}''. Contattare il proprio reparto IT. +message.destroy.success=Eliminazione definitiva''{0}'' riuscita +message.edit-disposition-as-of-date.title=Modifica data di conservazione +message.edit-disposition-as-of-date.failure=Impossibile aggiornare la data di inizio della conservazione. Contattare il proprio reparto IT. +message.edit-disposition-as-of-date.success=Aggiornamento della data di inizio della conservazione riuscito per ''{0}'' +message.edit-hold.reason.label=Motivo: +message.edit-hold.title=Aggiorna dettagli sospensione +message.edit-hold.failure=Impossibile aggiornare dettagli sospensione. Contattare il proprio reparto IT. +message.edit-hold.success=Aggiornamento sospensione riuscito +message.edit-review-as-of-date.title=Modifica data di esame +message.edit-review-as-of-date.failure=Impossibile aggiornare la data di inizio dell'esame. Contattare il proprio reparto IT. +message.edit-review-as-of-date.success=Aggiornamento della data di inizio dell''esame riuscito per ''{0}'' +message.open-folder.failure=Impossibile aprire la cartella di record ''{0}''. Contattare il proprio reparto IT. +message.open-folder.success=La cartella di record ''{0}'' \u00e8 stata aperta +message.review-all.failure=Impossibile esaminare i record nella cartella ''{0}''. Contattare il proprio reparto IT. +message.review-all.success=I record nella cartella ''{0}'' sono stati esaminati +message.reviewed.failure=Impossibile esaminare ''{0}''. Contattare il proprio reparto IT. +message.reviewed.success=Esame di ''{0}'' riuscito +message.split-email.failure=Impossibile separare gli allegati da ''{0}'' +message.split-email.success=Separazione degli allegati da ''{0}'' riuscita. Contattare il proprio reparto IT. +message.transfer.failure=Impossibile trasferire ''{0}''. Contattare il proprio reparto IT. +message.transfer.success=Trasferimento di ''{0}'' riuscito +message.transfer-complete.failure=Impossibile completare il trasferimento di ''{0}''. Contattare il proprio reparto IT. +message.transfer-complete.success=Il trasferimento di ''{0}'' \u00e8 stato completato +message.undeclare.failure=Impossibile riaprire ''{0}''. Contattare il proprio reparto IT. +message.undeclare.success=''{0}'' non \u00e8 pi\u00f9 un record completo +message.undo-cutoff.failure=Impossibile annullare il cut off per ''{0}''. Contattare il proprio reparto IT. +message.undo-cutoff.success=Annulla cut off per ''{0}'' +message.create-disposition-schedule.failure=Impossibile creare il programma di conservazione per ''{0}''. Contattare il proprio reparto IT. +message.create-disposition-schedule.success=Programma di conservazione per ''{0}'' creato +message.create-record.success=Questo file \u00e8 stato trasformato in record e si hanno a disposizione azioni limitate +message.create-record.failure=Impossibile dichiarare come record. Contattare il proprio reparto IT. +message.declare-version-as-record.success=Questa versione del file \u00e8 stata dichiarata come record +message.declare-version-as-record.failure=Impossibile dichiarare la versione come record. Contattare il proprio reparto IT. +message.hide-record.success=Record ''{0}'' nascosto correttamente. +message.hide-record.failure=Impossibile nascondere il record ''{0}''. Contattare il proprio reparto IT. +message.reject.reason=Motivo: +message.reject.title=Motivo del rifiuto +message.reject.failure=Impossibile respingere ''{0}''. Contattare il proprio reparto IT. +message.reject.success=''{0}'' respinto +message.file-destruction-report.failure=Impossibile generare il rapporto di eliminazione definitiva. Contattare il proprio reparto IT. +message.file-destruction-report.success=Rapporto di eliminazione definitiva generato +message.end-retention.failure=Impossibile terminare la conservazione. Contattare il proprio reparto IT. +message.end-retention.success=Conservazione terminata +message.file-success=Archiviazione di rapporto come ''{0}'' riuscita +message.file-failure=Impossibile completare l'operazione su file. Contattare il proprio reparto IT. +message.file-hold-report.failure=Impossibile generare rapporto di sospensione. Contattare il proprio reparto IT. +message.file-hold-report.success=Rapporto di sospensione generato +message.delete-hold.failure=Impossibile cancellare la sospensione. Contattare il proprio reparto IT. +message.delete-hold.success=Sospensione cancellata +message.moveDmRecord.failure=Impossibile spostare il record ''{0}''. Contattare il proprio reparto IT. +message.moveDmRecord.success=Record ''{0}'' spostato correttamente. +message.recordedVersionConfig.success=Opzioni di dichiarazione automatica impostate correttamente +message.recordedVersionConfig.failure=Impossibile impostare le opzioni di dichiarazione automatica. Contattare il proprio reparto IT. +message.unlink.success=Scollegamento record riuscito +message.unlink.failure=Impossibile scollegare il record. Contattare il proprio reparto IT. + +## File Plan Status Indicators +status.active-workflows=Appartiene a {0} workflow attivi +status.rm-accession=Trasferimento ad altri in sospeso +status.rm-accessioned=Trasferito ad altri +status.rm-closed=Chiuso +status.rm-cutoff=Cut off +status.rm-cutoff-folder=Cut off +status.rm-destroyed=Eliminato definitivamente +status.rm-frozen=In sospeso +status.rm-multi-parent=Collegato in cartelle di record multiple +status.rm-open=Apri +status.rm-transfer=Trasferimento in sospeso +status.rm-transferred=Trasferito +status.rm-vital-record=Record fondamentale +status.rm-rejected-record=Respinto +status.rm-disposition-schedule=La categoria record ha un programma di conservazione definito +status.rm-digital-photograph-record=Record fotografia digitale +status.rm-pdf-record=Record PDF +status.rm-scanned-record=Record scansionato +status.rm-web-record=Record Web +status.rm-is-record=Record +status.rules=La cartella ha regole attive +status.rm-version-record=Record versione +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Tutte le revisioni saranno registrate +status.rm-recorded-version-history-major-revisions=Saranno registrate solo le revisioni maggiori + +# Exif +status.exif=Metadati EXIF disponibili +status.geographic=Metadati di geolocalizzazione disponibili +status.dod5015-digital-photograph-record=Record fotografia digitale +status.dod5015-pdf-record=Record PDF +status.dod5015-scanned-record=Record scansionato +status.dod5015-web-record=Record Web + +# RMA model metadata fields +label.all=Tutti +label.keywords=Parole chiave (testo e nome) +label.identifier=ID +label.dateFiled=Data di archiviazione +label.publicationDate=Data di pubblicazione +label.originator=Iniziatore +label.originatingOrganization=Organizzazione di origine +label.mediaType=Tipo di supporto +label.format=Formato +label.dateReceived=Data di ricezione +label.supplementalMarkingList=Elenco di contrassegni supplementare +label.vitalRecord=Record fondamentale +label.reviewDate=Data di esame +label.address=Destinatario +label.otherAddress=Altro destinatario +label.unpublishedUpdates=Aggiornamenti non pubblicati +label.publishInProgress=Pubblicazione in corso + +# IMAP model metadata fields +label.imap.threadIndex=Indice tema IMAP +label.imap.messageFrom=Messaggio IMAP da +label.imap.messageTo=Messaggio IMAP a +label.imap.messageCc=Messaggio IMAP Cc +label.imap.messageSubject=Oggetto messaggio IMAP +label.imap.dateReceived=Data di ricezione IMAP +label.imap.dateSent=Data di invio IMAP + +# DOD model metadata fields +label.dod.scannedFormatVersion=Formato immagine e versione +label.dod.resolutionX=Risoluzione immagine X +label.dod.resolutionY=Risoluzione immagine Y +label.dod.scannedBitDepth=Profondit\u00e0 in bit scansionata +label.dod.producingApplication=Generazione applicazione +label.dod.producingApplicationVersion=Generazione versione applicazione +label.dod.pdfVersion=Versione PDF +label.dod.creatingApplication=Creazione applicazione +label.dod.documentSecuritySettings=Impostazioni di protezione documento +label.dod.caption=Didascalia +label.dod.photographer=Fotografo +label.dod.copyright=Copyright +label.dod.bitDepth=Profondit\u00e0 in bit +label.dod.imageSizeX=Dimensioni immagine X +label.dod.imageSizeY=Dimensioni immagine Y +label.dod.imageSource=Origine immagine +label.dod.compression=Compressione +label.dod.iccIcmProfile=Profilo ICC/ICM +label.dod.exifInformation=Informazioni EXIF +label.dod.webFileName=Nome file Web +label.dod.webPlatform=Piattaforma Web +label.dod.webSiteName=Nome sito Web +label.dod.webSiteURL=URL sito Web +label.dod.captureMethod=Metodo di acquisizione +label.dod.captureDate=Data di acquisizione +label.dod.contact=Contatto +label.dod.contentManagementSystem=Sistema di gestione dei contenuti + +# RM Admin Console tools +tool.rm-define-roles.label=Definisci ruoli +tool.rm-define-roles.description=Crea e modifica ruoli +tool.rm-custom-metadata.label=Metadati personalizzati +tool.rm-custom-metadata.description=Metadati personalizzati +tool.rm-list-of-values.label=Elenco di valori +tool.rm-list-of-values.description=Definizioni elenco di valori +tool.rm-references.label=Relazioni +tool.rm-references.description=Definizioni relazioni +tool.rm-events.label=Eventi +tool.rm-events.description=Definizioni evento +tool.rm-audit.label=Audit +tool.rm-audit.description=Audit di Records Management +tool.rm-email-mappings.label=Mapping e-mail +tool.rm-email-mappings.description=Definizioni mapping e-mail +tool.rm-user-rights.label=Rapporto diritti utente +tool.rm-user-rights.description=Rapporto diritti utente +tool.rm-users-and-groups.label=Utenti e gruppi +tool.rm-users-and-groups.description=Utenti e gruppi + +## Buttons +button.sort.ascending=Ordinamento crescente +button.sort.descending=Ordinamento decrescente +button.folders.show=Mostra cartelle +button.folders.hide=Nascondi cartelle +button.view.simple=Visualizzazione semplice +button.view.detailed=Visualizzazione dettagliata + +## Drop-down Menus +menu.select=Seleziona +menu.select.all=Tutti +menu.select.none=Nessuno +menu.select.invert=Inverti selezione +menu.select.folders=Cartelle +menu.select.documents=Documenti +menu.select.records=Record +menu.select.undeclaredRecords=Record incompleti +menu.select.recordFolders=Cartelle record +menu.select.recordCategories=Categorie record + +## Metadata Fields +# Generic +details.created.on=Creato il +details.created.by=Creato da +details.modified.on=Modificato il +details.modified.by=Modificato da +details.by=Da +details.size=Dimensioni +details.description=Descrizione +details.description.none=(Nessuno) +# Record Category +details.category.identifier=ID Categoria record +details.category.disposition-authority=Autorit\u00e0 di conservazione +details.category.disposition-instructions=Istruzioni per la conservazione +details.category.vital-record-indicator=Indicatore record fondamentale +# Record Folder +details.folder.identifier=ID Cartella di record +details.folder.vital-record-indicator=Indicatore record fondamentale +# Record +details.record.identifier=ID univoco record +details.record.date-filed=Data di archiviazione +details.record.publication-date=Data di pubblicazione +details.record.originator=Iniziatore +details.record.originating-organization=Organizzazione di origine +details.version.label=Versione +# Incomplete Record +details.undeclared-record.info=Record incompleto +# Rejected Record +details.rejected-record.info=Record respinto +# Transfer Container +details.transfer-container.title=Trasferisci {0} +details.transfer-container.is-accession=Nota: il tipo di trasferimento \u00e8 il trasferimento ad altri +# Hold Container +details.hold.title=Sospensione creata su {0} +details.hold.title.date-format=dd mmmm yyyy 'alle' HH:MM:ss +details.hold.reason=Motivo sospensione +details.hold.reason.none=Non disponibile +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=ID Cartella + +## File Upload (upload new version) +label.filter-description=Stesso tipo di {0} + +## Empty List +no.items.title=Nessun elemento + +## Tips +tip.insitu-rename=Rinomina +tip.insitu-tag=Tag + +## Help panels, including Drag and Drop +show.folders=Mostra {0} sottocartelle + +## Create site dialog +description.recordsManagementSite=Sito di Records Management +title.recordsManagementSite=Records Management +type.recordsManagementSite=Sito di Records Management +compliance.standard=Standard +compliance.dod5015=DoD 5015.2-STD +label.compliance=Conformit\u00e0 + +## Console title +link.managementConsole=Console di gestione + +## Rules +customise.reject.text=Respingi record con commento ''{param.reason}'' +customise.requestInfo.text=Crea un compito di workflow per un elenco di persone specificate e richiede le seguenti informazioni ''{param.requestedInfo}'' +customise.sendEmail.text=Invia e-mail con oggetto ''{param.subject}'' ai destinatari specificati + +## Records Management Admin Tools +header.rm-console.label=Records Management... +header.rm-management.label=Console di gestione +header.rm-management.description=Console di gestione + +## Request Info Workflow +rm.wf.information-requested-for-record=Informazioni richieste per record +rm.wf.request-information-from=Richiedi informazioni da +rm.wf.requested-information=Informazioni richieste +rm.wf.record=Record +rm.wf.selected-users-and-groups=Utenti e gruppi +rm.wf.give-details=Fornisci informazioni +rm.wf.message=Messaggio +rm.wf.details=Dettagli + +## Text length validation +message.max.text.length.validation=Immettere il testo con meno di {max} caratteri + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=Selezionare un periodo di esame + +## Forms +form.control.object-picker.items-list.empty=Nessun elemento +form.control.object-picker.items-list.loading=Caricamento in corso... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=Titolo +file-to.substitution.node.cm.description.label=Descrizione +file-to.substitution.node.cm.accessed.label=Ultimo accesso +file-to.substitution.node.cm.created.label=Data creazione +file-to.substitution.node.cm.creator.label=Creatore +file-to.substitution.node.cm.modified.label=Ultima modifica +file-to.substitution.node.cm.modifier.label=Modificatore +file-to.substitution.node.cm.name.label=Nome +file-to.substitution.node.rma.origionalName.label=Nome nodo originale +file-to.substitution.node.rma.dateFiled.label=Data di archiviazione +file-to.substitution.node.rma.location.label=Posizione +file-to.substitution.node.rma.dbUniquenessId.label=ID database univoco +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=ID nodo +file-to.substitution.node.sys.store-identifier.label=ID deposito +file-to.substitution.node.sys.store-protocol.label=Protocollo archivio +file-to.substitution.date.day.short.label=Abbreviazione giorno (ad es. lun) +file-to.substitution.date.day.label=Giorno (ad es. lun) +file-to.substitution.date.day.long.label=Giorno per esteso (ad es. luned\u00ec) +file-to.substitution.date.day.number.label=Numero giorni (ad es. 1) +file-to.substitution.date.day.year.label=Giorni dell'anno (ad es. 216) +file-to.substitution.date.day.month.label=Giorno del mese (ad es. 18) +file-to.substitution.date.month.short.label=Abbreviazione mese (ad es. gen) +file-to.substitution.date.month.label=Mese (ad es. gen) +file-to.substitution.date.month.long.label=Mese per esteso (ad es. gen) +file-to.substitution.date.month.number.label=Numero mese (ad es. 01) +file-to.substitution.date.year.short.label=Abbreviazione anno (ad es. 14) +file-to.substitution.date.year.label=Anno (ad es. 14) +file-to.substitution.date.year.long.label=Anno per esteso (ad es. 2014) +file-to.substitution.date.year.week.label=Settimana dell'anno (ad es. 31) + +## Banner icon messages +banner.rejected-record.info=Vedere le informazioni sul record respinto +banner.rejected-record.close=Rimuovere l'avviso del record respinto +banner.child-classification-in-progress.info=Classificazione elementi figlio in corso +banner.child-classification-complete.info=Classificazione elementi figlio completata +banner.child-classification-complete.close=Rimuovi messaggio + +## Recordable Versions +label.destroyed-version=Versione eliminata definitivamente +label.recorded-version=Versione registrata diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_ja.properties new file mode 100644 index 0000000000..c253daa670 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_ja.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +page.rmDocumentLibrary.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u306e\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +page.rmSearch.title=\u30ec\u30b3\u30fc\u30c9\u306e\u691c\u7d22 +page.rmSearch.description=\u30ec\u30b3\u30fc\u30c9\u306e\u691c\u7d22\u30da\u30fc\u30b8 +page.rmSiteDashboard.title=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u30b5\u30a4\u30c8\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +page.rmSiteDashboard.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u30b5\u30a4\u30c8\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30da\u30fc\u30b8 +page.rmAudit.title=\u76e3\u67fb\u30ed\u30b0 +page.rmAudit.description=\u76e3\u67fb\u30ed\u30b0\u30da\u30fc\u30b8 +page.rmNewReference.title=\u65b0\u898f\u53c2\u7167 +page.rmNewReference.description=\u30ec\u30b3\u30fc\u30c9\u9593\u3067\u306e\u65b0\u898f\u53c2\u7167 +page.rmDispositionEdit.title=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306e\u7de8\u96c6 +page.rmDispositionEdit.description=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306e\u7de8\u96c6\u30da\u30fc\u30b8 +page.rmPermissions.title=\u6a29\u9650\u306e\u7ba1\u7406 +page.rmPermissions.description=\u6a29\u9650\u3092\u7ba1\u7406\u3059\u308b\u30da\u30fc\u30b8 +page.rmConsole.title=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u306e\u7ba1\u7406\u8005\u7528\u30c4\u30fc\u30eb +page.rmConsole.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u306e\u7ba1\u7406\u8005\u7528\u30c4\u30fc\u30eb + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=\u30ec\u30b3\u30fc\u30c9\u30b7\u30ea\u30fc\u30ba\u306e\u8a73\u7d30 +page.rmRecordSeriesDetails.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u7528\u306e\u30ec\u30b3\u30fc\u30c9\u30b7\u30ea\u30fc\u30ba\u306e\u8a73\u7d30\u30da\u30fc\u30b8 +page.rmRecordCategoryDetails.title=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea\u306e\u8a73\u7d30 +page.rmRecordCategoryDetails.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u7528\u306e\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea\u306e\u8a73\u7d30\u30da\u30fc\u30b8 +page.rmRecordFolderDetails.title=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30 +page.rmRecordFolderDetails.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u7528\u306e\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30\u30da\u30fc\u30b8 + +## Forms +label.set.idStatus=ID \u3068\u30b9\u30c6\u30fc\u30bf\u30b9 +label.set.general=\u4e00\u822c +label.set.record=\u30ec\u30b3\u30fc\u30c9 +label.set.correspondence=\u5bfe\u5fdc +label.set.security=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 +label.set.vitalRecord=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9 +label.set.disposition=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb +label.set.customMetadata=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3 +label.set.recordVersion=\u30ec\u30b3\u30fc\u30c9\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 +label.set.recordFolder=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +label.set.recordCategory=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea +label.hold.reason=\u7406\u7531 +label.hold.delete.empty=\u7a7a\u306e\u5834\u5408\u306f\u30db\u30fc\u30eb\u30c9\u3092\u524a\u9664 +label.recordLevelDisposition=\u9069\u7528\u5148 +label.record=\u30ec\u30b3\u30fc\u30c9 +label.folder=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +label.declared=\u5b8c\u4e86 +label.recordType=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7 +label.seriesIdentifier=\u30ec\u30b3\u30fc\u30c9\u30b7\u30ea\u30fc\u30ba ID +label.categoryIdentifier=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea ID +label.folderIdentifier=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ID +label.recordIdentifier=\u30ec\u30b3\u30fc\u30c9 ID +label.dispositionInstructions=\u4fdd\u7ba1\u6307\u793a +label.dispositionAsOfDate=\u4fdd\u7ba1\u51e6\u7406\u306e\u5b9f\u884c\u65e5 +label.physicalSize=\u7269\u7406\u7684\u306a\u30b5\u30a4\u30ba +label.numberOfCopies=\u30b3\u30d4\u30fc\u6570 +label.storageLocation=\u4fdd\u7ba1\u5834\u6240 +label.shelf=\u68da +label.file=\u30d5\u30a1\u30a4\u30eb +label.box=\u7bb1 +label.versionDescription=\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u8aac\u660e +label.VersionLabel=\u30d0\u30fc\u30b8\u30e7\u30f3\u30e9\u30d9\u30eb + +## Common Property Selector +label.menu.content=\u30b3\u30f3\u30c6\u30f3\u30c4 +label.menu.records=\u30ec\u30b3\u30fc\u30c9 +label.menu.disposition=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb +label.menu.specialtypes=\u7279\u6b8a\u30bf\u30a4\u30d7 +label.menu.imap=IMAP +label.menu.custom=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3 + +## Buttons +button.reject.record=\u30ec\u30b3\u30fc\u30c9\u306e\u5374\u4e0b +button.request-info=\u60c5\u5831\u306e\u30ea\u30af\u30a8\u30b9\u30c8 + +## Pop-up Messages +message.confirm.delete.title=\u524a\u9664\u306e\u78ba\u8a8d +message.confirm.delete=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.confirm.destroy.title=\u7834\u68c4\u306e\u78ba\u8a8d +message.confirm.destroy=''{0}'' \u3092\u7834\u68c4\u3057\u307e\u3059\u304b? +message.confirm.destroyMultiple=\u9078\u629e\u3057\u305f {0} \u500b\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7834\u68c4\u3057\u307e\u3059\u304b? +message.confirm2.destroy.title=\u7834\u68c4\u306e\u78ba\u8a8d +message.confirm2.destroy=\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u5b8c\u5168\u306b\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? +message.confirm2.destroyMultiple=\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u5b8c\u5168\u306b\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? +message.confirm.hide.record.title=\u30ec\u30b3\u30fc\u30c9\u3092\u975e\u8868\u793a\u306b\u3059\u308b +message.confirm.hide.record=\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \u3053\u3053\u306b\u8868\u793a\u3055\u308c\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u5834\u5408\u306f\u3001[OK] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.select=\u9078\u629e... +message.pdf-record-fonts.title=PDF \u30ec\u30b3\u30fc\u30c9\uff1a\u7d44\u307f\u8fbc\u307f\u30d5\u30a9\u30f3\u30c8\u306e\u30c1\u30a7\u30c3\u30af +message.pdf-record-fonts.accession=\u53d7\u8afe\u3055\u308c\u305f\u3070\u304b\u308a\u306e PDF \u30ec\u30b3\u30fc\u30c9\u306b\u3001\u9069\u5207\u306a\u7d44\u307f\u8fbc\u307f\u30d5\u30a9\u30f3\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002 +message.pdf-record-fonts.transfer=\u8ee2\u9001\u3055\u308c\u305f\u3070\u304b\u308a\u306e PDF \u30ec\u30b3\u30fc\u30c9\u306b\u3001\u9069\u5207\u306a\u7d44\u307f\u8fbc\u307f\u30d5\u30a9\u30f3\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002 +message.pdf-record-fonts.unknown=PDF \u30ec\u30b3\u30fc\u30c9\u3092\u8ee2\u9001\u307e\u305f\u306f\u53d7\u8afe\u3057\u305f\u5834\u5408\u306f\u3001\u9069\u5207\u306a\u7d44\u307f\u8fbc\u307f\u30d5\u30a9\u30f3\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.request-info-success=\u60c5\u5831\u304c\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u307e\u3057\u305f +message.request-info-failure=\u60c5\u5831\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +message.confirm.delete-hold.title=\u30db\u30fc\u30eb\u30c9\u306e\u524a\u9664 +message.confirm.delete-hold=\u30db\u30fc\u30eb\u30c9 ''{0}'' \u3092\u524a\u9664\u3059\u308b\u3068\u3001\u305d\u306e\u3059\u3079\u3066\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u30db\u30fc\u30eb\u30c9\u304c\u89e3\u9664\u3055\u308c\u307e\u3059\u3002 +message.confirm.close-rejected-record.title=\u78ba\u5b9a +message.confirm.close-rejected-record=\u5374\u4e0b\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9\u306e\u8b66\u544a\u3092\u524a\u9664\u3059\u308b\u3068\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3059\u308b\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u307e\u305f\u4f7f\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002 +message.confirm.unlink.title=\u30ea\u30f3\u30af\u89e3\u9664\u306e\u78ba\u8a8d +message.confirm.unlink.text=\u3053\u306e\u30ec\u30b3\u30fc\u30c9\u306e\u30ea\u30f3\u30af\u3092\u89e3\u9664\u3057\u307e\u3059\u304b? +message.confirm.close-child-classification-complete.title=\u5b50\u306e\u5206\u985e\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f +message.confirm.close-child-classification-complete=\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u975e\u8868\u793a\u306b\u3057\u307e\u3059\u304b? + +## Admin Console +message.admin-console-access-denied=\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u3001\u5225\u306e\u6a29\u9650\u304c\u65b0\u305f\u306b\u5fc5\u8981\u3067\u3059\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +# Document path +path.fileplan=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 + +## File Plan Actions +actions.more=\u305d\u306e\u4ed6... +actions.accession=\u53d7\u8afe +actions.close-folder=\u30d5\u30a9\u30eb\u30c0\u3092\u9589\u3058\u308b +actions.copy-to=\u30b3\u30d4\u30fc\u5148... +actions.cutoff=\u30ab\u30c3\u30c8\u30aa\u30d5 +actions.declare=\u30ec\u30b3\u30fc\u30c9\u306e\u5b8c\u4e86 +actions.delete=\u524a\u9664 +actions.destroy=\u7834\u68c4 +actions.download=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +actions.download-zip=Zip \u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +actions.edit-details=\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u7de8\u96c6 +actions.edit-disposition-as-of-date=\u4fdd\u7ba1\u65e5\u306e\u7de8\u96c6 +actions.edit-disposition-schedule=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306e\u7de8\u96c6 +actions.edit-reason=\u30db\u30fc\u30eb\u30c9\u306e\u8a73\u7d30\u306e\u7de8\u96c6 +actions.edit-review-as-of-date=\u30ec\u30d3\u30e5\u30fc\u65e5\u306e\u7de8\u96c6 +actions.file-report=\u30ec\u30dd\u30fc\u30c8\u306e\u30d5\u30a1\u30a4\u30eb +actions.link-to=\u30ea\u30f3\u30af\u5148... +actions.unlink-from=\u30ec\u30b3\u30fc\u30c9\u306e\u30ea\u30f3\u30af\u89e3\u9664 +actions.file-to=\u6574\u7406\u4fdd\u7ba1\u5148... +actions.manage-permissions=\u6a29\u9650\u306e\u7ba1\u7406 +actions.move-to=\u79fb\u52d5\u5148... +actions.open-folder=\u30d5\u30a9\u30eb\u30c0\u3092\u518d\u5ea6\u958b\u304f +actions.review-all=\u3059\u3079\u3066\u30ec\u30d3\u30e5\u30fc +actions.reviewed=\u30ec\u30d3\u30e5\u30fc\u6e08\u307f +actions.add-record-metadata=\u30ec\u30b3\u30fc\u30c9\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u8ffd\u52a0 +actions.split-email=E \u30e1\u30fc\u30eb\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u306e\u5206\u96e2 +actions.transfer=\u8ee2\u9001 +actions.transfer-complete=\u8ee2\u9001\u306e\u5b8c\u4e86 +actions.undeclare=\u30ec\u30b3\u30fc\u30c9\u3092\u518d\u5ea6\u958b\u304f +actions.undo-cutoff=\u30ab\u30c3\u30c8\u30aa\u30d5\u3092\u5143\u306b\u623b\u3059 +actions.create-disposition-schedule=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306e\u4f5c\u6210 +actions.upload-new-version=\u65b0\u898f\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +actions.view-details=\u8a73\u7d30\u306e\u8868\u793a +actions.view-audit-log=\u76e3\u67fb\u30ed\u30b0\u306e\u8868\u793a +actions.declare-file-to=\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1 +actions.declare-file-version-to=\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1 +actions.hide-record=\u30ec\u30b3\u30fc\u30c9\u3092\u975e\u8868\u793a\u306b\u3059\u308b +actions.reject=\u5374\u4e0b +actions.request-info=\u60c5\u5831\u306e\u30ea\u30af\u30a8\u30b9\u30c8 +actions.file-destruction-report=\u7834\u68c4\u30ec\u30dd\u30fc\u30c8\u306e\u4f5c\u6210 +actions.end-retention=\u4fdd\u7ba1\u306e\u7d42\u4e86 +action.edit.hold=\u30db\u30fc\u30eb\u30c9\u306e\u7de8\u96c6 +actions.delete.hold=\u30db\u30fc\u30eb\u30c9\u306e\u524a\u9664 +actions.add-to-hold=\u30db\u30fc\u30eb\u30c9\u306b\u8ffd\u52a0 +actions.remove-from-hold=\u30db\u30fc\u30eb\u30c9\u304b\u3089\u524a\u9664 +actions.file-hold-report=\u30db\u30fc\u30eb\u30c9\u30ec\u30dd\u30fc\u30c8\u306e\u4f5c\u6210 +actions.move-dm-record=\u30ec\u30b3\u30fc\u30c9\u306e\u79fb\u52d5 +actions.recorded-version-config=\u81ea\u52d5\u5ba3\u8a00\u30aa\u30d7\u30b7\u30e7\u30f3 +actions.add-relationship=\u95a2\u4fc2\u306e\u8ffd\u52a0 + +## File Plan Action Outcomes +message.multi-select={0} \u500b\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u3059 +message.accession.failure=''{0}'' \u3092\u53d7\u8afe\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.accession.success=''{0}'' \u304c\u53d7\u8afe\u3055\u308c\u307e\u3057\u305f +message.accession-complete.failure=''{0}'' \u306e\u53d7\u8afe\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.accession-complete.success=''{0}'' \u306e\u53d7\u8afe\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f +message.close.failure=''{0}'' \u3092\u9589\u3058\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.close.success=''{0}'' \u304c\u9589\u3058\u3089\u308c\u307e\u3057\u305f +message.cutoff.failure=''{0}'' \u3092\u30ab\u30c3\u30c8\u30aa\u30d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002 +message.cutoff.success=''{0}'' \u3092\u6b63\u5e38\u306b\u30ab\u30c3\u30c8\u30aa\u30d5\u3057\u307e\u3057\u305f +message.declare.failure=''{0}'' \u30ec\u30b3\u30fc\u30c9\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.declare.failure.more=\u30ec\u30b3\u30fc\u30c9\u306b\u5b8c\u4e86\u3059\u308b\u5fc5\u8981\u306e\u3042\u308b\u30e1\u30bf\u30c7\u30fc\u30bf\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002 +message.declare.success=''{0}'' \u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f +message.delete.failure=''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.delete.success=''{0}'' \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.destroy.failure=''{0}'' \u3092\u7834\u68c4\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.destroy.success=''{0}'' \u304c\u7834\u68c4\u3055\u308c\u307e\u3057\u305f +message.edit-disposition-as-of-date.title=\u4fdd\u7ba1\u65e5\u306e\u7de8\u96c6 +message.edit-disposition-as-of-date.failure=\u4fdd\u7ba1\u51e6\u7406\u306e\u5b9f\u884c\u65e5\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-disposition-as-of-date.success=''{0}'' \u306e\u4fdd\u7ba1\u51e6\u7406\u306e\u5b9f\u884c\u65e5\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.edit-hold.reason.label=\u7406\u7531: +message.edit-hold.title=\u30db\u30fc\u30eb\u30c9\u306e\u8a73\u7d30\u306e\u66f4\u65b0 +message.edit-hold.failure=\u30db\u30fc\u30eb\u30c9\u306e\u8a73\u7d30\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-hold.success=\u30db\u30fc\u30eb\u30c9\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.edit-review-as-of-date.title=\u30ec\u30d3\u30e5\u30fc\u65e5\u306e\u7de8\u96c6 +message.edit-review-as-of-date.failure=\u30ec\u30d3\u30e5\u30fc\u306e\u5b9f\u884c\u65e5\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-review-as-of-date.success=''{0}'' \u306e\u30ec\u30d3\u30e5\u30fc\u306e\u5b9f\u884c\u65e5\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.open-folder.failure=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u3092\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.open-folder.success=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u304c\u958b\u304b\u308c\u307e\u3057\u305f +message.review-all.failure=\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u5185\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u30ec\u30d3\u30e5\u30fc\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.review-all.success=\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u5185\u306e\u30ec\u30b3\u30fc\u30c9\u306f\u30ec\u30d3\u30e5\u30fc\u3055\u308c\u3066\u3044\u307e\u3059 +message.reviewed.failure=''{0}'' \u3092\u30ec\u30d3\u30e5\u30fc\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.reviewed.success=''{0}'' \u304c\u30ec\u30d3\u30e5\u30fc\u3055\u308c\u307e\u3057\u305f +message.split-email.failure=\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u3092 ''{0}'' \u304b\u3089\u5206\u96e2\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.split-email.success=\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u304c ''{0}'' \u304b\u3089\u5206\u96e2\u3055\u308c\u307e\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.transfer.failure=''{0}'' \u3092\u8ee2\u9001\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.transfer.success=''{0}'' \u304c\u8ee2\u9001\u3055\u308c\u307e\u3057\u305f +message.transfer-complete.failure=''{0}'' \u306e\u8ee2\u9001\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.transfer-complete.success=''{0}'' \u306e\u8ee2\u9001\u306f\u5b8c\u4e86\u3057\u3066\u3044\u307e\u3059 +message.undeclare.failure=''{0}'' \u3092\u518d\u5ea6\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.undeclare.success=''{0}'' \u306f\u3082\u3046\u5b8c\u4e86\u30ec\u30b3\u30fc\u30c9\u3067\u306f\u3042\u308a\u307e\u305b\u3093 +message.undo-cutoff.failure=''{0}'' \u306e\u30ab\u30c3\u30c8\u30aa\u30d5\u3092\u5143\u306b\u623b\u305b\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT\u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.undo-cutoff.success=''{0}'' \u306e\u30ab\u30c3\u30c8\u30aa\u30d5\u3092\u5143\u306b\u623b\u3059 +message.create-disposition-schedule.failure=''{0}'' \u306e\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.create-disposition-schedule.success=''{0}'' \u306e\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.create-record.success=\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u9650\u3089\u308c\u305f\u51e6\u7406\u3057\u304b\u3067\u304d\u307e\u305b\u3093 +message.create-record.failure=\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.declare-version-as-record.success=\u30d5\u30a1\u30a4\u30eb\u306e\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3055\u308c\u307e\u3057\u305f +message.declare-version-as-record.failure=\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.hide-record.success=\u30ec\u30b3\u30fc\u30c9 ''{0}'' \u304c\u975e\u8868\u793a\u306b\u306a\u308a\u307e\u3057\u305f +message.hide-record.failure=\u30ec\u30b3\u30fc\u30c9 ''{0}'' \u3092\u975e\u8868\u793a\u306b\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.reject.reason=\u7406\u7531: +message.reject.title=\u5374\u4e0b\u3059\u308b\u7406\u7531 +message.reject.failure=''{0}'' \u3092\u5374\u4e0b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.reject.success=''{0}'' \u304c\u5374\u4e0b\u3055\u308c\u307e\u3057\u305f +message.file-destruction-report.failure=\u7834\u68c4\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.file-destruction-report.success=\u7834\u68c4\u30ec\u30dd\u30fc\u30c8\u304c\u6210\u3055\u308c\u307e\u3057\u305f +message.end-retention.failure=\u4fdd\u7ba1\u3092\u7d42\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.end-retention.success=\u4fdd\u7ba1\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f +message.file-success=\u30ec\u30dd\u30fc\u30c8\u304c ''{0}'' \u3068\u3057\u3066\u6b63\u5e38\u306b\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u307e\u3057\u305f +message.file-failure=\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT\u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.file-hold-report.failure=\u30db\u30fc\u30eb\u30c9\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.file-hold-report.success=\u30db\u30fc\u30eb\u30c9\u30ec\u30dd\u30fc\u30c8\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.delete-hold.failure=\u30db\u30fc\u30eb\u30c9\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.delete-hold.success=\u30db\u30fc\u30eb\u30c9\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.moveDmRecord.failure=\u30ec\u30b3\u30fc\u30c9 ''{0}'' \u3092\u79fb\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.moveDmRecord.success=\u30ec\u30b3\u30fc\u30c9 ''{0}'' \u304c\u79fb\u52d5\u3055\u308c\u307e\u3057\u305f +message.recordedVersionConfig.success=\u81ea\u52d5\u5ba3\u8a00\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f +message.recordedVersionConfig.failure=\u81ea\u52d5\u5ba3\u8a00\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.unlink.success=\u30ec\u30b3\u30fc\u30c9\u306e\u30ea\u30f3\u30af\u304c\u89e3\u9664\u3055\u308c\u307e\u3057\u305f +message.unlink.failure=\u30ec\u30b3\u30fc\u30c9\u306e\u30ea\u30f3\u30af\u3092\u89e3\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +## File Plan Status Indicators +status.active-workflows=\u30a2\u30af\u30c6\u30a3\u30d6\u30ef\u30fc\u30af\u30d5\u30ed\u30fc{0}\u306b\u5c5e\u3057\u3066\u3044\u307e\u3059 +status.rm-accession=\u53d7\u8afe\u4fdd\u7559 +status.rm-accessioned=\u53d7\u8afe\u6e08\u307f +status.rm-closed=\u7d42\u4e86\u6e08\u307f +status.rm-cutoff=\u30ab\u30c3\u30c8\u30aa\u30d5 +status.rm-cutoff-folder=\u30ab\u30c3\u30c8\u30aa\u30d5 +status.rm-destroyed=\u7834\u68c4\u6e08\u307f +status.rm-frozen=\u30db\u30fc\u30eb\u30c9\u4e2d +status.rm-multi-parent=\u8907\u6570\u306e\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306b\u30ea\u30f3\u30af\u6e08\u307f +status.rm-open=\u958b\u304f +status.rm-transfer=\u8ee2\u9001\u4fdd\u7559 +status.rm-transferred=\u8ee2\u9001\u6e08\u307f +status.rm-vital-record=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9 +status.rm-rejected-record=\u5374\u4e0b\u6e08\u307f +status.rm-disposition-schedule=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea\u306b\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059 +status.rm-digital-photograph-record=\u30c7\u30b8\u30bf\u30eb\u5199\u771f\u30ec\u30b3\u30fc\u30c9 +status.rm-pdf-record=PDF \u30ec\u30b3\u30fc\u30c9 +status.rm-scanned-record=\u30b9\u30ad\u30e3\u30f3\u6e08\u307f\u30ec\u30b3\u30fc\u30c9 +status.rm-web-record=Web \u30ec\u30b3\u30fc\u30c9 +status.rm-is-record=\u30ec\u30b3\u30fc\u30c9 +status.rules=\u30d5\u30a9\u30eb\u30c0\u306b\u306f\u30eb\u30fc\u30eb\u304c\u9069\u7528\u3055\u308c\u3066\u3044\u307e\u3059 +status.rm-version-record=\u30d0\u30fc\u30b8\u30e7\u30f3\u30ec\u30b3\u30fc\u30c9 +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=\u3059\u3079\u3066\u306e\u6539\u8a02\u304c\u8a18\u9332\u3055\u308c\u307e\u3059 +status.rm-recorded-version-history-major-revisions=\u5927\u5e45\u306a\u6539\u8a02\u306e\u307f\u304c\u8a18\u9332\u3055\u308c\u307e\u3059 + +# Exif +status.exif=EXIF \u30e1\u30bf\u30c7\u30fc\u30bf\u304c\u5229\u7528\u53ef\u80fd +status.geographic=\u4f4d\u7f6e\u60c5\u5831\u30e1\u30bf\u30c7\u30fc\u30bf\u304c\u5229\u7528\u53ef\u80fd +status.dod5015-digital-photograph-record=\u30c7\u30b8\u30bf\u30eb\u5199\u771f\u30ec\u30b3\u30fc\u30c9 +status.dod5015-pdf-record=PDF\u30ec\u30b3\u30fc\u30c9 +status.dod5015-scanned-record=\u30b9\u30ad\u30e3\u30f3\u6e08\u307f\u30ec\u30b3\u30fc\u30c9 +status.dod5015-web-record=Web\u30ec\u30b3\u30fc\u30c9 + +# RMA model metadata fields +label.all=\u3059\u3079\u3066 +label.keywords=\u30ad\u30fc\u30ef\u30fc\u30c9 \uff08\u30c6\u30ad\u30b9\u30c8\u3068\u540d\u524d\uff09 +label.identifier=ID +label.dateFiled=\u30d5\u30a1\u30a4\u30eb\u65e5 +label.publicationDate=\u516c\u958b\u65e5 +label.originator=\u516c\u958b\u5143 +label.originatingOrganization=\u516c\u958b\u5143\u306e\u7d44\u7e54 +label.mediaType=\u30e1\u30c7\u30a3\u30a2\u30bf\u30a4\u30d7 +label.format=\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f +label.dateReceived=\u53d7\u4fe1\u65e5 +label.supplementalMarkingList=\u88dc\u8db3\u30de\u30fc\u30ad\u30f3\u30b0\u30ea\u30b9\u30c8 +label.vitalRecord=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9 +label.reviewDate=\u30ec\u30d3\u30e5\u30fc\u65e5 +label.address=\u53d7\u4fe1\u8005 +label.otherAddress=\u305d\u306e\u4ed6\u306e\u53d7\u4fe1\u8005 +label.unpublishedUpdates=\u975e\u516c\u958b\u306e\u66f4\u65b0\u60c5\u5831 +label.publishInProgress=\u516c\u958b\u4e2d + +# IMAP model metadata fields +label.imap.threadIndex=IMAP ThreadIndex +label.imap.messageFrom=IMAP \u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u5dee\u51fa\u4eba +label.imap.messageTo=IMAP \u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u53d7\u4fe1\u8005 +label.imap.messageCc=IMAP \u30e1\u30c3\u30bb\u30fc\u30b8\u306e CC +label.imap.messageSubject=IMAP \u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u4ef6\u540d +label.imap.dateReceived=IMAP \u53d7\u4fe1\u65e5 +label.imap.dateSent=IMAP \u9001\u4fe1\u65e5 + +# DOD model metadata fields +label.dod.scannedFormatVersion=\u753b\u50cf\u306e\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u3068\u30d0\u30fc\u30b8\u30e7\u30f3 +label.dod.resolutionX=\u753b\u50cf\u306e\u89e3\u50cf\u5ea6 X +label.dod.resolutionY=\u753b\u50cf\u306e\u89e3\u50cf\u5ea6 Y +label.dod.scannedBitDepth=\u30b9\u30ad\u30e3\u30f3\u3057\u305f\u30d3\u30c3\u30c8\u6df1\u5ea6 +label.dod.producingApplication=\u88fd\u4f5c\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 +label.dod.producingApplicationVersion=\u88fd\u4f5c\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 +label.dod.pdfVersion=PDF \u30d0\u30fc\u30b8\u30e7\u30f3 +label.dod.creatingApplication=\u4f5c\u6210\u5143\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 +label.dod.documentSecuritySettings=\u6587\u66f8\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a +label.dod.caption=\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3 +label.dod.photographer=\u64ae\u5f71\u8005 +label.dod.copyright=\u8457\u4f5c\u6a29 +label.dod.bitDepth=\u30d3\u30c3\u30c8\u6df1\u5ea6 +label.dod.imageSizeX=\u753b\u50cf\u306e\u30b5\u30a4\u30ba X +label.dod.imageSizeY=\u753b\u50cf\u306e\u30b5\u30a4\u30ba Y +label.dod.imageSource=\u753b\u50cf\u30bd\u30fc\u30b9 +label.dod.compression=\u5727\u7e2e +label.dod.iccIcmProfile=ICC/ICM \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb +label.dod.exifInformation=EXIF \u60c5\u5831 +label.dod.webFileName=Web \u30d5\u30a1\u30a4\u30eb\u540d +label.dod.webPlatform=Web \u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0 +label.dod.webSiteName=Web \u30b5\u30a4\u30c8\u540d +label.dod.webSiteURL=Web \u30b5\u30a4\u30c8\u306e URL +label.dod.captureMethod=\u30ad\u30e3\u30d7\u30c1\u30e3\u65b9\u6cd5 +label.dod.captureDate=\u30ad\u30e3\u30d7\u30c1\u30e3\u65e5 +label.dod.contact=\u9023\u7d61\u5148 +label.dod.contentManagementSystem=\u30b3\u30f3\u30c6\u30f3\u30c4\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0 + +# RM Admin Console tools +tool.rm-define-roles.label=\u5f79\u5272\u306e\u5b9a\u7fa9 +tool.rm-define-roles.description=\u5f79\u5272\u306e\u4f5c\u6210/\u7de8\u96c6 +tool.rm-custom-metadata.label=\u30ab\u30b9\u30bf\u30e0\u30e1\u30bf\u30c7\u30fc\u30bf +tool.rm-custom-metadata.description=\u30ab\u30b9\u30bf\u30e0\u30e1\u30bf\u30c7\u30fc\u30bf +tool.rm-list-of-values.label=\u5024\u306e\u30ea\u30b9\u30c8 +tool.rm-list-of-values.description=\u5024\u306e\u5b9a\u7fa9\u306e\u30ea\u30b9\u30c8 +tool.rm-references.label=\u95a2\u4fc2 +tool.rm-references.description=\u95a2\u4fc2\u306e\u5b9a\u7fa9 +tool.rm-events.label=\u30a4\u30d9\u30f3\u30c8 +tool.rm-events.description=\u30a4\u30d9\u30f3\u30c8\u306e\u5b9a\u7fa9 +tool.rm-audit.label=\u76e3\u67fb +tool.rm-audit.description=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u76e3\u67fb +tool.rm-email-mappings.label=E \u30e1\u30fc\u30eb\u30de\u30c3\u30d4\u30f3\u30b0 +tool.rm-email-mappings.description=E \u30e1\u30fc\u30eb\u30de\u30c3\u30d4\u30f3\u30b0\u306e\u5b9a\u7fa9 +tool.rm-user-rights.label=\u30e6\u30fc\u30b6\u30fc\u6a29\u9650\u30ec\u30dd\u30fc\u30c8 +tool.rm-user-rights.description=\u30e6\u30fc\u30b6\u30fc\u6a29\u9650\u30ec\u30dd\u30fc\u30c8 +tool.rm-users-and-groups.label=\u30e6\u30fc\u30b6\u30fc\u3068\u30b0\u30eb\u30fc\u30d7 +tool.rm-users-and-groups.description=\u30e6\u30fc\u30b6\u30fc\u3068\u30b0\u30eb\u30fc\u30d7 + +## Buttons +button.sort.ascending=\u6607\u9806\u3067\u4e26\u3079\u66ff\u3048 +button.sort.descending=\u964d\u9806\u3067\u4e26\u3079\u66ff\u3048 +button.folders.show=\u30d5\u30a9\u30eb\u30c0\u3092\u8868\u793a\u3059\u308b +button.folders.hide=\u30d5\u30a9\u30eb\u30c0\u3092\u975e\u8868\u793a\u306b\u3059\u308b +button.view.simple=\u30b7\u30f3\u30d7\u30eb\u8868\u793a +button.view.detailed=\u8a73\u7d30\u8868\u793a + +## Drop-down Menus +menu.select=\u9078\u629e +menu.select.all=\u3059\u3079\u3066 +menu.select.none=\u306a\u3057 +menu.select.invert=\u9078\u629e\u306e\u5207\u308a\u66ff\u3048 +menu.select.folders=\u30d5\u30a9\u30eb\u30c0 +menu.select.documents=\u6587\u66f8 +menu.select.records=\u30ec\u30b3\u30fc\u30c9 +menu.select.undeclaredRecords=\u672a\u5b8c\u4e86\u30ec\u30b3\u30fc\u30c9 +menu.select.recordFolders=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +menu.select.recordCategories=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea + +## Metadata Fields +# Generic +details.created.on=\u4f5c\u6210\u65e5 +details.created.by=\u4f5c\u6210\u8005 +details.modified.on=\u5909\u66f4\u65e5 +details.modified.by=\u5909\u66f4\u8005 +details.by=\u62c5\u5f53\u8005 +details.size=\u30b5\u30a4\u30ba +details.description=\u8aac\u660e +details.description.none=(\u306a\u3057) +# Record Category +details.category.identifier=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea ID +details.category.disposition-authority=\u4fdd\u7ba1\u6a29\u9650 +details.category.disposition-instructions=\u4fdd\u7ba1\u6307\u793a +details.category.vital-record-indicator=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u30fc +# Record Folder +details.folder.identifier=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ID +details.folder.vital-record-indicator=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u30fc +# Record +details.record.identifier=\u4e00\u610f\u306e\u30ec\u30b3\u30fc\u30c9 ID +details.record.date-filed=\u30d5\u30a1\u30a4\u30eb\u65e5 +details.record.publication-date=\u516c\u958b\u65e5 +details.record.originator=\u516c\u958b\u5143 +details.record.originating-organization=\u516c\u958b\u5143\u306e\u7d44\u7e54 +details.version.label=\u30d0\u30fc\u30b8\u30e7\u30f3 +# Incomplete Record +details.undeclared-record.info=\u672a\u5b8c\u4e86\u30ec\u30b3\u30fc\u30c9 +# Rejected Record +details.rejected-record.info=\u5374\u4e0b\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9 +# Transfer Container +details.transfer-container.title={0} \u306e\u8ee2\u9001 +details.transfer-container.is-accession=\u30e1\u30e2\uff1a\u8ee2\u9001\u30bf\u30a4\u30d7\u306f\u53d7\u8afe\u3067\u3059 +# Hold Container +details.hold.title=\u30db\u30fc\u30eb\u30c9\u304c {0} \u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +details.hold.title.date-format=yyyy \u5e74 mmmm \u6708 dd \u65e5 '\u6642\u523b' HH:MM:ss +details.hold.reason=\u30db\u30fc\u30eb\u30c9\u306e\u7406\u7531 +details.hold.reason.none=\u8a72\u5f53\u306a\u3057 +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=\u30d5\u30a9\u30eb\u30c0 ID + +## File Upload (upload new version) +label.filter-description={0} \u3068\u540c\u3058\u30bf\u30a4\u30d7 + +## Empty List +no.items.title=\u30a2\u30a4\u30c6\u30e0\u306a\u3057 + +## Tips +tip.insitu-rename=\u540d\u524d\u306e\u5909\u66f4 +tip.insitu-tag=\u30bf\u30b0 + +## Help panels, including Drag and Drop +show.folders={0} \u500b\u306e\u30b5\u30d6\u30d5\u30a9\u30eb\u30c0\u3092\u8868\u793a\u3057\u3066\u3044\u307e\u3059 + +## Create site dialog +description.recordsManagementSite=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u30b5\u30a4\u30c8 +title.recordsManagementSite=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406 +type.recordsManagementSite=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u30b5\u30a4\u30c8 +compliance.standard=\u6a19\u6e96 +compliance.dod5015=DoD 5015.2-STD +label.compliance=\u30b3\u30f3\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9 + +## Console title +link.managementConsole=\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb + +## Rules +customise.reject.text=\u30b3\u30e1\u30f3\u30c8 ''{param.reason}'' \u3092\u4ed8\u3051\u3066\u30ec\u30b3\u30fc\u30c9\u3092\u5374\u4e0b\u3059\u308b +customise.requestInfo.text=\u6307\u5b9a\u3057\u305f\u62c5\u5f53\u8005\u7528\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af\u3092\u4f5c\u6210\u3057\u3001\u6b21\u306e\u60c5\u5831\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3059\u308b: ''{param.requestedInfo}'' +customise.sendEmail.text=\u6307\u5b9a\u3057\u305f\u53d7\u4fe1\u8005\u306b\u4ef6\u540d\u304c ''{param.subject}'' \u306e E \u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3059\u308b + +## Records Management Admin Tools +header.rm-console.label=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406... +header.rm-management.label=\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb +header.rm-management.description=\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb + +## Request Info Workflow +rm.wf.information-requested-for-record=\u60c5\u5831\u304c\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9 +rm.wf.request-information-from=\u60c5\u5831\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u5143 +rm.wf.requested-information=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u60c5\u5831 +rm.wf.record=\u30ec\u30b3\u30fc\u30c9 +rm.wf.selected-users-and-groups=\u30e6\u30fc\u30b6\u30fc\u3068\u30b0\u30eb\u30fc\u30d7 +rm.wf.give-details=\u60c5\u5831\u306e\u672c\u6587 +rm.wf.message=\u30e1\u30c3\u30bb\u30fc\u30b8 +rm.wf.details=\u8a73\u7d30 + +## Text length validation +message.max.text.length.validation=\u30c6\u30ad\u30b9\u30c8\u306f {max} \u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=\u30ec\u30d3\u30e5\u30fc\u671f\u9593\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 + +## Forms +form.control.object-picker.items-list.empty=\u30a2\u30a4\u30c6\u30e0\u306a\u3057 +form.control.object-picker.items-list.loading=\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=\u30bf\u30a4\u30c8\u30eb +file-to.substitution.node.cm.description.label=\u8aac\u660e +file-to.substitution.node.cm.accessed.label=\u6700\u7d42\u30a2\u30af\u30bb\u30b9\u65e5\u6642 +file-to.substitution.node.cm.created.label=\u4f5c\u6210\u65e5\u6642 +file-to.substitution.node.cm.creator.label=\u4f5c\u6210\u8005 +file-to.substitution.node.cm.modified.label=\u6700\u7d42\u5909\u66f4\u65e5\u6642 +file-to.substitution.node.cm.modifier.label=\u5909\u66f4\u8005 +file-to.substitution.node.cm.name.label=\u540d\u524d +file-to.substitution.node.rma.origionalName.label=\u5143\u306e\u30ce\u30fc\u30c9\u540d +file-to.substitution.node.rma.dateFiled.label=\u30d5\u30a1\u30a4\u30eb\u65e5 +file-to.substitution.node.rma.location.label=\u5834\u6240 +file-to.substitution.node.rma.dbUniquenessId.label=\u4e00\u610f\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 ID +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=\u30ce\u30fc\u30c9 ID +file-to.substitution.node.sys.store-identifier.label=\u30b9\u30c8\u30a2 ID +file-to.substitution.node.sys.store-protocol.label=\u30b9\u30c8\u30a2\u30d7\u30ed\u30c8\u30b3\u30eb +file-to.substitution.date.day.short.label=\u66dc\u65e5-\u77ed\u7e2e\u5f62 (\u4f8b: \u6708) +file-to.substitution.date.day.label=\u66dc\u65e5 (\u4f8b: \u6708) +file-to.substitution.date.day.long.label=\u66dc\u65e5-\u6b63\u5f0f\u5f62 (\u4f8b: \u6708\u66dc\u65e5) +file-to.substitution.date.day.number.label=\u65e5\u6570 (\u4f8b: 1) +file-to.substitution.date.day.year.label=\u5e74\u306e\u901a\u7b97\u65e5\u6570 (\u4f8b: 216) +file-to.substitution.date.day.month.label=\u6708\u306e\u901a\u7b97\u65e5\u6570 (\u4f8b: 18) +file-to.substitution.date.month.short.label=\u6708-\u77ed\u7e2e\u5f62 (\u4f8b: 1\u6708) +file-to.substitution.date.month.label=\u6708 (\u4f8b: 1\u6708) +file-to.substitution.date.month.long.label=\u6708-\u6b63\u5f0f\u5f62 (\u4f8b: 1\u6708) +file-to.substitution.date.month.number.label=\u6708\u6570 (\u4f8b: 01) +file-to.substitution.date.year.short.label=\u5e74-\u77ed\u7e2e\u5f62 (\u4f8b: 14) +file-to.substitution.date.year.label=\u5e74 (\u4f8b: 14) +file-to.substitution.date.year.long.label=\u5e74-\u6b63\u5f0f\u5f62 (\u4f8b: 2014) +file-to.substitution.date.year.week.label=\u5e74\u306e\u901a\u7b97\u9031\u6570 (\u4f8b: 31) + +## Banner icon messages +banner.rejected-record.info=\u5374\u4e0b\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9\u306b\u95a2\u3059\u308b\u60c5\u5831\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044 +banner.rejected-record.close=\u5374\u4e0b\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9\u306e\u8b66\u544a\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044 +banner.child-classification-in-progress.info=\u5b50\u306e\u5206\u985e\u4e2d\u3067\u3059 +banner.child-classification-complete.info=\u5b50\u306e\u5206\u985e\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f +banner.child-classification-complete.close=\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u524a\u9664 + +## Recordable Versions +label.destroyed-version=\u7834\u68c4\u3055\u308c\u305f\u30d0\u30fc\u30b8\u30e7\u30f3 +label.recorded-version=\u8a18\u9332\u3055\u308c\u305f\u30d0\u30fc\u30b8\u30e7\u30f3 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_nb.properties new file mode 100644 index 0000000000..01c78875a5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_nb.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Filplan +page.rmDocumentLibrary.description=Filplan ved oppf\u00f8ringsh\u00e5ndtering +page.rmSearch.title=Oppf\u00f8ringss\u00f8k +page.rmSearch.description=Oppf\u00f8ringss\u00f8kside +page.rmSiteDashboard.title=Dashboard ved sted til oppf\u00f8ringsh\u00e5ndtering +page.rmSiteDashboard.description=Dashboardside ved sted til oppf\u00f8ringsh\u00e5ndtering +page.rmAudit.title=Revisjonslogg +page.rmAudit.description=Revisjonsloggside +page.rmNewReference.title=Ny referanse +page.rmNewReference.description=Ny referanse mellom oppf\u00f8ringer +page.rmDispositionEdit.title=Rediger retensjonsplanen +page.rmDispositionEdit.description=Side til \u00e5 redigere retensjonsplanen +page.rmPermissions.title=Administrer tillatelser +page.rmPermissions.description=Side til \u00e5 administrere tillatelser +page.rmConsole.title=RM-administrasjonsverkt\u00f8y +page.rmConsole.description=Administrasjonsverkt\u00f8y oppf\u00f8ringsh\u00e5ndtering + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Informasjon om oppf\u00f8ringsserier +page.rmRecordSeriesDetails.description=Side til informasjon om oppf\u00f8ringsserier ved oppf\u00f8ringsh\u00e5ndtering +page.rmRecordCategoryDetails.title=Informasjon om oppf\u00f8ringskategorier +page.rmRecordCategoryDetails.description=Side til informasjon om oppf\u00f8ringskategorier ved oppf\u00f8ringsh\u00e5ndtering +page.rmRecordFolderDetails.title=Informasjon om oppf\u00f8ringsmapper +page.rmRecordFolderDetails.description=Side til informasjon om oppf\u00f8ringsmapper ved oppf\u00f8ringsh\u00e5ndtering + +## Forms +label.set.idStatus=Identifikasjon og status +label.set.general=Generelt +label.set.record=Oppf\u00f8ring +label.set.correspondence=Korrespondanse +label.set.security=Sikkerhet +label.set.vitalRecord=Sv\u00e6rt viktig oppf\u00f8ring +label.set.disposition=Retensjonsplan +label.set.customMetadata=Tilpassede egenskaper +label.set.recordVersion=Oppf\u00f8ringsversjon +label.set.recordFolder=Oppf\u00f8ringsmappe +label.set.recordCategory=Oppf\u00f8ringskategori +label.hold.reason=Grunn +label.hold.delete.empty=Slett hold n\u00e5r tomt +label.recordLevelDisposition=Gjelder +label.record=Oppf\u00f8ring +label.folder=Oppf\u00f8ringsmappe +label.declared=Fullf\u00f8rt +label.recordType=Oppf\u00f8ringstype +label.seriesIdentifier=Oppf\u00f8ringsserie-ID +label.categoryIdentifier=Oppf\u00f8ringskategori-ID +label.folderIdentifier=Oppf\u00f8ringsmappe-ID +label.recordIdentifier=Oppf\u00f8rings-ID +label.dispositionInstructions=Retensjonsinstruksjoner +label.dispositionAsOfDate=Retensjon per datoen +label.physicalSize=Fysisk st\u00f8rrelse +label.numberOfCopies=Antall kopier +label.storageLocation=Lagringssted +label.shelf=Hylle +label.file=Fil +label.box=Eske +label.versionDescription=Versjonsbeskrivelse +label.VersionLabel=Versjonsetikett + +## Common Property Selector +label.menu.content=Innhold +label.menu.records=Oppf\u00f8ring +label.menu.disposition=Retensjonsplan +label.menu.specialtypes=Spesielle typer +label.menu.imap=IMAP +label.menu.custom=Tilpassede egenskaper + +## Buttons +button.reject.record=Avvis oppf\u00f8ring +button.request-info=Be om informasjon + +## Pop-up Messages +message.confirm.delete.title=Slett bekreftelse +message.confirm.delete=Er du sikker p\u00e5 at du vil slette ''{0}''? +message.confirm.destroy.title=Destruer bekreftelse +message.confirm.destroy=Er du sikker p\u00e5 at du vil destruere ''{0}''? +message.confirm.destroyMultiple=Er du sikker p\u00e5 at du vil destruere valgte {0} filene? +message.confirm2.destroy.title=Destruer bekreftelse +message.confirm2.destroy=Filinnholdet slettes for bestandig, er du sikker p\u00e5 at du vil fortsette? +message.confirm2.destroyMultiple=Filinnholdet slettes for bestandig, er du sikker p\u00e5 at du vil fortsette? +message.confirm.hide.record.title=Skjul oppf\u00f8ring +message.confirm.hide.record=Denne filen er gjort til en oppf\u00f8ring. Klikk p\u00e5 OK for skjule den slik at den ikke vises her. +message.select=Velg... +message.pdf-record-fonts.title=PDF-oppf\u00f8ringer: Innebygd skrifttypekontroll +message.pdf-record-fonts.accession=Kontroller at eventuelle PDF-oppf\u00f8ringer som nettopp er aksessert, inkluder gjeldende innebygde skrifttyper. +message.pdf-record-fonts.transfer=Kontroller at eventuelle PDF-oppf\u00f8ringer som nettopp er overf\u00f8rt, inkluder gjeldende innebygde skrifttyper. +message.pdf-record-fonts.unknown=Hvis overf\u00f8ring eller tilgang inkluderer PDF-oppf\u00f8ring, skal du kontrollere om de aktuelle innebygde skrifttypene er inkludert. +message.request-info-success=Den forespurte informasjonen er n\u00e5 mottatt. +message.request-info-failure=Det oppsto et problem med foresp\u00f8rselen om informasjon. +message.confirm.delete-hold.title=Slett hold +message.confirm.delete-hold=Dersom holdet ''{0}'' slettes, blir alle elementene som det holder, frigitt. +message.confirm.close-rejected-record.title=Bekreft +message.confirm.close-rejected-record=Hvis du fjerner en avvist oppf\u00f8ringsvarsel, blir valgene for \u00e5 erkl\u00e6re en fil som en oppf\u00f8ring, tilgjengelige igjen. +message.confirm.unlink.title=Koble fra bekreftelsen +message.confirm.unlink.text=Er du sikker p\u00e5 at du vil koble fra oppf\u00f8ringen? +message.confirm.close-child-classification-complete.title=Klassifisering av underordnede er fullf\u00f8rt +message.confirm.close-child-classification-complete=Er du sikker p\u00e5 at du \u00f8nsker \u00e5 skjule denne meldingen? + +## Admin Console +message.admin-console-access-denied=Du trenger flere tillatelser for \u00e5 kunne g\u00e5 til denne siden. Sjekk med din IT- avdeling. + +# Document path +path.fileplan=Filplan + +## File Plan Actions +actions.more=Mer... +actions.accession=Tilgang +actions.close-folder=Lukk mappe +actions.copy-to=Kopier til... +actions.cutoff=Cut off +actions.declare=Fullf\u00f8r oppf\u00f8ring +actions.delete=Slett +actions.destroy=Destruer +actions.download=Last ned +actions.download-zip=Last ned zip +actions.edit-details=Rediger metadata +actions.edit-disposition-as-of-date=Rediger retensjonsdato +actions.edit-disposition-schedule=Rediger retensjonsplanen +actions.edit-reason=Rediger informasjon om hold +actions.edit-review-as-of-date=Rediger gjennomgang av dato +actions.file-report=Registrer rapport +actions.link-to=Koble til... +actions.unlink-from=Koble fra oppf\u00f8ring +actions.file-to=Registrer i... +actions.manage-permissions=Administrer tillatelser +actions.move-to=Flytt til... +actions.open-folder=\u00c5pne mappen p\u00e5 nytt +actions.review-all=Gjennomg\u00e5 alle +actions.reviewed=Gjennomg\u00e5tt +actions.add-record-metadata=Legg til registrering av metadata +actions.split-email=Del e-postvedlegg +actions.transfer=Overf\u00f8r +actions.transfer-complete=Fullf\u00f8r overf\u00f8ring +actions.undeclare=\u00c5pne oppf\u00f8ring p\u00e5 nytt +actions.undo-cutoff=Angre cut off +actions.create-disposition-schedule=Opprett retensjonsplan +actions.upload-new-version=Last opp ny versjon +actions.view-details=Vis detaljer +actions.view-audit-log=Vis revisjonslogg +actions.declare-file-to=Registrer som oppf\u00f8ring +actions.declare-file-version-to=Arkiver versjonen som en oppf\u00f8ring +actions.hide-record=Skjul oppf\u00f8ring +actions.reject=Avvis +actions.request-info=Be om informasjon +actions.file-destruction-report=Generer destruksjonsrapport +actions.end-retention=Avslutt retensjon +action.edit.hold=Rediger hold +actions.delete.hold=Slett hold +actions.add-to-hold=Legg til hold +actions.remove-from-hold=Fjern fra hold +actions.file-hold-report=Generer holdrapport +actions.move-dm-record=Flytt oppf\u00f8ring +actions.recorded-version-config=Alternativer med automatiske erkl\u00e6ringer +actions.add-relationship=Legg til forhold + +## File Plan Action Outcomes +message.multi-select={0} valgte elementer +message.accession.failure=Fikk ikke tilgang til ''{0}'' Kontakt din IT- avdeling. +message.accession.success=''{0}'' er n\u00e5 aksessert +message.accession-complete.failure=Kunne ikke fullf\u00f8re tilgangen til ''{0}''. Kontakt din IT- avdeling. +message.accession-complete.success=''{0}'' tilgang fullf\u00f8rt +message.close.failure=Kunne ikke lukke ''{0}''. Kontakt din IT- avdeling. +message.close.success=''{0}'' er n\u00e5 lukket +message.cutoff.failure=Kunne ikke cut off ''{0}''. Kontakt din IT- avdeling. +message.cutoff.success=''{0}'' er n\u00e5 cut off +message.declare.failure=Kunne ikke fullf\u00f8re ''{0}''-oppf\u00f8ringen +message.declare.failure.more=Oppf\u00f8ringen har metadata som m\u00e5 fullf\u00f8res. +message.declare.success=''{0}'' ble fullf\u00f8rt +message.delete.failure=Kunne ikke slette ''{0}'' Fors\u00f8k \u00e5 snakke med din IT- avdeling. +message.delete.success=''{0}'' er n\u00e5 slettet +message.destroy.failure=Kunne ikke destruere ''{0}'' Kontakt din IT- avdeling. +message.destroy.success=''{0}'' er n\u00e5 destruert +message.edit-disposition-as-of-date.title=Rediger retensjonsdato +message.edit-disposition-as-of-date.failure=Kunne ikke oppdatere retensjon per datoen. Kontakt din IT- avdeling. +message.edit-disposition-as-of-date.success=Retensjon er n\u00e5 oppdatert per datoen til ''{0}'' +message.edit-hold.reason.label=Grunn: +message.edit-hold.title=Oppdater informasjon om hold +message.edit-hold.failure=Kunne ikke oppdatere detaljer om hold. Kontakt din IT- avdeling. +message.edit-hold.success=Hold er n\u00e5 oppdatert +message.edit-review-as-of-date.title=Rediger gjennomgang av dato +message.edit-review-as-of-date.failure=Kunne ikke oppdatere gjennomgang per datoen. Kontakt din IT- avdeling. +message.edit-review-as-of-date.success=Gjennomgang er n\u00e5 oppdatert per datoen til ''{0}'' +message.open-folder.failure=Kunne ikke \u00e5pne oppf\u00f8ringsmappen ''{0}''. Kontakt din IT- avdeling. +message.open-folder.success=Oppf\u00f8ringsmappen ''{0}'' var \u00e5pen +message.review-all.failure=Kunne ikke gjennomg\u00e5 oppf\u00f8ringsmappen ''{0}''. Kontakt din IT- avdeling. +message.review-all.success=Oppf\u00f8ringer i mappen ''{0}'' er gjennomg\u00e5tt +message.reviewed.failure=Kunne ikke gjennomg\u00e5 ''{0}''. Kontakt din IT- avdeling. +message.reviewed.success=''{0}'' er n\u00e5 gjennomg\u00e5tt +message.split-email.failure=Kunne ikke skille vedleggene fra ''{0}'' +message.split-email.success=Vedleggene er n\u00e5 skilt fra ''{0}''. Kontakt din IT- avdeling. +message.transfer.failure=Kunne ikke overf\u00f8re ''{0}''. Kontakt din IT- avdeling. +message.transfer.success=''{0}'' er n\u00e5 overf\u00f8rt +message.transfer-complete.failure=Kunne ikke fullf\u00f8re overf\u00f8ring av ''{0}''. Kontakt din IT- avdeling. +message.transfer-complete.success=''{0}''-overf\u00f8ring er n\u00e5 fullf\u00f8rt +message.undeclare.failure=Kunne ikke \u00e5pne ''{0}'' p\u00e5 nytt. Kontakt din IT- avdeling. +message.undeclare.success=''{0}'' er ikke lenger en fullstendig oppf\u00f8ring +message.undo-cutoff.failure=Kunne ikke angre cut off av ''{0}''. Kontakt din IT- avdeling. +message.undo-cutoff.success=Angre cut off av ''{0}'' +message.create-disposition-schedule.failure=Kunne ikke opprette retensjonsplan for ''{0}''. Kontakt din IT- avdeling. +message.create-disposition-schedule.success=Retensjonsplan for ''{0}'' er opprettet +message.create-record.success=Denne fillen er gjort om til en oppf\u00f8ring og tilgjengelige handlinger er begrenset. +message.create-record.failure=Kunne ikke erkl\u00e6re som oppf\u00f8ring. Kontakt din IT- avdeling. +message.declare-version-as-record.success=Denne versjonen av filen er blitt erkl\u00e6rt en oppf\u00f8ring +message.declare-version-as-record.failure=Kunne ikke erkl\u00e6re versjonen som oppf\u00f8ring. Kontakt din IT- avdeling. +message.hide-record.success=Oppf\u00f8ringen ''{0}'' er n\u00e5 skjult +message.hide-record.failure=Kunne ikke skjule oppf\u00f8ringen ''{0}''. Kontakt din IT- avdeling. +message.reject.reason=Grunn: +message.reject.title=Grunn til avvisning +message.reject.failure=Kunne ikke avvise ''{0}''. Kontakt din IT- avdeling. +message.reject.success=''{0}'' avvist +message.file-destruction-report.failure=Kunne ikke generere destruksjonsrapport. Kontakt din IT- avdeling. +message.file-destruction-report.success=Destruksjonsrapport generert +message.end-retention.failure=Kunne ikke avslutt retensjon. Kontakt din IT- avdeling. +message.end-retention.success=Retensjon avsluttet +message.file-success=Rapporten er n\u00e5 registrert som ''{0}'' +message.file-failure=Kunne ikke fullf\u00f8re filoperasjonen. Kontakt din IT- avdeling. +message.file-hold-report.failure=Kunne ikke generere holdrapport. Kontakt din IT- avdeling. +message.file-hold-report.success=Holdrapport generert +message.delete-hold.failure=Kunne ikke slette hold. Kontakt din IT- avdeling. +message.delete-hold.success=Hold slettet +message.moveDmRecord.failure=Kunne ikke flytte oppf\u00f8ringen ''{0}''. Kontakt din IT- avdeling. +message.moveDmRecord.success=Oppf\u00f8ringen ''{0}'' er n\u00e5 flyttet +message.recordedVersionConfig.success=Alternativer med automatiske erkl\u00e6ringer er n\u00e5 stilt inn +message.recordedVersionConfig.failure=Kunne ikke stille inn alternativer med automatiske erkl\u00e6ringer. Kontakt din IT- avdeling. +message.unlink.success=Oppf\u00f8ring er n\u00e5 frakoblet +message.unlink.failure=Kunne ikke koble fra oppf\u00f8ringen. Kontakt din IT- avdeling. + +## File Plan Status Indicators +status.active-workflows=Tilh\u00f8rer {0} aktive arbeidsflyter +status.rm-accession=Ventestatus p\u00e5 tilgang +status.rm-accessioned=Aksessert +status.rm-closed=Lukket +status.rm-cutoff=Cut off +status.rm-cutoff-folder=Cut off +status.rm-destroyed=Destruert +status.rm-frozen=P\u00e5 hold +status.rm-multi-parent=Koble til flere oppf\u00f8ringsmapper +status.rm-open=\u00c5pne +status.rm-transfer=Overf\u00f8r hold +status.rm-transferred=Overf\u00f8rt +status.rm-vital-record=Sv\u00e6rt viktig oppf\u00f8ring +status.rm-rejected-record=Avvist +status.rm-disposition-schedule=Oppf\u00f8ringskategori har en definert retensjonsplan +status.rm-digital-photograph-record=Digital bildeoppf\u00f8ring +status.rm-pdf-record=PDF-oppf\u00f8ring +status.rm-scanned-record=Skannet oppf\u00f8ring +status.rm-web-record=Nettoppf\u00f8ring +status.rm-is-record=Oppf\u00f8ring +status.rules=Mappe med gjeldende regler +status.rm-version-record=Versjonsoppf\u00f8ring +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Alle revisjoner registreres +status.rm-recorded-version-history-major-revisions=Kun hovedrevisjoner registreres + +# Exif +status.exif=EXIF-metadata tilgjengelig +status.geographic=Geografisk lokasjon metadata tilgjengelig +status.dod5015-digital-photograph-record=Digital bildeoppf\u00f8ring +status.dod5015-pdf-record=PDF-oppf\u00f8ring +status.dod5015-scanned-record=Skannet oppf\u00f8ring +status.dod5015-web-record=Nettoppf\u00f8ring + +# RMA model metadata fields +label.all=Alle +label.keywords=N\u00f8kkelord (tekst og navn) +label.identifier=ID +label.dateFiled=Dato registrert +label.publicationDate=Publikasjonsdato +label.originator=Avsender +label.originatingOrganization=Utgangsorganisasjon +label.mediaType=Medietype +label.format=Format +label.dateReceived=Dato mottatt +label.supplementalMarkingList=Tilleggsliste mer markeringer +label.vitalRecord=Sv\u00e6rt viktig oppf\u00f8ring +label.reviewDate=Gjennomgangsdato +label.address=Mottaker +label.otherAddress=Andre mottakere +label.unpublishedUpdates=Upubliserte oppdateringer +label.publishInProgress=Publisering p\u00e5g\u00e5r + +# IMAP model metadata fields +label.imap.threadIndex=IMAP-tr\u00e5dindeks +label.imap.messageFrom=IMAP-melding fra +label.imap.messageTo=IMAP-melding til +label.imap.messageCc=IMAP-melding Cc +label.imap.messageSubject=IMAP-meldingsemne +label.imap.dateReceived=IMAP dato mottatt +label.imap.dateSent=IMAP dato sendt + +# DOD model metadata fields +label.dod.scannedFormatVersion=Bildeformat og -versjon +label.dod.resolutionX=Bildeoppl\u00f8sning X +label.dod.resolutionY=Bildeoppl\u00f8sning Y +label.dod.scannedBitDepth=Skannet bitdybde +label.dod.producingApplication=Produserende program +label.dod.producingApplicationVersion=Produserende programversjon +label.dod.pdfVersion=PDF-versjon +label.dod.creatingApplication=Opprette program +label.dod.documentSecuritySettings=Innstillinger ved dokumentsikkerhet +label.dod.caption=Tittel +label.dod.photographer=Fotograf +label.dod.copyright=Copyright +label.dod.bitDepth=Bitdybde +label.dod.imageSizeX=Bildest\u00f8rrelse X +label.dod.imageSizeY=Bildest\u00f8rrelse Y +label.dod.imageSource=Bildekilde +label.dod.compression=Komprimering +label.dod.iccIcmProfile=ICC/ICM-profil +label.dod.exifInformation=EXIF-informasjon +label.dod.webFileName=Nettfilnavn +label.dod.webPlatform=Nettplattform +label.dod.webSiteName=Nettstedsnavn +label.dod.webSiteURL=Nettstedsadresse +label.dod.captureMethod=Opptaksmetode +label.dod.captureDate=Opptaksdato +label.dod.contact=Kontakt +label.dod.contentManagementSystem=Innholdsforvaltningssystem + +# RM Admin Console tools +tool.rm-define-roles.label=Definer roller +tool.rm-define-roles.description=Opprett og rediger roller +tool.rm-custom-metadata.label=Tilpassede metadata +tool.rm-custom-metadata.description=Tilpassede metadata +tool.rm-list-of-values.label=Liste over verdier +tool.rm-list-of-values.description=Liste med definisjoner av verdier +tool.rm-references.label=Forhold +tool.rm-references.description=Definisjon av forhold +tool.rm-events.label=Hendelser +tool.rm-events.description=Hendelsedefinisjoner +tool.rm-audit.label=Revisjon +tool.rm-audit.description=Revisjon ved oppf\u00f8ringsh\u00e5ndtering +tool.rm-email-mappings.label=E-postkoblinger +tool.rm-email-mappings.description=Definisjoner av E-postkoblinger +tool.rm-user-rights.label=Brukerrettighetsrapport +tool.rm-user-rights.description=Brukerrettighetsrapport +tool.rm-users-and-groups.label=Brukere og grupper +tool.rm-users-and-groups.description=Brukere og grupper + +## Buttons +button.sort.ascending=Sorter stigende +button.sort.descending=Sorter synkende +button.folders.show=Vis mapper +button.folders.hide=Skjul mapper +button.view.simple=Enkel visning +button.view.detailed=Detaljert visning + +## Drop-down Menus +menu.select=Velg +menu.select.all=Alle +menu.select.none=Ingen +menu.select.invert=Inverter utvalg +menu.select.folders=Mapper +menu.select.documents=Dokumenter +menu.select.records=Oppf\u00f8ringer +menu.select.undeclaredRecords=Ufullstendige oppf\u00f8ringer +menu.select.recordFolders=Oppf\u00f8ringsmapper +menu.select.recordCategories=Oppf\u00f8ringskategorier + +## Metadata Fields +# Generic +details.created.on=Opprettet den +details.created.by=Opprettet av +details.modified.on=Endret den +details.modified.by=Endret av +details.by=Av +details.size=St\u00f8rrelse +details.description=Beskrivelse +details.description.none=(Ingen) +# Record Category +details.category.identifier=Oppf\u00f8ringskategori-ID +details.category.disposition-authority=Retensjonsrett +details.category.disposition-instructions=Retensjonsinstruksjoner +details.category.vital-record-indicator=Sv\u00e6rt viktig oppf\u00f8ringsindikator +# Record Folder +details.folder.identifier=Oppf\u00f8ringsmappe-ID +details.folder.vital-record-indicator=Sv\u00e6rt viktig oppf\u00f8ringsindikator +# Record +details.record.identifier=Unik oppf\u00f8rings-ID +details.record.date-filed=Dato registrert +details.record.publication-date=Publikasjonsdato +details.record.originator=Avsender +details.record.originating-organization=Utgangsorganisasjon +details.version.label=Versjon +# Incomplete Record +details.undeclared-record.info=Ufullstendig oppf\u00f8ring +# Rejected Record +details.rejected-record.info=Avvist oppf\u00f8ring +# Transfer Container +details.transfer-container.title=Overf\u00f8r {0} +details.transfer-container.is-accession=Merk: Overf\u00f8ringstype er tilgang +# Hold Container +details.hold.title=Hold opprettet p\u00e5 {0} +details.hold.title.date-format=dd mmmm \u00e5\u00e5\u00e5\u00e5 'p\u00e5' TT:MM:ss +details.hold.reason=Grunn til hold +details.hold.reason.none=Ikke tilgjengelig +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=Mappe-ID + +## File Upload (upload new version) +label.filter-description=Samme type som {0} + +## Empty List +no.items.title=Ingen elementer + +## Tips +tip.insitu-rename=Gi nytt navn +tip.insitu-tag=Tagg + +## Help panels, including Drag and Drop +show.folders=Vis {0} undermappe(r) + +## Create site dialog +description.recordsManagementSite=Sted til oppf\u00f8ringsh\u00e5ndtering +title.recordsManagementSite=Oppf\u00f8ringsh\u00e5ndtering +type.recordsManagementSite=Sted til oppf\u00f8ringsh\u00e5ndtering +compliance.standard=Standard +compliance.dod5015=DoD 5015.2-STD +label.compliance=Overensstemmelse + +## Console title +link.managementConsole=Behandlingskonsoll + +## Rules +customise.reject.text=Avvis oppf\u00f8ringer med kommentaren ''{param.reason}'' +customise.requestInfo.text=Opprett en arbeidsflytoppgave fra en liste med bestemte personer og be om f\u00f8lgende informasjon ''{param.requestedInfo}'' +customise.sendEmail.text=Send e-post med emnet ''{param.subject}'' til spesifiserte mottakere + +## Records Management Admin Tools +header.rm-console.label=Oppf\u00f8ringsh\u00e5ndtering... +header.rm-management.label=Behandlingskonsoll +header.rm-management.description=Behandlingskonsoll + +## Request Info Workflow +rm.wf.information-requested-for-record=Forespurt informasjon til oppf\u00f8ring +rm.wf.request-information-from=Be om informasjon fra +rm.wf.requested-information=Forespurt informasjon +rm.wf.record=Oppf\u00f8ring +rm.wf.selected-users-and-groups=Brukere og grupper +rm.wf.give-details=S\u00f8rg for informasjon +rm.wf.message=Melding +rm.wf.details=Detaljer + +## Text length validation +message.max.text.length.validation=Angi tekst med f\u00e6rre en {max} tegn + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=Velg en gjennomgangsperiode + +## Forms +form.control.object-picker.items-list.empty=Ingen elementer +form.control.object-picker.items-list.loading=Laster ... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=Tittel +file-to.substitution.node.cm.description.label=Beskrivelse +file-to.substitution.node.cm.accessed.label=Sist aksessert +file-to.substitution.node.cm.created.label=N\u00e5r opprettet +file-to.substitution.node.cm.creator.label=Oppretter +file-to.substitution.node.cm.modified.label=Sist endret +file-to.substitution.node.cm.modifier.label=Modifikator +file-to.substitution.node.cm.name.label=Navn +file-to.substitution.node.rma.origionalName.label=Opprinnelig nodenavn +file-to.substitution.node.rma.dateFiled.label=Dato registrert +file-to.substitution.node.rma.location.label=Sted +file-to.substitution.node.rma.dbUniquenessId.label=Unik database-ID +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=Node-ID +file-to.substitution.node.sys.store-identifier.label=Lagrings-ID +file-to.substitution.node.sys.store-protocol.label=Lagringsprotokoll +file-to.substitution.date.day.short.label=Kort dag (f.eks. man) +file-to.substitution.date.day.label=Dag (f.eks. man) +file-to.substitution.date.day.long.label=Lang dag (f.eks. mandag) +file-to.substitution.date.day.number.label=Nummer p\u00e5 dagen (f.eks. 1) +file-to.substitution.date.day.year.label=Dagen i \u00e5ret (f.eks. 216) +file-to.substitution.date.day.month.label=Dagen i m\u00e5neden (f.eks. 18) +file-to.substitution.date.month.short.label=Kort m\u00e5ned (f.eks. jan) +file-to.substitution.date.month.label=M\u00e5ned (f.eks. jan) +file-to.substitution.date.month.long.label=Lang m\u00e5ned (f.eks. januar) +file-to.substitution.date.month.number.label=Nummer p\u00e5 m\u00e5neden (f.eks. 01) +file-to.substitution.date.year.short.label=Kort \u00e5r (f.eks. 14) +file-to.substitution.date.year.label=\u00c5r (f.eks. 14) +file-to.substitution.date.year.long.label=Langt \u00e5r (f.eks. 2014) +file-to.substitution.date.year.week.label=Ukenummer (f.eks. 31) + +## Banner icon messages +banner.rejected-record.info=Se informasjon om den avviste oppf\u00f8ringen +banner.rejected-record.close=Fjern den avviste advarselsoppf\u00f8ringen +banner.child-classification-in-progress.info=Klassifisering av underordnede p\u00e5g\u00e5r +banner.child-classification-complete.info=Klassifiering av underordnede er fullf\u00f8rt +banner.child-classification-complete.close=Fjern meldingen + +## Recordable Versions +label.destroyed-version=Versjon destruert +label.recorded-version=Oppf\u00f8rt versjon diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_nl.properties new file mode 100644 index 0000000000..b418e6e454 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_nl.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Ordeningsplan +page.rmDocumentLibrary.description=Ordeningsplan Records Management +page.rmSearch.title=Archiefstukken zoeken +page.rmSearch.description=Zoekpagina archiefstukken +page.rmSiteDashboard.title=Dashboard Records Management-site +page.rmSiteDashboard.description=Dashboardpagina Records Management-site +page.rmAudit.title=Auditlog +page.rmAudit.description=Auditlogpagina +page.rmNewReference.title=Nieuwe verwijzing +page.rmNewReference.description=Nieuwe verwijzing tussen archiefstukken +page.rmDispositionEdit.title=Retentieschema bewerken +page.rmDispositionEdit.description=Pagina voor bewerken van het retentieschema +page.rmPermissions.title=Rechten beheren +page.rmPermissions.description=Pagina voor beheren van rechten +page.rmConsole.title=RM-beheertools +page.rmConsole.description=Records Management-beheertools + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Details archiefstukreeks +page.rmRecordSeriesDetails.description=Detailpagina archiefstukreeks voor Records Management +page.rmRecordCategoryDetails.title=Details archiefstukcategorie +page.rmRecordCategoryDetails.description=Detailpagina archiefstukcategorie voor Records Management +page.rmRecordFolderDetails.title=Details archiefmap +page.rmRecordFolderDetails.description=Detailpagina archiefmap voor Records Management + +## Forms +label.set.idStatus=Identificatie en status +label.set.general=Algemeen +label.set.record=Archiefstuk +label.set.correspondence=Correspondentie +label.set.security=Beveiliging +label.set.vitalRecord=Vitaal archiefstuk +label.set.disposition=Retentieschema +label.set.customMetadata=Aangepaste eigenschappen +label.set.recordVersion=Archiefstukversie +label.set.recordFolder=Archiefmap +label.set.recordCategory=Archiefcategorie +label.hold.reason=Reden +label.hold.delete.empty=Bewaring verwijderen indien leeg +label.recordLevelDisposition=Toegepast op +label.record=Archiefstuk +label.folder=Archiefmap +label.declared=Afgerond +label.recordType=Archiefstuktype +label.seriesIdentifier=Id archiefstukreeks +label.categoryIdentifier=Id archiefstukcategorie +label.folderIdentifier=Id archiefmap +label.recordIdentifier=Archiefstuk-id +label.dispositionInstructions=Retentie-instructies +label.dispositionAsOfDate=Begindatum retentie +label.physicalSize=Fysieke grootte +label.numberOfCopies=Aantal exemplaren +label.storageLocation=Opslaglocatie +label.shelf=Plank +label.file=Bestand +label.box=Doos +label.versionDescription=Beschrijving van versie +label.VersionLabel=Label voor versie + +## Common Property Selector +label.menu.content=Content +label.menu.records=Archiefstuk +label.menu.disposition=Retentieschema +label.menu.specialtypes=Speciale types +label.menu.imap=IMAP +label.menu.custom=Aangepaste eigenschappen + +## Buttons +button.reject.record=Archiefstuk afwijzen +button.request-info=Informatie aanvragen + +## Pop-up Messages +message.confirm.delete.title=Verwijderingsbevestiging +message.confirm.delete=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.confirm.destroy.title=Vernietigingsbevestiging +message.confirm.destroy=Weet u zeker dat u ''{0}'' wilt vernietigen? +message.confirm.destroyMultiple=Weet u zeker dat u de {0} geselecteerde bestanden wilt vernietigen? +message.confirm2.destroy.title=Vernietigingsbevestiging +message.confirm2.destroy=De content voor het bestand wordt permanent verwijderd, weet u zeker dat u wilt doorgaan? +message.confirm2.destroyMultiple=De content voor de bestanden wordt permanent verwijderd, weet u zeker dat u wilt doorgaan? +message.confirm.hide.record.title=Archiefstuk verbergen +message.confirm.hide.record=Van dit bestand is een archiefstuk gemaakt. Klik op OK om het te verbergen zodat het hier niet te zien is. +message.select=Selecteren... +message.pdf-record-fonts.title=PDF-archiefstukken: controle van ingesloten lettertypes +message.pdf-record-fonts.accession=Controleer of alle net overgedragen PDF-archiefstukken de toepasselijke ingesloten lettertypes bevatten. +message.pdf-record-fonts.transfer=Controleer of alle net overgezette PDF-archiefstukken de toepasselijke ingesloten lettertypes bevatten. +message.pdf-record-fonts.unknown=Als de overzetting of overdracht PDF-archiefstukken omvat, moet u controleren of de toepasselijke ingesloten lettertypes zijn opgenomen. +message.request-info-success=Informatie aangevraagd +message.request-info-failure=Er is een probleem opgetreden bij de informatieaanvraag. +message.confirm.delete-hold.title=Bewaring verwijderen +message.confirm.delete-hold=Als u bewaring ''{0}'' verwijdert, worden alle items hierin opgeheven. +message.confirm.close-rejected-record.title=Bevestigen +message.confirm.close-rejected-record=Als u de afgewezen-archiefstukwaarschuwing verwijdert, zijn de opties voor het declareren van het bestand als een archiefstuk weer beschikbaar. +message.confirm.unlink.title=Bevestiging van koppelingsopheffing +message.confirm.unlink.text=Weet u zeker dat u de archiefstukkoppeling wilt opheffen? +message.confirm.close-child-classification-complete.title=Classificatie onderliggend element is voltooid +message.confirm.close-child-classification-complete=Weet u zeker dat u dit bericht wilt verbergen? + +## Admin Console +message.admin-console-access-denied=U moet extra rechten hebben om deze pagina te kunnen openen. Neem contact op met uw I.T.- afdeling + +# Document path +path.fileplan=Ordeningsplan + +## File Plan Actions +actions.more=Meer... +actions.accession=Overdracht +actions.close-folder=Map sluiten +actions.copy-to=Kopi\u00ebren naar... +actions.cutoff=Afsluiten +actions.declare=Archiefstuk afronden +actions.delete=Verwijderen +actions.destroy=Vernietigen +actions.download=Downloaden +actions.download-zip=Zip downloaden +actions.edit-details=Metagegevens bewerken +actions.edit-disposition-as-of-date=Retentiedatum bewerken +actions.edit-disposition-schedule=Retentieschema bewerken +actions.edit-reason=Details van bewaring bewerken +actions.edit-review-as-of-date=Revisiedatum bewerken +actions.file-report=Rapport archiveren +actions.link-to=Koppelen naar... +actions.unlink-from=Archiefstukkoppeling opheffen +actions.file-to=Archiveren in... +actions.manage-permissions=Rechten beheren +actions.move-to=Verplaatsen naar... +actions.open-folder=Map heropenen +actions.review-all=Alles reviseren +actions.reviewed=Gereviseerd +actions.add-record-metadata=Metagegevens van archiefstuk toevoegen +actions.split-email=E-mailbijlagen opsplitsen +actions.transfer=Overzetten +actions.transfer-complete=Overzetting afronden +actions.undeclare=Archiefstuk heropenen +actions.undo-cutoff=Afsluiten ongedaan maken +actions.create-disposition-schedule=Retentieschema maken +actions.upload-new-version=Nieuwe versie uploaden +actions.view-details=Details weergeven +actions.view-audit-log=Auditlog weergeven +actions.declare-file-to=Archiveren als archiefstuk +actions.declare-file-version-to=Versie archiveren als archiefstuk +actions.hide-record=Archiefstuk verbergen +actions.reject=Afwijzen +actions.request-info=Informatie aanvragen +actions.file-destruction-report=Vernietigingsrapport genereren +actions.end-retention=Retentie be\u00ebindigen +action.edit.hold=Bewaring bewerken +actions.delete.hold=Bewaring verwijderen +actions.add-to-hold=Toevoegen aan bewaring +actions.remove-from-hold=Verwijderen uit bewaring +actions.file-hold-report=Bewaringsrapport genereren +actions.move-dm-record=Archiefstuk verplaatsen +actions.recorded-version-config=Opties voor automatisch declareren +actions.add-relationship=Relatie toevoegen + +## File Plan Action Outcomes +message.multi-select={0} geselecteerde items +message.accession.failure=Kan ''{0}'' niet overdragen. Neem contact op met uw IT-afdeling +message.accession.success=''{0}'' overgedragen +message.accession-complete.failure=Kan overdracht ''{0}'' niet afronden. Neem contact op met uw IT-afdeling +message.accession-complete.success=Overdracht van ''{0}'' afgerond +message.close.failure=Kan ''{0}'' niet sluiten. Neem contact op met uw IT-afdeling +message.close.success=''{0}'' is gesloten +message.cutoff.failure=Kan ''{0}'' niet afsluiten. Neem contact op met uw IT-afdeling +message.cutoff.success=''{0}'' afgesloten +message.declare.failure=Kan ''{0}'' archiefstuk niet afronden +message.declare.failure.more=Het archiefstuk heeft metagegevens die moeten worden afgerond. +message.declare.success=''{0}'' is afgerond +message.delete.failure=Kan ''{0}'' niet verwijderen. Neem contact op met uw IT-afdeling +message.delete.success=''{0}'' verwijderd +message.destroy.failure=Kan ''{0}'' niet vernietigen. Neem contact op met uw IT-afdeling +message.destroy.success=''{0}'' vernietigd +message.edit-disposition-as-of-date.title=Retentiedatum bewerken +message.edit-disposition-as-of-date.failure=Kan begindatum van retentie niet bijwerken. Neem contact op met uw IT-afdeling +message.edit-disposition-as-of-date.success=Begindatum van retentie voor ''{0}'' bijgewerkt. +message.edit-hold.reason.label=Reden: +message.edit-hold.title=Details bewaring bijwerken +message.edit-hold.failure=Kan details van bewaring niet bijwerken. Neem contact op met uw IT-afdeling +message.edit-hold.success=Bewaring bijgewerkt +message.edit-review-as-of-date.title=Revisiedatum bewerken +message.edit-review-as-of-date.failure=Kan begindatum van revisie niet bijwerken. Neem contact op met uw IT-afdeling +message.edit-review-as-of-date.success=Begindatum van revisie voor ''{0}'' bijgewerkt +message.open-folder.failure=Kan archiefmap ''{0}'' niet openen. Neem contact op met uw IT-afdeling +message.open-folder.success=Archiefmap ''{0}'' was geopend +message.review-all.failure=Kan archiefstukken in map ''{0}'' niet reviseren. Neem contact op met uw IT-afdeling +message.review-all.success=Archiefstukken in map ''{0}'' zijn gereviseerd +message.reviewed.failure=Kan ''{0}'' niet reviseren. Neem contact op met uw IT-afdeling +message.reviewed.success=''{0}'' gereviseerd +message.split-email.failure=Kan bijlagen niet scheiden van ''{0}'' +message.split-email.success=Bijlagen gescheiden van ''{0}''. Neem contact op met uw IT-afdeling +message.transfer.failure=Kan ''{0}'' niet overzetten. Neem contact op met uw IT-afdeling +message.transfer.success=''{0}'' overgezet +message.transfer-complete.failure=Kan overzetting ''{0}'' niet afronden. Neem contact op met uw IT-afdeling +message.transfer-complete.success=Overzetting ''{0}'' is afgerond +message.undeclare.failure=Kan ''{0}'' niet heropenen. Neem contact op met uw IT-afdeling +message.undeclare.success=''{0}'' is niet langer een afgerond archiefstuk +message.undo-cutoff.failure=Kan afsluiten van ''{0}'' niet ongedaan maken. Neem contact op met uw IT-afdeling +message.undo-cutoff.success=Afsluiten van ''{0}'' ongedaan maken +message.create-disposition-schedule.failure=Kan geen retentieschema voor ''{0}'' maken. Neem contact op met uw IT-afdeling +message.create-disposition-schedule.success=Retentieschema voor ''{0}'' gemaakt. +message.create-record.success=Van dit bestand is een archiefstuk gemaakt en hiervoor zijn alleen beperkte acties beschikbaar +message.create-record.failure=Declareren als archiefstuk mislukt. Neem contact op met uw IT-afdeling +message.declare-version-as-record.success=Deze versie van het bestand is gedeclareerd als archiefstuk +message.declare-version-as-record.failure=Kan versie niet declareren als archiefstuk. Neem contact op met uw IT-afdeling +message.hide-record.success=Archiefstuk ''{0}'' is verborgen +message.hide-record.failure=Kan archiefstuk ''{0}'' niet verbergen. Neem contact op met uw IT-afdeling +message.reject.reason=Reden: +message.reject.title=Reden voor afwijzing +message.reject.failure=Kan ''{0}'' niet afwijzen. Neem contact op met uw IT-afdeling +message.reject.success=''{0}'' afgewezen +message.file-destruction-report.failure=Kan geen vernietigingsrapport genereren. Neem contact op met uw IT-afdeling +message.file-destruction-report.success=Vernietigingsrapport gegenereerd +message.end-retention.failure=Kan retentie niet be\u00ebindigen. Neem contact op met uw IT-afdeling +message.end-retention.success=Retentie be\u00ebindigd +message.file-success=Overdrachtsrapport gearchiveerd als ''{0}'' +message.file-failure=Kan de archiveringshandeling niet afronden. Neem contact op met uw IT-afdeling +message.file-hold-report.failure=Kan geen bewaringsrapport genereren. Neem contact op met uw IT-afdeling +message.file-hold-report.success=Bewaringsrapport gegenereerd +message.delete-hold.failure=Kan bewaring niet verwijderen. Neem contact op met uw IT-afdeling +message.delete-hold.success=Bewaring verwijderd +message.moveDmRecord.failure=Kan archiefstuk ''{0}'' niet verplaatsen. Neem contact op met uw IT-afdeling +message.moveDmRecord.success=Archiefstuk ''{0}'' is verplaatst +message.recordedVersionConfig.success=Opties voor automatisch declareren zijn ingesteld +message.recordedVersionConfig.failure=Kan opties voor automatisch declareren niet instellen. Neem contact op met uw IT-afdeling +message.unlink.success=Archiefstukkoppeling is opgeheven +message.unlink.failure=Kan archiefstukkoppeling niet opheffen. Neem contact op met uw IT-afdeling + +## File Plan Status Indicators +status.active-workflows=Hoort bij {0} actieve workflows +status.rm-accession=Overdracht in behandeling +status.rm-accessioned=Overgedragen +status.rm-closed=Gesloten +status.rm-cutoff=Afsluiten +status.rm-cutoff-folder=Afsluiten +status.rm-destroyed=Vernietigd +status.rm-frozen=In bewaring +status.rm-multi-parent=Gekoppeld in meerdere archiefmappen +status.rm-open=Openen +status.rm-transfer=Overzetting in behandeling +status.rm-transferred=Overgezet +status.rm-vital-record=Vitaal archiefstuk +status.rm-rejected-record=Afgewezen +status.rm-disposition-schedule=Er is een retentieschema gedefinieerd voor archiefstukcategorie +status.rm-digital-photograph-record=Digitaal fotoarchiefstuk +status.rm-pdf-record=PDF-archiefstuk +status.rm-scanned-record=Gescand archiefstuk +status.rm-web-record=Web-archiefstuk +status.rm-is-record=Archiefstuk +status.rules=Op map zijn regels toegepast +status.rm-version-record=Versie-archiefstuk +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Alle revisies worden vastgelegd +status.rm-recorded-version-history-major-revisions=Alleen primaire revisies worden vastgelegd + +# Exif +status.exif=EXIF-metagegevens beschikbaar +status.geographic=Metagegevens van geolocatie beschikbaar +status.dod5015-digital-photograph-record=Digitaal fotoarchiefstuk +status.dod5015-pdf-record=PDF-archiefstuk +status.dod5015-scanned-record=Gescand archiefstuk +status.dod5015-web-record=Web-archiefstuk + +# RMA model metadata fields +label.all=Alle +label.keywords=Trefwoorden (tekst en naam) +label.identifier=Id +label.dateFiled=Datum gearchiveerd +label.publicationDate=Publicatiedatum +label.originator=Herkomst +label.originatingOrganization=Oorspronkelijke organisatie +label.mediaType=Type medium +label.format=Indeling +label.dateReceived=Datum ontvangen +label.supplementalMarkingList=Aanvullende markeringslijst +label.vitalRecord=Vitaal archiefstuk +label.reviewDate=Datum revisie +label.address=Geadresseerde +label.otherAddress=Andere geadresseerde +label.unpublishedUpdates=Ongepubliceerde updates +label.publishInProgress=Publicatie bezig + +# IMAP model metadata fields +label.imap.threadIndex=IMAP-ThreadIndex +label.imap.messageFrom=IMAP-bericht van +label.imap.messageTo=IMAP-bericht aan +label.imap.messageCc=IMAP-bericht Cc +label.imap.messageSubject=Onderwerp IMAP-bericht +label.imap.dateReceived=IMAP datum ontvangen +label.imap.dateSent=IMAP datum verzonden + +# DOD model metadata fields +label.dod.scannedFormatVersion=Beeldindeling en -versie +label.dod.resolutionX=Beeldresolutie X +label.dod.resolutionY=Beeldresolutie Y +label.dod.scannedBitDepth=Gescande bitdiepte +label.dod.producingApplication=Producerende applicatie +label.dod.producingApplicationVersion=Versie producerende applicatie +label.dod.pdfVersion=PDF-versie +label.dod.creatingApplication=Producerende applicatie +label.dod.documentSecuritySettings=Documentbeveiligingsinstellingen +label.dod.caption=Bijschrift +label.dod.photographer=Fotograaf +label.dod.copyright=Auteursrecht +label.dod.bitDepth=Bitdiepte +label.dod.imageSizeX=Beeldgrootte X +label.dod.imageSizeY=Beeldgrootte Y +label.dod.imageSource=Beeldbron +label.dod.compression=Compressie +label.dod.iccIcmProfile=ICC-/ICM-profiel +label.dod.exifInformation=EXIF-informatie +label.dod.webFileName=Web-bestandsnaam +label.dod.webPlatform=Web-platform +label.dod.webSiteName=Websitenaam +label.dod.webSiteURL=Websiteadres +label.dod.captureMethod=Methode van vastleggen +label.dod.captureDate=Vastlegdatum +label.dod.contact=Contact opnemen +label.dod.contentManagementSystem=Content Management System + +# RM Admin Console tools +tool.rm-define-roles.label=Rollen defini\u00ebren +tool.rm-define-roles.description=Rollen maken en bewerken +tool.rm-custom-metadata.label=Aangepaste metagegevens +tool.rm-custom-metadata.description=Aangepaste metagegevens +tool.rm-list-of-values.label=Lijst met waarden +tool.rm-list-of-values.description=Lijst met waardedefinities +tool.rm-references.label=Relaties +tool.rm-references.description=Definities relaties +tool.rm-events.label=Gebeurtenissen +tool.rm-events.description=Definities gebeurtenissen +tool.rm-audit.label=Audit +tool.rm-audit.description=Records Management-audit +tool.rm-email-mappings.label=E-mailtoewijzingen +tool.rm-email-mappings.description=Definities e-mailtoewijzingen +tool.rm-user-rights.label=Rapport gebruikersrechten +tool.rm-user-rights.description=Rapport gebruikersrechten +tool.rm-users-and-groups.label=Gebruikers en groepen +tool.rm-users-and-groups.description=Gebruikers en groepen + +## Buttons +button.sort.ascending=Oplopend sorteren +button.sort.descending=Aflopend sorteren +button.folders.show=Mappen weergeven +button.folders.hide=Mappen verbergen +button.view.simple=Eenvoudige weergave +button.view.detailed=Gedetailleerde weergave + +## Drop-down Menus +menu.select=Selecteren +menu.select.all=Alles +menu.select.none=Geen +menu.select.invert=Selectie omkeren +menu.select.folders=Mappen +menu.select.documents=Documenten +menu.select.records=Archiefstukken +menu.select.undeclaredRecords=Niet-afgeronde archiefstukken +menu.select.recordFolders=Archiefmappen +menu.select.recordCategories=Archiefstukcategorie\u00ebn + +## Metadata Fields +# Generic +details.created.on=Gemaakt op +details.created.by=Gemaakt door +details.modified.on=Gewijzigd op +details.modified.by=Gewijzigd door +details.by=Door +details.size=Grootte +details.description=Beschrijving +details.description.none=(Geen) +# Record Category +details.category.identifier=Id archiefstukcategorie +details.category.disposition-authority=Retentieautoriteit +details.category.disposition-instructions=Retentie-instructies +details.category.vital-record-indicator=Indicator vitaal archiefstuk +# Record Folder +details.folder.identifier=Id archiefmap +details.folder.vital-record-indicator=Indicator vitaal archiefstuk +# Record +details.record.identifier=Unieke id archiefstuk +details.record.date-filed=Datum gearchiveerd +details.record.publication-date=Publicatiedatum +details.record.originator=Herkomst +details.record.originating-organization=Oorspronkelijke organisatie +details.version.label=Versie +# Incomplete Record +details.undeclared-record.info=Niet-afgerond archiefstuk +# Rejected Record +details.rejected-record.info=Afgewezen archiefstuk +# Transfer Container +details.transfer-container.title={0} overzetten +details.transfer-container.is-accession=Opmerking: overzettingstype is Overdracht +# Hold Container +details.hold.title=Bewaring gecre\u00eberd op {0} +details.hold.title.date-format=dd mmmm yyyy 'om' HH:MM:ss +details.hold.reason=Reden van bewaring +details.hold.reason.none=Niet beschikbaar +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=Map-id + +## File Upload (upload new version) +label.filter-description=Zelfde type als {0} + +## Empty List +no.items.title=Geen items + +## Tips +tip.insitu-rename=Naam wijzigen +tip.insitu-tag=Tag + +## Help panels, including Drag and Drop +show.folders={0} submap(pen) weergeven + +## Create site dialog +description.recordsManagementSite=Records Management-site +title.recordsManagementSite=Records Management +type.recordsManagementSite=Records Management-site +compliance.standard=Standaard +compliance.dod5015=DoD 5015.2-STD +label.compliance=Naleving + +## Console title +link.managementConsole=Beheerconsole + +## Rules +customise.reject.text=Archiefstukken afwijzen met opmerking ''{param.reason}'' +customise.requestInfo.text=Hiermee wordt een workflowtaak gecre\u00eberd voor een lijst met opgegeven personen en wordt de volgende informatie gevraagd ''{param.requestedInfo}'' +customise.sendEmail.text=E-mail met onderwerp ''{param.subject}'' verzenden naar opgegeven ontvangers + +## Records Management Admin Tools +header.rm-console.label=Records Management... +header.rm-management.label=Beheerconsole +header.rm-management.description=Beheerconsole + +## Request Info Workflow +rm.wf.information-requested-for-record=Informatie aangevraagd voor archiefstuk +rm.wf.request-information-from=Informatie aanvragen bij +rm.wf.requested-information=Aangevraagde informatie +rm.wf.record=Archiefstuk +rm.wf.selected-users-and-groups=Gebruikers en groepen +rm.wf.give-details=Informatie geven +rm.wf.message=Bericht +rm.wf.details=Details + +## Text length validation +message.max.text.length.validation=Voer tekst in die niet langer is dan {max} tekens + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=Selecteer een revisieperiode + +## Forms +form.control.object-picker.items-list.empty=Geen items +form.control.object-picker.items-list.loading=Laden... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=Titel +file-to.substitution.node.cm.description.label=Beschrijving +file-to.substitution.node.cm.accessed.label=Laatst geopend +file-to.substitution.node.cm.created.label=Wanneer gemaakt +file-to.substitution.node.cm.creator.label=Maker +file-to.substitution.node.cm.modified.label=Laatst gewijzigd +file-to.substitution.node.cm.modifier.label=Gewijzigd door +file-to.substitution.node.cm.name.label=Naam +file-to.substitution.node.rma.origionalName.label=Oorspronkelijke nodenaam +file-to.substitution.node.rma.dateFiled.label=Datum gearchiveerd +file-to.substitution.node.rma.location.label=Locatie +file-to.substitution.node.rma.dbUniquenessId.label=Unieke database-id +file-to.substitution.node.rma.identifier.label=Id +file-to.substitution.node.sys.node-uuid.label=Node-id +file-to.substitution.node.sys.store-identifier.label=Opslag-id +file-to.substitution.node.sys.store-protocol.label=Opslagprotocol +file-to.substitution.date.day.short.label=Dag kort (bijv. Maa) +file-to.substitution.date.day.label=Dag (bijv. Maa) +file-to.substitution.date.day.long.label=Dag lang (bijv. Maandag) +file-to.substitution.date.day.number.label=Dagnummer (bijv. 1) +file-to.substitution.date.day.year.label=Dag van het jaar (bijv. 216) +file-to.substitution.date.day.month.label=Dag van de maand (bijv. 18) +file-to.substitution.date.month.short.label=Maand kort (bijv. Jan) +file-to.substitution.date.month.label=Maand (bijv. Jan) +file-to.substitution.date.month.long.label=Maand lang (bijv. Januari) +file-to.substitution.date.month.number.label=Maandnummer (bijv. 01) +file-to.substitution.date.year.short.label=Jaar kort (bijv. 14) +file-to.substitution.date.year.label=Jaar (bijv. 14) +file-to.substitution.date.year.long.label=Jaar lang (bijv. 2014) +file-to.substitution.date.year.week.label=Week van het jaar (bijv. 31) + +## Banner icon messages +banner.rejected-record.info=Raadpleeg informatie over het afgewezen archiefstuk +banner.rejected-record.close=De afgewezen-archiefstukwaarschuwing verwijderen +banner.child-classification-in-progress.info=Classificatie onderliggend element wordt uitgevoerd +banner.child-classification-complete.info=Classificatie onderliggend element voltooid +banner.child-classification-complete.close=Het bericht verwijderen + +## Recordable Versions +label.destroyed-version=Vernietigde versie +label.recorded-version=Vastgelegde versie diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_pt_BR.properties new file mode 100644 index 0000000000..7746b3f4d4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_pt_BR.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=Plano de arquivamento +page.rmDocumentLibrary.description=Plano de arquivamento do Records Management +page.rmSearch.title=Pesquisa de documentos arquiv\u00edsticos +page.rmSearch.description=P\u00e1gina Pesquisa de documentos arquiv\u00edsticos +page.rmSiteDashboard.title=Painel do site do Records Management +page.rmSiteDashboard.description=P\u00e1gina do painel do site do Records Management +page.rmAudit.title=Log de auditoria +page.rmAudit.description=P\u00e1gina Log de auditoria +page.rmNewReference.title=Nova refer\u00eancia +page.rmNewReference.description=Nova refer\u00eancia entre documentos arquiv\u00edsticos +page.rmDispositionEdit.title=Editar programa\u00e7\u00e3o de reten\u00e7\u00e3o +page.rmDispositionEdit.description=P\u00e1gina para edi\u00e7\u00e3o da programa\u00e7\u00e3o de reten\u00e7\u00e3o +page.rmPermissions.title=Gerenciar permiss\u00f5es +page.rmPermissions.description=P\u00e1gina para gerenciar permiss\u00f5es +page.rmConsole.title=Ferramentas administrativas do RM +page.rmConsole.description=Ferramentas de administra\u00e7\u00e3o do Records Management + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=Detalhes da s\u00e9rie de documentos arquiv\u00edsticos +page.rmRecordSeriesDetails.description=P\u00e1gina Detalhes da s\u00e9rie de documentos arquiv\u00edsticos do Records Management +page.rmRecordCategoryDetails.title=Detalhes da categoria de documento arquiv\u00edstico +page.rmRecordCategoryDetails.description=P\u00e1gina Detalhes da categoria de documento arquiv\u00edstico do Records Management +page.rmRecordFolderDetails.title=Detalhes da pasta de documento arquiv\u00edstico +page.rmRecordFolderDetails.description=P\u00e1gina Detalhes da pasta de documento arquiv\u00edstico do Records Management + +## Forms +label.set.idStatus=Identifica\u00e7\u00e3o e status +label.set.general=Geral +label.set.record=Documento arquiv\u00edstico +label.set.correspondence=Correspond\u00eancia +label.set.security=Seguran\u00e7a +label.set.vitalRecord=Documento arquiv\u00edstico vital +label.set.disposition=Programa\u00e7\u00e3o de reten\u00e7\u00e3o +label.set.customMetadata=Propriedades personalizadas +label.set.recordVersion=Vers\u00e3o de documento arquiv\u00edstico +label.set.recordFolder=Pasta de documento arquiv\u00edstico +label.set.recordCategory=Categoria de documento arquiv\u00edstico +label.hold.reason=Motivo +label.hold.delete.empty=Excluir espera quando vazia +label.recordLevelDisposition=Aplicado a +label.record=Documento arquiv\u00edstico +label.folder=Pasta de documento arquiv\u00edstico +label.declared=Conclu\u00eddo +label.recordType=Tipo de documento arquiv\u00edstico +label.seriesIdentifier=ID da s\u00e9rie de documentos arquiv\u00edsticos +label.categoryIdentifier=ID da categoria de documento arquiv\u00edstico +label.folderIdentifier=ID da pasta de documento arquiv\u00edstico +label.recordIdentifier=ID do documento arquiv\u00edstico +label.dispositionInstructions=Instru\u00e7\u00f5es de reten\u00e7\u00e3o +label.dispositionAsOfDate=Data de in\u00edcio da reten\u00e7\u00e3o +label.physicalSize=Tamanho f\u00edsico +label.numberOfCopies=N\u00famero de c\u00f3pias +label.storageLocation=Local de armazenamento +label.shelf=Prateleira +label.file=Arquivo +label.box=Caixa +label.versionDescription=Descri\u00e7\u00e3o da vers\u00e3o +label.VersionLabel=R\u00f3tulo de vers\u00e3o + +## Common Property Selector +label.menu.content=Conte\u00fado +label.menu.records=Documento arquiv\u00edstico +label.menu.disposition=Programa\u00e7\u00e3o de reten\u00e7\u00e3o +label.menu.specialtypes=Tipos especiais +label.menu.imap=IMAP +label.menu.custom=Propriedades personalizadas + +## Buttons +button.reject.record=Rejeitar documento arquiv\u00edstico +button.request-info=Solicitar informa\u00e7\u00f5es + +## Pop-up Messages +message.confirm.delete.title=Excluir confirma\u00e7\u00e3o +message.confirm.delete=Tem certeza de que deseja excluir ''{0}''? +message.confirm.destroy.title=Destruir confirma\u00e7\u00e3o +message.confirm.destroy=Tem certeza de que deseja destruir ''{0}''? +message.confirm.destroyMultiple=Tem certeza de que deseja destruir os {0} arquivos selecionados? +message.confirm2.destroy.title=Destruir confirma\u00e7\u00e3o +message.confirm2.destroy=O conte\u00fado do arquivo ser\u00e1 permanentemente exclu\u00eddo. Tem certeza de que deseja continuar? +message.confirm2.destroyMultiple=O conte\u00fado dos arquivos ser\u00e1 permanentemente exclu\u00eddo. Tem certeza de que deseja continuar? +message.confirm.hide.record.title=Ocultar documento arquiv\u00edstico +message.confirm.hide.record=Este arquivo foi transformado em documento arquiv\u00edstico. Clique em OK para ocult\u00e1-lo de forma que ele n\u00e3o possa ser visualizado aqui. +message.select=Selecionar... +message.pdf-record-fonts.title=Arquivos PDF: Verifica\u00e7\u00e3o de fontes incorporadas +message.pdf-record-fonts.accession=Verifique se algum arquivo PDF que acabou de ser aderido inclui as fontes incorporadas aplic\u00e1veis. +message.pdf-record-fonts.transfer=Verifique se algum arquivo PDF que acabou de ser transferido inclui as fontes incorporadas aplic\u00e1veis. +message.pdf-record-fonts.unknown=Se a transfer\u00eancia ou ades\u00e3o incluiu arquivos PDF, verifique se as fontes incorporadas aplic\u00e1veis foram inclu\u00eddas. +message.request-info-success=Informa\u00e7\u00f5es solicitadas com sucesso +message.request-info-failure=Encontramos um problema com a solicita\u00e7\u00e3o de informa\u00e7\u00f5es. +message.confirm.delete-hold.title=Excluir espera +message.confirm.delete-hold=Se voc\u00ea excluir a espera ''{0}'', todos os itens retidos ser\u00e3o liberados. +message.confirm.close-rejected-record.title=Confirmar +message.confirm.close-rejected-record=Se voc\u00ea remover a advert\u00eancia de documento arquiv\u00edstico rejeitado, as op\u00e7\u00f5es de declarar o arquivo como um documento arquiv\u00edstico estar\u00e3o dispon\u00edveis novamente. +message.confirm.unlink.title=Anular v\u00ednculo da confirma\u00e7\u00e3o +message.confirm.unlink.text=Tem certeza que deseja anular o v\u00ednculo do documento arquiv\u00edstico? +message.confirm.close-child-classification-complete.title=A classifica\u00e7\u00e3o de secund\u00e1rios foi conclu\u00edda +message.confirm.close-child-classification-complete=Tem certeza de que deseja ocultar esta mensagem? + +## Admin Console +message.admin-console-access-denied=Voc\u00ea precisa de permiss\u00f5es adicionais para acessar esta p\u00e1gina. Consulte o Dept. de TI. + +# Document path +path.fileplan=Plano de arquivamento + +## File Plan Actions +actions.more=Mais... +actions.accession=Ades\u00e3o +actions.close-folder=Fechar pasta +actions.copy-to=Copiar para... +actions.cutoff=Cortar +actions.declare=Concluir documento arquiv\u00edstico +actions.delete=Excluir +actions.destroy=Destruir +actions.download=Baixar +actions.download-zip=Baixar zip +actions.edit-details=Editar metadados +actions.edit-disposition-as-of-date=Editar data de reten\u00e7\u00e3o +actions.edit-disposition-schedule=Editar programa\u00e7\u00e3o de reten\u00e7\u00e3o +actions.edit-reason=Editar detalhes da espera +actions.edit-review-as-of-date=Editar data de revis\u00e3o +actions.file-report=Arquivar relat\u00f3rio +actions.link-to=Vincular a... +actions.unlink-from=Anular v\u00ednculo do documento arquiv\u00edstico +actions.file-to=Arquivar em... +actions.manage-permissions=Gerenciar permiss\u00f5es +actions.move-to=Mover para... +actions.open-folder=Reabrir pasta +actions.review-all=Revisar tudo +actions.reviewed=Revisado +actions.add-record-metadata=Adicionar metadados do documento arquiv\u00edstico +actions.split-email=Dividir anexos do e-mail +actions.transfer=Transferir +actions.transfer-complete=Concluir transfer\u00eancia +actions.undeclare=Reabrir documento arquiv\u00edstico +actions.undo-cutoff=Desfazer corte +actions.create-disposition-schedule=Criar programa\u00e7\u00e3o de reten\u00e7\u00e3o +actions.upload-new-version=Carregar nova vers\u00e3o +actions.view-details=Visualizar detalhes +actions.view-audit-log=Visualizar log de auditoria +actions.declare-file-to=Arquivar como documento arquiv\u00edstico +actions.declare-file-version-to=Arquivar vers\u00e3o como documento arquiv\u00edstico +actions.hide-record=Ocultar documento arquiv\u00edstico +actions.reject=Rejeitar +actions.request-info=Solicitar informa\u00e7\u00f5es +actions.file-destruction-report=Gerar relat\u00f3rio de destrui\u00e7\u00e3o +actions.end-retention=Encerrar reten\u00e7\u00e3o +action.edit.hold=Editar espera +actions.delete.hold=Excluir espera +actions.add-to-hold=Adicionar \u00e0 espera +actions.remove-from-hold=Remover da espera +actions.file-hold-report=Gerar relat\u00f3rio de espera +actions.move-dm-record=Mover documento arquiv\u00edstico +actions.recorded-version-config=Op\u00e7\u00f5es de auto declara\u00e7\u00e3o +actions.add-relationship=Adicionar relacionamento + +## File Plan Action Outcomes +message.multi-select={0} itens selecionados +message.accession.failure=N\u00e3o foi poss\u00edvel aderir a ''{0}''. Entre em contato com o Dept. de TI. +message.accession.success=''{0}'' aderido com sucesso +message.accession-complete.failure=N\u00e3o foi poss\u00edvel concluir a ades\u00e3o ''{0}''. Entre em contato com o Dept. de TI. +message.accession-complete.success=''{0}'' ades\u00f5es conclu\u00eddas +message.close.failure=N\u00e3o foi poss\u00edvel fechar ''{0}''. Entre em contato com o Dept. de TI. +message.close.success=''{0}'' fechado com sucesso +message.cutoff.failure=N\u00e3o foi poss\u00edvel cortar ''{0}''. Entre em contato com o Dept. de TI. +message.cutoff.success=''{0}'' cortado com sucesso +message.declare.failure=N\u00e3o foi poss\u00edvel concluir o documento arquiv\u00edstico ''{0}'' +message.declare.failure.more=O documento arquiv\u00edstico tem metadados que precisam ser conclu\u00eddos. +message.declare.success=''{0}'' foi conclu\u00eddo +message.delete.failure=N\u00e3o foi poss\u00edvel excluir ''{0}''. Tente entrar em contato com o Dept. de TI. +message.delete.success=''{0}'' exclu\u00eddo com sucesso +message.destroy.failure=N\u00e3o foi poss\u00edvel destruir ''{0}''. Entre em contato com o Dept. de TI. +message.destroy.success=''{0}'' destru\u00eddo com sucesso +message.edit-disposition-as-of-date.title=Editar data de reten\u00e7\u00e3o +message.edit-disposition-as-of-date.failure=N\u00e3o foi poss\u00edvel atualizar data inicial de reten\u00e7\u00e3o. Entre em contato com o Dept. de TI. +message.edit-disposition-as-of-date.success=Data inicial de reten\u00e7\u00e3o atualizada com sucesso para ''{0}'' +message.edit-hold.reason.label=Motivo: +message.edit-hold.title=Atualizar detalhes da espera +message.edit-hold.failure=N\u00e3o foi poss\u00edvel atualizar detalhes da espera. Entre em contato com o Dept. de TI. +message.edit-hold.success=Espera atualizada com sucesso +message.edit-review-as-of-date.title=Editar data de revis\u00e3o +message.edit-review-as-of-date.failure=N\u00e3o foi poss\u00edvel atualizar data inicial de revis\u00e3o. Entre em contato com o Dept. de TI. +message.edit-review-as-of-date.success=Data inicial de revis\u00e3o atualizada com sucesso para ''{0}'' +message.open-folder.failure=N\u00e3o foi poss\u00edvel abrir a pasta de documento arquiv\u00edstico ''{0}''. Entre em contato com o Dept. de TI. +message.open-folder.success=A pasta de documento arquiv\u00edstico ''{0}'' foi aberta +message.review-all.failure=N\u00e3o foi poss\u00edvel revisar documentos arquiv\u00edsticos na pasta ''{0}''. Entre em contato com o Dept. de TI. +message.review-all.success=Os documentos arquiv\u00edsticos na pasta ''{0}'' foram revisados +message.reviewed.failure=N\u00e3o foi poss\u00edvel revisar ''{0}''. Entre em contato com o Dept. de TI. +message.reviewed.success=''{0}'' revisado com sucesso +message.split-email.failure=N\u00e3o foi poss\u00edvel separar anexos de ''{0}'' +message.split-email.success=Anexos separados com sucesso de ''{0}''. Entre em contato com o Dept. de TI. +message.transfer.failure=N\u00e3o foi poss\u00edvel transferir ''{0}''. Entre em contato com o Dept. de TI. +message.transfer.success=''{0}'' transferido com sucesso +message.transfer-complete.failure=N\u00e3o foi poss\u00edvel concluir a transfer\u00eancia ''{0}''. Entre em contato com o Dept. de TI. +message.transfer-complete.success=A transfer\u00eancia de ''{0}'' foi conclu\u00edda +message.undeclare.failure=N\u00e3o foi poss\u00edvel reabrir ''{0}''. Entre em contato com o Dept. de TI. +message.undeclare.success=''{0}'' n\u00e3o \u00e9 mais um documento arquiv\u00edstico conclu\u00eddo +message.undo-cutoff.failure=N\u00e3o foi poss\u00edvel desfazer corte de ''{0}''. Entre em contato com o Dept. de TI. +message.undo-cutoff.success=Desfazer corte em ''{0}'' +message.create-disposition-schedule.failure=N\u00e3o foi poss\u00edvel criar a programa\u00e7\u00e3o de reten\u00e7\u00e3o para ''{0}''. Entre em contato com o Dept. de TI. +message.create-disposition-schedule.success=Programa\u00e7\u00e3o de reten\u00e7\u00e3o para ''{0}'' criada +message.create-record.success=Este arquivo foi transformado em documento arquiv\u00edstico e tem a\u00e7\u00f5es limitadas dispon\u00edveis +message.create-record.failure=N\u00e3o foi poss\u00edvel declarar como documento arquiv\u00edstico. Entre em contato com o Dept. de TI. +message.declare-version-as-record.success=Esta vers\u00e3o do arquivo foi declarada como documento arquiv\u00edstico +message.declare-version-as-record.failure=N\u00e3o foi poss\u00edvel declarar a vers\u00e3o como documento arquiv\u00edstico. Entre em contato com o Dept. de TI. +message.hide-record.success=Documento arquiv\u00edstico ''{0}'' oculto com sucesso +message.hide-record.failure=N\u00e3o foi poss\u00edvel ocultar documento arquiv\u00edstico ''{0}''. Entre em contato com o Dept. de TI. +message.reject.reason=Motivo: +message.reject.title=Motivo para rejei\u00e7\u00e3o +message.reject.failure=N\u00e3o foi poss\u00edvel rejeitar ''{0}''. Entre em contato com o Dept. de TI. +message.reject.success=''{0}'' rejeitado +message.file-destruction-report.failure=N\u00e3o foi poss\u00edvel gerar relat\u00f3rio de destrui\u00e7\u00e3o. Entre em contato com o Dept. de TI. +message.file-destruction-report.success=Relat\u00f3rio de destrui\u00e7\u00e3o gerado +message.end-retention.failure=N\u00e3o foi poss\u00edvel encerrar a reten\u00e7\u00e3o. Entre em contato com o Dept. de TI. +message.end-retention.success=Reten\u00e7\u00e3o encerrada +message.file-success=Relat\u00f3rio arquivado com sucesso como ''{0}'' +message.file-failure=N\u00e3o foi poss\u00edvel concluir a opera\u00e7\u00e3o do arquivo. Entre em contato com o Dept. de TI. +message.file-hold-report.failure=N\u00e3o foi poss\u00edvel gerar o relat\u00f3rio de espera. Entre em contato com o Dept. de TI. +message.file-hold-report.success=Relat\u00f3rio de espera gerado +message.delete-hold.failure=N\u00e3o foi poss\u00edvel excluir a espera. Entre em contato com o Dept. de TI. +message.delete-hold.success=Espera exclu\u00edda +message.moveDmRecord.failure=N\u00e3o foi poss\u00edvel mover o documento arquiv\u00edstico ''{0}''. Entre em contato com o Dept. de TI. +message.moveDmRecord.success=Documento arquiv\u00edstico ''{0}'' movido com sucesso +message.recordedVersionConfig.success=Op\u00e7\u00f5es de auto-declara\u00e7\u00e3o definidas com sucesso +message.recordedVersionConfig.failure=N\u00e3o foi poss\u00edvel definir as op\u00e7\u00f5es de auto-declara\u00e7\u00e3o. Entre em contato com o Dept. de TI. +message.unlink.success=V\u00ednculo do documento arquiv\u00edstico anulado com sucesso +message.unlink.failure=N\u00e3o foi poss\u00edvel anular o v\u00ednculo do documento arquiv\u00edstico. Entre em contato com o Dept. de TI. + +## File Plan Status Indicators +status.active-workflows=Pertence a {0} fluxos de trabalho ativos +status.rm-accession=Ades\u00e3o pendente +status.rm-accessioned=Aderido +status.rm-closed=Fechado +status.rm-cutoff=Cortar +status.rm-cutoff-folder=Cortar +status.rm-destroyed=Destru\u00eddos +status.rm-frozen=Em espera +status.rm-multi-parent=Vinculado em v\u00e1rias pastas de documento arquiv\u00edstico +status.rm-open=Aberto +status.rm-transfer=Transfer\u00eancia pendente +status.rm-transferred=Transferido +status.rm-vital-record=Documento arquiv\u00edstico vital +status.rm-rejected-record=Rejeitado +status.rm-disposition-schedule=Categoria de documento arquiv\u00edstico tem uma programa\u00e7\u00e3o de reten\u00e7\u00e3o definida +status.rm-digital-photograph-record=Documento arquiv\u00edstico fotogr\u00e1fico digital +status.rm-pdf-record=Arquivo PDF +status.rm-scanned-record=Documento arquiv\u00edstico escaneado +status.rm-web-record=Documento arquiv\u00edstico da Web +status.rm-is-record=Documento arquiv\u00edstico +status.rules=Pasta com regras aplicadas +status.rm-version-record=Documento arquiv\u00edstico da vers\u00e3o +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=Todas as revis\u00f5es ser\u00e3o registradas +status.rm-recorded-version-history-major-revisions=Somente ser\u00e3o registradas as revis\u00f5es principais + +# Exif +status.exif=Metadados EXIF dispon\u00edveis +status.geographic=Metadados de geolocaliza\u00e7\u00e3o dispon\u00edveis +status.dod5015-digital-photograph-record=Documento arquiv\u00edstico fotogr\u00e1fico digital +status.dod5015-pdf-record=Arquivo PDF +status.dod5015-scanned-record=Documento arquiv\u00edstico escaneado +status.dod5015-web-record=Documento arquiv\u00edstico da Web + +# RMA model metadata fields +label.all=Tudo +label.keywords=Palavras-chave (texto e nome) +label.identifier=ID +label.dateFiled=Data de arquivamento +label.publicationDate=Data de publica\u00e7\u00e3o +label.originator=Originador +label.originatingOrganization=Organiza\u00e7\u00e3o de origem +label.mediaType=Tipo de m\u00eddia +label.format=Formato +label.dateReceived=Data de recebimento +label.supplementalMarkingList=Lista de marca\u00e7\u00f5es complementares +label.vitalRecord=Documento arquiv\u00edstico vital +label.reviewDate=Data de revis\u00e3o +label.address=Destinat\u00e1rio +label.otherAddress=Outro destinat\u00e1rio +label.unpublishedUpdates=Atualiza\u00e7\u00f5es n\u00e3o publicadas +label.publishInProgress=Publica\u00e7\u00e3o em andamento + +# IMAP model metadata fields +label.imap.threadIndex=IMAP ThreadIndex +label.imap.messageFrom=Mensagem IMAP de +label.imap.messageTo=Mensagem IMAP para +label.imap.messageCc=Cc da mensagem IMAP +label.imap.messageSubject=Assunto da mensagem IMAP +label.imap.dateReceived=Data de recebimento de IMAP +label.imap.dateSent=Data de envio de IMAP + +# DOD model metadata fields +label.dod.scannedFormatVersion=Vers\u00e3o e formato da imagem +label.dod.resolutionX=Resolu\u00e7\u00e3o da imagem X +label.dod.resolutionY=Resolu\u00e7\u00e3o da imagem Y +label.dod.scannedBitDepth=Intensidade de bits escaneada +label.dod.producingApplication=Aplicativo de produ\u00e7\u00e3o +label.dod.producingApplicationVersion=Vers\u00e3o do aplicativo de produ\u00e7\u00e3o +label.dod.pdfVersion=Vers\u00e3o do PDF +label.dod.creatingApplication=Criando aplicativo +label.dod.documentSecuritySettings=Configura\u00e7\u00f5es de seguran\u00e7a do documento +label.dod.caption=Legenda +label.dod.photographer=Fot\u00f3grafo +label.dod.copyright=Copyright +label.dod.bitDepth=Intensidade de bit +label.dod.imageSizeX=Tamanho da imagem X +label.dod.imageSizeY=Tamanho da imagem Y +label.dod.imageSource=Fonte da imagem +label.dod.compression=Compress\u00e3o +label.dod.iccIcmProfile=Perfil ICC/ICM +label.dod.exifInformation=Informa\u00e7\u00f5es EXIF +label.dod.webFileName=Nome do arquivo da Web +label.dod.webPlatform=Plataforma da Web +label.dod.webSiteName=Nome do site +label.dod.webSiteURL=URL do site +label.dod.captureMethod=M\u00e9todo de captura +label.dod.captureDate=Data de captura +label.dod.contact=Contato +label.dod.contentManagementSystem=Sistema de gerenciamento de conte\u00fado + +# RM Admin Console tools +tool.rm-define-roles.label=Definir fun\u00e7\u00f5es +tool.rm-define-roles.description=Criar e editar fun\u00e7\u00f5es +tool.rm-custom-metadata.label=Metadados personalizados +tool.rm-custom-metadata.description=Metadados personalizados +tool.rm-list-of-values.label=Lista de valores +tool.rm-list-of-values.description=Defini\u00e7\u00f5es da lista de valores +tool.rm-references.label=Relacionamentos +tool.rm-references.description=Defini\u00e7\u00f5es de relacionamentos +tool.rm-events.label=Eventos +tool.rm-events.description=Defini\u00e7\u00f5es de eventos +tool.rm-audit.label=Auditoria +tool.rm-audit.description=Auditoria do Records Management +tool.rm-email-mappings.label=Mapeamentos de e-mail +tool.rm-email-mappings.description=Defini\u00e7\u00f5es de mapeamentos de e-mail +tool.rm-user-rights.label=Relat\u00f3rio de direitos do usu\u00e1rio +tool.rm-user-rights.description=Relat\u00f3rio de direitos do usu\u00e1rio +tool.rm-users-and-groups.label=Usu\u00e1rios e grupos +tool.rm-users-and-groups.description=Usu\u00e1rios e grupos + +## Buttons +button.sort.ascending=Classificar em ordem crescente +button.sort.descending=Classificar em ordem decrescente +button.folders.show=Mostrar pastas +button.folders.hide=Ocultar pastas +button.view.simple=Modo de exibi\u00e7\u00e3o simples +button.view.detailed=Visualiza\u00e7\u00e3o detalhada + +## Drop-down Menus +menu.select=Selecionar +menu.select.all=Tudo +menu.select.none=Nenhum +menu.select.invert=Inverter sele\u00e7\u00e3o +menu.select.folders=Pastas +menu.select.documents=Documentos +menu.select.records=Documentos arquiv\u00edsticos +menu.select.undeclaredRecords=Documentos arquiv\u00edsticos incompletos +menu.select.recordFolders=Pastas de documentos arquiv\u00edsticos +menu.select.recordCategories=Categorias de documentos arquiv\u00edsticos + +## Metadata Fields +# Generic +details.created.on=Criado em +details.created.by=Criado por +details.modified.on=Modificado em +details.modified.by=Modificado por +details.by=Por +details.size=Tamanho +details.description=Descri\u00e7\u00e3o +details.description.none=(Nenhum) +# Record Category +details.category.identifier=ID da categoria de documento arquiv\u00edstico +details.category.disposition-authority=Autoridade de reten\u00e7\u00e3o +details.category.disposition-instructions=Instru\u00e7\u00f5es de reten\u00e7\u00e3o +details.category.vital-record-indicator=Indicador de documento arquiv\u00edstico vital +# Record Folder +details.folder.identifier=ID da pasta de documento arquiv\u00edstico +details.folder.vital-record-indicator=Indicador de documento arquiv\u00edstico vital +# Record +details.record.identifier=ID exclusivo do documento arquiv\u00edstico +details.record.date-filed=Data de arquivamento +details.record.publication-date=Data de publica\u00e7\u00e3o +details.record.originator=Originador +details.record.originating-organization=Organiza\u00e7\u00e3o de origem +details.version.label=Vers\u00e3o +# Incomplete Record +details.undeclared-record.info=Documento arquiv\u00edstico incompleto +# Rejected Record +details.rejected-record.info=Documento arquiv\u00edstico rejeitado +# Transfer Container +details.transfer-container.title=Transferir {0} +details.transfer-container.is-accession=Nota: O tipo de transfer\u00eancia \u00e9 Ades\u00e3o +# Hold Container +details.hold.title=Espera criada em {0} +details.hold.title.date-format=dd mmmm aaaa '\u00e0s' HH:MM:ss +details.hold.reason=Motivo para espera +details.hold.reason.none=N\u00e3o dispon\u00edvel +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=ID da pasta + +## File Upload (upload new version) +label.filter-description=Mesmo tipo de {0} + +## Empty List +no.items.title=Sem itens + +## Tips +tip.insitu-rename=Renomear +tip.insitu-tag=Marca + +## Help panels, including Drag and Drop +show.folders=Mostrar {0} subpasta(s) + +## Create site dialog +description.recordsManagementSite=Site do Records Management +title.recordsManagementSite=Records Management +type.recordsManagementSite=Site do Records Management +compliance.standard=Padr\u00e3o +compliance.dod5015=DoD 5015.2-STD +label.compliance=Conformidade + +## Console title +link.managementConsole=Console de Gerenciamento + +## Rules +customise.reject.text=Rejeitar documentos arquiv\u00edsticos com o coment\u00e1rio ''{param.reason}'' +customise.requestInfo.text=Cria uma tarefa de fluxo de trabalho para uma lista de pessoas especificadas e solicita as seguintes informa\u00e7\u00f5es ''{param.requestedInfo}'' +customise.sendEmail.text=Enviar e-mail com o assunto ''{param.subject}'' aos destinat\u00e1rios especificados + +## Records Management Admin Tools +header.rm-console.label=Records Management... +header.rm-management.label=Console de Gerenciamento +header.rm-management.description=Console de Gerenciamento + +## Request Info Workflow +rm.wf.information-requested-for-record=Informa\u00e7\u00f5es solicitadas do documento arquiv\u00edstico +rm.wf.request-information-from=Solicitar informa\u00e7\u00f5es de +rm.wf.requested-information=Informa\u00e7\u00f5es solicitadas +rm.wf.record=Documento arquiv\u00edstico +rm.wf.selected-users-and-groups=Usu\u00e1rios e grupos +rm.wf.give-details=Fornecer informa\u00e7\u00f5es +rm.wf.message=Mensagem +rm.wf.details=Detalhes + +## Text length validation +message.max.text.length.validation=Insira texto com menos de {max} caracteres + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=Selecione um per\u00edodo de revis\u00e3o + +## Forms +form.control.object-picker.items-list.empty=Sem itens +form.control.object-picker.items-list.loading=Carregando... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=T\u00edtulo +file-to.substitution.node.cm.description.label=Descri\u00e7\u00e3o +file-to.substitution.node.cm.accessed.label=\u00daltimo acesso +file-to.substitution.node.cm.created.label=Data de cria\u00e7\u00e3o +file-to.substitution.node.cm.creator.label=Criador +file-to.substitution.node.cm.modified.label=\u00daltima modifica\u00e7\u00e3o +file-to.substitution.node.cm.modifier.label=Modificador +file-to.substitution.node.cm.name.label=Nome +file-to.substitution.node.rma.origionalName.label=Nome do n\u00f3 original +file-to.substitution.node.rma.dateFiled.label=Data de arquivamento +file-to.substitution.node.rma.location.label=Localiza\u00e7\u00e3o +file-to.substitution.node.rma.dbUniquenessId.label=ID exclusivo do banco de dados +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=ID do n\u00f3 +file-to.substitution.node.sys.store-identifier.label=ID do armazenamento +file-to.substitution.node.sys.store-protocol.label=Protocolo de armazenamento +file-to.substitution.date.day.short.label=Dia curto (ex.: Seg) +file-to.substitution.date.day.label=Dia (ex.: Seg) +file-to.substitution.date.day.long.label=Dia longo (ex.: Segunda) +file-to.substitution.date.day.number.label=N\u00famero do dia (ex.: 1) +file-to.substitution.date.day.year.label=Dia do ano (ex.: 216) +file-to.substitution.date.day.month.label=Dia do m\u00eas (ex.: 18) +file-to.substitution.date.month.short.label=M\u00eas curto (ex.: Jan) +file-to.substitution.date.month.label=M\u00eas (ex.: Jan) +file-to.substitution.date.month.long.label=M\u00eas longo (ex.: Janeiro) +file-to.substitution.date.month.number.label=N\u00famero do m\u00eas (ex.: 01) +file-to.substitution.date.year.short.label=Ano curto (ex.: 14) +file-to.substitution.date.year.label=Ano (ex.: 14) +file-to.substitution.date.year.long.label=Ano longo (ex.: 2014) +file-to.substitution.date.year.week.label=Semana do ano (ex.: 31) + +## Banner icon messages +banner.rejected-record.info=Consulte as informa\u00e7\u00f5es sobre o documento arquiv\u00edstico rejeitado +banner.rejected-record.close=Remova a advert\u00eancia de documento arquiv\u00edstico rejeitado +banner.child-classification-in-progress.info=Classifica\u00e7\u00e3o de secund\u00e1rios em andamento +banner.child-classification-complete.info=Classifica\u00e7\u00e3o de secund\u00e1rios conclu\u00edda +banner.child-classification-complete.close=Remover a mensagem + +## Recordable Versions +label.destroyed-version=Vers\u00e3o destru\u00edda +label.recorded-version=Vers\u00e3o arquivada como documento arquiv\u00edstico diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_ru.properties new file mode 100644 index 0000000000..bab60107c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_ru.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +page.rmDocumentLibrary.description=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmSearch.title=\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +page.rmSearch.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +page.rmSiteDashboard.title=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmSiteDashboard.description=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmAudit.title=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +page.rmAudit.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 +page.rmNewReference.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 +page.rmNewReference.description=\u041d\u043e\u0432\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmDispositionEdit.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +page.rmDispositionEdit.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +page.rmPermissions.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +page.rmPermissions.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +page.rmConsole.title=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmConsole.description=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +page.rmRecordSeriesDetails.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmRecordCategoryDetails.title=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +page.rmRecordCategoryDetails.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +page.rmRecordFolderDetails.title=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +page.rmRecordFolderDetails.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 + +## Forms +label.set.idStatus=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 +label.set.general=\u041e\u0431\u0449\u0435\u0435 +label.set.record=\u0417\u0430\u043f\u0438\u0441\u044c +label.set.correspondence=\u041a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0446\u0438\u044f +label.set.security=\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c +label.set.vitalRecord=\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +label.set.disposition=\u0413\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.set.customMetadata=\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +label.set.recordVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 +label.set.recordFolder=\u041f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.set.recordCategory=\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.hold.reason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 +label.hold.delete.empty=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043f\u0443\u0441\u0442\u0430\u044f +label.recordLevelDisposition=\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a +label.record=\u0417\u0430\u043f\u0438\u0441\u044c +label.folder=\u041f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.declared=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +label.recordType=\u0422\u0438\u043f \u0437\u0430\u043f\u0438\u0441\u0438 +label.seriesIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.categoryIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.folderIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.recordIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 +label.dispositionInstructions=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e +label.dispositionAsOfDate=\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u0442\u0443 +label.physicalSize=\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 +label.numberOfCopies=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439 +label.storageLocation=\u041c\u0435\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.shelf=\u041f\u043e\u043b\u043a\u0430 +label.file=\u0424\u0430\u0439\u043b +label.box=\u041f\u043e\u043b\u0435 +label.versionDescription=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 +label.VersionLabel=\u042f\u0440\u043b\u044b\u043a \u0432\u0435\u0440\u0441\u0438\u0438 + +## Common Property Selector +label.menu.content=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 +label.menu.records=\u0417\u0430\u043f\u0438\u0441\u044c +label.menu.disposition=\u0413\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.menu.specialtypes=\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b +label.menu.imap=IMAP +label.menu.custom=\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 + +## Buttons +button.reject.record=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +button.request-info=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e + +## Pop-up Messages +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 +message.confirm.delete=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.confirm.destroy.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f +message.confirm.destroy=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c ''{0}''? +message.confirm.destroyMultiple=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c {0} \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432? +message.confirm2.destroy.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f +message.confirm2.destroy=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e. \u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? +message.confirm2.destroyMultiple=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e. \u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? +message.confirm.hide.record.title=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +message.confirm.hide.record=\u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0442\u0430\u043b \u0437\u0430\u043f\u0438\u0441\u044c\u044e. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u041e\u041a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0441\u044f \u0437\u0434\u0435\u0441\u044c. +message.select=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435... +message.pdf-record-fonts.title=\u0417\u0430\u043f\u0438\u0441\u0438 PDF: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 +message.pdf-record-fonts.accession=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0432 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 PDF, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f. +message.pdf-record-fonts.transfer=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0432 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 PDF, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c. +message.pdf-record-fonts.unknown=\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 PDF, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043d\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b. +message.request-info-success=\u0417\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d +message.request-info-failure=\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. +message.confirm.delete-hold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 +message.confirm.delete-hold=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 ''{0}'', \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b. +message.confirm.close-rejected-record.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c +message.confirm.close-rejected-record=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. +message.confirm.unlink.title=\u0420\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c +message.confirm.unlink.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e? +message.confirm.close-child-classification-complete.title=\u0417\u0430\u0441\u0435\u043a\u0440\u0435\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e +message.confirm.close-child-classification-complete=\u0421\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435? + +## Admin Console +message.admin-console-access-denied=\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. + +# Document path +path.fileplan=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 + +## File Plan Actions +actions.more=\u0415\u0449\u0435... +actions.accession=\u0414\u043e\u0441\u0442\u0443\u043f +actions.close-folder=\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 +actions.copy-to=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432... +actions.cutoff=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +actions.declare=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +actions.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +actions.destroy=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c +actions.download=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c +actions.download-zip=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c ZIP-\u0444\u0430\u0439\u043b +actions.edit-details=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +actions.edit-disposition-as-of-date=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +actions.edit-disposition-schedule=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +actions.edit-reason=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f +actions.edit-review-as-of-date=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 +actions.file-report=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b +actions.link-to=\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u0441... +actions.unlink-from=\u0420\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e +actions.file-to=\u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432... +actions.manage-permissions=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +actions.move-to=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432... +actions.open-folder=\u041f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 +actions.review-all=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 +actions.reviewed=\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e +actions.add-record-metadata=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +actions.split-email=\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f +actions.transfer=\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c +actions.transfer-complete=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 +actions.undeclare=\u041f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +actions.undo-cutoff=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435 +actions.create-disposition-schedule=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +actions.upload-new-version=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e +actions.view-details=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f +actions.view-audit-log=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +actions.declare-file-to=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +actions.declare-file-version-to=\u0417\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0432 \u0444\u0430\u0439\u043b \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c +actions.hide-record=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +actions.reject=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c +actions.request-info=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e +actions.file-destruction-report=\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 +actions.end-retention=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 +action.edit.hold=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 +actions.delete.hold=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 +actions.add-to-hold=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +actions.remove-from-hold=\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +actions.file-hold-report=\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435 +actions.move-dm-record=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +actions.recorded-version-config=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f +actions.add-relationship=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 + +## File Plan Action Outcomes +message.multi-select={0} \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +message.accession.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.accession.success=\u0414\u043e\u0441\u0442\u0443\u043f \u043a ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d +message.accession-complete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.accession-complete.success=\u0414\u043e\u0441\u0442\u0443\u043f \u043a ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d +message.close.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.close.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0430 +message.cutoff.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.cutoff.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u043d +message.declare.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c ''{0}'' +message.declare.failure.more=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c. +message.declare.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.delete.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.destroy.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.destroy.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043e +message.edit-disposition-as-of-date.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +message.edit-disposition-as-of-date.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u0442\u0443. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.edit-disposition-as-of-date.success=\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u0442\u0443 \u0434\u043b\u044f ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e +message.edit-hold.reason.label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430: +message.edit-hold.title=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +message.edit-hold.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.edit-hold.success=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 +message.edit-review-as-of-date.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 +message.edit-review-as-of-date.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0434\u0430\u0442\u0443. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.edit-review-as-of-date.success=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0434\u0430\u0442\u0443 \u0434\u043b\u044f ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 +message.open-folder.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.open-folder.success=\u041f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 +message.review-all.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.review-all.success=\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b +message.reviewed.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.reviewed.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e +message.split-email.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442 ''{0}'' +message.split-email.success=\u0412\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u044b \u043e\u0442 ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.transfer.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.transfer.success=''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e +message.transfer-complete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.transfer-complete.success=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 +message.undeclare.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.undeclare.success=''{0}'' \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e +message.undo-cutoff.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.undo-cutoff.success=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f ''{0}'' +message.create-disposition-schedule.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.create-disposition-schedule.success=\u0421\u043e\u0437\u0434\u0430\u043d \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f ''{0}'' +message.create-record.success=\u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0442\u0430\u043b \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 +message.create-record.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.declare-version-as-record.success=\u0414\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\u044e +message.declare-version-as-record.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u044c\u044e. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.hide-record.success=\u0417\u0430\u043f\u0438\u0441\u044c ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043a\u0440\u044b\u0442\u0430 +message.hide-record.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.reject.reason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430: +message.reject.title=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f +message.reject.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.reject.success=''{0}'' \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e +message.file-destruction-report.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.file-destruction-report.success=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d +message.end-retention.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.end-retention.success=\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +message.file-success=\u041e\u0442\u0447\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0432 \u0444\u0430\u0439\u043b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c ''{0}'' +message.file-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0444\u0430\u0439\u043b\u043e\u043c. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.file-hold-report.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.file-hold-report.success=\u041e\u0442\u0447\u0435\u0442 \u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d +message.delete-hold.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.delete-hold.success=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.moveDmRecord.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c ''{0}''. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.moveDmRecord.success=\u0417\u0430\u043f\u0438\u0441\u044c ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0430 +message.recordedVersionConfig.success=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u044b +message.recordedVersionConfig.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.unlink.success=\u0421\u0432\u044f\u0437\u044c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043d\u0430 +message.unlink.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. + +## File Plan Status Indicators +status.active-workflows=\u0427\u0438\u0441\u043b\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442: {0} +status.rm-accession=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f +status.rm-accessioned=\u0414\u043e\u0441\u0442\u0443\u043f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d +status.rm-closed=\u0417\u0430\u043a\u0440\u044b\u0442\u043e +status.rm-cutoff=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +status.rm-cutoff-folder=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +status.rm-destroyed=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043e +status.rm-frozen=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e +status.rm-multi-parent=\u0421\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +status.rm-open=\u041e\u0442\u043a\u0440\u044b\u0442\u044c +status.rm-transfer=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 +status.rm-transferred=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e +status.rm-vital-record=\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +status.rm-rejected-record=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e +status.rm-disposition-schedule=\u0414\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +status.rm-digital-photograph-record=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 +status.rm-pdf-record=\u0417\u0430\u043f\u0438\u0441\u044c PDF +status.rm-scanned-record=\u041e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +status.rm-web-record=\u0412\u0435\u0431-\u0437\u0430\u043f\u0438\u0441\u044c +status.rm-is-record=\u0417\u0430\u043f\u0438\u0441\u044c +status.rules=\u0423 \u043f\u0430\u043f\u043a\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 +status.rm-version-record=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u0438 +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=\u0412\u0441\u0435 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b +status.rm-recorded-version-history-major-revisions=\u0411\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 + +# Exif +status.exif=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 EXIF +status.geographic=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438 +status.dod5015-digital-photograph-record=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 +status.dod5015-pdf-record=\u0417\u0430\u043f\u0438\u0441\u044c PDF +status.dod5015-scanned-record=\u041e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +status.dod5015-web-record=\u0412\u0435\u0431-\u0437\u0430\u043f\u0438\u0441\u044c + +# RMA model metadata fields +label.all=\u0412\u0441\u0435 +label.keywords=\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 (\u0442\u0435\u043a\u0441\u0442 \u0438 \u0438\u043c\u044f) +label.identifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +label.dateFiled=\u0414\u0430\u0442\u0430 \u0432\u0432\u043e\u0434\u0430 +label.publicationDate=\u0414\u0430\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +label.originator=\u0418\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440 +label.originatingOrganization=\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f +label.mediaType=\u0422\u0438\u043f \u043c\u0435\u0434\u0438\u0430 +label.format=\u0424\u043e\u0440\u043c\u0430\u0442 +label.dateReceived=\u0414\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f +label.supplementalMarkingList=\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +label.vitalRecord=\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +label.reviewDate=\u0414\u0430\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 +label.address=\u0410\u0434\u0440\u0435\u0441\u0430\u0442 +label.otherAddress=\u0414\u0440\u0443\u0433\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0442 +label.unpublishedUpdates=\u041d\u0435\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f +label.publishInProgress=\u0418\u0434\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 + +# IMAP model metadata fields +label.imap.threadIndex=\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430 IMAP +label.imap.messageFrom=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f IMAP +label.imap.messageTo=\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f IMAP +label.imap.messageCc=\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043a\u043e\u043f\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f IMAP +label.imap.messageSubject=\u0422\u0435\u043c\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f IMAP +label.imap.dateReceived=\u0414\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f IMAP +label.imap.dateSent=\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IMAP + +# DOD model metadata fields +label.dod.scannedFormatVersion=\u0424\u043e\u0440\u043c\u0430\u0442 \u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f +label.dod.resolutionX=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u0438 X +label.dod.resolutionY=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u0438 Y +label.dod.scannedBitDepth=\u0411\u0438\u0442\u043e\u0432\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f +label.dod.producingApplication=\u0412\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +label.dod.producingApplicationVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f +label.dod.pdfVersion=\u0412\u0435\u0440\u0441\u0438\u044f PDF +label.dod.creatingApplication=\u0421\u043e\u0437\u0434\u0430\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +label.dod.documentSecuritySettings=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u0449\u0438\u0442\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 +label.dod.caption=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a +label.dod.photographer=\u0410\u0432\u0442\u043e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 +label.dod.copyright=\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0430 +label.dod.bitDepth=\u0411\u0438\u0442\u043e\u0432\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 +label.dod.imageSizeX=\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u0438 X +label.dod.imageSizeY=\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u0438 Y +label.dod.imageSource=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f +label.dod.compression=\u0421\u0436\u0430\u0442\u0438\u0435 +label.dod.iccIcmProfile=\u041f\u0440\u043e\u0444\u0438\u043b\u044c ICC/ICM +label.dod.exifInformation=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f EXIF +label.dod.webFileName=\u0418\u043c\u044f \u0432\u0435\u0431-\u0444\u0430\u0439\u043b\u0430 +label.dod.webPlatform=\u0412\u0435\u0431-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 +label.dod.webSiteName=\u0418\u043c\u044f \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 +label.dod.webSiteURL=URL-\u0430\u0434\u0440\u0435\u0441 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 +label.dod.captureMethod=\u0421\u043f\u043e\u0441\u043e\u0431 \u0432\u0432\u043e\u0434\u0430 +label.dod.captureDate=\u0414\u0430\u0442\u0430 \u0441\u043d\u0438\u043c\u043a\u0430 +label.dod.contact=\u041a\u043e\u043d\u0442\u0430\u043a\u0442 +label.dod.contentManagementSystem=\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c + +# RM Admin Console tools +tool.rm-define-roles.label=\u0417\u0430\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u0438 +tool.rm-define-roles.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 +tool.rm-custom-metadata.label=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +tool.rm-custom-metadata.description=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +tool.rm-list-of-values.label=\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 +tool.rm-list-of-values.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 +tool.rm-references.label=\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f +tool.rm-references.description=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 +tool.rm-events.label=\u0421\u043e\u0431\u044b\u0442\u0438\u044f +tool.rm-events.description=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 +tool.rm-audit.label=\u0410\u0443\u0434\u0438\u0442 +tool.rm-audit.description=\u0410\u0443\u0434\u0438\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +tool.rm-email-mappings.label=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b +tool.rm-email-mappings.description=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b +tool.rm-user-rights.label=\u041e\u0442\u0447\u0435\u0442 \u043e \u043f\u0440\u0430\u0432\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +tool.rm-user-rights.description=\u041e\u0442\u0447\u0435\u0442 \u043e \u043f\u0440\u0430\u0432\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +tool.rm-users-and-groups.label=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u0433\u0440\u0443\u043f\u043f\u044b +tool.rm-users-and-groups.description=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u0433\u0440\u0443\u043f\u043f\u044b + +## Buttons +button.sort.ascending=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e +button.sort.descending=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e +button.folders.show=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0438 +button.folders.hide=\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0438 +button.view.simple=\u041a\u0440\u0430\u0442\u043a\u043e +button.view.detailed=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e + +## Drop-down Menus +menu.select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c +menu.select.all=\u0412\u0441\u0435 +menu.select.none=\u041d\u0435\u0442 +menu.select.invert=\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 +menu.select.folders=\u041f\u0430\u043f\u043a\u0438 +menu.select.documents=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b +menu.select.records=\u0417\u0430\u043f\u0438\u0441\u0438 +menu.select.undeclaredRecords=\u041d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +menu.select.recordFolders=\u041f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +menu.select.recordCategories=\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 + +## Metadata Fields +# Generic +details.created.on=\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f +details.created.by=\u0410\u0432\u0442\u043e\u0440: +details.modified.on=\u0414\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f +details.modified.by=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c +details.by=\u041f\u043e +details.size=\u0420\u0430\u0437\u043c\u0435\u0440 +details.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +details.description.none=(\u041d\u0435\u0442) +# Record Category +details.category.identifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +details.category.disposition-authority=\u041f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 +details.category.disposition-instructions=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e +details.category.vital-record-indicator=\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 +# Record Folder +details.folder.identifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +details.folder.vital-record-indicator=\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 +# Record +details.record.identifier=\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 +details.record.date-filed=\u0414\u0430\u0442\u0430 \u0432\u0432\u043e\u0434\u0430 +details.record.publication-date=\u0414\u0430\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +details.record.originator=\u0418\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440 +details.record.originating-organization=\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f +details.version.label=\u0412\u0435\u0440\u0441\u0438\u044f +# Incomplete Record +details.undeclared-record.info=\u041d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +# Rejected Record +details.rejected-record.info=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +# Transfer Container +details.transfer-container.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 {0} +details.transfer-container.is-accession=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0438\u043f\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +# Hold Container +details.hold.title=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 {0} +details.hold.title.date-format=\u0434\u0434 \u043c\u043c\u043c\u043c \u0433\u0433\u0433\u0433 '\u0432' \u0427\u0427:\u041c\u041c:\u0441\u0441 +details.hold.reason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +details.hold.reason.none=\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043f\u043a\u0438 + +## File Upload (upload new version) +label.filter-description=\u0422\u0430\u043a\u043e\u0439 \u0436\u0435 \u0442\u0438\u043f, \u043a\u0430\u043a {0} + +## Empty List +no.items.title=\u041d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 + +## Tips +tip.insitu-rename=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c +tip.insitu-tag=\u041c\u0435\u0442\u043a\u0430 + +## Help panels, including Drag and Drop +show.folders=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c {0} \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043e\u043a + +## Create site dialog +description.recordsManagementSite=\u0421\u0430\u0439\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +title.recordsManagementSite=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +type.recordsManagementSite=\u0421\u0430\u0439\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 +compliance.standard=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 +compliance.dod5015=DoD 5015.2-STD +label.compliance=\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c + +## Console title +link.managementConsole=\u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f + +## Rules +customise.reject.text=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c ''{param.reason}'' +customise.requestInfo.text=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438: ''{param.requestedInfo}'' +customise.sendEmail.text=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443 \u0441 \u0442\u0435\u043c\u043e\u0439 ''{param.subject}'' \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f\u043c + +## Records Management Admin Tools +header.rm-console.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438... +header.rm-management.label=\u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f +header.rm-management.description=\u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f + +## Request Info Workflow +rm.wf.information-requested-for-record=\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0438\u0441\u0438 +rm.wf.request-information-from=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 +rm.wf.requested-information=\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +rm.wf.record=\u0417\u0430\u043f\u0438\u0441\u044c +rm.wf.selected-users-and-groups=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u0433\u0440\u0443\u043f\u043f\u044b +rm.wf.give-details=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e +rm.wf.message=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 +rm.wf.details=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f + +## Text length validation +message.max.text.length.validation=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 {max} \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0435\u0440\u0438\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 + +## Forms +form.control.object-picker.items-list.empty=\u041d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +form.control.object-picker.items-list.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a +file-to.substitution.node.cm.description.label=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +file-to.substitution.node.cm.accessed.label=\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +file-to.substitution.node.cm.created.label=\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f +file-to.substitution.node.cm.creator.label=\u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c +file-to.substitution.node.cm.modified.label=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 +file-to.substitution.node.cm.modifier.label=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 +file-to.substitution.node.cm.name.label=\u0418\u043c\u044f +file-to.substitution.node.rma.origionalName.label=\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 +file-to.substitution.node.rma.dateFiled.label=\u0414\u0430\u0442\u0430 \u0432\u0432\u043e\u0434\u0430 +file-to.substitution.node.rma.location.label=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +file-to.substitution.node.rma.dbUniquenessId.label=\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 +file-to.substitution.node.rma.identifier.label=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +file-to.substitution.node.sys.node-uuid.label=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u0437\u043b\u0430 +file-to.substitution.node.sys.store-identifier.label=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 +file-to.substitution.node.sys.store-protocol.label=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 +file-to.substitution.date.day.short.label=\u0414\u0435\u043d\u044c (\u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u041f\u043d) +file-to.substitution.date.day.label=\u0414\u0435\u043d\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u041f\u043d) +file-to.substitution.date.day.long.label=\u0414\u0435\u043d\u044c (\u043f\u043e\u043b\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a) +file-to.substitution.date.day.number.label=\u041d\u043e\u043c\u0435\u0440 \u0434\u043d\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 1) +file-to.substitution.date.day.year.label=\u0414\u0435\u043d\u044c \u0432 \u0433\u043e\u0434\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 216) +file-to.substitution.date.day.month.label=\u0427\u0438\u0441\u043b\u043e \u043c\u0435\u0441\u044f\u0446\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 18) +file-to.substitution.date.month.short.label=\u041c\u0435\u0441\u044f\u0446 (\u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u042f\u043d\u0432) +file-to.substitution.date.month.label=\u041c\u0435\u0441\u044f\u0446 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u042f\u043d\u0432) +file-to.substitution.date.month.long.label=\u041c\u0435\u0441\u044f\u0446 (\u043f\u043e\u043b\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u042f\u043d\u0432\u0430\u0440\u044c) +file-to.substitution.date.month.number.label=\u041d\u043e\u043c\u0435\u0440 \u043c\u0435\u0441\u044f\u0446\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 01) +file-to.substitution.date.year.short.label=\u0413\u043e\u0434 (\u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 14) +file-to.substitution.date.year.label=\u0413\u043e\u0434 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 14) +file-to.substitution.date.year.long.label=\u0413\u043e\u0434 (\u043f\u043e\u043b\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 2014) +file-to.substitution.date.year.week.label=\u041d\u0435\u0434\u0435\u043b\u044f \u0432 \u0433\u043e\u0434\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 31) + +## Banner icon messages +banner.rejected-record.info=\u0421\u043c. \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 +banner.rejected-record.close=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 +banner.child-classification-in-progress.info=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0441\u0435\u043a\u0440\u0435\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 +banner.child-classification-complete.info=\u0417\u0430\u0441\u0435\u043a\u0440\u0435\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e +banner.child-classification-complete.close=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 + +## Recordable Versions +label.destroyed-version=\u0412\u0435\u0440\u0441\u0438\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0430 +label.recorded-version=\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_zh_CN.properties new file mode 100644 index 0000000000..805bc37493 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/messages/rm_zh_CN.properties @@ -0,0 +1,498 @@ +## Records Management Messages + +## Page titles +page.rmDocumentLibrary.title=\u5f52\u7c7b\u65b9\u6848 +page.rmDocumentLibrary.description=\u8bb0\u5f55\u7ba1\u7406\u5f52\u7c7b\u65b9\u6848 +page.rmSearch.title=\u8bb0\u5f55\u641c\u7d22 +page.rmSearch.description=\u8bb0\u5f55\u641c\u7d22\u9875\u9762 +page.rmSiteDashboard.title=\u8bb0\u5f55\u7ba1\u7406\u7ad9\u70b9\u4eea\u8868\u677f +page.rmSiteDashboard.description=\u8bb0\u5f55\u7ba1\u7406\u7ad9\u70b9\u4eea\u8868\u677f\u9875\u9762 +page.rmAudit.title=\u5ba1\u8ba1\u65e5\u5fd7 +page.rmAudit.description=\u5ba1\u8ba1\u65e5\u5fd7\u9875\u9762 +page.rmNewReference.title=\u65b0\u53c2\u8003 +page.rmNewReference.description=\u8bb0\u5f55\u4e4b\u95f4\u7684\u65b0\u53c2\u8003 +page.rmDispositionEdit.title=\u7f16\u8f91\u4fdd\u7559\u8ba1\u5212 +page.rmDispositionEdit.description=\u7528\u4e8e\u7f16\u8f91\u4fdd\u7559\u8ba1\u5212\u7684\u9875\u9762 +page.rmPermissions.title=\u7ba1\u7406\u6743\u9650 +page.rmPermissions.description=\u7528\u4e8e\u7ba1\u7406\u6743\u9650\u7684\u9875\u9762 +page.rmConsole.title=RM \u7ba1\u7406\u5de5\u5177 +page.rmConsole.description=\u8bb0\u5f55\u7ba1\u7406\u7684\u7ba1\u7406\u5de5\u5177 + +## Record Container Details Pages +page.rmRecordSeriesDetails.title=\u8bb0\u5f55\u7cfb\u5217\u8be6\u7ec6\u4fe1\u606f +page.rmRecordSeriesDetails.description=\u8bb0\u5f55\u7ba1\u7406\u7684\u8bb0\u5f55\u7cfb\u5217\u8be6\u7ec6\u4fe1\u606f\u9875\u9762 +page.rmRecordCategoryDetails.title=\u8bb0\u5f55\u7c7b\u522b\u8be6\u7ec6\u4fe1\u606f +page.rmRecordCategoryDetails.description=\u8bb0\u5f55\u7ba1\u7406\u7684\u8bb0\u5f55\u7c7b\u522b\u8be6\u7ec6\u4fe1\u606f\u9875\u9762 +page.rmRecordFolderDetails.title=\u8bb0\u5f55\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f +page.rmRecordFolderDetails.description=\u8bb0\u5f55\u7ba1\u7406\u7684\u8bb0\u5f55\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f\u9875\u9762 + +## Forms +label.set.idStatus=\u6807\u8bc6\u548c\u72b6\u6001 +label.set.general=\u5e38\u89c4 +label.set.record=\u8bb0\u5f55 +label.set.correspondence=\u901a\u4fe1 +label.set.security=\u5b89\u5168\u6027 +label.set.vitalRecord=\u6838\u5fc3\u8bb0\u5f55 +label.set.disposition=\u4fdd\u7559\u8ba1\u5212 +label.set.customMetadata=\u81ea\u5b9a\u4e49\u5c5e\u6027 +label.set.recordVersion=\u8bb0\u5f55\u7248\u672c +label.set.recordFolder=\u8bb0\u5f55\u6587\u4ef6\u5939 +label.set.recordCategory=\u8bb0\u5f55\u7c7b\u522b +label.hold.reason=\u539f\u56e0 +label.hold.delete.empty=\u7a7a\u65f6\u5220\u9664\u4fdd\u5b58 +label.recordLevelDisposition=\u9002\u7528\u4e8e +label.record=\u8bb0\u5f55 +label.folder=\u8bb0\u5f55\u6587\u4ef6\u5939 +label.declared=\u5df2\u5b8c\u6210 +label.recordType=\u8bb0\u5f55\u7c7b\u578b +label.seriesIdentifier=\u8bb0\u5f55\u7cfb\u5217 ID +label.categoryIdentifier=\u8bb0\u5f55\u7c7b\u522b ID +label.folderIdentifier=\u8bb0\u5f55\u6587\u4ef6\u5939 ID +label.recordIdentifier=\u8bb0\u5f55 ID +label.dispositionInstructions=\u4fdd\u7559\u8bf4\u660e +label.dispositionAsOfDate=\u4fdd\u7559\u622a\u6b62\u65e5\u671f +label.physicalSize=\u7269\u7406\u5c3a\u5bf8 +label.numberOfCopies=\u526f\u672c\u6570\u76ee +label.storageLocation=\u5b58\u50a8\u4f4d\u7f6e +label.shelf=\u6258\u67b6 +label.file=\u6587\u4ef6 +label.box=\u7bb1 +label.versionDescription=\u7248\u672c\u8bf4\u660e +label.VersionLabel=\u7248\u672c\u6807\u7b7e + +## Common Property Selector +label.menu.content=\u5185\u5bb9 +label.menu.records=\u8bb0\u5f55 +label.menu.disposition=\u4fdd\u7559\u8ba1\u5212 +label.menu.specialtypes=\u7279\u6b8a\u7c7b\u578b +label.menu.imap=IMAP +label.menu.custom=\u81ea\u5b9a\u4e49\u5c5e\u6027 + +## Buttons +button.reject.record=\u62d2\u7edd\u8bb0\u5f55 +button.request-info=\u8bf7\u6c42\u4fe1\u606f + +## Pop-up Messages +message.confirm.delete.title=\u5220\u9664\u786e\u8ba4 +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.confirm.destroy.title=\u9500\u6bc1\u786e\u8ba4 +message.confirm.destroy=\u662f\u5426\u786e\u5b9a\u8981\u9500\u6bc1 ''{0}''\uff1f +message.confirm.destroyMultiple=\u662f\u5426\u786e\u5b9a\u8981\u9500\u6bc1\u6240\u9009\u7684 {0} \u4e2a\u6587\u4ef6\uff1f +message.confirm2.destroy.title=\u9500\u6bc1\u786e\u8ba4 +message.confirm2.destroy=\u5c06\u6c38\u4e45\u5220\u9664\u6587\u4ef6\u7684\u5185\u5bb9\uff0c\u662f\u5426\u786e\u5b9a\u7ee7\u7eed\uff1f +message.confirm2.destroyMultiple=\u5c06\u6c38\u4e45\u5220\u9664\u6587\u4ef6\u7684\u5185\u5bb9\uff0c\u662f\u5426\u786e\u5b9a\u7ee7\u7eed\uff1f +message.confirm.hide.record.title=\u9690\u85cf\u8bb0\u5f55 +message.confirm.hide.record=\u6b64\u6587\u4ef6\u5df2\u521b\u5efa\u4e3a\u8bb0\u5f55\u3002 \u5355\u51fb\u786e\u5b9a\u4ee5\u9690\u85cf\u5b83\uff0c\u4f7f\u5b83\u5728\u6b64\u5904\u4e0d\u53ef\u89c1\u3002 +message.select=\u9009\u62e9... +message.pdf-record-fonts.title=PDF \u8bb0\u5f55\uff1a\u5d4c\u5165\u5b57\u4f53\u68c0\u67e5 +message.pdf-record-fonts.accession=\u68c0\u67e5\u521a\u5165\u7ba1\u7684\u4efb\u4f55 PDF \u8bb0\u5f55\u662f\u5426\u5305\u542b\u9002\u7528\u7684\u5d4c\u5165\u5b57\u4f53\u3002 +message.pdf-record-fonts.transfer=\u68c0\u67e5\u521a\u79fb\u4ea4\u7684\u4efb\u4f55 PDF \u8bb0\u5f55\u662f\u5426\u5305\u542b\u9002\u7528\u7684\u5d4c\u5165\u5b57\u4f53\u3002 +message.pdf-record-fonts.unknown=\u5982\u679c\u79fb\u4ea4\u6216\u5165\u7ba1\u7684\u5185\u5bb9\u5305\u542b PDF \u8bb0\u5f55\uff0c\u60a8\u5e94\u5f53\u68c0\u67e5\u662f\u5426\u5305\u542b\u4e86\u9002\u7528\u7684\u5d4c\u5165\u5b57\u4f53\u3002 +message.request-info-success=\u5df2\u6210\u529f\u8bf7\u6c42\u4fe1\u606f +message.request-info-failure=\u6211\u4eec\u9690\u85cf\u5e26\u6709\u4fe1\u606f\u8bf7\u6c42\u7684\u95ee\u9898\u3002 +message.confirm.delete-hold.title=\u5220\u9664\u4fdd\u5b58 +message.confirm.delete-hold=\u5982\u679c\u60a8\u5220\u9664\u4fdd\u5b58 ''{0}''\uff0c\u5219\u5176\u4fdd\u5b58\u7684\u6240\u6709\u9879\u76ee\u5c06\u4f1a\u88ab\u91ca\u653e\u3002 +message.confirm.close-rejected-record.title=\u786e\u8ba4 +message.confirm.close-rejected-record=\u5982\u679c\u60a8\u5220\u9664\u62d2\u7edd\u7684\u8bb0\u5f55\u8b66\u544a\uff0c\u5219\u58f0\u660e\u6587\u4ef6\u4e3a\u8bb0\u5f55\u7684\u9009\u9879\u5c06\u518d\u6b21\u53ef\u7528\u3002 +message.confirm.unlink.title=\u53d6\u6d88\u786e\u8ba4\u7684\u94fe\u63a5 +message.confirm.unlink.text=\u662f\u5426\u786e\u5b9a\u8981\u53d6\u6d88\u8bb0\u5f55\u7684\u94fe\u63a5\uff1f +message.confirm.close-child-classification-complete.title=\u5b50\u9879\u5206\u7c7b\u5b8c\u6210 +message.confirm.close-child-classification-complete=\u662f\u5426\u786e\u5b9a\u8981\u9690\u85cf\u6b64\u6d88\u606f\uff1f + +## Admin Console +message.admin-console-access-denied=\u8981\u8bbf\u95ee\u8be5\u9875\u9762\uff0c\u60a8\u9700\u8981\u989d\u5916\u7684\u6743\u9650\u3002 \u54a8\u8be2\u60a8\u7684 IT \u90e8\u95e8\u3002 + +# Document path +path.fileplan=\u5f52\u7c7b\u65b9\u6848 + +## File Plan Actions +actions.more=\u66f4\u591a... +actions.accession=\u5165\u7ba1 +actions.close-folder=\u5173\u95ed\u6587\u4ef6\u5939 +actions.copy-to=\u590d\u5236\u5230... +actions.cutoff=\u4e2d\u65ad +actions.declare=\u5b8c\u6210\u8bb0\u5f55 +actions.delete=\u5220\u9664 +actions.destroy=\u9500\u6bc1 +actions.download=\u4e0b\u8f7d +actions.download-zip=\u4e0b\u8f7d Zip +actions.edit-details=\u7f16\u8f91\u5143\u6570\u636e +actions.edit-disposition-as-of-date=\u7f16\u8f91\u4fdd\u7559\u65e5\u671f +actions.edit-disposition-schedule=\u7f16\u8f91\u4fdd\u7559\u8ba1\u5212 +actions.edit-reason=\u7f16\u8f91\u4fdd\u5b58\u8be6\u7ec6\u4fe1\u606f +actions.edit-review-as-of-date=\u7f16\u8f91\u5ba1\u67e5\u65e5\u671f +actions.file-report=\u7acb\u5377\u62a5\u544a +actions.link-to=\u94fe\u63a5\u5230... +actions.unlink-from=\u53d6\u6d88\u8bb0\u5f55\u7684\u94fe\u63a5 +actions.file-to=\u7acb\u5377\u81f3... +actions.manage-permissions=\u7ba1\u7406\u6743\u9650 +actions.move-to=\u79fb\u52a8\u5230... +actions.open-folder=\u91cd\u65b0\u6253\u5f00\u6587\u4ef6\u5939 +actions.review-all=\u5ba1\u67e5\u5168\u90e8 +actions.reviewed=\u5df2\u5ba1\u67e5 +actions.add-record-metadata=\u6dfb\u52a0\u8bb0\u5f55\u5143\u6570\u636e +actions.split-email=\u62c6\u5206\u7535\u5b50\u90ae\u4ef6\u9644\u4ef6 +actions.transfer=\u79fb\u4ea4 +actions.transfer-complete=\u5b8c\u6210\u79fb\u4ea4 +actions.undeclare=\u91cd\u65b0\u6253\u5f00\u8bb0\u5f55 +actions.undo-cutoff=\u64a4\u6d88\u4e2d\u65ad +actions.create-disposition-schedule=\u521b\u5efa\u4fdd\u7559\u8ba1\u5212 +actions.upload-new-version=\u4e0a\u4f20\u65b0\u7248\u672c +actions.view-details=\u67e5\u770b\u8be6\u7ec6\u4fe1\u606f +actions.view-audit-log=\u67e5\u770b\u5ba1\u8ba1\u65e5\u5fd7 +actions.declare-file-to=\u7acb\u5377\u4e3a\u8bb0\u5f55 +actions.declare-file-version-to=\u6587\u4ef6\u7248\u672c\u4f5c\u4e3a\u8bb0\u5f55 +actions.hide-record=\u9690\u85cf\u8bb0\u5f55 +actions.reject=\u62d2\u7edd +actions.request-info=\u8bf7\u6c42\u4fe1\u606f +actions.file-destruction-report=\u751f\u6210\u9500\u6bc1\u62a5\u544a +actions.end-retention=\u7ed3\u675f\u4fdd\u7559 +action.edit.hold=\u7f16\u8f91\u4fdd\u5b58 +actions.delete.hold=\u5220\u9664\u4fdd\u5b58 +actions.add-to-hold=\u52a0\u5165\u4fdd\u5b58 +actions.remove-from-hold=\u89e3\u9664\u4fdd\u5b58 +actions.file-hold-report=\u751f\u6210\u4fdd\u5b58\u62a5\u544a +actions.move-dm-record=\u79fb\u52a8\u8bb0\u5f55 +actions.recorded-version-config=\u81ea\u52a8\u58f0\u660e\u9009\u9879 +actions.add-relationship=\u6dfb\u52a0\u5173\u7cfb + +## File Plan Action Outcomes +message.multi-select={0} \u4e2a\u6240\u9009\u9879\u76ee +message.accession.failure=\u65e0\u6cd5\u5165\u7ba1 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.accession.success=\u6210\u529f\u5165\u7ba1 ''{0}'' +message.accession-complete.failure=\u65e0\u6cd5\u5b8c\u6210 ''{0}'' \u7684\u5165\u7ba1\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.accession-complete.success=''{0}'' \u7684\u5165\u7ba1\u5df2\u5b8c\u6210 +message.close.failure=\u65e0\u6cd5\u5173\u95ed ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.close.success=\u5df2\u6210\u529f\u5173\u95ed ''{0}'' +message.cutoff.failure=\u65e0\u6cd5\u4e2d\u65ad ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.cutoff.success=\u5df2\u6210\u529f\u4e2d\u65ad ''{0}'' +message.declare.failure=\u65e0\u6cd5\u5b8c\u6210 ''{0}'' \u8bb0\u5f55 +message.declare.failure.more=\u8bb0\u5f55\u5b58\u5728\u9700\u8981\u5b8c\u6210\u7684\u5143\u6570\u636e\u3002 +message.declare.success=''{0}'' \u5df2\u5b8c\u6210 +message.delete.failure=\u65e0\u6cd5\u5220\u9664 ''{0}''\u3002 \u5c1d\u8bd5\u54a8\u8be2\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.delete.success=\u5df2\u6210\u529f\u5220\u9664 ''{0}'' +message.destroy.failure=\u65e0\u6cd5\u9500\u6bc1 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.destroy.success=\u5df2\u6210\u529f\u9500\u6bc1 ''{0}'' +message.edit-disposition-as-of-date.title=\u7f16\u8f91\u4fdd\u7559\u65e5\u671f +message.edit-disposition-as-of-date.failure=\u65e0\u6cd5\u66f4\u65b0\u4fdd\u7559\u622a\u6b62\u65e5\u671f\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.edit-disposition-as-of-date.success=\u5df2\u6210\u529f\u66f4\u65b0 ''{0}'' \u7684\u4fdd\u7559\u622a\u6b62\u65e5\u671f +message.edit-hold.reason.label=\u539f\u56e0\uff1a +message.edit-hold.title=\u66f4\u65b0\u4fdd\u5b58\u8be6\u7ec6\u4fe1\u606f +message.edit-hold.failure=\u65e0\u6cd5\u66f4\u65b0\u4fdd\u5b58\u8be6\u7ec6\u4fe1\u606f\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.edit-hold.success=\u5df2\u6210\u529f\u66f4\u65b0\u4fdd\u5b58 +message.edit-review-as-of-date.title=\u7f16\u8f91\u5ba1\u67e5\u65e5\u671f +message.edit-review-as-of-date.failure=\u65e0\u6cd5\u66f4\u65b0\u5ba1\u67e5\u622a\u6b62\u65e5\u671f\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.edit-review-as-of-date.success=\u5df2\u6210\u529f\u66f4\u65b0 ''{0}'' \u7684\u5ba1\u67e5\u622a\u6b62\u65e5\u671f +message.open-folder.failure=\u65e0\u6cd5\u6253\u5f00\u8bb0\u5f55\u6587\u4ef6\u5939 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.open-folder.success=\u8bb0\u5f55\u6587\u4ef6\u5939 ''{0}'' \u5df2\u6253\u5f00 +message.review-all.failure=\u65e0\u6cd5\u5ba1\u67e5\u6587\u4ef6\u5939 ''{0}'' \u4e2d\u7684\u8bb0\u5f55\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.review-all.success=\u5df2\u7ecf\u5ba1\u67e5\u6587\u4ef6\u5939 ''{0}'' \u4e2d\u7684\u8bb0\u5f55 +message.reviewed.failure=\u65e0\u6cd5\u5ba1\u67e5 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.reviewed.success=\u5df2\u6210\u529f\u5ba1\u67e5 ''{0}'' +message.split-email.failure=\u65e0\u6cd5\u5c06\u9644\u4ef6\u4e0e ''{0}'' \u5206\u79bb +message.split-email.success=\u5df2\u6210\u529f\u5c06\u9644\u4ef6\u4e0e ''{0}'' \u5206\u79bb\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.transfer.failure=\u65e0\u6cd5\u79fb\u4ea4 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.transfer.success=\u5df2\u6210\u529f\u79fb\u4ea4 ''{0}'' +message.transfer-complete.failure=\u65e0\u6cd5\u5b8c\u6210 ''{0}'' \u7684\u79fb\u4ea4\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.transfer-complete.success=''{0}'' \u79fb\u4ea4\u5df2\u5b8c\u6210 +message.undeclare.failure=\u65e0\u6cd5\u91cd\u65b0\u6253\u5f00 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.undeclare.success=''{0}'' \u4e0d\u518d\u662f\u5b8c\u6574\u8bb0\u5f55 +message.undo-cutoff.failure=\u65e0\u6cd5\u64a4\u6d88 ''{0}'' \u7684\u4e2d\u65ad\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.undo-cutoff.success=\u64a4\u6d88 ''{0}'' \u4e0a\u7684\u4e2d\u65ad +message.create-disposition-schedule.failure=\u65e0\u6cd5\u521b\u5efa ''{0}'' \u7684\u4fdd\u7559\u8ba1\u5212\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.create-disposition-schedule.success=\u5df2\u521b\u5efa ''{0}'' \u7684\u4fdd\u7559\u8ba1\u5212 +message.create-record.success=\u6b64\u6587\u4ef6\u5df2\u521b\u5efa\u4e3a\u8bb0\u5f55\u5e76\u4e14\u53ef\u7528\u7684\u64cd\u4f5c\u6709\u9650 +message.create-record.failure=\u65e0\u6cd5\u58f0\u660e\u4e3a\u8bb0\u5f55\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.declare-version-as-record.success=\u6b64\u7248\u672c\u6587\u4ef6\u5df2\u58f0\u660e\u4e3a\u8bb0\u5f55 +message.declare-version-as-record.failure=\u65e0\u6cd5\u58f0\u660e\u7248\u672c\u4e3a\u8bb0\u5f55\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.hide-record.success=\u5df2\u6210\u529f\u9690\u85cf\u8bb0\u5f55 ''{0}'' +message.hide-record.failure=\u65e0\u6cd5\u9690\u85cf\u8bb0\u5f55 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.reject.reason=\u539f\u56e0\uff1a +message.reject.title=\u62d2\u7edd\u539f\u56e0 +message.reject.failure=\u65e0\u6cd5\u62d2\u7edd ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.reject.success=\u5df2\u62d2\u7edd ''{0}'' +message.file-destruction-report.failure=\u65e0\u6cd5\u751f\u6210\u9500\u6bc1\u62a5\u544a\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.file-destruction-report.success=\u5df2\u751f\u6210\u9500\u6bc1\u62a5\u544a +message.end-retention.failure=\u65e0\u6cd5\u7ed3\u675f\u4fdd\u7559\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.end-retention.success=\u4fdd\u7559\u5df2\u7ed3\u675f +message.file-success=\u5df2\u6210\u529f\u5c06\u62a5\u544a\u7acb\u5377\u4e3a ''{0}'' +message.file-failure=\u65e0\u6cd5\u5b8c\u6210\u7acb\u5377\u64cd\u4f5c\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.file-hold-report.failure=\u65e0\u6cd5\u751f\u6210\u4fdd\u5b58\u62a5\u544a\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.file-hold-report.success=\u5df2\u751f\u6210\u4fdd\u5b58\u62a5\u544a +message.delete-hold.failure=\u65e0\u6cd5\u5220\u9664\u4fdd\u5b58\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.delete-hold.success=\u4fdd\u5b58\u5df2\u88ab\u5220\u9664 +message.moveDmRecord.failure=\u65e0\u6cd5\u79fb\u52a8\u8bb0\u5f55 ''{0}''\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.moveDmRecord.success=\u5df2\u6210\u529f\u79fb\u52a8\u8bb0\u5f55 ''{0}'' +message.recordedVersionConfig.success=\u5df2\u6210\u529f\u8bbe\u7f6e\u81ea\u52a8\u58f0\u660e\u9009\u9879 +message.recordedVersionConfig.failure=\u65e0\u6cd5\u8bbe\u7f6e\u81ea\u52a8\u58f0\u660e\u9009\u9879\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.unlink.success=\u5df2\u6210\u529f\u53d6\u6d88\u8bb0\u5f55\u7684\u94fe\u63a5 +message.unlink.failure=\u65e0\u6cd5\u53d6\u6d88\u8bb0\u5f55\u7684\u94fe\u63a5\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 + +## File Plan Status Indicators +status.active-workflows=\u5c5e\u4e8e {0} \u4e2a\u6d3b\u52a8\u5de5\u4f5c\u6d41\u7a0b +status.rm-accession=\u5165\u7ba1\u6302\u8d77 +status.rm-accessioned=\u5df2\u5165\u7ba1 +status.rm-closed=\u5df2\u5173\u95ed +status.rm-cutoff=\u4e2d\u65ad +status.rm-cutoff-folder=\u4e2d\u65ad +status.rm-destroyed=\u5df2\u9500\u6bc1 +status.rm-frozen=\u4fdd\u5b58\u4e2d +status.rm-multi-parent=\u5728\u591a\u4e2a\u8bb0\u5f55\u6587\u4ef6\u5939\u4e2d\u94fe\u63a5 +status.rm-open=\u6253\u5f00 +status.rm-transfer=\u79fb\u4ea4\u6302\u8d77 +status.rm-transferred=\u5df2\u8f6c\u79fb +status.rm-vital-record=\u6838\u5fc3\u8bb0\u5f55 +status.rm-rejected-record=\u5df2\u62d2\u7edd +status.rm-disposition-schedule=\u8bb0\u5f55\u7c7b\u522b\u5df2\u5b9a\u4e49\u4fdd\u7559\u8ba1\u5212 +status.rm-digital-photograph-record=\u6570\u7801\u7167\u7247\u8bb0\u5f55 +status.rm-pdf-record=PDF \u8bb0\u5f55 +status.rm-scanned-record=\u626b\u63cf\u7684\u8bb0\u5f55 +status.rm-web-record=Web \u8bb0\u5f55 +status.rm-is-record=\u8bb0\u5f55 +status.rules=\u5df2\u7ecf\u4e3a\u6587\u4ef6\u5939\u5e94\u7528\u4e86\u89c4\u5219 +status.rm-version-record=\u7248\u672c\u8bb0\u5f55 +## Document Library Status Indicators +status.rm-recorded-version-history-all-revisions=\u5c06\u8bb0\u5f55\u6240\u6709\u4fee\u8ba2 +status.rm-recorded-version-history-major-revisions=\u53ea\u4f1a\u8bb0\u5f55\u4e3b\u8981\u4fee\u8ba2 + +# Exif +status.exif=EXIF \u5143\u6570\u636e\u53ef\u7528 +status.geographic=\u5b9a\u4f4d\u5143\u6570\u636e\u53ef\u7528 +status.dod5015-digital-photograph-record=\u6570\u7801\u7167\u7247\u8bb0\u5f55 +status.dod5015-pdf-record=PDF \u8bb0\u5f55 +status.dod5015-scanned-record=\u626b\u63cf\u7684\u8bb0\u5f55 +status.dod5015-web-record=Web \u8bb0\u5f55 + +# RMA model metadata fields +label.all=\u5168\u90e8 +label.keywords=\u5173\u952e\u5b57\uff08\u6587\u672c\u548c\u540d\u79f0\uff09 +label.identifier=ID +label.dateFiled=\u7acb\u5377\u65e5\u671f +label.publicationDate=\u53d1\u5e03\u65e5\u671f +label.originator=\u5efa\u7acb\u8005 +label.originatingOrganization=\u8d77\u59cb\u7ec4\u7ec7 +label.mediaType=\u5a92\u4f53\u7c7b\u578b +label.format=\u683c\u5f0f +label.dateReceived=\u63a5\u6536\u65e5\u671f +label.supplementalMarkingList=\u8865\u5145\u6807\u8bb0\u5217\u8868 +label.vitalRecord=\u6838\u5fc3\u8bb0\u5f55 +label.reviewDate=\u5ba1\u67e5\u65e5\u671f +label.address=\u6536\u4ef6\u4eba +label.otherAddress=\u5176\u4ed6\u6536\u4ef6\u4eba +label.unpublishedUpdates=\u672a\u53d1\u5e03\u7684\u66f4\u65b0 +label.publishInProgress=\u53d1\u5e03\u8fdb\u884c\u4e2d + +# IMAP model metadata fields +label.imap.threadIndex=IMAP \u7ebf\u7a0b\u7d22\u5f15 +label.imap.messageFrom=IMAP \u6d88\u606f\u53d1\u9001\u65b9 +label.imap.messageTo=IMAP \u6d88\u606f\u63a5\u6536\u65b9 +label.imap.messageCc=IMAP \u6d88\u606f\u6284\u9001 +label.imap.messageSubject=IMAP \u6d88\u606f\u4e3b\u9898 +label.imap.dateReceived=IMAP \u63a5\u6536\u65e5\u671f +label.imap.dateSent=IMAP \u53d1\u9001\u65e5\u671f + +# DOD model metadata fields +label.dod.scannedFormatVersion=\u56fe\u50cf\u683c\u5f0f\u548c\u7248\u672c +label.dod.resolutionX=\u56fe\u50cf\u5206\u8fa8\u7387 X +label.dod.resolutionY=\u56fe\u50cf\u5206\u8fa8\u7387 Y +label.dod.scannedBitDepth=\u626b\u63cf\u7684\u4f4d\u6df1 +label.dod.producingApplication=\u751f\u4ea7\u5e94\u7528\u7a0b\u5e8f +label.dod.producingApplicationVersion=\u751f\u4ea7\u5e94\u7528\u7a0b\u5e8f\u7248\u672c +label.dod.pdfVersion=PDF \u7248\u672c +label.dod.creatingApplication=\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f +label.dod.documentSecuritySettings=\u6587\u6863\u5b89\u5168\u8bbe\u7f6e +label.dod.caption=\u6807\u9898 +label.dod.photographer=\u6444\u5f71\u5e08 +label.dod.copyright=\u7248\u6743 +label.dod.bitDepth=\u4f4d\u6df1 +label.dod.imageSizeX=\u56fe\u50cf\u5c3a\u5bf8 X +label.dod.imageSizeY=\u56fe\u50cf\u5c3a\u5bf8 Y +label.dod.imageSource=\u56fe\u50cf\u6e90 +label.dod.compression=\u538b\u7f29 +label.dod.iccIcmProfile=ICC/ICM \u914d\u7f6e\u6587\u4ef6 +label.dod.exifInformation=EXIF \u4fe1\u606f +label.dod.webFileName=Web \u6587\u4ef6\u540d +label.dod.webPlatform=Web \u5e73\u53f0 +label.dod.webSiteName=\u7f51\u7ad9\u540d\u79f0 +label.dod.webSiteURL=\u7f51\u7ad9 URL +label.dod.captureMethod=\u6355\u6349\u65b9\u6cd5 +label.dod.captureDate=\u6355\u6349\u65e5\u671f +label.dod.contact=\u8054\u7cfb\u4eba +label.dod.contentManagementSystem=\u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf + +# RM Admin Console tools +tool.rm-define-roles.label=\u5b9a\u4e49\u89d2\u8272 +tool.rm-define-roles.description=\u521b\u5efa\u548c\u7f16\u8f91\u89d2\u8272 +tool.rm-custom-metadata.label=\u81ea\u5b9a\u4e49\u5143\u6570\u636e +tool.rm-custom-metadata.description=\u81ea\u5b9a\u4e49\u5143\u6570\u636e +tool.rm-list-of-values.label=\u503c\u5217\u8868 +tool.rm-list-of-values.description=\u503c\u5b9a\u4e49\u5217\u8868 +tool.rm-references.label=\u5173\u7cfb +tool.rm-references.description=\u5173\u7cfb\u5b9a\u4e49 +tool.rm-events.label=\u4e8b\u4ef6 +tool.rm-events.description=\u4e8b\u4ef6\u5b9a\u4e49 +tool.rm-audit.label=\u5ba1\u8ba1 +tool.rm-audit.description=\u8bb0\u5f55\u7ba1\u7406\u5ba1\u8ba1 +tool.rm-email-mappings.label=\u7535\u5b50\u90ae\u4ef6\u6620\u5c04 +tool.rm-email-mappings.description=\u7535\u5b50\u90ae\u4ef6\u6620\u5c04\u5b9a\u4e49 +tool.rm-user-rights.label=\u7528\u6237\u6743\u9650\u62a5\u544a +tool.rm-user-rights.description=\u7528\u6237\u6743\u9650\u62a5\u544a +tool.rm-users-and-groups.label=\u7528\u6237\u548c\u7ec4 +tool.rm-users-and-groups.description=\u7528\u6237\u548c\u7ec4 + +## Buttons +button.sort.ascending=\u5347\u5e8f\u6392\u5e8f +button.sort.descending=\u964d\u5e8f\u6392\u5e8f +button.folders.show=\u663e\u793a\u6587\u4ef6\u5939 +button.folders.hide=\u9690\u85cf\u6587\u4ef6\u5939 +button.view.simple=\u7b80\u5355\u89c6\u56fe +button.view.detailed=\u8be6\u7ec6\u89c6\u56fe + +## Drop-down Menus +menu.select=\u9009\u62e9 +menu.select.all=\u5168\u90e8 +menu.select.none=\u65e0 +menu.select.invert=\u53cd\u9009 +menu.select.folders=\u6587\u4ef6\u5939 +menu.select.documents=\u6587\u6863 +menu.select.records=\u8bb0\u5f55 +menu.select.undeclaredRecords=\u4e0d\u5b8c\u6574\u7684\u8bb0\u5f55 +menu.select.recordFolders=\u8bb0\u5f55\u6587\u4ef6\u5939 +menu.select.recordCategories=\u8bb0\u5f55\u7c7b\u522b + +## Metadata Fields +# Generic +details.created.on=\u521b\u5efa\u65f6\u95f4 +details.created.by=\u521b\u5efa\u8005 +details.modified.on=\u4fee\u6539\u65f6\u95f4 +details.modified.by=\u4fee\u6539\u8005 +details.by=\u4f5c\u8005 +details.size=\u5927\u5c0f +details.description=\u8bf4\u660e +details.description.none=\uff08\u65e0\uff09 +# Record Category +details.category.identifier=\u8bb0\u5f55\u7c7b\u522b ID +details.category.disposition-authority=\u4fdd\u7559\u6388\u6743 +details.category.disposition-instructions=\u4fdd\u7559\u8bf4\u660e +details.category.vital-record-indicator=\u6838\u5fc3\u8bb0\u5f55\u6307\u793a\u7b26 +# Record Folder +details.folder.identifier=\u8bb0\u5f55\u6587\u4ef6\u5939 ID +details.folder.vital-record-indicator=\u6838\u5fc3\u8bb0\u5f55\u6307\u793a\u7b26 +# Record +details.record.identifier=\u552f\u4e00\u8bb0\u5f55 ID +details.record.date-filed=\u7acb\u5377\u65e5\u671f +details.record.publication-date=\u53d1\u5e03\u65e5\u671f +details.record.originator=\u5efa\u7acb\u8005 +details.record.originating-organization=\u8d77\u59cb\u7ec4\u7ec7 +details.version.label=\u7248\u672c +# Incomplete Record +details.undeclared-record.info=\u4e0d\u5b8c\u6574\u7684\u8bb0\u5f55 +# Rejected Record +details.rejected-record.info=\u62d2\u7edd\u7684\u8bb0\u5f55 +# Transfer Container +details.transfer-container.title=\u79fb\u4ea4 {0} +details.transfer-container.is-accession=\u6ce8\uff1a\u79fb\u4ea4\u7c7b\u578b\u4e3a\u5165\u7ba1 +# Hold Container +details.hold.title=\u4fdd\u5b58\u521b\u5efa\u65f6\u95f4 {0} +details.hold.title.date-format=dd mmmm yyyy HH:MM:ss +details.hold.reason=\u4fdd\u5b58\u539f\u56e0 +details.hold.reason.none=\u4e0d\u53ef\u7528 +# Unfiled Records Container Child +details.unfiled-record-folder.identifier=\u6587\u4ef6\u5939 ID + +## File Upload (upload new version) +label.filter-description=\u7c7b\u578b\u4e0e {0} \u76f8\u540c + +## Empty List +no.items.title=\u6ca1\u6709\u9879\u76ee + +## Tips +tip.insitu-rename=\u91cd\u547d\u540d +tip.insitu-tag=\u6807\u8bb0 + +## Help panels, including Drag and Drop +show.folders=\u663e\u793a {0} \u4e2a\u5b50\u6587\u4ef6\u5939 + +## Create site dialog +description.recordsManagementSite=\u8bb0\u5f55\u7ba1\u7406\u7ad9\u70b9 +title.recordsManagementSite=\u8bb0\u5f55\u7ba1\u7406 +type.recordsManagementSite=\u8bb0\u5f55\u7ba1\u7406\u7ad9\u70b9 +compliance.standard=\u6807\u51c6 +compliance.dod5015=DoD 5015.2-STD +label.compliance=\u53ef\u5408\u89c4 + +## Console title +link.managementConsole=\u7ba1\u7406\u63a7\u5236\u53f0 + +## Rules +customise.reject.text=\u62d2\u7edd\u5177\u6709\u5907\u6ce8 ''{param.reason}'' \u7684\u8bb0\u5f55 +customise.requestInfo.text=\u4e3a\u4e00\u7cfb\u5217\u6307\u5b9a\u7684\u4eba\u5458\u521b\u5efa\u5de5\u4f5c\u6d41\u7a0b\u4efb\u52a1\u5e76\u8bf7\u6c42\u4ee5\u4e0b\u4fe1\u606f ''{param.requestedInfo}'' +customise.sendEmail.text=\u5c06\u4e3b\u9898\u4e3a ''{param.subject}'' \u7684\u7535\u5b50\u90ae\u4ef6\u53d1\u9001\u7ed9\u6307\u5b9a\u6536\u4ef6\u4eba + +## Records Management Admin Tools +header.rm-console.label=\u8bb0\u5f55\u7ba1\u7406... +header.rm-management.label=\u7ba1\u7406\u63a7\u5236\u53f0 +header.rm-management.description=\u7ba1\u7406\u63a7\u5236\u53f0 + +## Request Info Workflow +rm.wf.information-requested-for-record=\u4e3a\u8bb0\u5f55\u8bf7\u6c42\u7684\u4fe1\u606f +rm.wf.request-information-from=\u8bf7\u6c42\u4fe1\u606f\u81ea +rm.wf.requested-information=\u8bf7\u6c42\u7684\u4fe1\u606f +rm.wf.record=\u8bb0\u5f55 +rm.wf.selected-users-and-groups=\u7528\u6237\u548c\u7ec4 +rm.wf.give-details=\u63d0\u4f9b\u4fe1\u606f +rm.wf.message=\u6d88\u606f +rm.wf.details=\u8be6\u7ec6\u4fe1\u606f + +## Text length validation +message.max.text.length.validation=\u8f93\u5165\u957f\u5ea6\u4e0d\u8d85\u8fc7 {max} \u4e2a\u5b57\u7b26\u7684\u6587\u672c + +## Validation messages +Alfresco.forms.validation.rmVitalRecordPeriodMandatory.message=\u8bf7\u9009\u62e9\u5ba1\u67e5\u671f\u95f4 + +## Forms +form.control.object-picker.items-list.empty=\u65e0\u9879\u76ee +form.control.object-picker.items-list.loading=\u52a0\u8f7d\u4e2d... + +## File-to substitution suggestions +file-to.substitution.node.cm.title.label=\u6807\u9898 +file-to.substitution.node.cm.description.label=\u8bf4\u660e +file-to.substitution.node.cm.accessed.label=\u4e0a\u6b21\u8bbf\u95ee\u65f6\u95f4 +file-to.substitution.node.cm.created.label=\u521b\u5efa\u65f6\u95f4 +file-to.substitution.node.cm.creator.label=\u521b\u5efa\u8005 +file-to.substitution.node.cm.modified.label=\u6700\u540e\u4fee\u6539 +file-to.substitution.node.cm.modifier.label=\u4fee\u6539\u8005 +file-to.substitution.node.cm.name.label=\u540d\u79f0 +file-to.substitution.node.rma.origionalName.label=\u539f\u59cb\u8282\u70b9\u540d\u79f0 +file-to.substitution.node.rma.dateFiled.label=\u7acb\u5377\u65e5\u671f +file-to.substitution.node.rma.location.label=\u4f4d\u7f6e +file-to.substitution.node.rma.dbUniquenessId.label=\u552f\u4e00\u6570\u636e\u5e93 ID +file-to.substitution.node.rma.identifier.label=ID +file-to.substitution.node.sys.node-uuid.label=\u8282\u70b9 ID +file-to.substitution.node.sys.store-identifier.label=\u5e93 ID +file-to.substitution.node.sys.store-protocol.label=\u5e93\u534f\u8bae +file-to.substitution.date.day.short.label=\u7f29\u5199\u661f\u671f\u6570\uff08\u4f8b\u5982\u5468\u4e00\uff09 +file-to.substitution.date.day.label=\u661f\u671f\u6570\uff08\u4f8b\u5982\u5468\u4e00\uff09 +file-to.substitution.date.day.long.label=\u5168\u957f\u661f\u671f\u6570\uff08\u4f8b\u5982\u661f\u671f\u4e00\uff09 +file-to.substitution.date.day.number.label=\u5929\u6570\uff08\u4f8b\u5982 1\uff09 +file-to.substitution.date.day.year.label=\u4e00\u5e74\u4e2d\u7684\u7b2c\u51e0\u5929\uff08\u4f8b\u5982\u7b2c 216 \u5929\uff09 +file-to.substitution.date.day.month.label=\u4e00\u4e2a\u6708\u4e2d\u7684\u7b2c\u51e0\u5929\uff08\u4f8b\u5982\u7b2c 18 \u5929\uff09 +file-to.substitution.date.month.short.label=\u7f29\u5199\u6708\u4efd\uff08\u4f8b\u5982\u4e00\u6708\uff09 +file-to.substitution.date.month.label=\u6708\u4efd\uff08\u4f8b\u5982\u4e00\u6708\uff09 +file-to.substitution.date.month.long.label=\u5168\u957f\u6708\u4efd\uff08\u4f8b\u5982\u4e00\u6708\uff09 +file-to.substitution.date.month.number.label=\u6708\u4efd\u7f16\u53f7\uff08\u4f8b\u5982 01\uff09 +file-to.substitution.date.year.short.label=\u7f29\u5199\u5e74\u4efd\uff08\u4f8b\u5982 14\uff09 +file-to.substitution.date.year.label=\u5e74\uff08\u4f8b\u5982 14 \u5e74\uff09 +file-to.substitution.date.year.long.label=\u5168\u957f\u5e74\u4efd\uff08\u4f8b\u5982 2014 \u5e74\uff09 +file-to.substitution.date.year.week.label=\u5e74\u5ea6\u7b2c\u51e0\u5468\uff08\u4f8b\u5982\u7b2c 31 \u5468\uff09 + +## Banner icon messages +banner.rejected-record.info=\u8bf7\u53c2\u9605\u6709\u5173\u62d2\u7edd\u7684\u8bb0\u5f55\u7684\u4fe1\u606f +banner.rejected-record.close=\u5220\u9664\u62d2\u7edd\u7684\u8b66\u544a\u8bb0\u5f55 +banner.child-classification-in-progress.info=\u5b50\u9879\u5206\u7c7b\u8fdb\u884c\u4e2d +banner.child-classification-complete.info=\u5b50\u9879\u5206\u7c7b\u5b8c\u6210 +banner.child-classification-complete.close=\u5220\u9664\u6d88\u606f + +## Recordable Versions +label.destroyed-version=\u7248\u672c\u5df2\u9500\u6bc1 +label.recorded-version=\u8bb0\u5f55\u7684\u7248\u672c diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/module/org_alfresco_module_rm_share/file-mapping.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/module/org_alfresco_module_rm_share/file-mapping.properties new file mode 100644 index 0000000000..6acc63f61e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/module/org_alfresco_module_rm_share/file-mapping.properties @@ -0,0 +1,14 @@ +# Custom AMP to WAR location mappings + +# +# The following property can be used to include the standard set of mappings. +# The contents of this file will override any defaults. The default is +# 'true', i.e. the default mappings will be augmented or modified by values in +# this file. +# +include.default=true + +# +# Custom mappings. If 'include.default' is false, then this is the complete set. +# +/web=/ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/module/org_alfresco_module_rm_share/module.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/module/org_alfresco_module_rm_share/module.properties new file mode 100644 index 0000000000..a5dbc6d113 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/module/org_alfresco_module_rm_share/module.properties @@ -0,0 +1,10 @@ +# Alfresco Governance Services Share Module Properties +module.id=org_alfresco_module_rm_share + +# 28/02/2012 - Renamed +module.aliases=org_alfresco_module_dod5015_share + +module.title=AGS Share +module.description=Alfresco Governance Services Share Extension +module.version=${project.version} +module.repo.version.min=${amp.min.version} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/rm-form-config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/rm-form-config.xml new file mode 100644 index 0000000000..f0c33bec39 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/rm-form-config.xml @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + true|{label.record},false|{label.folder} + + + + + width: 95%;height: 5em + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + true + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + true + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + true + + + + + true + + + + +
+
+ + + +
+ + + + + + + + + + + + true + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + true + + + + + true + + + + +
+
+ + + +
+ + + + + + + + + + + + true + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + true + + + + + true + + + + +
+
+ + + +
+ + + + + + + + + + + + + + true + + + +
+
+
+ + + +
+ + + + + + + + + + 255 + + + + + true + + + + + + + +
+
+ + + +
+ + + + + + + + + 255 + + + + + true + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + +
+
+
+ +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/rm-share-config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/rm-share-config.xml new file mode 100644 index 0000000000..aa78804b00 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/rm-share-config.xml @@ -0,0 +1,1110 @@ + + + + + + + path.fileplan + slingshot/doclib/rm/treenode/site/{site}/{container}{path}?children={evaluateChildFoldersSite}&max={maximumFolderCountSite} + + + + + + + + + + + + + + + + + + + + + + + + evaluator.rm.indicator.accession + + + + evaluator.rm.indicator.accessioned + + + + evaluator.rm.indicator.closed + + + + evaluator.rm.indicator.cutoff + + + + evaluator.rm.indicator.cutoffFolder + + + + evaluator.rm.indicator.destroyed + + + + evaluator.rm.indicator.frozen + + + + evaluator.rm.indicator.multiParent + + + + evaluator.rm.indicator.open + + + + evaluator.rm.indicator.transfer + + + + evaluator.rm.indicator.transferred + + + + evaluator.rm.indicator.vitalRecord + + + + evaluator.rm.doclib.isDocLibRecord + + + + evaluator.rm.indicator.dispositionSchedule + + + + evaluator.rm.doclib.recordedVersionHistoryAllRevisions + + + + evaluator.rm.doclib.recordedVersionHistoryMajorRevisions + + + + evaluator.rm.doclib.versionRecord + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {downloadUrl} + evaluator.rm.common.isElectronicRecord + + + + onActionDelete + evaluator.rm.action.delete + + + + onActionCopyTo + evaluator.rm.action.copyRecord + + + + onActionCopyUnfiledRecordTo + evaluator.rm.action.copyUnfiledRecord + + + + onActionCopyTo + evaluator.rm.action.copyRecordFolder + + + + onActionCopyUnfiledRecordFolderTo + evaluator.rm.action.copyUnfiledRecordFolder + + + + onActionCopyTo + evaluator.rm.action.copyRecordCategory + + + + onActionMoveTo + evaluator.rm.action.moveRecord + + + + onActionMoveToUnfiled + evaluator.rm.action.moveUnfiledRecord + + + + onActionMoveTo + evaluator.rm.action.moveRecordFolder + + + + onActionMoveToUnfiled + evaluator.rm.action.moveUnfiledRecordFolder + + + + onActionMoveTo + evaluator.rm.action.moveRecordCategory + + + + + rm-record-category-details?nodeRef={node.nodeRef} + + + + + rm-record-folder-details?nodeRef={node.nodeRef} + + + + + edit-metadata?nodeRef={node.nodeRef} + evaluator.rm.action.edit-details + + + + + onActionLinkTo + evaluator.rm.action.link-to + + + + + onActionUnlinkFrom + evaluator.rm.action.unlink-from + evaluator.rm.action.unlink-from-checkparents + + + + + onActionFileTo + evaluator.rm.action.file-to + + + + + {managePermissionsUrl} + evaluator.rm.action.manage-permissions + + + + + folder-rules?nodeRef={node.nodeRef}&unfiled=false + evaluator.rm.action.manage-rules + + + + + folder-rules?nodeRef={node.nodeRef}&unfiled=true + evaluator.rm.action.manage-rules + + + + + onActionViewAuditLog + evaluator.rm.action.view-audit-log + + + + + onActionRecordsManagementRepoAction + closeRecordFolder + message.close + evaluator.rm.action.close-folder + + + + + onActionRecordsManagementRepoAction + openRecordFolder + message.open-folder + evaluator.rm.action.open-folder + + + + + onActionRecordsManagementRepoAction + reviewed + message.reviewed + evaluator.rm.action.reviewed + + + + + onActionRecordsManagementRepoAction + reviewed + message.review-all + evaluator.rm.action.review-all + + + + + onActionRecordsManagementRepoAction + cutoff + message.cutoff + evaluator.rm.action.cutoff + + + + + onActionDestroy + evaluator.rm.action.destroy + + + + + onActionTransfer + evaluator.rm.action.transfer + + + + + onActionAccession + evaluator.rm.action.accession + evaluator.rm.action.incompleteEvent + + + + + onActionRecordsManagementRepoAction + unCutoff + message.undo-cutoff + evaluator.rm.action.undo-cutoff + + + + + onActionEditDispositionAsOf + evaluator.rm.action.edit-disposition-as-of-date + + + + + {downloadUrl} + evaluator.rm.common.isElectronicRecord + + + + + onActionEditReviewAsOf + evaluator.rm.action.edit-review-as-of-date + + + + + onActionDeclare + evaluator.rm.action.declare + + + + + onActionRecordsManagementRepoAction + undeclareRecord + message.undeclare + evaluator.rm.action.undeclare + + + + + onActionAddRecordMetadata + evaluator.rm.action.add-record-metadata + + + + + onActionRecordsManagementRepoAction + splitEmail + message.split-email + evaluator.rm.action.split-email + + + + + {transfersZipUrl} + evaluator.rm.action.download-zip + + + + + onActionFileTransferReport + fileReport + fileReportSuccess + fileReportFailure + evaluator.rm.action.fileTransferReport + + + + + onActionRecordsManagementRepoAction + transferComplete + message.transfer-complete + evaluator.rm.action.transfer-complete + + + + onActionRecordsManagementRepoAction + accessionComplete + message.transfer-complete + evaluator.rm.action.accession-complete + + + + + onActionReject + evaluator.rm.action.reject + + + + + onActionRequestInfo + evaluator.rm.action.request-info + + + + + onActionFileDestructionReport + fileReport + fileReportSuccess + fileReportFailure + evaluator.rm.action.fileDestructionReport + + + + + onActionRecordsManagementRepoAction + retain + message.end-retention + evaluator.rm.action.endRetention + + + + + onActionAddToHold + + Write + + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + evaluator.action.addToHold + + + + + onActionRemoveFromHold + evaluator.action.removeFromHold + + + + + onActionFileHoldReport + fileReport + fileReportSuccess + fileReportFailure + evaluator.rm.action.fileHoldReport + + + + + onHoldDelete + evaluator.rm.action.deleteHold + + + + + edit-metadata?nodeRef={node.nodeRef} + evaluator.rm.action.editHold + + + + + + + onActionDeclareAndFileTo + create-record + onCreateRecordSuccess + message.create-record.success + message.create-record.failure + {path} + + Write + + + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + evaluator.doclib.action.isWorkingCopy + evaluator.rm.doclib.isRejectedRecord + evaluator.doclib.action.siteBased + evaluator.rm.doclib.action.rmSiteExists + evaluator.rm.doclib.isUserRecordContributor + + + + + onActionDeclareVersionAndFileTo + declare-as-version-record + onCreateRecordSuccess + message.declare-version-as-record.success + message.declare-version-as-record.failure + {path} + + Write + + + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + evaluator.doclib.action.isWorkingCopy + evaluator.rm.doclib.isRejectedRecord + evaluator.rm.doclib.action.hasVersionableAspect + evaluator.doclib.action.siteBased + evaluator.rm.doclib.action.rmSiteExists + evaluator.rm.doclib.isUserRecordContributor + + + + + onHideRecordAction + hide-record + onHideRecordSuccess + message.hide-record.success + message.hide-record.failure + evaluator.rm.action.hide + evaluator.rm.indicator.frozen + + + + + onActionDmMoveTo + move-dm-record + message.moveDmRecord.success + message.moveDmRecord.failure + {targetNodeRef} + evaluator.rm.action.moveDmRecord + evaluator.rm.indicator.frozen + + + + + onRecordedVersionConfig + recorded-version-config + + Write + + + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + evaluator.doclib.action.isWorkingCopy + evaluator.rm.doclib.isRejectedRecord + evaluator.rm.doclib.action.hasVersionableAspect + evaluator.doclib.action.siteBased + evaluator.rm.doclib.action.rmSiteExists + evaluator.rm.doclib.isUserRecordContributor + + + + + onAddRelationship + evaluator.rm.action.editReferences + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 5 + + 5 + + false + + + + {userdashboardpage} + Alfresco.module.Sites + /people-finder + /repository + + + /my-tasks#filter=workflows|active + /my-workflows#filter=workflows|active + /user/user-content + /user/user-sites + {userprofilepage} + + + + /console/rm-console/ + + + /console/admin-console/application + /console/admin-console/groups + /console/admin-console/replication-jobs + /console/admin-console/repository + /console/admin-console/trashcan + /console/admin-console/users + /console/admin-console/ + + + + + + + {userprofilepage} + {userprofilepage} + /user/change-password + {share-help} + /dologout + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/rm-share-workflow-form-config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/rm-share-workflow-form-config.xml new file mode 100644 index 0000000000..b68a7b5065 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/rm-share-workflow-form-config.xml @@ -0,0 +1,104 @@ + + + + + + + + + + +
+ + + + + + + + + + + + width: 96% + + + + + + width: 95%;height: 10em + + + +
+
+
+ + +
+ + + + + + + + + + + + + + width: 96% + + + + + width: 95%;height: 10em + + + + + width: 95%;height: 10em + + + + +
+
+
+ + +
+ + + + + + + + + + + + + + width: 96% + + + + + width: 95%;height: 10em + + + + + width: 95%;height: 10em + + + + +
+
+
+
\ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/extensions/alfresco-rm-extension.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/extensions/alfresco-rm-extension.xml new file mode 100644 index 0000000000..489a27111e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/extensions/alfresco-rm-extension.xml @@ -0,0 +1,761 @@ + + + + + + Alfresco :: Records Management Global Header Customizations + 10 + true + + + + + org.alfresco + org.alfresco.share.pages.rm-customizations + + + + org.alfresco.share.pages + org.alfresco.share.pages.rm-customizations.share.header + + share-header + + + + + + + + Alfresco :: Records Management Global (1) + 10 + true + + + + + .* + rm-site-dashboard + true + + + + + + + org.alfresco + org.alfresco.rm.customizations + + + + org.alfresco.share.pages + org.alfresco.rm.customizations.share.header + + share-header + + + + + + + + Alfresco :: Records Management Site (2) + 20 + true + + + + + .* + rm-site-dashboard + false + + + + + + + + + + + resolver.rm.doclib.doclistDataUrl + + + + + + resolver.rm.doclib.actionGroup + + + + + + + + + + + + template + filter + documentlibrary + + + + + false + + + + + + + + + template + categories + documentlibrary + + + + + false + + + + + + + + + template + tree + documentlibrary + + + + + + /rm/components/documentlibrary/tree + + + + + + + + /rm/components/documentlibrary/fileplan + + + + + + + + /rm/components/documentlibrary/savedsearch + + + + + + + + + template + tags + documentlibrary + + + + + false + + + + + + + + + template + actions-common + documentlibrary + + + + + /rm/components/documentlibrary/actions-common + + {nodeRef} + + + + + + + + + + template + documentlist_v2 + documentlibrary + + + + + /rm/components/documentlibrary/documentlist_v2 + + true + + + + + + + + + + template + file-upload + documentlibrary + + + + + /rm/components/upload/file-upload + + + + + + + + + template + flash-upload + documentlibrary + + + + + /rm/components/upload/flash-upload + + + + + + + + + template + html-upload + documentlibrary + + + + + /rm/components/upload/html-upload + + + + + + + + + template + dnd-upload + documentlibrary + + + + + /rm/components/upload/dnd-upload + + + + + + + + + + + template + node-header + document-details + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.fileplan + false + false + false + + + + + + + + + + template + comments + document-details + + + + + false + + + + + + + + + template + document-actions + document-details + + + + + + /rm/components/document-details/document-actions + + {nodeRef} + + + + + + + + template + actions-common + document-details + + + + + + /rm/components/documentlibrary/actions-common + + {nodeRef} + + + + + + + + + + template + document-tags + document-details + + + + + false + + + + + + + + + template + document-permissions + document-details + + + + + false + + + + + + + + + template + document-workflows + document-details + + + + + false + + + + + + + + + template + document-versions + document-details + + + + + false + + + + + + + + + template + document-publishing + document-details + + + + + false + + + + + + + + + + + + template + edit-metadata-mgr + edit-metadata + + + + + /rm/components/edit-metadata/edit-metadata-mgr + + + + + + + + + template + edit-metadata + edit-metadata + + + + + /components/form + + node + {nodeRef} + rm + edit + json + true + true + + + + + + + + + + + + + + + template + comments + folder-details + + + + + + false + + + + + + + + /components/folder-details/folder-metadata-header + + + + + + + + /components/form + + node + {nodeRef} + rm + view + + + + + + + + + + template + folder-metadata-header + folder-details + + + + + false + + + + + + + + + template + folder-metadata + folder-details + + + + + false + + + + + + + + + template + folder-info + folder-details + + + + + false + + + + + + + + + template + folder-actions + folder-details + + + + + false + + + + + + + + + + template + folder-links + folder-details + + + + + false + + + + + + + + + template + rule-edit + rule-edit + + + + + /rm/components/rules/rule-edit + + + + + + + + template + rule-details + folder-rules + + + + + /rm/components/rules/rule-details + + + + + + + + template + rules-none + folder-rules + + + + + /rm/components/rules/rules-none + + + + + + + + + template + document-sync + document-details + + + + + false + + + + + + + + + + + + + Alfresco :: Records Management Config (3) + 30 + true + + + org.alfresco + org.alfresco.config + + + + + + + template + web-preview + document-details + + + + + /relationships + + + + + + + + template + comments + document-details + + + + + /config/components/fileplan/events + + {nodeRef} + + + + + + + + + template + document-versions + document-details + + + + + /config/components/document-details/document-versions + + {nodeRef} + + + + + + + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-audit.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-audit.xml new file mode 100644 index 0000000000..e065dffc4c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-audit.xml @@ -0,0 +1,9 @@ + + + Audit Log + page.rmAudit.title + Audit Log page + page.rmAudit.description + rm-audit + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-console.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-console.xml new file mode 100644 index 0000000000..8086022a4c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-console.xml @@ -0,0 +1,24 @@ + + + Records Management Console + page.rmConsole.title + Records Management Administration Console + page.rmConsole.description + console + user + + + + + title + /rm/components/title/console + + + + + tools + /components/console/tools + + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-disposition-edit.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-disposition-edit.xml new file mode 100644 index 0000000000..606b9534b4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-disposition-edit.xml @@ -0,0 +1,9 @@ + + + Edit Disposition Schedule + page.rmDispositionEdit.title + Page for editing the disposition schedule + page.rmDispositionEdit.description + rm-disposition-edit + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-fileplan-report.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-fileplan-report.xml new file mode 100644 index 0000000000..4e9dbd5894 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-fileplan-report.xml @@ -0,0 +1,9 @@ + + + File Plan Report + page.fileplanReport.title + File Plan Report + page.fileplanReport.description + rm-fileplan-report + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-metadata-stub-folder-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-metadata-stub-folder-details.xml new file mode 100644 index 0000000000..2efabb7229 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-metadata-stub-folder-details.xml @@ -0,0 +1,9 @@ + + + Record Folder Details + page.recordFolderDetails.title + Record Folder Details Page for Records Management + page.recordFolderDetails.description + rm-record-folder-details + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-category-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-category-details.xml new file mode 100644 index 0000000000..1a37a837a9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-category-details.xml @@ -0,0 +1,9 @@ + + + Record Category Details + page.rmRecordCategoryDetails.title + Record Category Details page for Records Management + page.rmRecordCategoryDetails.description + rm-record-category-details + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-folder-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-folder-details.xml new file mode 100644 index 0000000000..2efabb7229 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-folder-details.xml @@ -0,0 +1,9 @@ + + + Record Folder Details + page.recordFolderDetails.title + Record Folder Details Page for Records Management + page.recordFolderDetails.description + rm-record-folder-details + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-series-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-series-details.xml new file mode 100644 index 0000000000..208d24ebac --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-record-series-details.xml @@ -0,0 +1,9 @@ + + + Record Series Details + page.rmRecordSeriesDetails.title + Record Series Details page for Records Management + page.rmRecordSeriesDetails.description + rm-record-series-details + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-reference-new.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-reference-new.xml new file mode 100644 index 0000000000..575c8d6d03 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-reference-new.xml @@ -0,0 +1,9 @@ + + + New Reference + page.rmNewReference.title + New Reference + page.rmNewReference.description + rm-new-reference + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-references.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-references.xml new file mode 100644 index 0000000000..ffba567186 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-references.xml @@ -0,0 +1,9 @@ + + + Records References + page.rmReferences.title + Records References page + page.rmReferences.description + rm-references + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-search.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-search.xml new file mode 100644 index 0000000000..66150b87b5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rm-search.xml @@ -0,0 +1,9 @@ + + + Records Search + page.rmSearch.title + Records Management Search page + page.rmSearch.description + rm-search + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rmsearch.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rmsearch.xml new file mode 100644 index 0000000000..e2342e7845 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/pages/rmsearch.xml @@ -0,0 +1,13 @@ + + + + Records Search + page.rmSearch.title + Records Management Search page + page.rmSearch.description + rm-search + user + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/presets/rm-presets.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/presets/rm-presets.xml new file mode 100644 index 0000000000..b36b1aec23 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/presets/rm-presets.xml @@ -0,0 +1,57 @@ + + + + + + + + + page + title + site/${siteid}/dashboard + /components/title/collaboration-title + + + + page + navigation + site/${siteid}/dashboard + /components/navigation/collaboration-navigation + + + + page + component-1-1 + site/${siteid}/dashboard + /components/dashlets/colleagues + + + page + component-2-1 + site/${siteid}/dashboard + /components/dashlets/docsummary + + + page + component-2-2 + site/${siteid}/dashboard + /components/dashlets/activityfeed + + + + + Records Management Site Dashboard + page.rmSiteDashboard.title + Records Management site's dashboard page + page.rmSiteDashboard.description + dashboard-2-columns-wide-right + user + + [{"pageId":"documentlibrary"}, {"pageId":"rm-search"}] + {"documentlibrary":{"titleId":"page.rmDocumentLibrary.title", "descriptionId":"page.rmDocumentLibrary.description", "type":"dod5015"}} + + + + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-audit.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-audit.xml new file mode 100644 index 0000000000..04e71d7f34 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-audit.xml @@ -0,0 +1,10 @@ + + + org/alfresco/rm/audit + + + rmaudit + /rm/components/audit/audit + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-disposition-edit.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-disposition-edit.xml new file mode 100644 index 0000000000..cd962c3996 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-disposition-edit.xml @@ -0,0 +1,21 @@ + + + org/alfresco/rm/disposition-edit + + documentlibrary + + + + title + /components/title/collaboration-title + + + navigation + /components/navigation/collaboration-navigation + + + disposition-edit + /rm/components/fileplan/disposition-edit + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-fileplan-report.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-fileplan-report.xml new file mode 100644 index 0000000000..3dfb7eb1e5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-fileplan-report.xml @@ -0,0 +1,13 @@ + + + org/alfresco/rm/fileplan-report + + documentlibrary + + + + fileplan-report + /rm/components/fileplan/report + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-new-reference.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-new-reference.xml new file mode 100644 index 0000000000..ae5bb36b00 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-new-reference.xml @@ -0,0 +1,22 @@ + + + org/alfresco/rm/new-reference + + documentlibrary + documentLibrary + + + + title + /components/title/collaboration-title + + + navigation + /components/navigation/collaboration-navigation + + + rm-reference-new + /rm/components/references/new-reference + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-category-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-category-details.xml new file mode 100644 index 0000000000..a1b1d8abc7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-category-details.xml @@ -0,0 +1,140 @@ + + + org/alfresco/rm/record-category-details + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + node-header + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + false + false + false + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + false + false + false + + + + + + + + + + disposition + /rm/components/fileplan/disposition + + + + + folder-actions + /rm/components/folder-details/folder-actions + + {nodeRef} + + + + actions-common + /rm/components/documentlibrary/actions-common + + {nodeRef} + + + + + + folder-links + /components/folder-details/folder-links + + {nodeRef} + + + + + + folder-metadata + /components/folder-details/folder-metadata + + {nodeRef} + rm + + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-folder-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-folder-details.xml new file mode 100644 index 0000000000..7ff315b20f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-folder-details.xml @@ -0,0 +1,140 @@ + + + org/alfresco/rm/record-folder-details + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + node-header + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + false + false + false + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + false + false + false + + + + + + + + + + events + /config/components/fileplan/events + + + + + folder-actions + /rm/components/folder-details/folder-actions + + {nodeRef} + + + + actions-common + /rm/components/documentlibrary/actions-common + + {nodeRef} + + + + + + folder-links + /components/folder-details/folder-links + + {nodeRef} + + + + + + folder-metadata + /components/folder-details/folder-metadata + + {nodeRef} + rm + + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-series-details.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-series-details.xml new file mode 100644 index 0000000000..c91a122a18 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-record-series-details.xml @@ -0,0 +1,48 @@ + + + org/alfresco/rm/record-series-details + + documentlibrary + documentLibrary + + + + title + /components/title/collaboration-title + + + navigation + /components/navigation/collaboration-navigation + + + actions-common + /rm/components/documentlibrary/actions-common + + + path + /rm/components/folder-details/path + + + folder-metadata-header + /components/folder-details/folder-metadata-header + + + folder-metadata + /components/form + + node + {nodeRef} + rm + view + + + + folder-actions + /rm/components/folder-details/folder-actions + + + folder-links + /components/folder-details/folder-links + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-references.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-references.xml new file mode 100644 index 0000000000..066cc37b34 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-references.xml @@ -0,0 +1,21 @@ + + + org/alfresco/rm/references + + documentlibrary + + + + title + /components/title/collaboration-title + + + navigation + /components/navigation/collaboration-navigation + + + references + /rm/components/references/manage-references + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-search.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-search.xml new file mode 100644 index 0000000000..63c2e51f2a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-data/template-instances/rm-search.xml @@ -0,0 +1,21 @@ + + + org/alfresco/rm/search + + rm-search + + + + title + /components/title/collaboration-title + + + navigation + /components/navigation/collaboration-navigation + + + search + /rm/components/search/search + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/components/form/controls/readOnlyTextarea.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/components/form/controls/readOnlyTextarea.ftl new file mode 100644 index 0000000000..5d118bdf13 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/components/form/controls/readOnlyTextarea.ftl @@ -0,0 +1,64 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#-- +Added the readonly attribute and the colors for the style. If you set the read-only parameter +in rm-share-workflow-form-config.xml for a field the control template becomes disabled which +means the user will not be able to copy any text form the textarea. +--> + +<#if field.control.params.rows??><#assign rows=field.control.params.rows><#else><#assign rows=3> +<#if field.control.params.columns??><#assign columns=field.control.params.columns><#else><#assign columns=60> + +
+ <#if form.mode == "view"> +
+ <#if field.mandatory && field.value == ""> + + + ${field.label?html}: + <#if field.control.params.activateLinks?? && field.control.params.activateLinks == "true"> + <#assign fieldValue=field.value?html?replace("((http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?\\^=%&:\\/~\\+#]*[\\w\\-\\@?\\^=%&\\/~\\+#])?)", "$1", "r")> + <#else> + <#assign fieldValue=field.value?html> + + <#if fieldValue == "">${msg("form.control.novalue")}<#else>${fieldValue} +
+ <#else> + + + <@formLib.renderFieldHelp field=field /> + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/comments/comments-list.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/comments/comments-list.get.js new file mode 100644 index 0000000000..a2d132b54c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/comments/comments-list.get.js @@ -0,0 +1,30 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +disableRecordDetailsComponent("nodeRef"); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-permissions.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-permissions.get.js new file mode 100644 index 0000000000..5d42c10d92 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-permissions.get.js @@ -0,0 +1,30 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +disableRecordDetailsComponent("displayName"); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-publishing.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-publishing.get.js new file mode 100644 index 0000000000..da4c9d88f6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-publishing.get.js @@ -0,0 +1,30 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +disableRecordDetailsComponent("document"); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.desc.xml new file mode 100644 index 0000000000..4e9a1dd1be --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.desc.xml @@ -0,0 +1,5 @@ + + Document References + Document References Component + /config/components/document-details/document-references + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.head.ftl new file mode 100644 index 0000000000..43e181af0c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/document-details/document-references.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/document-details/document-references.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.html.ftl new file mode 100644 index 0000000000..14bd77319d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.html.ftl @@ -0,0 +1,82 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if docName??> + <#include "/org/alfresco/include/alfresco-macros.lib.ftl" /> + <#assign el=args.htmlid?js_string/> + + +
+ +

+ ${msg("label.heading")} + <#if allowEditReferences> + +   + + +

+ +
+

${msg('label.references-to-this')}

+
+ <#if (references.toThisNode?size > 0)> + + <#else> +

${msg('message.no-messages')}

+ +

${msg('label.references-from-this')}

+
+ <#if (references.fromThisNode?size > 0)> + + <#else> +

${msg('message.no-messages')}

+ +
+ + + +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.js new file mode 100644 index 0000000000..31f6ad24a9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.js @@ -0,0 +1,184 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +var namesToGet = +{ + to:[], + from:[] +}; + +function getDocNames(nodeRefs) +{ + if (nodeRefs.length > 0) + { + var docNames = [], + connector = remote.connect("alfresco"); + result = connector.post("/api/forms/picker/items", jsonUtils.toJSONString( + { + "items": nodeRefs + }), "application/json"); + + model.result = result; + if (result.status == 200) + { + var data = eval('(' + result + ')'), + items = data.data.items; + + if (items.length > 0) + { + for (var i = 0, len = items.length; i < len; i++) + { + docNames.push(items[i].name); + } + return docNames; + } + } + return []; + } +} + +/* + * Note, "From" is customreferences from this node and *not* from other documents to this node. + * @returns {Object} + * { + * toThisNode : [] // array of references to this node + * fromThisNode : [] // array of references from this node + * } + */ +function getDocReferences(nodeRef) +{ + var result = remote.call("/api/node/" + nodeRef.replace(":/", "") + "/customreferences"); + + var marshallDocRefs = function marshallDocRefs(docrefs, type) + { + if (type == 'from') + { + labelField = 'source'; + } + else + { + labelField = 'target'; + } + for (var i = 0, len = docrefs.length; i < len; i++) + { + var ref = docrefs[i], + refField, + labelField; + + if (ref.referenceType == 'parentchild') + { + if (type == 'from') + { + refField = 'childRef'; + labelField = 'target'; + } + else + { + refField = 'parentRef'; + labelField = 'source'; + } + } + else + { + if (type == 'from') + { + refField = 'targetRef'; + } + else + { + refField = 'sourceRef'; + ref.targetRef = ref.sourceRef; + } + } + + // We have to get document names since this api call doesn't return them. + // Collect an array of noderefs and get the names in a later request. + namesToGet[type].push(ref[refField]); + if (ref.referenceType == 'parentchild') + { + ref.label = ref[labelField]; + ref.targetRef = ref[refField]; + } + docrefs[i]=ref; + } + + return docrefs; + }; + + if (result.status == 200) + { + var data = eval('(' + result + ')'); + return ( + { + toThisNode: marshallDocRefs(data.data.customReferencesTo, 'to'), + fromThisNode: marshallDocRefs(data.data.customReferencesFrom, 'from') + }); + } + + return ( + { + toThisNode: [], + fromThisNode: [] + }); +} + +function main() +{ + AlfrescoUtil.param("nodeRef"); + AlfrescoUtil.param("site", null); + AlfrescoUtil.param("container", "documentLibrary"); + + var nodeDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site, null); + if (nodeDetails && nodeDetails.item.node.isRmNode) + { + model.references = getDocReferences(model.nodeRef); + model.docNames = {}; + model.docNames.to = getDocNames(namesToGet.to); + model.docNames.from = getDocNames(namesToGet.from); + + //model.parentNodeRef = nodeDetails.item.location.container.nodeRef; + model.parentNodeRef = nodeDetails.item.node.rmNode.filePlan; + model.docName = nodeDetails.item.displayName; + model.allowEditReferences = false; + var actions = nodeDetails.item.node.rmNode.actions; + for (var i = 0; i < actions.length; i++) + { + if (actions[i] == "editReferences") + { + model.allowEditReferences = true; + } + } + } + else + { + model.docName = null; + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.properties new file mode 100644 index 0000000000..2ab2eed840 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get.properties @@ -0,0 +1,7 @@ +label.heading=References +label.manage-references=Manage +message.no-messages=No references exist +label.birelationship={0} from {1} +label.parentrelationshp={0} +label.references-from-this=To other records +label.references-to-this=From other records diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_de.properties new file mode 100644 index 0000000000..8f111c55d1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_de.properties @@ -0,0 +1,7 @@ +label.heading=Referenzen +label.manage-references=Verwalten +message.no-messages=Keine Referenzen vorhanden +label.birelationship={0} von {1} +label.parentrelationshp={0} +label.references-from-this=Zu anderen Records +label.references-to-this=Von anderen Records diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_es.properties new file mode 100644 index 0000000000..a8256e0139 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_es.properties @@ -0,0 +1,7 @@ +label.heading=Referencias +label.manage-references=Gestionar +message.no-messages=No existen referencias +label.birelationship={0} de {1} +label.parentrelationshp={0} +label.references-from-this=Para otros documentos de archivo +label.references-to-this=De otro documentos de archivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_fr.properties new file mode 100644 index 0000000000..2518f599a6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_fr.properties @@ -0,0 +1,7 @@ +label.heading=R\u00e9f\u00e9rences +label.manage-references=G\u00e9rer +message.no-messages=Il n'existe aucune r\u00e9f\u00e9rence +label.birelationship={0} depuis {1} +label.parentrelationshp={0} +label.references-from-this=Vers d'autres documents d'archives +label.references-to-this=Depuis d'autres documents d'archives diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_it.properties new file mode 100644 index 0000000000..bb11572636 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_it.properties @@ -0,0 +1,7 @@ +label.heading=Riferimenti +label.manage-references=Gestisci +message.no-messages=Riferimenti non presenti +label.birelationship={0} da {1} +label.parentrelationshp={0} +label.references-from-this=A altri record +label.references-to-this=Da altri record diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_ja.properties new file mode 100644 index 0000000000..ecca1fc3ac --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_ja.properties @@ -0,0 +1,7 @@ +label.heading=\u53c2\u7167 +label.manage-references=\u7ba1\u7406 +message.no-messages=\u53c2\u7167\u304c\u5b58\u5728\u3057\u307e\u305b\u3093 +label.birelationship={0}\u3092{1}\u304b\u3089 +label.parentrelationshp={0} +label.references-from-this=\u4ed6\u306e\u30ec\u30b3\u30fc\u30c9\u3078 +label.references-to-this=\u4ed6\u306e\u30ec\u30b3\u30fc\u30c9\u304b\u3089 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_nb.properties new file mode 100644 index 0000000000..74eb389624 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_nb.properties @@ -0,0 +1,7 @@ +label.heading=Referanser +label.manage-references=Administrer +message.no-messages=Ingen referanser finnes +label.birelationship={0} fra {1} +label.parentrelationshp={0} +label.references-from-this=Til andre oppf\u00f8ringer +label.references-to-this=Fra andre oppf\u00f8ringer diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_nl.properties new file mode 100644 index 0000000000..7eb4846617 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_nl.properties @@ -0,0 +1,7 @@ +label.heading=Verwijzingen +label.manage-references=Beheren +message.no-messages=Er bestaan geen verwijzingen +label.birelationship={0} van {1} +label.parentrelationshp={0} +label.references-from-this=Naar andere archiefstukken +label.references-to-this=Van andere archiefstukken diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_pt_BR.properties new file mode 100644 index 0000000000..92130f946c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_pt_BR.properties @@ -0,0 +1,7 @@ +label.heading=Refer\u00eancias +label.manage-references=Gerenciar +message.no-messages=N\u00e3o existem refer\u00eancias +label.birelationship={0} de {1} +label.parentrelationshp={0} +label.references-from-this=Para outros documentos arquiv\u00edsticos +label.references-to-this=De outros documentos arquiv\u00edsticos diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_ru.properties new file mode 100644 index 0000000000..04e4e1a8eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_ru.properties @@ -0,0 +1,7 @@ +label.heading=\u0421\u0441\u044b\u043b\u043a\u0438 +label.manage-references=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 +message.no-messages=\u041d\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a +label.birelationship={0} \u0438\u0437 {1} +label.parentrelationshp={0} +label.references-from-this=\u041a \u0434\u0440\u0443\u0433\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c +label.references-to-this=\u041e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_zh_CN.properties new file mode 100644 index 0000000000..21947d25eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-references.get_zh_CN.properties @@ -0,0 +1,7 @@ +label.heading=\u53c2\u8003 +label.manage-references=\u7ba1\u7406 +message.no-messages=\u4e0d\u5b58\u5728\u53c2\u8003 +label.birelationship=\u6765\u81ea {1} \u7684 {0} +label.parentrelationshp={0} +label.references-from-this=\u81f3\u5176\u4ed6\u8bb0\u5f55 +label.references-to-this=\u6765\u81ea\u5176\u4ed6\u8bb0\u5f55 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-tags.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-tags.get.js new file mode 100644 index 0000000000..4ae04f374b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-tags.get.js @@ -0,0 +1,30 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +disableRecordDetailsComponent("allowMetaDataUpdate"); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.desc.xml new file mode 100644 index 0000000000..bc0699c1ab --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.desc.xml @@ -0,0 +1,5 @@ + + document-details-versions + Document Details Versions Component + /config/components/document-details/document-versions + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.html.ftl new file mode 100644 index 0000000000..8ff03fa9a6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.html.ftl @@ -0,0 +1,83 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@standalone> + <@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/document-details/document-versions.css" group="document-details"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/document-details/document-versions.css" group="document-details"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/document-details/revert-version.css" group="document-details"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/document-details/historic-properties-viewer.css" group="document-details"/> + + + <@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/document-details/document-versions.js" group="document-details"/> + <@script type="text/javascript" src="${url.context}/res/rm/components/document-details/document-versions.js" group="document-details"/> + <@script type="text/javascript" src="${url.context}/res/modules/document-details/revert-version.js" group="document-details"/> + <@script type="text/javascript" src="${url.context}/res/modules/document-details/historic-properties-viewer.js" group="document-details"/> + + + <@markup id="widgets"> + <#if exist> + <@createWidgets group="document-details"/> + <@inlineScript group="document-details"> + YAHOO.util.Event.onContentReady("${args.htmlid?js_string}-heading", function() { + Alfresco.util.createTwister("${args.htmlid?js_string}-heading", "DocumentVersions"); + }); + + + + + <@markup id="html"> + <@uniqueIdDiv> + <#if exist> + <#if isWorkingCopy> + + <#else> + <#assign el=args.htmlid?html> +
+

+ ${msg("header.versionHistory")} + <#if allowNewVersionUpload> + +   + + +

+
+

${msg("section.latestVersion")}

+
+
+

${msg("section.olderVersion")}

+
+
+
+ + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.js new file mode 100644 index 0000000000..1750798ae2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.js @@ -0,0 +1,34 @@ + + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +if (!disableRecordDetailsComponent("allowNewVersionUpload")) +{ + model.widgets[0].name = "Alfresco.rm.DocumentVersions"; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.properties new file mode 100644 index 0000000000..5bb3e0a025 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_de.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_de.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_es.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_es.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_fr.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_fr.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_it.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_it.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_ja.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_ja.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_nb.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_nb.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_nl.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_nl.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_pt_BR.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_pt_BR.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_ru.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_ru.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_zh_CN.properties new file mode 100644 index 0000000000..62aea0bb44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-versions.get_zh_CN.properties @@ -0,0 +1 @@ +surf.include.resources=org/alfresco/components/document-details/document-versions.get diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-workflows.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-workflows.get.js new file mode 100644 index 0000000000..cf766d69c9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/document-details/document-workflows.get.js @@ -0,0 +1,30 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +disableRecordDetailsComponent("workflows"); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.desc.xml new file mode 100644 index 0000000000..e0cf8c7dd1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.desc.xml @@ -0,0 +1,5 @@ + + Disposition Schedule Events + Component for viewing and completing events in the disposition schedule + /config/components/fileplan/events + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.head.ftl new file mode 100644 index 0000000000..1b221e86c8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/fileplan/events.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/fileplan/events.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.html.ftl new file mode 100644 index 0000000000..fe67887688 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.html.ftl @@ -0,0 +1,141 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if nodeRef??> + + <#assign el=args.htmlid> + +
+

${msg("events.heading")}

+ + + + + + + +
+
${msg("title.completeEvent")}
+
+
+ +
+ +
+
+
+ + + +   + +
+
+ + + +
+
+
+ + +
+
+ +
+
+ +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.js new file mode 100644 index 0000000000..b7de7944de --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.js @@ -0,0 +1,59 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + AlfrescoUtil.param('nodeRef'); + AlfrescoUtil.param('site', null); + var nodeDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site); + if (nodeDetails && nodeDetails.item.node.isRmNode) + { + model.allowCompleteEvent = false; + model.allowUndoEvent = false; + var actions = nodeDetails.item.node.rmNode.actions; + for (var i = 0; i < actions.length; i++) + { + if (actions[i] == "completeEvent") + { + model.allowCompleteEvent = true; + } + if (actions[i] == "undoEvent") + { + model.allowUndoEvent = true; + } + } + } + else + { + // Signal to the template that the node doesn't exist and that events therefore shouldn't be displayed. + model.nodeRef = null; + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.properties new file mode 100644 index 0000000000..edba6dbd0e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get.properties @@ -0,0 +1,20 @@ +events.heading=Events +title.completedEvents=Completed +title.incompleteEvents=Incomplete +title.completeEvent=Complete Event +message.completingEvent=Completing event +message.completeEventFailure=We couldn't complete the event. Contact your I.T. Dept. +message.revokingEvent=Revoking event +message.revokeEventFailure=We couldn't revoke the event. Contact your I.T. Dept. +label.automatic=Automatic +label.manual=Manual +label.completedBy=Completed by +label.completedAt=Completed on +label.asOf=As of date +label.noDispositionSchedule=Retention life cycle doesn't exist. +label.noEventsInDispositionSchedule=There are no events for step ''{0}''. +label.completeDispositionSchedule=Retention life cycle complete. +label.dispositionScheduleAppliedToFolder=Retention schedule applied to parent record folder, with as of date: {0}. +label.linkToFoldersDispositionSchedule=View Parent Folder Events +label.loadFailure=We couldn't load events. Contact your I.T. Dept. +button.completeEvent=Complete Event diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_de.properties new file mode 100644 index 0000000000..efb369d031 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_de.properties @@ -0,0 +1,20 @@ +events.heading=Ereignisse +title.completedEvents=Abgeschlossen +title.incompleteEvents=Nicht abgeschlossen +title.completeEvent=Ereignis abschlie\u00dfen +message.completingEvent=Ereignis wird abgeschlossen. +message.completeEventFailure=Ereignis konnte nicht abgeschlossen werden. Kontakten Sie Ihre IT-Abteilung. +message.revokingEvent=Ereignis wird widerrufen. +message.revokeEventFailure=Ereignis konnte nicht widerrufen werden. Kontakten Sie Ihre IT-Abteilung. +label.automatic=Autom. +label.manual=Handbuch +label.completedBy=Abgeschlossen von +label.completedAt=Abgeschlossen am +label.asOf=Startdatum +label.noDispositionSchedule=Aufbewahrungszyklus nicht vorhanden. +label.noEventsInDispositionSchedule=F\u00fcr Schritt ''{0}'' sind keine Ereignisse vorhanden. +label.completeDispositionSchedule=Aufbewahrungszyklus abgeschlossen. +label.dispositionScheduleAppliedToFolder=Aufbewahrungsplan auf Elternordner des Record angewendet, mit Startdatum {0}. +label.linkToFoldersDispositionSchedule=Ereignisse vom \u00fcbergeordneten Ordner anzeigen +label.loadFailure=Ereignisse konnten nicht geladen werden. Kontakten Sie Ihre IT-Abteilung. +button.completeEvent=Ereignis abschlie\u00dfen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_es.properties new file mode 100644 index 0000000000..2926e5c146 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_es.properties @@ -0,0 +1,20 @@ +events.heading=Eventos +title.completedEvents=Completado +title.incompleteEvents=Incompleto +title.completeEvent=Completar evento +message.completingEvent=Completando evento +message.completeEventFailure=No se ha podido completar el evento. P\u00f3ngase en contacto con el dep. de TI. +message.revokingEvent=Revocando evento +message.revokeEventFailure=No se ha podido revocar el evento. P\u00f3ngase en contacto con el dep. de TI. +label.automatic=Autom\u00e1tico +label.manual=Manual +label.completedBy=Completado por +label.completedAt=Completado el +label.asOf=Fecha de inicio +label.noDispositionSchedule=No existe ciclo de vida de retenci\u00f3n. +label.noEventsInDispositionSchedule=No hay eventos para el paso ''{0}''. +label.completeDispositionSchedule=Ciclo de vida de retenci\u00f3n completo. +label.dispositionScheduleAppliedToFolder=Calendario de retenci\u00f3n aplicada a la carpeta de documentos de archivo primario, con fecha de inicio: {0}. +label.linkToFoldersDispositionSchedule=Ver eventos de carpeta primaria +label.loadFailure=No se han podido cargar eventos. P\u00f3ngase en contacto con el dep. de TI. +button.completeEvent=Completar evento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_fr.properties new file mode 100644 index 0000000000..62b86fc071 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_fr.properties @@ -0,0 +1,20 @@ +events.heading=Ev\u00e9nements +title.completedEvents=Termin\u00e9 +title.incompleteEvents=Incomplet +title.completeEvent=Compl\u00e9ter un \u00e9v\u00e9nement +message.completingEvent=Ev\u00e9nement en train d'\u00eatre compl\u00e9t\u00e9 +message.completeEventFailure=Impossible de compl\u00e9ter l'\u00e9v\u00e9nement. Contactez votre DSI. +message.revokingEvent=R\u00e9vocation d'\u00e9v\u00e9nement +message.revokeEventFailure=Impossible de r\u00e9voquer l'\u00e9v\u00e9nement. Contactez votre DSI. +label.automatic=Automatique +label.manual=Manuel +label.completedBy=Compl\u00e9t\u00e9 par +label.completedAt=Compl\u00e9t\u00e9 le +label.asOf=Date de d\u00e9but +label.noDispositionSchedule=Le cycle de vie de conservation n'existe pas. +label.noEventsInDispositionSchedule=Il n''y a aucun \u00e9v\u00e9nement pour l''\u00e9tape ''{0}''. +label.completeDispositionSchedule=Le cycle de vie de conservation est complet. +label.dispositionScheduleAppliedToFolder=La r\u00e8gle de conservation a \u00e9t\u00e9 appliqu\u00e9e au dossier parent d''archives, avec comme date de d\u00e9but\u00a0: {0}. +label.linkToFoldersDispositionSchedule=Voir les \u00e9v\u00e9nements du dossier parent +label.loadFailure=Impossible de charger les \u00e9v\u00e9nements. Contactez votre DSI. +button.completeEvent=Compl\u00e9ter un \u00e9v\u00e9nement diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_it.properties new file mode 100644 index 0000000000..acc1fad700 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_it.properties @@ -0,0 +1,20 @@ +events.heading=Eventi +title.completedEvents=Completato +title.incompleteEvents=Incompleto +title.completeEvent=Completa evento +message.completingEvent=Completamento evento... +message.completeEventFailure=Impossibile completare l'evento. Contattare il proprio reparto IT. +message.revokingEvent=Revoca evento +message.revokeEventFailure=Impossibile revocare l'evento. Contattare il proprio reparto IT. +label.automatic=Automatico +label.manual=Manuale +label.completedBy=Completato da +label.completedAt=Completato il +label.asOf=Data di inizio +label.noDispositionSchedule=Ciclo di vita di conservazione non presente. +label.noEventsInDispositionSchedule=Non sono presenti eventi per il passaggio ''{0}''. +label.completeDispositionSchedule=Ciclo di vita di conservazione completato. +label.dispositionScheduleAppliedToFolder=Programma di conservazione applicato alla cartella di record superiore, con data di inizio: {0}. +label.linkToFoldersDispositionSchedule=Visualizza eventi cartella superiore +label.loadFailure=Impossibile caricare eventi. Contattare il proprio reparto IT. +button.completeEvent=Completa evento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_ja.properties new file mode 100644 index 0000000000..f152b4b994 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_ja.properties @@ -0,0 +1,20 @@ +events.heading=\u30a4\u30d9\u30f3\u30c8 +title.completedEvents=\u5b8c\u4e86\u6e08\u307f +title.incompleteEvents=\u672a\u5b8c\u4e86 +title.completeEvent=\u30a4\u30d9\u30f3\u30c8\u306e\u5b8c\u4e86 +message.completingEvent=\u30a4\u30d9\u30f3\u30c8\u3092\u5b8c\u4e86\u3057\u3066\u3044\u307e\u3059 +message.completeEventFailure=\u30a4\u30d9\u30f3\u30c8\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.revokingEvent=\u30a4\u30d9\u30f3\u30c8\u3092\u53d6\u308a\u6d88\u3057\u3066\u3044\u307e\u3059 +message.revokeEventFailure=\u30a4\u30d9\u30f3\u30c8\u3092\u53d6\u308a\u6d88\u3059\u3053\u3068\u304c\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +label.automatic=\u81ea\u52d5 +label.manual=\u624b\u52d5 +label.completedBy=\u5b8c\u4e86\u8005 +label.completedAt=\u5b8c\u4e86\u65e5 +label.asOf=\u5b9f\u884c\u65e5 +label.noDispositionSchedule=\u4fdd\u7ba1\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +label.noEventsInDispositionSchedule=\u30b9\u30c6\u30c3\u30d7 ''{0}'' \u306b\u30a4\u30d9\u30f3\u30c8\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +label.completeDispositionSchedule=\u4fdd\u7ba1\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 +label.dispositionScheduleAppliedToFolder=\u5b9f\u884c\u65e5\u304c ''{0}'' \u306e\u89aa\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306b\u9069\u7528\u3055\u308c\u3066\u3044\u308b\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3002 +label.linkToFoldersDispositionSchedule=\u89aa\u30d5\u30a9\u30eb\u30c0\u30a4\u30d9\u30f3\u30c8\u306e\u8868\u793a +label.loadFailure=\u30a4\u30d9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +button.completeEvent=\u30a4\u30d9\u30f3\u30c8\u306e\u5b8c\u4e86 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_nb.properties new file mode 100644 index 0000000000..d751d36a62 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_nb.properties @@ -0,0 +1,20 @@ +events.heading=Hendelser +title.completedEvents=Fullf\u00f8rt +title.incompleteEvents=Ikke fullf\u00f8rt +title.completeEvent=Fullf\u00f8r hendelse +message.completingEvent=Fullf\u00f8re hendelse +message.completeEventFailure=Hendelsen kan ikke fullf\u00f8res. Kontakt din IT- avdeling. +message.revokingEvent=Tilbakekalle hendelse +message.revokeEventFailure=Hendelsen kan ikke tilbakekalles. Kontakt din IT- avdeling. +label.automatic=Automatisk +label.manual=Manuell +label.completedBy=Fullf\u00f8rt av +label.completedAt=Fullf\u00f8rt den +label.asOf=per datoen +label.noDispositionSchedule=Livssyklusen ved retensjon finnes ikke. +label.noEventsInDispositionSchedule=Det er ingen hendelser for trinn ''{0}''. +label.completeDispositionSchedule=Livssyklusen ved retensjon er fullf\u00f8rt. +label.dispositionScheduleAppliedToFolder=Retensjonsplanen brukt p\u00e5 den overordnede oppf\u00f8ringsmappen per datoen: {0}. +label.linkToFoldersDispositionSchedule=Vis hendelser i den overordnede mappen +label.loadFailure=Kunne ikke laste inn hendelser. Kontakt din IT- avdeling. +button.completeEvent=Fullf\u00f8r hendelse diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_nl.properties new file mode 100644 index 0000000000..aff900dd5b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_nl.properties @@ -0,0 +1,20 @@ +events.heading=Gebeurtenissen +title.completedEvents=Afgerond +title.incompleteEvents=Niet-afgerond +title.completeEvent=Gebeurtenis afronden +message.completingEvent=Gebeurtenis wordt afgerond +message.completeEventFailure=Kan de gebeurtenis niet afronden. Neem contact op met uw IT-afdeling +message.revokingEvent=Gebeurtenis intrekken +message.revokeEventFailure=Kan de gebeurtenis niet intrekken. Neem contact op met uw IT-afdeling +label.automatic=Automatisch +label.manual=Handmatig +label.completedBy=Afgerond door +label.completedAt=Afgerond op +label.asOf=Begindatum +label.noDispositionSchedule=Retentielevensloop bestaat niet. +label.noEventsInDispositionSchedule=Er zijn geen gebeurtenissen voor stap ''{0}''. +label.completeDispositionSchedule=Retentielevensloop afgerond. +label.dispositionScheduleAppliedToFolder=Retentieschema toegepast op bovenliggende archiefmap, met begindatum: {0}. +label.linkToFoldersDispositionSchedule=Gebeurtenissen voor bovenliggende map bekijken +label.loadFailure=Kan gebeurtenissen niet laden. Neem contact op met uw IT-afdeling +button.completeEvent=Gebeurtenis afronden diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_pt_BR.properties new file mode 100644 index 0000000000..1154605b16 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_pt_BR.properties @@ -0,0 +1,20 @@ +events.heading=Eventos +title.completedEvents=Conclu\u00eddo +title.incompleteEvents=Incompletos +title.completeEvent=Concluir evento +message.completingEvent=Concluindo evento +message.completeEventFailure=N\u00e3o foi poss\u00edvel concluir o evento. Entre em contato com o Dept. de TI. +message.revokingEvent=Revogando o evento +message.revokeEventFailure=N\u00e3o foi poss\u00edvel cancelar o evento. Entre em contato com o Dept. de TI. +label.automatic=Autom\u00e1tico +label.manual=Manual +label.completedBy=Conclu\u00eddo por +label.completedAt=Conclu\u00eddo em +label.asOf=Data de in\u00edcio +label.noDispositionSchedule=Ciclo de vida de reten\u00e7\u00e3o n\u00e3o existe. +label.noEventsInDispositionSchedule=N\u00e3o h\u00e1 eventos para a etapa ''{0}''. +label.completeDispositionSchedule=Ciclo de vida de reten\u00e7\u00e3o conclu\u00eddo. +label.dispositionScheduleAppliedToFolder=Programa\u00e7\u00e3o de reten\u00e7\u00e3o aplicada \u00e0 pasta de documento arquiv\u00edstico prim\u00e1ria, com a data de in\u00edcio: {0}. +label.linkToFoldersDispositionSchedule=Visualizar eventos da pasta prim\u00e1ria +label.loadFailure=N\u00e3o foi poss\u00edvel carregar eventos. Entre em contato com o Dept. de TI. +button.completeEvent=Concluir evento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_ru.properties new file mode 100644 index 0000000000..40956d6713 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_ru.properties @@ -0,0 +1,20 @@ +events.heading=\u0421\u043e\u0431\u044b\u0442\u0438\u044f +title.completedEvents=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +title.incompleteEvents=\u041d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +title.completeEvent=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +message.completingEvent=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f +message.completeEventFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.revokingEvent=\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f +message.revokeEventFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +label.automatic=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 +label.manual=\u0412\u0440\u0443\u0447\u043d\u0443\u044e +label.completedBy=\u041a\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +label.completedAt=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +label.asOf=\u041d\u0430 \u0434\u0430\u0442\u0443 +label.noDispositionSchedule=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. +label.noEventsInDispositionSchedule=\u041d\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u0448\u0430\u0433\u0430 ''{0}''. +label.completeDispositionSchedule=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d. +label.dispositionScheduleAppliedToFolder=\u0413\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043d\u0430 \u0434\u0430\u0442\u0443: {0}. +label.linkToFoldersDispositionSchedule=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +label.loadFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +button.completeEvent=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_zh_CN.properties new file mode 100644 index 0000000000..375dee86a8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/events.get_zh_CN.properties @@ -0,0 +1,20 @@ +events.heading=\u4e8b\u4ef6 +title.completedEvents=\u5df2\u5b8c\u6210 +title.incompleteEvents=\u672a\u5b8c\u6210 +title.completeEvent=\u5b8c\u6210\u4e8b\u4ef6 +message.completingEvent=\u6b63\u5728\u5b8c\u6210\u4e8b\u4ef6 +message.completeEventFailure=\u6211\u4eec\u65e0\u6cd5\u5b8c\u6210\u4e8b\u4ef6\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.revokingEvent=\u6b63\u5728\u64a4\u6d88\u4e8b\u4ef6 +message.revokeEventFailure=\u6211\u4eec\u65e0\u6cd5\u64a4\u9500\u4e8b\u4ef6\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +label.automatic=\u81ea\u52a8 +label.manual=\u624b\u52a8 +label.completedBy=\u5b8c\u6210\u8005 +label.completedAt=\u5b8c\u6210\u65f6\u95f4 +label.asOf=\u622a\u6b62\u65e5\u671f +label.noDispositionSchedule=\u4fdd\u7559\u751f\u547d\u5468\u671f\u4e0d\u5b58\u5728\u3002 +label.noEventsInDispositionSchedule=\u6b65\u9aa4 ''{0}'' \u4e0d\u5b58\u5728\u4e8b\u4ef6\u3002 +label.completeDispositionSchedule=\u4fdd\u7559\u751f\u547d\u5468\u671f\u5b8c\u6210\u3002 +label.dispositionScheduleAppliedToFolder=\u4fdd\u7559\u8ba1\u5212\u9002\u7528\u4e8e\u7236\u8bb0\u5f55\u6587\u4ef6\u5939\uff0c\u622a\u6b62\u65e5\u671f\u4e3a\uff1a{0}\u3002 +label.linkToFoldersDispositionSchedule=\u67e5\u770b\u7236\u6587\u4ef6\u5939\u4e8b\u4ef6 +label.loadFailure=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u4e8b\u4ef6\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +button.completeEvent=\u5b8c\u6210\u4e8b\u4ef6 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.desc.xml new file mode 100644 index 0000000000..d589fb0965 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.desc.xml @@ -0,0 +1,5 @@ + + RM Relationships Panel + Share + /relationships + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.html.ftl new file mode 100644 index 0000000000..2becc354c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.html.ftl @@ -0,0 +1,35 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@processJsonModel group="share"/> + +<@markup id="css" > + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/document-details/relationships.css" group="document-details"/> + + +<@markup id="html"> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.js new file mode 100644 index 0000000000..8b85bce1ba --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.js @@ -0,0 +1,121 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + AlfrescoUtil.param('nodeRef'); + AlfrescoUtil.param('site', null); + var nodeDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site); + + if (nodeDetails && nodeDetails.item && nodeDetails.item.node && nodeDetails.item.node.isRmNode) + { + var node = nodeDetails.item.node; + + // Toolbar label + var toolbarLabel = { + id: "RM_RELATIONSHIP_TOOLBAR_LABEL", + name: "alfresco/html/Label", + align: "left", + config: { + additionalCssClasses: "rm-relationship-toolbar-label", + label: msg.get("label.toolbar.relationships") + } + }; + + // Toolbar add relationship button + var actions = node.rmNode.actions, + showAddDeleteRelationshipButton = false; + for (var i = 0; i < actions.length; i++) + { + if (actions[i] === "editReferences") + { + showAddDeleteRelationshipButton = true; + } + } + + var addRelationshipButton = {}; + if (showAddDeleteRelationshipButton) + { + addRelationshipButton = { + name: "alfresco/buttons/AlfButton", + align: "right", + config: { + id: "RM_RELATIONSHIP_TOOLBAR_ADD_BUTTON", + additionalCssClasses: "rm-relationship-toolbar-add-button", + label: msg.get("label.button.new-relationship"), + publishTopic: "RM_RELATIONSHIP_ADD", + publishPayload: { + item: nodeDetails.item + } + } + }; + } + + // Toolbar + var toolbar = { + // "AlfToolbar" does not extend "ProcessWidgets" so it's not possible to use "additionalCssClasses" hence we use an id for the css selector + id: "RM_RELATIONSHIP_TOOLBAR", + name: "alfresco/documentlibrary/AlfToolbar", + config: { + widgets: [toolbarLabel, addRelationshipButton] + } + }; + + var table = { + name: "rm/lists/AlfRmRelationshipList", + config: { + noDataMessage: msg.get("label.list.no.data.message"), + loadDataPublishTopic: "RM_RELATIONSHIP_GET_ALL", + loadDataPublishPayload: { + nodeRef: node.nodeRef + }, + itemsProperty: "data.items", + showDeleteAction: showAddDeleteRelationshipButton, + ShowRelationship: true, + currentItem: node, + site: model.site + } + }; + + // Json model + model.jsonModel = { + rootNodeId: "rm-relationships-table", + services: [ + "alfresco/services/DocumentService", + "alfresco/services/NotificationService", + "alfresco/services/OptionsService", + "alfresco/services/DialogService", + "rm/services/RelationshipService" + ], + widgets: [toolbar, table] + }; + } +}; + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.properties new file mode 100644 index 0000000000..bb0cfd02dc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=There aren't any relationships defined yet +label.toolbar.relationships=Relationships +label.button.new-relationship=Add Relationship +label.delete-relationship=Delete Relationship \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_de.properties new file mode 100644 index 0000000000..a23277db98 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_de.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=Es wurden noch keine Beziehungen definiert. +label.toolbar.relationships=Beziehungen +label.button.new-relationship=Beziehung hinzuf\u00fcgen +label.delete-relationship=Beziehung l\u00f6schen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_es.properties new file mode 100644 index 0000000000..3d29fc4249 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_es.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=No se ha definido todav\u00eda ninguna relaci\u00f3n +label.toolbar.relationships=Relaciones +label.button.new-relationship=A\u00f1adir relaci\u00f3n +label.delete-relationship=Eliminar relaci\u00f3n diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_fr.properties new file mode 100644 index 0000000000..75cacd6ac2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_fr.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=Il n'existe actuellement aucune relation d\u00e9finie +label.toolbar.relationships=Relations +label.button.new-relationship=Ajouter une relation +label.delete-relationship=Supprimer la relation diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_it.properties new file mode 100644 index 0000000000..6c85c9a836 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_it.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=Non ci sono ancora relazioni definite +label.toolbar.relationships=Relazioni +label.button.new-relationship=Aggiungi relazione +label.delete-relationship=Elimina relazione diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_ja.properties new file mode 100644 index 0000000000..4937311c92 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_ja.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=\u307e\u3060\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b\u95a2\u4fc2\u304c\u3042\u308a\u307e\u305b\u3093 +label.toolbar.relationships=\u95a2\u4fc2 +label.button.new-relationship=\u95a2\u4fc2\u306e\u8ffd\u52a0 +label.delete-relationship=\u95a2\u4fc2\u306e\u524a\u9664 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_nb.properties new file mode 100644 index 0000000000..c7babc2aa4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_nb.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=Ingen definerte forhold enn\u00e5 +label.toolbar.relationships=Forhold +label.button.new-relationship=Legg til forhold +label.delete-relationship=Slett forhold diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_nl.properties new file mode 100644 index 0000000000..f3f6d6280f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_nl.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=Er zijn nog geen relaties gedefinieerd +label.toolbar.relationships=Relaties +label.button.new-relationship=Relatie toevoegen +label.delete-relationship=Relatie verwijderen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_pt_BR.properties new file mode 100644 index 0000000000..24734fdd48 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_pt_BR.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=Ainda n\u00e3o existem relacionamentos definidos +label.toolbar.relationships=Relacionamentos +label.button.new-relationship=Adicionar relacionamento +label.delete-relationship=Excluir relacionamento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_ru.properties new file mode 100644 index 0000000000..98358f84fd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_ru.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=\u041f\u043e\u043a\u0430 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e +label.toolbar.relationships=\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f +label.button.new-relationship=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +label.delete-relationship=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_zh_CN.properties new file mode 100644 index 0000000000..1cd4e94334 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/fileplan/relationships.get_zh_CN.properties @@ -0,0 +1,4 @@ +label.list.no.data.message=\u5c1a\u672a\u5b9a\u4e49\u4efb\u4f55\u5173\u7cfb +label.toolbar.relationships=\u5173\u7cfb +label.button.new-relationship=\u6dfb\u52a0\u5173\u7cfb +label.delete-relationship=\u5220\u9664\u5173\u7cfb diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/head/resources.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/head/resources.get.html.ftl new file mode 100644 index 0000000000..be32015fe2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/head/resources.get.html.ftl @@ -0,0 +1,44 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="rm-resources" target="resources" action="after" scope="global"> + <@script src="${url.context}/res/rm/js/alfresco-rm.js" group="template-common"/> + <@script src="${url.context}/res/rm/js/event-delegator.js" group="template-common"/> + <@script src="${url.context}/res/rm/modules/create-site.js" group="template-common"/> + <@script src="${url.context}/res/modules/documentlibrary/doclib-actions.js" group="template-common"/> + <@script src="${url.context}/res/modules/documentlibrary/site-folder.js" group="template-common"/> + <@script src="${url.context}/res/rm/modules/documentlibrary/copy-move-link-file-to.js" group="template-common"/> + <@script src="${url.context}/res/rm/modules/documentlibrary/hold/hold.js" group="template-common" /> + <@script src="${url.context}/res/rm/modules/documentlibrary/hold/add-to-hold.js" group="template-common" /> + + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/modules/documentlibrary/hold/hold.css" /> + + +<@markup id="rm-shareConstants" target="shareConstants" action="after"> + <@inlineScript group="template-common"> + Alfresco.constants.USER_FULLNAME = "${(user.fullName!"")}"; + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/node-details/node-header.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/node-details/node-header.get.js new file mode 100644 index 0000000000..8de80dfed7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/node-details/node-header.get.js @@ -0,0 +1,100 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +if (model.item != null && (model.site != (model.item.location.site != null ? model.item.location.site.name : null) && (model.node != null && model.node.isRmNode))) +{ + model.paths = getPaths(); + model.widgets = getWidgets(); +} + +function getPaths() +{ + // NOTE: the %2525 double encoding madness is to cope with the fail of urlrewrite filter to correctly cope with encoded paths + // see urlrewrite.xml + var item = model.item, + path = item.node.originatingLocationPath, + targetPage = model.rootPage, + targetPageLabel = model.rootLabelId, + paths = [], + folders, + pathUrl = "", + x, y; + + if (path) + { + paths.push( + { + href: targetPage + (path.length < 2 ? "?file=" + encodeURIComponent(item.fileName) : ""), + label: msg.get(targetPageLabel), + cssClass: "folder-link" + }); + + if (path.length > 1) + { + folders = path.substring(1, path.length).split("/"); + + for (x = 0, y = folders.length; x < y; x++) + { + pathUrl += "/" + folders[x]; + paths.push( + { + href: targetPage + (y - x < 2 ? "?file=" + encodeURIComponent(item.fileName) + "&path=" : "?path=") + encodeURIComponent(pathUrl).replace(/%25/g,"%2525"), + label: folders[x], + cssClass: "folder-link folder-open" + }); + } + } + } + else + { + paths.push( + { + href: targetPage, + label: msg.get(targetPageLabel), + cssClass: "folder-link" + }); + } + + return paths; +} + +function getWidgets() +{ + // NOTE: To stop being redirected in a collaboration site for a declared record we need to set the actualSiteId the same as the siteId. + // actualSiteId will only be used to check if a redirect is necessary so in this special case we can override the value. + var widgets = model.widgets; + var nodeHeaderOptions = widgets[0].options; + nodeHeaderOptions.actualSiteId = model.site; + // Disable favourite, likes and comments + nodeHeaderOptions.showFavourite = false; + nodeHeaderOptions.showLikes = false; + nodeHeaderOptions.showComments = false; + model.showComments = "false"; + return widgets; +} + +// Hide quickShare link for records +model.showQuickShare = (model.node != null ? (!model.node.isRmNode).toString() : "true"); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/recordDetailUtils.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/recordDetailUtils.js new file mode 100644 index 0000000000..e0338f0f8e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/recordDetailUtils.js @@ -0,0 +1,56 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/* + * FIXME: Performance issue!?! We should not call AlfrescoUtil.getNodeDetails every time. + * This can be done in the core and the value can be saved to the model. Which will save + * the import of a resource and another method call. + * + * See RM-3926 + */ + +function disableRecordDetailsComponent(value) +{ + var disabled = false; + var documentDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site); + if (documentDetails != null) + { + var item = documentDetails.item; + if (model.site != (item.location.site != null ? item.location.site.name : null) && item.node.isRmNode) + { + model[value] = null; + if (value == "allowNewVersionUpload") + { + model.exist = false; + } + disabled = true; + } + } + return disabled; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/workflow/workflow-list.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/workflow/workflow-list.get.js new file mode 100644 index 0000000000..a94e22e965 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/config/components/workflow/workflow-list.get.js @@ -0,0 +1,45 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +var hiddenWorkflowNames = model.hiddenWorkflowNames, + i, + length = hiddenWorkflowNames.length, + index; + +for (i = 0; i < length; i++) +{ + if (hiddenWorkflowNames[i] == "activiti$activitiRequestForInformation") + { + index = i; + break; + } +} + +if (index) +{ + hiddenWorkflowNames.splice(index, 1); + model.hiddenWorkflowNames = hiddenWorkflowNames; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.desc.xml new file mode 100644 index 0000000000..a104796056 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.desc.xml @@ -0,0 +1,5 @@ + + rmaudit + Audit component + /rm/components/audit/audit + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.head.ftl new file mode 100644 index 0000000000..98daaa26e6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.head.ftl @@ -0,0 +1,44 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/menu/assets/menu.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/datatable/assets/datatable.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-audit.css" /> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/people-finder/people-finder.css" /> +<@script type="text/javascript" src="${url.context}/res/components/people-finder/people-finder.js"> + +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-audit.js"> + + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/documentlibrary/site-folder.css" /> +<@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/site-folder.js"> +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/select-audit-record-location.js"> +<@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/doclib-actions.js"> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.html.ftl new file mode 100644 index 0000000000..c073e42259 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.html.ftl @@ -0,0 +1,115 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +
+
+
+ <#-- for a specified noderef --> + <#if (page.url.args.nodeName??)> +

${msg("label.title-for", page.url.args.nodeName)?html}

+ <#else> +

${msg("label.title")}

+ +
+
+ + +
+
+
+
+ <#-- only for full log (not noderef) --> + <#if (!page.url.args.nodeName??)> + ${msg('label.property')}: + ${msg('label.all')} + ${msg('label.user')}: + ${msg('label.all')} + ${msg('label.event')}: + ${msg('label.all')} + +
+ <#list auditStatus.entries as x> +
+
+ ${msg('label.timestamp')}: + ${x.timestampDate?datetime?string("EEE MMM dd HH:mm:ss zzz yyyy")} + ${msg('label.user')}: + ${x.fullName?html} + ${msg('label.event')}: + ${x.event?html} +
+
+ <#if (x.identifier?? && x.identifier != "")> + ${msg('label.identifier')}:${x.identifier?html} + + <#if (x.nodeType?? && x.nodeType != "")> + ${msg('label.type')}:${x.nodeType?html} + + <#if (x.displayPath?? && x.displayPath != "")> + ${msg('label.location')}:${x.displayPath?html} + +
+ <#if (x.changedValues?size >0)> + + + + + + + + + + <#list x.changedValues as v> + + + <#if (v.previous?? && v.previous != "")> + + <#else> + + + <#if (v.new?? && v.new != "")> + + <#else> + + + + + +
${msg('label.property')}${msg('label.previous-value')}${msg('label.new-value')}
${v.name?html}${v.previous?html}${msg('label.no-previous')?html}${v.new?html}${msg('label.no-next')?html}
+ +
+ +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.js new file mode 100644 index 0000000000..3d1ccf4d19 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get.js @@ -0,0 +1,152 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Converts an ISO8601-formatted date into a JavaScript native Date object + * + * Original code: + * dojo.date.stamp.fromISOString + * Copyright (c) 2005-2008, The Dojo Foundation + * All rights reserved. + * BSD license (http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE) + * + * @method Alfresco.thirdparty.fromISO8601 + * @param formattedString {string} ISO8601-formatted date string + * @return {Date|null} + * @static + */ +fromISO8601 = function() +{ + var fromISOString = function() + { + // summary: + // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard. + // + // description: + // Accepts a string formatted according to a profile of ISO8601 as defined by + // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed. + // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime) + // The following combinations are valid: + // + // * dates only + // | * yyyy + // | * yyyy-MM + // | * yyyy-MM-dd + // * times only, with an optional time zone appended + // | * THH:mm + // | * THH:mm:ss + // | * THH:mm:ss.SSS + // * and "datetimes" which could be any combination of the above + // + // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm + // Assumes the local time zone if not specified. Does not validate. Improperly formatted + // input may return null. Arguments which are out of bounds will be handled + // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st) + // Only years between 100 and 9999 are supported. + // + // formattedString: + // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00 + + var isoRegExp = /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/; + + return function(formattedString) + { + var match = isoRegExp.exec(formattedString); + var result = null; + + if (match) + { + match.shift(); + if (match[1]){match[1]--;} // Javascript Date months are 0-based + if (match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds + + result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); + + var offset = 0; + var zoneSign = match[7] && match[7].charAt(0); + if (zoneSign != 'Z') + { + offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0); + if (zoneSign != '-') + { + offset *= -1; + } + } + if (zoneSign) + { + offset -= result.getTimezoneOffset(); + } + if (offset) + { + result.setTime(result.getTime() + offset * 60000); + } + } + + return result; // Date or null + }; + }(); + + return fromISOString.apply(arguments.callee, arguments); +}; +function main() +{ + var nodeRef = null; + if (page.url.args.nodeRef) + { + model.nodeRef = page.url.args.nodeRef.replace(':/',''); + } + var nodeRefAuditURI = '/api/node/'+ model.nodeRef +'/rmauditlog'; + var auditURI = "/api/rma/admin/rmauditlog"; + model.uri = (model.nodeRef) ? nodeRefAuditURI : auditURI; + var result = remote.call((model.nodeRef) ? nodeRefAuditURI : auditURI); + if (result.status == 200) + { + var data = eval('(' + result + ')').data; + + data.startedDate=fromISO8601(data.started); + data.stoppedDate=fromISO8601(data.stopped); + model.data=data.toSource(); + for (var i=0,len=data.entries.length;i +label.no-next= + +node.root=File Plan +title.single=Select Audit Record Location diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_de.properties new file mode 100644 index 0000000000..e143e759dd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_de.properties @@ -0,0 +1,58 @@ +label.title=Audit-Protokoll +label.title-for=Audit-Protokoll f\u00fcr {0} +label.from=Von +label.to=Bis + +label.yes=Ja +label.no=Nein +label.button-cancel=Abbrechen +button.view-record=Record anzeigen + +label.clear-log-title=Audit-Protokoll l\u00f6schen +label.clear-log-confirmation=Das Audit-Protokoll kann sp\u00e4ter wieder nach Belieben ausgef\u00fchrt werden. +label.clearing-log-message=Audit-Protokoll wird gel\u00f6scht... +label.cleared-log-message=Audit-Protokoll gel\u00f6scht. +message.clear-log-fail =Beim L\u00f6schen des Audit-Protokolls ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.stopped-at=Audit-Protokoll gestoppt um {0} +label.stop-log-title=Audit-Protokoll stoppen +label.stop-log-confirmation=Es werden keine weiteren Ereignisse angezeigt. Das Audit-Protokoll kann sp\u00e4ter wieder nach Belieben gestartet werden. +label.stopping-log-message=Audit-Protokoll wird gestoppt... +label.stopped-log-message=Audit-Protokoll gestoppt. +message.stop-log-fail =Beim Stoppen des Audit-Protokolls ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.started-at=Audit-Protokoll gestartet um {0} +label.start-log-title=Audit-Protokoll starten +label.start-log-confirmation=Das Audit-Protokoll wird an der Stelle wieder gestartet, an der es zuvor gestoppt wurde. +label.starting-log-message=Audit-Protokoll wird gestartet... +label.started-log-message=Audit-Protokoll gestartet. +message.start-log-fail =Beim Starten des Audit-Protokolls ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.button-clear=L\u00f6schen +label.button-stop=Stoppen +label.button-start=Starten +label.button-view-log=Vollst\u00e4ndiges Protokoll anzeigen +label.button-specify=Festlegen +label.button-export=Exportieren +label.button-file-record=Als Record ablegen + +label.filed-log-message=Audit-Protokoll wurde als Record abgelegt. +message.file-log-fail=Beim Ablegen des Audit-Protokolls als Record ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +label.file-record=Record ablegen + + +label.timestamp=Zeitstempel +label.property=Eigenschaft +label.previous-value=Vorheriger Wert +label.new-value=Neuer Wert +label.name=Name +label.user=Benutzer +label.role=Rolle +label.event=Ereignis +label.all=Alle +label.identifier=Identifikator +label.no-previous= +label.no-next= + +node.root=Ablageplan +title.single=Ort f\u00fcr Audit-Record ausw\u00e4hlen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_es.properties new file mode 100755 index 0000000000..6853aebc5f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_es.properties @@ -0,0 +1,58 @@ +label.title=Registro de auditor\u00edas +label.title-for=Registro de auditor\u00edas para {0} +label.from=De +label.to=Para + +label.yes=S\u00ed +label.no=No +label.button-cancel=Cancelar +button.view-record=Ver documento de archivo + +label.clear-log-title=Borrar registro de auditor\u00edas +label.clear-log-confirmation=Siempre podr\u00e1 volver a ejecuta el registro de auditor\u00edas otra vez. +label.clearing-log-message=Borrando registro de auditor\u00edas... +label.cleared-log-message=Registro de auditor\u00edas borrado. +message.clear-log-fail =Se ha producido un problema al borrar el registro de auditor\u00edas. Trate de actualizar el navegador. + +label.stopped-at=Registro de auditor\u00edas detenido en {0} +label.stop-log-title=Detener registro de auditor\u00edas +label.stop-log-confirmation=No se mostrar\u00e1n m\u00e1s eventos. Siempre podr\u00e1 volver a iniciar el registro de auditor\u00edas otra vez. +label.stopping-log-message=Deteniendo registro de auditor\u00edas... +label.stopped-log-message=Registro de auditor\u00edas detenido. +message.stop-log-fail =Se ha producido un problema al detener el registro de auditor\u00edas. Trate de actualizar el navegador. + +label.started-at=Registro de auditor\u00edas iniciado en {0} +label.start-log-title=Iniciar registro de auditor\u00edas +label.start-log-confirmation=El registro de auditor\u00edas se iniciar\u00e1 otra vez desde donde se detuvo la vez anterior. +label.starting-log-message=Iniciando registro de auditor\u00edas... +label.started-log-message=Registro de auditor\u00edas iniciado. +message.start-log-fail =Se ha producido un problema al iniciar el registro de auditor\u00edas. Trate de actualizar el navegador. + +label.button-clear=Borrar registro completo +label.button-stop=Detener +label.button-start=Iniciar +label.button-view-log=Ver registro reciente +label.button-specify=Especificar +label.button-export=Exportar +label.button-file-record=Archivar como documento de archivo + +label.filed-log-message=El registro de auditor\u00edas se ha archivado como documento de archivo. +message.file-log-fail=Se ha producido un problema al archivar el registro de auditor\u00edas como documento de archivo. Trate de actualizar el navegador. +label.file-record=Archivar documento de archivo + + +label.timestamp=Marca de tiempo +label.property=Propiedades +label.previous-value=Valor anterior +label.new-value=Nuevo valor +label.name=Nombre +label.user=Usuario +label.role=Funci\u00f3n +label.event=Evento +label.all=Todos +label.identifier=Identificador +label.no-previous= +label.no-next= + +node.root=Cuadro de clasificaci\u00f3n +title.single=Seleccione la ubicaci\u00f3n del documento de archivo de auditor\u00edas diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_fr.properties new file mode 100644 index 0000000000..376f5b7221 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_fr.properties @@ -0,0 +1,58 @@ +label.title=Journal d'audit +label.title-for=Journal d''audit pour {0} +label.from=De +label.to=Jusqu'au + +label.yes=Oui +label.no=Non +label.button-cancel=Annuler +button.view-record=Afficher le document d'archives + +label.clear-log-title=Effacer le journal d'audit +label.clear-log-confirmation=Vous pourrez toujours lancer le journal d'audit. +label.clearing-log-message=Effacement du journal d'audit... +label.cleared-log-message=Journal d'audit effac\u00e9. +message.clear-log-fail =Un probl\u00e8me est survenu pendant l'effacement du journal d'audit. Essayez d'actualiser votre navigateur. + +label.stopped-at=Journal d''audit arr\u00eat\u00e9 \u00e0 {0} +label.stop-log-title=Arr\u00eater le journal d''audit \u00e0 {0} +label.stop-log-confirmation=Plus aucun \u00e9v\u00e9nement ne sera affich\u00e9. Vous pourrez toujours d\u00e9marrer le journal d'audit. +label.stopping-log-message=Arr\u00eat du journal d'audit... +label.stopped-log-message=Journal d'audit arr\u00eat\u00e9. +message.stop-log-fail =Un probl\u00e8me est survenu pendant l'arr\u00eat du journal d'audit. Essayez d'actualiser votre navigateur. + +label.started-at=Journal d''audit d\u00e9marr\u00e9 \u00e0 {0} +label.start-log-title=D\u00e9marrer le journal d'audit +label.start-log-confirmation=Le journal d'audit red\u00e9marrera l\u00e0 o\u00f9 il a \u00e9t\u00e9 arr\u00eat\u00e9 pr\u00e9c\u00e9demment. +label.starting-log-message=D\u00e9marrage du journal d'audit... +label.started-log-message=Journal d'audit d\u00e9marr\u00e9. +message.start-log-fail =Un probl\u00e8me est survenu pendant le d\u00e9marrage du journal d'audit. Essayez d'actualiser votre navigateur. + +label.button-clear=Effacer le journal complet +label.button-stop=Arr\u00eater +label.button-start=D\u00e9marrer +label.button-view-log=Afficher le journal r\u00e9cent +label.button-specify=D\u00e9finir +label.button-export=Exporter +label.button-file-record=Archiver comme document d'archives + +label.filed-log-message=Le journal d'audit a \u00e9t\u00e9 archiv\u00e9 comme document d'archives. +message.file-log-fail=Un probl\u00e8me est survenu pendant l'archivage du journal d'audit comme document d'archives. Essayez d'actualiser votre navigateur. +label.file-record=Classer le document d'archives + + +label.timestamp=Horodatage +label.property=Propri\u00e9t\u00e9 +label.previous-value=Valeur pr\u00e9c\u00e9dente +label.new-value=Nouvelle valeur +label.name=Nom +label.user=Utilisateur +label.role=R\u00f4le +label.event=Ev\u00e9nement +label.all=Tous +label.identifier=Identifiant +label.no-previous= +label.no-next= + +node.root=Plan de classement +title.single=S\u00e9lectionner l'emplacement du document d'archives d'audit diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_it.properties new file mode 100644 index 0000000000..4972db60dd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_it.properties @@ -0,0 +1,58 @@ +label.title=Log di audit +label.title-for=Log di audit per {0} +label.from=Da +label.to=Il + +label.yes=S\u00ec +label.no=No +label.button-cancel=Annulla +button.view-record=Visualizza record + +label.clear-log-title=Cancella log di audit +label.clear-log-confirmation=\u00c8 sempre possibile eseguire il log di audit nuovamente. +label.clearing-log-message=Cancellazione log di audit... +label.cleared-log-message=Log di audit cancellato. +message.clear-log-fail =Si \u00e8 verificato un problema durante la cancellazione del log di audit. Provare ad aggiornare il browser. + +label.stopped-at=Log di audit interrotto alle {0} +label.stop-log-title=Interrompi log di audit +label.stop-log-confirmation=Nessun altro evento verr\u00e0 visualizzato. \u00c8 sempre possibile riavviare il log di audit. +label.stopping-log-message=Interruzione log di audit... +label.stopped-log-message=Log di audit interrotto. +message.stop-log-fail =Si \u00e8 verificato un problema durante l'interruzione del log di audit. Provare ad aggiornare il browser. + +label.started-at=Log di audit avviato alle {0} +label.start-log-title=Avvia log di audit +label.start-log-confirmation=Il log di audit verr\u00e0 riavviato dal punto in cui era stato interrotto precedentemente. +label.starting-log-message=Avvio del log di audit... +label.started-log-message=Log di audit avviato. +message.start-log-fail =Si \u00e8 verificato un problema durante l'avvio del log di audit. Provare ad aggiornare il browser. + +label.button-clear=Cancella intero log +label.button-stop=Interrompi +label.button-start=Avvia +label.button-view-log=Visualizza log recente +label.button-specify=Specifica +label.button-export=Esporta +label.button-file-record=Archivia come record + +label.filed-log-message=Il log di audit \u00e8 stato archiviato come record. +message.file-log-fail=Si \u00e8 verificato un problema durante l'archiviazione del log di audit. Provare ad aggiornare il browser. +label.file-record=Archivia record + + +label.timestamp=Timestamp +label.property=Propriet\u00e0 +label.previous-value=Valore precedente +label.new-value=Nuovo valore +label.name=Nome +label.user=Utente +label.role=Ruolo +label.event=Evento +label.all=Tutti +label.identifier=Identificativo +label.no-previous= +label.no-next= + +node.root=Piano di fascicolazione +title.single=Seleziona la posizione del record di audit diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_ja.properties new file mode 100644 index 0000000000..8471358652 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_ja.properties @@ -0,0 +1,58 @@ +label.title=\u76e3\u67fb\u30ed\u30b0 +label.title-for={0} \u306e\u76e3\u67fb\u30ed\u30b0 +label.from=\u958b\u59cb\u65e5 +label.to=\u7d42\u4e86\u65e5 + +label.yes=\u306f\u3044 +label.no=\u3044\u3044\u3048 +label.button-cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +button.view-record=\u30ec\u30b3\u30fc\u30c9\u306e\u8868\u793a + +label.clear-log-title=\u76e3\u67fb\u30ed\u30b0\u306e\u6d88\u53bb +label.clear-log-confirmation=\u76e3\u67fb\u30ed\u30b0\u306f\u3044\u3064\u3067\u3082\u518d\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002 +label.clearing-log-message=\u76e3\u67fb\u30ed\u30b0\u3092\u6d88\u53bb\u3057\u3066\u3044\u307e\u3059... +label.cleared-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u6d88\u53bb\u3055\u308c\u307e\u3057\u305f\u3002 +message.clear-log-fail =\u76e3\u67fb\u30ed\u30b0\u306e\u6d88\u53bb\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.stopped-at=\u76e3\u67fb\u30ed\u30b0\u304c {0} \u306b\u505c\u6b62\u3055\u308c\u307e\u3057\u305f +label.stop-log-title=\u76e3\u67fb\u30ed\u30b0\u306e\u505c\u6b62 +label.stop-log-confirmation=\u30a4\u30d9\u30f3\u30c8\u304c\u8868\u793a\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 \u76e3\u67fb\u30ed\u30b0\u306f\u3044\u3064\u3067\u3082\u518d\u958b\u3067\u304d\u307e\u3059\u3002 +label.stopping-log-message=\u76e3\u67fb\u30ed\u30b0\u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059... +label.stopped-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u505c\u6b62\u3055\u308c\u307e\u3057\u305f\u3002 +message.stop-log-fail =\u76e3\u67fb\u30ed\u30b0\u306e\u505c\u6b62\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.started-at=\u76e3\u67fb\u30ed\u30b0\u304c {0} \u306b\u958b\u59cb\u3055\u308c\u307e\u3057\u305f +label.start-log-title=\u76e3\u67fb\u30ed\u30b0\u306e\u958b\u59cb +label.start-log-confirmation=\u76e3\u67fb\u30ed\u30b0\u306f\u3001\u524d\u56de\u505c\u6b62\u3057\u305f\u3068\u3053\u308d\u304b\u3089\u518d\u958b\u3055\u308c\u307e\u3059\u3002 +label.starting-log-message=\u76e3\u67fb\u30ed\u30b0\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059... +label.started-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u958b\u59cb\u3055\u308c\u307e\u3057\u305f\u3002 +message.start-log-fail =\u76e3\u67fb\u30ed\u30b0\u306e\u958b\u59cb\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.button-clear=\u5168\u30ed\u30b0\u3092\u6d88\u53bb +label.button-stop=\u505c\u6b62 +label.button-start=\u958b\u59cb +label.button-view-log=\u6700\u8fd1\u4f7f\u3063\u305f\u30ed\u30b0\u3092\u8868\u793a +label.button-specify=\u6307\u5b9a +label.button-export=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +label.button-file-record=\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1 + +label.filed-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u307e\u3057\u305f\u3002 +message.file-log-fail=\u76e3\u67fb\u30ed\u30b0\u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1\u3057\u3066\u3044\u308b\u6700\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +label.file-record=\u30ec\u30b3\u30fc\u30c9\u306e\u6574\u7406\u4fdd\u7ba1 + + +label.timestamp=\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7 +label.property=\u30d7\u30ed\u30d1\u30c6\u30a3 +label.previous-value=\u4ee5\u524d\u306e\u5024 +label.new-value=\u65b0\u3057\u3044\u5024 +label.name=\u540d\u524d +label.user=\u30e6\u30fc\u30b6\u30fc +label.role=\u5f79\u5272 +label.event=\u30a4\u30d9\u30f3\u30c8 +label.all=\u3059\u3079\u3066 +label.identifier=ID +label.no-previous=<\u306a\u3057> +label.no-next=<\u306a\u3057> + +node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +title.single=\u76e3\u67fb\u30ec\u30b3\u30fc\u30c9\u306e\u5834\u6240\u306e\u9078\u629e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_nb.properties new file mode 100644 index 0000000000..c977833a60 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_nb.properties @@ -0,0 +1,58 @@ +label.title=Revisjonslogg +label.title-for=Revisjonslogg til {0} +label.from=Fra +label.to=Til + +label.yes=Ja +label.no=Nei +label.button-cancel=Avbryt +button.view-record=Vis oppf\u00f8ring + +label.clear-log-title=Slett revisjonslogg +label.clear-log-confirmation=Revisjonen kan alltid kj\u00f8res p\u00e5 nytt. +label.clearing-log-message=Sletter revisjonsloggen... +label.cleared-log-message=Revisjonslogg slettet. +message.clear-log-fail =Det oppsto et problem med \u00e5 slette revisjonsloggen. Pr\u00f8v \u00e5 oppdatere nettleseren. + +label.stopped-at=Revisjonslogg stoppet p\u00e5 {0} +label.stop-log-title=Stopp revisjonslogg +label.stop-log-confirmation=Ingen flere hendelser vises. Revisjonen kan alltid startes p\u00e5 nytt. +label.stopping-log-message=Stopper revisjonsloggen... +label.stopped-log-message=Revisjonslogg stoppet. +message.stop-log-fail =Det oppsto et problem med \u00e5 stoppe revisjonsloggen. Pr\u00f8v \u00e5 oppdatere nettleseren. + +label.started-at=Revisjonslogg startet p\u00e5 {0} +label.start-log-title=Start revisjonslogg +label.start-log-confirmation=Revisjonsloggen fortsetter der den stoppet forrige gang. +label.starting-log-message=Starter revisjonslogg... +label.started-log-message=Revisjonslogg startet. +message.start-log-fail =Det oppsto et problem med \u00e5 starte revisjonsloggen. Pr\u00f8v \u00e5 oppdatere nettleseren. + +label.button-clear=Slett full logg +label.button-stop=Stopp +label.button-start=Start +label.button-view-log=Vis logg +label.button-specify=Spesifiser +label.button-export=Eksporter +label.button-file-record=Registrer som oppf\u00f8ring + +label.filed-log-message=Revisjonslogg er registrert som en oppf\u00f8ring. +message.file-log-fail=Det oppsto et problem med \u00e5 registrere revisjonsloggen som oppf\u00f8ring. Pr\u00f8v \u00e5 oppdatere nettleseren. +label.file-record=Arkivere oppf\u00f8ring + + +label.timestamp=Klokkeslettstempel +label.property=Egenskap +label.previous-value=Forrige verdi +label.new-value=Ny verdi +label.name=Navn +label.user=Bruker +label.role=Rolle +label.event=Hendelse +label.all=Alle +label.identifier=Identifikator +label.no-previous= +label.no-next= + +node.root=Filplan +title.single=Velg plassering av revisjonsoppf\u00f8ringen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_nl.properties new file mode 100755 index 0000000000..90cc77a02f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_nl.properties @@ -0,0 +1,58 @@ +label.title=Auditlog +label.title-for=Auditlog voor {0} +label.from=Van +label.to=Tot + +label.yes=Ja +label.no=Nee +label.button-cancel=Annuleren +button.view-record=Archiefstuk bekijken + +label.clear-log-title=Auditlog wissen +label.clear-log-confirmation=U kunt het auditlog altijd opnieuw uitvoeren. +label.clearing-log-message=Auditlog wissen... +label.cleared-log-message=Auditlog gewist. +message.clear-log-fail =Er is een probleem opgetreden bij het wissen van het auditlog. Vernieuw de browser. + +label.stopped-at=Auditlog gestopt om {0} +label.stop-log-title=Auditlog stoppen +label.stop-log-confirmation=Er worden geen gebeurtenissen meer weergegeven. U kunt het auditlog altijd opnieuw starten. +label.stopping-log-message=Auditlog stoppen... +label.stopped-log-message=Auditlog gestopt. +message.stop-log-fail =Er is een probleem opgetreden bij het stoppen van het auditlog. Vernieuw de browser. + +label.started-at=Auditlog gestart om {0} +label.start-log-title=Auditlog starten +label.start-log-confirmation=Het auditlog wordt weer gestart vanaf het punt waar het werd gestopt. +label.starting-log-message=Auditlog starten... +label.started-log-message=Auditlog gestart. +message.start-log-fail =Er is een probleem opgetreden bij het starten van het auditlog. Vernieuw de browser. + +label.button-clear=Vol log wissen +label.button-stop=Stoppen +label.button-start=Starten +label.button-view-log=Recent log bekijken +label.button-specify=Specificeren +label.button-export=Exporteren +label.button-file-record=Archiveren als archiefstuk + +label.filed-log-message=Auditlog is gearchiveerd als een archiefstuk. +message.file-log-fail=Er is een probleem opgetreden bij het archiveren van het auditlog als een archiefstuk. Vernieuw de browser. +label.file-record=Archiefstuk archiveren + + +label.timestamp=Tijdstempel +label.property=Eigenschap +label.previous-value=Vorige waarde +label.new-value=Nieuwe waarde +label.name=Naam +label.user=Gebruiker +label.role=Rol +label.event=Gebeurtenis +label.all=Alles +label.identifier=Identificatie +label.no-previous= +label.no-next= + +node.root=Ordeningsplan +title.single=Locatie voor audit-archiefstuk selecteren diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_pt_BR.properties new file mode 100644 index 0000000000..f80eb3da0f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_pt_BR.properties @@ -0,0 +1,58 @@ +label.title=Log de auditoria +label.title-for=Log de auditoria de {0} +label.from=De +label.to=Para + +label.yes=Sim +label.no=N\u00e3o +label.button-cancel=Cancelar +button.view-record=Visualizar documento arquiv\u00edstico + +label.clear-log-title=Limpar log de auditoria +label.clear-log-confirmation=Voc\u00ea sempre pode executar o log de auditoria novamente. +label.clearing-log-message=Limpando log de auditoria... +label.cleared-log-message=Log de auditoria limpo. +message.clear-log-fail =Encontramos um problema ao limpar o log de auditoria. Tente atualizar seu navegador. + +label.stopped-at=Log de auditoria interrompido em {0} +label.stop-log-title=Interromper log de auditoria +label.stop-log-confirmation=Nenhum outro evento ser\u00e1 exibido. Voc\u00ea sempre pode iniciar o log de auditoria novamente. +label.stopping-log-message=Interrompendo log de auditoria... +label.stopped-log-message=Log de auditoria interrompido. +message.stop-log-fail =Encontramos um problema ao interromper o log de auditoria. Tente atualizar seu navegador. + +label.started-at=Log de auditoria iniciado em {0} +label.start-log-title=Iniciar log de auditoria +label.start-log-confirmation=O log de auditoria ser\u00e1 iniciado novamente de onde parou. +label.starting-log-message=Iniciando log de auditoria... +label.started-log-message=Log de auditoria iniciado. +message.start-log-fail =Encontramos um problema ao iniciar o log de auditoria. Tente atualizar seu navegador. + +label.button-clear=Limpar log completo +label.button-stop=Parar +label.button-start=Iniciar +label.button-view-log=Visualizar log recente +label.button-specify=Especificar +label.button-export=Exportar +label.button-file-record=Arquivar como documento arquiv\u00edstico + +label.filed-log-message=O log de auditoria foi arquivado como um documento arquiv\u00edstico. +message.file-log-fail=Encontramos um problema ao arquivar o log de auditoria como documento arquiv\u00edstico. Tente atualizar seu navegador. +label.file-record=Arquivar documento arquiv\u00edstico + + +label.timestamp=Carimbo de data/hora +label.property=Propriedade +label.previous-value=Valor anterior +label.new-value=Novo valor +label.name=Nome +label.user=Usu\u00e1rio +label.role=Fun\u00e7\u00e3o +label.event=Evento +label.all=Tudo +label.identifier=Identificador +label.no-previous= +label.no-next= + +node.root=Plano de arquivamento +title.single=Selecionar local do documento arquiv\u00edstico de auditoria diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_ru.properties new file mode 100644 index 0000000000..35347205b0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_ru.properties @@ -0,0 +1,58 @@ +label.title=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.title-for=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0434\u043b\u044f {0} +label.from=\u041e\u0442\u043a\u0443\u0434\u0430 +label.to=\u041a\u0443\u0434\u0430 + +label.yes=\u0414\u0430 +label.no=\u041d\u0435\u0442 +label.button-cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +button.view-record=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 + +label.clear-log-title=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.clear-log-confirmation=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +label.clearing-log-message=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430... +label.cleared-log-message=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u043e\u0447\u0438\u0449\u0435\u043d. +message.clear-log-fail =\u041f\u0440\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +label.stopped-at=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 {0} +label.stop-log-title=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.stop-log-confirmation=\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +label.stopping-log-message=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430... +label.stopped-log-message=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +message.stop-log-fail =\u041f\u0440\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +label.started-at=\u041d\u0430\u0447\u0430\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 {0} +label.start-log-title=\u041d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.start-log-confirmation=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430. +label.starting-log-message=\u0417\u0430\u043f\u0443\u0441\u043a \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430... +label.started-log-message=\u041d\u0430\u0447\u0430\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +message.start-log-fail =\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +label.button-clear=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b +label.button-stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c +label.button-start=\u041d\u0430\u0447\u0430\u0442\u044c +label.button-view-log=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430 +label.button-specify=\u0423\u043a\u0430\u0437\u0430\u0442\u044c +label.button-export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 +label.button-file-record=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 + +label.filed-log-message=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. +message.file-log-fail=\u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +label.file-record=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b + + +label.timestamp=\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 +label.property=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e +label.previous-value=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 +label.new-value=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 +label.name=\u0418\u043c\u044f +label.user=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +label.role=\u0420\u043e\u043b\u044c +label.event=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 +label.all=\u0412\u0441\u0435 +label.identifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +label.no-previous=<\u043d\u0435\u0442> +label.no-next=<\u043d\u0435\u0442> + +node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +title.single=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0443\u0434\u0438\u0442\u0430 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_zh_CN.properties new file mode 100644 index 0000000000..d1c6f604f0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/audit/audit.get_zh_CN.properties @@ -0,0 +1,58 @@ +label.title=\u5ba1\u8ba1\u65e5\u5fd7 +label.title-for={0} \u7684\u5ba1\u8ba1\u65e5\u5fd7 +label.from=\u4ece +label.to=\u81f3 + +label.yes=\u662f +label.no=\u5426 +label.button-cancel=\u53d6\u6d88 +button.view-record=\u67e5\u770b\u8bb0\u5f55 + +label.clear-log-title=\u6e05\u9664\u5ba1\u8ba1\u65e5\u5fd7 +label.clear-log-confirmation=\u60a8\u53ef\u4ee5\u968f\u65f6\u91cd\u65b0\u8fd0\u884c\u5ba1\u8ba1\u65e5\u5fd7\u3002 +label.clearing-log-message=\u6b63\u5728\u6e05\u9664\u5ba1\u8ba1\u65e5\u5fd7... +label.cleared-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u6e05\u9664\u3002 +message.clear-log-fail =\u6e05\u9664\u5ba1\u8ba1\u65e5\u5fd7\u65f6\u9047\u5230\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +label.stopped-at=\u5ba1\u8ba1\u65e5\u5fd7\u5728 {0} \u505c\u6b62 +label.stop-log-title=\u505c\u6b62\u5ba1\u8ba1\u65e5\u5fd7 +label.stop-log-confirmation=\u4e0d\u4f1a\u663e\u793a\u66f4\u591a\u7684\u4e8b\u4ef6\u3002 \u60a8\u53ef\u4ee5\u968f\u65f6\u91cd\u65b0\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7\u3002 +label.stopping-log-message=\u6b63\u5728\u505c\u6b62\u5ba1\u8ba1\u65e5\u5fd7... +label.stopped-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u505c\u6b62\u3002 +message.stop-log-fail =\u6211\u4eec\u5728\u505c\u6b62\u5ba1\u8ba1\u65e5\u5fd7\u65f6\u9047\u5230\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +label.started-at=\u5ba1\u8ba1\u65e5\u5fd7\u5728 {0} \u542f\u52a8 +label.start-log-title=\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7 +label.start-log-confirmation=\u5ba1\u8ba1\u65e5\u5fd7\u5c06\u4ece\u5176\u5148\u524d\u505c\u6b62\u7684\u5730\u65b9\u91cd\u65b0\u5f00\u59cb\u3002 +label.starting-log-message=\u6b63\u5728\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7... +label.started-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u542f\u52a8\u3002 +message.start-log-fail =\u6211\u4eec\u5728\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7\u65f6\u9047\u5230\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +label.button-clear=\u6e05\u9664\u5b8c\u6574\u65e5\u5fd7 +label.button-stop=\u505c\u6b62 +label.button-start=\u542f\u52a8 +label.button-view-log=\u67e5\u770b\u6700\u8fd1\u7684\u65e5\u5fd7 +label.button-specify=\u6307\u5b9a +label.button-export=\u5bfc\u51fa +label.button-file-record=\u7acb\u5377\u4e3a\u8bb0\u5f55 + +label.filed-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u88ab\u7acb\u5377\u4e3a\u8bb0\u5f55\u3002 +message.file-log-fail=\u6211\u4eec\u5728\u5c06\u5ba1\u8ba1\u65e5\u5fd7\u586b\u5145\u4e3a\u8bb0\u5f55\u65f6\u9047\u5230\u9519\u8bef\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +label.file-record=\u7acb\u5377\u8bb0\u5f55 + + +label.timestamp=\u65f6\u95f4\u6233 +label.property=\u5c5e\u6027 +label.previous-value=\u4e4b\u524d\u7684\u503c +label.new-value=\u65b0\u503c +label.name=\u540d\u79f0 +label.user=\u7528\u6237 +label.role=\u89d2\u8272 +label.event=\u4e8b\u4ef6 +label.all=\u5168\u90e8 +label.identifier=\u6807\u8bc6\u7b26 +label.no-previous=<\u65e0> +label.no-next=<\u65e0> + +node.root=\u5f52\u7c7b\u65b9\u6848 +title.single=\u9009\u62e9\u5ba1\u8ba1\u8bb0\u5f55\u4f4d\u7f6e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.desc.xml new file mode 100644 index 0000000000..fb2a724428 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Audit + Administration Console - Audit + /rm/components/console/audit + rm-console + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.head.ftl new file mode 100644 index 0000000000..77a4a4a77a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.head.ftl @@ -0,0 +1,43 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/datatable/assets/datatable.css" /> + + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/people-finder/people-finder.css" /> +<@script type="text/javascript" src="${url.context}/res/components/people-finder/people-finder.js"> + + +<@link rel="stylesheet" type="text/css" href="${page.url.context}/res/rm/components/console/rm-audit.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/js/property-menu.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-audit.js"> + + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/documentlibrary/site-folder.css" /> +<@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/site-folder.js"> +<@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/doclib-actions.js"> +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/select-audit-record-location.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.html.ftl new file mode 100644 index 0000000000..9ea81aa615 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.html.ftl @@ -0,0 +1,179 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + +
+
+
+
+

${msg("label.header-title")}

+
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + +
+ + + + +
+
+
+
+ +
+
+
+ +
+
+
${msg("label.all-users")}${msg('label.remove-filter')}
+ + + + + +
+
+
+
+ +
+
+
+ +
+
+ + +
+
+
+ +
+ + +
+
 
+
+
+
+ + + + + +
+
+
+
+
+
 
+
+ + + + + + + + + + +
+
+
+
+
+
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.js new file mode 100644 index 0000000000..419e8d4034 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.js @@ -0,0 +1,84 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + var meta = []; + + var conn = remote.connect("alfresco"); + + // retrieve user capabilities - can they access Audit? + var capabilities = getCapabilities(conn); + var hasAccess = hasCapabilityImpl("AuditAdmin", capabilities); + if (hasAccess) + { + model.events = retrieveAuditEvents(conn); + model.eventsStr = model.events.toSource(); + model.enabled = getAuditStatus(conn); + model.capabilities = capabilities.toSource(); + + var groups = []; + var res = conn.get("/slingshot/rmsearchproperties"); // TODO we should be passing the file plan here + if (res.status == 200) + { + groups = eval('(' + res + ')').data.groups; + } + model.groups = groups; + + } + model.hasAccess = hasAccess; +} + +function retrieveAuditEvents(conn) +{ + var res = conn.get("/api/rma/admin/listofvalues"); + if (res.status == 200) + { + return eval('(' + res + ')').data.auditEvents.items; + } + else + { + return []; + } +} + +function getAuditStatus(conn) +{ + var res = conn.get("/api/rma/admin/rmauditlog/status") + if (res.status == 200) + { + return eval('(' + res + ')').data.enabled; + } + else + { + return true; + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.properties new file mode 100644 index 0000000000..f72f0c25e7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get.properties @@ -0,0 +1,73 @@ +label.header-title=Audit + +label.yes=Yes +label.no=No +label.record=Record +label.button-cancel=Cancel +button.view-record=View Record + +label.clear-log-title=Clear Audit Log +label.clear-log-confirmation=You can always run the audit log again. +label.clearing-log-message=Clearing audit log... +label.cleared-log-message=Audit log cleared. +message.clear-log-fail =We hit a problem clearing the audit log. Try refreshing your browser. + +label.stopped-at=Audit log stopped at {0} +label.stop-log-title=Stop Audit Log +label.stop-log-confirmation=No more events will be displayed. You can always start the audit log again. +label.stopping-log-message=Stopping audit log... +label.stopped-log-message=Audit log stopped. +message.stop-log-fail =We hit a problem stopping the audit log. Try refreshing your browser. + +label.started-at=Audit log started at {0} +label.start-log-title=Start Audit Log +label.start-log-confirmation=The audit log will start again from where it was previously stopped. +label.starting-log-message=Starting audit log... +label.started-log-message=Audit log started. +message.start-log-fail =We hit a problem starting the audit log. Try refreshing your browser. +message.select-from-date=Select From date +message.select-to-date=Select To date + +label.button-clear=Clear Full Log +label.button-stop=Stop +label.button-start=Start +label.button-view-log=View Recent Log +label.button-specify=Specify +label.button-export=Export +label.button-file-record=File as Record +label.button-apply=Run Audit Report +label.button-details=Details + +label.filed-log-message=Audit log has been filed as a record. +message.filing-log-fail=We hit a problem filing the audit log as record. Try refreshing your browser. +label.file-record=File Record + +label.timestamp=Timestamp +label.user=User +label.role=Role +label.event=Event +label.filter-log-title=Filter Log +label.filtering-log-message=Filtering log +label.default-filter=All users +label.pagination=Showing last {0} entries in log +label.show-log-for=Show log for: +label.all-users=All users +label.remove-filter=Remove filter +label.default-message=Click Apply to view the audit log + +node.root=File Plan +title.single=Select location of audit record + +label.header-users=Users +label.header-entries=Number of entries +label.header-from=From +label.header-to=To +label.header-event=Event +label.header-property=Metadata + +label.dialog-title=Details of {0} event +label.property=Property +label.previous-value=Previous Value +label.new-value=New Value + +message.load-peopleFinder-failure=We couldn't open the People Finder. Try refreshing your browser. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_de.properties new file mode 100644 index 0000000000..224da03418 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_de.properties @@ -0,0 +1,73 @@ +label.header-title=Audit + +label.yes=Ja +label.no=Nein +label.record=Record +label.button-cancel=Abbrechen +button.view-record=Record anzeigen + +label.clear-log-title=Audit-Protokoll l\u00f6schen +label.clear-log-confirmation=Das Audit-Protokoll kann sp\u00e4ter wieder nach Belieben ausgef\u00fchrt werden. +label.clearing-log-message=Audit-Protokoll wird gel\u00f6scht... +label.cleared-log-message=Audit-Protokoll gel\u00f6scht. +message.clear-log-fail =Beim L\u00f6schen des Audit-Protokolls ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.stopped-at=Audit-Protokoll gestoppt um {0} +label.stop-log-title=Audit-Protokoll stoppen +label.stop-log-confirmation=Es werden keine weiteren Ereignisse angezeigt. Das Audit-Protokoll kann sp\u00e4ter wieder nach Belieben gestartet werden. +label.stopping-log-message=Audit-Protokoll wird gestoppt... +label.stopped-log-message=Audit-Protokoll gestoppt. +message.stop-log-fail =Beim Stoppen des Audit-Protokolls ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.started-at=Audit-Protokoll gestartet um {0} +label.start-log-title=Audit-Protokoll starten +label.start-log-confirmation=Das Audit-Protokoll wird an der Stelle wieder gestartet, an der es zuvor gestoppt wurde. +label.starting-log-message=Audit-Protokoll wird gestartet... +label.started-log-message=Audit-Protokoll gestartet. +message.start-log-fail =Beim Starten des Audit-Protokolls ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.select-from-date=Startdatum ausw\u00e4hlen +message.select-to-date=Enddatum ausw\u00e4hlen + +label.button-clear=L\u00f6schen +label.button-stop=Stoppen +label.button-start=Starten +label.button-view-log=Vollst\u00e4ndiges Protokoll anzeigen +label.button-specify=Festlegen +label.button-export=Exportieren +label.button-file-record=Als Record ablegen +label.button-apply=Audit-Bericht ausf\u00fchren +label.button-details=Details + +label.filed-log-message=Audit-Protokoll wurde als Record abgelegt. +message.filing-log-fail=Beim Ablegen des Audit-Protokolls als Record ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +label.file-record=Record ablegen + +label.timestamp=Zeitstempel +label.user=Benutzer +label.role=Rolle +label.event=Ereignis +label.filter-log-title=Protokoll filtern +label.filtering-log-message=Protokoll wird gefiltert. +label.default-filter=Alle Benutzer +label.pagination=Die letzten {0} Eintr\u00e4ge im Protokoll werden angezeigt. +label.show-log-for=Protokoll anzeigen f\u00fcr: +label.all-users=Alle Benutzer +label.remove-filter=Filter entfernen +label.default-message=Klicken Sie auf 'Anwenden', um das Audit-Protokoll anzuzeigen. + +node.root=Ablageplan +title.single=Ort f\u00fcr Audit-Record ausw\u00e4hlen + +label.header-users=Benutzer +label.header-entries=Anzahl Eintr\u00e4ge +label.header-from=Von +label.header-to=Bis +label.header-event=Ereignis +label.header-property=Metadaten + +label.dialog-title=Details von Ereignis {0} +label.property=Eigenschaft +label.previous-value=Vorheriger Wert +label.new-value=Neuer Wert + +message.load-peopleFinder-failure=Mitarbeiter-Finder konnte nicht ge\u00f6ffnet werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_es.properties new file mode 100755 index 0000000000..2114d2c322 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_es.properties @@ -0,0 +1,73 @@ +label.header-title=Auditor\u00eda + +label.yes=S\u00ed +label.no=No +label.record=Documento de archivo +label.button-cancel=Cancelar +button.view-record=Ver documento de archivo + +label.clear-log-title=Borrar registro de auditor\u00edas +label.clear-log-confirmation=Siempre podr\u00e1 volver a ejecuta el registro de auditor\u00edas otra vez. +label.clearing-log-message=Borrando registro de auditor\u00edas... +label.cleared-log-message=Registro de auditor\u00edas borrado. +message.clear-log-fail =Se ha producido un problema al borrar el registro de auditor\u00edas. Trate de actualizar el navegador. + +label.stopped-at=Registro de auditor\u00edas detenido en {0} +label.stop-log-title=Detener registro de auditor\u00edas +label.stop-log-confirmation=No se mostrar\u00e1n m\u00e1s eventos. Siempre podr\u00e1 volver a iniciar el registro de auditor\u00edas otra vez. +label.stopping-log-message=Deteniendo registro de auditor\u00edas... +label.stopped-log-message=Registro de auditor\u00edas detenido. +message.stop-log-fail =Se ha producido un problema al detener el registro de auditor\u00edas. Trate de actualizar el navegador. + +label.started-at=Registro de auditor\u00edas iniciado en {0} +label.start-log-title=Iniciar registro de auditor\u00edas +label.start-log-confirmation=El registro de auditor\u00edas se iniciar\u00e1 otra vez desde donde se detuvo la vez anterior. +label.starting-log-message=Iniciando registro de auditor\u00edas... +label.started-log-message=Registro de auditor\u00edas iniciado. +message.start-log-fail =Se ha producido un problema al iniciar el registro de auditor\u00edas. Trate de actualizar el navegador. +message.select-from-date=Seleccionar desde la fecha +message.select-to-date=Seleccionar hasta la fecha + +label.button-clear=Borrar registro completo +label.button-stop=Detener +label.button-start=Iniciar +label.button-view-log=Ver registro reciente +label.button-specify=Especificar +label.button-export=Exportar +label.button-file-record=Archivar como documento de archivo +label.button-apply=Ejecutar informe de auditor\u00eda +label.button-details=Detalles + +label.filed-log-message=El registro de auditor\u00edas se ha archivado como documento de archivo. +message.filing-log-fail=Se ha producido un problema al archivar el registro de auditor\u00edas como documento de archivo. Trate de actualizar el navegador. +label.file-record=Archivar documento de archivo + +label.timestamp=Marca de tiempo +label.user=Usuario +label.role=Funci\u00f3n +label.event=Evento +label.filter-log-title=Filtrar registro +label.filtering-log-message=Filtrando registro +label.default-filter=Todos los usuarios +label.pagination=Mostrando las \u00faltimas {0} entradas del registro +label.show-log-for=Mostrar registro para: +label.all-users=Todos los usuarios +label.remove-filter=Eliminar filtro +label.default-message=Haga clic en Aplicar para ver el registro de auditor\u00edas + +node.root=Cuadro de clasificaci\u00f3n +title.single=Seleccione la ubicaci\u00f3n del documento de archivo de auditor\u00edas + +label.header-users=Usuarios +label.header-entries=N\u00famero de entradas +label.header-from=De +label.header-to=A +label.header-event=Evento +label.header-property=Metadatos + +label.dialog-title=Detalles de evento {0} +label.property=Propiedades +label.previous-value=Valor anterior +label.new-value=Nuevo valor + +message.load-peopleFinder-failure=No se pudo abrir el Buscador de personas. Trate de actualizar el navegador. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_fr.properties new file mode 100644 index 0000000000..9e51c6895e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_fr.properties @@ -0,0 +1,73 @@ +label.header-title=Audit + +label.yes=Oui +label.no=Non +label.record=Document d'archives +label.button-cancel=Annuler +button.view-record=Afficher le document d'archives + +label.clear-log-title=Effacer le journal d'audit +label.clear-log-confirmation=Vous pourrez toujours lancer le journal d'audit. +label.clearing-log-message=Effacement du journal d'audit... +label.cleared-log-message=Journal d'audit effac\u00e9. +message.clear-log-fail =Un probl\u00e8me est survenu pendant l'effacement du journal d'audit. Essayez d'actualiser votre navigateur. + +label.stopped-at=Journal d''audit arr\u00eat\u00e9 \u00e0 {0} +label.stop-log-title=Arr\u00eater le journal d''audit \u00e0 {0} +label.stop-log-confirmation=Plus aucun \u00e9v\u00e9nement ne sera affich\u00e9. Vous pourrez toujours d\u00e9marrer le journal d'audit. +label.stopping-log-message=Arr\u00eat du journal d'audit... +label.stopped-log-message=Journal d'audit arr\u00eat\u00e9. +message.stop-log-fail =Un probl\u00e8me est survenu pendant l'arr\u00eat du journal d'audit. Essayez d'actualiser votre navigateur. + +label.started-at=Journal d''audit d\u00e9marr\u00e9 \u00e0 {0} +label.start-log-title=D\u00e9marrer le journal d'audit +label.start-log-confirmation=Le journal d'audit red\u00e9marrera l\u00e0 o\u00f9 il a \u00e9t\u00e9 arr\u00eat\u00e9 pr\u00e9c\u00e9demment. +label.starting-log-message=D\u00e9marrage du journal d'audit... +label.started-log-message=Journal d'audit d\u00e9marr\u00e9. +message.start-log-fail =Un probl\u00e8me est survenu pendant le d\u00e9marrage du journal d'audit. Essayez d'actualiser votre navigateur. +message.select-from-date=S\u00e9lectionner la date de d\u00e9but +message.select-to-date=S\u00e9lectionner la date de fin + +label.button-clear=Effacer le journal complet +label.button-stop=Arr\u00eater +label.button-start=D\u00e9marrer +label.button-view-log=Afficher le journal r\u00e9cent +label.button-specify=D\u00e9finir +label.button-export=Exporter +label.button-file-record=Archiver comme document d'archives +label.button-apply=Ex\u00e9cuter le rapport d'audit +label.button-details=D\u00e9tails + +label.filed-log-message=Le journal d'audit a \u00e9t\u00e9 archiv\u00e9 comme document d'archives. +message.filing-log-fail=Un probl\u00e8me est survenu pendant l'archivage du journal d'audit comme document d'archives. Essayez d'actualiser votre navigateur. +label.file-record=Classer le document d'archives + +label.timestamp=Horodatage +label.user=Utilisateur +label.role=R\u00f4le +label.event=Ev\u00e9nement +label.filter-log-title=Filtrer le journal +label.filtering-log-message=Filtrage du journal +label.default-filter=Tous les utilisateurs +label.pagination=Affichage des {0} entr\u00e9es du journal +label.show-log-for=Afficher le journal pour : +label.all-users=Tous les utilisateurs +label.remove-filter=Supprimer le filtre +label.default-message=Cliquez sur Appliquer pour afficher le journal d'audit + +node.root=Plan de classement +title.single=S\u00e9lectionner l'emplacement du document d'archives d'audit + +label.header-users=Utilisateurs +label.header-entries=Nombre d'entr\u00e9es +label.header-from=De +label.header-to=A +label.header-event=Ev\u00e9nement +label.header-property=M\u00e9tadonn\u00e9es + +label.dialog-title=D\u00e9tails de l''\u00e9v\u00e9nement {0} +label.property=Propri\u00e9t\u00e9 +label.previous-value=Valeur pr\u00e9c\u00e9dente +label.new-value=Nouvelle valeur + +message.load-peopleFinder-failure=Impossible d'ouvrir l'Utilitaire de recherche de personnes. Essayez d'actualiser votre navigateur. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_it.properties new file mode 100644 index 0000000000..2ceb89ca3e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_it.properties @@ -0,0 +1,73 @@ +label.header-title=Audit + +label.yes=S\u00ec +label.no=No +label.record=Record +label.button-cancel=Annulla +button.view-record=Visualizza record + +label.clear-log-title=Cancella log di audit +label.clear-log-confirmation=\u00c8 sempre possibile eseguire il log di audit nuovamente. +label.clearing-log-message=Cancellazione log di audit... +label.cleared-log-message=Log di audit cancellato. +message.clear-log-fail =Si \u00e8 verificato un problema durante la cancellazione del log di audit. Provare ad aggiornare il browser. + +label.stopped-at=Log di audit interrotto alle {0} +label.stop-log-title=Interrompi log di audit +label.stop-log-confirmation=Nessun altro evento verr\u00e0 visualizzato. \u00c8 sempre possibile riavviare il log di audit. +label.stopping-log-message=Interruzione log di audit... +label.stopped-log-message=Log di audit interrotto. +message.stop-log-fail =Si \u00e8 verificato un problema durante l'interruzione del log di audit. Provare ad aggiornare il browser. + +label.started-at=Log di audit avviato alle {0} +label.start-log-title=Avvia log di audit +label.start-log-confirmation=Il log di audit verr\u00e0 riavviato dal punto in cui era stato interrotto precedentemente. +label.starting-log-message=Avvio del log di audit... +label.started-log-message=Log di audit avviato. +message.start-log-fail =Si \u00e8 verificato un problema durante l'avvio del log di audit. Provare ad aggiornare il browser. +message.select-from-date=Seleziona dalla data +message.select-to-date=Seleziona alla data + +label.button-clear=Cancella intero log +label.button-stop=Interrompi +label.button-start=Avvia +label.button-view-log=Visualizza log recente +label.button-specify=Specifica +label.button-export=Esporta +label.button-file-record=Archivia come record +label.button-apply=Esegui rapporto audit +label.button-details=Dettagli + +label.filed-log-message=Il log di audit \u00e8 stato archiviato come record. +message.filing-log-fail=Si \u00e8 verificato un problema durante l'archiviazione del log di audit. Provare ad aggiornare il browser. +label.file-record=Archivia record + +label.timestamp=Timestamp +label.user=Utente +label.role=Ruolo +label.event=Evento +label.filter-log-title=Filtra log +label.filtering-log-message=Filtraggio log... +label.default-filter=Tutti gli utenti +label.pagination=Visualizzazione delle ultime {0} voci nel log +label.show-log-for=Mostra log per: +label.all-users=Tutti gli utenti +label.remove-filter=Rimuovi filtro +label.default-message=Fare clic su Applica per visualizzare il log di audit + +node.root=Piano di fascicolazione +title.single=Seleziona posizione del record di audit + +label.header-users=Utenti +label.header-entries=Numero di voci +label.header-from=Da +label.header-to=Il +label.header-event=Evento +label.header-property=Metadati + +label.dialog-title=Dettagli di evento {0} +label.property=Propriet\u00e0 +label.previous-value=Valore precedente +label.new-value=Nuovo valore + +message.load-peopleFinder-failure=Impossibile aprire Ricerca persone. Provare ad aggiornare il browser. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_ja.properties new file mode 100644 index 0000000000..2e1496866f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_ja.properties @@ -0,0 +1,73 @@ +label.header-title=\u76e3\u67fb + +label.yes=\u306f\u3044 +label.no=\u3044\u3044\u3048 +label.record=\u30ec\u30b3\u30fc\u30c9 +label.button-cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +button.view-record=\u30ec\u30b3\u30fc\u30c9\u306e\u8868\u793a + +label.clear-log-title=\u76e3\u67fb\u30ed\u30b0\u306e\u6d88\u53bb +label.clear-log-confirmation=\u76e3\u67fb\u30ed\u30b0\u306f\u3044\u3064\u3067\u3082\u518d\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002 +label.clearing-log-message=\u76e3\u67fb\u30ed\u30b0\u3092\u6d88\u53bb\u3057\u3066\u3044\u307e\u3059... +label.cleared-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u6d88\u53bb\u3055\u308c\u307e\u3057\u305f\u3002 +message.clear-log-fail =\u76e3\u67fb\u30ed\u30b0\u306e\u6d88\u53bb\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.stopped-at=\u76e3\u67fb\u30ed\u30b0\u304c {0} \u306b\u505c\u6b62\u3055\u308c\u307e\u3057\u305f +label.stop-log-title=\u76e3\u67fb\u30ed\u30b0\u306e\u505c\u6b62 +label.stop-log-confirmation=\u30a4\u30d9\u30f3\u30c8\u304c\u8868\u793a\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 \u76e3\u67fb\u30ed\u30b0\u306f\u3044\u3064\u3067\u3082\u518d\u958b\u3067\u304d\u307e\u3059\u3002 +label.stopping-log-message=\u76e3\u67fb\u30ed\u30b0\u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059... +label.stopped-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u505c\u6b62\u3055\u308c\u307e\u3057\u305f\u3002 +message.stop-log-fail =\u76e3\u67fb\u30ed\u30b0\u306e\u505c\u6b62\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.started-at=\u76e3\u67fb\u30ed\u30b0\u304c {0} \u306b\u958b\u59cb\u3055\u308c\u307e\u3057\u305f +label.start-log-title=\u76e3\u67fb\u30ed\u30b0\u306e\u958b\u59cb +label.start-log-confirmation=\u76e3\u67fb\u30ed\u30b0\u306f\u3001\u524d\u56de\u505c\u6b62\u3057\u305f\u3068\u3053\u308d\u304b\u3089\u518d\u958b\u3055\u308c\u307e\u3059\u3002 +label.starting-log-message=\u76e3\u67fb\u30ed\u30b0\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059... +label.started-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u958b\u59cb\u3055\u308c\u307e\u3057\u305f\u3002 +message.start-log-fail =\u76e3\u67fb\u30ed\u30b0\u306e\u958b\u59cb\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.select-from-date=\u958b\u59cb\u65e5\u306e\u9078\u629e +message.select-to-date=\u7d42\u4e86\u65e5\u306e\u9078\u629e + +label.button-clear=\u5168\u30ed\u30b0\u3092\u6d88\u53bb +label.button-stop=\u505c\u6b62 +label.button-start=\u958b\u59cb +label.button-view-log=\u6700\u8fd1\u4f7f\u3063\u305f\u30ed\u30b0\u3092\u8868\u793a +label.button-specify=\u6307\u5b9a +label.button-export=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +label.button-file-record=\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1 +label.button-apply=\u76e3\u67fb\u30ec\u30dd\u30fc\u30c8\u306e\u5b9f\u884c +label.button-details=\u8a73\u7d30 + +label.filed-log-message=\u76e3\u67fb\u30ed\u30b0\u304c\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u307e\u3057\u305f\u3002 +message.filing-log-fail=\u76e3\u67fb\u30ed\u30b0\u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u6574\u7406\u4fdd\u7ba1\u3057\u3066\u3044\u308b\u6700\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +label.file-record=\u30ec\u30b3\u30fc\u30c9\u306e\u6574\u7406\u4fdd\u7ba1 + +label.timestamp=\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7 +label.user=\u30e6\u30fc\u30b6\u30fc +label.role=\u5f79\u5272 +label.event=\u30a4\u30d9\u30f3\u30c8 +label.filter-log-title=\u30ed\u30b0\u306e\u30d5\u30a3\u30eb\u30bf\u51e6\u7406 +label.filtering-log-message=\u30ed\u30b0\u306e\u30d5\u30a3\u30eb\u30bf\u51e6\u7406\u3092\u884c\u3063\u3066\u3044\u307e\u3059 +label.default-filter=\u5168\u30e6\u30fc\u30b6\u30fc +label.pagination=\u6700\u5f8c\u306e {0} \u4ef6\u306e\u30ed\u30b0\u3092\u8868\u793a\u3057\u3066\u3044\u307e\u3059 +label.show-log-for=\u30ed\u30b0\u306e\u8868\u793a\uff1a +label.all-users=\u5168\u30e6\u30fc\u30b6\u30fc +label.remove-filter=\u30d5\u30a3\u30eb\u30bf\u306e\u524a\u9664 +label.default-message=\u76e3\u67fb\u30ed\u30b0\u3092\u8868\u793a\u3059\u308b\u306b\u306f\u3001[\u9069\u7528] \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002 + +node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +title.single=\u76e3\u67fb\u30ec\u30b3\u30fc\u30c9\u306e\u5834\u6240\u306e\u9078\u629e + +label.header-users=\u30e6\u30fc\u30b6\u30fc +label.header-entries=\u30a8\u30f3\u30c8\u30ea\u6570 +label.header-from=\u958b\u59cb\u65e5 +label.header-to=\u7d42\u4e86\u65e5 +label.header-event=\u30a4\u30d9\u30f3\u30c8 +label.header-property=\u30e1\u30bf\u30c7\u30fc\u30bf + +label.dialog-title=''{0}'' \u30a4\u30d9\u30f3\u30c8\u306e\u8a73\u7d30 +label.property=\u30d7\u30ed\u30d1\u30c6\u30a3 +label.previous-value=\u4ee5\u524d\u306e\u5024 +label.new-value=\u65b0\u3057\u3044\u5024 + +message.load-peopleFinder-failure=[\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22] \u3092\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_nb.properties new file mode 100644 index 0000000000..5394c55f65 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_nb.properties @@ -0,0 +1,73 @@ +label.header-title=Revisjon + +label.yes=Ja +label.no=Nei +label.record=Oppf\u00f8ring +label.button-cancel=Avbryt +button.view-record=Vis oppf\u00f8ring + +label.clear-log-title=Slett revisjonslogg +label.clear-log-confirmation=Revisjonen kan alltid kj\u00f8res p\u00e5 nytt. +label.clearing-log-message=Sletter revisjonsloggen... +label.cleared-log-message=Revisjonslogg slettet. +message.clear-log-fail =Det oppsto et problem med \u00e5 slette revisjonsloggen. Pr\u00f8v \u00e5 oppdatere nettleseren. + +label.stopped-at=Revisjonslogg stoppet p\u00e5 {0} +label.stop-log-title=Stopp revisjonslogg +label.stop-log-confirmation=Ingen flere hendelser vises. Revisjonen kan alltid startes p\u00e5 nytt. +label.stopping-log-message=Stopper revisjonsloggen... +label.stopped-log-message=Revisjonslogg stoppet. +message.stop-log-fail =Det oppsto et problem med \u00e5 stoppe revisjonsloggen. Pr\u00f8v \u00e5 oppdatere nettleseren. + +label.started-at=Revisjonslogg startet p\u00e5 {0} +label.start-log-title=Start revisjonslogg +label.start-log-confirmation=Revisjonsloggen fortsetter der den stoppet forrige gang. +label.starting-log-message=Starter revisjonslogg... +label.started-log-message=Revisjonslogg startet. +message.start-log-fail =Det oppsto et problem med \u00e5 starte revisjonsloggen. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.select-from-date=Velg Fra dato +message.select-to-date=Velg Til dato + +label.button-clear=Slett full logg +label.button-stop=Stopp +label.button-start=Start +label.button-view-log=Vis logg +label.button-specify=Spesifiser +label.button-export=Eksporter +label.button-file-record=Registrer som oppf\u00f8ring +label.button-apply=Kj\u00f8r revisjonsrapport +label.button-details=Detaljer + +label.filed-log-message=Revisjonslogg er registrert som en oppf\u00f8ring. +message.filing-log-fail=Det oppsto et problem med \u00e5 registrere revisjonsloggen som oppf\u00f8ring. Pr\u00f8v \u00e5 oppdatere nettleseren. +label.file-record=Arkivere oppf\u00f8ring + +label.timestamp=Klokkeslettstempel +label.user=Bruker +label.role=Rolle +label.event=Hendelse +label.filter-log-title=Filtrer logg +label.filtering-log-message=Filtrerer logg +label.default-filter=Alle brukere +label.pagination=Viser de siste {0} registreringene i loggen +label.show-log-for=Vis logg for: +label.all-users=Alle brukere +label.remove-filter=Fjern filter +label.default-message=Klikk p\u00e5 Bruk for \u00e5 vise revisjonsloggen + +node.root=Filplan +title.single=Velg sted for revisjonsoppf\u00f8ring + +label.header-users=Brukere +label.header-entries=Antall registreringer +label.header-from=Fra +label.header-to=Til +label.header-event=Hendelse +label.header-property=Metadata + +label.dialog-title=Informasjon om hendelsen {0} +label.property=Egenskap +label.previous-value=Forrige verdi +label.new-value=Ny verdi + +message.load-peopleFinder-failure=Kunne ikke \u00e5pne Persons\u00f8ker. Pr\u00f8v \u00e5 oppdatere nettleseren. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_nl.properties new file mode 100755 index 0000000000..949ae42feb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_nl.properties @@ -0,0 +1,73 @@ +label.header-title=Audit + +label.yes=Ja +label.no=Nee +label.record=Archiefstuk +label.button-cancel=Annuleren +button.view-record=Archiefstuk bekijken + +label.clear-log-title=Auditlog wissen +label.clear-log-confirmation=U kunt het auditlog altijd opnieuw uitvoeren. +label.clearing-log-message=Auditlog wissen... +label.cleared-log-message=Auditlog gewist. +message.clear-log-fail =Er is een probleem opgetreden bij het wissen van het auditlog. Vernieuw de browser. + +label.stopped-at=Auditlog gestopt om {0} +label.stop-log-title=Auditlog stoppen +label.stop-log-confirmation=Er worden geen gebeurtenissen meer weergegeven. U kunt het auditlog altijd opnieuw starten. +label.stopping-log-message=Auditlog stoppen... +label.stopped-log-message=Auditlog gestopt. +message.stop-log-fail =Er is een probleem opgetreden bij het stoppen van het auditlog. Vernieuw de browser. + +label.started-at=Auditlog gestart om {0} +label.start-log-title=Auditlog starten +label.start-log-confirmation=Het auditlog wordt weer gestart vanaf het punt waar het werd gestopt. +label.starting-log-message=Auditlog starten... +label.started-log-message=Auditlog gestart. +message.start-log-fail =Er is een probleem opgetreden bij het starten van het auditlog. Vernieuw de browser. +message.select-from-date=Begindatum selecteren +message.select-to-date=Einddatum selecteren + +label.button-clear=Vol log wissen +label.button-stop=Stoppen +label.button-start=Starten +label.button-view-log=Recent log bekijken +label.button-specify=Specificeren +label.button-export=Exporteren +label.button-file-record=Archiveren als archiefstuk +label.button-apply=Auditrapport uitvoeren +label.button-details=Details + +label.filed-log-message=Auditlog is gearchiveerd als een archiefstuk. +message.filing-log-fail=Er is een probleem opgetreden bij het archiveren van het auditlog als een archiefstuk. Vernieuw de browser. +label.file-record=Archiefstuk archiveren + +label.timestamp=Tijdstempel +label.user=Gebruiker +label.role=Rol +label.event=Gebeurtenis +label.filter-log-title=Log filteren +label.filtering-log-message=Log wordt gefilterd +label.default-filter=Alle gebruikers +label.pagination=Laatst {0} regels in log worden weergegeven +label.show-log-for=Log weergeven voor: +label.all-users=Alle gebruikers +label.remove-filter=Filter verwijderen +label.default-message=Klik op Toepassen om het auditlog weer te geven + +node.root=Ordeningsplan +title.single=Locatie voor audit-archiefstuk selecteren + +label.header-users=Gebruikers +label.header-entries=Aantal regels +label.header-from=Van +label.header-to=Tot +label.header-event=Gebeurtenis +label.header-property=Metagegevens + +label.dialog-title=Details van {0} gebeurtenis +label.property=Eigenschap +label.previous-value=Vorige waarde +label.new-value=Nieuwe waarde + +message.load-peopleFinder-failure=Kan Mensen zoeken niet openen. Vernieuw de browser. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_pt_BR.properties new file mode 100644 index 0000000000..ea163e3ebf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_pt_BR.properties @@ -0,0 +1,73 @@ +label.header-title=Auditoria + +label.yes=Sim +label.no=N\u00e3o +label.record=Documento arquiv\u00edstico +label.button-cancel=Cancelar +button.view-record=Visualizar documento arquiv\u00edstico + +label.clear-log-title=Limpar log de auditoria +label.clear-log-confirmation=Voc\u00ea sempre pode executar o log de auditoria novamente. +label.clearing-log-message=Limpando log de auditoria... +label.cleared-log-message=Log de auditoria limpo. +message.clear-log-fail =Encontramos um problema ao limpar o log de auditoria. Tente atualizar seu navegador. + +label.stopped-at=Log de auditoria interrompido em {0} +label.stop-log-title=Interromper log de auditoria +label.stop-log-confirmation=Nenhum outro evento ser\u00e1 exibido. Voc\u00ea sempre pode iniciar o log de auditoria novamente. +label.stopping-log-message=Interrompendo log de auditoria... +label.stopped-log-message=Log de auditoria interrompido. +message.stop-log-fail =Encontramos um problema ao interromper o log de auditoria. Tente atualizar seu navegador. + +label.started-at=Log de auditoria iniciado em {0} +label.start-log-title=Iniciar log de auditoria +label.start-log-confirmation=O log de auditoria ser\u00e1 iniciado novamente de onde parou. +label.starting-log-message=Iniciando log de auditoria... +label.started-log-message=Log de auditoria iniciado. +message.start-log-fail =Encontramos um problema ao iniciar o log de auditoria. Tente atualizar seu navegador. +message.select-from-date=Selecionar data de in\u00edcio +message.select-to-date=Selecionar data de t\u00e9rmino + +label.button-clear=Limpar log completo +label.button-stop=Parar +label.button-start=Iniciar +label.button-view-log=Visualizar log recente +label.button-specify=Especificar +label.button-export=Exportar +label.button-file-record=Arquivar como documento arquiv\u00edstico +label.button-apply=Executar Relat\u00f3rio de Auditoria +label.button-details=Detalhes + +label.filed-log-message=O log de auditoria foi arquivado como um documento arquiv\u00edstico. +message.filing-log-fail=Encontramos um problema ao arquivar o log de auditoria como documento arquiv\u00edstico. Tente atualizar seu navegador. +label.file-record=Arquivar documento arquiv\u00edstico + +label.timestamp=Carimbo de data/hora +label.user=Usu\u00e1rio +label.role=Fun\u00e7\u00e3o +label.event=Evento +label.filter-log-title=Filtrar log +label.filtering-log-message=Filtrando log +label.default-filter=Todos os usu\u00e1rios +label.pagination=Mostrando \u00faltimas {0} entradas no log +label.show-log-for=Mostrar log de: +label.all-users=Todos os usu\u00e1rios +label.remove-filter=Remover filtro +label.default-message=Clique em Aplicar para visualizar o log de auditoria + +node.root=Plano de arquivamento +title.single=Selecionar local do documento arquiv\u00edstico de auditoria + +label.header-users=Usu\u00e1rios +label.header-entries=N\u00famero de entradas +label.header-from=De +label.header-to=Para +label.header-event=Evento +label.header-property=Metadados + +label.dialog-title=Detalhes do evento {0} +label.property=Propriedade +label.previous-value=Valor anterior +label.new-value=Novo valor + +message.load-peopleFinder-failure=N\u00e3o foi poss\u00edvel abrir o Localizador de pessoas. Tente atualizar seu navegador. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_ru.properties new file mode 100644 index 0000000000..e6dcb1b2bf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_ru.properties @@ -0,0 +1,73 @@ +label.header-title=\u0410\u0443\u0434\u0438\u0442 + +label.yes=\u0414\u0430 +label.no=\u041d\u0435\u0442 +label.record=\u0417\u0430\u043f\u0438\u0441\u044c +label.button-cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +button.view-record=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 + +label.clear-log-title=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.clear-log-confirmation=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +label.clearing-log-message=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430... +label.cleared-log-message=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u043e\u0447\u0438\u0449\u0435\u043d. +message.clear-log-fail =\u041f\u0440\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +label.stopped-at=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 {0} +label.stop-log-title=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.stop-log-confirmation=\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +label.stopping-log-message=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430... +label.stopped-log-message=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +message.stop-log-fail =\u041f\u0440\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +label.started-at=\u041d\u0430\u0447\u0430\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 {0} +label.start-log-title=\u041d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 +label.start-log-confirmation=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430. +label.starting-log-message=\u0417\u0430\u043f\u0443\u0441\u043a \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430... +label.started-log-message=\u041d\u0430\u0447\u0430\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430. +message.start-log-fail =\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.select-from-date=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443 \u043d\u0430\u0447\u0430\u043b\u0430 +message.select-to-date=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f + +label.button-clear=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b +label.button-stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c +label.button-start=\u041d\u0430\u0447\u0430\u0442\u044c +label.button-view-log=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430 +label.button-specify=\u0423\u043a\u0430\u0437\u0430\u0442\u044c +label.button-export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 +label.button-file-record=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +label.button-apply=\u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442 +label.button-details=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f + +label.filed-log-message=\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. +message.filing-log-fail=\u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +label.file-record=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b + +label.timestamp=\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 +label.user=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +label.role=\u0420\u043e\u043b\u044c +label.event=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 +label.filter-log-title=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0436\u0443\u0440\u043d\u0430\u043b\u0430 +label.filtering-log-message=\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u0430 +label.default-filter=\u0412\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +label.pagination=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 {0} \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 +label.show-log-for=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0434\u043b\u044f: +label.all-users=\u0412\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +label.remove-filter=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 +label.default-message=\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 ''\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c'' + +node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +title.single=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0443\u0434\u0438\u0442\u0430 + +label.header-users=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +label.header-entries=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.header-from=\u041e\u0442\u043a\u0443\u0434\u0430 +label.header-to=\u041a\u0443\u0434\u0430 +label.header-event=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 +label.header-property=\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 + +label.dialog-title=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 {0} +label.property=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e +label.previous-value=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 +label.new-value=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 + +message.load-peopleFinder-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c ''\u041f\u043e\u0438\u0441\u043a \u043b\u044e\u0434\u0435\u0439''. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_zh_CN.properties new file mode 100644 index 0000000000..e93872e7c7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-audit.get_zh_CN.properties @@ -0,0 +1,73 @@ +label.header-title=\u5ba1\u8ba1 + +label.yes=\u662f +label.no=\u5426 +label.record=\u8bb0\u5f55 +label.button-cancel=\u53d6\u6d88 +button.view-record=\u67e5\u770b\u8bb0\u5f55 + +label.clear-log-title=\u6e05\u9664\u5ba1\u8ba1\u65e5\u5fd7 +label.clear-log-confirmation=\u60a8\u53ef\u4ee5\u968f\u65f6\u91cd\u65b0\u8fd0\u884c\u5ba1\u8ba1\u65e5\u5fd7\u3002 +label.clearing-log-message=\u6b63\u5728\u6e05\u9664\u5ba1\u8ba1\u65e5\u5fd7... +label.cleared-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u6e05\u9664\u3002 +message.clear-log-fail =\u6e05\u9664\u5ba1\u8ba1\u65e5\u5fd7\u65f6\u9047\u5230\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +label.stopped-at=\u5ba1\u8ba1\u65e5\u5fd7\u5728 {0} \u505c\u6b62 +label.stop-log-title=\u505c\u6b62\u5ba1\u8ba1\u65e5\u5fd7 +label.stop-log-confirmation=\u4e0d\u4f1a\u663e\u793a\u66f4\u591a\u7684\u4e8b\u4ef6\u3002 \u60a8\u53ef\u4ee5\u968f\u65f6\u91cd\u65b0\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7\u3002 +label.stopping-log-message=\u6b63\u5728\u505c\u6b62\u5ba1\u8ba1\u65e5\u5fd7... +label.stopped-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u505c\u6b62\u3002 +message.stop-log-fail =\u6211\u4eec\u5728\u505c\u6b62\u5ba1\u8ba1\u65e5\u5fd7\u65f6\u9047\u5230\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +label.started-at=\u5ba1\u8ba1\u65e5\u5fd7\u5728 {0} \u542f\u52a8 +label.start-log-title=\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7 +label.start-log-confirmation=\u5ba1\u8ba1\u65e5\u5fd7\u5c06\u4ece\u5176\u5148\u524d\u505c\u6b62\u7684\u5730\u65b9\u91cd\u65b0\u5f00\u59cb\u3002 +label.starting-log-message=\u6b63\u5728\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7... +label.started-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u542f\u52a8\u3002 +message.start-log-fail =\u6211\u4eec\u5728\u542f\u52a8\u5ba1\u8ba1\u65e5\u5fd7\u65f6\u9047\u5230\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.select-from-date=\u9009\u62e9\u5f00\u59cb\u65e5\u671f +message.select-to-date=\u9009\u62e9\u622a\u6b62\u65e5\u671f + +label.button-clear=\u6e05\u9664\u5b8c\u6574\u65e5\u5fd7 +label.button-stop=\u505c\u6b62 +label.button-start=\u542f\u52a8 +label.button-view-log=\u67e5\u770b\u6700\u8fd1\u7684\u65e5\u5fd7 +label.button-specify=\u6307\u5b9a +label.button-export=\u5bfc\u51fa +label.button-file-record=\u7acb\u5377\u4e3a\u8bb0\u5f55 +label.button-apply=\u6267\u884c\u5ba1\u8ba1\u62a5\u544a +label.button-details=\u8be6\u7ec6\u4fe1\u606f + +label.filed-log-message=\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u88ab\u7acb\u5377\u4e3a\u8bb0\u5f55\u3002 +message.filing-log-fail=\u6211\u4eec\u5728\u5c06\u5ba1\u8ba1\u65e5\u5fd7\u586b\u5145\u4e3a\u8bb0\u5f55\u65f6\u9047\u5230\u9519\u8bef\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +label.file-record=\u7acb\u5377\u8bb0\u5f55 + +label.timestamp=\u65f6\u95f4\u6233 +label.user=\u7528\u6237 +label.role=\u89d2\u8272 +label.event=\u4e8b\u4ef6 +label.filter-log-title=\u7b5b\u9009\u65e5\u5fd7 +label.filtering-log-message=\u6b63\u5728\u7b5b\u9009\u65e5\u5fd7 +label.default-filter=\u6240\u6709\u7528\u6237 +label.pagination=\u663e\u793a\u65e5\u5fd7\u4e2d\u7684\u6700\u540e {0} \u4e2a\u6761\u76ee +label.show-log-for=\u663e\u793a\u4ee5\u4e0b\u9879\u76ee\u7684\u65e5\u5fd7\uff1a +label.all-users=\u6240\u6709\u7528\u6237 +label.remove-filter=\u5220\u9664\u7b5b\u9009\u5668 +label.default-message=\u5355\u51fb\u5e94\u7528\u5df2\u67e5\u770b\u5ba1\u8ba1\u65e5\u5fd7 + +node.root=\u5f52\u7c7b\u65b9\u6848 +title.single=\u9009\u62e9\u5ba1\u8ba1\u8bb0\u5f55\u7684\u4f4d\u7f6e + +label.header-users=\u7528\u6237 +label.header-entries=\u6761\u76ee\u6570 +label.header-from=\u4ece +label.header-to=\u81f3 +label.header-event=\u4e8b\u4ef6 +label.header-property=\u5143\u6570\u636e + +label.dialog-title={0} \u4e8b\u4ef6\u7684\u8be6\u7ec6\u4fe1\u606f +label.property=\u5c5e\u6027 +label.previous-value=\u4e4b\u524d\u7684\u503c +label.new-value=\u65b0\u503c + +message.load-peopleFinder-failure=\u6211\u4eec\u65e0\u6cd5\u6253\u5f00\u4eba\u5458\u67e5\u627e\u5668\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-access.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-access.ftl new file mode 100644 index 0000000000..11622903ca --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-access.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +

+

+

${msg("message.admin-console-access-denied")}

+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.desc.xml new file mode 100644 index 0000000000..bb9aa5b034 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.desc.xml @@ -0,0 +1,5 @@ + + RM Console Title + Title component used in the Records Management Console page + /rm/components/title/console + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.html.ftl new file mode 100644 index 0000000000..9ab084f1ab --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.html.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +
+

${msg("page.rmConsole.title")}

+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.properties new file mode 100644 index 0000000000..72acb54d8e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_de.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_de.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_es.properties new file mode 100755 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_es.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_fr.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_fr.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_it.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_it.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_ja.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_ja.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_nb.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_nb.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_nl.properties new file mode 100755 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_nl.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_pt_BR.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_pt_BR.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_ru.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_ru.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_zh_CN.properties new file mode 100644 index 0000000000..4414e49b53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console-title.get_zh_CN.properties @@ -0,0 +1 @@ +#header.rmconsole=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console.lib.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console.lib.js new file mode 100644 index 0000000000..bb7c30ab09 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-console.lib.js @@ -0,0 +1,80 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Helper to determine if the current user has the given Capability in any assigned Role + * + * @method hasCapability + * @param conn Connector to use + * @param cap Capability ID to test e.g. "AccessAudit" + * @return true if the capability is present for this user, false otherwise + */ +function hasCapability(conn, cap) +{ + var capabilities = getCapabilities(conn); + return hasCapabilityImpl(cap, capabilities); +} + +function hasCapabilityImpl(cap, capabilities) +{ + var result = false; + if (capabilities !== null) + { + for each (var c in capabilities) + { + if (c == cap) + { + result = true; + break; + } + } + } + return result; +} + +function getCapabilities(conn) +{ + var result = null; + var res = conn.get("/api/capabilities?includeAll=true"); + if (res.status == 200) + { + var data = eval('(' + res + ')').data; + result = data.capabilities; + } + return result; +} + +function getGroupedCapabilities(conn) +{ + var result = null; + var res = conn.get("/api/capabilities?grouped=true"); + if (res.status == 200) + { + var data = eval('(' + res + ')').data; + result = data.groupedCapabilities; + } + return result; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.desc.xml new file mode 100644 index 0000000000..581e56557a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Record Management Custom Metadata + Administration Console - Record Management Tool Custom Metadata + /rm/components/console/custom-metadata + rm-console + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.head.ftl new file mode 100644 index 0000000000..e0618aca88 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.head.ftl @@ -0,0 +1,31 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-custom-metadata.css" /> +<@script type="text/javascript" src="${url.context}/res/components/console/consoletool.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-custom-metadata.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.html.ftl new file mode 100644 index 0000000000..2035a52e74 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.html.ftl @@ -0,0 +1,174 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + + + + +<#assign el=args.htmlid> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.js new file mode 100644 index 0000000000..a03013ff0a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.js @@ -0,0 +1,61 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM Custom Metadata WebScript component + */ +function main() +{ + var constraints = []; + + var conn = remote.connect("alfresco"); + + // retrieve the RM constraints - an array is returned + var res = conn.get("/api/rma/admin/rmconstraints?withEmptyLists=false"); + if (res.status == 200) + { + constraints = eval('(' + res + ')').data; + } + model.constraints = constraints; + + + // retrieve the customisable aspects and types + var customisable = []; + var res2 = conn.get("/api/rma/admin/customisable"); + if (res2.status == 200) + { + customisable = eval('(' + res2 + ')').data; + } + model.customisable = customisable; + + // test user capabilities - can they access Custom Metadata? + model.hasAccess = hasCapability(conn, "CreateModifyDestroyFileplanTypes"); +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.properties new file mode 100644 index 0000000000..4627f77b95 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Custom Metadata +label.create-metadata-title=New Metadata +label.edit-metadata-title=Edit Custom Metadata +label.list-title=Object +label.custom-metadata=Custom Metadata +label.selection-list=Selection list +label.label=Name +label.use-list=Use selection list +label.mandatory=Mandatory + +label.datatype.unknown=Unknown +label.datatype.text=Text +label.datatype.boolean=Check Box +label.datatype.date=Date + +message.getpropertiesfail=We couldn't retrieve custom property definitions. +message.noproperties=You haven't defined any custom properties yet. +message.create-success=Successfully added new custom property. +message.create-failure=We couldn't add new custom property {0}. Contact your I.T. Dept. +message.edit-success=Successfully saved custom property. +message.edit-failure=We couldn't save custom property {0}. Contact your I.T. Dept. +message.delete.title=Delete Custom Property +message.delete.text=If you delete {0} then it won't be available when you edit records. +message.delete-success=Successfully deleted custom property. +message.delete-failure=We couldn't delete custom property {0}. Contact your I.T. Dept. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=New \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_de.properties new file mode 100644 index 0000000000..b965e07077 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_de.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Benutzerdefinierte Metadaten +label.create-metadata-title=Neue Metadaten +label.edit-metadata-title=Benutzerdefinierte Metadaten bearbeiten +label.list-title=Objekt +label.custom-metadata=Benutzerdefinierte Metadaten +label.selection-list=Auswahlliste +label.label=Name +label.use-list=Auswahlliste verwenden +label.mandatory=Obligatorisch + +label.datatype.unknown=Unbekannt +label.datatype.text=Text +label.datatype.boolean=Kontrollk\u00e4stchen +label.datatype.date=Datum + +message.getpropertiesfail=Benutzerdefinierte Eigenschaftsdefinitionen konnten nicht abgerufen werden. +message.noproperties=Bisher wurden keine benutzerdefinierten Eigenschaften definiert. +message.create-success=Neue benutzerdefinierte Eigenschaft erfolgreich hinzugef\u00fcgt. +message.create-failure=Die folgende neue benutzerdefinierte Eigenschaft konnte nicht hinzugef\u00fcgt werden: {0}. Kontakten Sie Ihre IT-Abteilung. +message.edit-success=Benutzerdefinierte Eigenschaft erfolgreich gespeichert. +message.edit-failure=Die folgende benutzerdefinierte Eigenschaft konnte nicht gespeichert werden: {0}. Kontakten Sie Ihre IT-Abteilung. +message.delete.title=Benutzerdefinierte Eigenschaft l\u00f6schen +message.delete.text=Wenn Sie ''{0}'' l\u00f6schen, steht sie beim Bearbeiten von Records nicht zur Verf\u00fcgung. +message.delete-success=Benutzerdefinierte Eigenschaft erfolgreich gel\u00f6scht. +message.delete-failure=Die folgende benutzerdefinierte Eigenschaft konnte nicht gel\u00f6scht werden: {0}. Kontakten Sie Ihre IT-Abteilung. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Neu diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_es.properties new file mode 100755 index 0000000000..76e3994549 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_es.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Metadatos personalizados +label.create-metadata-title=Metadatos nuevos +label.edit-metadata-title=Editar metadatos personalizados +label.list-title=Objeto +label.custom-metadata=Metadatos personalizados +label.selection-list=Lista de selecci\u00f3n +label.label=Nombre +label.use-list=Usar lista de selecci\u00f3n +label.mandatory=Obligatorio + +label.datatype.unknown=Desconocido +label.datatype.text=Texto +label.datatype.boolean=Casilla de verificaci\u00f3n +label.datatype.date=Fecha + +message.getpropertiesfail=No se pudieron recuperar las definiciones de la propiedad personalizada. +message.noproperties=No ha definido ninguna propiedad personalizada todav\u00eda. +message.create-success=Nueva propiedad personalizada a\u00f1adida correctamente. +message.create-failure=No se pudo a\u00f1adir nueva propiedad personalizada {0}. P\u00f3ngase en contacto con el dep. de TI. +message.edit-success=Propiedad personalizada guardada correctamente. +message.edit-failure=No se pudo guardar la propiedad personalizada {0}. P\u00f3ngase en contacto con el dep. de TI. +message.delete.title=Eliminar propiedad personalizada +message.delete.text=Si elimina {0}, no estar\u00e1 disponible cuando edite los documentos de archivo. +message.delete-success=Propiedad personalizada eliminada correctamente. +message.delete-failure=No se pudo eliminar la propiedad personalizada {0}. P\u00f3ngase en contacto con el dep. de TI. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Nuevo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_fr.properties new file mode 100644 index 0000000000..8a6ccae016 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_fr.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=M\u00e9tadonn\u00e9es personnalis\u00e9es +label.create-metadata-title=Nouvelles m\u00e9tadonn\u00e9es +label.edit-metadata-title=Modifier les m\u00e9tadonn\u00e9es personnalis\u00e9es +label.list-title=Objet +label.custom-metadata=M\u00e9tadonn\u00e9es personnalis\u00e9es +label.selection-list=Liste de s\u00e9lection +label.label=Nom +label.use-list=Utiliser la liste de s\u00e9lection +label.mandatory=Obligatoire + +label.datatype.unknown=Inconnu +label.datatype.text=Texte +label.datatype.boolean=Case \u00e0 cocher +label.datatype.date=Date + +message.getpropertiesfail=Impossible de r\u00e9cup\u00e9rer les d\u00e9finitions de m\u00e9tadonn\u00e9es personnalis\u00e9es. +message.noproperties=Vous n'avez pas encore d\u00e9fini de m\u00e9tadonn\u00e9e personnalis\u00e9e. +message.create-success=La nouvelle m\u00e9tadonn\u00e9e personnalis\u00e9e a bien \u00e9t\u00e9 ajout\u00e9e. +message.create-failure=Impossible d''ajouter la nouvelle m\u00e9tadonn\u00e9e personnalis\u00e9e {0}. Contactez votre DSI. +message.edit-success=La m\u00e9tadonn\u00e9e personnalis\u00e9e a bien \u00e9t\u00e9 enregistr\u00e9e. +message.edit-failure=Impossible d''enregistrer la m\u00e9tadonn\u00e9e personnalis\u00e9e {0}. Contactez votre DSI. +message.delete.title=Supprimer la m\u00e9tadonn\u00e9e personnalis\u00e9e +message.delete.text=Si vous supprimez {0}, cet \u00e9l\u00e9ment ne sera plus disponible lorsque vous modifierez les documents d''archives. +message.delete-success=La m\u00e9tadonn\u00e9e personnalis\u00e9e a bien \u00e9t\u00e9 supprim\u00e9e. +message.delete-failure=Impossible de supprimer la m\u00e9tadonn\u00e9e personnalis\u00e9e {0}. Contactez votre DSI. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Nouveau diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_it.properties new file mode 100644 index 0000000000..e9e6f8aba1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_it.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Metadati personalizzati +label.create-metadata-title=Nuovi metadati +label.edit-metadata-title=Modifica metadati personalizzati +label.list-title=Oggetto +label.custom-metadata=Metadati personalizzati +label.selection-list=Elenco di selezione +label.label=Nome +label.use-list=Utilizza elenco di selezione +label.mandatory=Obbligatorio + +label.datatype.unknown=Sconosciuto +label.datatype.text=Testo +label.datatype.boolean=Casella di controllo +label.datatype.date=Data + +message.getpropertiesfail=Impossibile recuperare definizioni di propriet\u00e0 personalizzate. +message.noproperties=Non \u00e8 stata ancora definita alcuna propriet\u00e0 personalizzata. +message.create-success=Aggiunta nuova propriet\u00e0 personalizzata riuscita. +message.create-failure=Impossibile aggiungere nuova propriet\u00e0 personalizzata {0}. Contattare il proprio reparto IT. +message.edit-success=Salvataggio propriet\u00e0 personalizzata riuscito. +message.edit-failure=Impossibile salvare propriet\u00e0 personalizzata {0}. Contattare il proprio reparto IT. +message.delete.title=Elimina propriet\u00e0 personalizzata +message.delete.text=Eliminando {0} essa non sar\u00e0 disponibile al momento della modifica dei record. +message.delete-success=Eliminazione propriet\u00e0 personalizzata riuscita. +message.delete-failure=Impossibile eliminare propriet\u00e0 personalizzata {0}. Contattare il proprio reparto IT. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Nuovo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_ja.properties new file mode 100644 index 0000000000..84270e4721 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_ja.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=\u30ab\u30b9\u30bf\u30e0\u30e1\u30bf\u30c7\u30fc\u30bf +label.create-metadata-title=\u65b0\u3057\u3044\u30e1\u30bf\u30c7\u30fc\u30bf +label.edit-metadata-title=\u30ab\u30b9\u30bf\u30e0\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u7de8\u96c6 +label.list-title=\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 +label.custom-metadata=\u30ab\u30b9\u30bf\u30e0\u30e1\u30bf\u30c7\u30fc\u30bf +label.selection-list=\u9078\u629e\u30ea\u30b9\u30c8 +label.label=\u540d\u524d +label.use-list=\u9078\u629e\u30ea\u30b9\u30c8\u306e\u4f7f\u7528 +label.mandatory=\u5fc5\u9808 + +label.datatype.unknown=\u4e0d\u660e +label.datatype.text=\u30c6\u30ad\u30b9\u30c8 +label.datatype.boolean=\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9 +label.datatype.date=\u65e5\u4ed8 + +message.getpropertiesfail=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u5b9a\u7fa9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.noproperties=\u307e\u3060\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +message.create-success=\u65b0\u3057\u3044\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +message.create-failure=\u65b0\u3057\u3044\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3 ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-success=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002 +message.edit-failure=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3 ''{0}'' \u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.delete.title=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u524a\u9664 +message.delete.text=''{0}'' \u3092\u524a\u9664\u3059\u308b\u3068\u3001\u30ec\u30b3\u30fc\u30c9\u306e\u7de8\u96c6\u6642\u306b\u4f7f\u7528\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002 +message.delete-success=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.delete-failure=\u30ab\u30b9\u30bf\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3 ''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=\u65b0\u898f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_nb.properties new file mode 100644 index 0000000000..9c83e4a867 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_nb.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Tilpassede metadata +label.create-metadata-title=Nye metadata +label.edit-metadata-title=Rediger tilpassede metadata +label.list-title=Objekt +label.custom-metadata=Tilpassede metadata +label.selection-list=Valgliste +label.label=Navn +label.use-list=Bruk valgliste +label.mandatory=Obligatorisk + +label.datatype.unknown=Ukjent +label.datatype.text=Tekst +label.datatype.boolean=Avkrysningsboks +label.datatype.date=Dato + +message.getpropertiesfail=Kunne ikke hente tilpassede egenskapsdefinisjoner. +message.noproperties=Det er enn\u00e5 ikke definert noen tilpassede egenskaper. +message.create-success=Ny tilpasset egenskap er n\u00e5 lagt til. +message.create-failure=Kunne ikke legge til ny tilpasset egenskap {0}. Kontakt din IT- avdeling. +message.edit-success=Tilpasset egenskap er n\u00e5 lagret. +message.edit-failure=Kunne ikke lagre tilpasset egenskap {0}. Kontakt din IT- avdeling. +message.delete.title=Slett tilpasset egenskap +message.delete.text=Hvis {0} slettes, vil den ikke v\u00e6re tilgjengelig n\u00e5r du redigerer registreringer. +message.delete-success=Tilpasset egenskap er n\u00e5 slettet. +message.delete-failure=Kunne ikke slette tilpasset egenskap {0}. Kontakt din IT- avdeling. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Ny diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_nl.properties new file mode 100755 index 0000000000..287a5e7954 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_nl.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Aangepaste metagegevens +label.create-metadata-title=Nieuwe metagegevens +label.edit-metadata-title=Aangepaste metagegevens bewerken +label.list-title=Object +label.custom-metadata=Aangepaste metagegevens +label.selection-list=Selectielijst +label.label=Naam +label.use-list=Selectielijst gebruiken +label.mandatory=Verplicht + +label.datatype.unknown=Onbekend +label.datatype.text=Tekst +label.datatype.boolean=Selectievakje +label.datatype.date=Datum + +message.getpropertiesfail=Kan definities van aangepaste eigenschap niet ophalen. +message.noproperties=U hebt nog geen aangepaste eigenschappen gedefinieerd. +message.create-success=Nieuwe aangepaste eigenschap toegevoegd. +message.create-failure=Kan nieuwe aangepaste eigenschap {0} niet toevoegen. Neem contact op met uw IT-afdeling +message.edit-success=Aangepaste eigenschap opgeslagen. +message.edit-failure=Kan aangepaste eigenschap {0} niet opslaan. Neem contact op met uw IT-afdeling +message.delete.title=Aangepaste eigenschap verwijderen +message.delete.text=Als u {0} verwijdert, is deze niet beschikbaar wanneer u archiefstukken bewerkt. +message.delete-success=Aangepaste eigenschap verwijderd. +message.delete-failure=Kan aangepaste eigenschap {0} niet verwijderen. Neem contact op met uw IT-afdeling + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Nieuw diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_pt_BR.properties new file mode 100644 index 0000000000..b142c9495c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_pt_BR.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=Metadados personalizados +label.create-metadata-title=Novos metadados +label.edit-metadata-title=Editar metadados personalizados +label.list-title=Objeto +label.custom-metadata=Metadados personalizados +label.selection-list=Lista de sele\u00e7\u00e3o +label.label=Nome +label.use-list=Usar lista de sele\u00e7\u00e3o +label.mandatory=Obrigat\u00f3rio + +label.datatype.unknown=Desconhecido +label.datatype.text=Texto +label.datatype.boolean=Caixa de sele\u00e7\u00e3o +label.datatype.date=Data + +message.getpropertiesfail=N\u00e3o foi poss\u00edvel recuperar defini\u00e7\u00f5es de propriedade personalizada. +message.noproperties=Voc\u00ea ainda n\u00e3o definiu propriedades personalizadas. +message.create-success=Nova propriedade personalizada adicionada com sucesso. +message.create-failure=N\u00e3o foi poss\u00edvel adicionar a nova propriedade personalizada {0}. Entre em contato com o Dept. de TI. +message.edit-success=Propriedade personalizada salva com sucesso. +message.edit-failure=N\u00e3o foi poss\u00edvel salvar a propriedade personalizada {0}. Entre em contato com o Dept. de TI. +message.delete.title=Excluir propriedade personalizada +message.delete.text=Se voc\u00ea excluir {0}, isso n\u00e3o estar\u00e1 dispon\u00edvel quando voc\u00ea editar documentos arquiv\u00edsticos. +message.delete-success=Propriedade personalizada exclu\u00edda com sucesso. +message.delete-failure=N\u00e3o foi poss\u00edvel excluir a propriedade personalizada {0}. Entre em contato com o Dept. de TI. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=Novo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_ru.properties new file mode 100644 index 0000000000..f5e6b56d9a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_ru.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +label.create-metadata-title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +label.edit-metadata-title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +label.list-title=\u041e\u0431\u044a\u0435\u043a\u0442 +label.custom-metadata=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +label.selection-list=\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 +label.label=\u0418\u043c\u044f +label.use-list=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 +label.mandatory=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e + +label.datatype.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e +label.datatype.text=\u0422\u0435\u043a\u0441\u0442 +label.datatype.boolean=\u0424\u043b\u0430\u0436\u043e\u043a +label.datatype.date=\u0414\u0430\u0442\u0430 + +message.getpropertiesfail=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. +message.noproperties=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0435\u0449\u0435 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b. +message.create-success=\u041d\u043e\u0432\u043e\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e. +message.create-failure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e {0}. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.edit-success=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e. +message.edit-failure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e {0}. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e +message.delete.text=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}, \u0438\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. +message.delete-success=\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e. +message.delete-failure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e {0}. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=\u041d\u043e\u0432\u044b\u0439 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_zh_CN.properties new file mode 100644 index 0000000000..e3aae09619 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-custom-metadata.get_zh_CN.properties @@ -0,0 +1,30 @@ +label.custom-metadata-title=\u81ea\u5b9a\u4e49\u5143\u6570\u636e +label.create-metadata-title=\u65b0\u7684\u5143\u6570\u636e +label.edit-metadata-title=\u7f16\u8f91\u81ea\u5b9a\u4e49\u5143\u6570\u636e +label.list-title=\u5bf9\u8c61 +label.custom-metadata=\u81ea\u5b9a\u4e49\u5143\u6570\u636e +label.selection-list=\u9009\u62e9\u5217\u8868 +label.label=\u540d\u79f0 +label.use-list=\u4f7f\u7528\u9009\u62e9\u5217\u8868 +label.mandatory=\u5fc5\u586b + +label.datatype.unknown=\u672a\u77e5 +label.datatype.text=\u6587\u672c +label.datatype.boolean=\u6838\u53d6\u65b9\u5757 +label.datatype.date=\u65e5\u671f + +message.getpropertiesfail=\u6211\u4eec\u65e0\u6cd5\u68c0\u7d22\u81ea\u5b9a\u4e49\u5c5e\u6027\u5b9a\u4e49\u3002 +message.noproperties=\u60a8\u5c1a\u672a\u5b9a\u4e49\u4efb\u4f55\u81ea\u5b9a\u4e49\u5c5e\u6027\u3002 +message.create-success=\u5df2\u6210\u529f\u6dfb\u52a0\u65b0\u7684\u81ea\u5b9a\u4e49\u5c5e\u6027\u3002 +message.create-failure=\u6211\u4eec\u65e0\u6cd5\u6dfb\u52a0\u65b0\u7684\u81ea\u5b9a\u4e49\u5c5e\u6027\uff1a{0}\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.edit-success=\u5df2\u6210\u529f\u4fdd\u5b58\u81ea\u5b9a\u4e49\u5c5e\u6027\u3002 +message.edit-failure=\u6211\u4eec\u65e0\u6cd5\u4fdd\u5b58\u81ea\u5b9a\u4e49\u5c5e\u6027\uff1a{0}\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.delete.title=\u5220\u9664\u81ea\u5b9a\u4e49\u5c5e\u6027 +message.delete.text=\u5982\u679c\u60a8\u5220\u9664 {0}\uff0c\u5219\u5728\u60a8\u7f16\u8f91\u8bb0\u5f55\u65f6\u5176\u5c06\u4e0d\u53ef\u7528\u3002 +message.delete-success=\u5df2\u6210\u529f\u5220\u9664\u81ea\u5b9a\u4e49\u5c5e\u6027\u3002 +message.delete-failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u81ea\u5b9a\u4e49\u5c5e\u6027\uff1a{0}\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 + +mandatory.true=True +mandatory.false=False + +button.new.custom-metadata=\u65b0\u5efa diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.desc.xml new file mode 100644 index 0000000000..a9bc628f04 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Record Management Define Roles + Administration Console - Record Management Tool Define Roles + /rm/components/console/define-roles + rm-console + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.head.ftl new file mode 100644 index 0000000000..511310d9b1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-define-roles.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-define-roles.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.html.ftl new file mode 100644 index 0000000000..7d53318551 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.html.ftl @@ -0,0 +1,134 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> +<#if (action='new' || action='edit')> + + + +
+ <#if (action='new')> +

${msg('label.new-role')}

+ <#else> +

${msg('label.edit-role')}

+ + +
+
+ + +
+ +

${msg('label.capabilities')}

+ + <#list groupedCapabilities as groupedCapabilities> + <#assign + groupedCapabilitiesKeys = groupedCapabilities?keys + index = groupedCapabilities_index + 1 + > + <#if (index < 10)> + <#assign index = "0" + index> + + <#assign + prefix = "group${index}" + buttonId = "${prefix}SelectAll" + capabilitiesId = "${prefix}Capabilities" + > +
+ +
+ <#list groupedCapabilitiesKeys?sort as groupedCapabilitiesKey> + ${groupedCapabilities[groupedCapabilitiesKey].groupTitle} +
    + <#assign capabilities = groupedCapabilities[groupedCapabilitiesKey].capabilities> + <#list capabilities?keys?sort as capabilitiesKey> +
  • + +
+ +
+
+ + +
+ + +
+
+ +
+ +<#else> + + + +
+ +
+ +

${msg('label.roles')}

+
+
+
+
+

${msg('label.roles')}

+
+
+
    +
+
+
+ +
+
+
+ +
+
+ +
+
${msg('label.capabilities')}
+
+
+
    +
+
+
+
+
+ + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.js new file mode 100644 index 0000000000..d5676d54cd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.js @@ -0,0 +1,46 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + model.action = page.url.args.action || 'view'; + model.roleId = page.url.args.roleId || null; + + var conn = remote.connect("alfresco"); + + // test user capabilities - can they access Define Roles? + model.hasAccess = hasCapability(conn, "CreateModifyDestroyRoles"); + + if (model.hasAccess) + { + model.groupedCapabilities = getGroupedCapabilities(conn); + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.properties new file mode 100644 index 0000000000..d7d1388be7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=We couldn't retrieve user roles {0}. Contact your I.T. Dept. +message.get-role-failure=We couldn't retrieve capabilities for role {0}. Contact your I.T. Dept. +message.delete.success=Successfully deleted the role. +message.delete.failure=We couldn't delete the role. Contact your I.T. Dept. +message.edit-success=Successfully updated the role. +message.edit-failure=We couldn't update the role. Contact your I.T. Dept. +message.create-success=Successfully created the role. +message.create-failure=We couldn't create the role. Contact your I.T. Dept. + +label.roles=Roles +label.select-all=Select All +label.deselect-all=Deselect All + +label.new-role=New Role +label.edit-role=Edit Role +label.delete-role=Delete Role +label.name=Name + +label.capabilities=Capabilities + +label.create=Create +label.create-another=Create and Create Another +label.cancel=Cancel +label.save=Save + +label.confirm-delete-title=Delete Role +label.confirm-delete-message=Are you sure you want to delete this role? \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_de.properties new file mode 100644 index 0000000000..c63c0c3c25 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_de.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=Folgende Benutzerrollen konnten nicht abgerufen werden: {0}. Kontakten Sie Ihre IT-Abteilung. +message.get-role-failure=Funktionen f\u00fcr folgende Rolle konnten nicht abgerufen werden: {0}. Kontakten Sie Ihre IT-Abteilung. +message.delete.success=Rolle erfolgreich gel\u00f6scht. +message.delete.failure=Rolle konnte nicht gel\u00f6scht werden. Kontakten Sie Ihre IT-Abteilung. +message.edit-success=Rolle erfolgreich aktualisiert. +message.edit-failure=Rolle konnte nicht aktualisiert werden. Kontakten Sie Ihre IT-Abteilung. +message.create-success=Rolle erfolgreich erstellt. +message.create-failure=Rolle konnte nicht erstellt werden. Kontakten Sie Ihre IT-Abteilung. + +label.roles=Rollen +label.select-all=Alles ausw\u00e4hlen +label.deselect-all=Auswahl aufheben + +label.new-role=Neue Rolle +label.edit-role=Rolle bearbeiten +label.delete-role=Rolle l\u00f6schen +label.name=Name + +label.capabilities=Funktionen + +label.create=Erstellen +label.create-another=Erstellen und eine weitere erstellen +label.cancel=Abbrechen +label.save=Speichern + +label.confirm-delete-title=Rolle l\u00f6schen +label.confirm-delete-message=M\u00f6chten Sie diese Rolle wirklich l\u00f6schen? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_es.properties new file mode 100755 index 0000000000..2729a99f7c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_es.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=No se pudieron recuperar las funciones de usuario {0}. P\u00f3ngase en contacto con el dep. de TI. +message.get-role-failure=No se pudieron recuperar las capacidades para el rol {0}. P\u00f3ngase en contacto con el dep. de TI. +message.delete.success=Usuario eliminado correctamente. +message.delete.failure=No se pudo eliminar el rol. P\u00f3ngase en contacto con el dep. de TI. +message.edit-success=Usuario actualizado correctamente. +message.edit-failure=No se pudo actualizar el rol. P\u00f3ngase en contacto con el dep. de TI. +message.create-success=Rol creado correctamente. +message.create-failure=No se pudo crear el rol. P\u00f3ngase en contacto con el dep. de TI. + +label.roles=Funciones +label.select-all=Seleccionar todo +label.deselect-all=Deseleccionar todo + +label.new-role=Nuevo rol +label.edit-role=Editar rol +label.delete-role=Eliminar rol +label.name=Nombre + +label.capabilities=Capacidades + +label.create=Crear +label.create-another=Crear y crear otro +label.cancel=Cancelar +label.save=Guardar + +label.confirm-delete-title=Eliminar rol +label.confirm-delete-message=\u00bfEst\u00e1 seguro de que desea eliminar este rol? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_fr.properties new file mode 100644 index 0000000000..915fe0d968 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_fr.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=Impossible de r\u00e9cup\u00e9rer les r\u00f4les utilisateur {0}. Contactez votre DSI. +message.get-role-failure=Impossible de r\u00e9cup\u00e9rer les capacit\u00e9s pour le r\u00f4le {0}. Contactez votre DSI. +message.delete.success=Le r\u00f4le a bien \u00e9t\u00e9 supprim\u00e9. +message.delete.failure=Impossible de supprimer le r\u00f4le. Contactez votre DSI. +message.edit-success=Le r\u00f4le a bien \u00e9t\u00e9 mis \u00e0 jour. +message.edit-failure=Impossible de mettre \u00e0 jour le r\u00f4le. Contactez votre DSI. +message.create-success=Le r\u00f4le a bien \u00e9t\u00e9 cr\u00e9\u00e9. +message.create-failure=Impossible de cr\u00e9er le r\u00f4le. Contactez votre DSI. + +label.roles=R\u00f4les +label.select-all=Tout s\u00e9lectionner +label.deselect-all=D\u00e9s\u00e9lectionner tout + +label.new-role=Nouveau r\u00f4le +label.edit-role=Modifier r\u00f4le +label.delete-role=Supprimer r\u00f4le +label.name=Nom + +label.capabilities=Capacit\u00e9s + +label.create=Cr\u00e9er +label.create-another=Cr\u00e9er et cr\u00e9er un autre +label.cancel=Annuler +label.save=Enregistrer + +label.confirm-delete-title=Supprimer r\u00f4le +label.confirm-delete-message=Voulez-vous vraiment supprimer ce r\u00f4le\u00a0? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_it.properties new file mode 100644 index 0000000000..71687ba296 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_it.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=Impossibile recuperare ruoli utente {0}. Contattare il proprio reparto IT. +message.get-role-failure=Impossibile recuperare funzioni per ruolo {0}. Contattare il proprio reparto IT. +message.delete.success=Eliminazione ruolo riuscita. +message.delete.failure=Impossibile eliminare il ruolo. Contattare il proprio reparto IT. +message.edit-success=Aggiornamento ruolo riuscito. +message.edit-failure=Impossibile aggiornare il ruolo. Contattare il proprio reparto IT. +message.create-success=Creazione ruolo riuscita. +message.create-failure=Impossibile creare il ruolo. Contattare il proprio reparto IT. + +label.roles=Ruoli +label.select-all=Seleziona tutto +label.deselect-all=Deseleziona tutto + +label.new-role=Nuovo ruolo +label.edit-role=Modifica ruolo +label.delete-role=Elimina ruolo +label.name=Nome + +label.capabilities=Funzioni + +label.create=Crea +label.create-another=Crea e crea un altro +label.cancel=Annulla +label.save=Salva + +label.confirm-delete-title=Elimina ruolo +label.confirm-delete-message=Procedere con l'eliminazione di questo ruolo? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_ja.properties new file mode 100644 index 0000000000..f4cc651b03 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_ja.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=\u30e6\u30fc\u30b6\u30fc\u306e\u5f79\u5272 ''{0}'' \u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.get-role-failure=\u5f79\u5272 ''{0}'' \u306e\u6a29\u9650\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.delete.success=\u5f79\u5272\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.delete.failure=\u5f79\u5272\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-success=\u5f79\u5272\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002 +message.edit-failure=\u5f79\u5272\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.create-success=\u5f79\u5272\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002 +message.create-failure=\u5f79\u5272\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IT\u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.roles=\u5f79\u5272 +label.select-all=\u3059\u3079\u3066\u9078\u629e +label.deselect-all=\u3059\u3079\u3066\u306e\u9078\u629e\u3092\u89e3\u9664 + +label.new-role=\u65b0\u3057\u3044\u5f79\u5272 +label.edit-role=\u5f79\u5272\u306e\u7de8\u96c6 +label.delete-role=\u5f79\u5272\u306e\u524a\u9664 +label.name=\u540d\u524d + +label.capabilities=\u6a29\u9650 + +label.create=\u4f5c\u6210 +label.create-another=\u9023\u7d9a\u4f5c\u6210 +label.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +label.save=\u4fdd\u5b58 + +label.confirm-delete-title=\u5f79\u5272\u306e\u524a\u9664 +label.confirm-delete-message=\u3053\u306e\u5f79\u5272\u3092\u524a\u9664\u3057\u307e\u3059\u304b? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_nb.properties new file mode 100644 index 0000000000..eeae0e20a2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_nb.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=Kunne ikke hente brukerroller {0}. Kontakt din IT- avdeling. +message.get-role-failure=Kunne ikke hente kapasiteter for rollen {0}. Kontakt din IT- avdeling. +message.delete.success=Rollen er n\u00e5 slettet. +message.delete.failure=Mislyktes i \u00e5 slette rollen. Kontakt din IT- avdeling. +message.edit-success=Rollen er n\u00e5 oppdatert. +message.edit-failure=Kunne ikke oppdatere rollen. Kontakt din IT- avdeling. +message.create-success=Rollen er n\u00e5 opprettet. +message.create-failure=Kunne ikke opprette rollen. Kontakt din IT- avdeling. + +label.roles=Roller +label.select-all=Velg alle +label.deselect-all=Velg bort alle + +label.new-role=Ny rolle +label.edit-role=Rediger rolle +label.delete-role=Slett rolle +label.name=Navn + +label.capabilities=Kapasiteter + +label.create=Opprett +label.create-another=Opprett og Opprett ny +label.cancel=Avbryt +label.save=Lagre + +label.confirm-delete-title=Slett rolle +label.confirm-delete-message=Er du sikker p\u00e5 at du vil slette denne rollen? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_nl.properties new file mode 100755 index 0000000000..a33e42ed7a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_nl.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=Kan gebruikersrollen {0} niet ophalen. Neem contact op met uw IT-afdeling +message.get-role-failure=Kan geen mogelijkheden ophalen voor rol {0}. Neem contact op met uw IT-afdeling +message.delete.success=De rol is verwijderd. +message.delete.failure=Kan de rol niet verwijderen. Neem contact op met uw IT-afdeling +message.edit-success=De rol is bijgewerkt. +message.edit-failure=Kan de rol niet bijwerken. Neem contact op met uw IT-afdeling +message.create-success=De rol is gemaakt. +message.create-failure=Kan de rol niet maken. Neem contact op met uw IT-afdeling + +label.roles=Rollen +label.select-all=Alles selecteren +label.deselect-all=Alle selecties opheffen + +label.new-role=Nieuwe rol +label.edit-role=Rol bewerken +label.delete-role=Rol verwijderen +label.name=Naam + +label.capabilities=Mogelijkheden + +label.create=Maken +label.create-another=Maken en nog \u00e9\u00e9n maken +label.cancel=Annuleren +label.save=Opslaan + +label.confirm-delete-title=Rol verwijderen +label.confirm-delete-message=Weet u zeker dat u deze rol wilt verwijderen? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_pt_BR.properties new file mode 100644 index 0000000000..714b5df2c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_pt_BR.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=N\u00e3o foi poss\u00edvel recuperar as fun\u00e7\u00f5es de usu\u00e1rio {0}. Entre em contato com o Dept. de TI. +message.get-role-failure=N\u00e3o foi poss\u00edvel recuperar as capacidades da fun\u00e7\u00e3o {0}. Entre em contato com o departamento de TI. +message.delete.success=A fun\u00e7\u00e3o foi exclu\u00edda com sucesso. +message.delete.failure=N\u00e3o foi poss\u00edvel excluir a fun\u00e7\u00e3o. Entre em contato com o departamento de TI. +message.edit-success=A fun\u00e7\u00e3o foi atualizada com sucesso. +message.edit-failure=N\u00e3o foi poss\u00edvel atualizar a fun\u00e7\u00e3o. Entre em contato com o departamento de TI. +message.create-success=A fun\u00e7\u00e3o foi criada com sucesso. +message.create-failure=N\u00e3o foi poss\u00edvel criar a fun\u00e7\u00e3o. Entre em contato com o departamento de TI. + +label.roles=Fun\u00e7\u00f5es +label.select-all=Selecionar tudo +label.deselect-all=Desmarcar tudo + +label.new-role=Nova fun\u00e7\u00e3o +label.edit-role=Editar fun\u00e7\u00e3o +label.delete-role=Excluir fun\u00e7\u00e3o +label.name=Nome + +label.capabilities=Capacidades + +label.create=Criar +label.create-another=Criar e criar outra +label.cancel=Cancelar +label.save=Salvar + +label.confirm-delete-title=Excluir fun\u00e7\u00e3o +label.confirm-delete-message=Tem certeza de que deseja excluir essa fun\u00e7\u00e3o? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_ru.properties new file mode 100644 index 0000000000..0da1c3ee8c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_ru.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 {0}. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.get-role-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u043e\u043b\u0438 {0} \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.delete.success=\u0420\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430. +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u043b\u044c. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.edit-success=\u0420\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430. +message.edit-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u043e\u043b\u044c. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.create-success=\u0420\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430. +message.create-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u044c. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. + +label.roles=\u0420\u043e\u043b\u0438 +label.select-all=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 +label.deselect-all=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0432\u0441\u0435\u0433\u043e + +label.new-role=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u044c +label.edit-role=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u044c +label.delete-role=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u043b\u044c +label.name=\u0418\u043c\u044f + +label.capabilities=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 + +label.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c +label.create-another=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 +label.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +label.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c + +label.confirm-delete-title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u043b\u044c +label.confirm-delete-message=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0440\u043e\u043b\u044c? diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_zh_CN.properties new file mode 100644 index 0000000000..13c0f6413c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-define-roles.get_zh_CN.properties @@ -0,0 +1,27 @@ +message.get-roles-failure=\u6211\u4eec\u65e0\u6cd5\u68c0\u7d22\u7528\u6237\u89d2\u8272\uff1a{0}\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.get-role-failure=\u6211\u4eec\u65e0\u6cd5\u68c0\u7d22\u89d2\u8272\u804c\u80fd\uff1a{0} \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.delete.success=\u5df2\u6210\u529f\u5220\u9664\u89d2\u8272\u3002 +message.delete.failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u6b64\u6a58\u8272\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.edit-success=\u5df2\u6210\u529f\u66f4\u65b0\u89d2\u8272\u3002 +message.edit-failure=\u6211\u4eec\u65e0\u6cd5\u66f4\u65b0\u89d2\u8272\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.create-success=\u5df2\u6210\u529f\u521b\u5efa\u89d2\u8272\u3002 +message.create-failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u89d2\u8272\u3002 \u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 + +label.roles=\u89d2\u8272 +label.select-all=\u9009\u62e9\u5168\u90e8 +label.deselect-all=\u53d6\u6d88\u5168\u9009 + +label.new-role=\u65b0\u5efa\u89d2\u8272 +label.edit-role=\u7f16\u8f91\u89d2\u8272 +label.delete-role=\u5220\u9664\u89d2\u8272 +label.name=\u540d\u79f0 + +label.capabilities=\u804c\u80fd + +label.create=\u521b\u5efa +label.create-another=\u521b\u5efa\u5e76\u521b\u5efa\u53e6\u4e00\u4e2a +label.cancel=\u53d6\u6d88 +label.save=\u4fdd\u5b58 + +label.confirm-delete-title=\u5220\u9664\u89d2\u8272 +label.confirm-delete-message=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u8be5\u89d2\u8272\uff1f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.desc.xml new file mode 100644 index 0000000000..58e76cbb05 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Email Mappings + Administration Console - Email Mappings + /rm/components/console/email-mappings + rm-console + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.head.ftl new file mode 100644 index 0000000000..785e94f3ee --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.head.ftl @@ -0,0 +1,33 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/menu/assets/menu.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/datatable/assets/datatable.css" /> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-email-mappings.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/js/property-menu.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-email-mappings.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.html.ftl new file mode 100644 index 0000000000..4c4b225ac2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.html.ftl @@ -0,0 +1,73 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.js new file mode 100644 index 0000000000..23a87982c8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.js @@ -0,0 +1,57 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + var conn = remote.connect("alfresco"); + + // test user capabilities - can they access Email Mappings? + var hasAccess = hasCapability(conn, "MapEmailMetadata"); + if (hasAccess) + { + var groups = []; + var res = conn.get("/slingshot/rmsearchproperties"); // TODO we should be passing the file plan here + if (res.status == 200) + { + groups = eval('(' + res + ')').data.groups; + } + model.groups = groups; + + var emailmapkeys = []; + var result = conn.get("/api/rma/admin/emailmapkeys"); + if (result.status == 200) + { + emailmapkeys = eval('(' + result + ')').data.emailmapkeys; + } + model.emailmapkeys = emailmapkeys; + } + model.hasAccess = hasAccess; +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.properties new file mode 100644 index 0000000000..516d8bb512 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get.properties @@ -0,0 +1,13 @@ +label.email-mappings=Email Mappings +label.add=Add +label.delete=Delete +label.to=to +label.map=Map +label.select-email=Select email property + +message.loadFailure=We couldn't load email mappings +message.saveFailure=We couldn't save email mappings +message.saveSuccess=New mappings saved +message.delete.mapping.title=Delete Mapping +message.delete.mapping.text=If you delete mapping '{0}' then related email metadata won't be recorded. +message.deleted=Mapping successfully deleted \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_de.properties new file mode 100644 index 0000000000..4964b9027f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_de.properties @@ -0,0 +1,13 @@ +label.email-mappings=E-Mail-Zuordnungen +label.add=Hinzuf\u00fcgen +label.delete=L\u00f6schen +label.to=an +label.map=Zuordnen +label.select-email=E-Mail-Eigenschaft ausw\u00e4hlen + +message.loadFailure=E-Mail-Zuordnungen konnten nicht geladen werden. +message.saveFailure=E-Mail-Zuordnungen konnten nicht gespeichert werden. +message.saveSuccess=Neue Zuordnungen gespeichert +message.delete.mapping.title=Zuordnung l\u00f6schen +message.delete.mapping.text=Wenn Sie die Zuordnung ''{0}'' l\u00f6schen, werden die zugeh\u00f6rigen E-Mail-Metadaten nicht als Record deklariert. +message.deleted=Zuordnung erfolgreich gel\u00f6scht diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_es.properties new file mode 100755 index 0000000000..0635b59cc3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_es.properties @@ -0,0 +1,13 @@ +label.email-mappings=Asignaciones de correo electr\u00f3nico +label.add=A\u00f1adir +label.delete=Eliminar +label.to=a +label.map=Mapa +label.select-email=Seleccione propiedad de correo electr\u00f3nico + +message.loadFailure=No se pudieron cargar las asignaciones de correo electr\u00f3nico +message.saveFailure=No se pudieron guardar las asignaciones de correo electr\u00f3nico +message.saveSuccess=Nuevas asignaciones guardadas +message.delete.mapping.title=Eliminar asignaciones +message.delete.mapping.text=Si elimina la asignaci\u00f3n ''{0}'', los metadatos de correo electr\u00f3nico relacionados no se guardar\u00e1n como documentos de archivo. +message.deleted=Asignaci\u00f3n eliminada correctamente. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_fr.properties new file mode 100644 index 0000000000..37a81ddf42 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_fr.properties @@ -0,0 +1,13 @@ +label.email-mappings=Configurations emails +label.add=Ajouter +label.delete=Supprimer +label.to=\u00e0 +label.map=Carte +label.select-email=S\u00e9lectionner la propri\u00e9t\u00e9 d'email + +message.loadFailure=Impossible de charger les configurations emails +message.saveFailure=Impossible d'enregistrer les configurations emails +message.saveSuccess=Nouvelles configurations enregistr\u00e9es +message.delete.mapping.title=Supprimer la configuration +message.delete.mapping.text=Si vous supprimez la configuration ''{0}'', les m\u00e9tadonn\u00e9es d''email associ\u00e9es ne seront pas enregistr\u00e9es. +message.deleted=La configuration a bien \u00e9t\u00e9 supprim\u00e9e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_it.properties new file mode 100644 index 0000000000..568b1e36f0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_it.properties @@ -0,0 +1,13 @@ +label.email-mappings=Mapping e-mail +label.add=Aggiungi +label.delete=Elimina +label.to=in +label.map=Mappa +label.select-email=Seleziona propriet\u00e0 e-mail + +message.loadFailure=Impossibile caricare mapping e-mail +message.saveFailure=Impossibile salvare mapping e-mail +message.saveSuccess=Nuovi mapping salvati +message.delete.mapping.title=Elimina mapping +message.delete.mapping.text=Eliminando mapping ''{0}'' i relativi metadati di e-mail non verranno registrati. +message.deleted=Eliminazione mapping riuscita diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_ja.properties new file mode 100644 index 0000000000..2ccf71c7aa --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_ja.properties @@ -0,0 +1,13 @@ +label.email-mappings=E \u30e1\u30fc\u30eb\u30de\u30c3\u30d4\u30f3\u30b0 +label.add=\u8ffd\u52a0 +label.delete=\u524a\u9664 +label.to=\u304b\u3089 +label.map=\u30de\u30c3\u30d7 +label.select-email=E \u30e1\u30fc\u30eb\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 + +message.loadFailure=E \u30e1\u30fc\u30eb\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f +message.saveFailure=E \u30e1\u30fc\u30eb\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.saveSuccess=\u65b0\u3057\u3044\u30de\u30c3\u30d4\u30f3\u30b0\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f +message.delete.mapping.title=\u30de\u30c3\u30d4\u30f3\u30b0\u306e\u524a\u9664 +message.delete.mapping.text=\u30de\u30c3\u30d4\u30f3\u30b0 ''{0}'' \u3092\u524a\u9664\u3059\u308b\u3068\u3001\u95a2\u9023\u3059\u308b E \u30e1\u30fc\u30eb\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u304c\u8a18\u9332\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 +message.deleted=\u30de\u30c3\u30d4\u30f3\u30b0\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_nb.properties new file mode 100644 index 0000000000..d02cd362eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_nb.properties @@ -0,0 +1,13 @@ +label.email-mappings=E-postkoblinger +label.add=Legg til +label.delete=Slett +label.to=til +label.map=Kart +label.select-email=Velg e-postegenskap + +message.loadFailure=Kunne ikke laste inn e-postkoblinger +message.saveFailure=Kunne ikke lagre e-postkoblinger +message.saveSuccess=Nye koblinger lagret +message.delete.mapping.title=Slett kobling +message.delete.mapping.text=Hvis du sletter koblingen ''{0}'', blir tilh\u00f8rende e-postmetadata ikke registrert. +message.deleted=Koblingen er n\u00e5 slettet diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_nl.properties new file mode 100755 index 0000000000..80b8fc3043 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_nl.properties @@ -0,0 +1,13 @@ +label.email-mappings=E-mailtoewijzingen +label.add=Toevoegen +label.delete=Verwijderen +label.to=aan +label.map=Toewijzen +label.select-email=E-maileigenschap selecteren + +message.loadFailure=Kan geen e-mailtoewijzingen laden +message.saveFailure=Kan geen e-mailtoewijzingen opslaan +message.saveSuccess=Nieuwe toewijzingen opgeslagen +message.delete.mapping.title=Toewijzing verwijderen +message.delete.mapping.text=Als u toewijzing ''{0}'' verwijdert, worden bijbehorende e-mailmetagegevens niet vastgelegd. +message.deleted=Toewijzing verwijderd diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_pt_BR.properties new file mode 100644 index 0000000000..64f8cfa8da --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_pt_BR.properties @@ -0,0 +1,13 @@ +label.email-mappings=Mapeamentos de e-mail +label.add=Adicionar +label.delete=Excluir +label.to=para +label.map=Mapear +label.select-email=Selecionar propriedade de e-mail + +message.loadFailure=N\u00e3o foi poss\u00edvel carregar mapeamentos de e-mail +message.saveFailure=N\u00e3o foi poss\u00edvel salvar mapeamentos de e-mail +message.saveSuccess=Novos mapeamentos salvos +message.delete.mapping.title=Excluir mapeamento +message.delete.mapping.text=Se voc\u00ea excluir o mapeamento ''{0}'', os metadados de e-mail relacionados n\u00e3o ser\u00e3o arquivados. +message.deleted=Mapeamento exclu\u00eddo com sucesso diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_ru.properties new file mode 100644 index 0000000000..9c7fc44084 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_ru.properties @@ -0,0 +1,13 @@ +label.email-mappings=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b +label.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c +label.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +label.to=\u043a\u0443\u0434\u0430 +label.map=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 +label.select-email=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b + +message.loadFailure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b +message.saveFailure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b +message.saveSuccess=\u041d\u043e\u0432\u044b\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b +message.delete.mapping.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 +message.delete.mapping.text=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 ''{0}'', \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. +message.deleted=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_zh_CN.properties new file mode 100644 index 0000000000..7a590e87b9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-email-mappings.get_zh_CN.properties @@ -0,0 +1,13 @@ +label.email-mappings=\u7535\u5b50\u90ae\u4ef6\u6620\u5c04 +label.add=\u6dfb\u52a0 +label.delete=\u5220\u9664 +label.to=\u81f3 +label.map=\u6620\u5c04 +label.select-email=\u9009\u62e9\u7535\u5b50\u90ae\u4ef6\u5c5e\u6027 + +message.loadFailure=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u7535\u5b50\u90ae\u4ef6\u6620\u5c04 +message.saveFailure=\u6211\u4eec\u65e0\u6cd5\u4fdd\u5b58\u7535\u5b50\u90ae\u4ef6\u6620\u5c04 +message.saveSuccess=\u5df2\u4fdd\u5b58\u65b0\u6620\u5c04 +message.delete.mapping.title=\u5220\u9664\u6620\u5c04 +message.delete.mapping.text=\u5982\u679c\u60a8\u5220\u9664\u6620\u5c04 ''{0}''\uff0c\u5219\u4e0d\u4f1a\u8bb0\u5f55\u76f8\u5173\u7535\u5b50\u90ae\u4ef6\u7684\u5143\u6570\u636e\u3002 +message.deleted=\u5df2\u6210\u529f\u5220\u9664\u6620\u5c04 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.desc.xml new file mode 100644 index 0000000000..236d1ac147 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Record Management Events + Administration Console - Record Management Tool Events + /components/console/rm-events + rm-console + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.head.ftl new file mode 100644 index 0000000000..6eca4cfee9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-events.css" /> +<@script type="text/javascript" src="${url.context}/res/components/console/consoletool.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-events.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.html.ftl new file mode 100644 index 0000000000..2ff10fc5b6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.html.ftl @@ -0,0 +1,115 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + + + + +<#assign el=args.htmlid> +
+ + + + + + + +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.js new file mode 100644 index 0000000000..f3a1bfa5f0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.js @@ -0,0 +1,90 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Sort helper function for objects with labels + * + * @param obj1 + * @param obj2 + */ +function sortByLabel(obj1, obj2) +{ + return (obj1.eventTypeDisplayLabel > obj2.eventTypeDisplayLabel) ? 1 : (obj1.eventTypeDisplayLabel < obj2.eventTypeDisplayLabel) ? -1 : 0; +} + +/** + * Main entry point for component webscript logic + * + * @method main + */ +function main() +{ + var conn = remote.connect("alfresco"); + + // test user capabilities - can they access Events? + model.hasAccess = hasCapability(conn, "CreateModifyDestroyEvents"); + + // retrieve event types + var repoResponse = conn.get("/api/rma/admin/rmeventtypes"); + if (repoResponse.status == 401) + { + status.setCode(repoResponse.status, "error.loggedOut"); + return; + } + else + { + var repoJSON = eval('(' + repoResponse + ')'); + + // Check if we got a positive result + if (repoJSON.data) + { + // Transform events from object to array and sort it + var data = repoJSON.data; + var eventTypes = []; + if (data) + { + for (var key in data) + { + eventTypes.push(data[key]); + } + eventTypes.sort(sortByLabel); + } + + // Set model values + model.eventTypes = eventTypes; + } + else if (repoJSON.status.code) + { + status.setCode(repoJSON.status.code, repoJSON.message); + return; + } + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.properties new file mode 100644 index 0000000000..16cebab598 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Events +label.createevent.title=New Event +label.editevent.title=Edit Event +label.general=General +label.label=Name +label.type=Type +label.required=Required Fields + +button.newevent=New Event + +message.confirm.removeevent.title=Remove Event +message.confirm.removeevent.text=Are you sure you want to remove ''{0}''? +message.removeevent.success=Successfully removed event. +message.removeevent.failure=We couldn't remove event. +message.saveevent.saving=Saving event... +message.loadevent.failure=We couldn't load data for the event. +message.loadevents.failure=We couldn't load the events. +message.loadevents.loading=Loading events... +message.empty=There are't any events set up. +message.error=We couldn't load the events. \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_de.properties new file mode 100644 index 0000000000..5ce14df328 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_de.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Ereignisse +label.createevent.title=Neues Ereignis +label.editevent.title=Ereignis bearbeiten +label.general=Allgemein +label.label=Name +label.type=Typ +label.required=Pflichtfelder + +button.newevent=Neues Ereignis + +message.confirm.removeevent.title=Ereignis entfernen +message.confirm.removeevent.text=M\u00f6chten Sie ''{0}'' wirklich entfernen? +message.removeevent.success=Ereignis erfolgreich entfernt. +message.removeevent.failure=Ereignis konnte nicht entfernt werden. +message.saveevent.saving=Ereignis wird gespeichert... +message.loadevent.failure=Daten f\u00fcr das Ereignis konnten nicht geladen werden. +message.loadevents.failure=Ereignisse konnten nicht geladen werden. +message.loadevents.loading=Ereignisse laden... +message.empty=Keine Ereignisse eingerichtet. +message.error=Ereignisse konnten nicht geladen werden. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_es.properties new file mode 100755 index 0000000000..e0073f0154 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_es.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Eventos +label.createevent.title=Nuevo evento +label.editevent.title=Editar evento +label.general=General +label.label=Nombre +label.type=Tipo +label.required=Campos requeridos + +button.newevent=Nuevo evento + +message.confirm.removeevent.title=Eliminar evento +message.confirm.removeevent.text=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}''? +message.removeevent.success=Evento eliminado correctamente. +message.removeevent.failure=No se pudo eliminar el evento. +message.saveevent.saving=Guardando evento... +message.loadevent.failure=No se pudieron cargar los datos para el evento. +message.loadevents.failure=No se pudieron cargar los eventos. +message.loadevents.loading=Cargando eventos... +message.empty=No hay ning\u00fan evento definido. +message.error=No se pudieron cargar los eventos. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_fr.properties new file mode 100644 index 0000000000..4d62f521d5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_fr.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Ev\u00e9nements +label.createevent.title=Nouvel \u00e9v\u00e9nement +label.editevent.title=Modifier l'\u00e9v\u00e9nement +label.general=G\u00e9n\u00e9ral +label.label=Nom +label.type=Type +label.required=Champs requis + +button.newevent=Nouvel \u00e9v\u00e9nement + +message.confirm.removeevent.title=Supprimer l'\u00e9v\u00e9nement +message.confirm.removeevent.text=Voulez-vous vraiment supprimer ''{0}'' ? +message.removeevent.success=L'\u00e9v\u00e9nement a bien \u00e9t\u00e9 supprim\u00e9. +message.removeevent.failure=Impossible de supprimer l'\u00e9v\u00e9nement. +message.saveevent.saving=Enregistrement en cours de l'\u00e9v\u00e9nement... +message.loadevent.failure=Impossible de charger les donn\u00e9es de l'\u00e9v\u00e9nement. +message.loadevents.failure=Impossible de charger les \u00e9v\u00e9nements. +message.loadevents.loading=Chargement des \u00e9v\u00e9nements... +message.empty=Aucun \u00e9v\u00e9nement configur\u00e9. +message.error=Impossible de charger les \u00e9v\u00e9nements. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_it.properties new file mode 100644 index 0000000000..33d1823399 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_it.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Eventi +label.createevent.title=Nuovo evento +label.editevent.title=Modifica evento +label.general=Generale +label.label=Nome +label.type=Tipo +label.required=Campi obbligatori + +button.newevent=Nuovo evento + +message.confirm.removeevent.title=Rimuovi evento +message.confirm.removeevent.text=Procedere con la rimozione di ''{0}''? +message.removeevent.success=Rimozione evento riuscita. +message.removeevent.failure=Impossibile rimuovere evento. +message.saveevent.saving=Salvataggio evento... +message.loadevent.failure=Impossibile caricare dati per l'evento. +message.loadevents.failure=Impossibile caricare gli eventi. +message.loadevents.loading=Caricamento eventi... +message.empty=Non ci sono eventi impostati. +message.error=Impossibile caricare gli eventi. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_ja.properties new file mode 100644 index 0000000000..980409541d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_ja.properties @@ -0,0 +1,20 @@ +label.viewevents.title=\u30a4\u30d9\u30f3\u30c8 +label.createevent.title=\u65b0\u898f\u30a4\u30d9\u30f3\u30c8 +label.editevent.title=\u30a4\u30d9\u30f3\u30c8\u306e\u7de8\u96c6 +label.general=\u4e00\u822c +label.label=\u540d\u524d +label.type=\u7a2e\u985e +label.required=\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 + +button.newevent=\u65b0\u898f\u30a4\u30d9\u30f3\u30c8 + +message.confirm.removeevent.title=\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664 +message.confirm.removeevent.text=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.removeevent.success=\u30a4\u30d9\u30f3\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.removeevent.failure=\u30a4\u30d9\u30f3\u30c8\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.saveevent.saving=\u30a4\u30d9\u30f3\u30c8\u3092\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059... +message.loadevent.failure=\u30a4\u30d9\u30f3\u30c8\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.loadevents.failure=\u30a4\u30d9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.loadevents.loading=\u30a4\u30d9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.empty=\u8a2d\u5b9a\u3059\u308b\u30a4\u30d9\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.error=\u30a4\u30d9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_nb.properties new file mode 100644 index 0000000000..90b4b11b0d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_nb.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Hendelser +label.createevent.title=Ny hendelse +label.editevent.title=Rediger hendelse +label.general=Generelt +label.label=Navn +label.type=Type +label.required=Obligatoriske felt + +button.newevent=Ny hendelse + +message.confirm.removeevent.title=Fjern hendelse +message.confirm.removeevent.text=Er du sikker p\u00e5 at du vil fjerne ''{0}''? +message.removeevent.success=Hendelsen er n\u00e5 fjernet. +message.removeevent.failure=Kunne ikke fjerne hendelsen. +message.saveevent.saving=Lagre hendelse... +message.loadevent.failure=Kunne ikke laste inn data fra hendelsen. +message.loadevents.failure=Kunne ikke laste inn hendelsene. +message.loadevents.loading=Laste hendelser... +message.empty=Det finnes ingen hendelser \u00e5 sette opp. +message.error=Kunne ikke laste inn hendelsene. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_nl.properties new file mode 100755 index 0000000000..e7a7252e5e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_nl.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Gebeurtenissen +label.createevent.title=Nieuwe gebeurtenis +label.editevent.title=Gebeurtenis bewerken +label.general=Algemeen +label.label=Naam +label.type=Type +label.required=Verplichte velden + +button.newevent=Nieuwe gebeurtenis + +message.confirm.removeevent.title=Gebeurtenis verwijderen +message.confirm.removeevent.text=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.removeevent.success=Gebeurtenis verwijderd. +message.removeevent.failure=Kan gebeurtenis niet verwijderen. +message.saveevent.saving=Gebeurtenis opslaan... +message.loadevent.failure=Kan de gegevens voor de gebeurtenis niet laden. +message.loadevents.failure=Kan de gebeurtenissen niet laden. +message.loadevents.loading=Gebeurtenissen laden... +message.empty=Er zijn geen gebeurtenissen ingesteld. +message.error=Kan de gebeurtenissen niet laden. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_pt_BR.properties new file mode 100644 index 0000000000..fe40ad8c71 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_pt_BR.properties @@ -0,0 +1,20 @@ +label.viewevents.title=Eventos +label.createevent.title=Novo evento +label.editevent.title=Editar evento +label.general=Geral +label.label=Nome +label.type=Tipo +label.required=Campos obrigat\u00f3rios + +button.newevent=Novo evento + +message.confirm.removeevent.title=Remover evento +message.confirm.removeevent.text=Tem certeza de que deseja remover ''{0}''? +message.removeevent.success=Evento removido com sucesso. +message.removeevent.failure=N\u00e3o foi poss\u00edvel remover o evento. +message.saveevent.saving=Salvando evento... +message.loadevent.failure=N\u00e3o foi poss\u00edvel carregar dados do evento. +message.loadevents.failure=N\u00e3o foi poss\u00edvel carregar os eventos. +message.loadevents.loading=Carregando eventos... +message.empty=N\u00e3o h\u00e1 eventos configurados. +message.error=N\u00e3o foi poss\u00edvel carregar os eventos. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_ru.properties new file mode 100644 index 0000000000..3211f9f64c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_ru.properties @@ -0,0 +1,20 @@ +label.viewevents.title=\u0421\u043e\u0431\u044b\u0442\u0438\u044f +label.createevent.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +label.editevent.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +label.general=\u041e\u0431\u0449\u0435\u0435 +label.label=\u0418\u043c\u044f +label.type=\u0422\u0438\u043f +label.required=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f + +button.newevent=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 + +message.confirm.removeevent.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +message.confirm.removeevent.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.removeevent.success=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e. +message.removeevent.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435. +message.saveevent.saving=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f... +message.loadevent.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f. +message.loadevents.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f. +message.loadevents.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439... +message.empty=\u041d\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. +message.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_zh_CN.properties new file mode 100644 index 0000000000..e27969092b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-events.get_zh_CN.properties @@ -0,0 +1,20 @@ +label.viewevents.title=\u4e8b\u4ef6 +label.createevent.title=\u65b0\u5efa\u4e8b\u4ef6 +label.editevent.title=\u7f16\u8f91\u4e8b\u4ef6 +label.general=\u5e38\u89c4 +label.label=\u540d\u79f0 +label.type=\u7c7b\u578b +label.required=\u5fc5\u586b\u5b57\u6bb5 + +button.newevent=\u65b0\u5efa\u4e8b\u4ef6 + +message.confirm.removeevent.title=\u5220\u9664\u4e8b\u4ef6 +message.confirm.removeevent.text=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.removeevent.success=\u5df2\u6210\u529f\u79fb\u9664\u4e8b\u4ef6\u3002 +message.removeevent.failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u4e8b\u4ef6\u3002 +message.saveevent.saving=\u6b63\u5728\u4fdd\u5b58\u4e8b\u4ef6... +message.loadevent.failure=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u4e8b\u4ef6\u7684\u6570\u636e\u3002 +message.loadevents.failure=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u5c5e\u6027\u3002 +message.loadevents.loading=\u6b63\u5728\u52a0\u8f7d\u4e8b\u4ef6... +message.empty=\u6ca1\u6709\u8bbe\u7f6e\u7684\u4efb\u4f55\u4e8b\u4ef6\u3002 +message.error=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u5c5e\u6027\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.desc.xml new file mode 100644 index 0000000000..cd7480f11e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Record Management List of Values + Administration Console - Record Management Tool List of Values + /components/console/rm-list-of-values + rm-console + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.head.ftl new file mode 100644 index 0000000000..3bc97d24e0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.head.ftl @@ -0,0 +1,37 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/people-finder/authority-finder.css" /> +<@script type="text/javascript" src="${url.context}/res/components/people-finder/authority-finder.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/people-finder/authority-finder.js"> + +<@script type="text/javascript" src="${url.context}/res/modules/simple-dialog.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-list-of-values.css" /> +<@script type="text/javascript" src="${url.context}/res/components/console/consoletool.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-list-of-values.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.html.ftl new file mode 100644 index 0000000000..ac4f5d9263 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.html.ftl @@ -0,0 +1,128 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + + + + +<#assign el=args.htmlid> +
+ + + + + + + +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.js new file mode 100644 index 0000000000..e87d6d86f6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.js @@ -0,0 +1,36 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + var conn = remote.connect("alfresco"); + model.hasAccess = hasCapability(conn, "ListAdmin"); +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.properties new file mode 100644 index 0000000000..89c5bacb2d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=List of Values +label.edit-listofvalue-title=Edit List: {0} +label.values=Values +label.access=User Access + +panel.listproperties.create=New List +panel.listproperties.edit=Rename List +panel.addaccess.header=Add User Access + +button.newlist=New List + +message.confirm.deletelist.title=Remove List +message.confirm.deletelist.text=Are you sure you want to remove ''{0}''? +message.deletelist.success=Successfully removed list. +message.deletelist.failure=We couldn't remove the list. +message.loading.lists=Loading list of values... +message.loading.values=Loading values... +message.loading.access=Loading access... +message.empty.lists=Click 'New List' to create a list. +message.empty.values=Enter a value in the text field and click 'Add'. +message.empty.access=Click 'Add' to give access to the value for a group or user. +message.error=We couldn't load data.Try refreshing your browser. +message.addvalue.failure=We couldn't add value ''{0}'' +message.addlist.failure.title=We couldn't add the list. +message.addlist.failure.text=We couldn't add list: {0} +message.renamelist.failure.title=We couldn't rename the list. +message.renamelist.failure.text=We couldn't rename list: {0} +message.confirm.removevalue.title=Remove Value +message.confirm.removevalue.text=Are you sure you want to remove ''{0}''? +message.deletevalue.failure=We couldn't delete the value. +message.confirm.removeaccess.title=Remove access authority +message.confirm.removeaccess.text=Are you sure you want to remove ''{0}''? +message.removeaccess.failure=We couldn't remove the access authority. +message.addaccess.failure=We couldn't add the value. + +table.header.actions=Actions +table.header.icon=Icon +table.header.list=List +table.header.name=Name \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_de.properties new file mode 100644 index 0000000000..bc1ada5d55 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_de.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Werteliste +label.edit-listofvalue-title=Liste ''{0}'' bearbeiten +label.values=Werte +label.access=Benutzerzugriff + +panel.listproperties.create=Neue Liste +panel.listproperties.edit=Liste umbenennen +panel.addaccess.header=Benutzerzugriff hinzuf\u00fcgen + +button.newlist=Neue Liste + +message.confirm.deletelist.title=Liste entfernen +message.confirm.deletelist.text=M\u00f6chten Sie ''{0}'' wirklich entfernen? +message.deletelist.success=Liste erfolgreich entfernt. +message.deletelist.failure=Liste konnte nicht entfernt werden. +message.loading.lists=Werteliste wird geladen... +message.loading.values=Werte werden geladen... +message.loading.access=Zugriff wird geladen... +message.empty.lists=Klicken Sie auf 'Neue Liste', um eine Liste zu erstellen. +message.empty.values=Geben Sie einen Wert in das Textfeld ein und klicken Sie auf 'Hinzuf\u00fcgen'. +message.empty.access=Klicken Sie auf 'Hinzuf\u00fcgen', um einer Gruppe oder einem Benutzer Zugriff auf den Wert zu gew\u00e4hren. +message.error=Daten konnten nicht geladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.addvalue.failure=Wert ''{0}'' konnte nicht hinzugef\u00fcgt werden. +message.addlist.failure.title=Liste konnte nicht hinzugef\u00fcgt werden. +message.addlist.failure.text=Liste ''{0}'' konnte nicht hinzugef\u00fcgt werden. +message.renamelist.failure.title=Liste konnte nicht umbenannt werden. +message.renamelist.failure.text=Liste ''{0}'' konnte nicht umbenannt werden. +message.confirm.removevalue.title=Wert entfernen +message.confirm.removevalue.text=M\u00f6chten Sie ''{0}'' wirklich entfernen? +message.deletevalue.failure=Wert konnte nicht gel\u00f6scht werden. +message.confirm.removeaccess.title=Zugriffs-Authority entfernen +message.confirm.removeaccess.text=M\u00f6chten Sie ''{0}'' wirklich entfernen? +message.removeaccess.failure=Zugriffs-Authority konnte nicht entfernt werden. +message.addaccess.failure=Wert konnte nicht hinzugef\u00fcgt werden. + +table.header.actions=Aktionen +table.header.icon=Symbol +table.header.list=Liste +table.header.name=Name diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_es.properties new file mode 100755 index 0000000000..ae8a441569 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_es.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Lista de valores +label.edit-listofvalue-title=Editar lista: {0} +label.values=Valores +label.access=Acceso de usuario + +panel.listproperties.create=Nueva lista +panel.listproperties.edit=Cambiar nombre de lista +panel.addaccess.header=A\u00f1adir acceso de usuario + +button.newlist=Nueva lista + +message.confirm.deletelist.title=Eliminar lista +message.confirm.deletelist.text=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}''? +message.deletelist.success=Lista eliminada correctamente. +message.deletelist.failure=No se pudo eliminar la lista. +message.loading.lists=Cargando lista de valores\u2026 +message.loading.values=Cargando valores\u2026 +message.loading.access=Cargando acceso\u2026 +message.empty.lists=Haga clic en 'Nueva lista' para crear una lista. +message.empty.values=Introduzca un valor en el campo de texto y haga clic en 'A\u00f1adir'. +message.empty.access=Haga clic en 'A\u00f1adir' para dar acceso al valor a un grupo o usuario. +message.error=No se pudieron cargar los datos. Trate de actualizar el navegador. +message.addvalue.failure=No se pudo a\u00f1adir el valor ''{0}'' +message.addlist.failure.title=No se pudo a\u00f1adir la lista. +message.addlist.failure.text=No se pudo a\u00f1adir la lista: {0} +message.renamelist.failure.title=No se pudo cambiar el nombre de la lista. +message.renamelist.failure.text=No se pudo cambiar el nombre de la lista: {0} +message.confirm.removevalue.title=Eliminar valor +message.confirm.removevalue.text=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}''? +message.deletevalue.failure=No se pudo eliminar el valor. +message.confirm.removeaccess.title=Eliminar autoridad de acceso. +message.confirm.removeaccess.text=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}''? +message.removeaccess.failure=No se pudo eliminar la autoridad de acceso. +message.addaccess.failure=No se pudo a\u00f1adir el valor. + +table.header.actions=Acciones +table.header.icon=Icono +table.header.list=Lista +table.header.name=Nombre diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_fr.properties new file mode 100644 index 0000000000..766d5d4eba --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_fr.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Liste de valeurs +label.edit-listofvalue-title=Modifier les listes\u00a0: {0} +label.values=Valeurs +label.access=Acc\u00e8s utilisateur + +panel.listproperties.create=Nouvelle liste +panel.listproperties.edit=Renommer la liste +panel.addaccess.header=Ajouter un acc\u00e8s utilisateur + +button.newlist=Nouvelle liste + +message.confirm.deletelist.title=Supprimer la liste +message.confirm.deletelist.text=Voulez-vous vraiment supprimer ''{0}'' ? +message.deletelist.success=La liste a bien \u00e9t\u00e9 supprim\u00e9e. +message.deletelist.failure=Impossible de supprimer la liste. +message.loading.lists=Chargement de la liste de valeurs... +message.loading.values=Chargement des valeurs... +message.loading.access=Chargement de l'acc\u00e8s... +message.empty.lists=Cliquez sur 'Nouvelle liste' pour cr\u00e9er une liste. +message.empty.values=Entrez une valeur dans le champ suivant et cliquez sur 'Ajouter'. +message.empty.access=Cliquez sur 'Ajouter' pour fournir un acc\u00e8s \u00e0 la valeur pour un groupe ou un utilisateur. +message.error=Impossible de charger les donn\u00e9es. Essayez d'actualiser votre navigateur. +message.addvalue.failure=Impossible d''ajouter la valeur ''{0}'' +message.addlist.failure.title=Impossible d'ajouter la liste. +message.addlist.failure.text=Impossible d''ajouter la liste\u00a0: {0} +message.renamelist.failure.title=Impossible de renommer la liste. +message.renamelist.failure.text=Impossible de renommer la liste\u00a0: {0} +message.confirm.removevalue.title=Supprimer la valeur +message.confirm.removevalue.text=Voulez-vous vraiment supprimer ''{0}'' ? +message.deletevalue.failure=Impossible de supprimer la valeur. +message.confirm.removeaccess.title=Supprimer le droit d'acc\u00e8s +message.confirm.removeaccess.text=Voulez-vous vraiment supprimer ''{0}'' ? +message.removeaccess.failure=Impossible de supprimer le droit d'acc\u00e8s. +message.addaccess.failure=Impossible d'ajouter la valeur. + +table.header.actions=Actions +table.header.icon=Ic\u00f4ne +table.header.list=Liste +table.header.name=Nom diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_it.properties new file mode 100644 index 0000000000..82501b9071 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_it.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Elenco di valori +label.edit-listofvalue-title=Modifica elenco: {0} +label.values=Valori +label.access=Accesso utente + +panel.listproperties.create=Nuovo elenco +panel.listproperties.edit=Rinomina elenco +panel.addaccess.header=Aggiungi accesso utente + +button.newlist=Nuovo elenco + +message.confirm.deletelist.title=Rimuovi elenco +message.confirm.deletelist.text=Procedere con la rimozione di ''{0}''? +message.deletelist.success=Rimozione elenco riuscita. +message.deletelist.failure=Impossibile rimuovere l'elenco. +message.loading.lists=Caricamento elenco di valori... +message.loading.values=Caricamento valori... +message.loading.access=Caricamento accesso... +message.empty.lists=Fare clic su 'Nuovo elenco' per creare un elenco. +message.empty.values=Inserire un valore nel campo di testo e fare clic su 'Aggiungi'. +message.empty.access=Fare clic su 'Aggiungi' per fornire l'accesso al valore per un gruppo o utente. +message.error=Impossibile caricare i dati.Provare ad aggiornare il browser. +message.addvalue.failure=Impossibile aggiungere valore ''{0}'' +message.addlist.failure.title=Impossibile aggiungere l'elenco. +message.addlist.failure.text=Impossibile aggiungere elenco: {0} +message.renamelist.failure.title=Impossibile rinominare l'elenco. +message.renamelist.failure.text=Impossibile rinominare elenco: {0} +message.confirm.removevalue.title=Rimuovi valore +message.confirm.removevalue.text=Procedere con la rimozione di ''{0}''? +message.deletevalue.failure=Impossibile eliminare il valore. +message.confirm.removeaccess.title=Rimuovi autorit\u00e0 di accesso +message.confirm.removeaccess.text=Procedere con la rimozione di ''{0}''? +message.removeaccess.failure=Impossibile rimuovere l'autorit\u00e0 di accesso. +message.addaccess.failure=Impossibile aggiungere il valore. + +table.header.actions=Azioni +table.header.icon=Icona +table.header.list=Elenco +table.header.name=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_ja.properties new file mode 100644 index 0000000000..2a5d273944 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_ja.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=\u5024\u306e\u30ea\u30b9\u30c8 +label.edit-listofvalue-title=\u30ea\u30b9\u30c8''{0}'' \u306e\u7de8\u96c6 +label.values=\u5024 +label.access=\u30e6\u30fc\u30b6\u30fc\u30a2\u30af\u30bb\u30b9 + +panel.listproperties.create=\u65b0\u3057\u3044\u30ea\u30b9\u30c8 +panel.listproperties.edit=\u30ea\u30b9\u30c8\u540d\u306e\u5909\u66f4 +panel.addaccess.header=\u30e6\u30fc\u30b6\u30fc\u30a2\u30af\u30bb\u30b9\u306e\u8ffd\u52a0 + +button.newlist=\u65b0\u3057\u3044\u30ea\u30b9\u30c8 + +message.confirm.deletelist.title=\u30ea\u30b9\u30c8\u306e\u524a\u9664 +message.confirm.deletelist.text=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.deletelist.success=\u30ea\u30b9\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.deletelist.failure=\u30ea\u30b9\u30c8\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.loading.lists=\u5024\u306e\u30ea\u30b9\u30c8\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.loading.values=\u5024\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.loading.access=\u30a2\u30af\u30bb\u30b9\u6a29\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.empty.lists=\u300c\u65b0\u3057\u3044\u30ea\u30b9\u30c8\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30ea\u30b9\u30c8\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.empty.values=\u30c6\u30ad\u30b9\u30c8\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u5024\u3092\u5165\u529b\u3057\u3066\u304b\u3089\u3001[\u8ffd\u52a0] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.empty.access=[\u8ffd\u52a0] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30b0\u30eb\u30fc\u30d7\u307e\u305f\u306f\u30e6\u30fc\u30b6\u30fc\u306b\u5024\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.error=\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.addvalue.failure=\u5024 ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.addlist.failure.title=\u30ea\u30b9\u30c8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.addlist.failure.text=\u30ea\u30b9\u30c8 ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.renamelist.failure.title=\u30ea\u30b9\u30c8\u306e\u540d\u524d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.renamelist.failure.text=\u30ea\u30b9\u30c8 ''{0}'' \u306e\u540d\u524d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.confirm.removevalue.title=\u5024\u306e\u524a\u9664 +message.confirm.removevalue.text=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.deletevalue.failure=\u5024\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.confirm.removeaccess.title=\u30a2\u30af\u30bb\u30b9\u6a29\u306e\u524a\u9664 +message.confirm.removeaccess.text=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.removeaccess.failure=\u30a2\u30af\u30bb\u30b9\u6a29\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.addaccess.failure=\u5024\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +table.header.actions=\u51e6\u7406 +table.header.icon=\u30a2\u30a4\u30b3\u30f3 +table.header.list=\u30ea\u30b9\u30c8 +table.header.name=\u540d\u524d diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_nb.properties new file mode 100644 index 0000000000..6d8622017a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_nb.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Liste over verdier +label.edit-listofvalue-title=Rediger liste: {0} +label.values=Verdier +label.access=Brukertilgang + +panel.listproperties.create=Ny liste +panel.listproperties.edit=Gi listen nytt navn +panel.addaccess.header=Legg til brukertilgang + +button.newlist=Ny liste + +message.confirm.deletelist.title=Fjern liste +message.confirm.deletelist.text=Er du sikker p\u00e5 at du vil fjerne ''{0}''? +message.deletelist.success=Listen er n\u00e5 fjernet. +message.deletelist.failure=Kunne ikke fjerne listen. +message.loading.lists=Laste verdiliste... +message.loading.values=Laste verdier... +message.loading.access=Laste tilgang... +message.empty.lists=Klikk p\u00e5 'Ny liste' for \u00e5 opprette en liste. +message.empty.values=Angi en verdi i tekstfeltet, og klikk p\u00e5 'Legg til'. +message.empty.access=Klikk p\u00e5 'Legg til' for \u00e5 gi en gruppe eller en bruker tilgang til verdien. +message.error=Kunne ikke laste inn data. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.addvalue.failure=Kunne ikke legge til verdien ''{0}'' +message.addlist.failure.title=Kunne ikke legge til listen. +message.addlist.failure.text=Kunne ikke legge til listen: {0} +message.renamelist.failure.title=Kunne ikke gi listen nytt navn. +message.renamelist.failure.text=Kunne ikke gi listen nytt navn: {0} +message.confirm.removevalue.title=Fjern verdi +message.confirm.removevalue.text=Er du sikker p\u00e5 at du vil fjerne ''{0}''? +message.deletevalue.failure=Mislyktes i \u00e5 slette verdien. +message.confirm.removeaccess.title=Fjem tilgangsrett +message.confirm.removeaccess.text=Er du sikker p\u00e5 at du vil fjerne ''{0}''? +message.removeaccess.failure=Kunne ikke fjerne listen. +message.addaccess.failure=Kunne ikke legge til verdien. + +table.header.actions=Handlinger +table.header.icon=Ikon +table.header.list=Liste +table.header.name=Navn diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_nl.properties new file mode 100755 index 0000000000..975afca77f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_nl.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Lijst met waarden +label.edit-listofvalue-title=Lijst bewerken: {0} +label.values=Waarden +label.access=Gebruikerstoegang + +panel.listproperties.create=Nieuwe lijst +panel.listproperties.edit=Naam van lijst wijzigen +panel.addaccess.header=Gebruikerstoegang toevoegen + +button.newlist=Nieuwe lijst + +message.confirm.deletelist.title=Lijst verwijderen +message.confirm.deletelist.text=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.deletelist.success=Lijst verwijderd. +message.deletelist.failure=Kan de lijst niet verwijderen. +message.loading.lists=Lijst met waarden laden... +message.loading.values=Waarden laden... +message.loading.access=Toegang laden... +message.empty.lists=Klik op 'Nieuwe lijst' om een lijst aan te maken. +message.empty.values=Voer in het tekstveld een waarde in en klik op 'Toevoegen'. +message.empty.access=Klik op 'Toevoegen' om een groep of een gebruiker toegang te geven. +message.error=Kan gegevens niet laden.Vernieuw de browser. +message.addvalue.failure=Kan waarde ''{0}'' niet laden +message.addlist.failure.title=Kan de lijst niet toevoegen. +message.addlist.failure.text=Kan lijst niet toevoegen: {0} +message.renamelist.failure.title=Kan de naam van de lijst niet wijzigen. +message.renamelist.failure.text=Kan naam van lijst niet wijzigen: {0} +message.confirm.removevalue.title=Waarde verwijderen +message.confirm.removevalue.text=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.deletevalue.failure=Kan de waarde niet verwijderen. +message.confirm.removeaccess.title=Toegangsautoriteit verwijderen +message.confirm.removeaccess.text=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.removeaccess.failure=Kan de toegangsautoriteit niet verwijderen. +message.addaccess.failure=Kan de waarde niet toevoegen. + +table.header.actions=Acties +table.header.icon=Pictogram +table.header.list=Lijst +table.header.name=Naam diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_pt_BR.properties new file mode 100644 index 0000000000..f60391e706 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_pt_BR.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=Lista de valores +label.edit-listofvalue-title=Editar lista: {0} +label.values=Valores +label.access=Acesso do usu\u00e1rio + +panel.listproperties.create=Nova lista +panel.listproperties.edit=Renomear lista +panel.addaccess.header=Adicionar acesso do usu\u00e1rio + +button.newlist=Nova lista + +message.confirm.deletelist.title=Remover lista +message.confirm.deletelist.text=Tem certeza de que deseja remover ''{0}''? +message.deletelist.success=Lista removida com sucesso. +message.deletelist.failure=N\u00e3o foi poss\u00edvel remover a lista. +message.loading.lists=Carregando lista de valores... +message.loading.values=Carregando valores... +message.loading.access=Carregando acesso... +message.empty.lists=Clique em 'Nova lista' para criar uma lista. +message.empty.values=Insira um valor no campo de texto e clique em 'Adicionar'. +message.empty.access=Clique em 'Adicionar' para conceder acesso ao valor de um grupo ou usu\u00e1rio. +message.error=N\u00e3o foi poss\u00edvel carregar dados. Tente atualizar seu navegador. +message.addvalue.failure=N\u00e3o foi poss\u00edvel adicionar o valor ''{0}'' +message.addlist.failure.title=N\u00e3o foi poss\u00edvel adicionar a lista. +message.addlist.failure.text=N\u00e3o foi poss\u00edvel adicionar a lista: {0} +message.renamelist.failure.title=N\u00e3o foi poss\u00edvel renomear a lista. +message.renamelist.failure.text=N\u00e3o foi poss\u00edvel renomear a lista: {0} +message.confirm.removevalue.title=Remover valor +message.confirm.removevalue.text=Tem certeza de que deseja remover ''{0}''? +message.deletevalue.failure=N\u00e3o foi poss\u00edvel excluir o valor. +message.confirm.removeaccess.title=Remover autoridade de acesso +message.confirm.removeaccess.text=Tem certeza de que deseja remover ''{0}''? +message.removeaccess.failure=N\u00e3o foi poss\u00edvel remover a autoridade de acesso. +message.addaccess.failure=N\u00e3o foi poss\u00edvel adicionar o valor. + +table.header.actions=A\u00e7\u00f5es +table.header.icon=\u00cdcone +table.header.list=Lista +table.header.name=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_ru.properties new file mode 100644 index 0000000000..cc82f4b21c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_ru.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 +label.edit-listofvalue-title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a: {0} +label.values=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f +label.access=\u0414\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f + +panel.listproperties.create=\u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a +panel.listproperties.edit=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a +panel.addaccess.header=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f + +button.newlist=\u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a + +message.confirm.deletelist.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a +message.confirm.deletelist.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.deletelist.success=\u0421\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d. +message.deletelist.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a. +message.loading.lists=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439... +message.loading.values=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439... +message.loading.access=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430... +message.empty.lists=\u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 '\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a', \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a. +message.empty.values=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0449\u0435\u043b\u043a\u043d\u0438\u0442\u0435 '\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c'. +message.empty.access=\u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 '\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c', \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. +message.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.addvalue.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ''{0}'' +message.addlist.failure.title=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a. +message.addlist.failure.text=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a: {0} +message.renamelist.failure.title=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a. +message.renamelist.failure.text=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a: {0} +message.confirm.removevalue.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 +message.confirm.removevalue.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.deletevalue.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. +message.confirm.removeaccess.title=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u0439 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f +message.confirm.removeaccess.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.removeaccess.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f. +message.addaccess.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. + +table.header.actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f +table.header.icon=\u0417\u043d\u0430\u0447\u043e\u043a +table.header.list=\u0421\u043f\u0438\u0441\u043e\u043a +table.header.name=\u0418\u043c\u044f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_zh_CN.properties new file mode 100644 index 0000000000..74b0f2297e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-list-of-values.get_zh_CN.properties @@ -0,0 +1,39 @@ +label.view-listofvalues-title=\u503c\u5217\u8868 +label.edit-listofvalue-title=\u7f16\u8f91\u5217\u8868\uff1a{0} +label.values=\u503c +label.access=\u7528\u6237\u8bbf\u95ee\u6743\u9650 + +panel.listproperties.create=\u65b0\u5efa\u5217\u8868 +panel.listproperties.edit=\u91cd\u547d\u540d\u5217\u8868 +panel.addaccess.header=\u6dfb\u52a0\u7528\u6237\u8bbf\u95ee\u6743\u9650 + +button.newlist=\u65b0\u5efa\u5217\u8868 + +message.confirm.deletelist.title=\u5220\u9664\u5217\u8868 +message.confirm.deletelist.text=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.deletelist.success=\u5df2\u6210\u529f\u79fb\u9664\u5217\u8868\u3002 +message.deletelist.failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u5217\u8868\u3002 +message.loading.lists=\u6b63\u5728\u52a0\u8f7d\u503c\u5217\u8868... +message.loading.values=\u6b63\u5728\u52a0\u8f7d\u503c... +message.loading.access=\u6b63\u5728\u52a0\u8f7d\u8bbf\u95ee\u6743\u9650... +message.empty.lists=\u5355\u51fb\u201c\u65b0\u5efa\u5217\u8868\u201d\u521b\u5efa\u5217\u8868\u3002 +message.empty.values=\u5728\u6587\u672c\u5b57\u6bb5\u8f93\u5165\u503c\u5e76\u5355\u51fb\u201c\u6dfb\u52a0\u201d\u3002 +message.empty.access=\u5355\u51fb\u201c\u6dfb\u52a0\u201d\u4e3a\u7ec4\u6216\u7528\u6237\u63d0\u4f9b\u503c\u7684\u8bbf\u95ee\u6743\u9650\u3002 +message.error=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u6570\u636e\uff0c\u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.addvalue.failure=\u6211\u4eec\u65e0\u6cd5\u6dfb\u52a0\u503c ''{0}'' +message.addlist.failure.title=\u6211\u4eec\u65e0\u6cd5\u6dfb\u52a0\u5217\u8868\u3002 +message.addlist.failure.text=\u65e0\u6cd5\u6dfb\u52a0\u5217\u8868\uff1a{0} +message.renamelist.failure.title=\u6211\u4eec\u65e0\u6cd5\u91cd\u547d\u540d\u5217\u8868\u3002 +message.renamelist.failure.text=\u6211\u4eec\u65e0\u6cd5\u91cd\u547d\u540d\u5217\u8868\uff1a{0} +message.confirm.removevalue.title=\u5220\u9664\u503c +message.confirm.removevalue.text=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.deletevalue.failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u503c\u3002 +message.confirm.removeaccess.title=\u5220\u9664\u8bbf\u95ee\u6743\u9650 +message.confirm.removeaccess.text=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.removeaccess.failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u8bbf\u95ee\u6743\u9650\u3002 +message.addaccess.failure=\u6211\u4eec\u65e0\u6cd5\u6dfb\u52a0\u503c\u3002 + +table.header.actions=\u64cd\u4f5c +table.header.icon=\u56fe\u6807 +table.header.list=\u5217\u8868 +table.header.name=\u540d\u79f0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.desc.xml new file mode 100644 index 0000000000..3744a29bfe --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Record Management References + Administration Console - Record Management Tool References + /components/console/rm-references + rm-console + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.head.ftl new file mode 100644 index 0000000000..0bbc9f4594 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-references.css" /> +<@script type="text/javascript" src="${url.context}/res/components/console/consoletool.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-references.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.html.ftl new file mode 100644 index 0000000000..0b0c3c34d7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.html.ftl @@ -0,0 +1,127 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + + + + +<#assign el=args.htmlid> +
+ + + + + + + +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.js new file mode 100644 index 0000000000..ff5b978b9e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.js @@ -0,0 +1,38 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + var conn = remote.connect("alfresco"); + + // test user capabilities - can they access References? + model.hasAccess = hasCapability(conn, "CreateModifyDestroyReferenceTypes"); +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.properties new file mode 100644 index 0000000000..fc1a2e24f4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get.properties @@ -0,0 +1,24 @@ +label.view-references-title=Link Relationships +label.title.parentchild={0}, {1} +label.create-references-title=New Relationship +label.edit-references-title=Edit Relationship +label.general=General +label.type=Type +label.bidirectional=Bi-directional +label.label=Name +label.parentchild=Parent/Child +label.source=Source +label.target=Target + +button.newreference=New Relationship + +message.confirm.removereference.title=Remove Relationship +message.confirm.removereference.text=Are you sure you want to remove ''{0}''? +message.confirm.removereference.text.parentchild=Are you sure you want to remove ''{0}, {1}''? +message.removereference-success=Successfully removed reference. +message.removereference-failure=We couldn't remove the relationship. +message.savingReference=Saving relationship... +message.loadreference-failure=We couldn't load data for the relationship.Try refreshing your browser. +message.loading=Loading relationships... +message.empty=You haven't set up any relationships. +message.error=We couldn't load relationships. Try refreshing your browser. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_de.properties new file mode 100644 index 0000000000..e4de815cd7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_de.properties @@ -0,0 +1,24 @@ +label.view-references-title=Beziehungen verkn\u00fcpfen +label.title.parentchild={0}, {1} +label.create-references-title=Neue Beziehung +label.edit-references-title=Beziehung bearbeiten +label.general=Allgemein +label.type=Typ +label.bidirectional=Bidirektional +label.label=Name +label.parentchild=Eltern/Untergeordnet +label.source=Quelle +label.target=Ziel + +button.newreference=Neue Beziehung + +message.confirm.removereference.title=Beziehung entfernen +message.confirm.removereference.text=M\u00f6chten Sie ''{0}'' wirklich entfernen? +message.confirm.removereference.text.parentchild=M\u00f6chten Sie ''{0}, {1}'' wirklich entfernen? +message.removereference-success=Referenz erfolgreich entfernt. +message.removereference-failure=Beziehung konnte nicht entfernt werden. +message.savingReference=Beziehung wird gespeichert... +message.loadreference-failure=Daten f\u00fcr die Beziehung konnten nicht geladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.loading=Beziehungen werden geladen... +message.empty=Keine Beziehungen eingerichtet. +message.error=Beziehungen konnten nicht geladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_es.properties new file mode 100755 index 0000000000..2acb3b7a49 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_es.properties @@ -0,0 +1,24 @@ +label.view-references-title=Enlace de relaciones +label.title.parentchild={0}, {1} +label.create-references-title=Nueva relaci\u00f3n +label.edit-references-title=Editar relaci\u00f3n +label.general=General +label.type=Tipo +label.bidirectional=Bidireccional +label.label=Nombre +label.parentchild=Elemento primario/subdirectorio +label.source=Origen +label.target=Destino + +button.newreference=Nueva relaci\u00f3n + +message.confirm.removereference.title=Eliminar relaci\u00f3n +message.confirm.removereference.text=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}''? +message.confirm.removereference.text.parentchild=\u00bfEst\u00e1 seguro de que desea eliminar ''{0}, {1}''? +message.removereference-success=Referencia eliminada correctamente. +message.removereference-failure=No se pudo eliminar la relaci\u00f3n. +message.savingReference=Guardando relaci\u00f3n... +message.loadreference-failure=No se pudieron cargar los datos para la relaci\u00f3n. Trate de actualizar el navegador. +message.loading=Cargando relaciones... +message.empty=No ha definido ninguna relaci\u00f3n. +message.error=No se pudieron cargar las relaciones. Trate de actualizar el navegador. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_fr.properties new file mode 100644 index 0000000000..455d3f4a46 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_fr.properties @@ -0,0 +1,24 @@ +label.view-references-title=Relations de liens +label.title.parentchild={0}, {1} +label.create-references-title=Nouvelle relation +label.edit-references-title=Modifier relation +label.general=G\u00e9n\u00e9ral +label.type=Type +label.bidirectional=Bidirectionnelle +label.label=Nom +label.parentchild=Parent/subordonn\u00e9 +label.source=Origine +label.target=Cible + +button.newreference=Nouvelle relation + +message.confirm.removereference.title=Supprimer la relation +message.confirm.removereference.text=Voulez-vous vraiment supprimer ''{0}'' ? +message.confirm.removereference.text.parentchild=Voulez-vous vraiment supprimer ''{0}, {1}'' ? +message.removereference-success=La r\u00e9f\u00e9rence a bien \u00e9t\u00e9 supprim\u00e9e. +message.removereference-failure=Impossible de supprimer la relation. +message.savingReference=Enregistrement en cours de la relation... +message.loadreference-failure=Impossible de charger les donn\u00e9es de la relation. Essayez d'actualiser votre navigateur. +message.loading=Chargement en cours des relations... +message.empty=Vous n'avez configur\u00e9 aucune relation. +message.error=Impossible de charger les relations. Essayez d'actualiser votre navigateur. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_it.properties new file mode 100644 index 0000000000..7a2a70e532 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_it.properties @@ -0,0 +1,24 @@ +label.view-references-title=Collega relazioni +label.title.parentchild={0}, {1} +label.create-references-title=Nuova relazione +label.edit-references-title=Modifica relazione +label.general=Generale +label.type=Tipo +label.bidirectional=Bidirezionale +label.label=Nome +label.parentchild=Principale/Secondario +label.source=Origine +label.target=Destinazione + +button.newreference=Nuova relazione + +message.confirm.removereference.title=Rimuovi relazione +message.confirm.removereference.text=Procedere con la rimozione di ''{0}''? +message.confirm.removereference.text.parentchild=Procedere con la rimozione di ''{0}, {1}''? +message.removereference-success=Rimozione riferimento riuscita. +message.removereference-failure=Impossibile rimuovere la relazione. +message.savingReference=Salvataggio relazione... +message.loadreference-failure=Impossibile caricare i dati per la relazione.Provare ad aggiornare il browser. +message.loading=Caricamento relazioni... +message.empty=Non \u00e8 stata impostata alcuna relazione. +message.error=Impossibile caricare relazioni. Provare ad aggiornare il browser. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_ja.properties new file mode 100644 index 0000000000..4d34a1f65c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_ja.properties @@ -0,0 +1,24 @@ +label.view-references-title=\u30ea\u30f3\u30af\u306e\u95a2\u4fc2 +label.title.parentchild={0}, {1} +label.create-references-title=\u65b0\u3057\u3044\u95a2\u4fc2 +label.edit-references-title=\u95a2\u4fc2\u306e\u7de8\u96c6 +label.general=\u4e00\u822c +label.type=\u7a2e\u985e +label.bidirectional=\u53cc\u65b9\u5411 +label.label=\u540d\u524d +label.parentchild=\u89aa/\u5b50 +label.source=\u30bd\u30fc\u30b9 +label.target=\u30bf\u30fc\u30b2\u30c3\u30c8 + +button.newreference=\u65b0\u3057\u3044\u95a2\u4fc2 + +message.confirm.removereference.title=\u95a2\u4fc2\u306e\u524a\u9664 +message.confirm.removereference.text=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.confirm.removereference.text.parentchild=''{0}, {1}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.removereference-success=\u53c2\u7167\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.removereference-failure=\u95a2\u4fc2\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.savingReference=\u95a2\u4fc2\u3092\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059... +message.loadreference-failure=\u95a2\u4fc2\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.loading=\u95a2\u4fc2\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.empty=\u95a2\u4fc2\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +message.error=\u95a2\u4fc2\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_nb.properties new file mode 100644 index 0000000000..34e1c106a0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_nb.properties @@ -0,0 +1,24 @@ +label.view-references-title=Koble forhold +label.title.parentchild={0}, {1} +label.create-references-title=Nytt forhold +label.edit-references-title=Rediger forhold +label.general=Generelt +label.type=Type +label.bidirectional=Toveis +label.label=Navn +label.parentchild=Forelder/Barn +label.source=Kilde +label.target=M\u00e5l + +button.newreference=Nytt forhold + +message.confirm.removereference.title=Fjern forhold +message.confirm.removereference.text=Er du sikker p\u00e5 at du vil fjerne ''{0}''? +message.confirm.removereference.text.parentchild=Er du sikker p\u00e5 at du vil fjerne ''{0}, {1}''? +message.removereference-success=Referansen er n\u00e5 fjernet. +message.removereference-failure=Kunne ikke fjerne forholdet. +message.savingReference=Lagre forhold... +message.loadreference-failure=Kunne ikke laste inn data for forholdet. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.loading=Laste forhold... +message.empty=Det er ikke satt opp noen forhold. +message.error=Kunne ikke laste inn forhold. Pr\u00f8v \u00e5 oppdatere nettleseren. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_nl.properties new file mode 100755 index 0000000000..f62a29c432 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_nl.properties @@ -0,0 +1,24 @@ +label.view-references-title=Relaties koppelen +label.title.parentchild={0}, {1} +label.create-references-title=Nieuwe relatie +label.edit-references-title=Relatie bewerken +label.general=Algemeen +label.type=Type +label.bidirectional=Bidirectioneel +label.label=Naam +label.parentchild=Bovenliggend/onderliggend +label.source=Bron +label.target=Doel + +button.newreference=Nieuwe relatie + +message.confirm.removereference.title=Relatie verwijderen +message.confirm.removereference.text=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.confirm.removereference.text.parentchild=Weet u zeker dat u ''{0}, {1}'' wilt verwijderen? +message.removereference-success=Verwijzing verwijderd +message.removereference-failure=Kan de relatie niet verwijderen. +message.savingReference=Relatie opslaan... +message.loadreference-failure=Kan gegevens voor de relatie niet laden.Vernieuw de browser. +message.loading=Relaties laden... +message.empty=Er zijn geen relaties ingesteld. +message.error=Kan relaties niet laden. Vernieuw de browser. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_pt_BR.properties new file mode 100644 index 0000000000..5865800942 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_pt_BR.properties @@ -0,0 +1,24 @@ +label.view-references-title=Vincular relacionamentos +label.title.parentchild={0}, {1} +label.create-references-title=Novo relacionamento +label.edit-references-title=Editar relacionamento +label.general=Geral +label.type=Tipo +label.bidirectional=Bidirecional +label.label=Nome +label.parentchild=Prim\u00e1rio/Secund\u00e1rio +label.source=Fonte +label.target=Destino + +button.newreference=Novo relacionamento + +message.confirm.removereference.title=Remover relacionamento +message.confirm.removereference.text=Tem certeza de que deseja remover ''{0}''? +message.confirm.removereference.text.parentchild=Tem certeza de que deseja remover ''{0}, {1}''? +message.removereference-success=Refer\u00eancia removida com sucesso. +message.removereference-failure=N\u00e3o foi poss\u00edvel remover o relacionamento. +message.savingReference=Salvando relacionamento... +message.loadreference-failure=N\u00e3o foi poss\u00edvel carregar dados para o relacionamento. Tente atualizar seu navegador. +message.loading=Carregando relacionamentos... +message.empty=Voc\u00ea n\u00e3o configurou relacionamentos. +message.error=N\u00e3o foi poss\u00edvel carregar relacionamentos. Tente atualizar seu navegador. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_ru.properties new file mode 100644 index 0000000000..19b1adf917 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_ru.properties @@ -0,0 +1,24 @@ +label.view-references-title=\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f +label.title.parentchild={0}, {1} +label.create-references-title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +label.edit-references-title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +label.general=\u041e\u0431\u0449\u0435\u0435 +label.type=\u0422\u0438\u043f +label.bidirectional=\u0414\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 +label.label=\u0418\u043c\u044f +label.parentchild=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439/\u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 +label.source=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a +label.target=\u0426\u0435\u043b\u044c + +button.newreference=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 + +message.confirm.removereference.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +message.confirm.removereference.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.confirm.removereference.text.parentchild=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}, {1}''? +message.removereference-success=\u0421\u0441\u044b\u043b\u043a\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430. +message.removereference-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. +message.savingReference=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f... +message.loadreference-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439... +message.empty=\u041d\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439. +message.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_zh_CN.properties new file mode 100644 index 0000000000..be695f5c11 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-references.get_zh_CN.properties @@ -0,0 +1,24 @@ +label.view-references-title=\u94fe\u63a5\u5173\u7cfb +label.title.parentchild={0}, {1} +label.create-references-title=\u65b0\u5efa\u5173\u7cfb +label.edit-references-title=\u7f16\u8f91\u5173\u7cfb +label.general=\u5e38\u89c4 +label.type=\u7c7b\u578b +label.bidirectional=\u53cc\u5411 +label.label=\u540d\u79f0 +label.parentchild=\u7236\u9879/\u5b50\u9879 +label.source=\u6e90 +label.target=\u76ee\u6807 + +button.newreference=\u65b0\u5efa\u5173\u7cfb + +message.confirm.removereference.title=\u5220\u9664\u5173\u7cfb +message.confirm.removereference.text=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.confirm.removereference.text.parentchild=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\u3001''{1}''\uff1f +message.removereference-success=\u5df2\u6210\u529f\u79fb\u9664\u53c2\u8003\u3002 +message.removereference-failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u5173\u7cfb\u3002 +message.savingReference=\u6b63\u5728\u4fdd\u5b58\u5173\u7cfb... +message.loadreference-failure=\u6211\u4eec\u65e0\u6cd5\u4e3a\u5173\u7cfb\u52a0\u8f7d\u6570\u636e\u3002\u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.loading=\u6b63\u5728\u52a0\u8f7d\u5173\u7cfb... +message.empty=\u60a8\u65e0\u6cd5\u8bbe\u7f6e\u4efb\u4f55\u5173\u7cfb\u3002 +message.error=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u5173\u7cfb\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.desc.xml new file mode 100644 index 0000000000..e7c4baf24b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console User Rights Report + Administration Console - User Rights Report Tool + /components/console/rm-userrights + rm-console + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.head.ftl new file mode 100644 index 0000000000..6eab77746b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.head.ftl @@ -0,0 +1,32 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/datatable/assets/datatable.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-user-rights.css" /> + +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-user-rights.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.html.ftl new file mode 100644 index 0000000000..f888bba421 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.html.ftl @@ -0,0 +1,52 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + + +
+
+
+

${msg('label.user-rights')}

+

${msg('label.users')}

+
+
+

${msg('label.roles')}

+
+

${msg('label.no-roles')}

+
+

${msg('label.groups')}

+
+

${msg('label.no-groups')}

+
+
+
+
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.js new file mode 100644 index 0000000000..0a925cbdbf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.js @@ -0,0 +1,38 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + var conn = remote.connect("alfresco"); + + // test user capabilities - can they access User Rights Report? + model.hasAccess = hasCapability(conn, "DisplayRightsReport"); +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.properties new file mode 100644 index 0000000000..9f99287730 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get.properties @@ -0,0 +1,9 @@ +label.user-rights=User Rights +label.userid=User ID +label.roles=Roles +label.groups=Groups +label.name=Name +label.users=Users +label.no-users=No users +label.no-roles=No roles available +label.no-groups=No groups available diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_de.properties new file mode 100644 index 0000000000..80c0d944eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_de.properties @@ -0,0 +1,9 @@ +label.user-rights=Benutzerrechte +label.userid=Benutzer-ID +label.roles=Rollen +label.groups=Gruppen +label.name=Name +label.users=Benutzer +label.no-users=Keine Benutzer +label.no-roles=Keine Rollen verf\u00fcgbar +label.no-groups=Keine Gruppen verf\u00fcgbar diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_es.properties new file mode 100755 index 0000000000..f9e857ffd1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_es.properties @@ -0,0 +1,9 @@ +label.user-rights=Derechos de usuario +label.userid=ID de usuario +label.roles=Funciones +label.groups=Grupos +label.name=Nombre +label.users=Usuarios +label.no-users=Ning\u00fan usuario +label.no-roles=No hay funciones disponibles +label.no-groups=No hay grupos disponibles diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_fr.properties new file mode 100644 index 0000000000..06c514cb15 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_fr.properties @@ -0,0 +1,9 @@ +label.user-rights=Droits des utilisateurs +label.userid=ID d'utilisateur +label.roles=R\u00f4les +label.groups=Groupes +label.name=Nom +label.users=Utilisateurs +label.no-users=Pas d'utilisateur +label.no-roles=Pas de r\u00f4le disponible +label.no-groups=Pas de groupe disponible diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_it.properties new file mode 100644 index 0000000000..faa046b869 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_it.properties @@ -0,0 +1,9 @@ +label.user-rights=Diritti utente +label.userid=ID utente +label.roles=Ruoli +label.groups=Gruppi +label.name=Nome +label.users=Utenti +label.no-users=Nessun utente +label.no-roles=Nessun ruolo disponibile +label.no-groups=Nessun gruppo disponibile diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_ja.properties new file mode 100644 index 0000000000..d04a50e38f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_ja.properties @@ -0,0 +1,9 @@ +label.user-rights=\u30e6\u30fc\u30b6\u30fc\u6a29\u9650 +label.userid=\u30e6\u30fc\u30b6\u30fc ID +label.roles=\u5f79\u5272 +label.groups=\u30b0\u30eb\u30fc\u30d7 +label.name=\u540d\u524d +label.users=\u30e6\u30fc\u30b6\u30fc +label.no-users=\u30e6\u30fc\u30b6\u30fc\u304c\u3042\u308a\u307e\u305b\u3093 +label.no-roles=\u4f7f\u7528\u53ef\u80fd\u306a\u5f79\u5272\u304c\u3042\u308a\u307e\u305b\u3093 +label.no-groups=\u4f7f\u7528\u53ef\u80fd\u306a\u30b0\u30eb\u30fc\u30d7\u304c\u3042\u308a\u307e\u305b\u3093 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_nb.properties new file mode 100644 index 0000000000..d3289ded46 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_nb.properties @@ -0,0 +1,9 @@ +label.user-rights=Brukerrettigheter +label.userid=Bruker-ID +label.roles=Roller +label.groups=Grupper +label.name=Navn +label.users=Brukere +label.no-users=Ingen brukere +label.no-roles=Ingen roller er tilgjengelig +label.no-groups=Ingen grupper er tilgjengelig diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_nl.properties new file mode 100755 index 0000000000..526ed05ca2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_nl.properties @@ -0,0 +1,9 @@ +label.user-rights=Gebruikersrechten +label.userid=Gebruikers-id +label.roles=Rollen +label.groups=Groepen +label.name=Naam +label.users=Gebruikers +label.no-users=Geen gebruikers +label.no-roles=Geen rollen beschikbaar +label.no-groups=Geen groepen beschikbaar diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_pt_BR.properties new file mode 100644 index 0000000000..c7afa23347 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_pt_BR.properties @@ -0,0 +1,9 @@ +label.user-rights=Direitos do usu\u00e1rio +label.userid=ID do usu\u00e1rio +label.roles=Fun\u00e7\u00f5es +label.groups=Grupos +label.name=Nome +label.users=Usu\u00e1rios +label.no-users=Sem usu\u00e1rios +label.no-roles=Sem fun\u00e7\u00f5es dispon\u00edveis +label.no-groups=Sem grupos dispon\u00edveis diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_ru.properties new file mode 100644 index 0000000000..46468eb9aa --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_ru.properties @@ -0,0 +1,9 @@ +label.user-rights=\u041f\u0440\u0430\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +label.userid=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +label.roles=\u0420\u043e\u043b\u0438 +label.groups=\u0413\u0440\u0443\u043f\u043f\u044b +label.name=\u0418\u043c\u044f +label.users=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +label.no-users=\u041d\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +label.no-roles=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u043e\u043b\u0435\u0439 +label.no-groups=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_zh_CN.properties new file mode 100644 index 0000000000..69614e5286 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-user-rights.get_zh_CN.properties @@ -0,0 +1,9 @@ +label.user-rights=\u7528\u6237\u6743\u9650 +label.userid=\u7528\u6237 ID +label.roles=\u89d2\u8272 +label.groups=\u7ec4 +label.name=\u540d\u79f0 +label.users=\u7528\u6237 +label.no-users=\u65e0\u7528\u6237 +label.no-roles=\u65e0\u89d2\u8272\u53ef\u7528 +label.no-groups=\u65e0\u7ec4\u53ef\u7528 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.desc.xml new file mode 100644 index 0000000000..d49f459736 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Record Management Users and Groups + Administration Console - Record Management Tool Users and Groups + /rm/components/console/rm-users-and-groups + rm-console + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.head.ftl new file mode 100644 index 0000000000..4e69734968 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.head.ftl @@ -0,0 +1,37 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/people-finder/people-finder.css" /> +<@script type="text/javascript" src="${url.context}/res/components/people-finder/people-finder.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/people-finder/group-finder.css"/> +<@script type="text/javascript" src="${url.context}/res/components/people-finder/group-finder.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/console/rm-users-and-groups.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-define-roles.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/console/rm-users-and-groups.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.html.ftl new file mode 100644 index 0000000000..51225f0639 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.html.ftl @@ -0,0 +1,92 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if !hasAccess> + <#include "./rm-console-access.ftl"> +<#else> + +
+
+
+
+

${msg('label.roles')}

+
+
+
    +
+
+
+
+
+
+ +
+
+ +
+
${msg('label.groups')}
+
+
+
    +
+
+
+
+
+
+ +
+
+ +
+
${msg('label.users')}
+
+
+
    +
+
+
+
+
+ + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.js new file mode 100644 index 0000000000..9c7ffda62d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.js @@ -0,0 +1,36 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + // test user capabilities - can they access "Users and Groups"? + model.hasAccess = hasCapability(remote.connect("alfresco"), "ManageAccessControls"); +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.properties new file mode 100644 index 0000000000..3e0373a2d3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get.properties @@ -0,0 +1,29 @@ +label.roles=Roles +label.users=Users +label.groups=Groups +label.add-group=Add +label.remove-group=Remove +label.add-user=Add +label.remove-user=Remove + +message.get-roles-failure=We couldn't retrieve user roles: {0} + +message.load-peopleFinder-failure=We couldn't open the People Finder. Try refreshing your browser. +message.load-groupFinder-failure=We couldn't open the Group Finder. Try refreshing your browser. +message.adduser-success=Successfully added user ''{0}''. +message.adduser-failure=We couldn't add user ''{0}''. +message.addgroup-success=Successfully added group ''{0}''. +message.addgroup-failure=We couldn't add group ''{0}''. + +message.confirm.removeuser=If you remove ''{0}'' from this role they'll lose their user rights. +message.confirm.removeuser.title=Remove User from Role +message.removeuser-success=Successfully removed user ''{0}''. +message.removeuser-failure=We couldn't remove user ''{0}''. + +message.confirm.removegroup=If you remove ''{0}'' from this role they'll lose their user rights. +message.confirm.removegroup.title=Remove Group from Role +message.removegroup-success=Successfully removed group ''{0}''. +message.removegroup-failure=We couldn't remove group ''{0}''. + +panel.adduser.header=Add User +panel.addgroup.header=Add Group \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_de.properties new file mode 100644 index 0000000000..1dee64dc70 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_de.properties @@ -0,0 +1,29 @@ +label.roles=Rollen +label.users=Benutzer +label.groups=Gruppen +label.add-group=Hinzuf\u00fcgen +label.remove-group=Entfernen +label.add-user=Hinzuf\u00fcgen +label.remove-user=Entfernen + +message.get-roles-failure=Folgende Benutzerrollen konnten nicht abgerufen werden: {0} + +message.load-peopleFinder-failure=Mitarbeiter-Finder konnte nicht ge\u00f6ffnet werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.load-groupFinder-failure=Gruppen-Finder konnte nicht ge\u00f6ffnet werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.adduser-success=Benutzer ''{0}'' erfolgreich hinzugef\u00fcgt. +message.adduser-failure=Benutzer ''{0}'' konnte nicht hinzugef\u00fcgt werden. +message.addgroup-success=Gruppe ''{0}'' erfolgreich hinzugef\u00fcgt. +message.addgroup-failure=Gruppe ''{0}'' konnte nicht hinzugef\u00fcgt werden. + +message.confirm.removeuser=Wenn Sie ''{0}'' aus dieser Rolle entfernen, gehen die zugeh\u00f6rigen Benutzerrechte verloren. +message.confirm.removeuser.title=Benutzer aus Rolle entfernen +message.removeuser-success=Benutzer ''{0}'' erfolgreich entfernt. +message.removeuser-failure=Benutzer ''{0}'' konnte nicht entfernt werden. + +message.confirm.removegroup=Wenn Sie ''{0}'' aus dieser Rolle entfernen, gehen die zugeh\u00f6rigen Benutzerrechte verloren. +message.confirm.removegroup.title=Gruppe aus Rolle entfernen +message.removegroup-success=Gruppe ''{0}'' erfolgreich entfernt. +message.removegroup-failure=Gruppe ''{0}'' konnte nicht entfernt werden. + +panel.adduser.header=Benutzer hinzuf\u00fcgen +panel.addgroup.header=Gruppe hinzuf\u00fcgen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_es.properties new file mode 100644 index 0000000000..ab7eaf92cc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_es.properties @@ -0,0 +1,29 @@ +label.roles=Funciones +label.users=Usuarios +label.groups=Grupos +label.add-group=A\u00f1adir +label.remove-group=Eliminar +label.add-user=A\u00f1adir +label.remove-user=Eliminar + +message.get-roles-failure=No se pudo recuperar la funci\u00f3n de usuarios: {0} + +message.load-peopleFinder-failure=No se pudo abrir el Buscador de personas. Trate de actualizar el navegador. +message.load-groupFinder-failure=No se pudo abrir el Buscador de grupos. Trate de actualizar el navegador. +message.adduser-success=Usuario ''{0}'' a\u00f1adido correctamente. +message.adduser-failure=No se pudo a\u00f1adir el usuario ''{0}''. +message.addgroup-success=Grupo ''{0}'' a\u00f1adido correctamente. +message.addgroup-failure=No se pudo a\u00f1adir el grupo ''{0}''. + +message.confirm.removeuser=Si elimina a ''{0}'' de este rol, perder\u00e1 sus derechos de usuario. +message.confirm.removeuser.title=Eliminar usuario del grupo +message.removeuser-success=Usuario eliminado con \u00e9xito ''{0}''. +message.removeuser-failure=No se pudo eliminar el usuario ''{0}''. + +message.confirm.removegroup=Si elimina a ''{0}'' de este rol, perder\u00e1 sus derechos de usuario. +message.confirm.removegroup.title=Eliminar grupo del rol +message.removegroup-success=Grupo ''{0}'' eliminado correctamente. +message.removegroup-failure=No se pudo eliminar el grupo ''{0}''. + +panel.adduser.header=A\u00f1adir usuario +panel.addgroup.header=A\u00f1adir grupo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_fr.properties new file mode 100644 index 0000000000..8d0156f25b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_fr.properties @@ -0,0 +1,29 @@ +label.roles=R\u00f4les +label.users=Utilisateurs +label.groups=Groupes +label.add-group=Ajouter +label.remove-group=Retirer +label.add-user=Ajouter +label.remove-user=Retirer + +message.get-roles-failure=Impossible de r\u00e9cup\u00e9rer les r\u00f4les utilisateur\u00a0: {0} + +message.load-peopleFinder-failure=Impossible d'ouvrir l'Utilitaire de recherche de personnes. Essayez d'actualiser votre navigateur. +message.load-groupFinder-failure=Impossible d'ouvrir l'Utilitaire de recherche de groupes. Essayez d'actualiser votre navigateur. +message.adduser-success=Succ\u00e8s de l''ajout de l''utilisateur ''{0}''. +message.adduser-failure=Impossible d''ajouter l''utilisateur ''{0}''. +message.addgroup-success=Succ\u00e8s de l''ajout du groupe ''{0}''. +message.addgroup-failure=Impossible d''ajouter le groupe ''{0}''. + +message.confirm.removeuser=Si vous supprimez ''{0}'' de ce r\u00f4le, les droits d''utilisateur seront perdus. +message.confirm.removeuser.title=Retirer l'utilisateur du r\u00f4le +message.removeuser-success=Succ\u00e8s de la suppression de l''utilisateur ''{0}''. +message.removeuser-failure=Impossible de supprimer l''utilisateur ''{0}''. + +message.confirm.removegroup=Si vous supprimez ''{0}'' de ce r\u00f4le, les droits d''utilisateur seront perdus. +message.confirm.removegroup.title=Supprimer le groupe du r\u00f4le +message.removegroup-success=Le groupe ''{0}'' a bien \u00e9t\u00e9 supprim\u00e9. +message.removegroup-failure=Impossible de supprimer le groupe ''{0}''. + +panel.adduser.header=Ajouter un utilisateur +panel.addgroup.header=Ajouter un groupe diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_it.properties new file mode 100644 index 0000000000..8ef5a1eeca --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_it.properties @@ -0,0 +1,29 @@ +label.roles=Ruoli +label.users=Utenti +label.groups=Gruppi +label.add-group=Aggiungi +label.remove-group=Rimuovi +label.add-user=Aggiungi +label.remove-user=Rimuovi + +message.get-roles-failure=Impossibile recuperare ruoli utente: {0} + +message.load-peopleFinder-failure=Impossibile aprire Ricerca persone. Provare ad aggiornare il browser. +message.load-groupFinder-failure=Impossibile aprire Ricerca gruppo. Provare ad aggiornare il browser. +message.adduser-success=L''utente \u00e8 stato aggiunto ''{0}''. +message.adduser-failure=Impossibile aggiungere utente ''{0}''. +message.addgroup-success=Il gruppo \u00e8 stato aggiunto ''{0}''. +message.addgroup-failure=Impossibile aggiungere gruppo ''{0}''. + +message.confirm.removeuser=Rimuovendo ''{0}'' da questo ruolo i diritti utente andranno persi. +message.confirm.removeuser.title=Rimuovi utente da ruolo +message.removeuser-success=L''utente \u00e8 stato rimosso ''{0}''. +message.removeuser-failure=Impossibile rimuovere utente ''{0}''. + +message.confirm.removegroup=Rimuovendo ''{0}'' da questo ruolo i diritti utente andranno persi. +message.confirm.removegroup.title=Rimuovi gruppo da ruolo +message.removegroup-success=Rimozione gruppo ''{0}'' riuscita. +message.removegroup-failure=Impossibile rimuovere gruppo ''{0}''. + +panel.adduser.header=Aggiungi utente +panel.addgroup.header=Aggiungi gruppo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_ja.properties new file mode 100644 index 0000000000..b6a1c5ae3b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_ja.properties @@ -0,0 +1,29 @@ +label.roles=\u5f79\u5272 +label.users=\u30e6\u30fc\u30b6\u30fc +label.groups=\u30b0\u30eb\u30fc\u30d7 +label.add-group=\u8ffd\u52a0 +label.remove-group=\u524a\u9664 +label.add-user=\u8ffd\u52a0 +label.remove-user=\u524a\u9664 + +message.get-roles-failure=\u30e6\u30fc\u30b6\u30fc\u306e\u5f79\u5272 ''{0}'' \u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f + +message.load-peopleFinder-failure=[\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22] \u3092\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.load-groupFinder-failure=[\u30b0\u30eb\u30fc\u30d7\u306e\u691c\u7d22] \u3092\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.adduser-success=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +message.adduser-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.addgroup-success=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +message.addgroup-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +message.confirm.removeuser=\u3053\u306e\u5f79\u5272\u304b\u3089 ''{0}'' \u3092\u524a\u9664\u3059\u308b\u3068\u3001\u305d\u306e\u30e6\u30fc\u30b6\u30fc\u6a29\u9650\u304c\u5931\u308f\u308c\u307e\u3059\u3002 +message.confirm.removeuser.title=\u5f79\u5272\u304b\u3089\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664 +message.removeuser-success=\u30e6\u30fc\u30b6\u30fc\u300c{0}\uffe5\u304c\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.removeuser-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +message.confirm.removegroup=\u3053\u306e\u5f79\u5272\u304b\u3089 ''{0}'' \u3092\u524a\u9664\u3059\u308b\u3068\u3001\u305d\u306e\u30e6\u30fc\u30b6\u30fc\u6a29\u9650\u304c\u5931\u308f\u308c\u307e\u3059\u3002 +message.confirm.removegroup.title=\u5f79\u5272\u304b\u3089\u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664 +message.removegroup-success=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u304c\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.removegroup-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +panel.adduser.header=\u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0 +panel.addgroup.header=\u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_nb.properties new file mode 100644 index 0000000000..7ecd509922 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_nb.properties @@ -0,0 +1,29 @@ +label.roles=Roller +label.users=Brukere +label.groups=Grupper +label.add-group=Legg til +label.remove-group=Fjern +label.add-user=Legg til +label.remove-user=Fjern + +message.get-roles-failure=Kunne ikke hente brukerroller: {0} + +message.load-peopleFinder-failure=Kunne ikke \u00e5pne Persons\u00f8ker. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.load-groupFinder-failure=Kunne ikke \u00e5pne Gruppes\u00f8ker. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.adduser-success=Brukeren ''{0}'' er lagt til. +message.adduser-failure=Kunne ikke legge til brukeren ''{0}''. +message.addgroup-success=Gruppen ''{0}'' er lagt til. +message.addgroup-failure=Kunne ikke legge til gruppen ''{0}''. + +message.confirm.removeuser=Dersom ''{0}'' fjernes fra denne rollen, mister de deres brukerrettigheter. +message.confirm.removeuser.title=Fjern bruker fra rolle +message.removeuser-success=Brukeren ''{0}'' er fjernet. +message.removeuser-failure=Kunne ikke fjerne brukeren ''{0}''. + +message.confirm.removegroup=Dersom ''{0}'' fjernes fra denne rollen, mister de deres brukerrettigheter. +message.confirm.removegroup.title=Fjern gruppe fra rollen +message.removegroup-success=Gruppen ''{0}'' er n\u00e5 fjernet. +message.removegroup-failure=Kunne ikke fjerne gruppen ''{0}''. + +panel.adduser.header=Legg til bruker +panel.addgroup.header=Legg til gruppe diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_nl.properties new file mode 100755 index 0000000000..e0bfbd1545 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_nl.properties @@ -0,0 +1,29 @@ +label.roles=Rollen +label.users=Gebruikers +label.groups=Groepen +label.add-group=Toevoegen +label.remove-group=Verwijderen +label.add-user=Toevoegen +label.remove-user=Verwijderen + +message.get-roles-failure=Kan gebruikersrollen niet ophalen: {0} + +message.load-peopleFinder-failure=Kan Mensen zoeken niet openen. Vernieuw de browser. +message.load-groupFinder-failure=Kan Groep zoeken niet openen. Vernieuw de browser. +message.adduser-success=Gebruiker ''{0}'' is toegevoegd. +message.adduser-failure=Kan gebruiker ''{0}'' niet toevoegen. +message.addgroup-success=Groep ''{0}'' is toegevoegd. +message.addgroup-failure=Kan groep ''{0}'' niet toevoegen. + +message.confirm.removeuser=Als u ''{0}'' uit deze rol verwijdert, gaan alle bijbehorende gebruikersrechten verloren. +message.confirm.removeuser.title=Gebruiker uit rol verwijderen +message.removeuser-success=Gebruiker ''{0}'' is verwijderd. +message.removeuser-failure=Kan gebruiker ''{0}'' niet verwijderen. + +message.confirm.removegroup=Als u ''{0}'' uit deze rol verwijdert, gaan alle bijbehorende gebruikersrechten verloren. +message.confirm.removegroup.title=Groep uit rol verwijderen +message.removegroup-success=Groep ''{0}'' is verwijderd. +message.removegroup-failure=Kan groep ''{0}'' niet verwijderen. + +panel.adduser.header=Gebruiker toevoegen +panel.addgroup.header=Groep toevoegen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_pt_BR.properties new file mode 100644 index 0000000000..978865bcd2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_pt_BR.properties @@ -0,0 +1,29 @@ +label.roles=Fun\u00e7\u00f5es +label.users=Usu\u00e1rios +label.groups=Grupos +label.add-group=Adicionar +label.remove-group=Excluir +label.add-user=Adicionar +label.remove-user=Excluir + +message.get-roles-failure=N\u00e3o foi poss\u00edvel recuperar as fun\u00e7\u00f5es de usu\u00e1rio: {0} + +message.load-peopleFinder-failure=N\u00e3o foi poss\u00edvel abrir o Localizador de pessoas. Tente atualizar seu navegador. +message.load-groupFinder-failure=N\u00e3o foi poss\u00edvel abrir o Localizador de grupos. Tente atualizar seu navegador. +message.adduser-success=Usu\u00e1rio ''{0}'' adicionado com sucesso. +message.adduser-failure=N\u00e3o foi poss\u00edvel adicionar o usu\u00e1rio ''{0}''. +message.addgroup-success=Grupo ''{0}'' adicionado com sucesso. +message.addgroup-failure=N\u00e3o foi poss\u00edvel adicionar o grupo ''{0}''. + +message.confirm.removeuser=Se voc\u00ea remover ''{0}'' dessa fun\u00e7\u00e3o, voc\u00ea perder\u00e1 seus direitos de usu\u00e1rio. +message.confirm.removeuser.title=Remover usu\u00e1rio da fun\u00e7\u00e3o +message.removeuser-success=Usu\u00e1rio ''{0}'' removido com sucesso. +message.removeuser-failure=N\u00e3o foi poss\u00edvel remover o usu\u00e1rio ''{0}''. + +message.confirm.removegroup=Se voc\u00ea remover ''{0}'' dessa fun\u00e7\u00e3o, voc\u00ea perder\u00e1 seus direitos de usu\u00e1rio. +message.confirm.removegroup.title=Remover grupo da fun\u00e7\u00e3o +message.removegroup-success=Grupo ''{0}'' removido com sucesso. +message.removegroup-failure=N\u00e3o foi poss\u00edvel remover o grupo ''{0}''. + +panel.adduser.header=Adicionar usu\u00e1rio +panel.addgroup.header=Adicionar grupo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_ru.properties new file mode 100644 index 0000000000..c5613fee74 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_ru.properties @@ -0,0 +1,29 @@ +label.roles=\u0420\u043e\u043b\u0438 +label.users=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +label.groups=\u0413\u0440\u0443\u043f\u043f\u044b +label.add-group=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c +label.remove-group=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +label.add-user=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c +label.remove-user=\u0423\u0434\u0430\u043b\u0438\u0442\u044c + +message.get-roles-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {0} + +message.load-peopleFinder-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c ''\u041f\u043e\u0438\u0441\u043a \u043b\u044e\u0434\u0435\u0439''. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.load-groupFinder-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c ''\u041f\u043e\u0438\u0441\u043a \u043b\u044e\u0434\u0435\u0439''. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.adduser-success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c ''{0}'' \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d. +message.adduser-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ''{0}''. +message.addgroup-success=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430. +message.addgroup-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''. + +message.confirm.removeuser=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0438\u0437 \u044d\u0442\u043e\u0439 \u0440\u043e\u043b\u0438, \u043e\u043d\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u043e\u0438 \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +message.confirm.removeuser.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0440\u043e\u043b\u0438 +message.removeuser-success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c ''{0}'' \u0443\u0434\u0430\u043b\u0435\u043d. +message.removeuser-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ''{0}''. + +message.confirm.removegroup=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0438\u0437 \u044d\u0442\u043e\u0439 \u0440\u043e\u043b\u0438, \u043e\u043d\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u043e\u0438 \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +message.confirm.removegroup.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 \u0440\u043e\u043b\u0438 +message.removegroup-success=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430. +message.removegroup-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''. + +panel.adduser.header=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +panel.addgroup.header=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_zh_CN.properties new file mode 100644 index 0000000000..e17dd5a4fb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/console/rm-users-and-groups.get_zh_CN.properties @@ -0,0 +1,29 @@ +label.roles=\u89d2\u8272 +label.users=\u7528\u6237 +label.groups=\u7ec4 +label.add-group=\u6dfb\u52a0 +label.remove-group=\u79fb\u9664 +label.add-user=\u6dfb\u52a0 +label.remove-user=\u79fb\u9664 + +message.get-roles-failure=\u6211\u4eec\u65e0\u6cd5\u68c0\u7d22\u7528\u6237\u89d2\u8272\uff1a{0} + +message.load-peopleFinder-failure=\u6211\u4eec\u65e0\u6cd5\u6253\u5f00\u4eba\u5458\u67e5\u627e\u5668\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.load-groupFinder-failure=\u6211\u4eec\u65e0\u6cd5\u6253\u5f00\u7ec4\u67e5\u627e\u5668\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.adduser-success=\u5df2\u6210\u529f\u6dfb\u52a0\u7528\u6237 ''{0}''\u3002 +message.adduser-failure=\u6211\u4eec\u65e0\u6cd5\u6dfb\u52a0\u7528\u6237 ''{0}''\u3002 +message.addgroup-success=\u5df2\u6210\u529f\u6dfb\u52a0\u7ec4 ''{0}''\u3002 +message.addgroup-failure=\u6211\u4eec\u65e0\u6cd5\u6dfb\u52a0\u7ec4 ''{0}''\u3002 + +message.confirm.removeuser=\u5982\u679c\u60a8\u4ece\u6b64\u89d2\u8272\u4e2d\u5220\u9664 ''{0}''\uff0c\u5219\u4ed6\u4eec\u4f1a\u4e22\u5931\u5176\u7528\u6237\u6743\u9650\u3002 +message.confirm.removeuser.title=\u4ece\u89d2\u8272\u4e2d\u5220\u9664\u7528\u6237 +message.removeuser-success=\u5df2\u6210\u529f\u79fb\u9664\u7528\u6237 ''{0}''\u3002 +message.removeuser-failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u7528\u6237 ''{0}''\u3002 + +message.confirm.removegroup=\u5982\u679c\u60a8\u4ece\u6b64\u89d2\u8272\u4e2d\u5220\u9664 ''{0}''\uff0c\u5219\u4ed6\u4eec\u4f1a\u4e22\u5931\u5176\u7528\u6237\u6743\u9650\u3002 +message.confirm.removegroup.title=\u4ece\u89d2\u8272\u4e2d\u5220\u9664\u7ec4 +message.removegroup-success=\u5df2\u6210\u529f\u79fb\u9664\u7ec4 ''{0}''\u3002 +message.removegroup-failure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u7ec4 ''{0}''\u3002 + +panel.adduser.header=\u6dfb\u52a0\u7528\u6237 +panel.addgroup.header=\u6dfb\u52a0\u7ec4 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.desc.xml new file mode 100644 index 0000000000..0c348d3771 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.desc.xml @@ -0,0 +1,6 @@ + + RM Data Set Import + A site dashlet to import a selected data set into a file plan + site-dashlet + /rm/components/dashlets/datasets + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.head.ftl new file mode 100644 index 0000000000..3254b94a11 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@script type="text/javascript" src="${url.context}/res/rm/components/dashlets/datasets.js"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/dashlets/datasets.css" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.html.ftl new file mode 100644 index 0000000000..2de33e8c0d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.html.ftl @@ -0,0 +1,73 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid?html> + +
+
${msg("dataSet.header.title")}
+ <#if isRmSite> + <#if isAdmin> +
+ + + + + + + + + + + + +
+ <#else> +
+
+ ${msg("dataset.not-rm-admin")} +
+
+ + <#else> +
+
+ ${msg("dataset.not-rm-site")} +
+
+ +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.js new file mode 100644 index 0000000000..31c1e44704 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.js @@ -0,0 +1,49 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + var site = url.templateArgs.site; + + model.data = {}; + model.isAdmin = false; + + // Check if the user is an RM Admin + var conn = remote.connect("alfresco"); + if (isAdmin(conn)) + { + model.data = getDataSets(conn, site); + model.isAdmin = true; + } + + // Check if the site is an RM site + model.isRmSite = isRmSite(conn, site); +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.properties new file mode 100644 index 0000000000..08b4558a08 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Import Data Set +dataSet.label=Data Set +dataSet.select.title=Select a data set and click Import to load the test data. +dataSet.select.label=Select a data set +dataSet.importButton.text=Import +dataSet.message.importing=Importing Records Management test data... +dataSet.message.import-ok=Selected data set has been successfully imported. +dataSet.message.import-fail=We couldn't import test data into the Records Management site. The data might contain errors or there might already be data in the file plan. +dataset.not-rm-admin=You don't have the permission level to import a data set. +dataset.not-rm-site=This dashlet can only be used for Records Management sites. \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_de.properties new file mode 100644 index 0000000000..88b095b660 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_de.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Datensatz importieren +dataSet.label=Datensatz +dataSet.select.title=W\u00e4hlen Sie einen Datensatz aus und klicken Sie auf 'Importieren', um die Testdaten zu laden. +dataSet.select.label=Datensatz ausw\u00e4hlen +dataSet.importButton.text=Importieren +dataSet.message.importing=Records Management-Testdaten werden importiert... +dataSet.message.import-ok=Ausgew\u00e4hlter Datensatz wurde erfolgreich importiert. +dataSet.message.import-fail=Testdaten konnten nicht in die Records Management Site importiert werden. Die Daten k\u00f6nnen Fehler enthalten oder es sind m\u00f6glicherweise bereits Daten im Ablageplan vorhanden. +dataset.not-rm-admin=Ihre Berechtigungsstufe ist zum Importieren eines Datensatzes nicht ausreichend. +dataset.not-rm-site=Dieses Dashlet kann nur f\u00fcr Records Management Sites verwendet werden. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_es.properties new file mode 100644 index 0000000000..7e7063fa66 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_es.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Importar conjunto de datos +dataSet.label=Conjunto de datos +dataSet.select.title=Seleccione un conjunto de datos y haga clic en Importar para cargar los datos de prueba. +dataSet.select.label=Seleccione un conjunto de datos +dataSet.importButton.text=Importar +dataSet.message.importing=Importando datos de prueba de Records Management... +dataSet.message.import-ok=Conjunto de datos seleccionado importado correctamente. +dataSet.message.import-fail=No se pudieron importar los datos de prueba al sitio de Records Management. Los datos pueden contener errores o ya puede haber datos en el cuadro de clasificaci\u00f3n. +dataset.not-rm-admin=No tiene el nivel de permiso para importar conjuntos de datos. +dataset.not-rm-site=Este dashlet solo se puede utilizar para sitios de Records Management. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_fr.properties new file mode 100644 index 0000000000..8be7755744 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_fr.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Importer un ensemble de donn\u00e9es +dataSet.label=Ensemble de donn\u00e9es +dataSet.select.title=S\u00e9lectionnez un ensemble de donn\u00e9es et cliquez sur Importer pour charger les donn\u00e9es de test. +dataSet.select.label=S\u00e9lectionner un ensemble de donn\u00e9es +dataSet.importButton.text=Importer +dataSet.message.importing=Importation des donn\u00e9es de test de gestion des archives... +dataSet.message.import-ok=L'ensemble de donn\u00e9es s\u00e9lectionn\u00e9 a bien \u00e9t\u00e9 import\u00e9. +dataSet.message.import-fail=Impossible d'importer les donn\u00e9es de test sur le site de gestion des archives. Il se peut que les donn\u00e9es contiennent des erreurs ou que le plan de classement comporte d\u00e9j\u00e0 des donn\u00e9es. +dataset.not-rm-admin=Vous ne disposez pas du niveau d'autorisation vous autorisant \u00e0 importer un ensemble de donn\u00e9es. +dataset.not-rm-site=Ce dashlet ne peut \u00eatre utilis\u00e9 que pour les sites RM ! diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_it.properties new file mode 100644 index 0000000000..fe5acd09de --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_it.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Importa set di dati +dataSet.label=Set di dati +dataSet.select.title=Selezionare un set di dati e fare clic su Importa per caricare i dati di prova. +dataSet.select.label=Seleziona un set di dati +dataSet.importButton.text=Importa +dataSet.message.importing=Importazione dati di prova di Records Management... +dataSet.message.import-ok=Importazione set di dati selezionato riuscita. +dataSet.message.import-fail=Impossibile importare dati di prova nel sito di Records Management. I dati potrebbero contenere errori o nel piano di fascicolazione potrebbero essere gi\u00e0 presenti dei dati. +dataset.not-rm-admin=Non si dispone del livello di autorizzazione necessario per importare un set di dati. +dataset.not-rm-site=Questo dashlet pu\u00f2 essere utilizzato solo per i siti di Records Management. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_ja.properties new file mode 100644 index 0000000000..be40dfb66a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_ja.properties @@ -0,0 +1,10 @@ +dataSet.header.title=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u30a4\u30f3\u30dd\u30fc\u30c8 +dataSet.label=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8 +dataSet.select.title=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u9078\u629e\u3057\u3001[\u30a4\u30f3\u30dd\u30fc\u30c8] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3093\u3067\u304f\u3060\u3055\u3044\u3002 +dataSet.select.label=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u9078\u629e +dataSet.importButton.text=\u30a4\u30f3\u30dd\u30fc\u30c8 +dataSet.message.importing=\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406\u306e\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059... +dataSet.message.import-ok=\u9078\u629e\u3057\u305f\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u304c\u30a4\u30f3\u30dd\u30fc\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 +dataSet.message.import-fail=[\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406] \u30b5\u30a4\u30c8\u306b\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30c7\u30fc\u30bf\u306b\u30a8\u30e9\u30fc\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u304b\u3001\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u306b\u3059\u3067\u306b\u30c7\u30fc\u30bf\u304c\u5b58\u5728\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 +dataset.not-rm-admin=\u73fe\u5728\u306e\u6a29\u9650\u30ec\u30d9\u30eb\u3067\u306f\u3001\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3002 +dataset.not-rm-site=\u3053\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306f\u3001[\u30ec\u30b3\u30fc\u30c9\u7ba1\u7406] \u30b5\u30a4\u30c8\u3067\u3057\u304b\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_nb.properties new file mode 100644 index 0000000000..af52abcf10 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_nb.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Importer datasett +dataSet.label=Datasett +dataSet.select.title=Velg datasett, og klikk p\u00e5 Importer for \u00e5 laste inn testdata. +dataSet.select.label=Velg et datasett +dataSet.importButton.text=Importer +dataSet.message.importing=Importerer testdata til oppf\u00f8ringsh\u00e5ndtering... +dataSet.message.import-ok=Det valgte datasettet er n\u00e5 importert. +dataSet.message.import-fail=Kunne ikke importere testdata til stedet med oppf\u00f8ringsh\u00e5ndtering. Dataene kan eventuelt inneholde feil eller det finnes muligens allerede data i filplanen. +dataset.not-rm-admin=Du har ikke tilgangsniv\u00e5et for \u00e5 kunne importere et datasett. +dataset.not-rm-site=Dette dashlet kan bare brukes til oppf\u00f8ringsh\u00e5ndteringssteder. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_nl.properties new file mode 100755 index 0000000000..34701b6f13 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_nl.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Gegevensverzameling importeren +dataSet.label=Gegevensverzameling +dataSet.select.title=Selecteer een gegevensverzameling en klik op Importeren om de testgegevens te laden. +dataSet.select.label=Een gegevensverzameling selecteren +dataSet.importButton.text=Importeren +dataSet.message.importing=Testgegevens voor Records Management importeren... +dataSet.message.import-ok=De geselecteerde gegevensverzameling is ge\u00efmporteerd. +dataSet.message.import-fail=Kan testgegevens niet naar de Records Management-site importeren. De gegevens kunnen fouten bevatten of het ordeningsplan bevat mogelijk al gegevens. +dataset.not-rm-admin=U hebt geen rechten voor het importeren van een gegevensverzameling. +dataset.not-rm-site=Deze dashlet kan alleen voor Records Management-sites worden gebruikt. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_pt_BR.properties new file mode 100644 index 0000000000..9fa71c4147 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_pt_BR.properties @@ -0,0 +1,10 @@ +dataSet.header.title=Importar conjunto de dados +dataSet.label=Conjunto de dados +dataSet.select.title=Selecione um conjunto de dados e clique em Importar para carregar para testar dos dados. +dataSet.select.label=Selecionar um conjunto de dados +dataSet.importButton.text=Importar +dataSet.message.importing=Importando dados de teste do Records Management... +dataSet.message.import-ok=Conjunto de dados selecionado foi importado com sucesso. +dataSet.message.import-fail=N\u00e3o foi poss\u00edvel importar os dados para o site do Records Management. Os dados podem conter erros ou j\u00e1 pode haver dados no plano de arquivamento. +dataset.not-rm-admin=Voc\u00ea n\u00e3o tem permiss\u00e3o para importar um conjunto de dados. +dataset.not-rm-site=Esse dashlet pode ser usado somente para sites do Records Management. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_ru.properties new file mode 100644 index 0000000000..1c95d1a09d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_ru.properties @@ -0,0 +1,10 @@ +dataSet.header.title=\u0418\u043c\u043f\u043e\u0440\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 +dataSet.label=\u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 +dataSet.select.title=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0449\u0435\u043b\u043a\u043d\u0438\u0442\u0435 '\u0418\u043c\u043f\u043e\u0440\u0442', \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. +dataSet.select.label=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 +dataSet.importButton.text=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c +dataSet.message.importing=\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u043f\u043e\u0440\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438... +dataSet.message.import-ok=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d. +dataSet.message.import-fail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. \u0412 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043b\u0438\u0431\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. +dataset.not-rm-admin=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u0435\u043d \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. +dataset.not-rm-site=\u042d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_zh_CN.properties new file mode 100644 index 0000000000..42279f191d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/datasets.get_zh_CN.properties @@ -0,0 +1,10 @@ +dataSet.header.title=\u5bfc\u5165\u6570\u636e\u96c6 +dataSet.label=\u6570\u636e\u96c6 +dataSet.select.title=\u9009\u62e9\u6570\u636e\u96c6\u5e76\u5355\u51fb\u201c\u5bfc\u5165\u201d\u6765\u52a0\u8f7d\u6d4b\u8bd5\u6570\u636e\u3002 +dataSet.select.label=\u9009\u62e9\u6570\u636e\u96c6 +dataSet.importButton.text=\u5bfc\u5165 +dataSet.message.importing=\u6b63\u5728\u5bfc\u5165\u8bb0\u5f55\u7ba1\u7406\u6d4b\u8bd5\u6570\u636e... +dataSet.message.import-ok=\u5df2\u6210\u529f\u5bfc\u5165\u6240\u9009\u6570\u636e\u96c6\u3002 +dataSet.message.import-fail=\u6211\u4eec\u65e0\u6cd5\u5c06\u6d4b\u8bd5\u6570\u636e\u5bfc\u5165\u8bb0\u5f55\u7ba1\u7406\u7ad9\u70b9\u3002 \u6570\u636e\u53ef\u80fd\u5305\u542b\u9519\u8bef\u6216\u5f52\u7c7b\u65b9\u6848\u4e2d\u5df2\u6709\u8be5\u6570\u636e\u3002 +dataset.not-rm-admin=\u60a8\u6ca1\u6709\u5bfc\u5165\u6570\u636e\u96c6\u7684\u6743\u9650\u7ea7\u522b\u3002 +dataset.not-rm-site=\u6b64 Dashlet \u53ea\u80fd\u7528\u4e8e\u8bb0\u5f55\u7ba1\u7406\u7ad9\u70b9\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/rm-utils.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/rm-utils.js new file mode 100644 index 0000000000..37444d6b04 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/dashlets/rm-utils.js @@ -0,0 +1,102 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +function isAdmin(conn) +{ + var roles = conn.get("/api/rma/admin/rmroles?user=" + encodeURIComponent(user.id)); + var rolesData = eval('(' + roles + ')').data; + + if (isEmpty(rolesData)) + { + // No roles found. Probably there is no file plan + // Check if the user is "admin" + return user.isAdmin; + } + + for (var role in rolesData) + { + if (rolesData[role].name === "Administrator") + { + return true; + } + } + return false; +} + +function isEmpty(jsonObject) +{ + var key; + for (key in jsonObject) { + return false; + } + return true; +} + +function getDataSets(conn, site) +{ + var data = {}, + json = conn.get("/api/rma/datasets?site=" + site); + + if (json.status == 200) + { + var obj = eval('(' + json + ')'); + if (obj) + { + data = obj.data; + } + } + + return data; +} + +function isRmSite(conn, site) +{ + var isRmSite = false, + json = conn.get("/api/sites/" + site); + + if (json.status == 200) + { + var obj = eval('(' + json + ')'); + if (obj) + { + isRmSite = obj.sitePreset == "rm-site-dashboard"; + } + } + + return isRmSite; +} + +function isRmUser(conn) { + var roles = conn.get("/api/rma/admin/rmroles?user=" + encodeURIComponent(user.id)); + var rolesData = eval('(' + roles + ')').data; + + if (isEmpty(rolesData)) + { + // No roles found or there is no file plan + return false; + } + return true; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.config.xml new file mode 100644 index 0000000000..768f4558d7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.config.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.desc.xml new file mode 100644 index 0000000000..b28cd35bc0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.desc.xml @@ -0,0 +1,5 @@ + + document-details-actions + Document Details Actions Component + /rm/components/document-details/document-actions + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.head.ftl new file mode 100644 index 0000000000..7e7627ff53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.head.ftl @@ -0,0 +1,31 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/document-details/document-actions.css" /> +<@script type="text/javascript" src="${url.context}/res/components/document-details/document-actions.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/document-details/document-actions.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.html.ftl new file mode 100644 index 0000000000..5b6d033c38 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.html.ftl @@ -0,0 +1,57 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if documentDetailsJSON??> + + <#assign el=args.htmlid?js_string> + + +
+

+ ${msg("heading")} +

+
+
+
+
+ + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.js new file mode 100644 index 0000000000..984dfdbf7b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.js @@ -0,0 +1,48 @@ + + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() +{ + AlfrescoUtil.param('nodeRef'); + AlfrescoUtil.param('site', null); + AlfrescoUtil.param('container', 'documentLibrary'); + + var documentDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site, + { + actions: true + }); + if (documentDetails) + { + model.documentDetailsJSON = jsonUtils.toJSONString(documentDetails); + doclibCommon(); + } +}; + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.properties new file mode 100644 index 0000000000..20c5ce9178 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get.properties @@ -0,0 +1,4 @@ +heading=Actions + +## Pop-up Messages +message.error=We couldn't access the File Plan. Try refreshing your browser or contact your I.T. Dept. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_de.properties new file mode 100644 index 0000000000..8e54a30b27 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_de.properties @@ -0,0 +1,4 @@ +heading=Aktionen + +## Pop-up Messages +message.error=Auf Ablageplan konnte nicht zugegriffen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen, oder kontakten Sie Ihre IT-Abteilung. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_es.properties new file mode 100755 index 0000000000..3e5834cc6a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_es.properties @@ -0,0 +1,4 @@ +heading=Acciones + +## Pop-up Messages +message.error=No se pudo acceder al cuadro de clasificaci\u00f3n. Trate de actualizar el navegador o p\u00f3ngase en contacto con el dep. de TI. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_fr.properties new file mode 100644 index 0000000000..c118dd8e25 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_fr.properties @@ -0,0 +1,4 @@ +heading=Actions + +## Pop-up Messages +message.error=Impossible d'acc\u00e9der au plan de classement. Essayez d'actualiser votre navigateur ou contactez votre DSI. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_it.properties new file mode 100644 index 0000000000..706971d000 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_it.properties @@ -0,0 +1,4 @@ +heading=Azioni + +## Pop-up Messages +message.error=Impossibile accedere a Piano di fascicolazione. Provare ad aggiornare il browser o contattare il proprio reparto IT. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_ja.properties new file mode 100644 index 0000000000..03601db3a5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_ja.properties @@ -0,0 +1,4 @@ +heading=\u51e6\u7406 + +## Pop-up Messages +message.error=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3059\u308b\u304b\u3001IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_nb.properties new file mode 100644 index 0000000000..92e31cdf1a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_nb.properties @@ -0,0 +1,4 @@ +heading=Handlinger + +## Pop-up Messages +message.error=Fikk ikke tilgang til filplanen. Pr\u00f8v \u00e5 oppdatere nettleseren, eller kontakt din IT- avdeling. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_nl.properties new file mode 100755 index 0000000000..78fd4d99fe --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_nl.properties @@ -0,0 +1,4 @@ +heading=Acties + +## Pop-up Messages +message.error=Kan het ordeningsplan niet openen. Vernieuw de browser of neem contact op met uw IT-afdeling diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_pt_BR.properties new file mode 100644 index 0000000000..f4c00cf4a3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_pt_BR.properties @@ -0,0 +1,4 @@ +heading=A\u00e7\u00f5es + +## Pop-up Messages +message.error=N\u00e3o foi poss\u00edvel acessar o Plano de arquivamento. Tente atualizar seu navegador ou entre em contato com o Dept. de TI. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_ru.properties new file mode 100644 index 0000000000..3dfbc373cb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_ru.properties @@ -0,0 +1,4 @@ +heading=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f + +## Pop-up Messages +message.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_zh_CN.properties new file mode 100644 index 0000000000..341e17a050 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/document-details/document-actions.get_zh_CN.properties @@ -0,0 +1,4 @@ +heading=\u64cd\u4f5c + +## Pop-up Messages +message.error=\u6211\u4eec\u65e0\u6cd5\u8bbf\u95ee\u5f52\u7c7b\u65b9\u6848\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/actions-common.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/actions-common.get.desc.xml new file mode 100644 index 0000000000..0183707a06 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/actions-common.get.desc.xml @@ -0,0 +1,5 @@ + + DocLib Actions Common + Document Library: Record Common Actions Component + /rm/components/documentlibrary/actions-common + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/actions-common.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/actions-common.get.html.ftl new file mode 100644 index 0000000000..7688bba176 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/actions-common.get.html.ftl @@ -0,0 +1,47 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +<@script type="text/javascript" src="${url.context}/res/components/documentlibrary/actions.js" group="documentlibrary"/> +<@script type="text/javascript" src="${url.context}/res/rm/components/documentlibrary/actions.js" group="documentlibrary"/> + +<@script type="text/javascript" src="${url.context}/res/modules/simple-dialog.js" group="documentlibrary"/> +<@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/site-folder.js" group="documentlibrary"/> + +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/copy-move-link-file-to.js" group="documentlibrary"/> + +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/file-report.js" group="documentlibrary"/> + +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/hold/hold.js" group="documentlibrary" /> +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/hold/remove-from-hold.js" group="documentlibrary" /> +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/hold/add-to-hold.js" group="documentlibrary" /> + + +<#-- Common actions styles --> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/documentlibrary/actions.css" group="documentlibrary"/> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/documentlibrary/site-folder.css" group="documentlibrary"/> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/modules/documentlibrary/file-report.css" group="documentlibrary"/> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/modules/documentlibrary/hold/hold.css" group="documentlibrary"/> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.desc.xml new file mode 100644 index 0000000000..dc385ae28a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.desc.xml @@ -0,0 +1,7 @@ + + rm-surf-doclist + RM Web Tier Document List Component - doclist data webscript endpoint + /rm/components/documentlibrary/data/{webscript}/{params} + /rm/components/documentlibrary/data/site/{site}/{webscript}/{params} + argument + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.js new file mode 100644 index 0000000000..24bc2c298c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.js @@ -0,0 +1,29 @@ + + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.json.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.json.ftl new file mode 100644 index 0000000000..b4b8b90131 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.get.json.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + + <#include "/org/alfresco/components/documentlibrary/data/surf-doclist.get.json.ftl"> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.lib.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.lib.js new file mode 100644 index 0000000000..4eac07231a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/data/rm-surf-doclist.lib.js @@ -0,0 +1,75 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +// Keep a reference to the original implementation +DocList.inheritedGetAllMetadataTemplates = DocList.getAllMetadataTemplates; + +/* + * Override getAllMetadataTemplates to return rm templates first + * fix for RM-3202 + */ +DocList.getAllMetadataTemplates = function getAllMetadataTemplates() +{ + var templates, template, rmTemplates = [], otherTemplates = [], orderedTemplates = {}; + + try + { + // get the original list of templates + templates = DocList.inheritedGetAllMetadataTemplates(); + + // separate the rm templates from the other templates + for each (template in templates) + { + if(template.id.startsWith("rm")) + { + rmTemplates.push(template); + } + else + { + otherTemplates.push(template); + } + } + + // add the rm templates to the final template list + for each(template in rmTemplates) + { + orderedTemplates[template.id] = template; + } + // add the other templates to the final template list + for each(template in otherTemplates) + { + orderedTemplates[template.id] = template; + } + } + catch(e) + { + } + + return orderedTemplates; +}; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.desc.xml new file mode 100644 index 0000000000..a74ad78986 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.desc.xml @@ -0,0 +1,5 @@ + + DocLib DocumentList (v2) + Document Library: Combination of document list and toolbar + /rm/components/documentlibrary/documentlist_v2 + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.html.ftl new file mode 100644 index 0000000000..274fb177e2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.html.ftl @@ -0,0 +1,59 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "documentlist-v2.lib.ftl" /> +<#include "/org/alfresco/components/form/form.dependencies.inc"> + +<@processJsonModel group="share"/> + +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/documentlibrary/toolbar.css" group="documentlibrary"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/documentlibrary/toolbar.css" group="documentlibrary"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/documentlibrary/documentlist.css" group="documentlibrary"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/documentlibrary/documentlist_v2.css" group="documentlibrary"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/document-details/relationships.css" group="documentlibrary"/> + <@viewRenderererCssDeps/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/documentlibrary/toolbar.js" group="documentlibrary"/> + <@script type="text/javascript" src="${url.context}/res/rm/components/documentlibrary/toolbar.js" group="documentlibrary"/> + <@script type="text/javascript" src="${url.context}/res/components/documentlibrary/documentlist.js" group="documentlibrary"/> + <@script type="text/javascript" src="${url.context}/res/rm/components/documentlibrary/documentlist.js" group="documentlibrary"/> + <@viewRenderererJsDeps/> + + +<@markup id="widgets"> + <@createWidgets group="documentlibrary"/> + + +<@uniqueIdDiv> + <@markup id="html"> + <@documentlistTemplate/> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.js new file mode 100644 index 0000000000..60b8dd9ee8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.js @@ -0,0 +1,95 @@ + + + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +doclibCommon(); + +function widgets() +{ + var useTitle = "true"; + var docLibConfig = config.scoped["DocumentLibrary"]; + if (docLibConfig != null) + { + var tmp = docLibConfig["use-title"]; + useTitle = tmp != null ? tmp : "true"; + } + + var docListToolbar = { + id: "DocListToolbar", + name: "Alfresco.rm.component.DocListToolbar", + assignTo: "docListToolbar", + options: { + siteId: (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + hideNavBar: Boolean(toolbar.preferences.hideNavBar) + } + }; + + var documentList = { + id : "DocumentList", + name : "Alfresco.rm.component.DocumentList", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : template.properties.container != null ? template.properties.container : "documentLibrary", + rootNode : model.rootNode != null ? model.rootNode : "null", + usePagination : (args.pagination == "true"), + sortAscending : (model.preferences.sortAscending != null ? model.preferences.sortAscending : true), + sortField : model.preferences.sortField != null ? model.preferences.sortField : "cm:name", + showFolders : (model.preferences.showFolders != null ? model.preferences.showFolders : true), + simpleView : model.preferences.simpleView != null ? model.preferences.simpleView : "null", + viewRenderers: model.viewRenderers, + highlightFile : page.url.args["file"] != null ? page.url.args["file"] : "", + replicationUrlMapping : model.replicationUrlMapping != null ? model.replicationUrlMapping : "{}", + repositoryBrowsing : model.rootNode != null, + useTitle : (model.useTitle != null ? model.useTitle == "true" : true), + userIsSiteManager : model.userIsSiteManager, + associatedToolbar: { _alfValue: "docListToolbar", _alfType: "REFERENCE" }, + commonComponentStyle : model.commonComponentStyle, + suppressComponent : model.suppressComponent + } + }; + if (model.repositoryUrl != null) + { + documentList.options.repositoryUrl = model.repositoryUrl; + } + + model.widgets = [docListToolbar, documentList]; +} + +widgets(); + +model.jsonModel = { + services: [ + "alfresco/services/DocumentService", + "alfresco/services/NotificationService", + "alfresco/services/OptionsService", + "alfresco/services/DialogService", + "rm/services/RelationshipService" + ] +}; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.properties new file mode 100644 index 0000000000..57d609902e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=New Category +button.new-folder=New Folder +button.new-unfiledRecords-folder=New Folder +button.new-hold=New Hold +button.upload=File +button.declare-record=Declare Record +button.import=Import +button.export-all=Export All +button.manage-permissions=Manage Permissions +button.up=Up +button.customize=Customize +button.navbar.show=Show Breadcrumb +button.navbar.hide=Hide Breadcrumb +button.fullwindow.enter=Full Window +button.fullscreen.enter=Full Screen +button.fullscreen.exit=Exit Full Screen +button.setDefaultView=Set "{0}" as default for this folder +button.removeDefaultView=Remove "{0}" as default for this folder +button.electronic=Electronic +button.non-electronic=Non-electronic +button.report=Report +button.manage-rules=Manage Rules +button.options=Options + +## Dialog labels +label.new-rma_recordCategory.title=New Record Category +label.new-rma_recordCategory.header=Record Category Details +label.new-rma_recordFolder.title=New Record Folder +label.new-rma_recordFolder.header=Record Folder Details +label.new-rma_hold.title=New Hold +label.new-rma_hold.header=New Hold Details +label.new-rma_unfiledRecordFolder.title=New Folder +label.new-rma_unfiledRecordFolder.header=Folder Details +label.new-rma_nonElectronicDocument.title=Non-electronic Record +label.new-rma_nonElectronicDocument.header=Record Details + +## Drop-down Menus +menu.selected-items=Selected Items... +menu.selected-items.deselect-all=Deselect All + +menu.selected-items.accession=Accession +menu.selected-items.accession-complete=Accession Confirmation +menu.selected-items.copy-to=Copy to... +menu.selected-items.cutoff=Cut Off +menu.selected-items.delete=Delete +menu.selected-items.destroy=Destroy +menu.selected-items.export=Export +menu.selected-items.link-to=Link to... +menu.selected-items.file-to=File to... +menu.selected-items.move-to=Move to... +menu.selected-items.reviewed=Reviewed +menu.selected-items.transfer=Transfer +menu.selected-items.transfer-complete=Transfer Confirmation +menu.selected-items.undo-cutoff=Undo Cut Off + +## Pop-up Messages +message.file.type=Are you filing an Electronic or Non-electronic Record? +message.file.type.title=Filing Type +message.multiple-delete.failure={0} items successfully deleted. {1} items couldn't be deleted. +message.multiple-delete.success=Successfully deleted {0} item(s) +title.multiple-delete.confirm=Multiple Delete +message.multiple-delete.confirm=The following {0} items will be removed from the file plan. +message.multiple-delete.please-wait=Deleting records... +message.new-unknown.error=We couldn't find type ''{0}''. +message.new-category.failure=We couldn't create category ''{0}'' +message.new-folder.failure=We couldn't create folder ''{0}'' +message.new-record.failure=We couldn't create ''{0}'' +message.new-unfiledRecordsFolder.failure=We couldn't create unfiled records folder ''{0}'' +message.new-hold.failure=We couldn't create hold ''{0}'' +message.new-category.success=Category ''{0}'' created +message.new-folder.success=Folder ''{0}'' created +message.new-record.success=Record ''{0}'' created +message.new-unfiledRecordsFolder.success=Unfiled records folder ''{0}'' created +message.new-hold.success=Hold ''{0}'' created +message.load-top-level-assets.failure=We couldn't export all because the top level assets couldn't be loaded. +message.nothing-to-export=Nothing to export + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Results of Saved Search +description.savedsearch.more="{0}" +description.transfers=Transfers +description.transfers.more=(Records awaiting Transfer or Accession Completion) +description.transfers.more.filterDisplay=currently viewing "{0}" +description.holds=Active Holds +description.holds.more=(Items that are on Hold) +description.holds.more.filterDisplay=currently viewing "{0}" +description.unfiledRecords=Unfiled Records +description.unfiledRecords.more=(Records that are not filed) +description.unfiledRecords.more.filterDisplay=currently viewing "{0}" + +## Browser dialogs +label.filter-description.acp=Alfresco Content Package file (.acp) +label.filter-description.zip=Archive package (.zip) + +## Pop-up Messages +# General +message.loading=Loading the File Plan... +message.error=We couldn't access the File Plan. Try refreshing your browser or contact your I.T. Dept. +message.empty=You haven't added any items yet. \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_de.properties new file mode 100644 index 0000000000..cc7fde6180 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_de.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Neue Kategorie +button.new-folder=Neuer Ordner +button.new-unfiledRecords-folder=Neuer Ordner +button.new-hold=Neuer Legal Hold +button.upload=Datei +button.declare-record=Record deklarieren +button.import=Importieren +button.export-all=Alle exportieren +button.manage-permissions=Berechtigungen verwalten +button.up=Nach oben +button.customize=Anpassen +button.navbar.show=Verlaufsnavigation anzeigen +button.navbar.hide=Verlaufsnavigation ausblenden +button.fullwindow.enter=Vollst\u00e4ndiges Fenster +button.fullscreen.enter=Vollbild +button.fullscreen.exit=Vollbild verlassen +button.setDefaultView=''{0}'' als Standard f\u00fcr diesen Ordner festlegen +button.removeDefaultView=''{0}'' als Standard f\u00fcr diesen Ordner entfernen +button.electronic=Elektronisch +button.non-electronic=Nicht elektronisch +button.report=Bericht +button.manage-rules=Regeln verwalten +button.options=Optionen + +## Dialog labels +label.new-rma_recordCategory.title=Neue Record-Kategorie +label.new-rma_recordCategory.header=Details zur Record-Kategorie +label.new-rma_recordFolder.title=Neuer Record-Ordner +label.new-rma_recordFolder.header=Details zum Record-Ordner +label.new-rma_hold.title=Neuer Legal Hold +label.new-rma_hold.header=Details zum neuen Legal Hold +label.new-rma_unfiledRecordFolder.title=Neuer Ordner +label.new-rma_unfiledRecordFolder.header=Ordnerdetails +label.new-rma_nonElectronicDocument.title=Nicht elektronischer Record +label.new-rma_nonElectronicDocument.header=Details zum Record + +## Drop-down Menus +menu.selected-items=Ausgew\u00e4hlte Elemente... +menu.selected-items.deselect-all=Auswahl aufheben + +menu.selected-items.accession=Aufnahme +menu.selected-items.accession-complete=Aufnahmebest\u00e4tigung +menu.selected-items.copy-to=Kopieren nach... +menu.selected-items.cutoff=Trennen +menu.selected-items.delete=L\u00f6schen +menu.selected-items.destroy=Vernichten +menu.selected-items.export=Exportieren +menu.selected-items.link-to=Link zu... +menu.selected-items.file-to=Ablegen unter... +menu.selected-items.move-to=Verschieben nach... +menu.selected-items.reviewed=\u00dcberpr\u00fcft +menu.selected-items.transfer=\u00dcbertragen +menu.selected-items.transfer-complete=\u00dcbertragungsbest\u00e4tigung +menu.selected-items.undo-cutoff=Trennung aufheben + +## Pop-up Messages +message.file.type=Legen Sie einen elektronischen oder nicht elektronischen Record ab? +message.file.type.title=Ablagetyp +message.multiple-delete.failure={0} erfolgreich gel\u00f6scht. {1} Elemente konnten nicht gel\u00f6scht werden. +message.multiple-delete.success={0} Element(e) erfolgreich gel\u00f6scht +title.multiple-delete.confirm=Mehrfaches L\u00f6schen +message.multiple-delete.confirm=Die folgenden {0} Elemente werden aus dem Ablageplan entfernt. +message.multiple-delete.please-wait=Records werden gel\u00f6scht... +message.new-unknown.error=Typ ''{0}'' wurde nicht gefunden. +message.new-category.failure=Kategorie ''{0}'' konnte nicht erstellt werden. +message.new-folder.failure=Ordner ''{0}'' konnte nicht erstellt werden. +message.new-record.failure=''{0}'' konnte nicht erstellt werden. +message.new-unfiledRecordsFolder.failure=Ordern mit nicht abgelegten Records ''{0}'' konnte nicht erstellt werden. +message.new-hold.failure=Legal Hold ''{0}'' konnte nicht erstellt werden. +message.new-category.success=Kategorie ''{0}'' erstellt. +message.new-folder.success=Ordner ''{0}'' erstellt +message.new-record.success=Record ''{0}'' erstellt. +message.new-unfiledRecordsFolder.success=Ordner mit nicht abgelegten Records ''{0}'' erstellt. +message.new-hold.success=Legal Hold ''{0}'' erstellt. +message.load-top-level-assets.failure=Vollst\u00e4ndiger Export nicht m\u00f6glich, da Assets auf oberster Ebene nicht geladen werden konnten. +message.nothing-to-export=Keine zu exportierenden Elemente + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Ergebnisse der gespeicherten Suche +description.savedsearch.more="{0}" +description.transfers=\u00dcbertragungen +description.transfers.more=(Records, die auf eine \u00dcbertragung oder Aufnahme warten) +description.transfers.more.filterDisplay=Derzeit angezeigt: ''{0}'' +description.holds=Aktive Legal Holds +description.holds.more=(Mit Legal Hold belegte Elemente) +description.holds.more.filterDisplay=Derzeit angezeigt: ''{0}'' +description.unfiledRecords=Nicht abgelegte Records +description.unfiledRecords.more=(Records, die nicht abgelegt sind) +description.unfiledRecords.more.filterDisplay=Derzeit angezeigt: ''{0}'' + +## Browser dialogs +label.filter-description.acp=Alfresco Content Package Datei (.acp) +label.filter-description.zip=Archivpaket (.zip) + +## Pop-up Messages +# General +message.loading=Ablageplan wird geladen... +message.error=Auf Ablageplan konnte nicht zugegriffen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen, oder kontakten Sie Ihre IT-Abteilung. +message.empty=Bisher wurden noch keine Elemente hinzugef\u00fcgt. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_es.properties new file mode 100644 index 0000000000..34dc6a3145 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_es.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Nueva categor\u00eda +button.new-folder=Nueva carpeta +button.new-unfiledRecords-folder=Nueva carpeta +button.new-hold=Nueva retenci\u00f3n legal +button.upload=Fichero +button.declare-record=Declarar como documento de archivo +button.import=Importar +button.export-all=Exportar todo +button.manage-permissions=Gestionar permisos +button.up=Subir nivel +button.customize=Personalizar +button.navbar.show=Mostrar ruta de navegaci\u00f3n +button.navbar.hide=Ocultar ruta de navegaci\u00f3n +button.fullwindow.enter=Ventana completa +button.fullscreen.enter=Pantalla completa +button.fullscreen.exit=Salir de pantalla completa +button.setDefaultView=Definir ''{0}'' como predeterminado para esta carpeta +button.removeDefaultView=Eliminar ''{0}'' como predeterminado para esta carpeta +button.electronic=Electr\u00f3nico +button.non-electronic=No electr\u00f3nico +button.report=Informe +button.manage-rules=Gestionar reglas +button.options=Opciones + +## Dialog labels +label.new-rma_recordCategory.title=Nueva categor\u00eda de documentos de archivo +label.new-rma_recordCategory.header=Detalles de categor\u00eda de documentos de archivo +label.new-rma_recordFolder.title=Nueva carpeta de documentos de archivo +label.new-rma_recordFolder.header=Detalles de carpeta de documentos de archivo +label.new-rma_hold.title=Nueva retenci\u00f3n legal +label.new-rma_hold.header=Detalles de nueva retenci\u00f3n legal +label.new-rma_unfiledRecordFolder.title=Nueva carpeta +label.new-rma_unfiledRecordFolder.header=Detalles de carpeta +label.new-rma_nonElectronicDocument.title=Documento de archivo no electr\u00f3nico +label.new-rma_nonElectronicDocument.header=Detalles de documento de archivo + +## Drop-down Menus +menu.selected-items=Elementos seleccionados... +menu.selected-items.deselect-all=Deseleccionar todo + +menu.selected-items.accession=Incorporaci\u00f3n +menu.selected-items.accession-complete=Confirmaci\u00f3n de incorporaci\u00f3n +menu.selected-items.copy-to=Copiar a... +menu.selected-items.cutoff=Inicio de retenci\u00f3n +menu.selected-items.delete=Eliminar +menu.selected-items.destroy=Destruir +menu.selected-items.export=Exportar +menu.selected-items.link-to=Enlazar a... +menu.selected-items.file-to=Archivar en... +menu.selected-items.move-to=Mover a... +menu.selected-items.reviewed=Revisado +menu.selected-items.transfer=Transferencia +menu.selected-items.transfer-complete=Confirmaci\u00f3n de transferencia +menu.selected-items.undo-cutoff=Deshacer inicio de retenci\u00f3n + +## Pop-up Messages +message.file.type=\u00bfEst\u00e1 archivando un documento de archivo electr\u00f3nico o no electr\u00f3nico? +message.file.type.title=Tipo de archivado +message.multiple-delete.failure={0} elementos eliminados con \u00e9xito. No se pudieron eliminar {1} elementos. +message.multiple-delete.success={0} elemento(s) eliminados correctamente. +title.multiple-delete.confirm=Eliminaci\u00f3n m\u00faltiple +message.multiple-delete.confirm=Los {0} elementos siguientes se eliminar\u00e1n del cuadro de clasificaci\u00f3n. +message.multiple-delete.please-wait=Eliminando documentos de archivo... +message.new-unknown.error=No se pudo encontrar el tipo ''{0}''. +message.new-category.failure=No se pudo crear la categor\u00eda ''{0}'' +message.new-folder.failure=No se pudo crear la carpeta ''{0}'' +message.new-record.failure=No se pudo crear ''{0}'' +message.new-unfiledRecordsFolder.failure=No se pudo crear la carpeta ''{0}'' para documentos de archivo no archivados +message.new-hold.failure=No se pudo crear la retenci\u00f3n legal ''{0}'' +message.new-category.success=Se ha creado la categor\u00eda ''{0}'' +message.new-folder.success=Se ha creado la carpeta ''{0}'' +message.new-record.success=Se ha creado el documento de archivo ''{0}'' +message.new-unfiledRecordsFolder.success=Se ha creado la carpeta ''{0}'' para documentos de archivo no archivados +message.new-hold.success=Se ha creado la retenci\u00f3n legal ''{0}'' +message.load-top-level-assets.failure=No se pudo exportar todo porque no se pudieron cargar los activos de nivel superior +message.nothing-to-export=Nada que exportar + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Resultados de b\u00fasqueda guardada +description.savedsearch.more=''{0}'' +description.transfers=Transferencias +description.transfers.more=(Documentos de archivo a la espera de que concluya la transferencia o la incorporaci\u00f3n) +description.transfers.more.filterDisplay=actualmente viendo ''{0}'' +description.holds=Retenci\u00f3n legales activas +description.holds.more=(Elementos en retenci\u00f3n legal) +description.holds.more.filterDisplay=actualmente viendo ''{0}'' +description.unfiledRecords=Documentos de archivo no archivados +description.unfiledRecords.more=(Documentos de archivo que no est\u00e1n archivados) +description.unfiledRecords.more.filterDisplay=actualmente viendo ''{0}'' + +## Browser dialogs +label.filter-description.acp=Fichero de paquete de contenidos de Alfresco (.acp) +label.filter-description.zip=Paquete de ficheros (.zip) + +## Pop-up Messages +# General +message.loading=Cargando el cuadro de clasificaci\u00f3n... +message.error=No se pudo acceder al cuadro de clasificaci\u00f3n. Trate de actualizar el navegador o p\u00f3ngase en contacto con el dep. de TI. +message.empty=Todav\u00eda no ha a\u00f1adido ning\u00fan elemento. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_fr.properties new file mode 100644 index 0000000000..de76091ced --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_fr.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Nouvelle cat\u00e9gorie +button.new-folder=Nouveau dossier +button.new-unfiledRecords-folder=Nouveau dossier +button.new-hold=Nouvelle suspension +button.upload=Fichier +button.declare-record=D\u00e9clarer comme document d'archives +button.import=Importer +button.export-all=Exporter tout +button.manage-permissions=G\u00e9rer les autorisations +button.up=Haut +button.customize=Personnaliser +button.navbar.show=Afficher le fil d'Ariane +button.navbar.hide=Cacher le fil d'Ariane +button.fullwindow.enter=Pleine fen\u00eatre +button.fullscreen.enter=Plein \u00e9cran +button.fullscreen.exit=Quitter le plein \u00e9cran +button.setDefaultView=D\u00e9finir ''{0}'' par d\u00e9faut pour ce dossier +button.removeDefaultView=Supprimer ''{0}'' par d\u00e9faut pour ce dossier +button.electronic=Electronique +button.non-electronic=Non \u00e9lectronique +button.report=Rapport +button.manage-rules=G\u00e9rer les r\u00e8gles +button.options=Options + +## Dialog labels +label.new-rma_recordCategory.title=Nouvelle cat\u00e9gorie de document d'archives +label.new-rma_recordCategory.header=D\u00e9tails de la cat\u00e9gorie de classement +label.new-rma_recordFolder.title=Nouveau dossier d'archives +label.new-rma_recordFolder.header=D\u00e9tails du dossier d'archives +label.new-rma_hold.title=Nouvelle suspension +label.new-rma_hold.header=Informations sur la nouvelle suspension +label.new-rma_unfiledRecordFolder.title=Nouveau dossier +label.new-rma_unfiledRecordFolder.header=D\u00e9tails du dossier +label.new-rma_nonElectronicDocument.title=Document d'archives non \u00e9lectronique +label.new-rma_nonElectronicDocument.header=D\u00e9tails du document d'archives + +## Drop-down Menus +menu.selected-items=El\u00e9ments s\u00e9lectionn\u00e9s... +menu.selected-items.deselect-all=D\u00e9s\u00e9lectionner tout + +menu.selected-items.accession=Versement \u00e0 un autre organisme +menu.selected-items.accession-complete=Confirmation du versement \u00e0 un autre organisme +menu.selected-items.copy-to=Copier vers... +menu.selected-items.cutoff=D\u00e9but de conservation +menu.selected-items.delete=Supprimer +menu.selected-items.destroy=D\u00e9truire +menu.selected-items.export=Exporter +menu.selected-items.link-to=Lier \u00e0... +menu.selected-items.file-to=Archiver dans... +menu.selected-items.move-to=D\u00e9placer vers... +menu.selected-items.reviewed=V\u00e9rifi\u00e9 +menu.selected-items.transfer=Transf\u00e9rer +menu.selected-items.transfer-complete=Confirmation de transfert +menu.selected-items.undo-cutoff=Annuler le d\u00e9but de conservation + +## Pop-up Messages +message.file.type=Archivez-vous un document d'archives \u00e9lectronique ou non \u00e9lectronique ? +message.file.type.title=Type d'archivage +message.multiple-delete.failure={0} \u00e9l\u00e9ments ont bien \u00e9t\u00e9 supprim\u00e9s. {1} \u00e9l\u00e9ments n''ont pas pu \u00eatre supprim\u00e9s. +message.multiple-delete.success=Suppression de {0} \u00e9l\u00e9ment(s) r\u00e9ussie +title.multiple-delete.confirm=Suppression multiple +message.multiple-delete.confirm=Les {0} \u00e9l\u00e9ments suivants seront supprim\u00e9s du plan de classement. +message.multiple-delete.please-wait=Suppression des documents d'archives en cours... +message.new-unknown.error=Impossible de trouver le type ''{0}''. +message.new-category.failure=Impossible de cr\u00e9er la cat\u00e9gorie ''{0}'' +message.new-folder.failure=Impossible de cr\u00e9er le dossier ''{0}'' +message.new-record.failure=Impossible de cr\u00e9er ''{0}'' +message.new-unfiledRecordsFolder.failure=Impossible de cr\u00e9er le dossier ''{0}'' de documents d''archives non class\u00e9s +message.new-hold.failure=Impossible de cr\u00e9er la suspension ''{0}'' +message.new-category.success=La cat\u00e9gorie ''{0}'' a \u00e9t\u00e9 cr\u00e9\u00e9e +message.new-folder.success=Le dossier ''{0}'' a \u00e9t\u00e9 cr\u00e9\u00e9 +message.new-record.success=Le document d''archives ''{0}'' a \u00e9t\u00e9 cr\u00e9\u00e9 +message.new-unfiledRecordsFolder.success=Le dossier ''{0}'' de documents d''archives non class\u00e9s a \u00e9t\u00e9 cr\u00e9\u00e9 +message.new-hold.success=La suspension ''{0}'' a \u00e9t\u00e9 cr\u00e9\u00e9e +message.load-top-level-assets.failure=Impossible d'exporter tout, car les actifs de niveau sup\u00e9rieur n'ont pas pu \u00eatre charg\u00e9s. +message.nothing-to-export=Rien \u00e0 exporter + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=R\u00e9sultat de recherche enregistr\u00e9e +description.savedsearch.more="{0}" +description.transfers=Transferts +description.transfers.more=(Documents d'archives en attente de transfert ou de versement \u00e0 un autre organisme) +description.transfers.more.filterDisplay=visualisation de ''{0}'' actuellement +description.holds=Suspensions actives +description.holds.more=(El\u00e9ments suspendus) +description.holds.more.filterDisplay=visualisation de ''{0}'' actuellement +description.unfiledRecords=Documents d'archives non class\u00e9s +description.unfiledRecords.more=(Documents d'archives non archiv\u00e9s) +description.unfiledRecords.more.filterDisplay=visualisation de ''{0}'' actuellement + +## Browser dialogs +label.filter-description.acp=Fichier .acp (Package de contenu Alfresco) +label.filter-description.zip=Package d'archivage (.zip) + +## Pop-up Messages +# General +message.loading=Chargement du plan de classement... +message.error=Impossible d'acc\u00e9der au plan de classement. Essayez d'actualiser votre navigateur ou contactez votre DSI. +message.empty=Vous n'avez pas encore ajout\u00e9 d'\u00e9l\u00e9ments. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_it.properties new file mode 100644 index 0000000000..11f0be5378 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_it.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Nuova categoria +button.new-folder=Nuova cartella +button.new-unfiledRecords-folder=Nuova cartella +button.new-hold=Nuova sospensione +button.upload=File +button.declare-record=Dichiara come record +button.import=Importa +button.export-all=Esporta tutto +button.manage-permissions=Gestisci autorizzazioni +button.up=Su +button.customize=Personalizza +button.navbar.show=Mostra breadcrumb +button.navbar.hide=Nascondi breadcrumb +button.fullwindow.enter=Finestra intera +button.fullscreen.enter=Schermo intero +button.fullscreen.exit=Chiudi schermo intero +button.setDefaultView=Imposta ''{0}'' come predefinito per questa cartella +button.removeDefaultView=Rimuovi ''{0}'' come predefinito per questa cartella +button.electronic=Elettronico +button.non-electronic=Non elettronico +button.report=Rapporto +button.manage-rules=Gestisci regole +button.options=Opzioni + +## Dialog labels +label.new-rma_recordCategory.title=Nuova categoria record +label.new-rma_recordCategory.header=Dettagli categoria record +label.new-rma_recordFolder.title=Nuova cartella di record +label.new-rma_recordFolder.header=Dettagli cartella di record +label.new-rma_hold.title=Nuova sospensione +label.new-rma_hold.header=Dettagli nuova sospensione +label.new-rma_unfiledRecordFolder.title=Nuova cartella +label.new-rma_unfiledRecordFolder.header=Dettagli cartella +label.new-rma_nonElectronicDocument.title=Record non elettronico +label.new-rma_nonElectronicDocument.header=Dettagli record + +## Drop-down Menus +menu.selected-items=Elementi selezionati... +menu.selected-items.deselect-all=Deseleziona tutto + +menu.selected-items.accession=Trasferimento ad altri +menu.selected-items.accession-complete=Conferma trasferimento ad altri +menu.selected-items.copy-to=Copia in... +menu.selected-items.cutoff=Cut off +menu.selected-items.delete=Elimina +menu.selected-items.destroy=Elimina definitivamente +menu.selected-items.export=Esporta +menu.selected-items.link-to=Collega a... +menu.selected-items.file-to=Archivia su... +menu.selected-items.move-to=Sposta in... +menu.selected-items.reviewed=Esaminato +menu.selected-items.transfer=Trasferisci +menu.selected-items.transfer-complete=Conferma trasferimento +menu.selected-items.undo-cutoff=Annulla cut off + +## Pop-up Messages +message.file.type=Si sta archiviando un record elettronico o non elettronico? +message.file.type.title=Tipo di archiviazione +message.multiple-delete.failure={0} elementi eliminati con successo. {1} elementi non eliminati. +message.multiple-delete.success={0} elementi eliminati +title.multiple-delete.confirm=Eliminazione multipla +message.multiple-delete.confirm=I seguenti {0} elementi verranno rimossi dal piano di fascicolazione. +message.multiple-delete.please-wait=Eliminazione record... +message.new-unknown.error=Impossibile trovare il tipo ''{0}''. +message.new-category.failure=Impossibile creare categoria ''{0}'' +message.new-folder.failure=Impossibile creare cartella ''{0}'' +message.new-record.failure=Impossibile creare ''{0}'' +message.new-unfiledRecordsFolder.failure=Impossibile creare cartella di record non archiviati ''{0}'' +message.new-hold.failure=Impossibile creare sospensione ''{0}'' +message.new-category.success=Categoria ''{0}'' creata +message.new-folder.success=Cartella ''{0}'' creata +message.new-record.success=Record ''{0}'' creato +message.new-unfiledRecordsFolder.success=Cartella di record non archiviati ''{0}'' creata +message.new-hold.success=Sospensione ''{0}'' creata +message.load-top-level-assets.failure=Impossibile esportare interamente poich\u00e9 le risorse del livello superiore non possono essere caricate. +message.nothing-to-export=Nessun elemento da esportare + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Risultati della ricerca salvata +description.savedsearch.more="{0}" +description.transfers=Trasferimenti +description.transfers.more=(Record in attesa del completamento del trasferimento o del trasferimento ad altri) +description.transfers.more.filterDisplay=visualizzazione di ''{0}'' +description.holds=Sospensioni attive +description.holds.more=(elementi in sospeso) +description.holds.more.filterDisplay=visualizzazione di ''{0}'' +description.unfiledRecords=Record non archiviati +description.unfiledRecords.more=(Record non archiviati) +description.unfiledRecords.more.filterDisplay=visualizzazione di ''{0}'' + +## Browser dialogs +label.filter-description.acp=File del pacchetto di contenuti Alfresco (.acp) +label.filter-description.zip=Archivia pacchetto (.zip) + +## Pop-up Messages +# General +message.loading=Caricamento Piano di fascicolazione... +message.error=Impossibile accedere a Piano di fascicolazione. Provare ad aggiornare il browser o contattare il proprio reparto IT. +message.empty=Non \u00e8 stato ancora aggiunto alcun elemento. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_ja.properties new file mode 100644 index 0000000000..a118a16f1a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_ja.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=\u65b0\u3057\u3044\u30ab\u30c6\u30b4\u30ea +button.new-folder=\u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0 +button.new-unfiledRecords-folder=\u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0 +button.new-hold=\u65b0\u3057\u3044\u30db\u30fc\u30eb\u30c9 +button.upload=\u30d5\u30a1\u30a4\u30eb +button.declare-record=\u30ec\u30b3\u30fc\u30c9\u306e\u5ba3\u8a00 +button.import=\u30a4\u30f3\u30dd\u30fc\u30c8 +button.export-all=\u3059\u3079\u3066\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +button.manage-permissions=\u6a29\u9650\u306e\u7ba1\u7406 +button.up=\u4e0a\u3078 +button.customize=\u30ab\u30b9\u30bf\u30de\u30a4\u30ba +button.navbar.show=\u968e\u5c64\u30ea\u30f3\u30af\u3092\u8868\u793a +button.navbar.hide=\u968e\u5c64\u30ea\u30f3\u30af\u3092\u975e\u8868\u793a +button.fullwindow.enter=\u30d5\u30eb\u30a6\u30a3\u30f3\u30c9\u30a6\u8868\u793a +button.fullscreen.enter=\u5168\u753b\u9762\u8868\u793a +button.fullscreen.exit=\u5168\u753b\u9762\u8868\u793a\u306e\u7d42\u4e86 +button.setDefaultView="{0}" \u3092\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u3068\u3057\u3066\u8a2d\u5b9a\u3059\u308b +button.removeDefaultView="{0}" \u3092\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u3068\u3057\u3066\u524a\u9664\u3059\u308b +button.electronic=\u96fb\u5b50 +button.non-electronic=\u975e\u96fb\u5b50 +button.report=\u30ec\u30dd\u30fc\u30c8 +button.manage-rules=\u30eb\u30fc\u30eb\u306e\u7ba1\u7406 +button.options=\u30aa\u30d7\u30b7\u30e7\u30f3 + +## Dialog labels +label.new-rma_recordCategory.title=\u65b0\u3057\u3044\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea +label.new-rma_recordCategory.header=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea\u306e\u8a73\u7d30 +label.new-rma_recordFolder.title=\u65b0\u3057\u3044\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +label.new-rma_recordFolder.header=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30 +label.new-rma_hold.title=\u65b0\u3057\u3044\u30db\u30fc\u30eb\u30c9 +label.new-rma_hold.header=\u65b0\u3057\u3044\u30db\u30fc\u30eb\u30c9\u306e\u8a73\u7d30 +label.new-rma_unfiledRecordFolder.title=\u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0 +label.new-rma_unfiledRecordFolder.header=\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30 +label.new-rma_nonElectronicDocument.title=\u975e\u96fb\u5b50\u30ec\u30b3\u30fc\u30c9 +label.new-rma_nonElectronicDocument.header=\u30ec\u30b3\u30fc\u30c9\u306e\u8a73\u7d30 + +## Drop-down Menus +menu.selected-items=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0... +menu.selected-items.deselect-all=\u3059\u3079\u3066\u306e\u9078\u629e\u3092\u89e3\u9664 + +menu.selected-items.accession=\u53d7\u8afe +menu.selected-items.accession-complete=\u53d7\u8afe\u306e\u78ba\u8a8d +menu.selected-items.copy-to=\u30b3\u30d4\u30fc\u5148... +menu.selected-items.cutoff=\u30ab\u30c3\u30c8\u30aa\u30d5 +menu.selected-items.delete=\u524a\u9664 +menu.selected-items.destroy=\u7834\u68c4 +menu.selected-items.export=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +menu.selected-items.link-to=\u30ea\u30f3\u30af\u5148... +menu.selected-items.file-to=\u6574\u7406\u4fdd\u7ba1\u5148... +menu.selected-items.move-to=\u79fb\u52d5\u5148... +menu.selected-items.reviewed=\u30ec\u30d3\u30e5\u30fc\u6e08\u307f +menu.selected-items.transfer=\u8ee2\u9001 +menu.selected-items.transfer-complete=\u8ee2\u9001\u306e\u78ba\u8a8d +menu.selected-items.undo-cutoff=\u30ab\u30c3\u30c8\u30aa\u30d5\u3092\u5143\u306b\u623b\u3059 + +## Pop-up Messages +message.file.type=\u96fb\u5b50\u307e\u305f\u306f\u975e\u96fb\u5b50\u30ec\u30b3\u30fc\u30c9\u3092\u6574\u7406\u4fdd\u7ba1\u3057\u307e\u3059\u304b? +message.file.type.title=\u6574\u7406\u4fdd\u7ba1\u30bf\u30a4\u30d7 +message.multiple-delete.failure={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002{1} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.multiple-delete.success={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +title.multiple-delete.confirm=\u4e00\u62ec\u524a\u9664 +message.multiple-delete.confirm=\u4ee5\u4e0b\u306e {0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +message.multiple-delete.please-wait=\u30ec\u30b3\u30fc\u30c9\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... +message.new-unknown.error=\u30d5\u30a1\u30a4\u30eb\u306e\u7a2e\u985e ''{0}'' \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 +message.new-category.failure=\u30ab\u30c6\u30b4\u30ea ''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.new-folder.failure=\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.new-record.failure=''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.new-unfiledRecordsFolder.failure=\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.new-hold.failure=\u30db\u30fc\u30eb\u30c9 ''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.new-category.success=\u30ab\u30c6\u30b4\u30ea ''{0}'' \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.new-folder.success=\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.new-record.success=\u30ec\u30b3\u30fc\u30c9 ''{0}'' \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.new-unfiledRecordsFolder.success=\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ''{0}'' \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.new-hold.success=\u30db\u30fc\u30eb\u30c9 ''{0}'' \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.load-top-level-assets.failure=\u30c8\u30c3\u30d7\u30ec\u30d9\u30eb\u306e\u30a2\u30bb\u30c3\u30c8\u304c\u8aad\u307f\u8fbc\u3081\u306a\u3044\u305f\u3081\u3001\u3059\u3079\u3066\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.nothing-to-export=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u3082\u306e\u306f\u3042\u308a\u307e\u305b\u3093 + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6\u306e\u7d50\u679c +description.savedsearch.more="{0}" +description.transfers=\u8ee2\u9001 +description.transfers.more=(\u8ee2\u9001\u307e\u305f\u306f\u53d7\u8afe\u5b8c\u4e86\u5f85\u3061\u306e\u30ec\u30b3\u30fc\u30c9) +description.transfers.more.filterDisplay=\u73fe\u5728 ''{0}'' \u4ef6\u8868\u793a\u4e2d +description.holds=\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u30db\u30fc\u30eb\u30c9 +description.holds.more=(\u30db\u30fc\u30eb\u30c9\u4e2d\u306e\u30a2\u30a4\u30c6\u30e0) +description.holds.more.filterDisplay=\u73fe\u5728 ''{0}'' \u4ef6\u8868\u793a\u4e2d +description.unfiledRecords=\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +description.unfiledRecords.more=\uff08\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9\uff09 +description.unfiledRecords.more.filterDisplay=\u73fe\u5728 ''{0}'' \u4ef6\u8868\u793a\u4e2d + +## Browser dialogs +label.filter-description.acp=Alfresco \u30b3\u30f3\u30c6\u30f3\u30c4\u30d1\u30c3\u30b1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb (.acp) +label.filter-description.zip=\u30a2\u30fc\u30ab\u30a4\u30d6\u30d1\u30c3\u30b1\u30fc\u30b8 (.zip) + +## Pop-up Messages +# General +message.loading=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.error=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3059\u308b\u304b\u3001IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.empty=\u307e\u3060\u30a2\u30a4\u30c6\u30e0\u304c\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_nb.properties new file mode 100644 index 0000000000..89b156146a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_nb.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Ny kategori +button.new-folder=Ny mappe +button.new-unfiledRecords-folder=Ny mappe +button.new-hold=Ny hold +button.upload=Fil +button.declare-record=Erkl\u00e6r oppf\u00f8ring +button.import=Importer +button.export-all=Eksporter alt +button.manage-permissions=Administrer tillatelser +button.up=Opp +button.customize=Tilpass +button.navbar.show=Vis br\u00f8dsmule +button.navbar.hide=Skjul br\u00f8dsmule +button.fullwindow.enter=Fullt vindu +button.fullscreen.enter=Full skjerm +button.fullscreen.exit=Avslutt full skjerm +button.setDefaultView=Angi ''{0}'' som standard ved denne mappen +button.removeDefaultView=Fjern ''{0}'' som standard ved denne mappen +button.electronic=Elektronisk +button.non-electronic=Ikke elektronisk +button.report=Rapport +button.manage-rules=Administrer regler +button.options=Alternativer + +## Dialog labels +label.new-rma_recordCategory.title=Ny oppf\u00f8ringskategori +label.new-rma_recordCategory.header=Informasjon om oppf\u00f8ringskategorier +label.new-rma_recordFolder.title=Ny oppf\u00f8ringsmappe +label.new-rma_recordFolder.header=Informasjon om oppf\u00f8ringsmapper +label.new-rma_hold.title=Ny hold +label.new-rma_hold.header=Informasjon om ny hold +label.new-rma_unfiledRecordFolder.title=Ny mappe +label.new-rma_unfiledRecordFolder.header=Informasjom om mapper +label.new-rma_nonElectronicDocument.title=Ikke-elektronisk oppf\u00f8ring +label.new-rma_nonElectronicDocument.header=Oppf\u00f8ringsinformasjon + +## Drop-down Menus +menu.selected-items=Valgte elementer... +menu.selected-items.deselect-all=Velg bort alle + +menu.selected-items.accession=Tilgang +menu.selected-items.accession-complete=Tilgangsbekreftelse +menu.selected-items.copy-to=Kopier til... +menu.selected-items.cutoff=Cut off +menu.selected-items.delete=Slett +menu.selected-items.destroy=Destruer +menu.selected-items.export=Eksporter +menu.selected-items.link-to=Koble til... +menu.selected-items.file-to=Registrer i... +menu.selected-items.move-to=Flytt til... +menu.selected-items.reviewed=Gjennomg\u00e5tt +menu.selected-items.transfer=Overf\u00f8r +menu.selected-items.transfer-complete=Overf\u00f8r bekreftelse +menu.selected-items.undo-cutoff=Angre cut off + +## Pop-up Messages +message.file.type=Registreres en elektronisk eller ikke-elektronisk oppf\u00f8ring? +message.file.type.title=Registreringstype +message.multiple-delete.failure={0} elementer er n\u00e5 slettet. {1} elementer kunne ikke slettes. +message.multiple-delete.success={0} element(er) er n\u00e5 slettet +title.multiple-delete.confirm=Sletting av flere +message.multiple-delete.confirm=F\u00f8lgende {0} elementer fjernes fra filplanen. +message.multiple-delete.please-wait=Sletter oppf\u00f8ringer... +message.new-unknown.error=Kunne ikke finne type ''{0}''. +message.new-category.failure=Kunne ikke opprette kategorien ''{0}'' +message.new-folder.failure=Kunne ikke opprette mappen ''{0}'' +message.new-record.failure=Kunne ikke opprette ''{0}'' +message.new-unfiledRecordsFolder.failure=Kunne ikke opprette oppf\u00f8ringsmappen ''{0}'' som ikke er registrert +message.new-hold.failure=Kunne ikke opprette hold ''{0}'' +message.new-category.success=Kategori ''{0}'' opprettet +message.new-folder.success=Mappen ''{0}'' opprettet +message.new-record.success=Oppf\u00f8ring ''{0}'' opprettet +message.new-unfiledRecordsFolder.success=Oppf\u00f8ringsmappen ''{0}'' som ikke er registrert, opprettet +message.new-hold.success=Hold ''{0}'' opprettet +message.load-top-level-assets.failure=Kunne ikke eksportere alle fordi toppniv\u00e5aktiva ikke kunne lastes inn. +message.nothing-to-export=Ingenting \u00e5 eksportere + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Resultat av sparte s\u00f8k +description.savedsearch.more="{0}" +description.transfers=Overf\u00f8ringer +description.transfers.more=(Oppf\u00f8ringer som venter p\u00e5 overf\u00f8ring eller fullf\u00f8rt tilgang) +description.transfers.more.filterDisplay=''{0}'' vises i \u00f8yeblikket +description.holds=Aktive Hold +description.holds.more=(Oppf\u00f8ringer p\u00e5 hold) +description.holds.more.filterDisplay=''{0}'' vises i \u00f8yeblikket +description.unfiledRecords=Oppf\u00f8ringer som ikke er registrert +description.unfiledRecords.more=(Oppf\u00f8ringer som ikke er registrert) +description.unfiledRecords.more.filterDisplay=''{0}'' vises i \u00f8yeblikket + +## Browser dialogs +label.filter-description.acp=Alfresco-innholdspakkefil (.acp) +label.filter-description.zip=Arkiveringspakke (.zip) + +## Pop-up Messages +# General +message.loading=Laste filplanen... +message.error=Fikk ikke tilgang til filplanen. Pr\u00f8v \u00e5 oppdatere nettleseren, eller kontakt din IT- avdeling. +message.empty=Det er enn\u00e5 ikke lagt til noen elementer. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_nl.properties new file mode 100755 index 0000000000..30eeccfb0e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_nl.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Nieuwe categorie +button.new-folder=Nieuwe map +button.new-unfiledRecords-folder=Nieuwe map +button.new-hold=Nieuwe bewaring +button.upload=Bestand +button.declare-record=Declareren als archiefstuk +button.import=Importeren +button.export-all=Alles exporteren +button.manage-permissions=Rechten beheren +button.up=Omhoog +button.customize=Aanpassen +button.navbar.show=Breadcrumb weergeven +button.navbar.hide=Breadcrumb verbergen +button.fullwindow.enter=Volledig venster +button.fullscreen.enter=Volledig scherm +button.fullscreen.exit=Volledig scherm afsluiten +button.setDefaultView="{0}" instellen als standaard voor deze map +button.removeDefaultView=''{0}'' verwijderen als standaard voor deze map +button.electronic=Elektronisch +button.non-electronic=Niet-elektronisch +button.report=Rapport +button.manage-rules=Regels beheren +button.options=Opties + +## Dialog labels +label.new-rma_recordCategory.title=Nieuwe archiefstukcategorie +label.new-rma_recordCategory.header=Details archiefstukcategorie +label.new-rma_recordFolder.title=Nieuwe archiefmap +label.new-rma_recordFolder.header=Details archiefmap +label.new-rma_hold.title=Nieuwe bewaring +label.new-rma_hold.header=Details nieuwe bewaring +label.new-rma_unfiledRecordFolder.title=Nieuwe map +label.new-rma_unfiledRecordFolder.header=Mapdetails +label.new-rma_nonElectronicDocument.title=Niet-elektronisch archiefstuk +label.new-rma_nonElectronicDocument.header=Archiefstukdetails + +## Drop-down Menus +menu.selected-items=Geselecteerde items... +menu.selected-items.deselect-all=Alle selecties opheffen + +menu.selected-items.accession=Overdracht +menu.selected-items.accession-complete=Bevestiging overdracht +menu.selected-items.copy-to=Kopi\u00ebren naar... +menu.selected-items.cutoff=Afsluiten +menu.selected-items.delete=Verwijderen +menu.selected-items.destroy=Vernietigen +menu.selected-items.export=Exporteren +menu.selected-items.link-to=Koppelen naar... +menu.selected-items.file-to=Archiveren in... +menu.selected-items.move-to=Verplaatsen naar... +menu.selected-items.reviewed=Gereviseerd +menu.selected-items.transfer=Overzetten +menu.selected-items.transfer-complete=Bevestiging overzetting +menu.selected-items.undo-cutoff=Afsluiten ongedaan maken + +## Pop-up Messages +message.file.type=Wilt u een elektronisch of niet-elektronisch archiefstuk archiveren? +message.file.type.title=Archiveringstype +message.multiple-delete.failure={0} items verwijderd. {1} items konden niet worden verwijderd. +message.multiple-delete.success={0} item(s) zijn verwijderd +title.multiple-delete.confirm=Verwijdering van meerdere items +message.multiple-delete.confirm=De volgende {0} items worden verwijderd uit het ordeningsplan. +message.multiple-delete.please-wait=Archiefstukken verwijderen... +message.new-unknown.error=Kan type ''{0}'' niet laden +message.new-category.failure=Kan categorie ''{0}'' niet maken +message.new-folder.failure=Kan map ''{0}'' niet maken +message.new-record.failure=Kan ''{0}'' niet maken +message.new-unfiledRecordsFolder.failure=Kan map voor niet-gearchiveerde archiefstukken ''{0}'' niet maken +message.new-hold.failure=Kan bewaring ''{0}'' niet maken +message.new-category.success=Categorie ''{0}'' gemaakt +message.new-folder.success=Map ''{0}'' gemaakt +message.new-record.success=Archiefstuk ''{0}'' gemaakt +message.new-unfiledRecordsFolder.success=Map voor niet-gearchiveerde archiefstukken ''{0}'' gemaakt +message.new-hold.success=Bewaring ''{0}'' gemaakt +message.load-top-level-assets.failure=Kan niet alles exporteren omdat assets van het hoogste niveau niet konden worden geladen +message.nothing-to-export=Niets om te exporteren + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Resultaten van opgeslagen zoekopdracht +description.savedsearch.more="{0}" +description.transfers=Overzettingen +description.transfers.more=(Archiefstukken die wachten op afronding van overzetting of overdracht) +description.transfers.more.filterDisplay="{0}" momenteel weergegeven +description.holds=Actieve bewaringen +description.holds.more=(Items die in bewaring zijn) +description.holds.more.filterDisplay="{0}" momenteel weergegeven +description.unfiledRecords=Niet-gearchiveerde archiefstukken +description.unfiledRecords.more=(Archiefstukken die niet zijn gearchiveerd) +description.unfiledRecords.more.filterDisplay="{0}" momenteel weergegeven + +## Browser dialogs +label.filter-description.acp=Alfresco Content Package-bestand (.acp) +label.filter-description.zip=Archiefpakket (.zip) + +## Pop-up Messages +# General +message.loading=Het ordeningsplan laden... +message.error=Kan het ordeningsplan niet openen. Vernieuw de browser of neem contact op met uw IT-afdeling +message.empty=U hebt nog geen items toegevoegd. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_pt_BR.properties new file mode 100644 index 0000000000..44d8ba3695 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_pt_BR.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=Nova categoria +button.new-folder=Nova pasta +button.new-unfiledRecords-folder=Nova pasta +button.new-hold=Nova espera +button.upload=Arquivo +button.declare-record=Declarar como documento arquiv\u00edstico +button.import=Importar +button.export-all=Exportar tudo +button.manage-permissions=Gerenciar permiss\u00f5es +button.up=Para cima +button.customize=Personalizar +button.navbar.show=Mostrar trilha de navega\u00e7\u00e3o +button.navbar.hide=Ocultar trilha de navega\u00e7\u00e3o +button.fullwindow.enter=Janela cheia +button.fullscreen.enter=Tela cheia +button.fullscreen.exit=Sair da tela cheia +button.setDefaultView=Definir ''{0}'' como padr\u00e3o para esta pasta +button.removeDefaultView=Remover ''{0}'' como padr\u00e3o desta pasta +button.electronic=Eletr\u00f4nico +button.non-electronic=N\u00e3o eletr\u00f4nico +button.report=Relat\u00f3rio +button.manage-rules=Gerenciar regras +button.options=Op\u00e7\u00f5es + +## Dialog labels +label.new-rma_recordCategory.title=Nova categoria de documento arquiv\u00edstico +label.new-rma_recordCategory.header=Detalhes da categoria de documento arquiv\u00edstico +label.new-rma_recordFolder.title=Nova pasta de documento arquiv\u00edstico +label.new-rma_recordFolder.header=Detalhes da pasta de documento arquiv\u00edstico +label.new-rma_hold.title=Nova espera +label.new-rma_hold.header=Detalhes da nova espera +label.new-rma_unfiledRecordFolder.title=Nova pasta +label.new-rma_unfiledRecordFolder.header=Detalhes da pasta +label.new-rma_nonElectronicDocument.title=Documento arquiv\u00edstico n\u00e3o eletr\u00f4nico +label.new-rma_nonElectronicDocument.header=Detalhes do documento arquiv\u00edstico + +## Drop-down Menus +menu.selected-items=Itens selecionados... +menu.selected-items.deselect-all=Desmarcar tudo + +menu.selected-items.accession=Ades\u00e3o +menu.selected-items.accession-complete=Confirma\u00e7\u00e3o da ades\u00e3o +menu.selected-items.copy-to=Copiar para... +menu.selected-items.cutoff=Cortar +menu.selected-items.delete=Excluir +menu.selected-items.destroy=Destruir +menu.selected-items.export=Exportar +menu.selected-items.link-to=Vincular a... +menu.selected-items.file-to=Arquivar em... +menu.selected-items.move-to=Mover para... +menu.selected-items.reviewed=Revisado +menu.selected-items.transfer=Transferir +menu.selected-items.transfer-complete=Confirma\u00e7\u00e3o da transfer\u00eancia +menu.selected-items.undo-cutoff=Desfazer corte + +## Pop-up Messages +message.file.type=Voc\u00ea est\u00e1 arquivando um documento arquiv\u00edstico eletr\u00f4nico ou n\u00e3o eletr\u00f4nico? +message.file.type.title=Tipo de arquivamento +message.multiple-delete.failure={0} itens exclu\u00eddos com \u00eaxito. {1} itens n\u00e3o puderam ser exclu\u00eddos. +message.multiple-delete.success={0} item(ns) exclu\u00eddo(s) com sucesso +title.multiple-delete.confirm=Exclus\u00e3o m\u00faltipla +message.multiple-delete.confirm=O seguintes {0} itens ser\u00e3o removidos do plano de arquivamento. +message.multiple-delete.please-wait=Excluindo documentos arquiv\u00edsticos... +message.new-unknown.error=N\u00e3o foi poss\u00edvel localizar o tipo ''{0}''. +message.new-category.failure=N\u00e3o foi poss\u00edvel criar a categoria ''{0}'' +message.new-folder.failure=N\u00e3o foi poss\u00edvel criar a pasta ''{0}'' +message.new-record.failure=N\u00e3o foi poss\u00edvel criar ''{0}'' +message.new-unfiledRecordsFolder.failure=N\u00e3o foi poss\u00edvel criar a pasta de documentos arquiv\u00edsticos n\u00e3o arquivados ''{0}'' +message.new-hold.failure=N\u00e3o foi poss\u00edvel criar espera ''{0}'' +message.new-category.success=Categoria ''{0}'' criada +message.new-folder.success=Pasta ''{0}'' criada +message.new-record.success=Documento arquiv\u00edstico ''{0}'' criado +message.new-unfiledRecordsFolder.success=N\u00e3o foi poss\u00edvel criar a pasta de documentos arquiv\u00edsticos n\u00e3o arquivados ''{0}'' +message.new-hold.success=Espera ''{0}'' criada +message.load-top-level-assets.failure=N\u00e3o foi poss\u00edvel exportar tudo porque os ativos de n\u00edvel superior n\u00e3o puderam ser carregados. +message.nothing-to-export=Nada a exportar + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=Resultados da pesquisa salva +description.savedsearch.more="{0}" +description.transfers=Transfer\u00eancias +description.transfers.more=(Documentos arquiv\u00edsticos aguardando conclus\u00e3o de transfer\u00eancia ou ades\u00e3o) +description.transfers.more.filterDisplay=atualmente visualizando ''{0}'' +description.holds=Esperas ativas +description.holds.more=(Itens em espera) +description.holds.more.filterDisplay=atualmente visualizando ''{0}'' +description.unfiledRecords=Documentos arquiv\u00edsticos n\u00e3o arquivados +description.unfiledRecords.more=(Documentos arquiv\u00edsticos que n\u00e3o est\u00e3o arquivados) +description.unfiledRecords.more.filterDisplay=atualmente visualizando ''{0}'' + +## Browser dialogs +label.filter-description.acp=Arquivo de Pacote de conte\u00fado Alfresco (.acp) +label.filter-description.zip=Pacote de arquivamento (.zip) + +## Pop-up Messages +# General +message.loading=Carregando o Plano de arquivamento... +message.error=N\u00e3o foi poss\u00edvel acessar o Plano de arquivamento. Tente atualizar seu navegador ou entre em contato com o Dept. de TI. +message.empty=Voc\u00ea ainda n\u00e3o adicionou nenhum item. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_ru.properties new file mode 100644 index 0000000000..d1e61935ee --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_ru.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=\u041d\u043e\u0432\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f +button.new-folder=\u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +button.new-unfiledRecords-folder=\u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +button.new-hold=\u041d\u043e\u0432\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 +button.upload=\u0424\u0430\u0439\u043b +button.declare-record=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +button.import=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c +button.export-all=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 +button.manage-permissions=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 +button.up=\u0412\u0432\u0435\u0440\u0445 +button.customize=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c +button.navbar.show=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 +button.navbar.hide=\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 +button.fullwindow.enter=\u041d\u0430 \u0432\u0441\u0435 \u043e\u043a\u043d\u043e +button.fullscreen.enter=\u041d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d +button.fullscreen.exit=\u0412\u044b\u0439\u0442\u0438 \u0438\u0437 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 +button.setDefaultView=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c ''{0}'' \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +button.removeDefaultView=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +button.electronic=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 +button.non-electronic=\u041d\u0435\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 +button.report=\u041e\u0442\u0447\u0435\u0442 +button.manage-rules=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 +button.options=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b + +## Dialog labels +label.new-rma_recordCategory.title=\u041d\u043e\u0432\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.new-rma_recordCategory.header=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.new-rma_recordFolder.title=\u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.new-rma_recordFolder.header=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.new-rma_hold.title=\u041d\u043e\u0432\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 +label.new-rma_hold.header=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u043e\u0432\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +label.new-rma_unfiledRecordFolder.title=\u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +label.new-rma_unfiledRecordFolder.header=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u0430\u043f\u043a\u0435 +label.new-rma_nonElectronicDocument.title=\u041d\u0435\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +label.new-rma_nonElectronicDocument.header=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0437\u0430\u043f\u0438\u0441\u0438 + +## Drop-down Menus +menu.selected-items=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b... +menu.selected-items.deselect-all=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0432\u0441\u0435\u0433\u043e + +menu.selected-items.accession=\u0414\u043e\u0441\u0442\u0443\u043f +menu.selected-items.accession-complete=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +menu.selected-items.copy-to=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432... +menu.selected-items.cutoff=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +menu.selected-items.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +menu.selected-items.destroy=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c +menu.selected-items.export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 +menu.selected-items.link-to=\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u0441... +menu.selected-items.file-to=\u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432... +menu.selected-items.move-to=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432... +menu.selected-items.reviewed=\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e +menu.selected-items.transfer=\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c +menu.selected-items.transfer-complete=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 +menu.selected-items.undo-cutoff=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435 + +## Pop-up Messages +message.file.type=\u0412\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u0438\u043b\u0438 \u043d\u0435\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c? +message.file.type.title=\u0422\u0438\u043f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b +message.multiple-delete.failure=\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: {0}. \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: {1}. +message.multiple-delete.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: {0} +title.multiple-delete.confirm=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +message.multiple-delete.confirm=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 {0} \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b. +message.multiple-delete.please-wait=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439... +message.new-unknown.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0442\u0438\u043f ''{0}''. +message.new-category.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e ''{0}'' +message.new-folder.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 ''{0}'' +message.new-record.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c ''{0}'' +message.new-unfiledRecordsFolder.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 ''{0}'' \u0434\u043b\u044f \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +message.new-hold.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 ''{0}'' +message.new-category.success=\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f ''{0}'' \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +message.new-folder.success=\u041f\u0430\u043f\u043a\u0430 ''{0}'' \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +message.new-record.success=\u0417\u0430\u043f\u0438\u0441\u044c ''{0}'' \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +message.new-unfiledRecordsFolder.success=\u041f\u0430\u043f\u043a\u0430 \u0441 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 ''{0}'' \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +message.new-hold.success=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 ''{0}'' \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +message.load-top-level-assets.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u044b \u043d\u0430\u0438\u0432\u044b\u0441\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. +message.nothing-to-export=\u041d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 +description.savedsearch.more="{0}" +description.transfers=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 +description.transfers.more=(\u0417\u0430\u043f\u0438\u0441\u0438, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430) +description.transfers.more.filterDisplay=\u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 ''{0}'' +description.holds=\u0422\u0435\u043a\u0443\u0449\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +description.holds.more=(\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b) +description.holds.more.filterDisplay=\u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 ''{0}'' +description.unfiledRecords=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +description.unfiledRecords.more=(\u0417\u0430\u043f\u0438\u0441\u0438, \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b) +description.unfiledRecords.more.filterDisplay=\u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 ''{0}'' + +## Browser dialogs +label.filter-description.acp=\u0424\u0430\u0439\u043b \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e Alfresco (.acp) +label.filter-description.zip=\u0410\u0440\u0445\u0438\u0432\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 (.zip) + +## Pop-up Messages +# General +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430... +message.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.empty=\u0412\u044b \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_zh_CN.properties new file mode 100644 index 0000000000..23b204a5ea --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.get_zh_CN.properties @@ -0,0 +1,102 @@ +## Buttons +button.new-category=\u65b0\u5efa\u7c7b\u522b +button.new-folder=\u65b0\u5efa\u6587\u4ef6\u5939 +button.new-unfiledRecords-folder=\u65b0\u5efa\u6587\u4ef6\u5939 +button.new-hold=\u65b0\u7684\u4fdd\u5b58 +button.upload=\u6587\u4ef6 +button.declare-record=\u58f0\u660e\u8bb0\u5f55 +button.import=\u5bfc\u5165 +button.export-all=\u5168\u90e8\u5bfc\u51fa +button.manage-permissions=\u7ba1\u7406\u6743\u9650 +button.up=\u5411\u4e0a +button.customize=\u81ea\u5b9a\u4e49 +button.navbar.show=\u663e\u793a\u4fa7\u8fb9\u680f +button.navbar.hide=\u9690\u85cf\u75d5\u8ff9\u5bfc\u822a +button.fullwindow.enter=\u5168\u7a97\u53e3 +button.fullscreen.enter=\u5168\u5c4f +button.fullscreen.exit=\u9000\u51fa\u5168\u5c4f +button.setDefaultView=\u5c06 ''{0}'' \u8bbe\u7f6e\u4e3a\u8be5\u6587\u4ef6\u5939\u7684\u9ed8\u8ba4\u503c +button.removeDefaultView=\u5c06 ''{0}'' \u4f5c\u4e3a\u8be5\u6587\u4ef6\u5939\u7684\u9ed8\u8ba4\u503c\u5220\u9664 +button.electronic=\u7535\u5b50 +button.non-electronic=\u975e\u7535\u5b50 +button.report=\u62a5\u544a +button.manage-rules=\u7ba1\u7406\u89c4\u5219 +button.options=\u9009\u9879 + +## Dialog labels +label.new-rma_recordCategory.title=\u65b0\u8bb0\u5f55\u7c7b\u522b +label.new-rma_recordCategory.header=\u8bb0\u5f55\u7c7b\u522b\u8be6\u7ec6\u4fe1\u606f +label.new-rma_recordFolder.title=\u65b0\u8bb0\u5f55\u6587\u4ef6\u5939 +label.new-rma_recordFolder.header=\u8bb0\u5f55\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f +label.new-rma_hold.title=\u65b0\u7684\u4fdd\u5b58 +label.new-rma_hold.header=\u65b0\u7684\u4fdd\u5b58\u8be6\u7ec6\u4fe1\u606f +label.new-rma_unfiledRecordFolder.title=\u65b0\u5efa\u6587\u4ef6\u5939 +label.new-rma_unfiledRecordFolder.header=\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f +label.new-rma_nonElectronicDocument.title=\u975e\u7535\u5b50\u8bb0\u5f55 +label.new-rma_nonElectronicDocument.header=\u8bb0\u5f55\u8be6\u7ec6\u4fe1\u606f + +## Drop-down Menus +menu.selected-items=\u5df2\u9009\u62e9\u9879... +menu.selected-items.deselect-all=\u53d6\u6d88\u5168\u9009 + +menu.selected-items.accession=\u5165\u7ba1 +menu.selected-items.accession-complete=\u5165\u7ba1\u786e\u8ba4 +menu.selected-items.copy-to=\u590d\u5236\u5230... +menu.selected-items.cutoff=\u4e2d\u65ad +menu.selected-items.delete=\u5220\u9664 +menu.selected-items.destroy=\u9500\u6bc1 +menu.selected-items.export=\u5bfc\u51fa +menu.selected-items.link-to=\u94fe\u63a5\u5230... +menu.selected-items.file-to=\u7acb\u5377\u81f3... +menu.selected-items.move-to=\u79fb\u52a8\u5230... +menu.selected-items.reviewed=\u5df2\u5ba1\u67e5 +menu.selected-items.transfer=\u79fb\u4ea4 +menu.selected-items.transfer-complete=\u79fb\u4ea4\u786e\u8ba4 +menu.selected-items.undo-cutoff=\u64a4\u6d88\u4e2d\u65ad + +## Pop-up Messages +message.file.type=\u60a8\u7acb\u5377\u7684\u662f\u7535\u5b50\u8fd8\u662f\u975e\u7535\u5b50\u8bb0\u5f55\uff1f +message.file.type.title=\u7acb\u5377\u7c7b\u578b +message.multiple-delete.failure={0} \u9879\u76ee\u6210\u529f\u5220\u9664\u3002 {1}\u9879\u76ee\u65e0\u6cd5\u5220\u9664\u3002 +message.multiple-delete.success=\u5df2\u6210\u529f\u5220\u9664 {0} \u4e2a\u9879\u76ee +title.multiple-delete.confirm=\u591a\u9879\u5220\u9664 +message.multiple-delete.confirm=\u4ee5\u4e0b {0} \u4e2a\u9879\u76ee\u5956\u4ece\u5f52\u7c7b\u65b9\u6848\u4e2d\u5220\u9664\u3002 +message.multiple-delete.please-wait=\u6b63\u5728\u5220\u9664\u8bb0\u5f55... +message.new-unknown.error=\u6211\u4eec\u65e0\u6cd5\u67e5\u627e\u7c7b\u578b ''{0}''\u3002 +message.new-category.failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u7c7b\u522b ''{0}'' +message.new-folder.failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u6587\u4ef6\u5939 ''{0}'' +message.new-record.failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa ''{0}'' +message.new-unfiledRecordsFolder.failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u672a\u7acb\u5377\u8bb0\u5f55\u6587\u4ef6\u5939 ''{0}'' +message.new-hold.failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u4fdd\u5b58 ''{0}'' +message.new-category.success=\u5df2\u521b\u5efa\u7c7b\u522b ''{0}'' +message.new-folder.success=\u5df2\u521b\u5efa\u6587\u4ef6\u5939 ''{0}'' +message.new-record.success=\u5df2\u521b\u5efa\u8bb0\u5f55 ''{0}'' +message.new-unfiledRecordsFolder.success=\u5df2\u521b\u5efa\u672a\u7acb\u5377\u8bb0\u5f55\u6587\u4ef6\u5939 ''{0}'' +message.new-hold.success=\u5df2\u521b\u5efa\u4fdd\u5b58 ''{0}'' +message.load-top-level-assets.failure=\u7531\u4e8e\u65e0\u6cd5\u52a0\u8f7d\u9876\u5c42\u8d44\u4ea7\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u6cd5\u5168\u90e8\u5bfc\u51fa\u3002 +message.nothing-to-export=\u65e0\u53ef\u5bfc\u51fa\u7684\u5185\u5bb9 + +## Toolbar Modes +description.path= +description.path.more= +description.savedsearch=\u5df2\u4fdd\u5b58\u641c\u7d22\u7684\u7ed3\u679c +description.savedsearch.more="{0}" +description.transfers=\u8f6c\u79fb +description.transfers.more=\uff08\u7b49\u5f85\u201c\u79fb\u4ea4\u5b8c\u6210\u201d\u6216\u201c\u5165\u7ba1\u5b8c\u6210\u201d\u7684\u8bb0\u5f55\uff09 +description.transfers.more.filterDisplay=\u5f53\u524d\u6b63\u5728\u67e5\u770b ''{0}'' +description.holds=\u5f53\u524d\u7684\u4fdd\u5b58 +description.holds.more=\uff08\u5904\u4e8e\u201c\u4fdd\u5b58\u4e2d\u201d\u72b6\u6001\u7684\u9879\u76ee\uff09 +description.holds.more.filterDisplay=\u5f53\u524d\u6b63\u5728\u67e5\u770b ''{0}'' +description.unfiledRecords=\u672a\u7acb\u5377\u8bb0\u5f55 +description.unfiledRecords.more=\uff08\u6ca1\u6709\u88ab\u7acb\u5377\u7684\u8bb0\u5f55\uff09 +description.unfiledRecords.more.filterDisplay=\u5f53\u524d\u6b63\u5728\u67e5\u770b ''{0}'' + +## Browser dialogs +label.filter-description.acp=Alfresco \u5185\u5bb9\u5305\u6587\u4ef6 (.acp) +label.filter-description.zip=\u5b58\u6863\u5305 (.zip) + +## Pop-up Messages +# General +message.loading=\u6b63\u5728\u52a0\u8f7d\u5f52\u7c7b\u65b9\u6848... +message.error=\u6211\u4eec\u65e0\u6cd5\u8bbf\u95ee\u5f52\u7c7b\u65b9\u6848\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.empty=\u60a8\u5c1a\u672a\u6dfb\u52a0\u4efb\u4f55\u9879\u76ee\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.lib.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.lib.ftl new file mode 100644 index 0000000000..ed5d47a007 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.lib.ftl @@ -0,0 +1,396 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#macro viewRenderererJsDeps> + <#list viewJsDeps as dep> + <@script type="text/javascript" src="${url.context}/res/${dep}" group="documentlibrary"/> + + + +<#macro viewRenderererCssDeps> + <#list viewCssDeps as dep> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/${dep}" group="documentlibrary"/> + + + +<#macro documentlistTemplate> + <#nested> + <#assign id=args.htmlid?html> +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <#-- RM-318 - removing Report button temporarily +
+
+
+ --> +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+ <@markup id="documentListSortSelect"> +
+ + + + + + + +
+
+ + + + + +
+ + <@markup id="galleryViewSlider"> + + +
+
+ +
+ + + +
+ + <#-- + INFORMATION TEMPLATES + --> + + + <#-- No items message --> + + + <#-- Hidden sub-folders message --> + + + <#-- HTML 5 drag and drop instructions --> + + + <#-- Standard upload instructions --> + + + <#-- Other options? --> + + + <#-- The following DOM structures should be editing with respect to documentlist.js function + fired by the Doclists "tableMsgShowEvent" as it uses this structure to associate the + image and anchor with the appropriate actions. NOTE: This is only a template that will + be cloned, during the cloning the id will be appended with "-instance" to ensure uniqueness + within the page, this allows us to locate each DOM node individually. --> + + <#-- Standard upload (when user has create access) --> + + + <#-- New Folder (when user has create access) --> + + + <#-- Hidden sub-folders message --> + + <#-- + END OF INFORMATION TEMPLATES + --> + + <#-- Top Bar: Select, Pagination, Sorting & View controls --> +
+
+ + + + + +
+ + <#-- Main Panel: Document List --> + <@markup id="documentListContainer"> +
+ + + + + + <#-- Bottom Bar: Paginator --> +
+
+
 
+
+
+
+ + <#-- + RENDERING TEMPLATES + --> +
+ + <#-- Action Set "More" template --> + + + <#-- Document List Gallery View Templates--> + + + <#-- Document List Filmstrip View Templates --> + + +
+
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.lib.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.lib.js new file mode 100644 index 0000000000..01509166e9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/documentlist-v2.lib.js @@ -0,0 +1,76 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function getRMActionSet(myConfig) +{ + // Actions + var multiSelectConfig = config.scoped["DocumentLibrary"]["multi-select"], + multiSelectActions = multiSelectConfig.getChildren("action"), + actionSet = []; + + var multiSelectAction; + for (var i = 0; i < multiSelectActions.size(); i++) + { + multiSelectAction = multiSelectActions.get(i); + attr = multiSelectAction.attributes; + + if(attr["rmaction"] == "true") + { + // Multi-Select Actions + action = { + id: attr["id"] ? attr["id"].toString() : "", + type: attr["type"] ? attr["type"].toString() : "", + permission: attr["permission"] ? attr["permission"].toString() : "", + asset: attr["asset"] ? attr["asset"].toString() : "", + href: attr["href"] ? attr["href"].toString() : "", + label: attr["label"] ? attr["label"].toString() : "", + hasAspect: attr["hasAspect"] ? attr["hasAspect"].toString() : "", + notAspect: attr["notAspect"] ? attr["notAspect"].toString() : "", + hasProperty: attr["hasProperty"] ? attr["hasProperty"].toString() : "", + notProperty: attr["notProperty"] ? attr["notProperty"].toString() : "" + }; + + actionSet.push(action) + } + } + + model.actionSet = actionSet; +} + +function rm_main() +{ + var myConfig = new XML(config.script); + + getPreferences(); + getRMActionSet(myConfig); + getCreateContent(myConfig); + getRepositoryBrowserRoot(); +} + +rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.desc.xml new file mode 100644 index 0000000000..7233ffdf61 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.desc.xml @@ -0,0 +1,5 @@ + + DocLib File Plan Filter + Document Library: File Plan Filter Component + /rm/components/documentlibrary/fileplan + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.head.ftl new file mode 100644 index 0000000000..9d9c30a357 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.head.ftl @@ -0,0 +1,27 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.html.ftl new file mode 100644 index 0000000000..40dc62423d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.html.ftl @@ -0,0 +1,38 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign filterIds = ""> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.properties new file mode 100644 index 0000000000..2fe3645673 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=File Plan + +## Filters +label.transfers=Transfers +label.holds=Holds +label.unfiledRecords=Unfiled Records \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_de.properties new file mode 100644 index 0000000000..c738c7d13a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_de.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Ablageplan + +## Filters +label.transfers=\u00dcbertragungen +label.holds=Legal Holds +label.unfiledRecords=Nicht abgelegte Records diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_es.properties new file mode 100755 index 0000000000..a9a57cd05a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_es.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Cuadro de clasificaci\u00f3n + +## Filters +label.transfers=Transferencias +label.holds=Retenciones legales +label.unfiledRecords=Documentos de archivo no archivados diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_fr.properties new file mode 100644 index 0000000000..0f268c221a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_fr.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Plan de classement + +## Filters +label.transfers=Transferts +label.holds=Suspensions +label.unfiledRecords=Documents d'archives non class\u00e9s diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_it.properties new file mode 100644 index 0000000000..1967d69c8a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_it.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Piano di fascicolazione + +## Filters +label.transfers=Trasferimenti +label.holds=Sospensioni +label.unfiledRecords=Record non archiviati diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_ja.properties new file mode 100644 index 0000000000..a9f37c0261 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_ja.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 + +## Filters +label.transfers=\u8ee2\u9001 +label.holds=\u30db\u30fc\u30eb\u30c9 +label.unfiledRecords=\u6574\u7406\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_nb.properties new file mode 100644 index 0000000000..8f1c826be6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_nb.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Filplan + +## Filters +label.transfers=Overf\u00f8ringer +label.holds=Hold +label.unfiledRecords=Oppf\u00f8ringer som ikke er registrert diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_nl.properties new file mode 100755 index 0000000000..e208dc5af7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_nl.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Ordeningsplan + +## Filters +label.transfers=Overzettingen +label.holds=Bewaringen +label.unfiledRecords=Niet-gearchiveerde archiefstukken diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_pt_BR.properties new file mode 100644 index 0000000000..eb72f1c65c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_pt_BR.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=Plano de arquivamento + +## Filters +label.transfers=Transfer\u00eancias +label.holds=Esperas +label.unfiledRecords=Documentos arquiv\u00edsticos n\u00e3o arquivados diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_ru.properties new file mode 100644 index 0000000000..b973c9e3bd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_ru.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 + +## Filters +label.transfers=\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u044b +label.holds=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +label.unfiledRecords=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_zh_CN.properties new file mode 100644 index 0000000000..cb95d787d2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/fileplan.get_zh_CN.properties @@ -0,0 +1,7 @@ +## Title +header.fileplan=\u5f52\u7c7b\u65b9\u6848 + +## Filters +label.transfers=\u8f6c\u79fb +label.holds=\u4fdd\u5b58 +label.unfiledRecords=\u672a\u7acb\u5377\u8bb0\u5f55 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.desc.xml new file mode 100644 index 0000000000..8eec564681 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.desc.xml @@ -0,0 +1,5 @@ + + DocLib Saved Searches + Document Library: Saved Searches Component + /rm/components/documentlibrary/savedsearch + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.head.ftl new file mode 100644 index 0000000000..9d9c30a357 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.head.ftl @@ -0,0 +1,27 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.html.ftl new file mode 100644 index 0000000000..337e10ceb2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.html.ftl @@ -0,0 +1,37 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +
+

${msg("header.savedsearch")}

+ +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.js new file mode 100644 index 0000000000..bd8c59bba8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.js @@ -0,0 +1,63 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Main entrypoint for component webscript logic + * + * @method main + */ +function main() +{ + var siteId = page.url.templateArgs.site, + savedSearches = []; + + var connector = remote.connect("alfresco"); + result = connector.get("/slingshot/doclib/rm/savedsearches/site/" + siteId); + + if (result.status == 200) + { + var ss = eval('(' + result + ')'); + try + { + for each (var s in ss.items) + { + savedSearches.push( + { + data: s.name, + label: s.name, + description: s.description + }); + } + } + catch (e) + { + } + } + + model.savedSearches = savedSearches; +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.properties new file mode 100644 index 0000000000..dd2ed44f75 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Saved Searches + +rm.savedsearch.vitalRecordsName=Vital Records Due for Review +rm.savedsearch.vitalRecordsDesc=All records currently due for review. + +rm.savedsearch.incompleteRecordsName=Incomplete Records +rm.savedsearch.incompleteRecordsDesc=All incomplete records. + +rm.savedsearch.cutoffRecordsName=Records and Record Folders Eligible for Cut Off +rm.savedsearch.cutoffRecordsDesc=All records and record folders currently eligible for cut off. + +rm.savedsearch.transferRecordsName=Records and Record Folders Eligible for Transfer +rm.savedsearch.transferRecordsDesc=All records and record folders currently eligible for transfer. + +rm.savedsearch.destructionRecordsName=Records and Record Folders Eligible for Destruction +rm.savedsearch.destructionRecordsDesc=All records and record folders currently eligible for destruction. + +rm.savedsearch.frozenRecordsName=Records and Record Folders On Hold +rm.savedsearch.frozenRecordsDesc=All records and record folders on hold. \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_de.properties new file mode 100644 index 0000000000..fff8f5ffe5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_de.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Gespeicherte Suchen + +rm.savedsearch.vitalRecordsName=Besonders relevante Records mit f\u00e4lliger \u00dcberpr\u00fcfung +rm.savedsearch.vitalRecordsDesc=Alle aktuell zum \u00dcberpr\u00fcfen f\u00e4lligen Records. + +rm.savedsearch.incompleteRecordsName=Nicht abgeschlossene Records +rm.savedsearch.incompleteRecordsDesc=Alle nicht abgeschlossenen Records. + +rm.savedsearch.cutoffRecordsName=Zur Trennung geeignete Records und Record-Ordner +rm.savedsearch.cutoffRecordsDesc=Alle derzeit zur Trennung geeigneten Records und Record-Ordner. + +rm.savedsearch.transferRecordsName=Zur \u00dcbertragung geeignete Records und Record-Ordner +rm.savedsearch.transferRecordsDesc=Alle aktuell zur \u00dcbertragung geeigneten Records und Record-Ordner. + +rm.savedsearch.destructionRecordsName=Zur Vernichtung geeignete Records und Record-Ordner +rm.savedsearch.destructionRecordsDesc=Alle aktuell zur Vernichtung geeigneten Records und Record-Ordner. + +rm.savedsearch.frozenRecordsName=Records und Record-Ordner mit Legal Hold +rm.savedsearch.frozenRecordsDesc=Alle Records und Record-Ordner mit Legal Hold. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_es.properties new file mode 100755 index 0000000000..7a7935f613 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_es.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=B\u00fasquedas guardadas + +rm.savedsearch.vitalRecordsName=Documentos de archivo vitales pendientes de revisi\u00f3n +rm.savedsearch.vitalRecordsDesc=Todos los documentos de archivo pendientes de revisi\u00f3n. + +rm.savedsearch.incompleteRecordsName=Documentos de archivo incompletos +rm.savedsearch.incompleteRecordsDesc=Todos los documentos de archivo incompletos. + +rm.savedsearch.cutoffRecordsName=Documentos de archivo y carpetas de documentos de archivo aptos para iniciar su retenci\u00f3n +rm.savedsearch.cutoffRecordsDesc=Todos los documentos de archivos y carpetas de documentos de archivos actuales aptos para iniciar su retenci\u00f3n. + +rm.savedsearch.transferRecordsName=Documentos de archivo y carpetas de documentos de archivo que se pueden transferir +rm.savedsearch.transferRecordsDesc=Todos los documentos de archivo y carpetas de documentos de archivo que se pueden transferir actualmente. + +rm.savedsearch.destructionRecordsName=Documentos de archivo y carpetas de documentos de archivo que se pueden destruir +rm.savedsearch.destructionRecordsDesc=Todos los documentos de archivo y carpetas de documentos de archivo que se pueden destruir actualmente. + +rm.savedsearch.frozenRecordsName=Documentos de archivo y carpetas de documentos de archivo en retenci\u00f3n legal +rm.savedsearch.frozenRecordsDesc=Todos los documentos de archivo y carpetas de documentos de archivo en retenci\u00f3n legal. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_fr.properties new file mode 100644 index 0000000000..4c8d49eb96 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_fr.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Recherches enregistr\u00e9es + +rm.savedsearch.vitalRecordsName=Documents d'archives essentiels arriv\u00e9s \u00e0 \u00e9ch\u00e9ance pour v\u00e9rification +rm.savedsearch.vitalRecordsDesc=Tous les documents d'archives arriv\u00e9s \u00e0 \u00e9ch\u00e9ance pour v\u00e9rification. + +rm.savedsearch.incompleteRecordsName=Documents d'archives incomplets +rm.savedsearch.incompleteRecordsDesc=Tous les documents d'archives incomplets. + +rm.savedsearch.cutoffRecordsName=Documents d'archives et dossiers d'archives \u00e9ligibles pour un d\u00e9but de conservation +rm.savedsearch.cutoffRecordsDesc=Tous les documents d'archives et dossiers d'archives actuellement \u00e9ligibles pour un d\u00e9but de conservation. + +rm.savedsearch.transferRecordsName=Documents d'archives et dossiers d'archives \u00e9ligibles pour un transfert +rm.savedsearch.transferRecordsDesc=Tous les documents d'archives et dossiers d'archives actuellement \u00e9ligibles pour un transfert. + +rm.savedsearch.destructionRecordsName=Documents d'archives et dossiers d'archives \u00e9ligibles pour une destruction +rm.savedsearch.destructionRecordsDesc=Tous les documents d'archives et dossiers d'archives actuellement \u00e9ligibles pour une destruction. + +rm.savedsearch.frozenRecordsName=Documents d'archives et dossiers d'archives suspendus +rm.savedsearch.frozenRecordsDesc=Tous les documents d'archives et dossiers d'archives actuellement suspendus. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_it.properties new file mode 100644 index 0000000000..531559cb3b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_it.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Ricerche salvate + +rm.savedsearch.vitalRecordsName=Record fondamentali da esaminare +rm.savedsearch.vitalRecordsDesc=Tutti i record attualmente da esaminare. + +rm.savedsearch.incompleteRecordsName=Record incompleti +rm.savedsearch.incompleteRecordsDesc=Tutti i record incompleti. + +rm.savedsearch.cutoffRecordsName=Record e cartelle di record idonei per il cut off +rm.savedsearch.cutoffRecordsDesc=Tutti i record e le cartelle di record attualmente idonei per il cut off. + +rm.savedsearch.transferRecordsName=Record e cartelle di record idonei per il trasferimento +rm.savedsearch.transferRecordsDesc=Tutti i record e le cartelle di record attualmente idonei per il trasferimento. + +rm.savedsearch.destructionRecordsName=Record e cartelle di record idonei per l'eliminazione definitiva +rm.savedsearch.destructionRecordsDesc=Tutti i record e le cartelle di record attualmente idonei per l'eliminazione definitiva. + +rm.savedsearch.frozenRecordsName=Record e cartelle di record in sospeso +rm.savedsearch.frozenRecordsDesc=Tutti i record e le cartelle di record in sospeso. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_ja.properties new file mode 100644 index 0000000000..ea3de55561 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_ja.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6 + +rm.savedsearch.vitalRecordsName=\u30ec\u30d3\u30e5\u30fc\u4e88\u5b9a\u306e\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9 +rm.savedsearch.vitalRecordsDesc=\u73fe\u5728\u30ec\u30d3\u30e5\u30fc\u4e88\u5b9a\u306e\u3059\u3079\u3066\u306e\u30ec\u30b3\u30fc\u30c9\u3002 + +rm.savedsearch.incompleteRecordsName=\u672a\u5b8c\u4e86\u30ec\u30b3\u30fc\u30c9 +rm.savedsearch.incompleteRecordsDesc=\u3059\u3079\u3066\u306e\u672a\u5b8c\u4e86\u30ec\u30b3\u30fc\u30c9\u3002 + +rm.savedsearch.cutoffRecordsName=\u30ab\u30c3\u30c8\u30aa\u30d5\u5bfe\u8c61\u306e\u30ec\u30b3\u30fc\u30c9\u304a\u3088\u3073\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +rm.savedsearch.cutoffRecordsDesc=\u73fe\u5728\u30ab\u30c3\u30c8\u30aa\u30d5\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\u3059\u3079\u3066\u306e\u30ec\u30b3\u30fc\u30c9\u3068\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u3002 + +rm.savedsearch.transferRecordsName=\u8ee2\u9001\u6761\u4ef6\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\u30ec\u30b3\u30fc\u30c9\u304a\u3088\u3073\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +rm.savedsearch.transferRecordsDesc=\u73fe\u5728\u8ee2\u9001\u53ef\u80fd\u306a\u3059\u3079\u3066\u306e\u30ec\u30b3\u30fc\u30c9\u3068\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u3002 + +rm.savedsearch.destructionRecordsName=\u7834\u68c4\u53ef\u80fd\u306a\u30ec\u30b3\u30fc\u30c9\u3068\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +rm.savedsearch.destructionRecordsDesc=\u73fe\u5728\u7834\u68c4\u53ef\u80fd\u306a\u3059\u3079\u3066\u306e\u30ec\u30b3\u30fc\u30c9\u3068\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u3002 + +rm.savedsearch.frozenRecordsName=\u30db\u30fc\u30eb\u30c9\u4e2d\u306e\u30ec\u30b3\u30fc\u30c9\u304a\u3088\u3073\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +rm.savedsearch.frozenRecordsDesc=\u30db\u30fc\u30eb\u30c9\u4e2d\u306e\u3059\u3079\u3066\u306e\u30ec\u30b3\u30fc\u30c9\u3068\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_nb.properties new file mode 100644 index 0000000000..eaa597c124 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_nb.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Sparte s\u00f8k + +rm.savedsearch.vitalRecordsName=Sv\u00e6rt viktige oppf\u00f8ringer som skal gjennomg\u00e5s +rm.savedsearch.vitalRecordsDesc=Alle oppf\u00f8ringer som n\u00e5 skal gjennomg\u00e5s. + +rm.savedsearch.incompleteRecordsName=Ufullstendige oppf\u00f8ringer +rm.savedsearch.incompleteRecordsDesc=Alle ufullstendige oppf\u00f8ringer. + +rm.savedsearch.cutoffRecordsName=Oppf\u00f8ringer og oppf\u00f8ringsmapper som er kvalifisert til cut off +rm.savedsearch.cutoffRecordsDesc=Alle oppf\u00f8ringer og oppf\u00f8ringsmapper som for tiden er kvalifisert til cut off. + +rm.savedsearch.transferRecordsName=Oppf\u00f8ringer og oppf\u00f8ringsmapper som er kvalifisert til overf\u00f8ring +rm.savedsearch.transferRecordsDesc=Alle oppf\u00f8ringer og oppf\u00f8ringsmapper som for tiden er kvalifisert til overf\u00f8ring. + +rm.savedsearch.destructionRecordsName=Oppf\u00f8ringer og oppf\u00f8ringsmapper som er kvalifisert til destruksjon +rm.savedsearch.destructionRecordsDesc=Alle oppf\u00f8ringer og oppf\u00f8ringsmapper som for tiden er kvalifisert til destruksjon. + +rm.savedsearch.frozenRecordsName=Oppf\u00f8ringer og oppf\u00f8ringsmapper p\u00e5 hold +rm.savedsearch.frozenRecordsDesc=Alle oppf\u00f8ringer og oppf\u00f8ringsmapper p\u00e5 hold. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_nl.properties new file mode 100755 index 0000000000..8ea1127429 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_nl.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Opgeslagen zoekopdrachten + +rm.savedsearch.vitalRecordsName=Vitale archiefstukken gereed voor revisie +rm.savedsearch.vitalRecordsDesc=Alle archiefstukken die momenteel gereed zijn voor revisie. + +rm.savedsearch.incompleteRecordsName=Niet-afgeronde archiefstukken +rm.savedsearch.incompleteRecordsDesc=Alle niet-afgeronde archiefstukken. + +rm.savedsearch.cutoffRecordsName=Archiefstukken en archiefmappen die in aanmerking komen voor afsluiten +rm.savedsearch.cutoffRecordsDesc=Alle archiefstukken en archiefmappen die momenteel in aanmerking komen voor afsluiten + +rm.savedsearch.transferRecordsName=Archiefstukken en archiefmappen die in aanmerking komen voor overzetten +rm.savedsearch.transferRecordsDesc=Alle archiefstukken en archiefmappen die momenteel in aanmerking komen voor overzetten + +rm.savedsearch.destructionRecordsName=Archiefstukken en archiefmappen die in aanmerking komen voor vernietiging +rm.savedsearch.destructionRecordsDesc=Alle archiefstukken en archiefmappen die momenteel in aanmerking komen voor vernietiging + +rm.savedsearch.frozenRecordsName=Archiefstukken en archiefmappen in bewaring +rm.savedsearch.frozenRecordsDesc=Alle archiefstukken en archiefmappen die in bewaring zijn. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_pt_BR.properties new file mode 100644 index 0000000000..a1c1d7e28b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_pt_BR.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=Pesquisas salvas + +rm.savedsearch.vitalRecordsName=Documentos arquiv\u00edsticos vitais em prazo para revis\u00e3o +rm.savedsearch.vitalRecordsDesc=Todos os documentos arquiv\u00edsticos atualmente no prazo para revis\u00e3o. + +rm.savedsearch.incompleteRecordsName=Documentos arquiv\u00edsticos incompletos +rm.savedsearch.incompleteRecordsDesc=Todos os documentos arquiv\u00edsticos incompletos. + +rm.savedsearch.cutoffRecordsName=Documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos qualificados para corte +rm.savedsearch.cutoffRecordsDesc=Todos os documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos qualificados para corte. + +rm.savedsearch.transferRecordsName=Documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos qualificados para transfer\u00eancia +rm.savedsearch.transferRecordsDesc=Todos os documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos qualificados para transfer\u00eancia. + +rm.savedsearch.destructionRecordsName=Documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos qualificados para destrui\u00e7\u00e3o +rm.savedsearch.destructionRecordsDesc=Todos os documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos qualificados para destrui\u00e7\u00e3o. + +rm.savedsearch.frozenRecordsName=Documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos em espera +rm.savedsearch.frozenRecordsDesc=Todos os documentos arquiv\u00edsticos e pastas de documentos arquiv\u00edsticos em espera. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_ru.properties new file mode 100644 index 0000000000..32fa91d9c7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_ru.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0438\u0441\u043a\u0438 + +rm.savedsearch.vitalRecordsName=\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 +rm.savedsearch.vitalRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. + +rm.savedsearch.incompleteRecordsName=\u041d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +rm.savedsearch.incompleteRecordsDesc=\u0412\u0441\u0435 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. + +rm.savedsearch.cutoffRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u044f +rm.savedsearch.cutoffRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. + +rm.savedsearch.transferRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 +rm.savedsearch.transferRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. + +rm.savedsearch.destructionRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f +rm.savedsearch.destructionRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. + +rm.savedsearch.frozenRecordsName=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +rm.savedsearch.frozenRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_zh_CN.properties new file mode 100644 index 0000000000..0ff2f50f2c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/savedsearch.get_zh_CN.properties @@ -0,0 +1,20 @@ +## Title +header.savedsearch=\u4fdd\u5b58\u7684\u641c\u7d22 + +rm.savedsearch.vitalRecordsName=\u6838\u5fc3\u8bb0\u5f55\u7684\u5ba1\u67e5\u5230\u671f +rm.savedsearch.vitalRecordsDesc=\u6240\u6709\u8bb0\u5f55\u7684\u5ba1\u67e5\u5f53\u524d\u5df2\u5230\u671f\u3002 + +rm.savedsearch.incompleteRecordsName=\u4e0d\u5b8c\u6574\u7684\u8bb0\u5f55 +rm.savedsearch.incompleteRecordsDesc=\u6240\u6709\u4e0d\u5b8c\u6574\u7684\u8bb0\u5f55\u3002 + +rm.savedsearch.cutoffRecordsName=\u53ef\u4e2d\u65ad\u7684\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939 +rm.savedsearch.cutoffRecordsDesc=\u5f53\u524d\u53ef\u4e2d\u65ad\u7684\u6240\u6709\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939\u3002 + +rm.savedsearch.transferRecordsName=\u53ef\u79fb\u4ea4\u7684\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939 +rm.savedsearch.transferRecordsDesc=\u5f53\u524d\u53ef\u79fb\u4ea4\u7684\u6240\u6709\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939\u3002 + +rm.savedsearch.destructionRecordsName=\u53ef\u9500\u6bc1\u7684\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939 +rm.savedsearch.destructionRecordsDesc=\u5f53\u524d\u53ef\u9500\u6bc1\u7684\u6240\u6709\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939\u3002 + +rm.savedsearch.frozenRecordsName=\u4fdd\u5b58\u4e2d\u7684\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939 +rm.savedsearch.frozenRecordsDesc=\u4fdd\u5b58\u4e2d\u7684\u6240\u6709\u8bb0\u5f55\u548c\u8bb0\u5f55\u6587\u4ef6\u5939 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.desc.xml new file mode 100644 index 0000000000..1525b62bbf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.desc.xml @@ -0,0 +1,5 @@ + + DocLib Tree + Document Library: Tree Component + /rm/components/documentlibrary/tree + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.head.ftl new file mode 100644 index 0000000000..c425f262f3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.head.ftl @@ -0,0 +1,31 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/documentlibrary/tree.css" /> +<@script type="text/javascript" src="${url.context}/res/components/documentlibrary/tree.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/documentlibrary/tree.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.html.ftl new file mode 100644 index 0000000000..4b818d2d1c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.html.ftl @@ -0,0 +1,42 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign treeConfig = config.scoped["DocumentLibrary"]["tree"]!> +<#if treeConfig.getChildValue??><#assign evaluateChildFolders = treeConfig.getChildValue("evaluate-child-folders")!"true"> + +
+

${msg("header.library")}

+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.properties new file mode 100644 index 0000000000..24da618fed --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navigation + +## Top-level Root Node +node.root=File Plan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_de.properties new file mode 100644 index 0000000000..7286deff69 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_de.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navigation + +## Top-level Root Node +node.root=Ablageplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_es.properties new file mode 100755 index 0000000000..6abd63fb0c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_es.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navegaci\u00f3n + +## Top-level Root Node +node.root=Cuadro de clasificaci\u00f3n diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_fr.properties new file mode 100644 index 0000000000..91675736bb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_fr.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navigation + +## Top-level Root Node +node.root=Plan de classement diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_it.properties new file mode 100644 index 0000000000..38622b97e9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_it.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navigazione + +## Top-level Root Node +node.root=Piano di fascicolazione diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_ja.properties new file mode 100644 index 0000000000..4414743a4f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_ja.properties @@ -0,0 +1,5 @@ +## Title +header.library=\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3 + +## Top-level Root Node +node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_nb.properties new file mode 100644 index 0000000000..c2d4bc4b40 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_nb.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navigering + +## Top-level Root Node +node.root=Filplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_nl.properties new file mode 100755 index 0000000000..a8b9160696 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_nl.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navigatie + +## Top-level Root Node +node.root=Ordeningsplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_pt_BR.properties new file mode 100644 index 0000000000..c806b67ae9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_pt_BR.properties @@ -0,0 +1,5 @@ +## Title +header.library=Navega\u00e7\u00e3o + +## Top-level Root Node +node.root=Plano de arquivamento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_ru.properties new file mode 100644 index 0000000000..18a9a8c000 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_ru.properties @@ -0,0 +1,5 @@ +## Title +header.library=\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f + +## Top-level Root Node +node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_zh_CN.properties new file mode 100644 index 0000000000..8cd2311207 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/documentlibrary/tree.get_zh_CN.properties @@ -0,0 +1,5 @@ +## Title +header.library=\u5bfc\u822a + +## Top-level Root Node +node.root=\u5f52\u7c7b\u65b9\u6848 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.desc.xml new file mode 100644 index 0000000000..f2e895dae5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.desc.xml @@ -0,0 +1,5 @@ + + records-edit-metadata-mgr + Records Edit Metadata Manager Component + /rm/components/edit-metadata/edit-metadata-mgr + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.head.ftl new file mode 100644 index 0000000000..4b9b78665d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.head.ftl @@ -0,0 +1,27 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/form/form.css" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.html.ftl new file mode 100644 index 0000000000..d9a9692cce --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.html.ftl @@ -0,0 +1,27 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/edit-metadata/edit-metadata-mgr.get.html.ftl"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.js new file mode 100644 index 0000000000..c7f61ad3d8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.js @@ -0,0 +1,65 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function alfresco_rm_main() +{ + // Call for meta data again (response is cached) so we can alter the nodeType + var nodeRef = model.nodeRef, + nodeType = model.nodeType; + result = remote.connect("alfresco").get("/slingshot/edit-metadata/node/" + nodeRef.replace(":/", "")); + + if (result.status == 200) + { + // Determine the return page's nodeType and nodeRef depending on type being edited + var metadata = eval('(' + result + ')'); + switch (String(metadata.node.type)) + { + case "dod:recordSeries": + nodeType = "record-series"; + break; + + case "dod:recordCategory": + nodeType = "record-category"; + break; + + case "rma:recordFolder": + nodeType = "record-folder"; + break; + + case "rma:dispositionSchedule": + nodeType = "record-category"; + nodeRef = metadata.nodeRef; + break; + } + } + model.nodeRef = nodeRef; + model.nodeType = nodeType; +} + +alfresco_rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.properties new file mode 100644 index 0000000000..d457161935 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Edit Metadata +edit-metadata-mgr.button.save=Save +edit-metadata-mgr.update.failed=We couldn't update the metadata. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_de.properties new file mode 100644 index 0000000000..5c5d616b8d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_de.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Metadaten bearbeiten +edit-metadata-mgr.button.save=Speichern +edit-metadata-mgr.update.failed=Metadaten konnten nicht aktualisiert werden. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_es.properties new file mode 100755 index 0000000000..ccc2f61087 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_es.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Editar metadatos +edit-metadata-mgr.button.save=Guardar +edit-metadata-mgr.update.failed=No se pudieron actualizar los metadatos. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_fr.properties new file mode 100644 index 0000000000..fd792bd1c0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_fr.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Modifier les m\u00e9tadonn\u00e9es +edit-metadata-mgr.button.save=Enregistrer +edit-metadata-mgr.update.failed=Impossible de mettre \u00e0 jour les m\u00e9tadonn\u00e9es. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_it.properties new file mode 100644 index 0000000000..51775ca3cd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_it.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Modifica metadati +edit-metadata-mgr.button.save=Salva +edit-metadata-mgr.update.failed=Impossibile aggiornare i metadati. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_ja.properties new file mode 100644 index 0000000000..3414463d4b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_ja.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u7de8\u96c6 +edit-metadata-mgr.button.save=\u4fdd\u5b58 +edit-metadata-mgr.update.failed=\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_nb.properties new file mode 100644 index 0000000000..0bc5f798b1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_nb.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Rediger metadata +edit-metadata-mgr.button.save=Lagre +edit-metadata-mgr.update.failed=Kunne ikke oppdatere metadata. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_nl.properties new file mode 100755 index 0000000000..ef2824e3e9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_nl.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Metagegevens bewerken +edit-metadata-mgr.button.save=Opslaan +edit-metadata-mgr.update.failed=Kan de metagegevens niet bijwerken. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_pt_BR.properties new file mode 100644 index 0000000000..fe03d6b569 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_pt_BR.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=Editar metadados +edit-metadata-mgr.button.save=Salvar +edit-metadata-mgr.update.failed=N\u00e3o foi poss\u00edvel atualizar os metadados. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_ru.properties new file mode 100644 index 0000000000..2a9ad1a3d6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_ru.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +edit-metadata-mgr.button.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +edit-metadata-mgr.update.failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_zh_CN.properties new file mode 100644 index 0000000000..5d5ce7f4be --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/edit-metadata/edit-metadata-mgr.get_zh_CN.properties @@ -0,0 +1,3 @@ +edit-metadata-mgr.heading=\u7f16\u8f91\u5143\u6570\u636e +edit-metadata-mgr.button.save=\u4fdd\u5b58 +edit-metadata-mgr.update.failed=\u6211\u4eec\u65e0\u6cd5\u66f4\u65b0\u5143\u6570\u636e\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.desc.xml new file mode 100644 index 0000000000..4b56786bf5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.desc.xml @@ -0,0 +1,5 @@ + + display-edit + Disposition Edit Component + /rm/components/fileplan/disposition-edit + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.head.ftl new file mode 100644 index 0000000000..ecf516274b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/fileplan/disposition-edit.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/fileplan/disposition-edit.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.html.ftl new file mode 100644 index 0000000000..7f64433754 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.html.ftl @@ -0,0 +1,206 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +<#assign el=args.htmlid> +
+
+ * ${msg("label.required.fields")} +
+
+
+
${msg("header.action")}
+
+
    +
  1. ${msg("message.loadingSteps")}
  2. +
+
+
+ +
+
+ + +
+ +
+
+ + + + + +
+ + +
+
    +
  • +
    + ${msg("label.or")} + ${msg("label.and")} +
    +
    + + +
    +
    +
    +   +
    +
  • +
+ +
    + +
+
+ +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.js new file mode 100644 index 0000000000..45b0bbd3f1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.js @@ -0,0 +1,121 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Sort helper function for objects with labels + * + * @param obj1 + * @param obj2 + */ +function sortByLabel(obj1, obj2) +{ + return (obj1.label > obj2.label) ? 1 : (obj1.label < obj2.label) ? -1 : 0; +} + +/** + * Main entrypoint for component webscript logic + * + * @method main + */ +function main() +{ + // Call the repo to create the site + var scriptRemoteConnector = remote.connect("alfresco"); + var repoResponse = scriptRemoteConnector.get("/api/rma/admin/listofvalues"); + if (repoResponse.status == 401) + { + status.setCode(repoResponse.status, "error.loggedOut"); + return; + } + else + { + var repoJSON = eval('(' + repoResponse + ')'); + + // Check if we got a positive result + if (repoJSON.data) + { + var data = repoJSON.data; + if(data && data.dispositionActions) + { + model.dispositionActions = data.dispositionActions.items; + } + if(data && data.events) + { + var events = data.events.items; + events.sort(sortByLabel); + model.events = events; + } + if(data && data.periodTypes) + { + var periodTypes = data.periodTypes.items; + periodTypes.sort(sortByLabel); + model.periodTypes = periodTypes; + } + if(data && data.periodProperties) + { + var periodProperties = data.periodProperties.items; + periodProperties.sort(sortByLabel); + model.periodProperties = periodProperties; + } + } + else if (repoJSON.status.code) + { + status.setCode(repoJSON.status.code, repoJSON.message); + return; + } + } + + repoResponse = scriptRemoteConnector.get("/api/rma/rmconstraints/rmc_tlList"); + if (repoResponse.status == 401) + { + status.setCode(repoResponse.status, "error.loggedOut"); + return; + } + else + { + var repoJSON = eval('(' + repoResponse + ')'); + + // Check if we got a positive result + if (repoJSON.data) + { + var data = repoJSON.data; + if(data && data.allowedValuesForCurrentUser) + { + var transferLocations = data.allowedValuesForCurrentUser; + transferLocations.sort(sortByLabel); + model.transferLocations = transferLocations; + } + } + else if (repoJSON.status.code) + { + status.setCode(repoJSON.status.code, repoJSON.message); + return; + } + } + +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.properties new file mode 100644 index 0000000000..60df33edab --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get.properties @@ -0,0 +1,46 @@ +header.action=Steps +header.period=Duration +header.events=Events +header.event=Event +header.completion=Event Completion + +label.required.fields=Required Fields +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} after {1} {2}(s) +label.title.new=New Step +label.ghostondestroy=Keep record metadata after record destruction +label.transferTo=Transfer to +label.after=After a period of +label.from=from +label.when=When event happens +label.description=Step Description +label.select.location=Select location... + +icon.editaction=Edit +icon.deleteaction=Delete +icon.deleteevent=Delete Event + +label.or=or +label.and=and +label.automatic.true=Automatic +label.automatic.false=Manual + +relation.option.or=Whichever event is earlier +relation.option.and=When all events have happened + +button.addevent=Add Event +button.createevent=Create Event +button.addaction=Add Step +button.createaction=Add Step + +message.getActionFailure=We couldn't get the retention schedule. Try refreshing your browser. +message.savingAction=Saving step +message.saveActionFailure=The step couldn't be saved +title.deleteAction=Delete +label.confirmDeleteAction=Are you sure you want to delete the step? +message.deletingAction=Deleting step +message.deleteActionSuccess=Step successfully deleted +message.deleteActionFailure=We couldn't delete the step. +message.loadingSteps=Loading steps... +message.noSteps=You haven't added any steps yet. Click Add Step to create one. \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_de.properties new file mode 100644 index 0000000000..3e2d415d2e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_de.properties @@ -0,0 +1,46 @@ +header.action=Schritte +header.period=Dauer +header.events=Ereignisse +header.event=Ereignis +header.completion=Ereignisabschluss + +label.required.fields=Pflichtfelder +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} nach {1} {2}(s) +label.title.new=Neuer Schritt +label.ghostondestroy=Record-Metadaten nach Record-Vernichtung behalten +label.transferTo=\u00dcbertragen nach +label.after=Nach einem Zeitraum von +label.from=von +label.when=Bei Ereigniseintritt +label.description=Schrittbeschreibung +label.select.location=Speicherort ausw\u00e4hlen... + +icon.editaction=Bearbeiten +icon.deleteaction=L\u00f6schen +icon.deleteevent=Ereignis l\u00f6schen + +label.or=oder +label.and=und +label.automatic.true=Autom. +label.automatic.false=Handbuch + +relation.option.or=Beim jeweils fr\u00fcheren Ereignis +relation.option.and=Nach Eintritt aller Ereignisse + +button.addevent=Ereignis hinzuf\u00fcgen +button.createevent=Ereignis erstellen +button.addaction=Schritt hinzuf\u00fcgen +button.createaction=Schritt hinzuf\u00fcgen + +message.getActionFailure=Aufbewahrungsplan konnte nicht ermittelt werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.savingAction=Schritt wird gespeichert. +message.saveActionFailure=Dieser Schritt konnte nicht gespeichert werden. +title.deleteAction=L\u00f6schen +label.confirmDeleteAction=M\u00f6chten Sie den Schritt wirklich l\u00f6schen? +message.deletingAction=Schritt wird gel\u00f6scht. +message.deleteActionSuccess=Schritt erfolgreich gel\u00f6scht +message.deleteActionFailure=Schritt konnte nicht gel\u00f6scht werden. +message.loadingSteps=Schritte werden geladen... +message.noSteps=Bisher wurden noch keine Schritte hinzugef\u00fcgt. Klicken Sie auf 'Schritt hinzuf\u00fcgen', um einen Schritt zu erstellen. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_es.properties new file mode 100755 index 0000000000..f1831f6ab9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_es.properties @@ -0,0 +1,46 @@ +header.action=Pasos +header.period=Duraci\u00f3n +header.events=Eventos +header.event=Evento +header.completion=Finalizaci\u00f3n de evento + +label.required.fields=Campos requeridos +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} despu\u00e9s de {1} {2}(s) +label.title.new=Nuevo paso +label.ghostondestroy=Mantener los metadatos de los documentos de archivo despu\u00e9s de la destrucci\u00f3n de los documentos de archivo +label.transferTo=Transferir a +label.after=Despu\u00e9s de un periodo de +label.from=desde +label.when=Cuando suceda el evento +label.description=Descripci\u00f3n del paso +label.select.location=Seleccionar ubicaci\u00f3n... + +icon.editaction=Editar +icon.deleteaction=Eliminar +icon.deleteevent=Eliminar evento + +label.or=o +label.and=y +label.automatic.true=Autom\u00e1tico +label.automatic.false=Manual + +relation.option.or=El que sea m\u00e1s pronto +relation.option.and=Cuanto todos los eventos hayan sucedido + +button.addevent=A\u00f1adir evento +button.createevent=Crear evento +button.addaction=A\u00f1adir paso +button.createaction=A\u00f1adir paso + +message.getActionFailure=No se pudo obtener el calendario de retenci\u00f3n. Trate de actualizar el navegador. +message.savingAction=Guardando paso +message.saveActionFailure=No se pudo guardar el paso +title.deleteAction=Eliminar +label.confirmDeleteAction=\u00bfEst\u00e1 seguro de que desea eliminar el paso? +message.deletingAction=Eliminando paso +message.deleteActionSuccess=Paso eliminado correctamente +message.deleteActionFailure=No se ha podido eliminar el paso. +message.loadingSteps=Cargando pasos... +message.noSteps=No ha a\u00f1adido ning\u00fan paso todav\u00eda. Haga clic en A\u00f1adir pasos para crear uno. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_fr.properties new file mode 100644 index 0000000000..835c1f4703 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_fr.properties @@ -0,0 +1,46 @@ +header.action=Etapes +header.period=Dur\u00e9e +header.events=Ev\u00e9nements +header.event=Ev\u00e9nement +header.completion=Ev\u00e9nement termin\u00e9 + +label.required.fields=Champs requis +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} apr\u00e8s {1} {2}(s) +label.title.new=Nouvelle \u00e9tape +label.ghostondestroy=Conserver les m\u00e9tadonn\u00e9es du document d'archives apr\u00e8s sa destruction +label.transferTo=Transf\u00e9rer \u00e0 +label.after=Apr\u00e8s une p\u00e9riode de +label.from=\u00e0 partir de +label.when=Lorsque l'\u00e9v\u00e9nement se produit +label.description=Description de l'\u00e9tape +label.select.location=S\u00e9lectionnez un emplacement... + +icon.editaction=Modifier +icon.deleteaction=Supprimer +icon.deleteevent=Supprimer l'\u00e9v\u00e9nement + +label.or=ou +label.and=et +label.automatic.true=Automatique +label.automatic.false=Manuel + +relation.option.or=Quel que soit l'\u00e9v\u00e9nement qui se produit le premier +relation.option.and=Lorsque tous les \u00e9v\u00e9nements se sont produits + +button.addevent=Ajouter un \u00e9v\u00e9nement +button.createevent=Cr\u00e9er un \u00e9v\u00e9nement +button.addaction=Ajouter une \u00e9tape +button.createaction=Ajouter une \u00e9tape + +message.getActionFailure=Impossible d'obtenir la r\u00e8gle de conservation. Essayez d'actualiser votre navigateur. +message.savingAction=Enregistrement en cours de l'\u00e9tape +message.saveActionFailure=Impossible d'enregistrer l'\u00e9tape +title.deleteAction=Supprimer +label.confirmDeleteAction=Etes-vous s\u00fbr de vouloir supprimer l'\u00e9tape ? +message.deletingAction=Suppression en cours de l'\u00e9tape +message.deleteActionSuccess=L'\u00e9tape a bien \u00e9t\u00e9 supprim\u00e9e +message.deleteActionFailure=Impossible de supprimer l'\u00e9tape +message.loadingSteps=Chargement en cours des \u00e9tapes... +message.noSteps=Vous n'avez pas encore ajout\u00e9 d'\u00e9tape. Cliquer sur Ajouter une \u00e9tape pour en cr\u00e9er une. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_it.properties new file mode 100644 index 0000000000..3df7ebb781 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_it.properties @@ -0,0 +1,46 @@ +header.action=Passaggi +header.period=Durata +header.events=Eventi +header.event=Evento +header.completion=Completamento evento + +label.required.fields=Campi obbligatori +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} dopo {1} {2} +label.title.new=Nuovo passaggio +label.ghostondestroy=Conserva i metadati del record dopo l'eliminazione definitiva +label.transferTo=Trasferisci a +label.after=Dopo un periodo di +label.from=Da +label.when=Quando l'evento si verifica +label.description=Descrizione passaggio +label.select.location=Seleziona posizione... + +icon.editaction=Modifica +icon.deleteaction=Elimina +icon.deleteevent=Elimina evento + +label.or=oppure +label.and=e +label.automatic.true=Automatico +label.automatic.false=Manuale + +relation.option.or=Ogni evento precedente +relation.option.and=Al verificarsi di tutti gli eventi + +button.addevent=Aggiungi evento +button.createevent=Crea evento +button.addaction=Aggiungi passaggio +button.createaction=Aggiungi passaggio + +message.getActionFailure=Impossibile ottenere il programma di conservazione Provare ad aggiornare il browser. +message.savingAction=Salvataggio passaggio +message.saveActionFailure=Impossibile salvare il passaggio +title.deleteAction=Elimina +label.confirmDeleteAction=Procedere con l'eliminazione del passaggio? +message.deletingAction=Eliminazione passaggio... +message.deleteActionSuccess=Eliminazione passaggio riuscita +message.deleteActionFailure=Impossibile eliminare il passaggio. +message.loadingSteps=Caricamento passaggi... +message.noSteps=Non \u00e8 stato ancora aggiunto alcun passaggio. Fare clic su Aggiungi passaggio per crearne uno. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_ja.properties new file mode 100644 index 0000000000..a856738dc3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_ja.properties @@ -0,0 +1,46 @@ +header.action=\u30b9\u30c6\u30c3\u30d7 +header.period=\u671f\u9593 +header.events=\u30a4\u30d9\u30f3\u30c8 +header.event=\u30a4\u30d9\u30f3\u30c8 +header.completion=\u30a4\u30d9\u30f3\u30c8\u5b8c\u4e86 + +label.required.fields=\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={1} {2} \u306e\u5f8c\u306e {0} +label.title.new=\u65b0\u3057\u3044\u30b9\u30c6\u30c3\u30d7 +label.ghostondestroy=\u30ec\u30b3\u30fc\u30c9\u306e\u7834\u68c4\u5f8c\u306b\u30ec\u30b3\u30fc\u30c9\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u4fdd\u6301 +label.transferTo=\u8ee2\u9001\u5148 +label.after=\u4e00\u5b9a\u671f\u9593\u5f8c +label.from=\u958b\u59cb\u65e5 +label.when=\u30a4\u30d9\u30f3\u30c8\u306e\u767a\u751f\u6642 +label.description=\u30b9\u30c6\u30c3\u30d7\u306e\u8aac\u660e +label.select.location=\u5834\u6240\u306e\u9078\u629e... + +icon.editaction=\u7de8\u96c6 +icon.deleteaction=\u524a\u9664 +icon.deleteevent=\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664 + +label.or=\u307e\u305f\u306f +label.and=\u304a\u3088\u3073 +label.automatic.true=\u81ea\u52d5 +label.automatic.false=\u624b\u52d5 + +relation.option.or=\u958b\u59cb\u304c\u65e9\u3044\u65b9\u306e\u30a4\u30d9\u30f3\u30c8 +relation.option.and=\u3059\u3079\u3066\u306e\u30a4\u30d9\u30f3\u30c8\u306e\u767a\u751f\u6642 + +button.addevent=\u30a4\u30d9\u30f3\u30c8\u306e\u8ffd\u52a0 +button.createevent=\u30a4\u30d9\u30f3\u30c8\u306e\u4f5c\u6210 +button.addaction=\u30b9\u30c6\u30c3\u30d7\u306e\u8ffd\u52a0 +button.createaction=\u30b9\u30c6\u30c3\u30d7\u306e\u8ffd\u52a0 + +message.getActionFailure=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.savingAction=\u30b9\u30c6\u30c3\u30d7\u3092\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059 +message.saveActionFailure=\u30b9\u30c6\u30c3\u30d7\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +title.deleteAction=\u524a\u9664 +label.confirmDeleteAction=\u30b9\u30c6\u30c3\u30d7\u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.deletingAction=\u30b9\u30c6\u30c3\u30d7\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059 +message.deleteActionSuccess=\u30b9\u30c6\u30c3\u30d7\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.deleteActionFailure=\u30b9\u30c6\u30c3\u30d7\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.loadingSteps=\u30b9\u30c6\u30c3\u30d7\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.noSteps=\u30b9\u30c6\u30c3\u30d7\u304c\u307e\u3060\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 [\u30b9\u30c6\u30c3\u30d7\u306e\u8ffd\u52a0] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30b9\u30c6\u30c3\u30d7\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_nb.properties new file mode 100644 index 0000000000..966f92f6b6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_nb.properties @@ -0,0 +1,46 @@ +header.action=Trinn +header.period=Varighet +header.events=Hendelser +header.event=Hendelse +header.completion=Fullf\u00f8relse av hendelse + +label.required.fields=Obligatoriske felt +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} etter {1} {2}(-er) +label.title.new=Nytt rinn +label.ghostondestroy=Behold metadataoppf\u00f8ringer etter destruksjon av oppf\u00f8ringer +label.transferTo=Overf\u00f8r til +label.after=Etter en periode p\u00e5 +label.from=fra +label.when=N\u00e5r det skjer en hendelse +label.description=Trinnbeskrivelse +label.select.location=Velg plassering... + +icon.editaction=Rediger +icon.deleteaction=Slett +icon.deleteevent=Slett hendelse + +label.or=eller +label.and=og +label.automatic.true=Automatisk +label.automatic.false=Manuell + +relation.option.or=Hendelsen som skjer f\u00f8rst +relation.option.and=N\u00e5r alle hendelsene har skjedd + +button.addevent=Legg til hendelse +button.createevent=Opprett hendelse +button.addaction=Legg til trinn +button.createaction=Legg til trinn + +message.getActionFailure=Kunne ikke hente retensjonsplanen. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.savingAction=Lagrer trinn +message.saveActionFailure=Trinnet kunne ikke lagres +title.deleteAction=Slett +label.confirmDeleteAction=Er du sikker p\u00e5 at du vil slette trinnet? +message.deletingAction=Sletter trinnet +message.deleteActionSuccess=Trinnet er n\u00e5 slettet +message.deleteActionFailure=Mislyktes i \u00e5 slette trinnet. +message.loadingSteps=Laster trinn... +message.noSteps=Det er enn\u00e5 ikke lagt til noen trinn. Klikk p\u00e5 Legg til trinn for \u00e5 opprette ett. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_nl.properties new file mode 100755 index 0000000000..de10024463 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_nl.properties @@ -0,0 +1,46 @@ +header.action=Stappen +header.period=Duur +header.events=Gebeurtenissen +header.event=Gebeurtenis +header.completion=Voltooiing gebeurtenis + +label.required.fields=Verplichte velden +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} na {1} {2}(s) +label.title.new=Nieuwe stap +label.ghostondestroy=Metagegevens van archiefstuk bewaren na vernietiging van archiefstuk +label.transferTo=Overbrengen naar +label.after=Na een periode van +label.from=van +label.when=Wanneer gebeurtenis plaatsvindt +label.description=Beschrijving van stap +label.select.location=Locatie selecteren... + +icon.editaction=Bewerken +icon.deleteaction=Verwijderen +icon.deleteevent=Gebeurtenis verwijderen + +label.or=of +label.and=en +label.automatic.true=Automatisch +label.automatic.false=Handmatig + +relation.option.or=Afhankelijk van welke gebeurtenis als eerste plaatsvindt +relation.option.and=Wanneer alle gebeurtenissen hebben plaatsgevonden + +button.addevent=Gebeurtenis toevoegen +button.createevent=Gebeurtenis maken +button.addaction=Stap toevoegen +button.createaction=Stap toevoegen + +message.getActionFailure=Kan het retentieschema niet ophalen. Vernieuw de browser. +message.savingAction=Stap wordt opgeslagen +message.saveActionFailure=De stap kon niet worden opgeslagen +title.deleteAction=Verwijderen +label.confirmDeleteAction=Weet u zeker dat u de stap wilt verwijderen? +message.deletingAction=Stap wordt verwijderd +message.deleteActionSuccess=Stap is verwijderd +message.deleteActionFailure=Kan de stap niet verwijderen. +message.loadingSteps=Stappen laden... +message.noSteps=U hebt nog geen stappen toegevoegd. Klik op Stap toevoegen om een stap te maken. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_pt_BR.properties new file mode 100644 index 0000000000..7d9014314e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_pt_BR.properties @@ -0,0 +1,46 @@ +header.action=Etapas +header.period=Dura\u00e7\u00e3o +header.events=Eventos +header.event=Evento +header.completion=Conclus\u00e3o do evento + +label.required.fields=Campos obrigat\u00f3rios +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} ap\u00f3s {1} {2}(s) +label.title.new=Nova etapa +label.ghostondestroy=Manter metadados do documento arquiv\u00edstico ap\u00f3s a destrui\u00e7\u00e3o do documento arquiv\u00edstico +label.transferTo=Transferir para +label.after=Ap\u00f3s um per\u00edodo de +label.from=de +label.when=Quando ocorrer o evento +label.description=Descri\u00e7\u00e3o da etapa +label.select.location=Selecionar local... + +icon.editaction=Editar +icon.deleteaction=Excluir +icon.deleteevent=Excluir evento + +label.or=ou +label.and=e +label.automatic.true=Autom\u00e1tico +label.automatic.false=Manual + +relation.option.or=O evento que ocorrer primeiro +relation.option.and=Quando todos os eventos tiverem ocorrido + +button.addevent=Adicionar evento +button.createevent=Criar evento +button.addaction=Adicionar etapa +button.createaction=Adicionar etapa + +message.getActionFailure=N\u00e3o foi poss\u00edvel obter a programa\u00e7\u00e3o de reten\u00e7\u00e3o. Tente atualizar seu navegador. +message.savingAction=Salvando etapa +message.saveActionFailure=A etapa n\u00e3o p\u00f4de ser salva +title.deleteAction=Excluir +label.confirmDeleteAction=Tem certeza de que deseja excluir a etapa? +message.deletingAction=Excluindo a etapa +message.deleteActionSuccess=Etapa exclu\u00edda com sucesso +message.deleteActionFailure=N\u00e3o foi poss\u00edvel excluir a etapa. +message.loadingSteps=Carregando etapas... +message.noSteps=Voc\u00ea ainda n\u00e3o adicionou nenhuma etapa. Clique em Adicionar etapa para criar uma. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_ru.properties new file mode 100644 index 0000000000..a31b042796 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_ru.properties @@ -0,0 +1,46 @@ +header.action=\u0428\u0430\u0433\u0438 +header.period=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c +header.events=\u0421\u043e\u0431\u044b\u0442\u0438\u044f +header.event=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 +header.completion=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f + +label.required.fields=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} \u043f\u043e\u0441\u043b\u0435 {1} {2} +label.title.new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0433 +label.ghostondestroy=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0441\u043b\u0435 \u0435\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f +label.transferTo=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432 +label.after=\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0432 +label.from=\u043e\u0442 +label.when=\u041f\u0440\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f +label.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 +label.select.location=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435... + +icon.editaction=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +icon.deleteaction=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +icon.deleteevent=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 + +label.or=\u0438\u043b\u0438 +label.and=\u0438 +label.automatic.true=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 +label.automatic.false=\u0412\u0440\u0443\u0447\u043d\u0443\u044e + +relation.option.or=\u041f\u043e \u0440\u0430\u043d\u043d\u0435\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044e +relation.option.and=\u041f\u0440\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 + +button.addevent=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +button.createevent=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +button.addaction=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0433 +button.createaction=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0433 + +message.getActionFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.savingAction=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 +message.saveActionFailure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0448\u0430\u0433 +title.deleteAction=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +label.confirmDeleteAction=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433? +message.deletingAction=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 +message.deleteActionSuccess=\u0428\u0430\u0433 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d +message.deleteActionFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0448\u0430\u0433. +message.loadingSteps=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0448\u0430\u0433\u043e\u0432... +message.noSteps=\u0412\u044b \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0448\u0430\u0433\u0438. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0448\u0430\u0433\u0430 \u0449\u0435\u043b\u043a\u043d\u0438\u0442\u0435 '\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0433'. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_zh_CN.properties new file mode 100644 index 0000000000..6d85583fa3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition-edit.get_zh_CN.properties @@ -0,0 +1,46 @@ +header.action=\u6b65\u9aa4 +header.period=\u6301\u7eed\u65f6\u95f4 +header.events=\u4e8b\u4ef6 +header.event=\u4e8b\u4ef6 +header.completion=\u4e8b\u4ef6\u5b8c\u6210 + +label.required.fields=\u5fc5\u586b\u5b57\u6bb5 +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={1} {2} \u540e {0} +label.title.new=\u65b0\u6b65\u9aa4 +label.ghostondestroy=\u8bb0\u5f55\u9500\u6bc1\u540e\u4fdd\u7559\u8bb0\u5f55\u7684\u5143\u6570\u636e +label.transferTo=\u8f6c\u79fb\u5230 +label.after=\u5728\u8be5\u65f6\u95f4\u540e +label.from=\u4ece +label.when=\u5728\u4e8b\u4ef6\u53d1\u751f\u65f6 +label.description=\u6b65\u9aa4\u8bf4\u660e +label.select.location=\u9009\u62e9\u4f4d\u7f6e... + +icon.editaction=\u7f16\u8f91 +icon.deleteaction=\u5220\u9664 +icon.deleteevent=\u5220\u9664\u4e8b\u4ef6 + +label.or=\u6216 +label.and=\u548c +label.automatic.true=\u81ea\u52a8 +label.automatic.false=\u624b\u52a8 + +relation.option.or=\u4ee5\u8f83\u65e9\u4e8b\u4ef6\u4e3a\u51c6 +relation.option.and=\u5728\u53d1\u751f\u6240\u6709\u4e8b\u4ef6\u540e + +button.addevent=\u6dfb\u52a0\u4e8b\u4ef6 +button.createevent=\u521b\u5efa\u4e8b\u4ef6 +button.addaction=\u6dfb\u52a0\u6b65\u9aa4 +button.createaction=\u6dfb\u52a0\u6b65\u9aa4 + +message.getActionFailure=\u6211\u4eec\u65e0\u6cd5\u83b7\u53d6\u4fdd\u7559\u8ba1\u5212\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.savingAction=\u6b63\u5728\u4fdd\u5b58\u6b65\u9aa4 +message.saveActionFailure=\u65e0\u6cd5\u4fdd\u5b58\u6b65\u9aa4 +title.deleteAction=\u5220\u9664 +label.confirmDeleteAction=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u6b65\u9aa4\uff1f +message.deletingAction=\u6b63\u5728\u5220\u9664\u6b65\u9aa4 +message.deleteActionSuccess=\u5df2\u6210\u529f\u5220\u9664\u6b65\u9aa4 +message.deleteActionFailure=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u6b64\u6b65\u9aa4\u3002 +message.loadingSteps=\u6b63\u5728\u52a0\u8f7d\u6b65\u9aa4... +message.noSteps=\u60a8\u5c1a\u672a\u6dfb\u52a0\u4efb\u4f55\u6b65\u9aa4\u3002 \u5355\u51fb\u201c\u6dfb\u52a0\u6b65\u9aa4\u201d\u6765\u521b\u5efa\u6b65\u9aa4\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.desc.xml new file mode 100644 index 0000000000..9b06247270 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.desc.xml @@ -0,0 +1,5 @@ + + events + Disposition Schedule View Component + /rm/components/fileplan/disposition + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.head.ftl new file mode 100644 index 0000000000..ff0aa952ac --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.head.ftl @@ -0,0 +1,32 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@script type="text/javascript" src="${url.context}/res/components/documentlibrary/actions.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/documentlibrary/actions.js"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/fileplan/disposition.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/fileplan/disposition.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.html.ftl new file mode 100644 index 0000000000..5ebbe73878 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.html.ftl @@ -0,0 +1,125 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +<#assign el=args.htmlid> + +
+ +
${msg("disposition-schedule.heading")}
+ +<#if hasDispositionSchedule> +
+
+
${msg("title.properties")}
+
+ <#if allowEditDispositionSchedule> + + + + + + +
+
+ +
+
+ ${msg("label.dispositionAuthority")}: + ${(authority!"")?html} +
+
+ ${msg("label.dispositionInstructions")}: + ${(instructions!"")?html} +
+
+ ${msg("label.appliedTo")}: + <#if (recordLevelDisposition)>${msg("label.appliedTo.record")}<#else>${msg("label.appliedTo.folder")} +
+
+ ${msg("label.unpublishedUpdates")}: + ${unpublishedUpdates?string("Yes", "No")} +
+ +
+ +
+
${msg("title.actions")}
+
+ <#if allowEditDispositionSchedule> + + + + + + +
+
+ +
+ <#if (actions?size > 0)> + <#list actions as action> +
+
${action.index + 1}
+ +
${action.title}
+ +
+ + <#else> + ${msg("label.noactions")} + +
+
+<#else> +
+
+
${msg("title.noDispositionSchedule")}
+
+ <#if allowCreateDispositionSchedule> + + + + + + +
+
+
+ + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.js new file mode 100644 index 0000000000..3bab82af4e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.js @@ -0,0 +1,153 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Main entrypoint for component webscript logic + * + * @method main + */ +function main() +{ + // Request the disposition actions + AlfrescoUtil.param('nodeRef'); + AlfrescoUtil.param('site', null); + + var nodeDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site); + model.allowCreateDispositionSchedule = false; + model.allowEditDispositionSchedule = false; + if (nodeDetails) + { + model.displayName = nodeDetails.item.displayName; + var actions = nodeDetails.item.node.rmNode.actions; + for (var i = 0; i < actions.length; i++) + { + if (actions[i] == "createDispositionSchedule") + { + model.allowCreateDispositionSchedule = true; + } + if (actions[i] == "editDispositionSchedule") + { + model.allowEditDispositionSchedule = true; + } + } + } + + var nodeRef = model.nodeRef.replace(":/", ""), + scriptRemoteConnector = remote.connect("alfresco"), + repoResponse = scriptRemoteConnector.get("/api/node/" + nodeRef + "/dispositionschedule?inherited=false"); + + if (repoResponse.status == 401) + { + status.setCode(repoResponse.status, "error.loggedOut"); + return; + } + else if (repoResponse.status == 404) + { + model.hasDispositionSchedule = false; + } + else + { + var repoJSON = eval('(' + repoResponse + ')'); + + // Check if we got a positive result + if (repoJSON.data) + { + model.hasDispositionSchedule = true; + + repoResponse = scriptRemoteConnector.get("/api/rma/admin/listofvalues"); + var listOfValuesResult = eval('(' + repoResponse + ')'), + periodTypesArray = listOfValuesResult.data.periodTypes.items, + periodTypeLabels = {}, + periodType; + + for (var pti = 0; pti < periodTypesArray.length; pti++) + { + periodType = periodTypesArray[pti]; + periodTypeLabels[periodType.value] = periodType.label; + } + + var schedule = repoJSON.data; + if (schedule.instructions) + { + model.instructions = schedule.instructions; + } + if (schedule.authority) + { + model.authority = schedule.authority; + } + if (schedule.nodeRef) + { + model.dipositionScheduleNodeRef = schedule.nodeRef; + } + + model.publishInProgress = schedule.publishInProgress; + model.unpublishedUpdates = schedule.unpublishedUpdates; + + model.recordLevelDisposition = schedule.recordLevelDisposition; + + var actions = schedule.actions, + periodTypeLabel; + + for (var i = 0; i < actions.length; i++) + { + var action = actions[i], + p = action.period ? action.period.split("|") : [], + periodType = p.length > 0 ? p[0] : null, + periodAmount = p.length > 1 ? p[1] : null; + + if (periodType && periodType != "none") + { + periodTypeLabel = periodTypeLabels[periodType]; + periodTypeLabel = periodTypeLabel ? periodTypeLabel.toLowerCase() : ""; + if (!periodAmount || periodAmount == "" || periodAmount == "0") + { + action.title = msg.get("label.title.noTime", [action.label, periodTypeLabel]); + } + else + { + action.title = msg.get("label.title.complex", [action.label, periodAmount, periodTypeLabel]); + } + } + else + { + action.title = msg.get("label.title.simple", [action.label]); + } + } + model.actions = actions; + } + else if (repoJSON.status.code) + { + status.setCode(repoJSON.status.code, repoJSON.message); + return; + } + } + +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.properties new file mode 100644 index 0000000000..c5284855d2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Retention Schedule + +title.properties=General +title.actions=Retention Steps + +label.dispositionAuthority=Retention Authority +label.dispositionInstructions=Retention Instructions +label.appliedTo=Applied to +label.appliedTo.record=Record +label.appliedTo.folder=Folder +label.noactions=You haven't added any actions to the Retention Schedule yet. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} after {1} {2}(s) +label.nodescription=<none> + +link.description=View Description + +button.addevent=Add Event + +title.noDispositionSchedule=You haven't set up a retention schedule yet. +button.createDispositionSchedule=Create Retention Schedule diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_de.properties new file mode 100644 index 0000000000..7163cc8c32 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_de.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Aufbewahrungsplan + +title.properties=Allgemein +title.actions=Aufbewahrungsschritte + +label.dispositionAuthority=Aufbewahrungs-Authority +label.dispositionInstructions=Aufbewahrungsanweisungen +label.appliedTo=Angewendet auf +label.appliedTo.record=Record +label.appliedTo.folder=Ordner +label.noactions=Bisher wurden noch keine Aktionen zum Aufbewahrungsplan hinzugef\u00fcgt. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} nach {1} {2}(s) +label.nodescription= + +link.description=Beschreibung anzeigen + +button.addevent=Ereignis hinzuf\u00fcgen + +title.noDispositionSchedule=Bisher wurde noch kein Aufbewahrungsplan eingerichtet. +button.createDispositionSchedule=Aufbewahrungsplan erstellen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_es.properties new file mode 100755 index 0000000000..ac1c0923c0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_es.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Calendario de retenci\u00f3n + +title.properties=General +title.actions=Pasos de retenci\u00f3n + +label.dispositionAuthority=Autoridad de retenci\u00f3n +label.dispositionInstructions=Instrucciones de retenci\u00f3n +label.appliedTo=Aplicado a +label.appliedTo.record=Documento de archivo +label.appliedTo.folder=Carpeta +label.noactions=No ha a\u00f1adido ninguna acci\u00f3n al calendario de retenci\u00f3n todav\u00eda. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} despu\u00e9s de {1} {2}(s) +label.nodescription=<Ninguno> + +link.description=Ver descripci\u00f3n + +button.addevent=A\u00f1adir evento + +title.noDispositionSchedule=No ha definido un calendario de retenci\u00f3n todav\u00eda. +button.createDispositionSchedule=Crear calendario de retenci\u00f3n diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_fr.properties new file mode 100644 index 0000000000..ae2215356d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_fr.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=R\u00e8gle de conservation + +title.properties=G\u00e9n\u00e9ral +title.actions=Proc\u00e9dure de conservation + +label.dispositionAuthority=D\u00e9tenteur principal +label.dispositionInstructions=Instructions de conservation +label.appliedTo=Appliqu\u00e9 \u00e0 +label.appliedTo.record=Document d'archives +label.appliedTo.folder=Dossier +label.noactions=Vous n'avez pas encore ajout\u00e9 d'actions \u00e0 la r\u00e8gle de conservation. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} apr\u00e8s {1} {2}(s) +label.nodescription= + +link.description=Voir la description + +button.addevent=Ajouter un \u00e9v\u00e9nement + +title.noDispositionSchedule=Vous n'avez pas encore configur\u00e9 de r\u00e8gle de conservation. +button.createDispositionSchedule=Cr\u00e9er une r\u00e8gle de conservation diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_it.properties new file mode 100644 index 0000000000..ba527fcb4d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_it.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Programma di conservazione + +title.properties=Generale +title.actions=Passaggi della conservazione + +label.dispositionAuthority=Autorit\u00e0 di conservazione +label.dispositionInstructions=Istruzioni per la conservazione +label.appliedTo=Applicato a +label.appliedTo.record=Record +label.appliedTo.folder=Cartella +label.noactions=Non \u00e8 stata ancora aggiunta alcuna azione al Programma di conservazione. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} dopo {1} {2} +label.nodescription=<nessuno> + +link.description=Visualizza descrizione + +button.addevent=Aggiungi evento + +title.noDispositionSchedule=Non \u00e8 stato ancora impostato alcun programma di conservazione. +button.createDispositionSchedule=Crea Programma di conservazione diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_ja.properties new file mode 100644 index 0000000000..1d4903fabd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_ja.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb + +title.properties=\u4e00\u822c +title.actions=\u4fdd\u7ba1\u30b9\u30c6\u30c3\u30d7 + +label.dispositionAuthority=\u4fdd\u7ba1\u6a29\u9650 +label.dispositionInstructions=\u4fdd\u7ba1\u6307\u793a +label.appliedTo=\u9069\u7528\u5148 +label.appliedTo.record=\u30ec\u30b3\u30fc\u30c9 +label.appliedTo.folder=\u30d5\u30a9\u30eb\u30c0 +label.noactions=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306b\u51e6\u7406\u304c\u307e\u3060\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={1} {2} \u306e\u5f8c\u306e {0} +label.nodescription=<\u306a\u3057> + +link.description=\u8aac\u660e\u306e\u8868\u793a + +button.addevent=\u30a4\u30d9\u30f3\u30c8\u306e\u8ffd\u52a0 + +title.noDispositionSchedule=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u304c\u307e\u3060\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +button.createDispositionSchedule=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306e\u4f5c\u6210 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_nb.properties new file mode 100644 index 0000000000..baaf373457 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_nb.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Retensjonsplan + +title.properties=Generelt +title.actions=Retensjonstrinn + +label.dispositionAuthority=Retensjonsrett +label.dispositionInstructions=Retensjonsinstruksjoner +label.appliedTo=Gjelder +label.appliedTo.record=Oppf\u00f8ring +label.appliedTo.folder=Mappe +label.noactions=Du har enn\u00e5 ikke lagt til noen handlinger i retensjonsplanen. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} etter {1} {2}(-er) +label.nodescription=<none> + +link.description=Vis beskrivelse + +button.addevent=Legg til hendelse + +title.noDispositionSchedule=Det er ikke satt opp noen retensjonsplan. +button.createDispositionSchedule=Opprett retensjonsplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_nl.properties new file mode 100755 index 0000000000..153a474da3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_nl.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Retentieschema + +title.properties=Algemeen +title.actions=Retentiestappen + +label.dispositionAuthority=Retentieautoriteit +label.dispositionInstructions=Retentie-instructies +label.appliedTo=Toegepast op +label.appliedTo.record=Archiefstuk +label.appliedTo.folder=Map +label.noactions=U hebt nog geen acties toegevoegd aan het retentieschema. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} na {1} {2}(s) +label.nodescription=<geen> + +link.description=Beschrijving bekijken + +button.addevent=Gebeurtenis toevoegen + +title.noDispositionSchedule=U hebt nog geen retentieschema ingesteld. +button.createDispositionSchedule=Retentieschema maken diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_pt_BR.properties new file mode 100644 index 0000000000..5846b097c8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_pt_BR.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=Programa\u00e7\u00e3o de reten\u00e7\u00e3o + +title.properties=Geral +title.actions=Etapas de reten\u00e7\u00e3o + +label.dispositionAuthority=Autoridade de reten\u00e7\u00e3o +label.dispositionInstructions=Instru\u00e7\u00f5es de reten\u00e7\u00e3o +label.appliedTo=Aplicado a +label.appliedTo.record=Documento arquiv\u00edstico +label.appliedTo.folder=Pasta +label.noactions=Voc\u00ea ainda n\u00e3o adicionou a\u00e7\u00f5es \u00e0 Programa\u00e7\u00e3o de reten\u00e7\u00e3o. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} ap\u00f3s {1} {2}(s) +label.nodescription=<nenhum> + +link.description=Visualizar descri\u00e7\u00e3o + +button.addevent=Adicionar evento + +title.noDispositionSchedule=Voc\u00ea ainda n\u00e3o configurou uma programa\u00e7\u00e3o de reten\u00e7\u00e3o. +button.createDispositionSchedule=Criar programa\u00e7\u00e3o de reten\u00e7\u00e3o diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_ru.properties new file mode 100644 index 0000000000..f32958a207 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_ru.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=\u0413\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f + +title.properties=\u041e\u0431\u0449\u0435\u0435 +title.actions=\u0428\u0430\u0433\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f + +label.dispositionAuthority=\u041f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 +label.dispositionInstructions=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e +label.appliedTo=\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a +label.appliedTo.record=\u0417\u0430\u043f\u0438\u0441\u044c +label.appliedTo.folder=\u041f\u0430\u043f\u043a\u0430 +label.noactions=\u0412\u044b \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={0} \u043f\u043e\u0441\u043b\u0435 {1} {2} +label.nodescription=<\u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e> + +link.description=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f + +button.addevent=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 + +title.noDispositionSchedule=\u0412\u044b \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. +button.createDispositionSchedule=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_zh_CN.properties new file mode 100644 index 0000000000..87f27efe5b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/disposition.get_zh_CN.properties @@ -0,0 +1,22 @@ +disposition-schedule.heading=\u4fdd\u7559\u8ba1\u5212 + +title.properties=\u5e38\u89c4 +title.actions=\u4fdd\u7559\u6b65\u9aa4 + +label.dispositionAuthority=\u4fdd\u7559\u6388\u6743 +label.dispositionInstructions=\u4fdd\u7559\u8bf4\u660e +label.appliedTo=\u9002\u7528\u4e8e +label.appliedTo.record=\u8bb0\u5f55 +label.appliedTo.folder=\u6587\u4ef6\u5939 +label.noactions=\u60a8\u5c1a\u672a\u5411\u4fdd\u7559\u8ba1\u5212\u6dfb\u52a0\u4efb\u4f55\u64cd\u4f5c\u3002 +label.title.simple={0} +label.title.noTime={0} {1} +label.title.complex={1} {2} \u540e {0} +label.nodescription=<\u65e0> + +link.description=\u67e5\u770b\u8bf4\u660e + +button.addevent=\u6dfb\u52a0\u4e8b\u4ef6 + +title.noDispositionSchedule=\u60a8\u5c1a\u672a\u8bbe\u7f6e\u4fdd\u7559\u8ba1\u5212\u3002 +button.createDispositionSchedule=\u521b\u5efa\u4fdd\u7559\u8ba1\u5212 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.desc.xml new file mode 100644 index 0000000000..b0c3a1350d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.desc.xml @@ -0,0 +1,5 @@ + + DocLib File Plan Report + Document Library: File Plan Report Component + /rm/components/fileplan/report + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.head.ftl new file mode 100644 index 0000000000..82af2bc631 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.head.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/fileplan/report.css" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.html.ftl new file mode 100644 index 0000000000..14fb27a373 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.html.ftl @@ -0,0 +1,148 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#macro recordSeriesHTML recordSeries> + <#list recordSeries as recordSerie> +
+
+
${recordSerie.name?html}
+
+
+
+ ${msg("label.parentPath")}: + ${recordSerie.parentPath?html} +
+
+ ${msg("label.recordSeriesIdentifier")}: + ${recordSerie.identifier?html} +
+
+ ${msg("label.description")}: + <#if (recordSerie.description??)>${recordSerie.description?html}<#else>${msg("label.none")}} +
+
+ <@recordCategoriesHTML recordCategories=recordSerie.recordCategories/> + + + +<#macro recordCategoriesHTML recordCategories> + <#list recordCategories as recordCategory> +
+
+
${recordCategory.name?html}
+
+
+
+ ${msg("label.parentPath")}: + ${recordCategory.parentPath?html} +
+
+ ${msg("label.recordCategoryIdentifier")}: + ${recordCategory.identifier?html} +
+
+ ${msg("label.dispositionAuthority")}: + <#if (recordCategory.dispositionAuthority??)> + ${recordCategory.dispositionAuthority?html} + <#else> + ${msg("label.noDispositionAuthority")} + +
+ <#if (recordCategory.vitalRecordIndicator??)> +
+ ${msg("label.vitalRecordIndicator")}: + ${recordCategory.vitalRecordIndicator?html} +
+ +
+
+ ${msg("label.dispositionSchedule")}: +
+ <#if (recordCategory.dispositionActions?size == 0)> +
+ ${msg("label.noActions")} +
+ <#else> + <#list recordCategory.dispositionActions as dispositionAction> +
+ + ${dispositionAction_index + 1}. + <#if (dispositionAction.dispositionDescription?? && dispositionAction.dispositionDescription != "")> + ${dispositionAction.dispositionDescription?html} + <#else> + ${msg("label.noActionDescription")} + + +
+ + +
+ <@recordFoldersHTML recordFolders=recordCategory.recordFolders/> + + + +<#macro recordFoldersHTML recordFolders> + <#list recordFolders as recordFolder> +
+
+
${recordFolder.name?html}
+
+
+
+ ${msg("label.parentPath")}: + ${recordFolder.parentPath?html} +
+
${msg("label.recordFolderIdentifier")}: + ${recordFolder.identifier?html} +
+ <#if (recordFolder.vitalRecordIndicator??)> +
${msg("label.vitalRecordIndicator")}: + ${recordFolder.vitalRecordIndicator?html} +
+ +
+ + + +
+
+
+ ${msg("label.user")}: + ${firstName?html} ${lastName?html} +
+
+ ${msg("label.dateAndTime")}: + ${printDate} +
+
+ <#if (recordSeries??)> + <@recordSeriesHTML recordSeries=recordSeries/> + <#elseif (recordCategories??)> + <@recordCategoriesHTML recordCategories=recordCategories/> + <#elseif (recordFolders??)> + <@recordFoldersHTML recordFolders=recordFolders/> + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.js new file mode 100644 index 0000000000..48c9f76639 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.js @@ -0,0 +1,78 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Main entrypoint for component webscript logic + * + * @method main + */ +function main() +{ + // Request the disposition actions + var nodeRef = page.url.args.nodeRef.replace(":/", ""); + + // Call the repo to get the fileplan report + var scriptRemoteConnector = remote.connect("alfresco"); + var repoResponse = scriptRemoteConnector.get("/api/node/" + nodeRef + "/fileplanreport"); + if (repoResponse.status == 401) + { + status.setCode(repoResponse.status, "error.loggedOut"); + return; + } + else + { + var repoJSON = eval('(' + repoResponse + ')'); + + // Check if we got a positive result + if (repoJSON.data) + { + var report = repoJSON.data; + model.firstName = report.firstName; + model.lastName = report.lastName; + model.printDate = report.printDate; + if (report.recordSeries) + { + model.recordSeries = report.recordSeries; + } + else if (report.recordCategories) + { + model.recordCategories = report.recordCategories; + } + else if (report.recordFolders) + { + model.recordFolders = report.recordFolders; + } + } + else if (repoJSON.status.code) + { + status.setCode(repoJSON.status.code, repoJSON.message); + return; + } + } + +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.properties new file mode 100644 index 0000000000..c16910e510 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get.properties @@ -0,0 +1,12 @@ +label.user=User +label.dateAndTime=Date and Time +label.parentPath=Path +label.recordSeriesIdentifier=Record Series ID +label.recordCategoryIdentifier=Record Category ID +label.recordFolderIdentifier=Record Folder ID +label.vitalRecordIndicator=Vital Record ID +label.dispositionAuthority=Retention Authority +label.noDispositionAuthority=None +label.dispositionSchedule=Retention Schedule +label.noActions=No steps +label.noActionDescription=(no instruction) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_de.properties new file mode 100644 index 0000000000..225f83f6f3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_de.properties @@ -0,0 +1,12 @@ +label.user=Benutzer +label.dateAndTime=Datum und Uhrzeit +label.parentPath=Pfad +label.recordSeriesIdentifier=ID der Record-Serie +label.recordCategoryIdentifier=ID der Record-Kategorie +label.recordFolderIdentifier=ID des Record-Ordners +label.vitalRecordIndicator=ID des besonders relevanten Record +label.dispositionAuthority=Aufbewahrungs-Authority +label.noDispositionAuthority=Keine +label.dispositionSchedule=Aufbewahrungsplan +label.noActions=Keine Schritte +label.noActionDescription=(keine Anweisung) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_es.properties new file mode 100755 index 0000000000..69d6a0c755 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_es.properties @@ -0,0 +1,12 @@ +label.user=Usuario +label.dateAndTime=Fecha y hora +label.parentPath=Ruta +label.recordSeriesIdentifier=ID de serie de documento de archivo +label.recordCategoryIdentifier=ID de categor\u00eda de documento de archivo +label.recordFolderIdentifier=ID de carpeta de documento de archivo +label.vitalRecordIndicator=ID de documento de archivo vital +label.dispositionAuthority=Autoridad de retenci\u00f3n +label.noDispositionAuthority=Ninguna +label.dispositionSchedule=Calendario de retenci\u00f3n +label.noActions=No hay pasos +label.noActionDescription=(no hay instrucci\u00f3n) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_fr.properties new file mode 100644 index 0000000000..6094f33f7e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_fr.properties @@ -0,0 +1,12 @@ +label.user=Utilisateur +label.dateAndTime=Date et heure +label.parentPath=Chemin +label.recordSeriesIdentifier=ID de la s\u00e9rie de documents d'archives +label.recordCategoryIdentifier=ID de la cat\u00e9gorie de document d'archives +label.recordFolderIdentifier=ID du dossier d'archives +label.vitalRecordIndicator=ID du document d'archives essentiel +label.dispositionAuthority=D\u00e9tenteur principal +label.noDispositionAuthority=Aucun +label.dispositionSchedule=R\u00e8gle de conservation +label.noActions=Pas d'\u00e9tapes +label.noActionDescription=(aucune instruction) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_it.properties new file mode 100644 index 0000000000..3d04491871 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_it.properties @@ -0,0 +1,12 @@ +label.user=Utente +label.dateAndTime=Data e ora +label.parentPath=Percorso +label.recordSeriesIdentifier=ID Serie record +label.recordCategoryIdentifier=ID Categoria record +label.recordFolderIdentifier=ID Cartella di record +label.vitalRecordIndicator=ID Record fondamentale +label.dispositionAuthority=Autorit\u00e0 di conservazione +label.noDispositionAuthority=Nessuna +label.dispositionSchedule=Programma di conservazione +label.noActions=Nessun passaggio +label.noActionDescription=(nessuna istruzione) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_ja.properties new file mode 100644 index 0000000000..8256215192 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_ja.properties @@ -0,0 +1,12 @@ +label.user=\u30e6\u30fc\u30b6\u30fc +label.dateAndTime=\u65e5\u6642 +label.parentPath=\u30d1\u30b9 +label.recordSeriesIdentifier=\u30ec\u30b3\u30fc\u30c9\u30b7\u30ea\u30fc\u30ba ID +label.recordCategoryIdentifier=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea ID +label.recordFolderIdentifier=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 ID +label.vitalRecordIndicator=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9 ID +label.dispositionAuthority=\u4fdd\u7ba1\u6a29\u9650 +label.noDispositionAuthority=\u306a\u3057 +label.dispositionSchedule=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb +label.noActions=\u30b9\u30c6\u30c3\u30d7\u306a\u3057 +label.noActionDescription=(\u6307\u793a\u306a\u3057) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_nb.properties new file mode 100644 index 0000000000..4fbc51599e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_nb.properties @@ -0,0 +1,12 @@ +label.user=Bruker +label.dateAndTime=Dato og klokkeslett +label.parentPath=Bane +label.recordSeriesIdentifier=Oppf\u00f8ringsserie-ID +label.recordCategoryIdentifier=Oppf\u00f8ringskategori-ID +label.recordFolderIdentifier=Oppf\u00f8ringsmappe-ID +label.vitalRecordIndicator=Sv\u00e6rt viktig oppf\u00f8ring-ID +label.dispositionAuthority=Retensjonsrett +label.noDispositionAuthority=Ingen +label.dispositionSchedule=Retensjonsplan +label.noActions=Ingen trinn +label.noActionDescription=(ingen instruksjon) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_nl.properties new file mode 100755 index 0000000000..21e9c62366 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_nl.properties @@ -0,0 +1,12 @@ +label.user=Gebruiker +label.dateAndTime=Datum en tijd +label.parentPath=Pad +label.recordSeriesIdentifier=Id archiefstukreeks +label.recordCategoryIdentifier=Id archiefstukcategorie +label.recordFolderIdentifier=Id archiefmap +label.vitalRecordIndicator=Id vitaal archiefstuk +label.dispositionAuthority=Retentieautoriteit +label.noDispositionAuthority=Geen +label.dispositionSchedule=Retentieschema +label.noActions=Geen stappen +label.noActionDescription=(geen instructies) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_pt_BR.properties new file mode 100644 index 0000000000..4b00253fff --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_pt_BR.properties @@ -0,0 +1,12 @@ +label.user=Usu\u00e1rio +label.dateAndTime=Data e hora +label.parentPath=Caminho +label.recordSeriesIdentifier=ID da s\u00e9rie de documentos arquiv\u00edsticos +label.recordCategoryIdentifier=ID da categoria de documento arquiv\u00edstico +label.recordFolderIdentifier=ID da pasta de documento arquiv\u00edstico +label.vitalRecordIndicator=ID do documento arquiv\u00edstico vital +label.dispositionAuthority=Autoridade de reten\u00e7\u00e3o +label.noDispositionAuthority=Nenhum +label.dispositionSchedule=Programa\u00e7\u00e3o de reten\u00e7\u00e3o +label.noActions=Sem etapas +label.noActionDescription=(sem instru\u00e7\u00e3o) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_ru.properties new file mode 100644 index 0000000000..7073b93a0b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_ru.properties @@ -0,0 +1,12 @@ +label.user=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +label.dateAndTime=\u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f +label.parentPath=\u041f\u0443\u0442\u044c +label.recordSeriesIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.recordCategoryIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.recordFolderIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.vitalRecordIndicator=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.dispositionAuthority=\u041f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 +label.noDispositionAuthority=\u041d\u0435\u0442 +label.dispositionSchedule=\u0413\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.noActions=\u041d\u0435\u0442 \u0448\u0430\u0433\u043e\u0432 +label.noActionDescription=(\u043d\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439) diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_zh_CN.properties new file mode 100644 index 0000000000..be4093324c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/fileplan/report.get_zh_CN.properties @@ -0,0 +1,12 @@ +label.user=\u7528\u6237 +label.dateAndTime=\u65e5\u671f\u548c\u65f6\u95f4 +label.parentPath=\u8def\u5f84 +label.recordSeriesIdentifier=\u8bb0\u5f55\u7cfb\u5217 ID +label.recordCategoryIdentifier=\u8bb0\u5f55\u7c7b\u522b ID +label.recordFolderIdentifier=\u8bb0\u5f55\u6587\u4ef6\u5939 ID +label.vitalRecordIndicator=\u6838\u5fc3\u8bb0\u5f55 ID +label.dispositionAuthority=\u4fdd\u7559\u6388\u6743 +label.noDispositionAuthority=\u65e0 +label.dispositionSchedule=\u4fdd\u7559\u8ba1\u5212 +label.noActions=\u65e0\u6b65\u9aa4 +label.noActionDescription=\uff08\u65e0\u8bf4\u660e\uff09 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.desc.xml new file mode 100644 index 0000000000..2693e19d2b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.desc.xml @@ -0,0 +1,5 @@ + + RM Folder Details Actions + Folder Details Actions Component + /rm/components/folder-details/folder-actions + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.head.ftl new file mode 100644 index 0000000000..9d44c0abe1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.head.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.html.ftl new file mode 100644 index 0000000000..102c78b453 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.html.ftl @@ -0,0 +1,66 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +<#include "/org/alfresco/components/component.head.inc"> + +<@standalone> + <@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/folder-details/folder-actions.css" group="folder-details"/> + + + <@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/folder-details/folder-actions.js" group="folder-details"/> + <@script src="${url.context}/res/rm/components/folder-details/folder-actions.js" group="folder-details"/> + + + <@markup id="widgets"> + <@createWidgets group="folder-details"/> + <@inlineScript group="folder-details"> + YAHOO.util.Event.onContentReady("${args.htmlid?js_string}-heading", function() { + Alfresco.util.createTwister("${args.htmlid?js_string}-heading", "FolderActions"); + }); + + + + <@markup id="html"> + <@uniqueIdDiv> + <#if folderDetailsJSON??> + <#assign el=args.htmlid?html> +
+

+ ${msg("heading")} +

+
+
+
+
+ + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.js new file mode 100644 index 0000000000..a78d5ea076 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.js @@ -0,0 +1,69 @@ + + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +function main() +{ + AlfrescoUtil.param('nodeRef'); + AlfrescoUtil.param('site', null); + AlfrescoUtil.param('container', 'documentLibrary'); + + var folderDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site, + { + actions: true + }); + if (folderDetails) + { + model.folderDetailsJSON = jsonUtils.toJSONString(folderDetails); + doclibCommon(); + } + + // Widget instantiation metadata... + var folderActions = { + id : "rmFolderActions", + name : "Alfresco.rm.doclib.FolderActions", + options : { + nodeRef : model.nodeRef, + siteId : (model.site != null) ? model.site : null, + containerId : model.container, + rootNode : model.rootNode, + repositoryRoot : AlfrescoUtil.getRootNode(), + replicationUrlMapping : (model.replicationUrlMapping != null) ? model.replicationUrlMapping : "{}", + repositoryBrowsing : (model.rootNode != null), + folderDetails : folderDetails + } + }; + if (model.repositoryUrl != null) + { + folderActions.options.repositoryUrl = model.repositoryUrl; + } + + model.widgets = [folderActions]; +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.properties new file mode 100644 index 0000000000..f6431ae746 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get.properties @@ -0,0 +1,4 @@ +heading=Actions + +## Pop-up Messages +message.error=Couldn't access the File Plan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_de.properties new file mode 100644 index 0000000000..af2831d41c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_de.properties @@ -0,0 +1,4 @@ +heading=Aktionen + +## Pop-up Messages +message.error=Auf Ablageplan konnte nicht zugegriffen werden. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_es.properties new file mode 100755 index 0000000000..30f69795b9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_es.properties @@ -0,0 +1,4 @@ +heading=Acciones + +## Pop-up Messages +message.error=No se pudo acceder al cuadro de clasificaci\u00f3n diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_fr.properties new file mode 100644 index 0000000000..16ff2620cf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_fr.properties @@ -0,0 +1,4 @@ +heading=Actions + +## Pop-up Messages +message.error=Impossible d'acc\u00e9der au plan de classement diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_it.properties new file mode 100644 index 0000000000..890b85df91 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_it.properties @@ -0,0 +1,4 @@ +heading=Azioni + +## Pop-up Messages +message.error=Impossibile accedere a Piano di fascicolazione diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_ja.properties new file mode 100644 index 0000000000..7bad09026d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_ja.properties @@ -0,0 +1,4 @@ +heading=\u51e6\u7406 + +## Pop-up Messages +message.error=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_nb.properties new file mode 100644 index 0000000000..323ebf042b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_nb.properties @@ -0,0 +1,4 @@ +heading=Handlinger + +## Pop-up Messages +message.error=Fikk ikke tilgang til filplanen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_nl.properties new file mode 100755 index 0000000000..d1b3f7c9e6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_nl.properties @@ -0,0 +1,4 @@ +heading=Acties + +## Pop-up Messages +message.error=Kan het ordeningsplan niet openen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_pt_BR.properties new file mode 100644 index 0000000000..2004861307 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_pt_BR.properties @@ -0,0 +1,4 @@ +heading=A\u00e7\u00f5es + +## Pop-up Messages +message.error=N\u00e3o foi poss\u00edvel acessar o Plano de arquivamento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_ru.properties new file mode 100644 index 0000000000..c3b93a3380 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_ru.properties @@ -0,0 +1,4 @@ +heading=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f + +## Pop-up Messages +message.error=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_zh_CN.properties new file mode 100644 index 0000000000..d590f736c6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/folder-details/folder-actions.get_zh_CN.properties @@ -0,0 +1,4 @@ +heading=\u64cd\u4f5c + +## Pop-up Messages +message.error=\u65e0\u6cd5\u8bbf\u95ee\u5f52\u7c7b\u65b9\u6848 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/controls/vital-record-indicator.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/controls/vital-record-indicator.ftl new file mode 100644 index 0000000000..73b00be877 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/controls/vital-record-indicator.ftl @@ -0,0 +1,44 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign isTrue=false> +<#if field.value?exists && field.value?is_boolean><#assign isTrue=field.value> + +
+ <#if form.mode == "view"> +
+ ${field.label?html}: + <#if isTrue>${msg("form.control.checkbox.yes")}<#else>${msg("form.control.checkbox.no")} +
+ <#else> + + title="${field.description}" + <#if isTrue> value="true" checked="checked" <#if field.disabled>disabled="true" + <#if field.control.params.styleClass?exists>class="${field.control.params.styleClass}" + onchange='javascript:YAHOO.util.Dom.get("${fieldHtmlId}").value=YAHOO.util.Dom.get("${fieldHtmlId}-entry").checked;YAHOO.Bubbling.fire("mandatoryControlValueUpdated", this);' /> + + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/create-container.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/create-container.ftl new file mode 100644 index 0000000000..efbb5d1e3e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/create-container.ftl @@ -0,0 +1,70 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if formUI == "true"> + <@formLib.renderFormsRuntime formId=formId /> + + +
+
${msg("title")}
+
+ +
+ +
+

${msg("header")}

+
+ + <#if form.showCaption?exists && form.showCaption> +
*${msg("form.required.fields")}
+ + +
+ + <#if form.destination??> + + + +
+ <#list form.structure as item> + <#if item.kind == "set"> + <@formLib.renderSet set=item /> + <#else> + <@formLib.renderField field=form.fields[item.id] /> + + +
+ +
+ +   +
+ +
+ +
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/record-metadata.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/record-metadata.ftl new file mode 100644 index 0000000000..46b6d90424 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/form/record-metadata.ftl @@ -0,0 +1,201 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#if formUI == "true"> + <@formLib.renderFormsRuntime formId=formId /> + + +
+ + <#if form.showCaption?exists && form.showCaption> +
*${msg("form.required.fields")}
+ + + <#if form.mode != "view"> +
+ + +
+
+
${msg("label.set.idStatus")}
+
+ <@formLib.renderField field=form.fields["prop_cm_name"] /> + <@formLib.renderField field=form.fields["prop_rma_identifier"] /> + <#if form.mode == "view"> + <@formLib.renderField field=form.fields["prop_rmCategoryIdentifier"] /> + + <@formLib.renderField field=form.fields["prop_cm_title"] /> + <@formLib.renderField field=form.fields["prop_cm_description"] /> + <#if form.fields["prop_cm_owner"]?? && form.mode == "view"> + <@formLib.renderField field=form.fields["prop_cm_owner"] /> + + <#if form.fields["prop_rmDeclared"]?? && form.mode == "view"> + <@formLib.renderField field=form.fields["prop_rmDeclared"] /> + + <#if form.fields["prop_rma_declaredAt"]?? && form.mode == "view"> + <@formLib.renderField field=form.fields["prop_rma_declaredAt"] /> + + <#if form.fields["prop_rma_declaredBy"]?? && form.mode == "view"> + <@formLib.renderField field=form.fields["prop_rma_declaredBy"] /> + + <#if form.fields["prop_cm_author"]??> + <@formLib.renderField field=form.fields["prop_cm_author"] /> + +
+
+ <#if form.fields["prop_mimetype"]?? || form.mode == "view"> +
+
${msg("label.set.general")}
+
+ <#if form.mode == "view"> + <@formLib.renderField field=form.fields["prop_cm_creator"] /> + <@formLib.renderField field=form.fields["prop_cm_created"] /> + <@formLib.renderField field=form.fields["prop_cm_modifier"] /> + <@formLib.renderField field=form.fields["prop_cm_modified"] /> + <#if form.fields["prop_size"]??> + <@formLib.renderField field=form.fields["prop_size"] /> + + + <#if form.fields["prop_mimetype"]??> + <@formLib.renderField field=form.fields["prop_mimetype"] /> + +
+
+ +
+
${msg("label.set.record")}
+
+ <@formLib.renderField field=form.fields["prop_rma_originator"] /> + <@formLib.renderField field=form.fields["prop_rma_originatingOrganization"] /> + <#if form.mode == "view"> + <@formLib.renderField field=form.fields["prop_rma_dateFiled"] /> + + <@formLib.renderField field=form.fields["prop_rma_publicationDate"] /> + <@formLib.renderField field=form.fields["prop_rma_location"] /> + <@formLib.renderField field=form.fields["prop_rma_mediaType"] /> + <@formLib.renderField field=form.fields["prop_rma_format"] /> + + <#if form.fields["prop_dod_scannedFormatVersion"]??> + <@formLib.renderField field=form.fields["prop_dod_scannedFormatVersion"] /> + <@formLib.renderField field=form.fields["prop_dod_resolutionX"] /> + <@formLib.renderField field=form.fields["prop_dod_resolutionY"] /> + <@formLib.renderField field=form.fields["prop_dod_scannedBitDepth"] /> + + + <#if form.fields["prop_dod_producingApplication"]??> + <@formLib.renderField field=form.fields["prop_dod_producingApplication"] /> + <@formLib.renderField field=form.fields["prop_dod_producingApplicationVersion"] /> + <@formLib.renderField field=form.fields["prop_dod_pdfVersion"] /> + <@formLib.renderField field=form.fields["prop_dod_creatingApplication"] /> + <@formLib.renderField field=form.fields["prop_dod_documentSecuritySettings"] /> + + + <#if form.fields["prop_dod_caption"]??> + <@formLib.renderField field=form.fields["prop_dod_caption"] /> + <@formLib.renderField field=form.fields["prop_dod_photographer"] /> + <@formLib.renderField field=form.fields["prop_dod_copyright"] /> + <@formLib.renderField field=form.fields["prop_dod_bitDepth"] /> + <@formLib.renderField field=form.fields["prop_dod_imageSizeX"] /> + <@formLib.renderField field=form.fields["prop_dod_imageSizeY"] /> + <@formLib.renderField field=form.fields["prop_dod_imageSource"] /> + <@formLib.renderField field=form.fields["prop_dod_compression"] /> + <@formLib.renderField field=form.fields["prop_dod_iccIcmProfile"] /> + <@formLib.renderField field=form.fields["prop_dod_exifInformation"] /> + + + <#if form.fields["prop_dod_webFileName"]??> + <@formLib.renderField field=form.fields["prop_dod_webFileName"] /> + <@formLib.renderField field=form.fields["prop_dod_webPlatform"] /> + <@formLib.renderField field=form.fields["prop_dod_webSiteName"] /> + <@formLib.renderField field=form.fields["prop_dod_webSiteURL"] /> + <@formLib.renderField field=form.fields["prop_dod_captureMethod"] /> + <@formLib.renderField field=form.fields["prop_dod_captureDate"] /> + <@formLib.renderField field=form.fields["prop_dod_contact"] /> + <@formLib.renderField field=form.fields["prop_dod_contentManagementSystem"] /> + +
+
+
+
${msg("label.set.correspondence")}
+
+ <@formLib.renderField field=form.fields["prop_rma_dateReceived"] /> + <@formLib.renderField field=form.fields["prop_rma_address"] /> + <@formLib.renderField field=form.fields["prop_rma_otherAddress"] /> +
+
+
+
${msg("label.set.security")}
+
+ <@formLib.renderField field=form.fields["prop_rmc_supplementalMarkingList"] /> +
+
+ <#if form.fields["prop_rma_vitalRecordIndicator"]?? || form.fields["prop_rma_reviewPeriod"]?? || + (form.fields["prop_rma_reviewAsOf"]?? && form.mode == "view")> +
+
${msg("label.set.vitalRecord")}
+
+ <#if form.fields["prop_rma_vitalRecordIndicator"]??> + <@formLib.renderField field=form.fields["prop_rma_vitalRecordIndicator"] /> + + <#if form.fields["prop_rma_reviewPeriod"]??> + <@formLib.renderField field=form.fields["prop_rma_reviewPeriod"] /> + + <#if form.fields["prop_rma_reviewAsOf"]?? && form.mode == "view"> + <@formLib.renderField field=form.fields["prop_rma_reviewAsOf"] /> + +
+
+ + + <#if form.mode == "view"> +
+
${msg("label.set.disposition")}
+
+ <@formLib.renderField field=form.fields["prop_rmDispositionInstructions"] /> + <#if form.fields["prop_rma_recordSearchDispositionActionAsOf"]??> + <@formLib.renderField field=form.fields["prop_rma_recordSearchDispositionActionAsOf"] /> + + <#if form.fields["prop_rma_cutOffDate"]??> + <@formLib.renderField field=form.fields["prop_rma_cutOffDate"] /> + +
+
+ + + <#list form.structure as item> + <#if item.kind == "set" && item.id == "rm-custom"> + <@formLib.renderSet set=item /> + <#break> + + +
+ + <#if form.mode != "view"> + <@formLib.renderFormButtons formId=formId /> +
+ + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.desc.xml new file mode 100644 index 0000000000..a58beb577d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.desc.xml @@ -0,0 +1,5 @@ + + Records Permissions + Records Permissions Component + /rm/components/permissions/permissions + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.head.ftl new file mode 100644 index 0000000000..7d3c5f8501 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.head.ftl @@ -0,0 +1,36 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/people-finder/authority-finder.css" /> +<@script type="text/javascript" src="${url.context}/res/components/people-finder/authority-finder.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/people-finder/authority-finder.js"> + +<@script type="text/javascript" src="${url.context}/res/modules/simple-dialog.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/permissions/permissions.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/permissions/permissions.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.html.ftl new file mode 100644 index 0000000000..458c0a6560 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.html.ftl @@ -0,0 +1,70 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + + +<#assign el=args.htmlid> +
+ +
+ +
+
+ + + +
+
+
${msg("label.title", '${page.url.args.itemName!""}')?html}
+ + +
+
+
+
${msg("label.actions")}
+
${msg("label.permissions")}
+
${msg("label.usersgroups")}
+
+
+
+
+ + +
+
+ + + +
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.properties new file mode 100644 index 0000000000..00acea8591 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=We couldn't get the permissions from the server. Try refreshing your browser. +message.selectauthority=Select a User or Group +message.authoritypickerfail=We couldn't load the Authority Finder. Try refreshing your browser. +message.finish-success=Successfully updated permissions. +message.finish-failure=We couldn't update permissions: {0}. Try refreshing your browser. + +label.title=Manage Permissions: {0} +label.inherit=Inherit Permissions +label.readonly=Read Only +label.readandfile=Read and File +label.inherited=inherited +label.local=local +label.permissions=Permissions +label.actions=Actions +label.usersgroups=Users and Groups + +button.addUserGroup=Add User or Group diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_de.properties new file mode 100644 index 0000000000..37f01a5cbf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_de.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=Berechtigungen vom Server konnten nicht ermittelt werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.selectauthority=Benutzer oder Gruppe ausw\u00e4hlen +message.authoritypickerfail=Authority-Finder konnte nicht geladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.finish-success=Berechtigungen erfolgreich aktualisiert. +message.finish-failure=Berechtigungen konnten nicht aktualisiert werden: {0}. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.title=Berechtigungen verwalten: {0} +label.inherit=Berechtigungen erben +label.readonly=Schreibgesch\u00fctzt +label.readandfile=Lesen und Ablegen +label.inherited=Vererbt +label.local=Lokal +label.permissions=Berechtigungen +label.actions=Aktionen +label.usersgroups=Benutzer und Gruppen + +button.addUserGroup=Benutzer oder Gruppe hinzuf\u00fcgen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_es.properties new file mode 100755 index 0000000000..4c79c15659 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_es.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=No se pudieron obtener los permisos del servidor. Trate de actualizar el navegador. +message.selectauthority=Seleccione un usuario o grupo +message.authoritypickerfail=No se pudo cargar el Buscador de autoridad. Trate de actualizar el navegador. +message.finish-success=Permisos actualizados correctamente. +message.finish-failure=No se pudieron actualizar los permisos: {0} Trate de actualizar el navegador. + +label.title=Gestionar permisos: {0} +label.inherit=Heredar permisos +label.readonly=Solo leer +label.readandfile=Leer y archivar +label.inherited=Heredado +label.local=Local +label.permissions=Permisos +label.actions=Acciones +label.usersgroups=Usuarios y grupos + +button.addUserGroup=A\u00f1adir usuario o grupo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_fr.properties new file mode 100644 index 0000000000..0a01f1f7f4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_fr.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=Impossible d'obtenir les autorisations depuis le serveur. Essayez d'actualiser votre navigateur. +message.selectauthority=S\u00e9lectionnez un utilisateur ou un groupe +message.authoritypickerfail=Impossible de charger l'outil de recherche des droits. Essayez d'actualiser votre navigateur. +message.finish-success=Les autorisations ont bien \u00e9t\u00e9 mises \u00e0 jour. +message.finish-failure=Impossible de mettre \u00e0 jour les autorisations\u00a0: {0}. Essayez d''actualiser votre navigateur. + +label.title=G\u00e9rer les autorisations : {0} +label.inherit=H\u00e9riter des autorisations +label.readonly=Lecture seule +label.readandfile=Lire et archiver +label.inherited=h\u00e9rit\u00e9 +label.local=local +label.permissions=Autorisations +label.actions=Actions +label.usersgroups=Utilisateurs et groupes + +button.addUserGroup=Ajouter un utilisateur ou un groupe diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_it.properties new file mode 100644 index 0000000000..17b5ce6ea1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_it.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=Impossibile ottenere le autorizzazioni dal server. Provare ad aggiornare il browser. +message.selectauthority=Seleziona utente o gruppo +message.authoritypickerfail=Impossibile caricare Ricerca autorit\u00e0. Provare ad aggiornare il browser. +message.finish-success=Aggiornamento autorizzazioni riuscito. +message.finish-failure=Impossibile aggiornare le autorizzazioni: {0} Provare ad aggiornare il browser. + +label.title=Gestisci autorizzazioni: {0} +label.inherit=Eredita autorizzazioni +label.readonly=Sola lettura +label.readandfile=Leggi e archivia +label.inherited=ereditata +label.local=locale +label.permissions=Autorizzazioni +label.actions=Azioni +label.usersgroups=Utenti e gruppi + +button.addUserGroup=Aggiungi utente o gruppo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_ja.properties new file mode 100644 index 0000000000..d86c3d1478 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_ja.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u6a29\u9650\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.selectauthority=\u30e6\u30fc\u30b6\u30fc\u307e\u305f\u306f\u30b0\u30eb\u30fc\u30d7\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +message.authoritypickerfail=[\u6a29\u9650\u306e\u691c\u7d22] \u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.finish-success=\u6a29\u9650\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002 +message.finish-failure=\u6a29\u9650 ''{0}'' \u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.title=\u6a29\u9650\u306e\u7ba1\u7406: {0} +label.inherit=\u6a29\u9650\u306e\u7d99\u627f +label.readonly=\u8aad\u307f\u53d6\u308a\u5c02\u7528 +label.readandfile=\u8aad\u307f\u53d6\u308a\u3068\u6574\u7406\u4fdd\u7ba1 +label.inherited=\u7d99\u627f\u3055\u308c\u305f\u6a29\u9650 +label.local=\u30ed\u30fc\u30ab\u30eb +label.permissions=\u6a29\u9650 +label.actions=\u51e6\u7406 +label.usersgroups=\u30e6\u30fc\u30b6\u30fc\u3068\u30b0\u30eb\u30fc\u30d7 + +button.addUserGroup=\u30e6\u30fc\u30b6\u30fc\u307e\u305f\u306f\u30b0\u30eb\u30fc\u30d7\u3092\u8ffd\u52a0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_nb.properties new file mode 100644 index 0000000000..4bb303d76d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_nb.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=Kunne ikke hente tillatelser fra serveren. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.selectauthority=Velg en bruker eller gruppe +message.authoritypickerfail=Kunne ikke \u00e5pne Rettss\u00f8ker. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.finish-success=Tillatelser er n\u00e5 oppdatert. +message.finish-failure=Kunne ikke oppdatere tillatelser: {0}. Pr\u00f8v \u00e5 oppdatere nettleseren. + +label.title=Administrer tillatelser: {0} +label.inherit=Arve tillatelser +label.readonly=Skrivebeskyttet +label.readandfile=Les og registrer +label.inherited=Arvet +label.local=Lokal +label.permissions=Tillatelser +label.actions=Handlinger +label.usersgroups=Brukere og grupper + +button.addUserGroup=Legg til bruker eller gruppe diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_nl.properties new file mode 100755 index 0000000000..12642f28ce --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_nl.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=Kan de rechten niet ophalen van de server. Vernieuw de browser. +message.selectauthority=Een gebruiker of een groep selecteren +message.authoritypickerfail=Kan Autoriteit zoeken niet laden. Vernieuw de browser. +message.finish-success=Rechten bijgewerkt. +message.finish-failure=Kan rechten niet bijwerken: {0} Vernieuw de browser. + +label.title=Rechten beheren: {0} +label.inherit=Rechten overnemen +label.readonly=Alleen-lezen +label.readandfile=Lezen en archiveren +label.inherited=overgenomen +label.local=lokaal +label.permissions=Rechten +label.actions=Acties +label.usersgroups=Gebruikers en groepen + +button.addUserGroup=Gebruiker of groep toevoegen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_pt_BR.properties new file mode 100644 index 0000000000..e52024ad59 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_pt_BR.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=N\u00e3o foi poss\u00edvel obter as permiss\u00f5es do servidor. Tente atualizar seu navegador. +message.selectauthority=Selecionar um usu\u00e1rio ou grupo +message.authoritypickerfail=N\u00e3o foi poss\u00edvel carregar o Localizador de autoridades. Tente atualizar seu navegador. +message.finish-success=Permiss\u00f5es atualizadas com sucesso. +message.finish-failure=N\u00e3o foi poss\u00edvel atualizar as permiss\u00f5es: {0} Tente atualizar seu navegador. + +label.title=Gerenciar permiss\u00f5es: {0} +label.inherit=Herdar permiss\u00f5es +label.readonly=Somente leitura +label.readandfile=Ler e arquivar +label.inherited=herdado +label.local=Local +label.permissions=Permiss\u00f5es +label.actions=A\u00e7\u00f5es +label.usersgroups=Usu\u00e1rios e grupos + +button.addUserGroup=Adicionar usu\u00e1rio ou grupo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_ru.properties new file mode 100644 index 0000000000..292b79003f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_ru.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.selectauthority=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 +message.authoritypickerfail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Authority Finder. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.finish-success=\u041f\u0440\u0430\u0432\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b. +message.finish-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430: {0}. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +label.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430: {0} +label.inherit=\u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0430 +label.readonly=\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435 +label.readandfile=\u0427\u0442\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b +label.inherited=\u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043e +label.local=\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e +label.permissions=\u041f\u0440\u0430\u0432\u0430 +label.actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f +label.usersgroups=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u0433\u0440\u0443\u043f\u043f\u044b + +button.addUserGroup=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_zh_CN.properties new file mode 100644 index 0000000000..36408d3c14 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/permissions/permissions.get_zh_CN.properties @@ -0,0 +1,17 @@ +message.getpermissionsfail=\u6211\u4eec\u65e0\u6cd5\u4ece\u670d\u52a1\u5668\u83b7\u53d6\u6743\u9650\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.selectauthority=\u9009\u62e9\u7528\u6237\u6216\u7ec4 +message.authoritypickerfail=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u6388\u6743\u67e5\u627e\u5668\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.finish-success=\u5df2\u6210\u529f\u66f4\u65b0\u6743\u9650\u3002 +message.finish-failure=\u6211\u4eec\u65e0\u6cd5\u66f4\u65b0\u6743\u9650\uff1a{0}\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +label.title=\u7ba1\u7406\u6743\u9650\uff1a{0} +label.inherit=\u7ee7\u627f\u6743\u9650 +label.readonly=\u53ea\u8bfb +label.readandfile=\u8bfb\u53d6\u548c\u7acb\u5377 +label.inherited=\u7ee7\u627f\u7684 +label.local=\u672c\u5730 +label.permissions=\u6743\u9650 +label.actions=\u64cd\u4f5c +label.usersgroups=\u7528\u6237\u548c\u7ec4 + +button.addUserGroup=\u6dfb\u52a0\u7528\u6237\u6216\u7ec4 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.desc.xml new file mode 100644 index 0000000000..5feb83ad03 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.desc.xml @@ -0,0 +1,5 @@ + + Records References + Records References Component + /rm/components/references/manage-references + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.head.ftl new file mode 100644 index 0000000000..16a16d8b7b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.head.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/references/manage-references.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/references/manage-references.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.html.ftl new file mode 100644 index 0000000000..84ad3de9bc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.html.ftl @@ -0,0 +1,64 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +
+

${msg("label.title",'${page.url.args.docName!""}')?html}

+ + +

${msg('label.references-to')}

+ <#-- 'from' is from this record to other records --> + <#if (references.from?size > 0)> +
    + <#list references.from as ref> +
  1. ${ref.label?html} ${ref.refDocName}
  2. + +
+ +

class="active"">${msg('label.no-references')}

+ +

${msg('label.references-from')}

+ <#-- 'to' is to this record from other records --> + <#if (references.to?size > 0)> +
    + <#list references.to as ref> +
  1. ${ref.label?html} ${ref.refDocName}
  2. + +
+ +

class="active"">${msg('label.no-references')}

+
+ +
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.js new file mode 100644 index 0000000000..3a06f435cd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.js @@ -0,0 +1,76 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +function getDocName(nodeRef) +{ + var result = remote.call("/api/metadata?shortQNames=true&nodeRef=" + nodeRef); + if (result.status == 200) + { + var data = eval('(' + result + ')'); + return data.properties["cm:name"]; + } + return nodeRef; +} + +/* + * Note, "From" is customreferences from this node and *not* from other documents to this node. + */ +function getDocReferences() +{ + var nodeRef = page.url.args.nodeRef.replace(":/", ""); + var result = remote.call("/api/node/" + nodeRef + "/customreferences"); + var processDocRefs = function(docrefs, useTargetRef) + { + for (var i = 0, len = docrefs.length; i < len; i++) + { + var ref = docrefs[i]; + ref.refDocName = (ref.referenceType == 'parentchild') ? getDocName(ref.childRef) : getDocName(useTargetRef ? ref.targetRef : ref.sourceRef); + if (ref.referenceType == 'parentchild') + { + ref.label = ref.target; + ref.targetRef = ref.childRef; + ref.sourceRef = ref.parentRef; + } + docrefs[i] = ref; + } + return docrefs; + }; + + if (result.status == 200) + { + var data = eval('(' + result + ')'); + var docrefs = + { + from: processDocRefs(data.data.customReferencesFrom, true), + to: processDocRefs(data.data.customReferencesTo, false) + }; + + return docrefs; + } + return []; +} + +model.references = getDocReferences(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.properties new file mode 100644 index 0000000000..921fba82ce --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get.properties @@ -0,0 +1,10 @@ +label.title=Manage References: {0} +label.edit=Edit +label.delete=Delete +label.done=Done +label.new-reference=New Reference +label.no-references=No references +message.delete.fail=We couldn't delete the reference. +message.delete.success=Reference deleted +label.references-from=References from other records +label.references-to=References to other records diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_de.properties new file mode 100644 index 0000000000..16072772bb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_de.properties @@ -0,0 +1,10 @@ +label.title=Referenzen verwalten: {0} +label.edit=Bearbeiten +label.delete=L\u00f6schen +label.done=Fertig +label.new-reference=Neue Referenz +label.no-references=Keine Referenzen +message.delete.fail=Referenz konnte nicht gel\u00f6scht werden. +message.delete.success=Referenz gel\u00f6scht +label.references-from=Referenzen von anderen Records +label.references-to=Referenzen zu anderen Records diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_es.properties new file mode 100755 index 0000000000..2ec14c34a8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_es.properties @@ -0,0 +1,10 @@ +label.title=Gestionar referencias: {0} +label.edit=Editar +label.delete=Eliminar +label.done=Hecho +label.new-reference=Nueva referencia +label.no-references=No hay referencias +message.delete.fail=No se pudo eliminar la referencia. +message.delete.success=Referencia eliminada +label.references-from=Referencias de otros documentos de archivo +label.references-to=Referencias para otros documentos de archivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_fr.properties new file mode 100644 index 0000000000..221446fdca --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_fr.properties @@ -0,0 +1,10 @@ +label.title=G\u00e9rer les droits r\u00e9f\u00e9rences\u00a0: {0} +label.edit=Modifier +label.delete=Supprimer +label.done=Termin\u00e9 +label.new-reference=Nouvelle r\u00e9f\u00e9rence +label.no-references=Pas de r\u00e9f\u00e9rence +message.delete.fail=Impossible de supprimer la r\u00e9f\u00e9rence +message.delete.success=R\u00e9f\u00e9rence supprim\u00e9e +label.references-from=R\u00e9f\u00e9rences depuis d'autres documents d'archives +label.references-to=R\u00e9f\u00e9rences vers d'autres documents d'archives diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_it.properties new file mode 100644 index 0000000000..cb3b253092 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_it.properties @@ -0,0 +1,10 @@ +label.title=Gestisci riferimenti: {0} +label.edit=Modifica +label.delete=Elimina +label.done=Completato +label.new-reference=Nuovo riferimento +label.no-references=Nessun riferimento +message.delete.fail=Impossibile eliminare il riferimento. +message.delete.success=Riferimento eliminato +label.references-from=Riferimenti da altri record +label.references-to=Riferimenti a altri record diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_ja.properties new file mode 100644 index 0000000000..7a40af2829 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_ja.properties @@ -0,0 +1,10 @@ +label.title=\u53c2\u7167 ''{0}'' \u306e\u7ba1\u7406 +label.edit=\u7de8\u96c6 +label.delete=\u524a\u9664 +label.done=\u5b8c\u4e86 +label.new-reference=\u65b0\u898f\u53c2\u7167 +label.no-references=\u53c2\u7167\u306a\u3057 +message.delete.fail=\u53c2\u7167\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.delete.success=\u524a\u9664\u6e08\u307f\u306e\u53c2\u7167 +label.references-from=\u4ed6\u306e\u30ec\u30b3\u30fc\u30c9\u304b\u3089\u306e\u53c2\u7167 +label.references-to=\u4ed6\u306e\u30ec\u30b3\u30fc\u30c9\u3078\u306e\u53c2\u7167 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_nb.properties new file mode 100644 index 0000000000..4a3ec73a0c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_nb.properties @@ -0,0 +1,10 @@ +label.title=Administrer referanser: {0} +label.edit=Rediger +label.delete=Slett +label.done=Ferdig +label.new-reference=Ny referanse +label.no-references=Ingen referanser +message.delete.fail=Mislyktes i \u00e5 slette referansen. +message.delete.success=Referanse slettet +label.references-from=Referanser fra andre oppf\u00f8ringer +label.references-to=Referanser til andre oppf\u00f8ringer diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_nl.properties new file mode 100755 index 0000000000..73e9da0617 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_nl.properties @@ -0,0 +1,10 @@ +label.title=Verwijzingen beheren: {0} +label.edit=Bewerken +label.delete=Verwijderen +label.done=Gereed +label.new-reference=Nieuwe verwijzing +label.no-references=Geen verwijzingen +message.delete.fail=Kan de verwijzing niet verwijderen. +message.delete.success=Verwijzing verwijderd +label.references-from=Verwijzingen van andere archiefstukken +label.references-to=Verwijzingen naar andere archiefstukken diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_pt_BR.properties new file mode 100644 index 0000000000..0c02a1b534 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_pt_BR.properties @@ -0,0 +1,10 @@ +label.title=Gerenciar refer\u00eancias: {0} +label.edit=Editar +label.delete=Excluir +label.done=Conclu\u00eddo +label.new-reference=Nova refer\u00eancia +label.no-references=Sem refer\u00eancias +message.delete.fail=N\u00e3o foi poss\u00edvel excluir a refer\u00eancia. +message.delete.success=Refer\u00eancia exclu\u00edda +label.references-from=Refer\u00eancias de outros documentos arquiv\u00edsticos +label.references-to=Refer\u00eancias a outros documentos arquiv\u00edsticos diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_ru.properties new file mode 100644 index 0000000000..85c74ddabe --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_ru.properties @@ -0,0 +1,10 @@ +label.title=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438: {0} +label.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +label.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +label.done=\u0413\u043e\u0442\u043e\u0432\u043e +label.new-reference=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 +label.no-references=\u041d\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a +message.delete.fail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443. +message.delete.success=\u0421\u0441\u044b\u043b\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +label.references-from=\u0421\u0441\u044b\u043b\u043a\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.references-to=\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_zh_CN.properties new file mode 100644 index 0000000000..13e202abf0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/manage-references.get_zh_CN.properties @@ -0,0 +1,10 @@ +label.title=\u7ba1\u7406\u53c2\u8003\uff1a{0} +label.edit=\u7f16\u8f91 +label.delete=\u5220\u9664 +label.done=\u5b8c\u6210 +label.new-reference=\u65b0\u53c2\u8003 +label.no-references=\u65e0\u53c2\u8003 +message.delete.fail=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u53c2\u8003\u3002 +message.delete.success=\u5df2\u5220\u9664\u53c2\u8003 +label.references-from=\u6765\u81ea\u5176\u4ed6\u8bb0\u5f55\u7684\u53c2\u8003 +label.references-to=\u5bf9\u5176\u4ed6\u8bb0\u5f55\u7684\u53c2\u8003 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.desc.xml new file mode 100644 index 0000000000..8de6a8e7a5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.desc.xml @@ -0,0 +1,5 @@ + + Records New Reference + Records New References Component + /rm/components/references/new-reference + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.head.ftl new file mode 100644 index 0000000000..1f3a93db34 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.head.ftl @@ -0,0 +1,35 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/form/form.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/references/new-reference.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/yui/datatable/assets/datatable.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/document-picker/document-picker.css" /> +<@script type="text/javascript" src="${url.context}/res/components/object-finder/object-finder.js"> +<@script type="text/javascript" src="${url.context}/res/modules/document-picker/document-picker.js"> +<@script type="text/javascript" src="${url.context}/res/rm/modules/document-picker/object-renderer.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/references/new-reference.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.html.ftl new file mode 100644 index 0000000000..005bd0a9ab --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.html.ftl @@ -0,0 +1,90 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign controlId = htmlid + "-cntrl"> +<#assign pickerId = controlId + "-picker"> + + +
+
+ ${msg("label.title-new-reference")} +
+
+ +
+
*${msg('label.required')}
+
+
+ + +
+ +
+ +

+ +
+ +
+ + +
+
+
+ + + + + + + + + + +
+ + +
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.js new file mode 100644 index 0000000000..1820f336e0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.js @@ -0,0 +1,38 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +function getReferenceDefinitions() +{ + var result = remote.call("/api/rma/admin/customreferencedefinitions"); + if (result.status == 200) + { + var data = eval('(' + result + ')'); + return data.data.customReferences; + } + else return []; +} + +model.reference_types = getReferenceDefinitions() diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.properties new file mode 100644 index 0000000000..0a570cbed2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get.properties @@ -0,0 +1,10 @@ +label.title-new-reference = New Reference +label.select = Select +label.record-link = Link to Record +label.record-rel = Relationship +label.name = Reference Name +label.required = Required Field +label.create=Create +label.cancel=Cancel +label.fileplan= File Plan +message.createfail=We couldn't create the new reference. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_de.properties new file mode 100644 index 0000000000..3a2516453d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_de.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Neue Referenz +label.select =Ausw\u00e4hlen +label.record-link =Link zu Record +label.record-rel =Beziehung +label.name =Referenzname +label.required =Pflichtfeld +label.create=Erstellen +label.cancel=Abbrechen +label.fileplan=Ablageplan +message.createfail=Neue Referenz konnte nicht erstellt werden. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_es.properties new file mode 100755 index 0000000000..37b3663649 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_es.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Nueva referencia +label.select =Seleccionar +label.record-link =Enlace a documento de archivo +label.record-rel =Relaci\u00f3n +label.name =Nombre de referencia +label.required =Campo requerido +label.create=Crear +label.cancel=Cancelar +label.fileplan=Cuadro de clasificaci\u00f3n +message.createfail=No se pudo crear la nueva referencia. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_fr.properties new file mode 100644 index 0000000000..b5f9c2ae8f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_fr.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Nouvelle r\u00e9f\u00e9rence +label.select =S\u00e9lectionner +label.record-link =Lier \u00e0 document d'archives +label.record-rel =Relation +label.name =Nom de la r\u00e9f\u00e9rence +label.required =Champ obligatoire +label.create=Cr\u00e9er +label.cancel=Annuler +label.fileplan=Plan de classement +message.createfail=Impossible de cr\u00e9er une nouvelle r\u00e9f\u00e9rence diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_it.properties new file mode 100644 index 0000000000..174598ef72 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_it.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Nuovo riferimento +label.select =Seleziona +label.record-link =Collega a record +label.record-rel =Relazione +label.name =Nome riferimento +label.required =Campo obbligatorio +label.create=Crea +label.cancel=Annulla +label.fileplan=Piano di fascicolazione +message.createfail=Impossibile creare il nuovo riferimento. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_ja.properties new file mode 100644 index 0000000000..e8d3d22006 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_ja.properties @@ -0,0 +1,10 @@ +label.title-new-reference =\u65b0\u898f\u53c2\u7167 +label.select =\u9078\u629e +label.record-link =\u30ec\u30b3\u30fc\u30c9\u3078\u306e\u30ea\u30f3\u30af +label.record-rel =\u95a2\u4fc2 +label.name =\u53c2\u7167\u540d +label.required =\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 +label.create=\u4f5c\u6210 +label.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +label.fileplan=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +message.createfail=\u65b0\u3057\u3044\u53c2\u7167\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_nb.properties new file mode 100644 index 0000000000..aee52ba7e0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_nb.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Ny referanse +label.select =Velg +label.record-link =Koble til oppf\u00f8ring +label.record-rel =Forhold +label.name =Referansenavn +label.required =P\u00e5krevd felt +label.create=Opprett +label.cancel=Avbryt +label.fileplan=Filplan +message.createfail=Kunne ikke opprette ny referanse. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_nl.properties new file mode 100755 index 0000000000..1169a5780b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_nl.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Nieuwe verwijzing +label.select =Selecteren +label.record-link =Koppelen naar archiefstuk +label.record-rel =Relatie +label.name =Naam verwijzing +label.required =Verplicht veld +label.create=Maken +label.cancel=Annuleren +label.fileplan=Ordeningsplan +message.createfail=Kan geen nieuwe verwijzing maken. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_pt_BR.properties new file mode 100644 index 0000000000..5640e0f9e4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_pt_BR.properties @@ -0,0 +1,10 @@ +label.title-new-reference =Nova refer\u00eancia +label.select =Selecionar +label.record-link =Vincular a documento arquiv\u00edstico +label.record-rel =Relacionamento +label.name =Nome da refer\u00eancia +label.required =Campo obrigat\u00f3rio +label.create=Criar +label.cancel=Cancelar +label.fileplan=Plano de arquivamento +message.createfail=N\u00e3o foi poss\u00edvel criar a nova refer\u00eancia. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_ru.properties new file mode 100644 index 0000000000..117b7f64f4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_ru.properties @@ -0,0 +1,10 @@ +label.title-new-reference =\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 +label.select =\u0412\u044b\u0431\u0440\u0430\u0442\u044c +label.record-link =\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c +label.record-rel =\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +label.name =\u0418\u043c\u044f \u0441\u0441\u044b\u043b\u043a\u0438 +label.required =\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 +label.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c +label.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +label.fileplan=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +message.createfail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443. diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_zh_CN.properties new file mode 100644 index 0000000000..8bc1992676 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/references/new-reference.get_zh_CN.properties @@ -0,0 +1,10 @@ +label.title-new-reference =\u65b0\u53c2\u8003 +label.select =\u9009\u62e9 +label.record-link =\u94fe\u63a5\u81f3\u8bb0\u5f55 +label.record-rel =\u5173\u7cfb +label.name =\u53c2\u8003\u540d\u79f0 +label.required =\u5fc5\u586b\u5b57\u6bb5 +label.create=\u521b\u5efa +label.cancel=\u53d6\u6d88 +label.fileplan=\u5f52\u7c7b\u65b9\u6848 +message.createfail=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u65b0\u53c2\u8003\u3002 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.config.xml new file mode 100644 index 0000000000..fe62709380 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.config.xml @@ -0,0 +1,60 @@ + + + Alfresco.RuleConfigActionCustom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select + FileTo + CopyTo + MoveTo + LinkTo + Reject + RequestInfo + Mail + SetPropertyValue + AddRecordTypes + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.desc.xml new file mode 100644 index 0000000000..31504800bb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.desc.xml @@ -0,0 +1,5 @@ + + RM Rule Config Action + Rule Config for RM Rules actions + /rm/components/rules/config/action + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.html.ftl new file mode 100644 index 0000000000..d6d3dbfcff --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.html.ftl @@ -0,0 +1,27 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/rules/config/rule-config-action.get.html.ftl" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.js new file mode 100644 index 0000000000..cae3d744d4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.js @@ -0,0 +1,28 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.properties new file mode 100644 index 0000000000..ad80113ce2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get.properties @@ -0,0 +1,37 @@ +header.action=Perform Action: +button.reject=Reject... +button.requestInfo=Request Information... +button.select-folder=Select... +button.message=Message... +button.addRecordTypes=Record Types... +menu.item.select=Select... + +label.setProperty.property=Set property: +label.setProperty.value=to: + +dialog.destination.title=Select destination folder + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=d/M/yyyy +form.control.date-picker.display.date.format=DD/MM/YYYY + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 Hour) + +record.folder.path.title=Click for more details on typing a record folder location. +record.folder.path.help=

Select a record folder or type in the full path.

\ +

You can type part of a record property to display autocomplete options. For example, if you type rm, options include:

\ +
  • - Date filed {node.rma:dateFiled}
  • \ +
  • - Location {node.rma:location}
\ +

Records are put into the File Plan based on each individual record property value.

\ +

Only 6 options are offered at a time.

\ +

If you select a date option then that part of the path is set to the date the rule is run. For example, if it's run on Monday then:

\ +
  • - Short Day {date.day.short} = Mon
  • \ +
  • - Long Day {date.day.long} = Monday
\ +

See Rules autocomplete options for full details.

\ + +fileTo.path.label=Record Folder Location +fileTo.createRecordPath.label=Create Full Path to Folder \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_de.properties new file mode 100644 index 0000000000..0793cab4de --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_de.properties @@ -0,0 +1,37 @@ +header.action=Aktion ausf\u00fchren: +button.reject=Ablehnen... +button.requestInfo=Informationen anfordern... +button.select-folder=Ausw\u00e4hlen... +button.message=Nachricht... +button.addRecordTypes=Record-Typen... +menu.item.select=Ausw\u00e4hlen... + +label.setProperty.property=Festlegen von Eigenschaft: +label.setProperty.value=auf: + +dialog.destination.title=Zielordner ausw\u00e4hlen + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd.MM.yyyy +form.control.date-picker.display.date.format=TT.MM.JJJJ + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 Stunden) + +record.folder.path.title=Klicken Sie, um weitere Einzelheiten zur Eingabe eines Orts f\u00fcr Record-Ordner zu erhalten. +record.folder.path.help=

W\u00e4hlen Sie einen Record-Ordner aus oder geben Sie den vollst\u00e4ndigen Pfad ein.

+

Sie k\u00f6nnen einen Teil einer Record-Eigenschaft eingeben, um die Optionen zur automatischen Vervollst\u00e4ndigung anzuzeigen. Wenn Sie zum Beispiel "rm" eingeben, sind die Optionen u.\u00a0a.:

\ +
  • - Ablagedatum {node.rma:dateFiled}
  • \ +
  • - Ort {node.rma:location}
\ +

Records werden auf Grundlage jedes einzelnen Record-Eigenschaftswerts einem Ablagewert zugeteilt.

\ +

Es werden immer nur sechs Optionen angeboten.

\ +

Wenn Sie eine Datumsoption ausw\u00e4hlen, wird dieser Teil des Pfads auf das Datum der Regelausf\u00fchrung gesetzt. Wenn die Ausf\u00fchrung zum Beispiel am Montag erfolgt:

\ +
  • - Tag kurz {date.day.short} = Mon
  • \ +
  • - Tag lang {date.day.long} = Montag
\ +

Weitere Informationen finden Sie unter: Rules autocomplete options.

+ +fileTo.path.label=Ort f\u00fcr Record-Ordner +fileTo.createRecordPath.label=Vollst\u00e4ndigen Ordnerpfad erstellen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_es.properties new file mode 100644 index 0000000000..b145731bee --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_es.properties @@ -0,0 +1,37 @@ +header.action=Realizar acci\u00f3n: +button.reject=Rechazar... +button.requestInfo=Solicitar informaci\u00f3n... +button.select-folder=Seleccionar... +button.message=Mensaje... +button.addRecordTypes=Tipo de documento de archivo... +menu.item.select=Seleccionar... + +label.setProperty.property=Establecer propiedad: +label.setProperty.value=a: + +dialog.destination.title=Seleccione la carpeta de destino + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/mm/yyyy +form.control.date-picker.display.date.format=dd/mm/aaaa + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 horas) + +record.folder.path.title=Haga clic para obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo escribir la ubicaci\u00f3n de una carpeta de documentos de archivo. +record.folder.path.help=

Seleccione una carpeta de documentos de archivo o escriba la ruta completa.

\ +

Puede escribir parte de la propiedad de un documento de archivo para mostrar las opciones de autocompletar. Por ejemplo, si escribe rm, las opciones incluyen:

\ +
  • - Fecha de archivo ''{node.rma:dateFiled}''
  • \ +
  • - Ubicaci\u00f3n ''{node.rma:location}''
\ +

Los documentos de archivo se colocar\u00e1n en el cuadro de clasificaci\u00f3n en base al valor individual de la propiedad del registro.

\ +

Solo se ofrecen 6 opciones cada vez.

\ +

Si selecciona una opci\u00f3n de fecha, se establece esa parte de la ruta hasta la fecha en que se ejecuta la regla. Por ejemplo, si se ejecuta el lunes, entonces:

\ +
  • - D\u00eda corto ''{date.day.short}'' = Lun
  • \ +
  • - D\u00eda largo ''{date.day.long}'' = Lunes
\ +

Consulte "Rules autocomplete options" para obtener toda la informaci\u00f3n.

+ +fileTo.path.label=Ubicaci\u00f3n de la carpeta de documentos de archivo +fileTo.createRecordPath.label=Crear ruta completa a la carpeta diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_fr.properties new file mode 100644 index 0000000000..f5d677b9ee --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_fr.properties @@ -0,0 +1,37 @@ +header.action=Ex\u00e9cuter une action : +button.reject=Rejeter... +button.requestInfo=Demander des informations... +button.select-folder=S\u00e9lectionner... +button.message=Message... +button.addRecordTypes=Types de document d'archives... +menu.item.select=S\u00e9lectionner... + +label.setProperty.property=D\u00e9finir une propri\u00e9t\u00e9 : +label.setProperty.value=\u00e0 : + +dialog.destination.title=S\u00e9lectionner le dossier de destination + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=DD/MM/yyyy +form.control.date-picker.display.date.format=JJ/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24\u00a0heures) + +record.folder.path.title=Cliquez pour plus d'informations sur la saisie de l'emplacement d'un dossier d'archives. +record.folder.path.help=

S\u00e9lectionnez un dossier d'archives ou entrez le chemin d'acc\u00e8s complet.

\ +

Vous pouvez saisir partiellement une propri\u00e9t\u00e9 d'archive pour afficher des options de saisie semi-automatique. Par exemple, si vous saisissez rm, les options suivantes s'affichent :

\ +
  • - Date de versement au site des archives {node.rma:dateFiled}
  • \ +
  • - Emplacement {node.rma:location}
\ +

Les archives sont plac\u00e9es dans le plan de classement en fonction de chaque valeur de propri\u00e9t\u00e9 d'archive individuelle.

\ +

6\u00a0options maximum peuvent \u00eatre propos\u00e9es simultan\u00e9ment.

\ +

Si vous s\u00e9lectionnez une option de date, cette partie du chemin est d\u00e9finie \u00e0 la date \u00e0 laquelle la r\u00e8gle est ex\u00e9cut\u00e9e. Par exemple, si elle est ex\u00e9cut\u00e9e le lundi\u00a0:

\ +
  • - Jour en abr\u00e9g\u00e9 {date.day.short} = lun
  • \ +
  • - Jour en long {date.day.long} = lundi
\ +

Voir "Rules autocomplete options" pour plus d'informations.\

+ +fileTo.path.label=Emplacement du dossier d'archives +fileTo.createRecordPath.label=Cr\u00e9er le chemin d'acc\u00e8s complet au dossier diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_it.properties new file mode 100644 index 0000000000..08aad6aa66 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_it.properties @@ -0,0 +1,37 @@ +header.action=Esegui azione: +button.reject=Respingi... +button.requestInfo=Richiedi informazioni... +button.select-folder=Seleziona... +button.message=Messaggio... +button.addRecordTypes=Tipi di record... +menu.item.select=Seleziona... + +label.setProperty.property=Imposta propriet\u00e0: +label.setProperty.value=a: + +dialog.destination.title=Seleziona cartella di destinazione + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=GG/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 ore) + +record.folder.path.title=Fare clic per maggiori dettagli su come inserire una nuova posizione della cartella di record. +record.folder.path.help=

Selezionare una cartella di record o inserire l'intero percorso.

\ +

\u00c8 possibile digitare parte della propriet\u00e0 di un record per visualizzare le opzioni di completamento automatico. Ad esempio, digitando rm le opzioni comprendono:

\ +
  • - Data di archiviazione {node.rma:dateFiled}
  • \ +
  • - Posizione {node.rma:location}
  • \ +

I record vengono inseriti nel Piano di fascicolazione in base a ogni singolo valore di propriet\u00e0 del record.

\ +

Vengono presentate solo 6 opzioni per volta.

\ +

Selezionando un'opzione relativa alla data la corrispondente parte del percorso viene impostata alla data in cui la regola viene eseguita. Ad esempio, se \u00e8 eseguita di luned\u00ec:

\ +
  • - Abbreviazione giorno {date.day.short} = Lun
  • \ +
  • - Giorno per esteso {date.day.long} = Luned\u00ec
  • \
\ +

Si vedano "Rules autocomplete options" per maggiori dettagli.

+ +fileTo.path.label=Posizione cartella di record +fileTo.createRecordPath.label=Crea percorso completo per la cartella diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_ja.properties new file mode 100644 index 0000000000..ee8ba5bacf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_ja.properties @@ -0,0 +1,37 @@ +header.action=\u51e6\u7406\u306e\u5b9f\u884c: +button.reject=\u5374\u4e0b... +button.requestInfo=\u60c5\u5831\u306e\u30ea\u30af\u30a8\u30b9\u30c8... +button.select-folder=\u9078\u629e... +button.message=\u30e1\u30c3\u30bb\u30fc\u30b8... +button.addRecordTypes=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7... +menu.item.select=\u9078\u629e... + +label.setProperty.property=\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u8a2d\u5b9a: +label.setProperty.value=\u8a2d\u5b9a\u5148\uff1a + +dialog.destination.title=\u30bf\u30fc\u30b2\u30c3\u30c8\u30d5\u30a9\u30eb\u30c0\u306e\u9078\u629e + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=yyyy/MM/d +form.control.date-picker.display.date.format=YYYY-MM-DD + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24\u6642\u9593) + +record.folder.path.title=\u3053\u3053\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u5834\u6240\u3092\u5165\u529b\u3059\u308b\u65b9\u6cd5\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +record.folder.path.help=

\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3059\u308b\u304b\u3001\u305d\u306e\u30d5\u30a9\u30eb\u30c0\u306e\u30d5\u30eb\u30d1\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002

\ +

\u30ec\u30b3\u30fc\u30c9\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u4e00\u90e8\u3092\u5165\u529b\u3059\u308b\u3068\u30aa\u30fc\u30c8\u30b3\u30f3\u30d7\u30ea\u30fc\u30c8\u306e\u5019\u88dc\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u3001\u305d\u3053\u304b\u3089\u9078\u3076\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\u300crm\u300d\u3068\u5165\u529b\u3059\u308b\u3068\u3001\u6b21\u306e\u3088\u3046\u306a\u5019\u88dc\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002

\ +
  • - \u6574\u7406\u4fdd\u7ba1\u65e5 {node.rma:dateFiled}
  • \ +
  • - \u5834\u6240 {node.rma:location}
\ +

\u30ec\u30b3\u30fc\u30c9\u306f\u3001\u500b\u3005\u306e\u30ec\u30b3\u30fc\u30c9\u30d7\u30ed\u30d1\u30c6\u30a3\u5024\u306b\u57fa\u3065\u3044\u3066\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u306b\u5165\u308c\u3089\u308c\u307e\u3059\u3002

\ +

\u540c\u6642\u306b\u8868\u793a\u3055\u308c\u308b\u5019\u88dc\u306f 6 \u3064\u306e\u307f\u3067\u3059\u3002

\ +

\u65e5\u4ed8\u306e\u5019\u88dc\u3092\u9078\u629e\u3057\u305f\u5834\u5408\u306f\u3001\u30d1\u30b9\u306e\u4e00\u90e8\u304c\u305d\u306e\u30eb\u30fc\u30eb\u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u65e5\u4ed8\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\u30eb\u30fc\u30eb\u3092\u6708\u66dc\u65e5\u306b\u5b9f\u884c\u3059\u308b\u5834\u5408\u306f\u3001\u6b21\u306e\u3088\u3046\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002

\ +
  • - \u66dc\u65e5-\u77ed\u7e2e\u5f62 {date.day.short} = \u6708
  • \ +
  • - \u66dc\u65e5-\u6b63\u5f0f\u5f62 {date.day.long} = \u6708\u66dc\u65e5
\ +

\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001\u300cRules autocomplete options\u300d\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002

\ + +fileTo.path.label=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u5834\u6240 +fileTo.createRecordPath.label=\u30d5\u30a9\u30eb\u30c0\u306e\u30d5\u30eb\u30d1\u30b9\u3092\u4f5c\u6210\u3059\u308b diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_nb.properties new file mode 100644 index 0000000000..96318a895a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_nb.properties @@ -0,0 +1,37 @@ +header.action=Utf\u00f8r handling: +button.reject=Avvis... +button.requestInfo=Be om informasjon... +button.select-folder=Velg... +button.message=Melding... +button.addRecordTypes=Oppf\u00f8ringstyper... +menu.item.select=Velg... + +label.setProperty.property=Angi egenskap: +label.setProperty.value=til: + +dialog.destination.title=Velg m\u00e5lmappe + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=d/MM/yyyy +form.control.date-picker.display.date.format=DD/MM/\u00c5\u00c5\u00c5\u00c5 + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=TT.mm +form.control.date-picker.display.time.format=TT:MM (24 timer) + +record.folder.path.title=Klikk for \u00e5 finne flere detaljer om \u00e5 skrive inn en plassering av oppf\u00f8ringsmappen. +record.folder.path.help=

Velg en oppf\u00f8ringsmappe, eller skriv inn hele banen.

\ +

Du kan skrive inn en del av oppf\u00f8ringsegenskapen for \u00e5 vise valg ved automatisk fullf\u00f8ring. Hvis du f.eks. skriver inn rm-alternativer, skal du inkludere:

\ +
  • - Dato registrert {node.rma:dateFiled}
  • \ +
  • - Sted {node.rma:location}
\ +

Oppf\u00f8ringen plasseres i filplanen basert i egenskapsverdien til den enkelte oppf\u00f8ringen.

\ +

Det gis kun 6 valg samtidig.

\ +

Datovalgene stilles inn den delen av banen til datoen som regelen kj\u00f8rer. Hvis f.eks. den kj\u00f8res p\u00e5 mandag blir:

\ +
  • - Kort dag {date.day.short} = man
  • \ +
  • - Lang dag {date.day.long} = mandag
\ +

Se reglene som gjelder automatiske fullf\u00f8ringsvalg for \u00e5 finne alle detaljene.

\ + +fileTo.path.label=Plassering av oppf\u00f8ringsmappe +fileTo.createRecordPath.label=Opprett hele banen til mappen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_nl.properties new file mode 100755 index 0000000000..ec9a6d6113 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_nl.properties @@ -0,0 +1,37 @@ +header.action=Actie uitvoeren: +button.reject=Afwijzen... +button.requestInfo=Informatie aanvragen... +button.select-folder=Selecteren... +button.message=Bericht... +button.addRecordTypes=Archiefstuktypes... +menu.item.select=Selecteren... + +label.setProperty.property=Eigenschap instellen: +label.setProperty.value=op: + +dialog.destination.title=Doelmap selecteren + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=DD-MM-JJJJ + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=UU:mm +form.control.date-picker.display.time.format=HH:MM (24 uur) + +record.folder.path.title=Klik voor meer informatie over het invoeren van een archiefmaplocatie. +record.folder.path.help=

Selecteer een archiefmap of voer het volledige pad in.

\ +

U kunt een deel van een archiefstukeigenschap invoeren om opties voor automatisch aanvullen weer te geven. Als u bijvoorbeeld rm invoert, zijn o.a. de volgende opties mogelijk:

\ +
  • - Datum gearchiveerd {node.rma:dateFiled}
  • \ +
  • - Locatie {node.rma:location}
\ +

Archiefstukken worden in het ordeningsplan geplaatst op basis van elke individuele archiefstukeigenschapwaarde.

\ +

Er worden per keer slechts zes opties geboden.

\ +

Als u een datumoptie selecteert, dan wordt dat deel van het pad ingesteld op de datum waarop de regel wordt uitgevoerd. Bijvoorbeeld, als de regel wordt uitgevoerd op maandag:

\ +
  • - Dag kort {date.day.short} = Maa
  • \ +
  • - Dag lang {date.day.long} = Maandag
\ +

Zie "Rules autocomplete options" voor volledige informatie.

\ + +fileTo.path.label=Locatie archiefmap +fileTo.createRecordPath.label=Volledig pad naar map maken diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_pt_BR.properties new file mode 100644 index 0000000000..5905fc5c91 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_pt_BR.properties @@ -0,0 +1,37 @@ +header.action=Executar a\u00e7\u00e3o: +button.reject=Rejeitar... +button.requestInfo=Solicitar informa\u00e7\u00f5es... +button.select-folder=Selecionar... +button.message=Mensagem... +button.addRecordTypes=Tipos de documento arquiv\u00edstico... +menu.item.select=Selecionar... + +label.setProperty.property=Definir propriedade: +label.setProperty.value=para: + +dialog.destination.title=Selecionar pasta de destino + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/M/yyyy +form.control.date-picker.display.date.format=DD/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 horas) + +record.folder.path.title=Clique para obter mais detalhes sobre como digitar um local de pasta de documento arquiv\u00edstico. +record.folder.path.help=

Selecione uma pasta de documento arquiv\u00edstico ou digite o caminho completo.

\ +

Voc\u00ea pode digitar parte da propriedade de um documento arquiv\u00edstico para exibir op\u00e7\u00f5es para autocompletar. Por exemplo, se voc\u00ea digitar rm, as op\u00e7\u00f5es incluir\u00e3o:

\ +
  • - Data de arquivamento {node.rma:dateFiled}
  • \ +
  • - Localiza\u00e7\u00e3o {node.rma:location}
\ +

Os documentos arquiv\u00edsticos s\u00e3o inseridos no Plano de arquivamento em cada valor individual de propriedade de registro.

\ +

Somente seis op\u00e7\u00f5es s\u00e3o oferecidas por vez.

\ +

Se voc\u00ea selecionar uma op\u00e7\u00e3o de data, essa parte do caminho ser\u00e1 definida como a data em que a regra foi executada. Por exemplo, se executado na segunda-feira:

\ +
  • - Dia curto {date.day.short} = Seg
  • \ +
  • - Dia longo {date.day.long} = Segunda
\ +

Veja "Rules autocomplete options" para ver os detalhes completos.

\ + +fileTo.path.label=Local da pasta de documento arquiv\u00edstico +fileTo.createRecordPath.label=Criar caminho completo para pasta diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_ru.properties new file mode 100644 index 0000000000..0af4b5c773 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_ru.properties @@ -0,0 +1,37 @@ +header.action=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435: +button.reject=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c... +button.requestInfo=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e... +button.select-folder=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435... +button.message=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435... +button.addRecordTypes=\u0422\u0438\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439... +menu.item.select=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435... + +label.setProperty.property=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: +label.setProperty.value=\u0432: + +dialog.destination.title=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=\u0414\u0414/\u041c\u041c/\u0413\u0413\u0413\u0413 + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=\u0427\u0427:\u041c\u041c (24\u00a0\u0447\u0430\u0441\u0430) + +record.folder.path.title=\u041d\u0430\u0436\u043c\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. +record.folder.path.help=

\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u043b\u0438 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u0439.

\ +

\u0427\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 ''rm'' \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:

\ +
  • - \u0414\u0430\u0442\u0430 \u0432\u0432\u043e\u0434\u0430 {node.rma:dateFiled}
  • \ +
  • - \u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 {node.rma:location}
\ +

\u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u0438.

\ +

\u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 6 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.

\ +

\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441 \u0434\u0430\u0442\u043e\u0439, \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0443\u0442\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a, \u0442\u043e:

\ +
  • - \u041a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u0442\u044b {date.day.short} = \u041f\u043d
  • \ +
  • - \u0414\u043b\u0438\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u0442\u044b {date.day.long} = \u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a
\ +

\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043c. \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.

\ + +fileTo.path.label=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +fileTo.createRecordPath.label=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_zh_CN.properties new file mode 100644 index 0000000000..7a43b28b54 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-action.get_zh_CN.properties @@ -0,0 +1,37 @@ +header.action=\u6267\u884c\u64cd\u4f5c\uff1a +button.reject=\u62d2\u7edd... +button.requestInfo=\u8bf7\u6c42\u4fe1\u606f... +button.select-folder=\u9009\u62e9... +button.message=\u6d88\u606f... +button.addRecordTypes=\u8bb0\u5f55\u7c7b\u578b... +menu.item.select=\u9009\u62e9... + +label.setProperty.property=\u8bbe\u7f6e\u5c5e\u6027\uff1a +label.setProperty.value=\u81f3\uff1a + +dialog.destination.title=\u9009\u62e9\u76ee\u6807\u6587\u4ef6\u5939 + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=yyyy/M/d +form.control.date-picker.display.date.format=YYYY/MM/DD + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM\uff0824 \u5c0f\u65f6\u5236\uff09 + +record.folder.path.title=\u5355\u51fb\u4e86\u89e3\u6709\u5173\u8f93\u5165\u8bb0\u5f55\u6587\u4ef6\u5939\u4f4d\u7f6e\u7684\u66f4\u591a\u8be6\u60c5\u3002 +record.folder.path.help=

\u9009\u62e9\u8bb0\u5f55\u6587\u4ef6\u5939\u6216\u8f93\u5165\u5b8c\u6574\u8def\u5f84\u3002

\ +

\u60a8\u53ef\u4ee5\u8f93\u5165\u90e8\u5206\u8bb0\u5f55\u5c5e\u6027\u4ee5\u663e\u793a\u81ea\u52a8\u586b\u5145\u9009\u9879\u3002 \u4f8b\u5982\uff0c\u5982\u679c\u60a8\u8f93\u5165 rm\uff0c\u9009\u9879\u5c06\u5305\u62ec\uff1a

\ +
  • - \u7acb\u5377\u65e5\u671f {node.rma:dateFiled}
  • \ +
  • - \u4f4d\u7f6e {node.rma:location}
\ +

\u57fa\u4e8e\u6bcf\u4e2a\u5355\u72ec\u7684\u8bb0\u5f55\u5c5e\u6027\u503c\uff0c\u5c06\u8bb0\u5f55\u653e\u5165\u5f52\u7c7b\u65b9\u6848\u5185\u3002

\ +

\u7cfb\u7edf\u5728\u540c\u4e00\u65f6\u95f4\u53ea\u63d0\u4f9b 6 \u4e2a\u9009\u9879\u3002

\ +

\u5982\u679c\u60a8\u9009\u62e9\u4e00\u4e2a\u65e5\u671f\u9009\u9879\uff0c\u5219\u8def\u5f84\u7684\u8be5\u90e8\u5206\u8bbe\u5b9a\u4e3a\u89c4\u5219\u8fd0\u884c\u7684\u65e5\u671f\u3002 \u4f8b\u5982\uff0c\u5982\u679c\u6267\u884c\u65f6\u95f4\u662f\u661f\u671f\u4e00\uff0c\u5219

\ +
  • - \u7f29\u5199\u661f\u671f\u6570 {date.day.short} = Mon
  • \ +
  • - \u5168\u957f\u661f\u671f\u6570 {date.day.long} = Monday
\ +

\u6709\u5173\u5b8c\u6574\u8be6\u60c5\uff0c\u8bf7\u53c2\u9605\u89c4\u5219\u81ea\u52a8\u586b\u5145\u9009\u9879\u3002

\ + +fileTo.path.label=\u8bb0\u5f55\u6587\u4ef6\u5939\u4f4d\u7f6e +fileTo.createRecordPath.label=\u521b\u5efa\u6587\u4ef6\u5939\u7684\u5b8c\u6574\u8def\u5f84 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.config.xml new file mode 100644 index 0000000000..125127d5bb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.config.xml @@ -0,0 +1,169 @@ + + + + Alfresco.RuleConfigCondition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cm:name + cm:title + dod:originator + dod:originatingOrganization + dod:publicationDate + rma:recordSearchDispositionAuthority + rma:recordSearchDispositionInstructions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ComparePropertyValue + CompareMimeType + IsSubType + HasAspect + HasTag + InCategory + ShowMore + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.desc.xml new file mode 100644 index 0000000000..c6fc0ebf2a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.desc.xml @@ -0,0 +1,5 @@ + + Rule Config Condition + Rule Config for Rules conditions + /rm/components/rules/config/condition + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.html.ftl new file mode 100644 index 0000000000..6d4f09e76c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.html.ftl @@ -0,0 +1,27 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/rules/config/rule-config-condition.get.html.ftl" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.js new file mode 100644 index 0000000000..9a8cc4d96f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.js @@ -0,0 +1,28 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.properties new file mode 100644 index 0000000000..3f56978061 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get.properties @@ -0,0 +1,27 @@ +header.condition.if=If the following apply: +header.condition.unless=If the following don't apply: +menu.item.show-more=Show more... +label.noRendererForType=Error: No renderer for type ''{0}'' +label.is=is +label.sizeUnit=bytes +label.transientProperty={0} in {1} +message.getPropertiesFailure=Couldn't load properties +message.getTagFailure=Couldn't load tag + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=d/M/yyyy +form.control.date-picker.display.date.format=DD/MM/YYYY + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 Hour) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} is ''{param.value}'' +customise.is-subtype.text=Is of type (or sub type) ''{param.type}'' +customise.has-aspect.text=Has aspect ''{param.aspect}'' +customise.has-tag.text=Is tagged with ''{param.tag}'' +customise.in-category.text=Is in category ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_de.properties new file mode 100644 index 0000000000..f2f3173e80 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_de.properties @@ -0,0 +1,27 @@ +header.condition.if=Wenn Folgendes gilt: +header.condition.unless=Wenn Folgendes nicht gilt: +menu.item.show-more=Mehr anzeigen... +label.noRendererForType=Fehler: Kein Renderer f\u00fcr Typ ''{0}'' +label.is=ist +label.sizeUnit=Bytes +label.transientProperty={0} in {1} +message.getPropertiesFailure=Eigenschaften konnten nicht geladen werden. +message.getTagFailure=Tag konnte nicht geladen werden. + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd.MM.yyyy +form.control.date-picker.display.date.format=TT.MM.JJJJ + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 Stunden) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} ist ''{param.value}'' +customise.is-subtype.text=Ist vom Typ (oder Untertyp) ''{param.type}'' +customise.has-aspect.text=Hat den Aspekt ''{param.aspect}'' +customise.has-tag.text=Ist getagged mit ''{param.tag}'' +customise.in-category.text=Ist in Kategorie ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_es.properties new file mode 100644 index 0000000000..77334f431d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_es.properties @@ -0,0 +1,27 @@ +header.condition.if=Si es aplicable lo siguiente: +header.condition.unless=Si no es aplicable lo siguiente: +menu.item.show-more=Mostrar m\u00e1s... +label.noRendererForType=Error: No hay renderizador para el tipo ''{0}'' +label.is=es +label.sizeUnit=bytes +label.transientProperty={0} en {1} +message.getPropertiesFailure=No se pudieron cargas las propiedades +message.getTagFailure=No se pudo cargar la etiqueta + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/mm/yyyy +form.control.date-picker.display.date.format=DD/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 horas) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} es ''{param.value}'' +customise.is-subtype.text=Es del tipo (o subtipo) ''{param.type}'' +customise.has-aspect.text=Tiene aspecto ''{param.aspect}'' +customise.has-tag.text=Est\u00e1 etiquetado con ''{param.tag}'' +customise.in-category.text=Est\u00e1 en la categor\u00eda ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_fr.properties new file mode 100644 index 0000000000..39f409eaa5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_fr.properties @@ -0,0 +1,27 @@ +header.condition.if=Si ce qui suit s'applique : +header.condition.unless=Si ce qui suit ne s'applique pas : +menu.item.show-more=Montrer plus... +label.noRendererForType=Erreur : pas de restitution pour le type ''{0}'' +label.is=est +label.sizeUnit=octets +label.transientProperty={0} dans {1} +message.getPropertiesFailure=Impossible de charger les propri\u00e9t\u00e9s +message.getTagFailure=Impossible de charger le tag + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/M/yyyy +form.control.date-picker.display.date.format=JJ/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24\u00a0heures) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} est ''{param.value}'' +customise.is-subtype.text=Est de type (ou de sous-type) ''{param.type}'' +customise.has-aspect.text=Poss\u00e8de un aspect ''{param.aspect}'' +customise.has-tag.text=Est tagg\u00e9 ''{param.tag}'' +customise.in-category.text=Est dans la cat\u00e9gorie ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_it.properties new file mode 100644 index 0000000000..10ae0f2a7c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_it.properties @@ -0,0 +1,27 @@ +header.condition.if=Applicando quanto segue: +header.condition.unless=Non applicando quanto segue: +menu.item.show-more=Mostra altro... +label.noRendererForType=Errore: nessun renderer per il tipo ''{0}'' +label.is=\u00e8 +label.sizeUnit=byte +label.transientProperty={0} in {1} +message.getPropertiesFailure=Impossibile caricare propriet\u00e0 +message.getTagFailure=Impossibile caricare tag + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=GG/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 ore) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} \u00e8 ''{param.value}'' +customise.is-subtype.text=\u00c8 di tipo (o sottotipo) ''{param.type}'' +customise.has-aspect.text=Ha l''aspetto ''{param.aspect}'' +customise.has-tag.text=\u00c8 taggato con ''{param.tag}'' +customise.in-category.text=\u00c8 nella categoria ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_ja.properties new file mode 100644 index 0000000000..f228c6f054 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_ja.properties @@ -0,0 +1,27 @@ +header.condition.if=\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3059\u5834\u5408: +header.condition.unless=\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3055\u306a\u3044\u5834\u5408: +menu.item.show-more=\u7d9a\u304d\u3092\u898b\u308b... +label.noRendererForType=\u30a8\u30e9\u30fc: \u30bf\u30a4\u30d7 ''{0}'' \u306e\u30ec\u30f3\u30c0\u30e9\u304c\u3042\u308a\u307e\u305b\u3093 +label.is=\u304c +label.sizeUnit=\u30d0\u30a4\u30c8 +label.transientProperty={0} / {1} +message.getPropertiesFailure=\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f +message.getTagFailure=\u30bf\u30b0\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=yyyy/MM/dd +form.control.date-picker.display.date.format=YYYY-MM-DD + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24\u6642\u9593) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} \u306f ''{param.value}'' +customise.is-subtype.text=\u30bf\u30a4\u30d7 (\u307e\u305f\u306f\u30b5\u30d6\u30bf\u30a4\u30d7) ''{param.type}'' +customise.has-aspect.text=\u30a2\u30b9\u30da\u30af\u30c8 ''{param.aspect}'' \u304c\u3042\u308b\u5834\u5408 +customise.has-tag.text=''{param.tag}''\u3068\u30bf\u30b0\u4ed8\u3051 +customise.in-category.text=\u30ab\u30c6\u30b4\u30ea ''{param.category-value}'' \u306b\u542b\u307e\u308c\u3066\u3044\u308b diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_nb.properties new file mode 100644 index 0000000000..a82d7ace2c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_nb.properties @@ -0,0 +1,27 @@ +header.condition.if=Hvis f\u00f8lgende gjelder: +header.condition.unless=Hvis f\u00f8lgende ikke gjelder: +menu.item.show-more=Vis mer... +label.noRendererForType=Feil: Ingen gjengiver for type ''{0}'' +label.is=er +label.sizeUnit=byte +label.transientProperty={0} i {1} +message.getPropertiesFailure=Kunne ikke laste egenskaper +message.getTagFailure=Kunne ikke laste merke + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=DD/MM/\u00c5\u00c5\u00c5\u00c5 + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=TT.mm +form.control.date-picker.display.time.format=TT:MM (24 timer) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} er ''{param.value}'' +customise.is-subtype.text=Er av typen (eller undertypen) ''{param.type}'' +customise.has-aspect.text=Har aspekt ''{param.aspect}'' +customise.has-tag.text=Er tagget med ''{param.tag}'' +customise.in-category.text=Er i kategorien ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_nl.properties new file mode 100755 index 0000000000..a368f00812 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_nl.properties @@ -0,0 +1,27 @@ +header.condition.if=Als het volgende van toepassing is: +header.condition.unless=Als het volgende niet van toepassing is: +menu.item.show-more=Meer weergeven... +label.noRendererForType=Fout: geen renderer voor type ''{0}'' +label.is=is +label.sizeUnit=bytes +label.transientProperty={0} in {1} +message.getPropertiesFailure=Kan eigenschappen niet laden +message.getTagFailure=Kan tag niet laden + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=DD/MM/JJJJ + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=UU:mm +form.control.date-picker.display.time.format=HH:MM (24 uur) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} is ''{param.value}'' +customise.is-subtype.text=Is van type (of subtype) ''{param.type}'' +customise.has-aspect.text=Heeft aspect ''{param.aspect}'' +customise.has-tag.text=Is getagd met ''{param.tag}'' +customise.in-category.text=Bevindt zich in categorie ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_pt_BR.properties new file mode 100644 index 0000000000..bb9becf69f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_pt_BR.properties @@ -0,0 +1,27 @@ +header.condition.if=Se o seguinte se aplicar: +header.condition.unless=Se o seguinte n\u00e3o se aplicar: +menu.item.show-more=Mostrar mais... +label.noRendererForType=Erro: Sem renderizador para o tipo ''{0}'' +label.is=\u00e9 +label.sizeUnit=bytes +label.transientProperty={0} em {1} +message.getPropertiesFailure=N\u00e3o foi poss\u00edvel carregar as propriedades +message.getTagFailure=N\u00e3o foi poss\u00edvel carregar as marcas + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=d/M/aaaa +form.control.date-picker.display.date.format=DD/MM/AAAA + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM (24 horas) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} \u00e9 ''{param.value}'' +customise.is-subtype.text=\u00c9 do tipo (ou subtipo) ''{param.type}'' +customise.has-aspect.text=Tem o aspecto ''{param.aspect}'' +customise.has-tag.text=Est\u00e1 marcado com ''{param.tag}'' +customise.in-category.text=Est\u00e1 na categoria ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_ru.properties new file mode 100644 index 0000000000..fc34368c77 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_ru.properties @@ -0,0 +1,27 @@ +header.condition.if=\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f: +header.condition.unless=\u0415\u0441\u043b\u0438 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f: +menu.item.show-more=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435... +label.noRendererForType=\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 ''{0}'' +label.is=- +label.sizeUnit=\u0431 +label.transientProperty={0} \u0432 {1} +message.getPropertiesFailure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +message.getTagFailure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=dd/MM/yyyy +form.control.date-picker.display.date.format=\u0414\u0414/\u041c\u041c/\u0413\u0413\u0413\u0413 + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=\u0427\u0427:\u041c\u041c (24\u00a0\u0447\u0430\u0441\u0430) + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} - ''{param.value}'' +customise.is-subtype.text=\u0418\u043c\u0435\u0435\u0442 \u0442\u0438\u043f (\u0438\u043b\u0438 \u043f\u043e\u0434\u0442\u0438\u043f) ''{param.type}'' +customise.has-aspect.text=\u0418\u043c\u0435\u0435\u0442 \u0430\u0441\u043f\u0435\u043a\u0442 ''{param.aspect}'' +customise.has-tag.text=\u041f\u043e\u043c\u0435\u0447\u0435\u043d \u043c\u0435\u0442\u043a\u043e\u0439 ''{param.tag}'' +customise.in-category.text=\u0412 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_zh_CN.properties new file mode 100644 index 0000000000..67d1d1d3d5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/config/rule-config-condition.get_zh_CN.properties @@ -0,0 +1,27 @@ +header.condition.if=\u5982\u679c\u7b26\u5408\u4ee5\u4e0b\u60c5\u51b5\uff1a +header.condition.unless=\u5982\u679c\u4e0d\u7b26\u5408\u4ee5\u4e0b\u60c5\u51b5\uff1a +menu.item.show-more=\u663e\u793a\u66f4\u591a... +label.noRendererForType=\u9519\u8bef\uff1a\u7c7b\u578b ''{0}'' \u65e0\u5448\u73b0\u5668 +label.is=\u4e3a +label.sizeUnit=\u5b57\u8282 +label.transientProperty={1} \u4e2d\u7684 {0} +message.getPropertiesFailure=\u65e0\u6cd5\u52a0\u8f7d\u5c5e\u6027 +message.getTagFailure=\u65e0\u6cd5\u52a0\u8f7d\u6807\u8bb0 + +## Format used for date entry in date picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under date entry field +form.control.date-picker.entry.date.format=yyyy/M/d +form.control.date-picker.display.date.format=YYYY/MM/DD + +## Format used for time entry in datetime picker, 'entry' format is used by date parsing code, +## 'display' format is shown to the user under time entry field +form.control.date-picker.entry.time.format=HH:mm +form.control.date-picker.display.time.format=HH:MM\uff0824 \u5c0f\u65f6\u5236\uff09 + +customise.compare-property-value.text={name} {param.operation} {param.value} +customise.compare-property-value.text.hyphen={name} {param.operation} ''{param.value}'' +customise.compare-mime-type.text={name} \u4e3a ''{param.value}'' +customise.is-subtype.text=\u7c7b\u578b\uff08\u6216\u5b50\u7c7b\u578b\uff09\u4e3a ''{param.type}'' +customise.has-aspect.text=\u6709\u5207\u9762 ''{param.aspect}'' +customise.has-tag.text=\u5e26\u6709\u6807\u8bb0 ''{param.tag}'' +customise.in-category.text=\u5c5e\u4e8e\u7c7b\u522b ''{param.category-value}'' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.desc.xml new file mode 100644 index 0000000000..5ea9084282 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.desc.xml @@ -0,0 +1,5 @@ + + Rule Details + Displays detailed information for a rule + /rm/components/rules/rule-details + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.html.ftl new file mode 100644 index 0000000000..0f830860ec --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.html.ftl @@ -0,0 +1,87 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/rules/config/rule-config.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-type.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-condition.css" group="rules"/> + <@link href="${url.context}/res/components/rules/rule-details.css" group="rules"/> + + +<@markup id="js"> + + <#-- Modified for RM --> + <@script src="${url.context}/res/rm/components/rules/config/rule-config-util.js" group="rules"/> + + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/rules/config/rule-config.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-type.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-condition.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-action.js" group="rules"/> + <@script src="${url.context}/res/components/rules/rule-details.js" group="rules"/> + + <#-- Modified for RM --> + <@script src="${url.context}/res/rm/components/rules/rule-config-action-custom.js" group="rules"/> + <@script src="${url.context}/res/rm/components/rules/rule-details.js" group="rules"/> + + +<@markup id="widgets"> + <@createWidgets group="rules"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid> +
+ +
+ + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.js new file mode 100644 index 0000000000..0b1a0a562b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.js @@ -0,0 +1,35 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function rm_main() +{ + model.widgets[0].name = "Alfresco.rm.RuleDetails"; +} + +rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.properties new file mode 100644 index 0000000000..36a644edcc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get.properties @@ -0,0 +1,14 @@ +label.disabled=Active +label.executeAsynchronously=Run in background +label.applyToChildren=Rule applied to subfolders +label.and=All criteria are met +label.or=Any criteria is met +header.when=When +header.if=If +header.unless=Unless +header.action=Perform Action +message.getRuleFailure=We couldn't load the rule information. Try refreshing your browser. +message.deletingRule=Deleting rule... +message.confirm.delete.title=Delete Rule +message.confirm.delete=If you delete the rule then its actions won't apply to folder content any longer. +message.loading=Loading the File Plan... \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_de.properties new file mode 100644 index 0000000000..041a267325 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_de.properties @@ -0,0 +1,14 @@ +label.disabled=Aktiv +label.executeAsynchronously=Im Hintergrund ausf\u00fchren +label.applyToChildren=Regel auf Unterordner angewandt +label.and=Alle Kriterien werden erf\u00fcllt +label.or=Ein Kriterium wird erf\u00fcllt +header.when=Wenn +header.if=Falls +header.unless=Au\u00dfer +header.action=Aktion ausf\u00fchren +message.getRuleFailure=Regelinformationen konnten nicht geladen werden Information. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.deletingRule=Regel wird gel\u00f6scht... +message.confirm.delete.title=Regel l\u00f6schen +message.confirm.delete=Wenn Sie die Regel l\u00f6schen, werden die zugeh\u00f6rigen Aktionen nicht l\u00e4nger auf Ordnerinhalte angewendet. +message.loading=Ablageplan wird geladen... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_es.properties new file mode 100644 index 0000000000..447671a896 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_es.properties @@ -0,0 +1,14 @@ +label.disabled=Activa +label.executeAsynchronously=Ejecutar en segundo plano +label.applyToChildren=Regla aplicada a las subcarpetas +label.and=Se cumplen todos los criterios +label.or=Se cumple cualquier criterio +header.when=Cuando +header.if=Si +header.unless=A menos que +header.action=Realizar acci\u00f3n +message.getRuleFailure=No se pudo cargar la informaci\u00f3n de la regla. Trate de actualizar el navegador. +message.deletingRule=Eliminando la regla... +message.confirm.delete.title=Eliminar la regla +message.confirm.delete=Si elimina la regla, sus acciones ya no se aplicar\u00e1n al contenido de la carpeta. +message.loading=Cargando el cuadro de clasificaci\u00f3n... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_fr.properties new file mode 100644 index 0000000000..532e0ab051 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_fr.properties @@ -0,0 +1,14 @@ +label.disabled=Actif +label.executeAsynchronously=Ex\u00e9cuter en t\u00e2che de fond +label.applyToChildren=R\u00e8gle appliqu\u00e9e aux sous-dossiers +label.and=Tous les crit\u00e8res sont remplis +label.or=Un des crit\u00e8res est rempli +header.when=Quand +header.if=Si +header.unless=Sauf +header.action=Ex\u00e9cuter une action +message.getRuleFailure=Impossible de charger les informations de la r\u00e8gle. Essayez d'actualiser votre navigateur. +message.deletingRule=Suppression de la r\u00e8gle... +message.confirm.delete.title=Supprimer la r\u00e8gle +message.confirm.delete=Si vous supprimez la r\u00e8gle, les actions qui lui sont associ\u00e9es ne s'appliqueront plus au contenu du dossier. +message.loading=Chargement du plan de classement... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_it.properties new file mode 100644 index 0000000000..8d3c238234 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_it.properties @@ -0,0 +1,14 @@ +label.disabled=Attivo +label.executeAsynchronously=Esegui in background +label.applyToChildren=Regola applicata alle sottocartelle +label.and=Tutti i criteri sono soddisfatti +label.or=\u00c8 soddisfatto uno dei criteri +header.when=Quando +header.if=Se +header.unless=A meno che +header.action=Esegui azione +message.getRuleFailure=Impossibile caricare informazioni sulla regola. Provare ad aggiornare il browser. +message.deletingRule=Eliminazione regola... +message.confirm.delete.title=Elimina regola +message.confirm.delete=Eliminando la regola le sue azioni non verranno pi\u00f9 applicate al contenuto della cartella. +message.loading=Caricamento Piano di fascicolazione... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_ja.properties new file mode 100644 index 0000000000..f72b7917e5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_ja.properties @@ -0,0 +1,14 @@ +label.disabled=\u6709\u52b9 +label.executeAsynchronously=\u30eb\u30fc\u30eb\u3092\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u5b9f\u884c\u3057\u307e\u3059 +label.applyToChildren=\u30eb\u30fc\u30eb\u304c\u30b5\u30d6\u30d5\u30a9\u30eb\u30c0\u306b\u3082\u9069\u7528\u3055\u308c\u307e\u3059 +label.and=\u3059\u3079\u3066\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3059\u5834\u5408 +label.or=\u3044\u305a\u308c\u304b\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3059\u5834\u5408 +header.when=\u5b9f\u884c\u6761\u4ef6 +header.if=\u6761\u4ef6 +header.unless=\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3055\u306a\u3044\u5834\u5408 +header.action=\u51e6\u7406\u306e\u5b9f\u884c +message.getRuleFailure=\u30eb\u30fc\u30eb\u60c5\u5831\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.deletingRule=\u30eb\u30fc\u30eb\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... +message.confirm.delete.title=\u30eb\u30fc\u30eb\u306e\u524a\u9664 +message.confirm.delete=\u3053\u306e\u30eb\u30fc\u30eb\u3092\u524a\u9664\u3059\u308b\u3068\u3001\u305d\u306e\u51e6\u7406\u304c\u30d5\u30a9\u30eb\u30c0\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u9069\u7528\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 +message.loading=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_nb.properties new file mode 100644 index 0000000000..f2d55c25a9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_nb.properties @@ -0,0 +1,14 @@ +label.disabled=Aktiv +label.executeAsynchronously=Kj\u00f8r i bakgrunnen +label.applyToChildren=Regel brukes p\u00e5 undermapper +label.and=Alle vilk\u00e5r er oppfylt +label.or=Ethvert vilk\u00e5r er oppfylt +header.when=N\u00e5r +header.if=Hvis +header.unless=Med mindre +header.action=Utf\u00f8r handling +message.getRuleFailure=Kunne ikke laste inn regelinformasjon. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.deletingRule=Sletter regel... +message.confirm.delete.title=Slett regel +message.confirm.delete=Hvis du sletter regelen, hvis handlingene ikke lenger gjelde innholdet i mappen. +message.loading=Laste filplanen... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_nl.properties new file mode 100755 index 0000000000..83e78873f4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_nl.properties @@ -0,0 +1,14 @@ +label.disabled=Actief +label.executeAsynchronously=Op achtergrond uitvoeren +label.applyToChildren=Regel toegepast op submappen +label.and=Aan alle criteria is voldaan +label.or=Aan een of meer criteria is voldaan +header.when=Wanneer +header.if=Als +header.unless=Tenzij +header.action=Actie uitvoeren +message.getRuleFailure=Kan de regelinformatie niet laden. Vernieuw de browser. +message.deletingRule=Regel verwijderen... +message.confirm.delete.title=Regel verwijderen +message.confirm.delete=Als u de regel verwijderd, zijn de bijbehorende acties niet langer van toepassing op mapcontent. +message.loading=Het ordeningsplan laden... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_pt_BR.properties new file mode 100644 index 0000000000..2eb38ad78b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_pt_BR.properties @@ -0,0 +1,14 @@ +label.disabled=Ativo +label.executeAsynchronously=Executar em segundo plano +label.applyToChildren=Regra aplicada \u00e0s subpastas +label.and=Todos os crit\u00e9rios foram atendidos +label.or=Qualquer crit\u00e9rio \u00e9 atendido +header.when=Quando +header.if=Se +header.unless=A menos que +header.action=Executar a\u00e7\u00e3o +message.getRuleFailure=N\u00e3o foi poss\u00edvel carregar as informa\u00e7\u00f5es da regra. Tente atualizar seu navegador. +message.deletingRule=Excluindo regra... +message.confirm.delete.title=Excluir regra +message.confirm.delete=Se voc\u00ea excluir a regra, suas a\u00e7\u00f5es n\u00e3o se aplicar\u00e3o mais ao conte\u00fado da pasta. +message.loading=Carregando o Plano de arquivamento... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_ru.properties new file mode 100644 index 0000000000..87cf1af13b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_ru.properties @@ -0,0 +1,14 @@ +label.disabled=\u0410\u043a\u0442\u0438\u0432\u043d\u043e +label.executeAsynchronously=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 +label.applyToChildren=\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e \u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u043f\u043a\u0430\u043c +label.and=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 +label.or=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 +header.when=\u041a\u043e\u0433\u0434\u0430 +header.if=\u0415\u0441\u043b\u0438 +header.unless=\u0415\u0441\u043b\u0438 \u043d\u0435 +header.action=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 +message.getRuleFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.deletingRule=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430... +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e +message.confirm.delete=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043f\u043a\u0438. +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_zh_CN.properties new file mode 100644 index 0000000000..3c1c72b1d8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-details.get_zh_CN.properties @@ -0,0 +1,14 @@ +label.disabled=\u6d3b\u8dc3 +label.executeAsynchronously=\u540e\u53f0\u8fd0\u884c +label.applyToChildren=\u89c4\u5219\u5df2\u5e94\u7528\u4e8e\u5b50\u6587\u4ef6\u5939 +label.and=\u6ee1\u8db3\u6240\u6709\u6761\u4ef6 +label.or=\u6ee1\u8db3\u4efb\u610f\u6761\u4ef6 +header.when=\u65f6\u95f4 +header.if=\u5982\u679c +header.unless=\u9664\u975e +header.action=\u6267\u884c\u64cd\u4f5c +message.getRuleFailure=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u89c4\u5219\u4fe1\u606f\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.deletingRule=\u6b63\u5728\u5220\u9664\u89c4\u5219... +message.confirm.delete.title=\u5220\u9664\u89c4\u5219 +message.confirm.delete=\u5982\u679c\u60a8\u5220\u9664\u89c4\u5219\uff0c\u5219\u5176\u64cd\u4f5c\u4e0d\u4f1a\u518d\u5e94\u7528\u4e8e\u6587\u4ef6\u5939\u5185\u5bb9\u3002 +message.loading=\u6b63\u5728\u52a0\u8f7d\u5f52\u7c7b\u65b9\u6848... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.desc.xml new file mode 100644 index 0000000000..40928eaa04 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.desc.xml @@ -0,0 +1,5 @@ + + Rule Edit + Create or edit a rule + /rm/components/rules/rule-edit + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.html.ftl new file mode 100644 index 0000000000..5147fd9134 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.html.ftl @@ -0,0 +1,179 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/rules/config/rule-config.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-type.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-condition.css" group="rules"/> + <@link href="${url.context}/res/components/rules/rule-edit.css" group="rules"/> + <@link href="${url.context}/res/modules/documentlibrary/global-folder.css" group="rules"/> + <@link href="${url.context}/res/modules/rules/actions/workflow.css" group="rules"/> + <@link href="${url.context}/res/modules/rules/actions/checkin.css" group="rules"/> + <@link href="${url.context}/res/components/people-finder/authority-finder.css" group="rules"/> + <@link href="${url.context}/res/modules/email-form.css" group="rules"/> + <@link href="${url.context}/res/modules/data-picker.css" group="rules"/> + <@link href="${url.context}/res/modules/property-picker.css" group="rules"/> + <@link href="${url.context}/res/modules/rules/rules-property-picker.css" group="rules"/> + <@link href="${url.context}/res/components/object-finder/object-finder.css" group="rules"/> + <#-- Modified for RM --> + <@link href="${url.context}/res/components/form/form.css" group="rules"/> + <@link href="${url.context}/res/modules/documentlibrary/site-folder.css" group="rules"/> + + +<@markup id="js"> + + <#-- Modified for RM --> + <@script src="${url.context}/res/rm/components/rules/config/rule-config-util.js" group="rules"/> + + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/rules/config/rule-config.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-type.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-condition.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-action.js" group="rules"/> + <@script src="${url.context}/res/components/form/date.js" group="rules"/> + <@script src="${url.context}/res/components/form/date-picker.js" group="rules"/> + <@script src="${url.context}/res/yui/calendar/calendar.js" group="rules"/> + <@script src="${url.context}/res/components/rules/rule-edit.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/global-folder.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/global-folder.js" group="rules"/> + <@script src="${url.context}/res/modules/rules/actions/workflow.js" group="rules"/> + <@script src="${url.context}/res/modules/rules/actions/checkin.js" group="rules"/> + <@script src="${url.context}/res/components/people-finder/authority-finder.js" group="rules"/> + <@script src="${url.context}/res/modules/email-form.js" group="rules"/> + <@script src="${url.context}/res/modules/data-picker.js" group="rules"/> + <@script src="${url.context}/res/modules/property-picker.js" group="rules"/> + <@script src="${url.context}/res/modules/rules/rules-property-picker.js" group="rules"/> + <@script src="${url.context}/res/components/object-finder/object-finder.js" group="rules"/> + <@script src="${url.context}/res/modules/form/control-wrapper.js" group="rules"/> + + <#-- Modified for RM --> + <@script src="${url.context}/res/rm/components/rules/rule-config-action-custom.js" group="rules"/> + <@script src="${url.context}/res/modules/simple-dialog.js" group="rules"/> + <@script src="${url.context}/res/components/form/form.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/site-folder.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/doclib-actions.js" group="rules"/> + <@script src="${url.context}/res/rm/modules/documentlibrary/copy-move-link-file-to.js" group="rules"/> + <@script src="${url.context}/res/rm/components/rules/rule-edit.js" group="rules"/> + + +<@markup id="widgets"> + <@createWidgets group="rules"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#include "/org/alfresco/components/rules/config/rule-config.lib.ftl" /> + <#assign el=args.htmlid> +
+
+ + + +

${msg("header.editRule")}<#if ruleTitle??>: ${ruleTitle?html}

+

${msg("header.newRule")}

+ +
+ * ${msg("form.required.fields")} +
+ +
+ +

${msg("header.general")}

+
+ +
+ + +
+
+ + +
+ +

${msg("header.defineRule")}

+
+ +
${msg("message.loading")}
+ + +

${msg("header.otherOptions")}

+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
 
+
+
+ + + + + + + + +
+
+
+ + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.js new file mode 100644 index 0000000000..2414a5b5ff --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.js @@ -0,0 +1,49 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function rm_main() +{ + var result = []; + if (model.scripts != null) + { + result = model.scripts; + } + if (model.constraints != null) + { + var scripts = model.constraints["rm-ac-scripts"]; + if (scripts != null) + { + result = scripts; + } + } + return result; +} +model.scripts = rm_main(); + +model.widgets[0].name = "Alfresco.rm.RuleEdit"; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.properties new file mode 100644 index 0000000000..86f535a54e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get.properties @@ -0,0 +1,24 @@ +form.required.fields=Required fields +header.newRule=New Rule +header.editRule=Edit Rule +header.general=General +header.defineRule=Define Rule +header.otherOptions=Other Options +label.title=Name +label.description=Description +label.disabled=Turn off rule +label.executeAsynchronously=Run rule in background +label.applyToChildren=Rule applies to subfolders +label.scriptRef=Take action if there's a problem +label.selectScript=Select... +label.and=If the following apply +label.or=If the following don't apply +header.when=When +header.if=If +header.unless=Unless +header.action=Perform Action +message.creating=Creating rule... +message.updating=Updating rule... +message.persist-failure=Couldn't persist rule +message.createAnotherRule=Successfully created rule +message.loading=Loading the File Plan... \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_de.properties new file mode 100644 index 0000000000..a48ec9fc76 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_de.properties @@ -0,0 +1,24 @@ +form.required.fields=Pflichtfelder +header.newRule=Neue Regel +header.editRule=Regel bearbeiten +header.general=Allgemein +header.defineRule=Regel definieren +header.otherOptions=Weitere Optionen +label.title=Name +label.description=Beschreibung +label.disabled=Regel deaktivieren +label.executeAsynchronously=Regel im Hintergrund ausf\u00fchren +label.applyToChildren=Regel trifft auf Unterordner zu +label.scriptRef=Ma\u00dfnahmen ergreifen, wenn ein Problem besteht +label.selectScript=Ausw\u00e4hlen... +label.and=Wenn Folgendes gilt +label.or=Wenn Folgendes nicht gilt +header.when=Wenn +header.if=Falls +header.unless=Au\u00dfer +header.action=Aktion ausf\u00fchren +message.creating=Regel wird erstellt... +message.updating=Regel wird aktualisiert... +message.persist-failure=Regel konnte nicht umgesetzt werden. +message.createAnotherRule=Regel erfolgreich erstellt +message.loading=Ablageplan wird geladen... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_es.properties new file mode 100644 index 0000000000..4d10784102 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_es.properties @@ -0,0 +1,24 @@ +form.required.fields=Campos requeridos +header.newRule=Nueva regla +header.editRule=Editar regla +header.general=General +header.defineRule=Definir regla +header.otherOptions=Otras opciones +label.title=Nombre +label.description=Descripci\u00f3n +label.disabled=Desactivar regla +label.executeAsynchronously=Ejecutar regla en segundo plano +label.applyToChildren=Regla que se aplica a las subcarpetas +label.scriptRef=Emprender una acci\u00f3n si hay un problema +label.selectScript=Seleccionar... +label.and=Si es aplicable lo siguiente +label.or=Si no es aplicable lo siguiente +header.when=Cuando +header.if=Si +header.unless=A menos que +header.action=Realizar acci\u00f3n +message.creating=Creando la regla... +message.updating=Actualizando la regla... +message.persist-failure=No se pudo persistir con la regla +message.createAnotherRule=Regla creada correctamente. +message.loading=Cargando el cuadro de clasificaci\u00f3n... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_fr.properties new file mode 100644 index 0000000000..fefa2a5edd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_fr.properties @@ -0,0 +1,24 @@ +form.required.fields=Champs requis +header.newRule=Nouvelle R\u00e8gle +header.editRule=Modifier une r\u00e8gle +header.general=G\u00e9n\u00e9ral +header.defineRule=D\u00e9finir une r\u00e8gle +header.otherOptions=Autres options +label.title=Nom +label.description=Description +label.disabled=D\u00e9sactiver la r\u00e8gle +label.executeAsynchronously=Ex\u00e9cuter la r\u00e8gle en t\u00e2che de fond +label.applyToChildren=Appliquer la r\u00e8gle aux sous-dossiers +label.scriptRef=Agir si un probl\u00e8me survient +label.selectScript=S\u00e9lectionner... +label.and=Si ce qui suit s'applique +label.or=Si ce qui suit ne s'applique pas +header.when=Quand +header.if=Si +header.unless=Sauf +header.action=Ex\u00e9cuter une action +message.creating=Cr\u00e9ation de la r\u00e8gle... +message.updating=Mise \u00e0 jour de la r\u00e8gle... +message.persist-failure=Impossible de sauvegarder la r\u00e8gle +message.createAnotherRule=La r\u00e8gle a bien \u00e9t\u00e9 cr\u00e9\u00e9e +message.loading=Chargement du plan de classement... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_it.properties new file mode 100644 index 0000000000..1147c10957 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_it.properties @@ -0,0 +1,24 @@ +form.required.fields=Campi obbligatori +header.newRule=Nuova regola +header.editRule=Modifica regola +header.general=Generale +header.defineRule=Definisci regola +header.otherOptions=Altre opzioni +label.title=Nome +label.description=Descrizione +label.disabled=Disattiva la regola +label.executeAsynchronously=Esegui regola in background +label.applyToChildren=Regola applicata alle sottocartelle +label.scriptRef=Intervenire in caso di problema +label.selectScript=Seleziona... +label.and=Applicando quanto segue +label.or=Non applicando quanto segue: +header.when=Quando +header.if=Se +header.unless=A meno che +header.action=Esegui azione +message.creating=Creazione della regola in corso... +message.updating=Aggiornamento della regola in corso... +message.persist-failure=Impossibile salvare regola in modo permanente +message.createAnotherRule=Creazione regola riuscita +message.loading=Caricamento Piano di fascicolazione... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_ja.properties new file mode 100644 index 0000000000..2ef3178ac7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_ja.properties @@ -0,0 +1,24 @@ +form.required.fields=\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 +header.newRule=\u65b0\u3057\u3044\u30eb\u30fc\u30eb +header.editRule=\u30eb\u30fc\u30eb\u306e\u7de8\u96c6 +header.general=\u4e00\u822c +header.defineRule=\u30eb\u30fc\u30eb\u306e\u5b9a\u7fa9 +header.otherOptions=\u305d\u306e\u4ed6\u306e\u30aa\u30d7\u30b7\u30e7\u30f3 +label.title=\u540d\u524d +label.description=\u8aac\u660e +label.disabled=\u30eb\u30fc\u30eb\u3092\u30aa\u30d5\u306b\u3059\u308b +label.executeAsynchronously=\u30eb\u30fc\u30eb\u3092\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u5b9f\u884c\u3059\u308b +label.applyToChildren=\u30eb\u30fc\u30eb\u3092\u30b5\u30d6\u30d5\u30a9\u30eb\u30c0\u306b\u3082\u9069\u7528\u3059\u308b +label.scriptRef=\u554f\u984c\u306e\u767a\u751f\u6642\u306b\u51e6\u7406\u3092\u5b9f\u884c\u3059\u308b +label.selectScript=\u9078\u629e... +label.and=\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3059\u5834\u5408 +label.or=\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3055\u306a\u3044\u5834\u5408 +header.when=\u5b9f\u884c\u6761\u4ef6 +header.if=\u6761\u4ef6 +header.unless=\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3055\u306a\u3044\u5834\u5408 +header.action=\u51e6\u7406\u306e\u5b9f\u884c +message.creating=\u30eb\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059... +message.updating=\u30eb\u30fc\u30eb\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059... +message.persist-failure=\u30eb\u30fc\u30eb\u306b\u5f93\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.createAnotherRule=\u30eb\u30fc\u30eb\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002 +message.loading=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_nb.properties new file mode 100644 index 0000000000..f378d64c72 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_nb.properties @@ -0,0 +1,24 @@ +form.required.fields=Obligatoriske felt +header.newRule=Ny regel +header.editRule=Rediger regel +header.general=Generelt +header.defineRule=Definer regel +header.otherOptions=Andre alternativer +label.title=Navn +label.description=Beskrivelse +label.disabled=Sl\u00e5 av regelen +label.executeAsynchronously=Kj\u00f8r regel i bakgrunnen +label.applyToChildren=Regel gjelder undermapper +label.scriptRef=Gj\u00f8r noe hvis det er et problem. +label.selectScript=Velg... +label.and=Hvis f\u00f8lgende gjelder +label.or=Hvis f\u00f8lgende ikke gjelder +header.when=N\u00e5r +header.if=Hvis +header.unless=Med mindre +header.action=Utf\u00f8r handling +message.creating=Oppretter regel... +message.updating=Oppdaterer regel... +message.persist-failure=Kunne ikke gj\u00f8re regelen fast +message.createAnotherRule=Regel er n\u00e5 opprettet +message.loading=Laste filplanen... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_nl.properties new file mode 100755 index 0000000000..d8143be2b2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_nl.properties @@ -0,0 +1,24 @@ +form.required.fields=Verplichte velden +header.newRule=Nieuwe regel +header.editRule=Regel bewerken +header.general=Algemeen +header.defineRule=Regel defini\u00ebren +header.otherOptions=Andere opties +label.title=Naam +label.description=Beschrijving +label.disabled=Regel uitschakelen +label.executeAsynchronously=Regel op de achtergrond uitvoeren +label.applyToChildren=Regel is van toepassing op submappen +label.scriptRef=Actie ondernemen bij een probleem +label.selectScript=Selecteren... +label.and=Als het volgende van toepassing is +label.or=Als het volgende niet van toepassing is +header.when=Wanneer +header.if=Als +header.unless=Tenzij +header.action=Actie uitvoeren +message.creating=Regel maken... +message.updating=Regel bijwerken... +message.persist-failure=Kan regel niet behouden +message.createAnotherRule=Regel is gemaakt +message.loading=Het ordeningsplan laden... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_pt_BR.properties new file mode 100644 index 0000000000..9ce8e0ffab --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_pt_BR.properties @@ -0,0 +1,24 @@ +form.required.fields=Campos obrigat\u00f3rios +header.newRule=Nova regra +header.editRule=Editar regra +header.general=Geral +header.defineRule=Definir regra +header.otherOptions=Outras op\u00e7\u00f5es +label.title=Nome +label.description=Descri\u00e7\u00e3o +label.disabled=Desativar regra +label.executeAsynchronously=Executar regra em segundo plano +label.applyToChildren=A regra se aplica \u00e0s subpastas +label.scriptRef=Realizar a\u00e7\u00e3o em caso de problema +label.selectScript=Selecionar... +label.and=Se o seguinte se aplicar +label.or=Se o seguinte n\u00e3o se aplicar +header.when=Quando +header.if=Se +header.unless=A menos que +header.action=Executar a\u00e7\u00e3o +message.creating=Criando regra... +message.updating=Atualizando regra... +message.persist-failure=N\u00e3o foi poss\u00edvel persistir a regra +message.createAnotherRule=Regra criada com sucesso +message.loading=Carregando o Plano de arquivamento... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_ru.properties new file mode 100644 index 0000000000..6b2c765621 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_ru.properties @@ -0,0 +1,24 @@ +form.required.fields=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f +header.newRule=\u041d\u043e\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e +header.editRule=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e +header.general=\u041e\u0431\u0449\u0435\u0435 +header.defineRule=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e +header.otherOptions=\u0414\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0446\u0438\u0438 +label.title=\u0418\u043c\u044f +label.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +label.disabled=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e +label.executeAsynchronously=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 +label.applyToChildren=\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u043f\u043a\u0430\u043c +label.scriptRef=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b +label.selectScript=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435... +label.and=\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f +label.or=\u0415\u0441\u043b\u0438 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f +header.when=\u041a\u043e\u0433\u0434\u0430 +header.if=\u0415\u0441\u043b\u0438 +header.unless=\u0415\u0441\u043b\u0438 \u043d\u0435 +header.action=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 +message.creating=\u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e... +message.updating=\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e... +message.persist-failure=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e +message.createAnotherRule=\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_zh_CN.properties new file mode 100644 index 0000000000..b9bd33d75a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rule-edit.get_zh_CN.properties @@ -0,0 +1,24 @@ +form.required.fields=\u5fc5\u586b\u5b57\u6bb5 +header.newRule=\u65b0\u5efa\u89c4\u5219 +header.editRule=\u7f16\u8f91\u89c4\u5219 +header.general=\u5e38\u89c4 +header.defineRule=\u5b9a\u4e49\u89c4\u5219 +header.otherOptions=\u5176\u4ed6\u9009\u9879 +label.title=\u540d\u79f0 +label.description=\u8bf4\u660e +label.disabled=\u5173\u95ed\u89c4\u5219 +label.executeAsynchronously=\u5728\u540e\u53f0\u8fd0\u884c\u89c4\u5219 +label.applyToChildren=\u89c4\u5219\u5e94\u7528\u4e8e\u5b50\u6587\u4ef6\u5939 +label.scriptRef=\u5982\u679c\u6709\u95ee\u9898\uff0c\u5219\u64cd\u4f5c\u63aa\u65bd +label.selectScript=\u9009\u62e9... +label.and=\u5982\u679c\u7b26\u5408\u4ee5\u4e0b\u60c5\u51b5 +label.or=\u5982\u679c\u4e0d\u7b26\u5408\u4ee5\u4e0b\u60c5\u51b5 +header.when=\u65f6\u95f4 +header.if=\u5982\u679c +header.unless=\u9664\u975e +header.action=\u6267\u884c\u64cd\u4f5c +message.creating=\u6b63\u5728\u521b\u5efa\u89c4\u5219... +message.updating=\u6b63\u5728\u66f4\u65b0\u89c4\u5219... +message.persist-failure=\u65e0\u6cd5\u4fdd\u7559\u89c4\u5219 +message.createAnotherRule=\u5df2\u6210\u529f\u521b\u5efa\u89c4\u5219 +message.loading=\u6b63\u5728\u52a0\u8f7d\u5f52\u7c7b\u65b9\u6848... diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.desc.xml new file mode 100644 index 0000000000..3abaf5fb75 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.desc.xml @@ -0,0 +1,5 @@ + + No Rules + Gives actions to link to or create rules + /rm/components/rules/rules-none + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.head.ftl new file mode 100644 index 0000000000..908095030e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.head.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.html.ftl new file mode 100644 index 0000000000..7b829e181c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.html.ftl @@ -0,0 +1,64 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/rules/rules-none.css" group="rules"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/rules/rules-none.js" group="rules"/> + <@script src="${url.context}/res/rm/components/rules/rules-none.js" group="rules"/> + + +<@markup id="widgets"> + <@createWidgets group="rules"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#include "/org/alfresco/include/alfresco-macros.lib.ftl" /> + <#assign el=args.htmlid> +
+ +
+

${msg("header")}

+
+ <#assign href>rule-edit?unfiled=${page.url.args.unfiled}&nodeRef=${(page.url.args.nodeRef!"")?url} + ${msg("header.create-rule")} +
${msg("text.create-rule")}
+
+
+ ${msg("header.link-to-rule-set")} +
${msg("text.link-to-rule-set")}
+
+
+
+ + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.js new file mode 100644 index 0000000000..20e4544b4b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.js @@ -0,0 +1,32 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +var widgets = model.widgets; +widgets[0].name = "Alfresco.rm.RulesNone"; +model.widgets = widgets; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.properties new file mode 100644 index 0000000000..2db76265e2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get.properties @@ -0,0 +1,7 @@ +header=There aren't any rules set for this folder +label.folderInheritsRules=This folder inherits Rules from its parent folder(s) +header.create-rule=Create Rules +text.create-rule=Define your own rules from scratch for this folder +header.link-to-rule-set=Link to Rule Set +text.link-to-rule-set=Reuse an existing rule set defined for another folder + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_de.properties new file mode 100644 index 0000000000..3c8b580c27 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_de.properties @@ -0,0 +1,7 @@ +header=Bisher wurden noch keine Regeln f\u00fcr diesen Ordner eingerichtet. +label.folderInheritsRules=Dieser Ordner erbt Regeln von seinen \u00fcbergeordneten Ordnern +header.create-rule=Regeln erstellen +text.create-rule=Definieren Sie Ihre eigenen Regeln f\u00fcr diesen Ordner +header.link-to-rule-set=Mit Regelwerk verlinken +text.link-to-rule-set=Wiederverwendung einer existierenden Regel f\u00fcr einen anderen Ordner + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_es.properties new file mode 100644 index 0000000000..870a809ff8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_es.properties @@ -0,0 +1,7 @@ +header=No se ha definido ninguna regla para esta carpeta +label.folderInheritsRules=Esta carpeta hereda reglas de su(s) carpeta(s) primaria(s) +header.create-rule=Crear reglas +text.create-rule=Defina sus propias reglas a partir de cero para esta carpeta +header.link-to-rule-set=Enlace a un conjunto de reglas +text.link-to-rule-set=Reutilizaci\u00f3n de un conjunto de reglas existente definido para otra carpeta + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_fr.properties new file mode 100644 index 0000000000..567ea72bb8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_fr.properties @@ -0,0 +1,7 @@ +header=Aucune r\u00e8gle d\u00e9finie pour ce dossier +label.folderInheritsRules=Ce dossier h\u00e9rite des r\u00e8gles de ses dossier(s) parent(s) +header.create-rule=Cr\u00e9er des r\u00e8gles +text.create-rule=D\u00e9finir vos propres r\u00e8gles \u00e0 partir de rien pour ce dossier +header.link-to-rule-set=Associer un ensemble de r\u00e8gles +text.link-to-rule-set=R\u00e9utiliser un ensemble de r\u00e8gles existant pour un autre dossier + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_it.properties new file mode 100644 index 0000000000..cc6e10606d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_it.properties @@ -0,0 +1,7 @@ +header=Non ci sono regole impostate per questa cartella +label.folderInheritsRules=Questa cartella eredita le regole dalle cartelle superiori +header.create-rule=Crea regole +text.create-rule=Consente di definire da zero regole personalizzate per questa cartella +header.link-to-rule-set=Collega a set di regole +text.link-to-rule-set=Riutilizza un set di regole gi\u00e0 definito per un'altra cartella + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_ja.properties new file mode 100644 index 0000000000..30e51af131 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_ja.properties @@ -0,0 +1,7 @@ +header=\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u30eb\u30fc\u30eb\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +label.folderInheritsRules=\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306f\u89aa\u30d5\u30a9\u30eb\u30c0\u304b\u3089\u30eb\u30fc\u30eb\u3092\u7d99\u627f\u3057\u307e\u3059 +header.create-rule=\u30eb\u30fc\u30eb\u3092\u4f5c\u6210\u3059\u308b +text.create-rule=\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u7528\u306e\u65b0\u3057\u3044\u30eb\u30fc\u30eb\u3092\u5b9a\u7fa9\u3057\u307e\u3059 +header.link-to-rule-set=\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306b\u30ea\u30f3\u30af\u3059\u308b +text.link-to-rule-set=\u5225\u306e\u30d5\u30a9\u30eb\u30c0\u7528\u306b\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b\u65e2\u5b58\u306e\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u3092\u518d\u5229\u7528\u3057\u307e\u3059 + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_nb.properties new file mode 100644 index 0000000000..1a2762f869 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_nb.properties @@ -0,0 +1,7 @@ +header=Det er ikke angitt noen regler for denne mappen +label.folderInheritsRules=Denne mappen arver reglene fra dens overordnede mapper +header.create-rule=Opprett regler +text.create-rule=Definer dine egne regler fra grunnen av for denne mappen +header.link-to-rule-set=Koble til regelsett +text.link-to-rule-set=Bruk et eksisterende regelsett som er definert for en annen mappe p\u00e5 nytt + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_nl.properties new file mode 100644 index 0000000000..0ece9b8bd5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_nl.properties @@ -0,0 +1,7 @@ +header=Er zijn geen regels ingesteld voor deze map +label.folderInheritsRules=Deze map neemt regels over van de bovenliggende map(pen) +header.create-rule=Regels maken +text.create-rule=Definieer uw eigen regels voor deze map +header.link-to-rule-set=Koppeling naar regelset +text.link-to-rule-set=Hergebruik een bestaande regelset die is gedefinieerd voor een andere map + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_pt_BR.properties new file mode 100644 index 0000000000..5aea52828e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_pt_BR.properties @@ -0,0 +1,7 @@ +header=N\u00e3o h\u00e1 regras definidas para esta pasta +label.folderInheritsRules=Esta pasta herda as regras de sua(s) pasta(s) prim\u00e1ria(s) +header.create-rule=Criar regras +text.create-rule=Definir suas pr\u00f3prias regras do zero para esta pasta +header.link-to-rule-set=Vincular ao conjunto de regras +text.link-to-rule-set=Reutilizar um conjunto de regras existente definido para outra pasta + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_ru.properties new file mode 100644 index 0000000000..55eed675cd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_ru.properties @@ -0,0 +1,7 @@ +header=\u041d\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +label.folderInheritsRules=\u042d\u0442\u0430 \u043f\u0430\u043f\u043a\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u0430\u043f\u043e\u043a +header.create-rule=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 +text.create-rule=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +header.link-to-rule-set=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b +text.link-to-rule-set=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_zh_CN.properties new file mode 100644 index 0000000000..5658e79123 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/rules/rules-none.get_zh_CN.properties @@ -0,0 +1,7 @@ +header=\u6ca1\u6709\u4e3a\u6b64\u6587\u4ef6\u5939\u8bbe\u5b9a\u4efb\u4f55\u89c4\u5219 +label.folderInheritsRules=\u6b64\u6587\u4ef6\u5939\u4ece\u81ea\u5df1\u7684\u7236\u6587\u4ef6\u5939\u7ee7\u627f\u89c4\u5219 +header.create-rule=\u521b\u5efa\u89c4\u5219 +text.create-rule=\u4ece\u5934\u4e3a\u6b64\u6587\u4ef6\u5939\u5b9a\u4e49\u60a8\u81ea\u5df1\u7684\u89c4\u5219 +header.link-to-rule-set=\u94fe\u63a5\u5230\u89c4\u5219\u96c6 +text.link-to-rule-set=\u91cd\u7528\u4e3a\u53e6\u4e00\u4e2a\u6587\u4ef6\u5939\u5b9a\u4e49\u7684\u73b0\u6709\u89c4\u5219\u96c6 + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/options.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/options.ftl new file mode 100644 index 0000000000..3d5eff9428 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/options.ftl @@ -0,0 +1,254 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +
+
+
${msg("label.options")}
+
+
+
+
+ ${msg("label.metadata")} + +
+
+
+ ${msg("label.order")} + <#list 1..3 as i> +
+ <#if i=1>${msg("label.sortFirst")}<#else>${msg("label.sortNext")} + + ${msg("label.sortNone")} ▾" /> + + + + + + +
+ +
+
+
+
+ ${msg("label.components")} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.desc.xml new file mode 100644 index 0000000000..9648768e55 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.desc.xml @@ -0,0 +1,5 @@ + + Records Management Search + Records Management Search Component + /rm/components/search/search + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.head.ftl new file mode 100644 index 0000000000..b7d67ba23b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.head.ftl @@ -0,0 +1,41 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/search/search.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/search/results.css" /> +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/search/options.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/js/property-menu.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/search/results.js"> +<@script type="text/javascript" src="${url.context}/res/rm/components/search/search.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/modules/search/save-search.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/modules/search/save-search.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/modules/documentlibrary/hold/hold.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/hold/hold.js"> +<@script type="text/javascript" src="${url.context}/res/rm/modules/documentlibrary/hold/add-to-hold.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.html.ftl new file mode 100644 index 0000000000..8ffbf69c01 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.html.ftl @@ -0,0 +1,139 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid> + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.js new file mode 100644 index 0000000000..66ee1ee3cc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.js @@ -0,0 +1,45 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Search WebScript component + */ +function main() +{ + var editionInfo = context.properties["editionInfo"].edition, + groups = [], + conn = remote.connect("alfresco"), + res = conn.get("/slingshot/rmsearchproperties"); // TODO we should be passing the file plan here + + if (res.status == 200) + { + groups = eval('(' + res + ')').data.groups; + } + model.groups = groups; + model.isEnterprise = editionInfo == "ENTERPRISE"; +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.properties new file mode 100644 index 0000000000..3689f9327d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get.properties @@ -0,0 +1,66 @@ +message.loading=Loading... +message.empty=No results found. +message.error=There was a problem with the search. Try searching again. +message.foundresults=Found {0} item(s). +message.errorloadsearches=There was a problem loading saved searches. Try refreshing your browser. +message.errorexport=There was a problem exporting search results. Try again or contact your I.T. Dept. +message.selectdate=Select Date + +message.deletesearch.title=Delete Search +message.deletesearch.description=If you delete search ''{0}'' it won't be available in the saved searches. +message.deletesearch.success=Search was successfully deleted. +message.deletesearch.failure=We couldn't delete the search right now. Try again later. + +label.searchtitle=Search +label.searchterm=Search Text +label.criteria=Criteria +label.results=Results +label.insertfield=Search by +label.select=Select... +label.insertdate=Search Date + +label.records=Records (Completed Only) +label.undeclared=Include Incomplete +label.vital=Vital Only +label.recordFolders=Record Folders +label.recordCategories=Record Categories +label.frozen=On Hold only (Excluded When Not Selected) +label.cutoff=Cut Off only + +button.newsearch=New Search +button.savesearch=Save Search +button.savedsearches=Saved Searches +button.deletesearch=Delete Search +button.print=Print Layout +button.screen=Screen Layout +button.export=Export +button.add-to-hold=Add to Hold + +# RM Results Common +label.options=Results Options +label.metadata=Metadata +label.order=Order +label.sortFirst=First by +label.sortNext=then by +label.sortNone=(None) +label.sortAscending=Ascending +label.sortDescending=Descending +label.dueForReview=Due for Review +label.components=Show +label.recordSeries=Record Series +label.parentFolder=Parent Folder +label.currentClassification=Current Classification +label.securityMarks=Security Marks + +# RMA search model metadata fields +label.dispositionEvents=Retention Events +label.dispositionActionName=Retention Action Name +label.dispositionActionAsOf=Retention Action As Of Date +label.dispositionEventsEligible=Retention Events Eligible +label.vitalRecordReviewPeriod=Vital Record Review Period +label.hasDispositionSchedule=Has Retention Schedule +label.dispositionPeriod=Retention Period +label.dispositionInstructions=Retention Instructions +label.dispositionAuthority=Retention Authority +label.holdReason=Hold Reason +label.recordCategoryIdentifier=Record Category Identifier diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_de.properties new file mode 100644 index 0000000000..7d922a5c14 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_de.properties @@ -0,0 +1,66 @@ +message.loading=Laden... +message.empty=Keine Ergebnisse gefunden. +message.error=Bei der Suche ist ein Problem aufgetreten. Versuchen Sie es noch einmal. +message.foundresults={0} Element(e) gefunden. +message.errorloadsearches=Beim Laden der gespeicherten Suchen ist ein Problem aufgetreten. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. +message.errorexport=Beim Exportieren der Suchergebnisse ist ein Problem aufgetreten. Versuchen Sie es erneut oder kontakten Sie Ihre IT-Abteilung. +message.selectdate=Datum ausw\u00e4hlen + +message.deletesearch.title=Suche l\u00f6schen +message.deletesearch.description=Wenn Sie die Suche ''{0}'' l\u00f6schen, ist diese nicht in den gespeicherten Suchen verf\u00fcgbar. +message.deletesearch.success=Suche wurde erfolgreich gel\u00f6scht. +message.deletesearch.failure=Suche konnte zum jetzigen Zeitpunkt nicht gel\u00f6scht werden. Versuchen Sie es sp\u00e4ter erneut. + +label.searchtitle=Suchen +label.searchterm=Suchtext +label.criteria=Kriterien +label.results=Ergebnisse +label.insertfield=Suchen nach +label.select=Ausw\u00e4hlen... +label.insertdate=Suchdatum + +label.records=Records (nur abgeschlossene) +label.undeclared=Auch nicht abgeschlossene +label.vital=Nur besonders relevante +label.recordFolders=Record-Ordner +label.recordCategories=Record-Kategorien +label.frozen=Nur Legal Hold (ausgeschlossen, wenn nicht ausgew\u00e4hlt) +label.cutoff=Nur getrennte + +button.newsearch=Neue Suche +button.savesearch=Suche speichern +button.savedsearches=Gespeicherte Suchen +button.deletesearch=Suche l\u00f6schen +button.print=Drucklayout +button.screen=Bildschirm-Layout +button.export=Exportieren +button.add-to-hold=Zum Legal Hold hinzuf\u00fcgen + +# RM Results Common +label.options=Ergebnisoptionen +label.metadata=Metadaten +label.order=Reihenfolge +label.sortFirst=Zuerst nach +label.sortNext=dann nach +label.sortNone=(Keine) +label.sortAscending=Aufsteigend +label.sortDescending=Absteigend +label.dueForReview=F\u00e4llig zur \u00dcberpr\u00fcfung +label.components=Anzeigen +label.recordSeries=Record-Serien +label.parentFolder=\u00dcbergeordneter Ordner +label.currentClassification=Momentane Klassifizierung +label.securityMarks=Sicherheitskennzeichen + +# RMA search model metadata fields +label.dispositionEvents=Aufbewahrungsereignisse +label.dispositionActionName=Name der Aufbewahrungsaktion +label.dispositionActionAsOf=Startdatum der Aufbewahrungsaktion +label.dispositionEventsEligible=Erlaubte Aufbewahrungsereignisse +label.vitalRecordReviewPeriod=\u00dcberpr\u00fcfungszeitraum f\u00fcr besonders relevante Records +label.hasDispositionSchedule=Mit Aufbewahrungsplan +label.dispositionPeriod=Aufbewahrungszeitraum +label.dispositionInstructions=Aufbewahrungsanweisungen +label.dispositionAuthority=Aufbewahrungs-Authority +label.holdReason=Grund f\u00fcr Legal Hold +label.recordCategoryIdentifier=Record-Kategorie-ID diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_es.properties new file mode 100644 index 0000000000..d85b2dd51c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_es.properties @@ -0,0 +1,66 @@ +message.loading=Cargando... +message.empty=Ning\u00fan resultado encontrado. +message.error=Se produjo un problema con la b\u00fasqueda. Vuelva a intentar la b\u00fasqueda. +message.foundresults=Se encontraron {0} elemento(s). +message.errorloadsearches=Se produjo un problema al cargar las b\u00fasquedas guardadas. Trate de actualizar el navegador. +message.errorexport=Se produjo un problema al exportar los resultados de b\u00fasqueda. Vuelva a intentarlo o p\u00f3ngase en contacto con el dep. de TI. +message.selectdate=Seleccionar fecha + +message.deletesearch.title=Eliminar b\u00fasqueda +message.deletesearch.description=Si elimina la b\u00fasqueda ''{0}'', no estar\u00e1 disponible en las b\u00fasquedas guardadas. +message.deletesearch.success=B\u00fasqueda eliminada correctamente. +message.deletesearch.failure=No se pudo eliminar la b\u00fasqueda en este momento. Vuelva a intentarlo m\u00e1s tarde. + +label.searchtitle=Buscar +label.searchterm=Texto de b\u00fasqueda +label.criteria=Criterios +label.results=Resultados +label.insertfield=Busca por +label.select=Seleccionar... +label.insertdate=Fecha de b\u00fasqueda + +label.records=Documentos de archivo (solo completos) +label.undeclared=Incluir incompletos +label.vital=Solo vitales +label.recordFolders=Carpetas de documentos de archivo +label.recordCategories=Categor\u00edas de documentos de archivo +label.frozen=Solo en retenci\u00f3n legal (excluidos cuando no est\u00e1n seleccionados) +label.cutoff=Solo en inicio de retenci\u00f3n + +button.newsearch=Nueva b\u00fasqueda +button.savesearch=Guardar b\u00fasqueda +button.savedsearches=B\u00fasquedas guardadas +button.deletesearch=Eliminar b\u00fasqueda +button.print=Dise\u00f1o de impresi\u00f3n +button.screen=Dise\u00f1o de pantalla +button.export=Exportar +button.add-to-hold=A\u00f1adir a retenci\u00f3n legal + +# RM Results Common +label.options=Opciones de resultados +label.metadata=Metadatos +label.order=Orden +label.sortFirst=Empezar por +label.sortNext=continuar por +label.sortNone=(Ninguno) +label.sortAscending=Ascendente +label.sortDescending=Descendente +label.dueForReview=Pendiente de revisi\u00f3n +label.components=Mostrar +label.recordSeries=Serie de documentos de archivo +label.parentFolder=Carpeta primaria +label.currentClassification=Clasificaci\u00f3n actual +label.securityMarks=Marcas de seguridad + +# RMA search model metadata fields +label.dispositionEvents=Eventos de retenci\u00f3n +label.dispositionActionName=Nombre de acci\u00f3n de retenci\u00f3n +label.dispositionActionAsOf=Fecha de inicio de acci\u00f3n de retenci\u00f3n +label.dispositionEventsEligible=Eventos de retenci\u00f3n elegibles +label.vitalRecordReviewPeriod=Periodo de revisi\u00f3n de documento de archivo vital +label.hasDispositionSchedule=Tiene calendario de retenci\u00f3n +label.dispositionPeriod=Periodo de retenci\u00f3n +label.dispositionInstructions=Instrucciones de retenci\u00f3n +label.dispositionAuthority=Autoridad de retenci\u00f3n +label.holdReason=Raz\u00f3n de retenci\u00f3n legal +label.recordCategoryIdentifier=Identificador de categor\u00eda de documentos de archivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_fr.properties new file mode 100644 index 0000000000..a63ee85ffc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_fr.properties @@ -0,0 +1,66 @@ +message.loading=Chargement... +message.empty=Aucun r\u00e9sultat trouv\u00e9. +message.error=Un probl\u00e8me est survenu pendant la recherche. Faites une nouvelle recherche. +message.foundresults={0} \u00e9l\u00e9ment(s) trouv\u00e9(s). +message.errorloadsearches=Un probl\u00e8me est survenu lors du chargement des recherches enregistr\u00e9es. Essayez d'actualiser votre navigateur. +message.errorexport=Un probl\u00e8me est survenu lors de l'exportation des r\u00e9sultats de la recherche. R\u00e9essayez ou contactez votre DSI. +message.selectdate=S\u00e9lectionner la date + +message.deletesearch.title=Supprimer la recherche +message.deletesearch.description=Si vous supprimez la recherche ''{0}'', elle ne sera plus disponible dans les recherches enregistr\u00e9es. +message.deletesearch.success=La recherche a bien \u00e9t\u00e9 supprim\u00e9e. +message.deletesearch.failure=Impossible de supprimer la recherche pour l'instant. R\u00e9essayez ult\u00e9rieurement. + +label.searchtitle=Rechercher +label.searchterm=Texte \u00e0 rechercher +label.criteria=Crit\u00e8res +label.results=R\u00e9sultats +label.insertfield=Rechercher par +label.select=S\u00e9lectionner... +label.insertdate=Date de recherche + +label.records=Documents d'archives (termin\u00e9s seulement) +label.undeclared=Inclure incomplet +label.vital=Essentiels seulement +label.recordFolders=Dossiers d'archives +label.recordCategories=Cat\u00e9gories de document d'archives +label.frozen=Suspendus seulement (exclus lorsque non s\u00e9lectionn\u00e9s) +label.cutoff=D\u00e9but de conservation seulement + +button.newsearch=Nouvelle recherche +button.savesearch=Enregistrer la recherche +button.savedsearches=Recherches enregistr\u00e9es +button.deletesearch=Supprimer la recherche +button.print=Gabarit pour l'\u00e9cran +button.screen=Configuration d'\u00e9cran +button.export=Exporter +button.add-to-hold=Ajouter \u00e0 la suspension + +# RM Results Common +label.options=Options de r\u00e9sultats +label.metadata=M\u00e9tadonn\u00e9es +label.order=Commande +label.sortFirst=D'abord par +label.sortNext=puis par +label.sortNone=(Aucun) +label.sortAscending=Croissant +label.sortDescending=D\u00e9croissant +label.dueForReview=Arriv\u00e9 \u00e0 \u00e9ch\u00e9ance pour v\u00e9rification +label.components=Afficher +label.recordSeries=S\u00e9rie de documents d'archives +label.parentFolder=Dossier parent +label.currentClassification=Classification actuelle +label.securityMarks=Marques de s\u00e9curit\u00e9 + +# RMA search model metadata fields +label.dispositionEvents=Ev\u00e9nements de conservation +label.dispositionActionName=Nom de l'action de conservation +label.dispositionActionAsOf=Date de d\u00e9but de l'action de conservation +label.dispositionEventsEligible=Ev\u00e9nements de conservation \u00e9ligibles +label.vitalRecordReviewPeriod=P\u00e9riode de v\u00e9rification du document d'archives essentiel +label.hasDispositionSchedule=A une r\u00e8gle de conservation +label.dispositionPeriod=P\u00e9riode de conservation +label.dispositionInstructions=Instructions de conservation +label.dispositionAuthority=D\u00e9tenteur principal +label.holdReason=Motif de suspension +label.recordCategoryIdentifier=Identifiant de cat\u00e9gorie de document d'archives diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_it.properties new file mode 100644 index 0000000000..5f3e2065ad --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_it.properties @@ -0,0 +1,66 @@ +message.loading=Caricamento... +message.empty=Nessun risultato trovato. +message.error=Si \u00e8 verificato un problema con la ricerca. Riprovare a eseguire la ricerca. +message.foundresults={0} elementi trovati. +message.errorloadsearches=Si \u00e8 verificato un problema durante il caricamento delle ricerche salvate. Provare ad aggiornare il browser. +message.errorexport=Si \u00e8 verificato un problema durante l'esportazione dei risultati della ricerca. Provare nuovamente o contattare il proprio reparto IT. +message.selectdate=Seleziona data + +message.deletesearch.title=Elimina ricerca +message.deletesearch.description=Eliminando la ricerca ''{0}'' essa non sar\u00e0 pi\u00f9 disponibile tra le ricerche salvate. +message.deletesearch.success=Eliminazione ricerca riuscita. +message.deletesearch.failure=Impossibile eliminare la ricerca ora. Riprovare pi\u00f9 tardi. + +label.searchtitle=Cerca +label.searchterm=Cerca testo +label.criteria=Criteri +label.results=Risultati +label.insertfield=Cerca per +label.select=Seleziona... +label.insertdate=Cerca data + +label.records=Record (solo completati) +label.undeclared=Includi incompleti +label.vital=Solo fondamentali +label.recordFolders=Cartelle record +label.recordCategories=Categorie record +label.frozen=Solo sospeso (escluso se non selezionato) +label.cutoff=Solo cut off + +button.newsearch=Nuova ricerca +button.savesearch=Salva ricerca +button.savedsearches=Ricerche salvate +button.deletesearch=Elimina ricerca +button.print=Layout di stampa +button.screen=Layout schermata +button.export=Esporta +button.add-to-hold=Aggiungi a sospesi + +# RM Results Common +label.options=Opzioni risultati +label.metadata=Metadati +label.order=Ordina +label.sortFirst=Prima per +label.sortNext=poi per +label.sortNone=(Nessuno) +label.sortAscending=Ascendente +label.sortDescending=Discendente +label.dueForReview=Da esaminare +label.components=Mostra +label.recordSeries=Serie record +label.parentFolder=Cartella superiore +label.currentClassification=Classificazione attuale +label.securityMarks=Contrassegni di sicurezza + +# RMA search model metadata fields +label.dispositionEvents=Eventi di conservazione +label.dispositionActionName=Nome dell'azione di conservazione +label.dispositionActionAsOf=Data di inizio azione di conservazione +label.dispositionEventsEligible=Eventi di conservazione idonei +label.vitalRecordReviewPeriod=Periodo di esame record fondamentale +label.hasDispositionSchedule=Con Programma di conservazione +label.dispositionPeriod=Periodo di conservazione +label.dispositionInstructions=Istruzioni per la conservazione +label.dispositionAuthority=Autorit\u00e0 di conservazione +label.holdReason=Motivo sospensione +label.recordCategoryIdentifier=Identificativo Categoria record diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_ja.properties new file mode 100644 index 0000000000..d3ddc70b1f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_ja.properties @@ -0,0 +1,66 @@ +message.loading=\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.empty=\u7d50\u679c\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 +message.error=\u691c\u7d22\u6761\u4ef6\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002 \u691c\u7d22\u3092\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.foundresults={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002 +message.errorloadsearches=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.errorexport=\u691c\u7d22\u7d50\u679c\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u64cd\u4f5c\u3092\u3084\u308a\u76f4\u3059\u304b\u3001IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.selectdate=\u65e5\u4ed8\u306e\u9078\u629e + +message.deletesearch.title=\u691c\u7d22\u6761\u4ef6\u306e\u524a\u9664 +message.deletesearch.description=\u691c\u7d22\u6761\u4ef6 ''{0}'' \u3092\u524a\u9664\u3059\u308b\u3068\u3001\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6\u306b\u8868\u793a\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 +message.deletesearch.success=\u691c\u7d22\u6761\u4ef6\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.deletesearch.failure=\u3053\u306e\u691c\u7d22\u6761\u4ef6\u306f\u73fe\u5728\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002 \u5f8c\u3067\u64cd\u4f5c\u3092\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.searchtitle=\u691c\u7d22 +label.searchterm=\u30c6\u30ad\u30b9\u30c8\u306e\u691c\u7d22 +label.criteria=\u6761\u4ef6 +label.results=\u7d50\u679c +label.insertfield=\u30d5\u30a3\u30fc\u30eb\u30c9\u3067\u691c\u7d22 +label.select=\u9078\u629e... +label.insertdate=\u65e5\u4ed8\u306e\u691c\u7d22 + +label.records=\u30ec\u30b3\u30fc\u30c9 (\u5b8c\u4e86\u6e08\u307f\u306e\u307f) +label.undeclared=\u672a\u5b8c\u4e86\u3092\u542b\u3080 +label.vital=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9\u306e\u307f +label.recordFolders=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0 +label.recordCategories=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea +label.frozen=\u4fdd\u7559\u4e2d\u306e\u307f (\u672a\u9078\u629e\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u9664\u304f) +label.cutoff=\u30ab\u30c3\u30c8\u30aa\u30d5\u306e\u307f + +button.newsearch=\u65b0\u898f\u691c\u7d22 +button.savesearch=\u691c\u7d22\u6761\u4ef6\u306e\u4fdd\u5b58 +button.savedsearches=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6 +button.deletesearch=\u691c\u7d22\u6761\u4ef6\u306e\u524a\u9664 +button.print=\u5370\u5237\u30ec\u30a4\u30a2\u30a6\u30c8 +button.screen=\u753b\u9762\u30ec\u30a4\u30a2\u30a6\u30c8 +button.export=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +button.add-to-hold=\u30db\u30fc\u30eb\u30c9\u306b\u8ffd\u52a0 + +# RM Results Common +label.options=\u691c\u7d22\u7d50\u679c\u30aa\u30d7\u30b7\u30e7\u30f3 +label.metadata=\u30e1\u30bf\u30c7\u30fc\u30bf +label.order=\u9806\u5e8f +label.sortFirst=\u7b2c\u4e00\u6761\u4ef6 +label.sortNext=\u6b21\u306e\u6761\u4ef6 +label.sortNone=\uff08\u306a\u3057\uff09 +label.sortAscending=\u6607\u9806 +label.sortDescending=\u964d\u9806 +label.dueForReview=\u30ec\u30d3\u30e5\u30fc\u4e88\u5b9a +label.components=\u8868\u793a +label.recordSeries=\u30ec\u30b3\u30fc\u30c9\u30b7\u30ea\u30fc\u30ba +label.parentFolder=\u89aa\u30d5\u30a9\u30eb\u30c0 +label.currentClassification=\u73fe\u5728\u306e\u5206\u985e +label.securityMarks=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30de\u30fc\u30af + +# RMA search model metadata fields +label.dispositionEvents=\u4fdd\u7ba1\u30a4\u30d9\u30f3\u30c8 +label.dispositionActionName=\u4fdd\u7ba1\u51e6\u7406\u306e\u540d\u524d +label.dispositionActionAsOf=\u4fdd\u7ba1\u51e6\u7406\u306e\u5b9f\u884c\u65e5 +label.dispositionEventsEligible=\u5b9f\u884c\u53ef\u80fd\u306a\u4fdd\u7ba1\u30a4\u30d9\u30f3\u30c8 +label.vitalRecordReviewPeriod=\u30d0\u30a4\u30bf\u30eb\u30ec\u30b3\u30fc\u30c9\u306e\u30ec\u30d3\u30e5\u30fc\u671f\u9593 +label.hasDispositionSchedule=\u4fdd\u7ba1\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3042\u308a +label.dispositionPeriod=\u4fdd\u7ba1\u671f\u9593 +label.dispositionInstructions=\u4fdd\u7ba1\u6307\u793a +label.dispositionAuthority=\u4fdd\u7ba1\u6a29\u9650 +label.holdReason=\u30db\u30fc\u30eb\u30c9\u7406\u7531 +label.recordCategoryIdentifier=\u30ec\u30b3\u30fc\u30c9\u30ab\u30c6\u30b4\u30ea ID diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_nb.properties new file mode 100644 index 0000000000..b17826d120 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_nb.properties @@ -0,0 +1,66 @@ +message.loading=Laster inn... +message.empty=Fant ingen resultater. +message.error=Det oppstod et problem med s\u00f8ket. Pr\u00f8v \u00e5 s\u00f8ke p\u00e5 nytt. +message.foundresults=Fant {0} element(er). +message.errorloadsearches=Det oppstod et problem med \u00e5 laste inn lagrede s\u00f8k. Pr\u00f8v \u00e5 oppdatere nettleseren. +message.errorexport=Det oppstod et problem med \u00e5 eksportere s\u00f8keresultater Pr\u00f8v igjen, eller kontakt din IT- avdeling. +message.selectdate=Velg dato + +message.deletesearch.title=Slett s\u00f8k +message.deletesearch.description=Hvis s\u00f8ket ''{0}'' slettes, vil det ikke v\u00e6re tilgjengelig i lagrede s\u00f8k. +message.deletesearch.success=S\u00f8ket er n\u00e5 slettet. +message.deletesearch.failure=S\u00f8ket kan ikke slettes i \u00f8yeblikket. Pr\u00f8v igjen senere. + +label.searchtitle=S\u00f8k +label.searchterm=S\u00f8ketekst +label.criteria=Kriterier +label.results=Resultater +label.insertfield=S\u00f8k etter +label.select=Velg... +label.insertdate=S\u00f8kedato + +label.records=Oppf\u00f8ringer (kun fullf\u00f8rte) +label.undeclared=Inkluder ikke-fullf\u00f8rte +label.vital=Kun sv\u00e6rt viktige +label.recordFolders=Oppf\u00f8ringsmapper +label.recordCategories=Oppf\u00f8ringskategorier +label.frozen=Kun p\u00e5 hold (ekskludert n\u00e5r ikke valgt) +label.cutoff=Kun cut off + +button.newsearch=Nytt s\u00f8k +button.savesearch=Lagre s\u00f8k +button.savedsearches=Sparte s\u00f8k +button.deletesearch=Slett s\u00f8k +button.print=Utskriftslayout +button.screen=Skjermlayout +button.export=Eksporter +button.add-to-hold=Legg til hold + +# RM Results Common +label.options=Resultatvalg +label.metadata=Metadata +label.order=Rekkef\u00f8lge +label.sortFirst=F\u00f8rst etter +label.sortNext=deretter etter +label.sortNone=(Ingen) +label.sortAscending=Stigende +label.sortDescending=Fallende +label.dueForReview=Skal gjennomg\u00e5s +label.components=Vis +label.recordSeries=Oppf\u00f8ringsserie +label.parentFolder=Overordnet mappe +label.currentClassification=N\u00e5v\u00e6rende klassifisering +label.securityMarks=Sikkerhetsmerker + +# RMA search model metadata fields +label.dispositionEvents=Retensjonshendelser +label.dispositionActionName=Navn p\u00e5 retensjonshandling +label.dispositionActionAsOf=Retensjonshandling per datoen +label.dispositionEventsEligible=Kvalifiserte retensjonshendelser +label.vitalRecordReviewPeriod=Gjennomgangsperiode til den sv\u00e6rt viktige oppf\u00f8ringen +label.hasDispositionSchedule=Har retensjonsplan +label.dispositionPeriod=Retensjonsperiode +label.dispositionInstructions=Retensjonsinstruksjoner +label.dispositionAuthority=Retensjonsrett +label.holdReason=Grunn til holdet +label.recordCategoryIdentifier=Identifikator for registerkategori diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_nl.properties new file mode 100755 index 0000000000..f3333e6f83 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_nl.properties @@ -0,0 +1,66 @@ +message.loading=Laden... +message.empty=Geen resultaten gevonden. +message.error=Er is een probleem opgetreden bij de zoekopdracht. Voer de zoekopdracht opnieuw uit. +message.foundresults={0} item(s) gevonden. +message.errorloadsearches=Er is een probleem opgetreden het laden van opgeslagen zoekopdrachten. Vernieuw de browser. +message.errorexport=Er is een probleem opgetreden bij het exporteren van zoekresultaten. Probeer het opnieuw of neem contact op met uw IT-afdeling +message.selectdate=Datum selecteren + +message.deletesearch.title=Zoekopdracht verwijderen +message.deletesearch.description=Als u de zoekopdracht ''{0}'' verwijdert, is deze niet beschikbaar in de opgeslagen zoekopdrachten. +message.deletesearch.success=Zoekopdracht is verwijderd. +message.deletesearch.failure=Kan de zoekopdracht nu niet verwijderen. Probeer het later opnieuw. + +label.searchtitle=Zoeken +label.searchterm=Tekst zoeken +label.criteria=Criteria +label.results=Resultaten +label.insertfield=Zoeken op +label.select=Selecteren... +label.insertdate=Datum zoeken + +label.records=Archiefstukken (alleen afgeronde) +label.undeclared=Inclusief niet-afgeronde +label.vital=Alleen vitale +label.recordFolders=Archiefmappen +label.recordCategories=Archiefstukcategorie\u00ebn +label.frozen=Alleen in bewaring (uitgesloten wanneer niet geselecteerd) +label.cutoff=Alleen afgesloten + +button.newsearch=Nieuwe zoekopdracht +button.savesearch=Zoekopdracht opslaan +button.savedsearches=Opgeslagen zoekopdrachten +button.deletesearch=Zoekopdracht verwijderen +button.print=Afdrukindeling +button.screen=Schermindeling +button.export=Exporteren +button.add-to-hold=Toevoegen aan bewaring + +# RM Results Common +label.options=Resultaatopties +label.metadata=Metagegevens +label.order=Volgorde +label.sortFirst=Eerst op +label.sortNext=dan op +label.sortNone=(Geen) +label.sortAscending=Oplopend +label.sortDescending=Aflopend +label.dueForReview=Gereed voor revisie +label.components=Weergeven +label.recordSeries=Archiefstukreeks +label.parentFolder=Bovenliggende map +label.currentClassification=Huidige classificatie +label.securityMarks=Beveiligingsmarkeringen + +# RMA search model metadata fields +label.dispositionEvents=Retentiegebeurtenissen +label.dispositionActionName=Naam retentieactie +label.dispositionActionAsOf=Begindatum retentieactie +label.dispositionEventsEligible=In aanmerking komende retentiegebeurtenissen +label.vitalRecordReviewPeriod=Revisieperiode vitaal archiefstuk +label.hasDispositionSchedule=Heeft retentieschema +label.dispositionPeriod=Retentieperiode +label.dispositionInstructions=Retentie-instructies +label.dispositionAuthority=Retentieautoriteit +label.holdReason=Reden van bewaring +label.recordCategoryIdentifier=Id archiefstukcategorie diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_pt_BR.properties new file mode 100644 index 0000000000..f00d89f8a6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_pt_BR.properties @@ -0,0 +1,66 @@ +message.loading=Carregando... +message.empty=Nenhum resultado encontrado. +message.error=Houve um problema com a pesquisa. Tente pesquisar novamente. +message.foundresults={0} item(ns) encontrado(s). +message.errorloadsearches=Ocorreu um problema ao carregar pesquisas salvas. Tente atualizar seu navegador. +message.errorexport=Ocorreu um problema ao exportar os resultados da pesquisa. Tente novamente ou entre em contato com o Dept. de TI. +message.selectdate=Selecionar data + +message.deletesearch.title=Excluir pesquisa +message.deletesearch.description=Se voc\u00ea excluir a pesquisa ''{0}'', ela n\u00e3o ficar\u00e1 dispon\u00edvel nas pesquisas salvas. +message.deletesearch.success=Pesquisa foi exclu\u00edda com sucesso. +message.deletesearch.failure=N\u00e3o foi poss\u00edvel excluir a pesquisa neste momento. Tente novamente mais tarde. + +label.searchtitle=Pesquisar +label.searchterm=Texto de pesquisa +label.criteria=Crit\u00e9rios +label.results=Resultados +label.insertfield=Pesquisa por +label.select=Selecionar... +label.insertdate=Data da pesquisa + +label.records=Documentos arquiv\u00edsticos (apenas conclu\u00eddos) +label.undeclared=Incluir incompletos +label.vital=Apenas vitais +label.recordFolders=Pastas de documentos arquiv\u00edsticos +label.recordCategories=Categorias de documentos arquiv\u00edsticos +label.frozen=Apenas em espera (Exclu\u00eddos quando n\u00e3o selecionados) +label.cutoff=Apenas cortados + +button.newsearch=Nova pesquisa +button.savesearch=Salvar pesquisa +button.savedsearches=Pesquisas salvas +button.deletesearch=Excluir pesquisa +button.print=Imprimir layout +button.screen=Layout da tela +button.export=Exportar +button.add-to-hold=Adicionar \u00e0 espera + +# RM Results Common +label.options=Op\u00e7\u00f5es de resultados +label.metadata=Metadados +label.order=Ordenar +label.sortFirst=Primeiro por +label.sortNext=depois por +label.sortNone=(Nenhum) +label.sortAscending=Crescente +label.sortDescending=Decrescente +label.dueForReview=Prazo para revis\u00e3o +label.components=Mostrar +label.recordSeries=S\u00e9rie de documentos arquiv\u00edsticos +label.parentFolder=Pasta prim\u00e1ria +label.currentClassification=Classifica\u00e7\u00e3o atual +label.securityMarks=Marcas de seguran\u00e7a + +# RMA search model metadata fields +label.dispositionEvents=Eventos de reten\u00e7\u00e3o +label.dispositionActionName=Nome da a\u00e7\u00e3o de reten\u00e7\u00e3o +label.dispositionActionAsOf=Data de in\u00edcio da a\u00e7\u00e3o de reten\u00e7\u00e3o +label.dispositionEventsEligible=Eventos de reten\u00e7\u00e3o qualificados +label.vitalRecordReviewPeriod=Per\u00edodo de revis\u00e3o do documento arquiv\u00edstico vital +label.hasDispositionSchedule=Tem programa\u00e7\u00e3o de reten\u00e7\u00e3o +label.dispositionPeriod=Per\u00edodo de reten\u00e7\u00e3o +label.dispositionInstructions=Instru\u00e7\u00f5es de reten\u00e7\u00e3o +label.dispositionAuthority=Autoridade de reten\u00e7\u00e3o +label.holdReason=Motivo para espera +label.recordCategoryIdentifier=Identificador da categoria de documento arquiv\u00edstico diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_ru.properties new file mode 100644 index 0000000000..cdd2ab20b4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_ru.properties @@ -0,0 +1,66 @@ +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430... +message.empty=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b. +message.error=\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430. +message.foundresults=\u041d\u0430\u0439\u0434\u0435\u043d\u043e {0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. +message.errorloadsearches=\u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. +message.errorexport=\u041f\u0440\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.selectdate=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443 + +message.deletesearch.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a +message.deletesearch.description=\u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a ''{0}'', \u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u0430\u0445. +message.deletesearch.success=\u041f\u043e\u0438\u0441\u043a \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d. +message.deletesearch.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435. + +label.searchtitle=\u041f\u043e\u0438\u0441\u043a +label.searchterm=\u0418\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 +label.criteria=\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 +label.results=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b +label.insertfield=\u041f\u043e\u0438\u0441\u043a \u043f\u043e +label.select=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435... +label.insertdate=\u0414\u0430\u0442\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 + +label.records=\u0417\u0430\u043f\u0438\u0441\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435) +label.undeclared=\u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 +label.vital=\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 +label.recordFolders=\u041f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.recordCategories=\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.frozen=\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 (\u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e) +label.cutoff=\u0422\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0435 + +button.newsearch=\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0438\u0441\u043a +button.savesearch=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a +button.savedsearches=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0438\u0441\u043a\u0438 +button.deletesearch=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a +button.print=\u0420\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b +button.screen=\u0412\u0438\u0434 \u044d\u043a\u0440\u0430\u043d\u0430 +button.export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 +button.add-to-hold=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c + +# RM Results Common +label.options=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 +label.metadata=\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +label.order=\u041f\u043e\u0440\u044f\u0434\u043e\u043a +label.sortFirst=\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e +label.sortNext=\u043f\u043e\u0442\u043e\u043c \u043f\u043e +label.sortNone=(\u041d\u0435\u0442) +label.sortAscending=\u041f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e +label.sortDescending=\u041f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e +label.dueForReview=\u041f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 +label.components=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c +label.recordSeries=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.parentFolder=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +label.currentClassification=\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u0430\u0441\u0435\u043a\u0440\u0435\u0447\u0438\u0432\u0430\u043d\u0438\u0435 +label.securityMarks=\u041c\u0435\u0442\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 + +# RMA search model metadata fields +label.dispositionEvents=\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.dispositionActionName=\u0418\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e +label.dispositionActionAsOf=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u043d\u0430 \u0434\u0430\u0442\u0443 +label.dispositionEventsEligible=\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.vitalRecordReviewPeriod=\u041f\u0435\u0440\u0438\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 +label.hasDispositionSchedule=\u0415\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.dispositionPeriod=\u041f\u0435\u0440\u0438\u043e\u0434 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +label.dispositionInstructions=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e +label.dispositionAuthority=\u041f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 +label.holdReason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +label.recordCategoryIdentifier=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_zh_CN.properties new file mode 100644 index 0000000000..c54a15c7f5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/search/search.get_zh_CN.properties @@ -0,0 +1,66 @@ +message.loading=\u52a0\u8f7d\u4e2d... +message.empty=\u672a\u627e\u5230\u7ed3\u679c\u3002 +message.error=\u641c\u7d22\u51fa\u73b0\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u91cd\u65b0\u641c\u7d22\u3002 +message.foundresults=\u627e\u5230 {0} \u4e2a\u9879\u76ee\u3002 +message.errorloadsearches=\u52a0\u8f7d\u4fdd\u5b58\u7684\u641c\u7d22\u65f6\u51fa\u73b0\u95ee\u9898\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 +message.errorexport=\u5bfc\u51fa\u641c\u7d22\u7ed3\u679c\u65f6\u51fa\u73b0\u95ee\u9898\u3002 \u8bf7\u91cd\u8bd5\u6216\u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.selectdate=\u9009\u62e9\u65e5\u671f + +message.deletesearch.title=\u5220\u9664\u641c\u7d22 +message.deletesearch.description=\u5982\u679c\u60a8\u5220\u9664\u641c\u7d22 ''{0}''\uff0c\u5219\u5176\u5728\u4fdd\u5b58\u7684\u641c\u7d22\u4e2d\u5c06\u4e0d\u53ef\u7528\u3002 +message.deletesearch.success=\u5df2\u6210\u529f\u5220\u9664\u641c\u7d22\u3002 +message.deletesearch.failure=\u6211\u4eec\u65e0\u6cd5\u7acb\u5373\u5220\u9664\u641c\u7d22\u3002 \u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002 + +label.searchtitle=\u641c\u7d22 +label.searchterm=\u641c\u7d22\u95ee\u9898 +label.criteria=\u6761\u4ef6 +label.results=\u7ed3\u679c +label.insertfield=\u641c\u7d22\u6807\u51c6 +label.select=\u9009\u62e9... +label.insertdate=\u641c\u7d22\u65e5\u671f + +label.records=\u8bb0\u5f55\uff08\u4ec5\u5b8c\u6210\u7684\u8bb0\u5f55\uff09 +label.undeclared=\u5305\u62ec\u4e0d\u5b8c\u6574\u8bb0\u5f55 +label.vital=\u4ec5\u6838\u5fc3\u8bb0\u5f55 +label.recordFolders=\u8bb0\u5f55\u6587\u4ef6\u5939 +label.recordCategories=\u8bb0\u5f55\u7c7b\u522b +label.frozen=\u4ec5\u4fdd\u5b58\u4e2d\u7684\u8bb0\u5f55\uff08\u672a\u9009\u62e9\u65f6\u6392\u9664\uff09 +label.cutoff=\u4ec5\u4e2d\u65ad\u8bb0\u5f55 + +button.newsearch=\u65b0\u5efa\u641c\u7d22 +button.savesearch=\u4fdd\u5b58\u641c\u7d22 +button.savedsearches=\u4fdd\u5b58\u7684\u641c\u7d22 +button.deletesearch=\u5220\u9664\u641c\u7d22 +button.print=\u6253\u5370\u5e03\u5c40 +button.screen=\u5c4f\u5e55\u5e03\u5c40 +button.export=\u5bfc\u51fa +button.add-to-hold=\u52a0\u5165\u4fdd\u5b58 + +# RM Results Common +label.options=\u7ed3\u679c\u9009\u9879 +label.metadata=\u5143\u6570\u636e +label.order=\u987a\u5e8f +label.sortFirst=\u9996\u5148\u6309 +label.sortNext=\u7136\u540e\u6309 +label.sortNone=\uff08\u65e0\uff09 +label.sortAscending=\u5347\u5e8f +label.sortDescending=\u964d\u5e8f +label.dueForReview=\u5ba1\u67e5\u5230\u671f +label.components=\u663e\u793a +label.recordSeries=\u8bb0\u5f55\u7cfb\u5217 +label.parentFolder=\u7236\u6587\u4ef6\u5939 +label.currentClassification=\u5f53\u524d\u5206\u7c7b +label.securityMarks=\u5b89\u5168\u6807\u8bb0 + +# RMA search model metadata fields +label.dispositionEvents=\u4fdd\u7559\u4e8b\u4ef6 +label.dispositionActionName=\u4fdd\u7559\u64cd\u4f5c\u540d\u79f0 +label.dispositionActionAsOf=\u4fdd\u7559\u64cd\u4f5c\u622a\u6b62\u65e5\u671f +label.dispositionEventsEligible=\u7b26\u5408\u4fdd\u7559\u4e8b\u4ef6\u6761\u4ef6 +label.vitalRecordReviewPeriod=\u6838\u5fc3\u8bb0\u5f55\u5ba1\u67e5\u671f\u95f4 +label.hasDispositionSchedule=\u6709\u4fdd\u7559\u8ba1\u5212 +label.dispositionPeriod=\u4fdd\u7559\u5468\u671f +label.dispositionInstructions=\u4fdd\u7559\u8bf4\u660e +label.dispositionAuthority=\u4fdd\u7559\u6388\u6743 +label.holdReason=\u4fdd\u5b58\u539f\u56e0 +label.recordCategoryIdentifier=\u8bb0\u5f55\u7c7b\u522b\u6807\u8bc6\u7b26 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.desc.xml new file mode 100644 index 0000000000..2e92d3ec61 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.desc.xml @@ -0,0 +1,5 @@ + + RM Drag and drop upload + RM Drag and drop upload component that shows the progress of uploading multiple files + /rm/components/upload/dnd-upload + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.html.ftl new file mode 100644 index 0000000000..8295246743 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.html.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@script type="text/javascript" src="${url.context}/res/components/upload/dnd-upload.js" group="upload"/> +<@script type="text/javascript" src="${url.context}/res/rm/components/upload/dnd-upload.js" group="upload"/> + +<#include "/org/alfresco/components/upload/dnd-upload.get.html.ftl" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.js new file mode 100644 index 0000000000..a73b576c4d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.js @@ -0,0 +1,30 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +model.widgets[0].name = "Alfresco.rm.component.DNDUpload"; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.properties new file mode 100644 index 0000000000..74e1c0d7eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get.properties @@ -0,0 +1,43 @@ +header.singleUpload=Upload File +header.multiUpload.singleFile=Upload File to {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Update File +header.error=Error + +label.noFiles=Loading files... +label.documents=Files +label.success=Success +label.failure=Unsuccessful: {0} +label.failure.413=Failure: Quota exceeded +label.failure.409=Failure: Content size to large +label.failure.fileTooBig=Failure: File greater than 25MB +label.uploadStatus={0} of {1} files complete +label.uploadStatus.withFailures={0} of {1} files complete ({2} unsuccessful) +label.aggregateUploadStatus=Uploading {0} files ({1}) +message.cancelStatus=Upload(s) cancelled; {0} file(s) uploaded +message.zeroByteFileSelected=File {0} is 0b in size and cannot be uploaded. +message.zeroByteFiles=The following cannot be uploaded because they are either folders or are zero bytes in size: {0} +message.illegalCharacters=File {0} contains characters that are illegal on some operating system. +message.maxFileFileSizeExceeded=File {0} is too big ({1}), maximum file size {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Version Information +label.version=This version has: +label.minorVersion=minor changes +label.majorVersion=major changes +label.minorVersion.more=minor changes ({0}) +label.majorVersion.more=major changes ({0}) +label.comments=Comments + +type.cm_content=Content + +inmemory.uploadsize.exceeded=Your browser doesn't support drag and drop uploads where the total size of dropped files is greater than {0} + + +# RM Specific properties +header.multiUpload=File Records +button.selectFiles=Select Records to File + +header.import=Import +button.selectImportFile=Select Import File \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_de.properties new file mode 100644 index 0000000000..7970082ae6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_de.properties @@ -0,0 +1,43 @@ +header.singleUpload=Datei hochladen +header.multiUpload.singleFile=Datei auf {0} hochladen +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Datei aktualisieren +header.error=Fehler + +label.noFiles=Dateien werden geladen... +label.documents=Dateien +label.success=Erfolg +label.failure=Fehlgeschlagen: {0} +label.failure.413=Fehler: Kontingent \u00fcberschritten +label.failure.409=Fehler: Gr\u00f6\u00dfe des Inhalts zu umfangreich +label.failure.fileTooBig=Fehler: Die Datei ist gr\u00f6\u00dfer als 25 MB +label.uploadStatus={0} von {1} Dateien abgeschlossen +label.uploadStatus.withFailures={0} von {1} Dateien abgeschlossen ({2} fehlgeschlagen) +label.aggregateUploadStatus={0} Dateien werden hochgeladen ({1}) +message.cancelStatus=Upload(s) abgebrochen; {0} Datei(en) hochgeladen +message.zeroByteFileSelected=Die Datei {0} ist 0 Byte gro\u00df und kann nicht hochgeladen werden. +message.zeroByteFiles=Die folgenden Elemente k\u00f6nnen nicht hochgeladen werden, weil sie entweder Ordner sind oder eine Gr\u00f6\u00dfe von 0\u00a0Byte haben: {0} +message.illegalCharacters=Die Datei {0} enth\u00e4lt Zeichen, die bei einigen Betriebssystemen unzul\u00e4ssig sind. +message.maxFileFileSizeExceeded=Die Datei {0} ist zu gro\u00df ({1}), die maximale Dateigr\u00f6\u00dfe betr\u00e4gt {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Angaben zur Version +label.version=Diese Version: +label.minorVersion=kleine \u00c4nderungen +label.majorVersion=bedeutende \u00c4nderungen +label.minorVersion.more=kleine \u00c4nderungen ({0}) +label.majorVersion.more=bedeutende \u00c4nderungen ({0}) +label.comments=Kommentare + +type.cm_content=Inhalt + +inmemory.uploadsize.exceeded=Ihr Browser unterst\u00fctzt keine Drag-and-Drop-Uploads von abgelegten Dateien mit einer Gesamtgr\u00f6\u00dfe von mehr als {0}. + + +# RM Specific properties +header.multiUpload=Records ablegen +button.selectFiles=Abzulegende Records ausw\u00e4hlen + +header.import=Importieren +button.selectImportFile=Zu importierende Datei w\u00e4hlen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_es.properties new file mode 100644 index 0000000000..a1bcea7a98 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_es.properties @@ -0,0 +1,43 @@ +header.singleUpload=Cargar fichero +header.multiUpload.singleFile=Cargar fichero a {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Actualizar fichero +header.error=Error + +label.noFiles=Cargando ficheros... +label.documents=Ficheros +label.success=Completado +label.failure=Incorrecto: {0} +label.failure.413=Error: Cuota excedida +label.failure.409=Error: Tama\u00f1o del contenido demasiado grande +label.failure.fileTooBig=Error: El fichero ocupa m\u00e1s de 25 MB +label.uploadStatus={0} de {1} ficheros completados +label.uploadStatus.withFailures={0} de {1} ficheros completados ({2} incorrectos) +label.aggregateUploadStatus=Cargando {0} fichero(s) ({1}) +message.cancelStatus=Carga(s) cancelada(s); {0} fichero(s) cargado(s) +message.zeroByteFileSelected=El fichero {0} no tiene ning\u00fan contenido y no se puede cargar. +message.zeroByteFiles=Los siguientes elementos no se pueden cargar porque son carpetas o el tama\u00f1o indica que no tienen contenido: {0} +message.illegalCharacters=El fichero {0} contiene caracteres que no se admiten en algunos sistemas operativos. +message.maxFileFileSizeExceeded=El fichero {0} es demasiado grande ({1}), el tama\u00f1o de fichero m\u00e1ximo es de {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Informaci\u00f3n de la versi\u00f3n +label.version=Esta versi\u00f3n tiene: +label.minorVersion=cambios menores +label.majorVersion=cambios mayores +label.minorVersion.more=cambios menores ({0}) +label.majorVersion.more=cambios mayores ({0}) +label.comments=Comentarios + +type.cm_content=Contenido + +inmemory.uploadsize.exceeded=Su navegador no permite cargar ficheros arrastrando y soltando cuando el tama\u00f1o total de los ficheros soltados excede {0} + + +# RM Specific properties +header.multiUpload=Archivar documentos de archivo +button.selectFiles=Seleccionar documentos de archivo a archivar + +header.import=Importar +button.selectImportFile=Seleccionar Importar fichero diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_fr.properties new file mode 100644 index 0000000000..97a5f177e4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_fr.properties @@ -0,0 +1,43 @@ +header.singleUpload=Importer un fichier +header.multiUpload.singleFile=Importer le fichier dans {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Mettre le fichier \u00e0 jour +header.error=Erreur + +label.noFiles=Chargement des fichiers... +label.documents=Fichiers +label.success=Succ\u00e8s +label.failure=Echec(s) : {0} +label.failure.413=Echec : quota d\u00e9pass\u00e9 +label.failure.409=Echec : taille de contenu excessive +label.failure.fileTooBig=Echec : Fichier sup\u00e9rieur \u00e0 25 Mo +label.uploadStatus={0} fichiers sur {1} effectu\u00e9s +label.uploadStatus.withFailures={0} fichiers sur {1} effectu\u00e9s ({2} \u00e9chec(s)) +label.aggregateUploadStatus=Importation de {0} fichiers ({1}) +message.cancelStatus=Importation(s) annul\u00e9e(s)\u00a0; {0} fichier(s) import\u00e9(s) +message.zeroByteFileSelected=La taille du fichier {0} est nulle et ce dernier ne peut pas \u00eatre import\u00e9. +message.zeroByteFiles=Le contenu suivant ne peut pas \u00eatre import\u00e9, soit parce qu''il s''agit de dossiers, soit parce que la taille de l''importation est de z\u00e9ro octet : {0} +message.illegalCharacters=Le fichier {0} contient des caract\u00e8res qui sont ill\u00e9gaux sur certains syst\u00e8mes d''exploitation. +message.maxFileFileSizeExceeded=Le fichier {0} est trop volumineux ({1}), taille de fichier maximale {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Informations de version +label.version=Cette version contient : +label.minorVersion=changements mineurs +label.majorVersion=changements majeurs +label.minorVersion.more=changements mineurs ({0}) +label.majorVersion.more=changements majeurs ({0}) +label.comments=Commentaires + +type.cm_content=Contenu + +inmemory.uploadsize.exceeded=Votre navigateur ne prend pas en charge les importations par glisser-d\u00e9poser lorsque le volume total des fichiers import\u00e9s d\u00e9passe {0} + + +# RM Specific properties +header.multiUpload=Classer des documents d'archives +button.selectFiles=S\u00e9lectionner les documents d'archives \u00e0 archiver + +header.import=Importer +button.selectImportFile=S\u00e9lectionner le fichier d'importation diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_it.properties new file mode 100644 index 0000000000..765f2fdd82 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_it.properties @@ -0,0 +1,43 @@ +header.singleUpload=Carica file +header.multiUpload.singleFile=Carica file in {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Aggiorna file +header.error=Errore + +label.noFiles=Caricamento file... +label.documents=File +label.success=Operazione riuscita +label.failure=Operazione non riuscita: {0} +label.failure.413=Operazione non riuscita: quota superata +label.failure.409=Operazione non riuscita: contenuto troppo grande +label.failure.fileTooBig=Operazione non riuscita: il file \u00e8 supera 25 MB +label.uploadStatus={0} file su {1} completati +label.uploadStatus.withFailures={0} di {1} file completati ({2} non completati) +label.aggregateUploadStatus=Caricamento di {0} file ({1}) +message.cancelStatus=Caricamenti annullati; {0} file caricati +message.zeroByteFileSelected=Impossibile caricare il file {0} poich\u00e9 ha dimensioni pari a 0 byte. +message.zeroByteFiles=Impossibile caricare i seguenti elementi poich\u00e9 sono cartelle o la loro dimensione \u00e8 pari a zero byte: {0} +message.illegalCharacters=Il file {0} contiene caratteri non validi per alcuni sistemi operativi. +message.maxFileFileSizeExceeded=Il file {0} \u00e8 troppo grande ({1}) rispetto al valore massimo consentito {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Informazioni sulla versione +label.version=Questa versione presenta: +label.minorVersion=modifiche minori +label.majorVersion=modifiche maggiori +label.minorVersion.more=modifiche minori ({0}) +label.majorVersion.more=modifiche maggiori ({0}) +label.comments=Commenti + +type.cm_content=Contenuto + +inmemory.uploadsize.exceeded=Il browser non supporta caricamenti mediante trascinamento quando la dimensione totale dei file rilasciati supera {0} + + +# RM Specific properties +header.multiUpload=Archivia record +button.selectFiles=Seleziona record da archiviare + +header.import=Importa +button.selectImportFile=Seleziona file da importare diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_ja.properties new file mode 100644 index 0000000000..c2034502b2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_ja.properties @@ -0,0 +1,43 @@ +header.singleUpload=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +header.multiUpload.singleFile=\u30d5\u30a1\u30a4\u30eb\u3092 {0} \u3078\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +#header.multiUpload=Upload Files to {0} +header.singleUpdate=\u30d5\u30a1\u30a4\u30eb\u306e\u66f4\u65b0 +header.error=\u30a8\u30e9\u30fc + +label.noFiles=\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +label.documents=\u30d5\u30a1\u30a4\u30eb +label.success=\u6210\u529f +label.failure=\u5931\u6557: {0} +label.failure.413=\u5931\u6557: \u30af\u30a9\u30fc\u30bf\u8d85\u904e +label.failure.409=\u5931\u6557: \u30b3\u30f3\u30c6\u30f3\u30c4\u30b5\u30a4\u30ba\u306e\u904e\u5927 +label.failure.fileTooBig=\u5931\u6557: 25 MB \u3092\u8d85\u3048\u308b\u30d5\u30a1\u30a4\u30eb +label.uploadStatus={1} \u500b\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u5185 {0} \u500b\u5b8c\u4e86 +label.uploadStatus.withFailures={1} \u500b\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u3046\u3061 {0} \u500b\u5b8c\u4e86 ({2} \u500b\u5931\u6557) +label.aggregateUploadStatus=({1})\u30d5\u30a1\u30a4\u30eb\u306e{0} \u500b\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d +message.cancelStatus=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002{0} \u500b\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f +message.zeroByteFileSelected=\u30d5\u30a1\u30a4\u30eb "{0}" \u306e\u30b5\u30a4\u30ba\u304c 0 \u30d0\u30a4\u30c8\u3067\u3042\u308b\u305f\u3081\u3001\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3002 +message.zeroByteFiles=\u6b21\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u30d5\u30a9\u30eb\u30c0\u304b\u3001\u30b5\u30a4\u30ba\u304c 0 \u30d0\u30a4\u30c8\u3067\u3042\u308b\u305f\u3081\u3001\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093: {0} +message.illegalCharacters=\u30d5\u30a1\u30a4\u30eb "{0}" \u306b\u3001\u4e00\u90e8\u306e\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u3067\u4f7f\u7528\u3067\u304d\u306a\u3044\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002 +message.maxFileFileSizeExceeded=\u30d5\u30a1\u30a4\u30eb "{0}" \u306f\u5927\u304d\u3059\u304e\u307e\u3059 ({1})\u3002\u6700\u5927\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306f {2} \u3067\u3059\u3002 + +#button.selectFiles=Select Files to Upload + +section.version=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +label.version=\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306e\u6539\u8a02: +label.minorVersion=\u82e5\u5e72\u306e\u5909\u66f4 +label.majorVersion=\u5927\u5e45\u306a\u5909\u66f4 +label.minorVersion.more=\u82e5\u5e72\u306e\u5909\u66f4 ({0}) +label.majorVersion.more=\u5927\u5e45\u306a\u5909\u66f4 ({0}) +label.comments=\u30b3\u30e1\u30f3\u30c8 + +type.cm_content=\u30b3\u30f3\u30c6\u30f3\u30c4 + +inmemory.uploadsize.exceeded=\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306f\u3001\u30c9\u30ed\u30c3\u30d7\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u5408\u8a08\u30b5\u30a4\u30ba\u304c {0} \u3092\u8d85\u3048\u308b\u5834\u5408\u306f\u3001\u30c9\u30e9\u30c3\u30b0 & \u30c9\u30ed\u30c3\u30d7\u3067\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3002 + + +# RM Specific properties +header.multiUpload=\u30ec\u30b3\u30fc\u30c9\u306e\u6574\u7406\u4fdd\u7ba1 +button.selectFiles=\u6574\u7406\u4fdd\u7ba1\u3059\u308b\u30ec\u30b3\u30fc\u30c9\u306e\u9078\u629e + +header.import=\u30a4\u30f3\u30dd\u30fc\u30c8 +button.selectImportFile=\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u9078\u629e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_nb.properties new file mode 100644 index 0000000000..1b60fcbd2e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_nb.properties @@ -0,0 +1,43 @@ +header.singleUpload=Last opp fil +header.multiUpload.singleFile=Last fil opp til {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Oppdater fil +header.error=Feil + +label.noFiles=Laster filer... +label.documents=Filer +label.success=Vellykket +label.failure=Mislykket: {0} +label.failure.413=Feil: Kvote overskredet +label.failure.409=Feil: St\u00f8rrelsen p\u00e5 innholdet er for stort +label.failure.fileTooBig=Feil: Filen er st\u00f8rre enn 25 MB +label.uploadStatus={0} av {1} filer er fullf\u00f8rt +label.uploadStatus.withFailures={0} av {1} filer er fullf\u00f8rt ({2} mislykket) +label.aggregateUploadStatus=Laster opp {0} filer ({1}) +message.cancelStatus=Opplasting(er) avbrutt. {0} fil(er) lastet opp +message.zeroByteFileSelected=Filen {0} har en st\u00f8rrelse p\u00e5 0\u00a0b og kan ikke lastes opp. +message.zeroByteFiles=F\u00f8lgende kan ikke lastes opp fordi de enten er mapper eller de har en st\u00f8rrelse p\u00e5 null byte: {0} +message.illegalCharacters=Filen {0} inneholder tegn som er ulovlige p\u00e5 noen operativsystemer. +message.maxFileFileSizeExceeded=Filen {0} er for stor ({1}), maks. filst\u00f8rrelse {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Versjonsinformasjon +label.version=Denne versjonen har: +label.minorVersion=mindre endringer +label.majorVersion=st\u00f8rre endringer +label.minorVersion.more=mindre endringer ({0}) +label.majorVersion.more=st\u00f8rre endringer ({0}) +label.comments=Kommentarer + +type.cm_content=Innhold + +inmemory.uploadsize.exceeded=Nettleseren st\u00f8tter ikke dra-og-slipp-opplastinger n\u00e5r den totale st\u00f8rrelsen p\u00e5 filene som slippes overskrider {0} + + +# RM Specific properties +header.multiUpload=Arkivere oppf\u00f8ringer +button.selectFiles=Velg oppf\u00f8ringene som skal registreres + +header.import=Importer +button.selectImportFile=Velg importfil diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_nl.properties new file mode 100755 index 0000000000..087156a4b1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_nl.properties @@ -0,0 +1,43 @@ +header.singleUpload=Bestand uploaden +header.multiUpload.singleFile=Bestand uploaden naar {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Bestand bijwerken +header.error=Fout + +label.noFiles=Bestanden laden... +label.documents=Bestanden +label.success=Geslaagd +label.failure=Niet geslaagd: {0} +label.failure.413=Mislukt: quotum overschreden +label.failure.409=Mislukt: inhoud te groot +label.failure.fileTooBig=Mislukt: bestand groter dan 25 MB +label.uploadStatus={0} van {1} bestanden afgerond +label.uploadStatus.withFailures={0} van {1} bestanden afgerond ({2} niet geslaagd) +label.aggregateUploadStatus=Bezig met uploaden van {0} bestanden ({1}) +message.cancelStatus=Upload(s) geannuleerd; {0} bestand(en) ge\u00fcpload +message.zeroByteFileSelected=Bestand {0} heeft een grootte van 0b en kan niet worden ge\u00fcpload. +message.zeroByteFiles=De volgende objecten kunnen niet worden ge\u00fcpload omdat het mappen zijn of omdat ze een grootte hebben van nul bytes: {0} +message.illegalCharacters=Bestand {0} bevat tekens die op sommige besturingssystemen niet toegestaan zijn. +message.maxFileFileSizeExceeded=Bestand {0} is te groot ({1}), maximale bestandsgrootte {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Versie-informatie +label.version=Deze versie heeft: +label.minorVersion=kleine wijzigingen +label.majorVersion=grote wijzigingen +label.minorVersion.more=kleine wijzigingen ({0}) +label.majorVersion.more=grote wijzigingen ({0}) +label.comments=Opmerkingen + +type.cm_content=Content + +inmemory.uploadsize.exceeded=Uw browser ondersteunt geen uploads door middel van slepen waarvoor de totale grootte van de geplaatste bestanden meer is dan {0} + + +# RM Specific properties +header.multiUpload=Archiefstukken archiveren +button.selectFiles=Archiefstukken selecteren om te archiveren + +header.import=Importeren +button.selectImportFile=Importbestand selecteren diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_pt_BR.properties new file mode 100644 index 0000000000..c8d35ce851 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_pt_BR.properties @@ -0,0 +1,43 @@ +header.singleUpload=Carregar arquivo +header.multiUpload.singleFile=Carregar arquivo em {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=Atualizar arquivo +header.error=Erro + +label.noFiles=Carregando arquivos... +label.documents=Arquivos +label.success=Sucesso +label.failure=Malsucedido: {0} +label.failure.413=Falha: Cota excedida +label.failure.409=Falha: Tamanho de conte\u00fado muito grande +label.failure.fileTooBig=Falha: Arquivo maior que 25 MB +label.uploadStatus={0} de {1} arquivos conclu\u00eddos +label.uploadStatus.withFailures={0} de {1} arquivos conclu\u00eddos ({2} com falha) +label.aggregateUploadStatus=Carregando {0} arquivos ({1}) +message.cancelStatus=Carregamento(s) cancelado(s). {0} arquivo(s) carregado(s) +message.zeroByteFileSelected=O arquivo ''{0}'' tem 0 b de tamanho e n\u00e3o pode ser carregado. +message.zeroByteFiles=Os seguintes itens n\u00e3o podem ser carregados porque s\u00e3o pastas ou t\u00eam zero byte de tamanho: ''{0}'' +message.illegalCharacters=O arquivo {0} cont\u00e9m caracteres ilegais em algum sistema operacional. +message.maxFileFileSizeExceeded=O arquivo {0} \u00e9 muito grande ({1}). Tamanho m\u00e1ximo de arquivo de {2}. + +#button.selectFiles=Select Files to Upload + +section.version=Informa\u00e7\u00f5es de vers\u00e3o +label.version=Esta vers\u00e3o possui: +label.minorVersion=altera\u00e7\u00f5es secund\u00e1rias +label.majorVersion=altera\u00e7\u00f5es principais +label.minorVersion.more=altera\u00e7\u00f5es secund\u00e1rias ({0}) +label.majorVersion.more=altera\u00e7\u00f5es principais ({0}) +label.comments=Coment\u00e1rios + +type.cm_content=Conte\u00fado + +inmemory.uploadsize.exceeded=Seu navegador n\u00e3o suporta carregamentos com o recurso de arrastar e soltar em que o tamanho total dos arquivos soltos \u00e9 maior do que {0} + + +# RM Specific properties +header.multiUpload=Arquivar documentos arquiv\u00edsticos +button.selectFiles=Selecionar documentos arquiv\u00edsticos a arquivar + +header.import=Importar +button.selectImportFile=Selecionar arquivo a importar diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_ru.properties new file mode 100644 index 0000000000..82b30f626c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_ru.properties @@ -0,0 +1,43 @@ +header.singleUpload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b +header.multiUpload.singleFile=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0432 {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b +header.error=\u041e\u0448\u0438\u0431\u043a\u0430 + +label.noFiles=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432... +label.documents=\u0424\u0430\u0439\u043b\u044b +label.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e +label.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c: {0} +label.failure.413=\u0421\u0431\u043e\u0439: \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430 \u043a\u0432\u043e\u0442\u0430 +label.failure.409=\u0421\u0431\u043e\u0439: \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e +label.failure.fileTooBig=\u0421\u0431\u043e\u0439: \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 25 \u041c\u0411 +label.uploadStatus=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043b\u043e\u0432: {0} \u0438\u0437 {1} +label.uploadStatus.withFailures=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043b\u043e\u0432: {0} \u0438\u0437 {1} (\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c {2}) +label.aggregateUploadStatus=\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b: {0} ({1}) +message.cancelStatus=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u044b; \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: {0} +message.zeroByteFileSelected=\u0424\u0430\u0439\u043b {0} \u0438\u043c\u0435\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. +message.zeroByteFiles=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u043b\u0438\u0431\u043e \u0438\u043c\u0435\u044e\u0442 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440: {0} +message.illegalCharacters=\u0424\u0430\u0439\u043b {0} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. +message.maxFileFileSizeExceeded=\u0424\u0430\u0439\u043b {0} \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440: ({1}), \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430: {2}. + +#button.selectFiles=Select Files to Upload + +section.version=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0435\u0440\u0441\u0438\u0438 +label.version=\u0423 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0435\u0441\u0442\u044c: +label.minorVersion=\u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f +label.majorVersion=\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f +label.minorVersion.more=\u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f ({0}) +label.majorVersion.more=\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f ({0}) +label.comments=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 + +type.cm_content=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 + +inmemory.uploadsize.exceeded=\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 {0} + + +# RM Specific properties +header.multiUpload=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b +button.selectFiles=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b + +header.import=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c +button.selectImportFile=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_zh_CN.properties new file mode 100644 index 0000000000..fd66142320 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/dnd-upload.get_zh_CN.properties @@ -0,0 +1,43 @@ +header.singleUpload=\u4e0a\u4f20\u6587\u4ef6 +header.multiUpload.singleFile=\u4e0a\u4f20\u6587\u4ef6\u81f3 {0} +#header.multiUpload=Upload Files to {0} +header.singleUpdate=\u66f4\u65b0\u6587\u4ef6 +header.error=\u9519\u8bef + +label.noFiles=\u6b63\u5728\u52a0\u8f7d\u6587\u4ef6... +label.documents=\u6587\u4ef6 +label.success=\u6210\u529f +label.failure=\u672a\u6210\u529f\uff1a{0} +label.failure.413=\u5931\u8d25\uff1a\u8d85\u8fc7\u4e86\u914d\u989d +label.failure.409=\u5931\u8d25\uff1a\u5185\u5bb9\u5927\u5c0f\u592a\u5927 +label.failure.fileTooBig=\u5931\u8d25\uff1a\u6587\u4ef6\u5927\u5c0f\u8d85\u8fc7 25MB +label.uploadStatus=\u5b8c\u6210\u4e86 {1} \u4e2a\u6587\u4ef6\u4e2d\u7684 {0} \u4e2a +label.uploadStatus.withFailures=\u5b8c\u6210\u4e86 {1} \u4e2a\u6587\u4ef6\u4e2d\u7684 {0} \u4e2a\uff08{2} \u4e2a\u5931\u8d25\uff09 +label.aggregateUploadStatus=\u6b63\u5728\u4e0a\u4f20 {0} \u4e2a\u6587\u4ef6 ({1}) +message.cancelStatus=\u4e0a\u4f20\u5df2\u53d6\u6d88\uff1b\u5df2\u4e0a\u4f20 {0} \u4e2a\u6587\u4ef6 +message.zeroByteFileSelected=\u6587\u4ef6 {0} \u4e3a\u96f6\u5b57\u8282\uff0c\u6240\u4ee5\u4e0d\u80fd\u4e0a\u4f20\u3002 +message.zeroByteFiles=\u4e0d\u80fd\u4e0a\u4f20\u4ee5\u4e0b\u9879\uff0c\u56e0\u4e3a\u8fd9\u4e9b\u9879\u662f\u6587\u4ef6\u5939\u6216\u5927\u5c0f\u4e3a\u96f6\u5b57\u8282\uff1a{0} +message.illegalCharacters=\u6587\u4ef6 {0} \u5305\u542b\u5728\u67d0\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u5c5e\u975e\u6cd5\u7684\u5b57\u7b26\u3002 +message.maxFileFileSizeExceeded=\u6587\u4ef6 {0} \u592a\u5927 ({1})\uff0c\u6700\u5927\u6587\u4ef6\u5927\u5c0f\u4e3a {2}\u3002 + +#button.selectFiles=Select Files to Upload + +section.version=\u7248\u672c\u4fe1\u606f +label.version=\u6b64\u7248\u672c\u6709\uff1a +label.minorVersion=\u6b21\u8981\u66f4\u6539 +label.majorVersion=\u4e3b\u8981\u66f4\u6539 +label.minorVersion.more=\u6b21\u8981\u66f4\u6539 ({0}) +label.majorVersion.more=\u4e3b\u8981\u66f4\u6539 ({0}) +label.comments=\u8bc4\u8bba + +type.cm_content=\u5185\u5bb9 + +inmemory.uploadsize.exceeded=\u60a8\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u62d6\u653e\u4e0a\u4f20\u6240\u653e\u6587\u4ef6\u603b\u5927\u5c0f\u8d85\u8fc7 {0} \u7684\u4e0a\u4f20\u9879 + + +# RM Specific properties +header.multiUpload=\u7acb\u5377\u8bb0\u5f55 +button.selectFiles=\u9009\u62e9\u8981\u7acb\u5377\u7684\u8bb0\u5f55 + +header.import=\u5bfc\u5165 +button.selectImportFile=\u9009\u62e9\u5bfc\u5165\u6587\u4ef6 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.desc.xml new file mode 100644 index 0000000000..b567404b06 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.desc.xml @@ -0,0 +1,5 @@ + + Records File upload + Records Management File upload component that decides if flash or html upload should be used + /rm/components/upload/file-upload + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.head.ftl new file mode 100644 index 0000000000..0f75b5d2b3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.head.ftl @@ -0,0 +1,31 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@script type="text/javascript" src="${url.context}/res/components/upload/file-upload.js"> + +<@script type="text/javascript" src="${url.context}/res/rm/components/upload/file-upload.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.html.ftl new file mode 100644 index 0000000000..e8958011f0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/file-upload.get.html.ftl @@ -0,0 +1,40 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + +<#assign fileUploadConfig = config.scoped["DocumentLibrary"]["file-upload"]!> +<#if fileUploadConfig.getChildValue??> + <#assign adobeFlashEnabled = fileUploadConfig.getChildValue("adobe-flash-enabled")!"true"> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.desc.xml new file mode 100644 index 0000000000..e2308f60dd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.desc.xml @@ -0,0 +1,5 @@ + + Records Flash upload + File upload component that uses flash to select and upload multiple files + /rm/components/upload/flash-upload + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.head.ftl new file mode 100644 index 0000000000..66d59985f9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.head.ftl @@ -0,0 +1,33 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/upload/flash-upload.css" /> +<@script type="text/javascript" src="${url.context}/res/components/upload/flash-upload.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/upload/flash-upload.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/upload/flash-upload.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.html.ftl new file mode 100644 index 0000000000..229682261b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.html.ftl @@ -0,0 +1,149 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.js new file mode 100644 index 0000000000..7cf7d827f8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.js @@ -0,0 +1,60 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Custom content types + */ +function getContentTypes() +{ + // TODO: Data webscript call to return list of available types + var contentTypes = [ + { + id: "cm:content", + value: "cm_content" + }]; + + return contentTypes; +} + +/** + * Record types + */ +function getRecordTypes() +{ + var result = remote.call("/api/rma/recordmetadataaspects"), + recordTypes = []; + + if (result.status == 200) + { + var json = eval('(' + result + ')'); + recordTypes = recordTypes.concat(json.data.recordMetaDataAspects); + } + + return recordTypes; +} + +model.contentTypes = getContentTypes(); +model.recordTypes = getRecordTypes(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.properties new file mode 100644 index 0000000000..9b04cc0080 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get.properties @@ -0,0 +1,35 @@ +header.singleUpload=Upload File +header.multiUpload=Upload File(s) +header.singleUpdate=Update File +header.singleImport=Import + +section.recordType=Choose Record Type +section.file=Choose File(s) + +label.browse=Select File(s) to Upload +label.multiUploadTip=Use CTRL or SHIFT to select multiple files +label.singleUpdateTip=Click icon to upload a new version of {0} +label.noFiles=No files to display, click icon to select file(s) to upload +label.noFlash=Flash Player version 9.0.45 or later required to use this component. You can download the latest version of Flash Player from the \ + Adobe Flash Player Download Center. +label.success=Success +label.failure=Unsuccessful +button.upload=Upload File(s) +label.uploadStatus=Status: {0}/{1} uploaded ({2} unsuccessful) +message.cancelStatus=Upload(s)cancelled; {0} file(s) uploaded +message.zeroByteFileSelected=You selected file {0}. It is 0b in size and can't be uploaded. +message.flashError.title=Flash Communication Error +message.flashError.message=The browser can't communicate with the Flash Uploader. You can continue to file records in single-file mode, or refresh the page to restart Flash. + +section.version=Version Information +label.version=This version has: +label.minorVersion=Minor Version +label.majorVersion=Major Version +label.comments=Comments + +label.contentType=Content Type +type.cm_content=Content + +label.recordType=Record Type(s) +label.recordType.description=All files listed will be marked as the chosen type(s). +recordType.default=Default diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_de.properties new file mode 100644 index 0000000000..927131a84b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_de.properties @@ -0,0 +1,35 @@ +header.singleUpload=Datei hochladen +header.multiUpload=Datei(en) hochladen +header.singleUpdate=Datei aktualisieren +header.singleImport=Importieren + +section.recordType=Record-Typ w\u00e4hlen +section.file=Datei(en) ausw\u00e4hlen + +label.browse=Datei(en) zum Hochladen ausw\u00e4hlen +label.multiUploadTip=Mehrere Dateien \u00fcber STRG oder UMSCHALT ausw\u00e4hlen +label.singleUpdateTip=Klicken Sie auf das Icon, um eine neue Version von {0} hochzuladen. +label.noFiles=Keine anzuzeigenden Dateien. Klicken Sie auf das Icon, um die hochzuladende(n) Datei(en) auszuw\u00e4hlen. +label.noFlash=Flash Player Version 9.0.45 oder h\u00f6her zur Verwendung dieser Komponente erforderlich. Die aktuelle Version des Flash Player k\u00f6nnen Sie von\ + Adobe Flash Player Download Center herunterladen. +label.success=Erfolg +label.failure=Fehlgeschlagen +button.upload=Datei(en) hochladen +label.uploadStatus=Status: {0}/{1} hochgeladen ({2} fehlgeschlagen) +message.cancelStatus=Upload(s) abgebrochen; {0} Datei(en) hochgeladen +message.zeroByteFileSelected=Sie haben die Datei {0} ausgew\u00e4hlt. Die Datei ist 0 Byte gro\u00df und kann nicht hochgeladen werden. +message.flashError.title=Flash-Kommunikationsfehler +message.flashError.message=Der Browser kann nicht mit dem Flash Uploader kommunizieren. Sie k\u00f6nnen weiterhin Records im Einzeldateien-Modus ablegen oder die Seite neu aufrufen, um Flash neu zu starten. + +section.version=Angaben zur Version +label.version=Diese Version: +label.minorVersion=Nebenversion +label.majorVersion=Hauptversion +label.comments=Kommentare + +label.contentType=Inhaltstyp +type.cm_content=Inhalt + +label.recordType=Record-Typ(en) +label.recordType.description=Alle aufgef\u00fchrten Dateien werden als gew\u00e4hlte(r) Typ(en) gekennzeichnet. +recordType.default=Standard diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_es.properties new file mode 100755 index 0000000000..ba5cf01f4d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_es.properties @@ -0,0 +1,35 @@ +header.singleUpload=Cargar fichero +header.multiUpload=Cargar fichero(s) +header.singleUpdate=Actualizar fichero +header.singleImport=Importar + +section.recordType=Elegir tipo de documento de archivo +section.file=Elegir fichero(s) + +label.browse=Seleccione los ficheros que desea cargar +label.multiUploadTip=Utilice CTRL o SHIFT para seleccionar m\u00faltiples ficheros +label.singleUpdateTip=Pulse en el icono para cargar una nueva versi\u00f3n de {0} +label.noFiles=No hay ning\u00fan fichero para mostrar, pulse el icono para seleccionar los ficheros que desea cargar +label.noFlash=Se requiere la versi\u00f3n 9.0.45 de Flash Player o posterior para utilizar este componente. Puede descargar la \u00faltima versi\u00f3n del visor Flash desde el\ + Centro de descargas Adobe Flash Player. +label.success=Completado +label.failure=Insatisfactorio +button.upload=Cargar fichero(s) +label.uploadStatus=Estado: {0}/{1} cargado(s) ({2} con error) +message.cancelStatus=Carga(s) cancelada(s); {0} fichero(s) cargado(s) +message.zeroByteFileSelected=Ha seleccionado el fichero {0}. No tiene ning\u00fan contenido y no se puede cargar. +message.flashError.title=Error de comunicaci\u00f3n Flash +message.flashError.message=El navegador no puede comunicarse con el cargador Flash. Puede continuar cargando en modo de fichero \u00fanico o recargar la p\u00e1gina para reiniciar Flash. + +section.version=Informaci\u00f3n de la versi\u00f3n +label.version=Esta versi\u00f3n tiene: +label.minorVersion=Versi\u00f3n menor +label.majorVersion=Versi\u00f3n mayor +label.comments=Comentarios + +label.contentType=Tipo de contenido +type.cm_content=Contenido + +label.recordType=Tipo(s) de documento de archivo +label.recordType.description=Todos los ficheros listados ser\u00e1n marcados como los tipos elegido(s). +recordType.default=Predeterminado diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_fr.properties new file mode 100644 index 0000000000..b3a9ee7544 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_fr.properties @@ -0,0 +1,35 @@ +header.singleUpload=Importer un fichier +header.multiUpload=Importer le(s) fichier(s) +header.singleUpdate=Mettre le fichier \u00e0 jour +header.singleImport=Importer + +section.recordType=Choisir le type de document d'archives +section.file=Choisir le ou les fichiers + +label.browse=S\u00e9lectionner le(s) fichier(s) \u00e0 importer +label.multiUploadTip=Utiliser CTRL ou SHIFT(Maj) pour s\u00e9lectionner des fichiers multiples +label.singleUpdateTip=Cliquez sur l''ic\u00f4ne pour importer une nouvelle version de {0} +label.noFiles=Aucun fichier \u00e0 afficher. Cliquez sur l'ic\u00f4ne pour s\u00e9lectionner le(s) fichier(s) \u00e0 importer +label.noFlash=Flash Player version 9.0.45 ou plus r\u00e9cente est requis pour pouvoir utiliser ce composant. Vous pouvez t\u00e9l\u00e9charger la derni\u00e8re version de Flash Player depuis\ + Adobe Flash Player Download Center. +label.success=Succ\u00e8s +label.failure=Echec +button.upload=Importer le(s) fichier(s) +label.uploadStatus=Statut : {0}/{1} import\u00e9(s) ({2} \u00e9chec(s)) +message.cancelStatus=Importation(s) annul\u00e9e(s)\u00a0; {0} fichier(s) import\u00e9(s) +message.zeroByteFileSelected=Vous avez s\u00e9lectionn\u00e9 le fichier {0}. La taille de ce fichier est nulle et ce dernier ne peut pas \u00eatre import\u00e9. +message.flashError.title=Erreur de communication Flash +message.flashError.message=Le navigateur n'arrive pas \u00e0 communiquer avec l'injecteur Flash. Vous pouvez continuer \u00e0 classer des fichiers en mode fichier unique ou rafra\u00eechir la page pour relancer Flash. + +section.version=Informations de version +label.version=Cette version contient : +label.minorVersion=Version mineure +label.majorVersion=Version majeure +label.comments=Commentaires + +label.contentType=Type de contenu +type.cm_content=Contenu + +label.recordType=Type(s) de documents d'archives +label.recordType.description=Tous les fichiers de la liste seront marqu\u00e9s comme \u00e9tant du ou des types choisis. +recordType.default=Par d\u00e9faut diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_it.properties new file mode 100644 index 0000000000..8909e1a68d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_it.properties @@ -0,0 +1,34 @@ +header.singleUpload=Carica file +header.multiUpload=Carica file +header.singleUpdate=Aggiorna file +header.singleImport=Importa + +section.recordType=Scegli tipo di record +section.file=Scegli file + +label.browse=Seleziona file da caricare +label.multiUploadTip=Utilizzare CTRL o MAIUSC per selezionare pi\u00f9 file +label.singleUpdateTip=Fare clic sull''icona per caricare una nuova versione di {0} +label.noFiles=Nessun file da visualizzare, fare clic sull'icona per selezionare i file da caricare +label.noFlash=Per utilizzare questo componente \u00e8 necessario avere la versione di Flash Player 9.0.45 o quella successiva. \u00c8 possibile scaricare l'ultima versione di Flash Player da Adobe Flash Player Download Center. +label.success=Operazione riuscita +label.failure=Operazione non riuscita +button.upload=Carica file +label.uploadStatus=Stato: {0}/{1} caricati ({2} non riusciti) +message.cancelStatus=Caricamenti annullati; {0} file caricati +message.zeroByteFileSelected=\u00c8 stato selezionato il file {0}. Impossibile caricare il file poich\u00e9 ha dimensioni pari a 0 byte. +message.flashError.title=Errore di comunicazione con Flash +message.flashError.message=Il browser non \u00e8 in grado di comunicare con Flash Uploader. \u00c8 possibile procedere con l'archiviazione dei record in un unico file, o aggiornare la pagina per riavviare Flash. + +section.version=Informazioni sulla versione +label.version=Questa versione presenta: +label.minorVersion=Versione minore +label.majorVersion=Versione maggiore +label.comments=Commenti + +label.contentType=Tipo di contenuto +type.cm_content=Contenuto + +label.recordType=Tipi di record +label.recordType.description=Tutti i file elencati saranno contrassegnati come i tipi prescelti. +recordType.default=Predefinito diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_ja.properties new file mode 100644 index 0000000000..474b568ed8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_ja.properties @@ -0,0 +1,35 @@ +header.singleUpload=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +header.multiUpload=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +header.singleUpdate=\u30d5\u30a1\u30a4\u30eb\u306e\u66f4\u65b0 +header.singleImport=\u30a4\u30f3\u30dd\u30fc\u30c8 + +section.recordType=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7\u306e\u9078\u629e +section.file=\u30d5\u30a1\u30a4\u30eb\u306e\u9078\u629e + +label.browse=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u9078\u629e +label.multiUploadTip=\u8907\u6570\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3059\u308b\u306b\u306f\u3001Ctrl \u307e\u305f\u306f Shift \u30ad\u30fc\u3092\u4f7f\u3044\u307e\u3059\u3002 +label.singleUpdateTip={0} \u306e\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f\u3001\u30a2\u30a4\u30b3\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002 +label.noFiles=\u8868\u793a\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u30a2\u30a4\u30b3\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +label.noFlash=\u3053\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001Flash Player \u30d0\u30fc\u30b8\u30e7\u30f3 9.0.45 \u4ee5\u964d\u304c\u5fc5\u8981\u3067\u3059\u3002 \ + Adobe Flash Player \u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30bb\u30f3\u30bf\u30fc\u304b\u3089\u3001\u6700\u65b0\u306e Flash Player \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3067\u304d\u307e\u3059\u3002 +label.success=\u6210\u529f +label.failure=\u5931\u6557 +button.upload=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +label.uploadStatus=\u30b9\u30c6\u30fc\u30bf\u30b9: {1} \u500b\u306e\u3046\u3061 {0} \u500b\u304c\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f ({2} \u500b\u5931\u6557) +message.cancelStatus=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002{0} \u500b\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f\u3002 +message.zeroByteFileSelected=\u30d5\u30a1\u30a4\u30eb ''{0}'' \u3092\u9078\u629e\u3057\u307e\u3057\u305f\u3002 \u30d5\u30a1\u30a4\u30eb\u306e\u30b5\u30a4\u30ba\u304c 0 \u30d0\u30a4\u30c8\u3067\u3042\u308b\u305f\u3081\u3001\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3002 +message.flashError.title=Flash \u306e\u901a\u4fe1\u30a8\u30e9\u30fc +message.flashError.message=\u30d6\u30e9\u30a6\u30b6\u304c Flash \u30a2\u30c3\u30d7\u30ed\u30fc\u30c0\u3068\u901a\u4fe1\u3067\u304d\u307e\u305b\u3093\u3002 \u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u30e2\u30fc\u30c9\u3067\u30ec\u30b3\u30fc\u30c9\u306e\u6574\u7406\u4fdd\u7ba1\u3092\u7d9a\u884c\u3059\u308b\u304b\u3001\u30da\u30fc\u30b8\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066 Flash \u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +section.version=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +label.version=\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306e\u6539\u8a02: +label.minorVersion=\u30de\u30a4\u30ca\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3 +label.majorVersion=\u30e1\u30b8\u30e3\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3 +label.comments=\u30b3\u30e1\u30f3\u30c8 + +label.contentType=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30a4\u30d7 +type.cm_content=\u30b3\u30f3\u30c6\u30f3\u30c4 + +label.recordType=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7 +label.recordType.description=\u30ea\u30b9\u30c8\u3055\u308c\u305f\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u9078\u629e\u6e08\u307f\u30bf\u30a4\u30d7\u3068\u3057\u3066\u30de\u30fc\u30af\u3055\u308c\u307e\u3059\u3002 +recordType.default=\u30c7\u30d5\u30a9\u30eb\u30c8 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_nb.properties new file mode 100644 index 0000000000..6550dd855d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_nb.properties @@ -0,0 +1,35 @@ +header.singleUpload=Last opp fil +header.multiUpload=Last opp file(er) +header.singleUpdate=Oppdater fil +header.singleImport=Importer + +section.recordType=Velg oppf\u00f8ringstype +section.file=Velg fil(er) + +label.browse=Velg fil(er) som skal lastes opp +label.multiUploadTip=Bruk CTRL eller SKIFT for \u00e5 velge flere filer +label.singleUpdateTip=Klikk ikon for \u00e5 laste opp en ny versjon av {0} +label.noFiles=Ingen filer vises. Klikk ikon for \u00e5 velge fil(er) som skal lastes opp. +label.noFlash=Du trenger Flash-spilleren versjon 9.0.45 eller nyere for \u00e5 bruke denne komponenten. Du kan laste ned siste versjon av Flash-spilleren fra \ + Adobe Flash Player Download Center. +label.success=Vellykket +label.failure=Mislykket +button.upload=Last opp file(er) +label.uploadStatus=Status: {0}/{1} lastet opp ({2} mislyktes) +message.cancelStatus=Opplasting(er) avbrutt. {0} fil(er) lastet opp +message.zeroByteFileSelected=Du valgte fil {0}. Har en st\u00f8rrelse p\u00e5 0 b, og kan ikke lastes opp. +message.flashError.title=Flash-kommunikasjonsfeil +message.flashError.message=Nettleseren kan ikke kommunisere med Flash Uploader. Du kan fortsette \u00e5 arkivere oppf\u00f8ringer i enkeltfil-modus eller oppdatere siden for \u00e5 starte Flash p\u00e5 nytt. + +section.version=Versjonsinformasjon +label.version=Denne versjonen har: +label.minorVersion=Mindre versjon +label.majorVersion=Hovedversjon +label.comments=Kommentarer + +label.contentType=Innholdstype +type.cm_content=Innhold + +label.recordType=Oppf\u00f8ringstype(r) +label.recordType.description=Alle filer som st\u00e5r oppf\u00f8rt, blir merket som den/de valgte typen(e). +recordType.default=Standard diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_nl.properties new file mode 100755 index 0000000000..cd76a52bbf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_nl.properties @@ -0,0 +1,35 @@ +header.singleUpload=Bestand uploaden +header.multiUpload=Bestand(en) uploaden +header.singleUpdate=Bestand bijwerken +header.singleImport=Importeren + +section.recordType=Archiefstuktype kiezen +section.file=Bestand(en) kiezen + +label.browse=Selecteer een of meer bestanden om te uploaden +label.multiUploadTip=Gebruik CTRL of SHIFT om meerdere bestanden te selecteren +label.singleUpdateTip=Klik op pictogram om een nieuwe versie van {0} te uploaden +label.noFiles=Geen bestanden om weer te geven, klik op pictogram om een of meer bestanden te selecteren om te uploaden +label.noFlash=Flash Player versie 9.0.45 of later vereist voor gebruik van dit onderdeel. U kunt de laatste versie van Flash Player downloaden uit het\ + Adobe Flash Player Download Center. +label.success=Geslaagd +label.failure=Niet geslaagd +button.upload=Bestand(en) uploaden +label.uploadStatus=Status: {0}/{1} ge\u00fcpload ({2} niet geslaagd) +message.cancelStatus=Upload(s) geannuleerd; {0} bestand(en) ge\u00fcpload +message.zeroByteFileSelected=U hebt bestand {0} geselecteerd. Het heeft een grootte van 0b en kan niet worden ge\u00fcpload. +message.flashError.title=Flash-communicatiefout +message.flashError.message=De browser kan niet communiceren met de Flash Uploader. U kunt doorgaan met het archiveren van archiefstukken in de modus voor \u00e9\u00e9n bestand of u vernieuwt de pagina om Flash opnieuw te starten. + +section.version=Versie-informatie +label.version=Deze versie heeft: +label.minorVersion=Secundaire versie +label.majorVersion=Primaire versie +label.comments=Opmerkingen + +label.contentType=Contenttype +type.cm_content=Content + +label.recordType=Archiefstuktype(s) +label.recordType.description=Alle vermelde bestanden worden gemarkeerd als de geselecteerde type(s). +recordType.default=Standaard diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_pt_BR.properties new file mode 100644 index 0000000000..41d2e06104 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_pt_BR.properties @@ -0,0 +1,35 @@ +header.singleUpload=Carregar arquivo +header.multiUpload=Carregar arquivo(s) +header.singleUpdate=Atualizar arquivo +header.singleImport=Importar + +section.recordType=Escolher tipo de documento arquiv\u00edstico +section.file=Escolher arquivo(s) + +label.browse=Selecionar arquivo(s) para carregar +label.multiUploadTip=Use CTRL ou SHIFT para selecionar m\u00faltiplos arquivos +label.singleUpdateTip=Clique no \u00edcone para carregar uma nova vers\u00e3o de {0} +label.noFiles=N\u00e3o h\u00e1 arquivos a serem exibidos. Clique no \u00edcone para selecionar o(s) arquivo(s) a ser(em) carregado(s) +label.noFlash=Vers\u00e3o 9.0.45 do Flash Player ou posterior necess\u00e1ria para utilizar este componente. \u00c9 poss\u00edvel fazer o download da vers\u00e3o mais recente do Flash Player no\ + Adobe Flash Player Download Center. +label.success=Sucesso +label.failure=Sem sucesso +button.upload=Carregar arquivo(s) +label.uploadStatus=Status: {0}/{1} carregados ({2} com falha) +message.cancelStatus=Carregamento(s) cancelado(s); ''{0}'' arquivo(s) carregado(s) +message.zeroByteFileSelected=Voc\u00ea selecionou o arquivo ''{0}''. Tem 0 b de tamanho e n\u00e3o pode ser carregado. +message.flashError.title=Erro de comunica\u00e7\u00e3o com o Flash +message.flashError.message=O navegador n\u00e3o pode se comunicar com o Flash Uploader. Voc\u00ea pode continuar a arquivar documentos arquiv\u00edsticos no modo de arquivo \u00fanico ou atualizar a p\u00e1gina para reiniciar o Flash. + +section.version=Informa\u00e7\u00f5es de vers\u00e3o +label.version=Esta vers\u00e3o possui: +label.minorVersion=Vers\u00e3o secund\u00e1ria +label.majorVersion=Vers\u00e3o principal +label.comments=Coment\u00e1rios + +label.contentType=Tipo de conte\u00fado +type.cm_content=Conte\u00fado + +label.recordType=Tipo(s) de documento arquiv\u00edstico +label.recordType.description=Todos os arquivos listados ser\u00e3o marcados como o(s) tipo(s) escolhido(s). +recordType.default=Padr\u00e3o diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_ru.properties new file mode 100644 index 0000000000..8bdba989a0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_ru.properties @@ -0,0 +1,35 @@ +header.singleUpload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b +header.multiUpload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b +header.singleUpdate=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b +header.singleImport=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c + +section.recordType=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043f \u0437\u0430\u043f\u0438\u0441\u0438 +section.file=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u044b + +label.browse=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b(\u044b) \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 +label.multiUploadTip=\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043a\u043b\u0430\u0432\u0438\u0448\u0435\u0439 CTRL \u0438\u043b\u0438 SHIFT \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 +label.singleUpdateTip=\u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e {0} +label.noFiles=\u041d\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 +label.noFlash=\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c Flash Player \u0432\u0435\u0440\u0441\u0438\u0438 9.0.45 \u0438\u043b\u0438 \u043d\u043e\u0432\u0435\u0435. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e Flash Player \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437\ + \u0446\u0435\u043d\u0442\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044f Adobe Flash Player. +label.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e +label.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c +button.upload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b +label.uploadStatus=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e {0}/{1} (\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c {2}) +message.cancelStatus=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430; \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: {0} +message.zeroByteFileSelected=\u0412\u044b\u0431\u0440\u0430\u043d \u0444\u0430\u0439\u043b {0}. \u0424\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. +message.flashError.title=\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0432\u044f\u0437\u0438 Flash +message.flashError.message=\u0411\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 Flash Uploader. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043b\u0438\u0431\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Flash. + +section.version=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0435\u0440\u0441\u0438\u0438 +label.version=\u0423 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0435\u0441\u0442\u044c: +label.minorVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0441 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 +label.majorVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 +label.comments=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 + +label.contentType=\u0422\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e +type.cm_content=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 + +label.recordType=\u0422\u0438\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +label.recordType.description=\u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c. +recordType.default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_zh_CN.properties new file mode 100644 index 0000000000..49ea3c9d93 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/flash-upload.get_zh_CN.properties @@ -0,0 +1,35 @@ +header.singleUpload=\u4e0a\u4f20\u6587\u4ef6 +header.multiUpload=\u4e0a\u4f20\u6587\u4ef6 +header.singleUpdate=\u66f4\u65b0\u6587\u4ef6 +header.singleImport=\u5bfc\u5165 + +section.recordType=\u9009\u62e9\u8bb0\u5f55\u7c7b\u578b +section.file=\u9009\u62e9\u6587\u4ef6 + +label.browse=\u9009\u62e9\u8981\u4e0a\u4f20\u7684\u6587\u4ef6 +label.multiUploadTip=\u53ef\u4f7f\u7528 CTRL \u6216 SHIFT \u952e\u9009\u62e9\u591a\u4e2a\u6587\u4ef6 +label.singleUpdateTip=\u5355\u51fb\u56fe\u6807\u53ef\u4e0a\u4f20\u65b0\u7248\u672c\u7684 {0} +label.noFiles=\u65e0\u8981\u663e\u793a\u7684\u6587\u4ef6\uff1b\u5355\u51fb\u56fe\u6807\u53ef\u9009\u62e9\u8981\u4e0a\u4f20\u7684\u6587\u4ef6 +label.noFlash=\u8981\u4f7f\u7528\u8be5\u7ec4\u4ef6\uff0c\u9700\u8981 9.0.45 \u6216\u66f4\u9ad8\u7248\u672c\u7684 Flash \u64ad\u653e\u5668\u3002 \u53ef\u4ece\ + Adobe Flash Player \u4e0b\u8f7d\u4e2d\u5fc3\u4e0b\u8f7d\u6700\u65b0\u7248\u672c\u7684 Flash \u64ad\u653e\u5668\u3002 +label.success=\u6210\u529f +label.failure=\u672a\u6210\u529f +button.upload=\u4e0a\u4f20\u6587\u4ef6 +label.uploadStatus=\u72b6\u6001\uff1a\u4e0a\u4f20\u4e86 {0}/{1} \u4e2a\uff08{2} \u4e2a\u5931\u8d25\uff09 +message.cancelStatus=\u4e0a\u4f20\u5df2\u53d6\u6d88\uff1b\u5df2\u4e0a\u4f20 {0} \u4e2a\u6587\u4ef6 +message.zeroByteFileSelected=\u60a8\u5df2\u9009\u62e9\u6587\u4ef6 {0}\u3002 \u5927\u5c0f\u4e3a\u96f6\u5b57\u8282\uff0c\u6240\u4ee5\u4e0d\u80fd\u4e0a\u4f20\u3002 +message.flashError.title=Flash \u901a\u4fe1\u9519\u8bef +message.flashError.message=\u6d4f\u89c8\u5668\u4e0d\u80fd\u4e0e Flash Uploader \u901a\u4fe1\u3002 \u60a8\u53ef\u7ee7\u7eed\u4ee5\u5355\u6587\u4ef6\u6a21\u5f0f\u5bf9\u8bb0\u5f55\u7acb\u5377\uff0c\u6216\u8005\u5237\u65b0\u9875\u9762\u4ee5\u91cd\u65b0\u542f\u52a8 Flash\u3002 + +section.version=\u7248\u672c\u4fe1\u606f +label.version=\u6b64\u7248\u672c\u6709\uff1a +label.minorVersion=\u6b21\u8981\u7248\u672c +label.majorVersion=\u4e3b\u8981\u7248\u672c +label.comments=\u8bc4\u8bba + +label.contentType=\u5185\u5bb9\u7c7b\u578b +type.cm_content=\u5185\u5bb9 + +label.recordType=\u8bb0\u5f55\u7c7b\u578b +label.recordType.description=\u6240\u6709\u5217\u51fa\u7684\u6587\u4ef6\u5c06\u6807\u8bb0\u4e3a\u6240\u9009\u7c7b\u578b\u3002 +recordType.default=\u9ed8\u8ba4 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.desc.xml new file mode 100644 index 0000000000..c89b418532 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.desc.xml @@ -0,0 +1,5 @@ + + Recrods Html File upload + Records Management - File upload component that uses the browser standard file picker + /rm/components/upload/html-upload + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.head.ftl new file mode 100644 index 0000000000..799176126c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.head.ftl @@ -0,0 +1,33 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/components/upload/html-upload.css" /> +<@script type="text/javascript" src="${url.context}/res/components/upload/html-upload.js"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/upload/html-upload.css" /> +<@script type="text/javascript" src="${url.context}/res/rm/components/upload/html-upload.js"> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.html.ftl new file mode 100644 index 0000000000..59d7c2afdf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.html.ftl @@ -0,0 +1,152 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.js new file mode 100644 index 0000000000..6962be502b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.js @@ -0,0 +1,28 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.properties new file mode 100644 index 0000000000..8d5b50e911 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get.properties @@ -0,0 +1,29 @@ +header.singleUpload=Upload File +header.singleUpdate=Update File +header.singleImport=Import + +section.recordType=Choose Record Type +section.file=Choose File + +label.singleUploadTip=With the latest Flash Player installed, you can upload multiple files. \ + Download it from the Adobe Flash Player Download Center. + +label.singleUpdateTip=Upload a New Version of {0} +button.upload=Upload File +label.file=File + +section.version=Version Information +label.version=This version has: +label.minorVersion=Minor Version +label.majorVersion=Major Version +label.comments=Comments + +message.uploading=File uploading... +message.success=File successfully uploaded +message.failure=We couldn't upload the file. Try refreshing your browser then try again. + +label.contentType=Content Type +type.cm_content=Content + +label.recordType=Record Type(s) +recordType.default=Default diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_de.properties new file mode 100644 index 0000000000..39f498e2cb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_de.properties @@ -0,0 +1,29 @@ +header.singleUpload=Datei hochladen +header.singleUpdate=Datei aktualisieren +header.singleImport=Importieren + +section.recordType=Record-Typ w\u00e4hlen +section.file=Datei ausw\u00e4hlen + +label.singleUploadTip=Mit dem neuesten Flash Player k\u00f6nnen Sie mehrere Dateien parallel hochladen.\ + Laden Sie ihn aus dem Adobe Flash Player Download Center herunter. + +label.singleUpdateTip=Eine neue Version von {0} hochladen +button.upload=Datei hochladen +label.file=Datei + +section.version=Angaben zur Version +label.version=Diese Version: +label.minorVersion=Nebenversion +label.majorVersion=Hauptversion +label.comments=Kommentare + +message.uploading=Datei wird hochgeladen... +message.success=Datei erfolgreich hochgeladen +message.failure=Datei konnte nicht hochgeladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +label.contentType=Inhaltstyp +type.cm_content=Inhalt + +label.recordType=Record-Typ(en) +recordType.default=Standard diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_es.properties new file mode 100755 index 0000000000..3cf98e7dff --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_es.properties @@ -0,0 +1,29 @@ +header.singleUpload=Cargar fichero +header.singleUpdate=Actualizar fichero +header.singleImport=Importar + +section.recordType=Elegir tipo de documento de archivo +section.file=Seleccionar fichero + +label.singleUploadTip=Con la \u00faltima versi\u00f3n instalada de Flash Player, puede cargar m\u00faltiples ficheros.\ + Desc\u00e1rguelo del Centro de Descargas de Adobe Flash Player. + +label.singleUpdateTip=Cargar una nueva versi\u00f3n de {0} +button.upload=Cargar fichero +label.file=Fichero + +section.version=Informaci\u00f3n de la versi\u00f3n +label.version=Esta versi\u00f3n tiene: +label.minorVersion=Versi\u00f3n menor +label.majorVersion=Versi\u00f3n mayor +label.comments=Comentarios + +message.uploading=Cargando fichero... +message.success=Fichero cargado correctamente +message.failure=No se ha podido cargar el fichero. Trate de actualizar el navegador y vuelva a intentarlo. + +label.contentType=Tipo de contenido +type.cm_content=Contenido + +label.recordType=Tipo(s) de documento de archivo +recordType.default=Predeterminado diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_fr.properties new file mode 100644 index 0000000000..7a5872c4a2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_fr.properties @@ -0,0 +1,29 @@ +header.singleUpload=Importer un fichier +header.singleUpdate=Mettre le fichier \u00e0 jour +header.singleImport=Importer + +section.recordType=Choisir le type de document d'archives +section.file=Choisir un fichier + +label.singleUploadTip=Gr\u00e2ce \u00e0 la derni\u00e8re version de Flash Player, vous pouvez importer plusieurs fichiers. \ + T\u00e9l\u00e9chargez-la depuis le Adobe Flash Player Download Center. + +label.singleUpdateTip=Importer une nouvelle version de {0} +button.upload=Importer un fichier +label.file=Fichier + +section.version=Informations de version +label.version=Cette version contient : +label.minorVersion=Version mineure +label.majorVersion=Version majeure +label.comments=Commentaires + +message.uploading=Importation de fichier en cours... +message.success=Le fichier a bien \u00e9t\u00e9 import\u00e9 +message.failure=Impossible d'importer le fichier. Actualisez votre navigateur, puis r\u00e9essayez. + +label.contentType=Type de contenu +type.cm_content=Contenu + +label.recordType=Type(s) de documents d'archives +recordType.default=Par d\u00e9faut diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_it.properties new file mode 100644 index 0000000000..8985caff59 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_it.properties @@ -0,0 +1,28 @@ +header.singleUpload=Carica file +header.singleUpdate=Aggiorna file +header.singleImport=Importa + +section.recordType=Scegli tipo di record +section.file=Scegli file + +label.singleUploadTip=Dopo aver installato l'ultima versione di Flash Player, \u00e8 possibile caricare pi\u00f9 file. Per scaricarlo, visitare il sito Adobe Flash Player Download Center. + +label.singleUpdateTip=Carica una nuova versione di {0} +button.upload=Carica file +label.file=File + +section.version=Informazioni sulla versione +label.version=Questa versione presenta: +label.minorVersion=Versione minore +label.majorVersion=Versione maggiore +label.comments=Commenti + +message.uploading=Caricamento file... +message.success=File caricato +message.failure=Impossibile caricare il file. Provare ad aggiornare il browser quindi riprovare. + +label.contentType=Tipo di contenuto +type.cm_content=Contenuto + +label.recordType=Tipi di record +recordType.default=Predefinito diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_ja.properties new file mode 100644 index 0000000000..cf9871dbed --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_ja.properties @@ -0,0 +1,29 @@ +header.singleUpload=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +header.singleUpdate=\u30d5\u30a1\u30a4\u30eb\u306e\u66f4\u65b0 +header.singleImport=\u30a4\u30f3\u30dd\u30fc\u30c8 + +section.recordType=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7\u306e\u9078\u629e +section.file=\u30d5\u30a1\u30a4\u30eb\u306e\u9078\u629e + +label.singleUploadTip=\u6700\u65b0\u306e Flash Player \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3068\u3001\u8907\u6570\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u3059\u3002\ + Adobe Flash Player \u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30bb\u30f3\u30bf\u30fc\u304b\u3089\u3001\u6700\u65b0\u306e Flash Player \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.singleUpdateTip={0} \u306e\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u307e\u3059 +button.upload=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +label.file=\u30d5\u30a1\u30a4\u30eb + +section.version=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +label.version=\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306e\u6539\u8a02: +label.minorVersion=\u30de\u30a4\u30ca\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3 +label.majorVersion=\u30e1\u30b8\u30e3\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3 +label.comments=\u30b3\u30e1\u30f3\u30c8 + +message.uploading=\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059... +message.success=\u30d5\u30a1\u30a4\u30eb\u304c\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f +message.failure=\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304b\u3089\u3001\u64cd\u4f5c\u3092\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +label.contentType=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30a4\u30d7 +type.cm_content=\u30b3\u30f3\u30c6\u30f3\u30c4 + +label.recordType=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7 +recordType.default=\u30c7\u30d5\u30a9\u30eb\u30c8 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_nb.properties new file mode 100644 index 0000000000..95870ac00b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_nb.properties @@ -0,0 +1,29 @@ +header.singleUpload=Last opp fil +header.singleUpdate=Oppdater fil +header.singleImport=Importer + +section.recordType=Velg oppf\u00f8ringstype +section.file=Velg fil + +label.singleUploadTip=Med den nyeste versjonen av Flash-spilleren kan du laste opp flere filer p\u00e5 en gang.\ + Last den ned fra Adobe Flash Player Download Center. + +label.singleUpdateTip=Last opp en ny versjon av {0} +button.upload=Last opp fil +label.file=Fil + +section.version=Versjonsinformasjon +label.version=Denne versjonen har: +label.minorVersion=Mindre versjon +label.majorVersion=Hovedversjon +label.comments=Kommentarer + +message.uploading=Fil lastes opp... +message.success=Filen er n\u00e5 lastet opp +message.failure=Mislyktes i \u00e5 laste opp filen. Pr\u00f8v \u00e5 oppdatere nettleseren, og pr\u00f8v igjen. + +label.contentType=Innholdstype +type.cm_content=Innhold + +label.recordType=Oppf\u00f8ringstype(r) +recordType.default=Standard diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_nl.properties new file mode 100755 index 0000000000..d04781dd43 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_nl.properties @@ -0,0 +1,29 @@ +header.singleUpload=Bestand uploaden +header.singleUpdate=Bestand bijwerken +header.singleImport=Importeren + +section.recordType=Archiefstuktype kiezen +section.file=Bestand kiezen + +label.singleUploadTip=Wanneer u de nieuwste Flash Player hebt ge\u00efnstalleerd, kunt u meerdere bestanden uploaden. \ + Download deze uit het Adobe Flash Player Download Center. + +label.singleUpdateTip=Een nieuwe versie van {0} uploaden +button.upload=Bestand uploaden +label.file=Bestand + +section.version=Versie-informatie +label.version=Deze versie heeft: +label.minorVersion=Secundaire versie +label.majorVersion=Primaire versie +label.comments=Opmerkingen + +message.uploading=Bestand uploaden... +message.success=Bestand is ge\u00fcpload +message.failure=Kan het bestand niet uploaden. Vernieuw de browser en probeer het opnieuw. + +label.contentType=Contenttype +type.cm_content=Content + +label.recordType=Archiefstuktype(s) +recordType.default=Standaard diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_pt_BR.properties new file mode 100644 index 0000000000..7f30bf79d7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_pt_BR.properties @@ -0,0 +1,29 @@ +header.singleUpload=Carregar arquivo +header.singleUpdate=Atualizar arquivo +header.singleImport=Importar + +section.recordType=Escolher tipo de documento arquiv\u00edstico +section.file=Escolher arquivo + +label.singleUploadTip=Com o Flash Player mais recente instalado, voc\u00ea pode carregar v\u00e1rios arquivos. \ + Fa\u00e7a o download dele no Adobe Flash Player Download Center. + +label.singleUpdateTip=Carregar uma nova vers\u00e3o do {0} +button.upload=Carregar arquivo +label.file=Arquivo + +section.version=Informa\u00e7\u00f5es de vers\u00e3o +label.version=Esta vers\u00e3o possui: +label.minorVersion=Vers\u00e3o secund\u00e1ria +label.majorVersion=Vers\u00e3o principal +label.comments=Coment\u00e1rios + +message.uploading=Carregando arquivo... +message.success=Arquivo carregado com sucesso +message.failure=N\u00e3o foi poss\u00edvel carregar o arquivo. Atualize seu navegador e tente novamente. + +label.contentType=Tipo de conte\u00fado +type.cm_content=Conte\u00fado + +label.recordType=Tipo(s) de documento arquiv\u00edstico +recordType.default=Padr\u00e3o diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_ru.properties new file mode 100644 index 0000000000..ea328ba43d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_ru.properties @@ -0,0 +1,29 @@ +header.singleUpload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b +header.singleUpdate=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b +header.singleImport=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c + +section.recordType=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043f \u0437\u0430\u043f\u0438\u0441\u0438 +section.file=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b + +label.singleUploadTip=\u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044f Flash Player \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432.\ + \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u0446\u0435\u043d\u0442\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044f Adobe Flash Player. + +label.singleUpdateTip=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e {0} +button.upload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b +label.file=\u0424\u0430\u0439\u043b + +section.version=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0435\u0440\u0441\u0438\u0438 +label.version=\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f: +label.minorVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0441 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 +label.majorVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 +label.comments=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 + +message.uploading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430... +message.success=\u0424\u0430\u0439\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d +message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443. + +label.contentType=\u0422\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e +type.cm_content=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 + +label.recordType=\u0422\u0438\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +recordType.default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_zh_CN.properties new file mode 100644 index 0000000000..93e4733b9d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/components/upload/html-upload.get_zh_CN.properties @@ -0,0 +1,29 @@ +header.singleUpload=\u4e0a\u4f20\u6587\u4ef6 +header.singleUpdate=\u66f4\u65b0\u6587\u4ef6 +header.singleImport=\u5bfc\u5165 + +section.recordType=\u9009\u62e9\u8bb0\u5f55\u7c7b\u578b +section.file=\u9009\u62e9\u6587\u4ef6 + +label.singleUploadTip=\u5b89\u88c5\u6700\u65b0\u7684 Flash \u64ad\u653e\u5668\u4e4b\u540e\uff0c\u60a8\u53ef\u4ee5\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6\u3002\ + \u53ef\u4ece Adobe Flash Player \u4e0b\u8f7d\u4e2d\u5fc3\u4e0b\u8f7d Flash \u64ad\u653e\u5668\u3002 + +label.singleUpdateTip=\u4e0a\u4f20\u65b0\u7248\u672c\u7684 {0} +button.upload=\u4e0a\u4f20\u6587\u4ef6 +label.file=\u6587\u4ef6 + +section.version=\u7248\u672c\u4fe1\u606f +label.version=\u6b64\u7248\u672c\u6709\uff1a +label.minorVersion=\u6b21\u8981\u7248\u672c +label.majorVersion=\u4e3b\u8981\u7248\u672c +label.comments=\u8bc4\u8bba + +message.uploading=\u6b63\u5728\u4e0a\u4f20\u6587\u4ef6... +message.success=\u6210\u529f\u4e0a\u4f20\u6587\u4ef6 +message.failure=\u6211\u4eec\u65e0\u6cd5\u4e0a\u4f20\u6b64\u6587\u4ef6\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\uff0c\u7136\u540e\u91cd\u8bd5\u3002 + +label.contentType=\u5185\u5bb9\u7c7b\u578b +type.cm_content=\u5185\u5bb9 + +label.recordType=\u8bb0\u5f55\u7c7b\u578b +recordType.default=\u9ed8\u8ba4 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/console/usersgroups/groups.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/console/usersgroups/groups.get.html.ftl new file mode 100644 index 0000000000..02d0fe2080 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/console/usersgroups/groups.get.html.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="rm-js" target="js" action="after" scope="global"> + <@script src="${url.context}/res/rm/components/console/groups.js" group="console"/> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/console/usersgroups/groups.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/console/usersgroups/groups.get.js new file mode 100644 index 0000000000..1cae91f249 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/console/usersgroups/groups.get.js @@ -0,0 +1,29 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +var widgets = model.widgets; +widgets[0].name = "Alfresco.rm.ConsoleGroups"; +model.widgets = widgets; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/folder-details/path.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/folder-details/path.get.js new file mode 100644 index 0000000000..341bccc42a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/folder-details/path.get.js @@ -0,0 +1,32 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +function rm_main() +{ + model.widgets[0].options["rootLabelId"] = "path.fileplan"; +} + +rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/footer/footer.get.head.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/footer/footer.get.head.ftl new file mode 100644 index 0000000000..6b5f94ff13 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/footer/footer.get.head.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/components/component.head.inc"> + +<@link rel="stylesheet" type="text/css" href="${url.context}/share/res/rm/css/rm.css" /> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.html.ftl new file mode 100644 index 0000000000..5cc1c64a85 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.html.ftl @@ -0,0 +1,32 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="rm-js" target="js" action="replace" scope="global"> + <@script src="${url.context}/res/components/manage-permissions/manage-permissions.js" group="manage-permissions"/> + <@script src="${url.context}/res/components/people-finder/authority-finder.js" group="manage-permissions"/> + <@script src="${url.context}/res/rm/components/manage-permissions/manage-permissions.js" group="manage-permissions"/> + <@script src="${url.context}/res/rm/components/people-finder/authority-finder.js" group="manage-permissions"/> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.js new file mode 100644 index 0000000000..92210c2057 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.js @@ -0,0 +1,30 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +if (url.templateArgs.site != null) +{ + model.widgets[0].name = "Alfresco.rm.component.ManagePermissions"; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.properties new file mode 100644 index 0000000000..aecb964a73 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get.properties @@ -0,0 +1,3 @@ +column.role=Permissions +roles.filing=Read and File +roles.readrecords=Read Only \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_de.properties new file mode 100644 index 0000000000..b2e3d2bbf5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_de.properties @@ -0,0 +1,3 @@ +column.role=Berechtigungen +roles.filing=Lesen und Ablegen +roles.readrecords=Schreibgesch\u00fctzt diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_es.properties new file mode 100644 index 0000000000..cfc98b0c8a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_es.properties @@ -0,0 +1,3 @@ +column.role=Permisos +roles.filing=Leer y archivar +roles.readrecords=Solo leer diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_fr.properties new file mode 100644 index 0000000000..17456c0346 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_fr.properties @@ -0,0 +1,3 @@ +column.role=Autorisations +roles.filing=Lire et archiver +roles.readrecords=Lecture seule diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_it.properties new file mode 100644 index 0000000000..92c7c91d09 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_it.properties @@ -0,0 +1,3 @@ +column.role=Autorizzazioni +roles.filing=Leggi e archivia +roles.readrecords=Sola lettura diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_ja.properties new file mode 100644 index 0000000000..aedf4d557b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_ja.properties @@ -0,0 +1,3 @@ +column.role=\u6a29\u9650 +roles.filing=\u8aad\u307f\u53d6\u308a\u3068\u6574\u7406\u4fdd\u7ba1 +roles.readrecords=\u8aad\u307f\u53d6\u308a\u5c02\u7528 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_nb.properties new file mode 100644 index 0000000000..c6d4d1ad5b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_nb.properties @@ -0,0 +1,3 @@ +column.role=Tillatelser +roles.filing=Les og registrer +roles.readrecords=Skrivebeskyttet diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_nl.properties new file mode 100644 index 0000000000..5838aaf191 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_nl.properties @@ -0,0 +1,3 @@ +column.role=Rechten +roles.filing=Lezen en archiveren +roles.readrecords=Alleen-lezen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_pt_BR.properties new file mode 100644 index 0000000000..0a8e11a244 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_pt_BR.properties @@ -0,0 +1,3 @@ +column.role=Permiss\u00f5es +roles.filing=Ler e arquivar +roles.readrecords=Somente leitura diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_ru.properties new file mode 100644 index 0000000000..cf4e73c15c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_ru.properties @@ -0,0 +1,3 @@ +column.role=\u041f\u0440\u0430\u0432\u0430 +roles.filing=\u0427\u0442\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b +roles.readrecords=\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_zh_CN.properties new file mode 100644 index 0000000000..27ef3a5e4e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/manage-permissions/manage-permissions.get_zh_CN.properties @@ -0,0 +1,3 @@ +column.role=\u6743\u9650 +roles.filing=\u8bfb\u53d6\u548c\u7acb\u5377 +roles.readrecords=\u53ea\u8bfb diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/navigation/collaboration-navigation.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/navigation/collaboration-navigation.get.js new file mode 100644 index 0000000000..bc35261270 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/navigation/collaboration-navigation.get.js @@ -0,0 +1,27 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +model.isRmSite = true; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get.html.ftl new file mode 100644 index 0000000000..516ff17b4c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get.html.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="rm-css" target="css" action="after" scope="global"> + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/rm/components/node-details/node-header.css" group="node-header"/> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get.properties new file mode 100644 index 0000000000..c4921bbebb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get.properties @@ -0,0 +1 @@ +path.documents=File Plan \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_de.properties new file mode 100644 index 0000000000..900aee32b8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_de.properties @@ -0,0 +1 @@ +path.documents=Ablageplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_es.properties new file mode 100644 index 0000000000..bcbfb511b3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_es.properties @@ -0,0 +1 @@ +path.documents=Cuadro de clasificaci\u00f3n diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_fr.properties new file mode 100644 index 0000000000..d5728862f8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_fr.properties @@ -0,0 +1 @@ +path.documents=Plan de classement diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_it.properties new file mode 100644 index 0000000000..251e6c2d1e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_it.properties @@ -0,0 +1 @@ +path.documents=Piano di fascicolazione diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_ja.properties new file mode 100644 index 0000000000..a125709114 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_ja.properties @@ -0,0 +1 @@ +path.documents=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_nb.properties new file mode 100644 index 0000000000..98cf71d0b9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_nb.properties @@ -0,0 +1 @@ +path.documents=Filplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_nl.properties new file mode 100755 index 0000000000..e2f2e7851d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_nl.properties @@ -0,0 +1 @@ +path.documents=Ordeningsplan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_pt_BR.properties new file mode 100644 index 0000000000..c17f3a2f37 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_pt_BR.properties @@ -0,0 +1 @@ +path.documents=Plano de arquivamento diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_ru.properties new file mode 100644 index 0000000000..e7731b2fb2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_ru.properties @@ -0,0 +1 @@ +path.documents=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_zh_CN.properties new file mode 100644 index 0000000000..515a02c730 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/node-details/node-header.get_zh_CN.properties @@ -0,0 +1 @@ +path.documents=\u5f52\u7c7b\u65b9\u6848 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/people-finder/authority-finder.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/people-finder/authority-finder.get.js new file mode 100644 index 0000000000..dc17a38780 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/people-finder/authority-finder.get.js @@ -0,0 +1,32 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +if (args.module == "rm") +{ + var widgets = model.widgets; + widgets[0].name = "Alfresco.rm.AuthorityFinder"; + model.widgets = widgets; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/people-finder/authority-query.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/people-finder/authority-query.get.js new file mode 100644 index 0000000000..19675bbe3e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/people-finder/authority-query.get.js @@ -0,0 +1,107 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function shouldFilter(callResult) +{ + var result = false; + + if (new RegExp("ExtendedReaders").test(callResult.shortName) || + new RegExp("ExtendedWriters").test(callResult.shortName) || + new RegExp("GROUP_Administrator").test(callResult.fullName)) + { + result = true; + } + + return result; +} + +var getRmMappings = function() +{ + // Remove "GROUP_EVERYONE" from the mapping + var mappings = getMappings(); + if (args.defGroupsFor === 'rm') + { + mappings.pop(); + } + + var additionalMappings = []; + if (args.showGroups != null && args.showGroups == "true") + { + additionalMappings.push( + { + type: MAPPING_TYPE.API, + url: "/api/groups?shortNameFilter=" + encodeURIComponent(args.filter) + "&zone=" + encodeURIComponent("APP.DEFAULT"), + rootObject: "data", + fn: mapGroup + }); + } + + return mappings.concat(additionalMappings); +}; + +function rm_main() +{ + var mappings = getRmMappings(), + connector = remote.connect("alfresco"), + authorities = [], + mapping, result, data, i, ii, j, jj; + + for (i = 0, ii = mappings.length; i < ii; i++) + { + mapping = mappings[i]; + if (mapping.type == MAPPING_TYPE.API) + { + result = connector.get(mapping.url); + if (result.status == 200) + { + data = eval('(' + result + ')'); + for (j = 0, jj = data[mapping.rootObject].length; j < jj; j++) + { + var callResult = mapping.fn.call(this, data[mapping.rootObject][j]), + isGroup = mapping.rootObject == "data"; + if (!isGroup || !shouldFilter(callResult)) + { + authorities.push(callResult); + } + } + } + } + else if (mapping.type == MAPPING_TYPE.STATIC) + { + for (j = 0, jj = mapping.data.length; j < jj; j++) + { + authorities.push(mapping.fn.call(this, mapping.data[j])); + } + } + } + + return authorities; +} + +model.authorities = rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-header.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-header.get.html.ftl new file mode 100644 index 0000000000..37b2e5eda8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-header.get.html.ftl @@ -0,0 +1,30 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="rm-js" target="js" action="after" scope="global"> + <@script src="${url.context}/res/rm/components/rules/rules-header.js" group="rules"/> + <@script src="${url.context}/res/rm/components/rules/rules-picker.js" group="rules"/> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-header.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-header.get.js new file mode 100644 index 0000000000..d570777baf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-header.get.js @@ -0,0 +1,35 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function rm_main() +{ + model.widgets[0].name = "Alfresco.rm.RulesHeader"; +} + +rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-linked.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-linked.get.html.ftl new file mode 100644 index 0000000000..15a0882ce9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-linked.get.html.ftl @@ -0,0 +1,29 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="rm-js" target="js" action="after" scope="global"> + <@script src="${url.context}/res/rm/components/rules/rules-linked.js" group="rules"/> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-linked.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-linked.get.js new file mode 100644 index 0000000000..11ece69f43 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/rules/rules-linked.get.js @@ -0,0 +1,35 @@ + + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function rm_main() +{ + model.widgets[0].name = "Alfresco.rm.module.RulesLinked"; +} + +rm_main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/site/customise-pages.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/site/customise-pages.get.js new file mode 100644 index 0000000000..a4d7fabfd5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/components/site/customise-pages.get.js @@ -0,0 +1,83 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/* For RM site we need to ensure that the RM specific pages are always available + * even if they've been removed... + * + * The presets.xml file contains the following for the RM site... + * + * [{"pageId":"documentlibrary"}, {"pageId":"rmsearch"}] + * {"documentlibrary":{"titleId":"page.rmDocumentLibrary.title", "descriptionId":"page.rmDocumentLibrary.description", "type":"dod5015"}} + * + * ...this is the only place that the pageMetadata is defined by default. Once the page is removed the + * data is effectively lost. So it is duplicated here (which is unfortunate but a necessity at the current time). + * + */ + +var filePlanPage = null, + rmSearchPage = null; + +var defaultPages = model.pages; +if (defaultPages != null) +{ + // Check the current pages... + for (var i=0; i. + #L% +--> + <#assign el=args.htmlid?html> + + <@markup id="rm-custom-fields" target="fields" action="after" scope="global"> + + <#-- RM COMPLIANCE --> +
+
+
+ +
+
+ + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/modules/create-site.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/modules/create-site.get.js new file mode 100644 index 0000000000..344934970f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/modules/create-site.get.js @@ -0,0 +1,46 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +// add rm site dashboard +model.sitePresets.push( +{ + id: "rm-site-dashboard", + name: msg.get("type.recordsManagementSite") +}); + +// compliance options +var compliance = +[ + { + id: "{http://www.alfresco.org/model/recordsmanagement/1.0}rmsite", + name: msg.get("compliance.standard") + }, + { + id: "{http://www.alfresco.org/model/dod5015/1.0}site", + name: msg.get("compliance.dod5015") + } +]; +model.compliance = compliance; diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get.js new file mode 100644 index 0000000000..24f0c3b115 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get.js @@ -0,0 +1,121 @@ +// +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +// Add "Management Console" Link +var siteNavigationWidgets = getSiteNavigationWidgets(), + isRmPageTitle = page.titleId == "page.rmSiteDashboard.title"; +if (siteNavigationWidgets.length > 0) +{ + // Highlight "Site Dashboard" + siteNavigationWidgets[0].config.selected = isRmPageTitle; + + var managementConsoleWidget = { + id: "HEADER_SITE_RM_MANAGEMENT_CONSOLE", + name: "alfresco/menus/AlfMenuBarItem", + config: { + id: "HEADER_SITE_RM_MANAGEMENT_CONSOLE", + label: msg.get("page.rmConsole.title"), + targetUrl: "console/rm-console/", + selected: false + } + }; + + if (siteNavigationWidgets.length < config.global.header.maxDisplayedSitePages) + { + siteNavigationWidgets.push(managementConsoleWidget); + } + else + { + lastNavigationWidget = siteNavigationWidgets.pop(); + if (lastNavigationWidget.config.widgets == undefined) + { + siteNavigationWidgets.push(lastNavigationWidget); + siteNavigationWidgets.push(managementConsoleWidget); + var forMoreMenu = siteNavigationWidgets.splice(config.global.header.maxDisplayedSitePages - 1, siteNavigationWidgets.length - config.global.header.maxDisplayedSitePages + 1); + siteNavigationWidgets.push({ + id: "HEADER_SITE_MORE_PAGES", + name: "alfresco/menus/AlfMenuBarPopup", + config: { + id: "HEADER_SITE_MORE_PAGES", + label: "page.navigation.more.label", + widgets: [ + { + name: "alfresco/menus/AlfMenuGroup", + config: { + widgets: forMoreMenu + } + } + ] + } + }); + } + else + { + lastNavigationWidget.config.widgets[0].config.widgets.push(managementConsoleWidget); + siteNavigationWidgets.push(lastNavigationWidget); + } + } + widgetUtils.findObject(model.jsonModel, "id", "HEADER_NAVIGATION_MENU_BAR").config.widgets = siteNavigationWidgets; +} + +// Add "Customize Dashboard" Link +if (isRmPageTitle) +{ + var titleBarModel = getTitleBarModel(), + customizeSiteDashboard = getCustomizeSiteDashboard(titleBarModel); + if (customizeSiteDashboard) + { + var widgets = customizeSiteDashboard.config.widgets; + widgets.unshift({ + name: "alfresco/menus/AlfMenuItem", + config: { + id: "HEADER_CUSTOMIZE_SITE_DASHBOARD", + label: "customize_dashboard.label", + iconClass: "alf-cog-icon", + targetUrl: "site/" + page.url.templateArgs.site + "/customise-site-dashboard" + } + }); + widgetUtils.findObject(model.jsonModel, "id", "HEADER_TITLE_MENU").config.widgets = titleBarModel; + } +} + +function getCustomizeSiteDashboard(titleBarModel) { + var result, + i, + length = titleBarModel.length; + + for (i = 0; i < length; i++) + { + if (titleBarModel[i].id == "HEADER_SITE_CONFIGURATION_DROPDOWN") + { + result = titleBarModel[i]; + break; + } + } + return result; +} diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get.properties new file mode 100644 index 0000000000..22cf0d34c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_de.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_de.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_es.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_es.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_fr.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_fr.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_it.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_it.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_ja.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_ja.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_nb.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_nb.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_nl.properties new file mode 100755 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_nl.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_pt_BR.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_pt_BR.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_ru.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_ru.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_zh_CN.properties new file mode 100644 index 0000000000..d7b59ea80e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/customizations/share/header/share-header.get_zh_CN.properties @@ -0,0 +1 @@ +#page.rmConsole.title=RM Admin Tools diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.desc.xml new file mode 100644 index 0000000000..196d466297 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.desc.xml @@ -0,0 +1,5 @@ + + Admin Console Record Management List of Value properties dialog + Administration Console - Record Management Tool List of Value properties dialog + /rm/modules/console/list-of-value-properties + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.html.ftl new file mode 100644 index 0000000000..621326921a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.html.ftl @@ -0,0 +1,41 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +
+
 
+
+
+
+
+
 *
+
+
+ + +
+
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.properties new file mode 100644 index 0000000000..91379f58e7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get.properties @@ -0,0 +1 @@ +label.name=Name diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_de.properties new file mode 100644 index 0000000000..91379f58e7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_de.properties @@ -0,0 +1 @@ +label.name=Name diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_es.properties new file mode 100755 index 0000000000..49960ed6ae --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_es.properties @@ -0,0 +1 @@ +label.name=Nombre diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_fr.properties new file mode 100644 index 0000000000..507ff8319d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_fr.properties @@ -0,0 +1 @@ +label.name=Nom diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_it.properties new file mode 100644 index 0000000000..414c6ce62a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_it.properties @@ -0,0 +1 @@ +label.name=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_ja.properties new file mode 100644 index 0000000000..fc5ac5d405 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_ja.properties @@ -0,0 +1 @@ +label.name=\u540d\u524d diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_nb.properties new file mode 100644 index 0000000000..a135d693b5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_nb.properties @@ -0,0 +1 @@ +label.name=Navn diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_nl.properties new file mode 100755 index 0000000000..270503131d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_nl.properties @@ -0,0 +1 @@ +label.name=Naam diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_pt_BR.properties new file mode 100644 index 0000000000..414c6ce62a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_pt_BR.properties @@ -0,0 +1 @@ +label.name=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_ru.properties new file mode 100644 index 0000000000..0f491dab49 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_ru.properties @@ -0,0 +1 @@ +label.name=\u0418\u043c\u044f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_zh_CN.properties new file mode 100644 index 0000000000..4d028d3edd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/console/list-of-value-properties.get_zh_CN.properties @@ -0,0 +1 @@ +label.name=\u540d\u79f0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.desc.xml new file mode 100644 index 0000000000..d81e544d76 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.desc.xml @@ -0,0 +1,5 @@ + + Add Record Metadata dialog + Add Record Metadata module for Records Management Document Library + /rm/modules/documentlibrary/add-record-metadata + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.html.ftl new file mode 100644 index 0000000000..2bac8e2f33 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.html.ftl @@ -0,0 +1,48 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid> +
+
${msg("header")}
+
+
+
+
+
+ +
+
+
+ + +
+
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.js new file mode 100644 index 0000000000..c3681a7329 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.js @@ -0,0 +1,91 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Sort helper function for objects with ids + * + * @param obj1 + * @param obj2 + */ +function sortById(obj1, obj2) +{ + return (obj1.id > obj2.id) ? 1 : (obj1.id < obj2.id) ? -1 : 0; +} + +/** + * Main entrypoint for component webscript logic + * + * @method main + */ +function main() +{ + // Load rm specific record types + var callUri = "/api/rma/recordmetadataaspects"; + if(args.nodeRef != null) + { + callUri += "?noderef=" + args.nodeRef; + } + var result = remote.call(callUri); + if (result.status == 200) + { + var rmAspects = eval('(' + result + ')').data.recordMetaDataAspects; + var recordTypes = []; + + if (args.nodeRef != null) + { + result = remote.call("/api/rmmetadata?extended=true&noderef=" + args.nodeRef); + var nodeAspects = eval('(' + result + ')').aspects; + + for (var i = 0; i < rmAspects.length; i++) + { + for (var j = 0; j < nodeAspects.length; j++) + { + if (rmAspects[i].id == nodeAspects[j].prefixedName) + { + break; + } + } + if (j == nodeAspects.length) + { + recordTypes.push(rmAspects[i]); + } + } + } + else + { + for (var i = 0; i < rmAspects.length; i++) + { + recordTypes.push(rmAspects[i]); + } + } + + // Add and set in model + recordTypes.sort(sortById); + model.recordTypes = recordTypes; + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.properties new file mode 100644 index 0000000000..e922fff9eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get.properties @@ -0,0 +1,2 @@ +header=Add Record Metadata +label.record-type=Record Type diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_de.properties new file mode 100644 index 0000000000..bf3c609b03 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_de.properties @@ -0,0 +1,2 @@ +header=Record-Metadaten hinzuf\u00fcgen +label.record-type=Record-Typ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_es.properties new file mode 100755 index 0000000000..d201aa23ba --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_es.properties @@ -0,0 +1,2 @@ +header=A\u00f1adir metadatos de documento de archivo +label.record-type=Tipo de documento de archivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_fr.properties new file mode 100644 index 0000000000..d497e0a8b2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_fr.properties @@ -0,0 +1,2 @@ +header=Ajouter des m\u00e9tadonn\u00e9es de document d'archives +label.record-type=Type de document d'archives diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_it.properties new file mode 100644 index 0000000000..08ac926357 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_it.properties @@ -0,0 +1,2 @@ +header=Aggiungi metadati del record +label.record-type=Tipo di record diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_ja.properties new file mode 100644 index 0000000000..7e6d3b4c1a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_ja.properties @@ -0,0 +1,2 @@ +header=\u30ec\u30b3\u30fc\u30c9\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u8ffd\u52a0 +label.record-type=\u30ec\u30b3\u30fc\u30c9\u30bf\u30a4\u30d7 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_nb.properties new file mode 100644 index 0000000000..8c304370c6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_nb.properties @@ -0,0 +1,2 @@ +header=Legg til registrering av metadata +label.record-type=Oppf\u00f8ringstype diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_nl.properties new file mode 100755 index 0000000000..1b094dd916 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_nl.properties @@ -0,0 +1,2 @@ +header=Metagegevens van archiefstuk toevoegen +label.record-type=Archiefstuktype diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_pt_BR.properties new file mode 100644 index 0000000000..b4fc4be57f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_pt_BR.properties @@ -0,0 +1,2 @@ +header=Adicionar metadados do documento arquiv\u00edstico +label.record-type=Tipo de documento arquiv\u00edstico diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_ru.properties new file mode 100644 index 0000000000..cf2b0e8d93 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_ru.properties @@ -0,0 +1,2 @@ +header=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +label.record-type=\u0422\u0438\u043f \u0437\u0430\u043f\u0438\u0441\u0438 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_zh_CN.properties new file mode 100644 index 0000000000..f134d9768f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/add-record-metadata.get_zh_CN.properties @@ -0,0 +1,2 @@ +header=\u6dfb\u52a0\u8bb0\u5f55\u5143\u6570\u636e +label.record-type=\u8bb0\u5f55\u7c7b\u578b diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.desc.xml new file mode 100644 index 0000000000..c073ceb58d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.desc.xml @@ -0,0 +1,5 @@ + + copy-move-link-file-to + Copy-, Move-, Link- and File-To module for Records Management Document Library + /rm/modules/documentlibrary/copy-move-link-file-to + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.html.ftl new file mode 100644 index 0000000000..f66e68c202 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.html.ftl @@ -0,0 +1,59 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid?html> +
+
+
+
+

${msg("header")}

+
+
+
+ + +
+
+
+<#assign treeConfig = config.scoped["DocumentLibrary"]["tree"]!> +<#assign isRmUser = isRmUser> +<#assign isAdmin = isAdmin> +<#assign rmSiteExists = rmSiteExists> +<#if treeConfig.getChildValue??> + <#assign evaluateChildFoldersSite = treeConfig.getChildValue("evaluate-child-folders")!"true"> + <#assign maximumFolderCountSite = treeConfig.getChildValue("maximum-folder-count")!"-1"> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.js new file mode 100644 index 0000000000..752d4a5b8e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.js @@ -0,0 +1,53 @@ + +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +function main() { + model.isRmUser = "false"; + model.isAdmin = "false"; + model.rmSiteExists = "false"; + + // Check if the user is an RM User + var conn = remote.connect("alfresco"); + if (isRmUser(conn)) + { + model.isRmUser = "true"; + } + + //Check if the user is an alfresco administrator + if (isAdmin(conn)) + { + model.isAdmin = "true"; + } + + if(isRmSite(conn, "rm")) + { + model.rmSiteExists ="true"; + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.properties new file mode 100644 index 0000000000..b97738d2c1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get.properties @@ -0,0 +1,58 @@ +## Common +header=Choose the destination folder + +## Copy To +copy.node.root=File Plan +copy.node.unfiledroot=Unfiled Records +copy.title.single=Copy {0} to... +copy.title.multi=Copy {0} items to... +copy.button=Copy +copy.message.no-files=Select at least one file +copy.message.please-wait=Copying files... +copy.message.success=Successfully copied {0} items +copy.message.failure=We couldn't copy the items. They might already be in use. Try refreshing your browser. + +## Move To +move.node.root=File Plan +move.node.unfiledroot=Unfiled Records +move.title.single=Move {0} to... +move.title.multi=Move {0} items to... +move.button=Move +move.message.no-files=Select at least one file +move.message.please-wait=Moving files... +move.message.success=Successfully moved {0} items +move.message.failure=We couldn't move the items. They might already be in use. Try refreshing your browser. + +## Link To +link.node.root=File Plan +link.node.unfiledroot=Unfiled Records +link.title.single=Link {0} to... +link.title.multi=Link {0} items to... +link.button=Link +link.message.no-files=Select at least one file +link.message.please-wait=Linking files... +link.message.success=Successfully linked {0} items +link.message.failure=We couldn't link the items. They might already be in use. Try refreshing your browser. + +## File To +file.node.root=File Plan +file.node.unfiledroot=Unfiled Records +file.title.single=File {0} to... +file.title.multi=File {0} items to... +file.button=File +file.message.no-files=Select at least one file +file.message.please-wait=Filing... +file.message.success=Successfully filed {0} items +file.message.failure=We couldn't file the items. They might already be in use. Try refreshing your browser. + +## Declare Record And File To +declareAndFile.node.root=File Plan +declareAndFile.node.unfiledroot=Unfiled Records +declareAndFile.title.single=Declare as record and file {0} to... +declareAndFile.button=Declare and File + +## Declare Version As Record And File To +declareVersionAndFile.node.root=File Plan +declareVersionAndFile.node.unfiledroot=Unfiled Records +declareVersionAndFile.title.single=Declare version as record and file {0} to... +declareVersionAndFile.button=Declare and File \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_de.properties new file mode 100644 index 0000000000..527edf38a4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_de.properties @@ -0,0 +1,58 @@ +## Common +header=Zielordner w\u00e4hlen + +## Copy To +copy.node.root=Ablageplan +copy.node.unfiledroot=Nicht abgelegte Records +copy.title.single={0} kopieren nach... +copy.title.multi={0} Elemente kopieren nach... +copy.button=Kopieren +copy.message.no-files=W\u00e4hlen Sie mindestens eine Datei aus. +copy.message.please-wait=Dateien werden kopiert... +copy.message.success={0} Elemente erfolgreich kopiert +copy.message.failure=Elemente konnten nicht kopiert werden. M\u00f6glicherweise werden sie bereits verwendet. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +## Move To +move.node.root=Ablageplan +move.node.unfiledroot=Nicht abgelegte Records +move.title.single={0} verschieben nach... +move.title.multi={0} Elemente verschieben nach... +move.button=Verschieben +move.message.no-files=W\u00e4hlen Sie mindestens eine Datei aus. +move.message.please-wait=Dateien werden verschoben... +move.message.success={0} Elemente erfolgreich verschoben +move.message.failure=Elemente konnten nicht verschoben werden. M\u00f6glicherweise werden sie bereits verwendet. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +## Link To +link.node.root=Ablageplan +link.node.unfiledroot=Nicht abgelegte Records +link.title.single={0} verkn\u00fcpfen mit... +link.title.multi={0} Elemente verkn\u00fcpfen mit... +link.button=Verkn\u00fcpfen +link.message.no-files=W\u00e4hlen Sie mindestens eine Datei aus. +link.message.please-wait=Dateien werden verkn\u00fcpft... +link.message.success={0} Elemente erfolgreich verkn\u00fcpft. +link.message.failure=Elemente konnten nicht verkn\u00fcpft werden. M\u00f6glicherweise werden sie bereits verwendet. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +## File To +file.node.root=Ablageplan +file.node.unfiledroot=Nicht abgelegte Records +file.title.single={0} ablegen unter... +file.title.multi={0} Elemente ablegen unter... +file.button=Ablegen +file.message.no-files=W\u00e4hlen Sie mindestens eine Datei aus. +file.message.please-wait=Ablage wird durchgef\u00fchrt... +file.message.success={0} Elemente erfolgreich abgelegt. +file.message.failure=Elemente konnten nicht abgelegt werden. M\u00f6glicherweise werden sie bereits verwendet. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen. + +## Declare Record And File To +declareAndFile.node.root=Ablageplan +declareAndFile.node.unfiledroot=Nicht abgelegte Records +declareAndFile.title.single={0} als Record deklarieren und ablegen unter ... +declareAndFile.button=Deklarieren und ablegen + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Ablageplan +declareVersionAndFile.node.unfiledroot=Nicht abgelegte Records +declareVersionAndFile.title.single=Version als Record deklarieren und {0} ablegen unter... +declareVersionAndFile.button=Deklarieren und ablegen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_es.properties new file mode 100755 index 0000000000..8040c8d82d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_es.properties @@ -0,0 +1,58 @@ +## Common +header=Elija la carpeta de destino + +## Copy To +copy.node.root=Cuadro de clasificaci\u00f3n +copy.node.unfiledroot=Documentos de archivo no archivados +copy.title.single=Copiar {0} a... +copy.title.multi=Copiar {0} elementos a... +copy.button=Copiar +copy.message.no-files=Seleccione al menos un fichero +copy.message.please-wait=Copiando ficheros... +copy.message.success=Se copiaron {0} elementos correctamente +copy.message.failure=No se pudieron copiar los elementos. Puede que ya est\u00e9n en uso. Trate de actualizar el navegador. + +## Move To +move.node.root=Cuadro de clasificaci\u00f3n +move.node.unfiledroot=Documentos de archivo no archivados +move.title.single=Mover {0} a... +move.title.multi=Mover {0} elementos a... +move.button=Mover +move.message.no-files=Seleccione al menos un fichero +move.message.please-wait=Moviendo ficheros... +move.message.success=Se movieron {0} elementos correctamente +move.message.failure=No se pudieron mover los elementos. Puede que ya est\u00e9n en uso. Trate de actualizar el navegador. + +## Link To +link.node.root=Cuadro de clasificaci\u00f3n +link.node.unfiledroot=Documentos de archivo no archivados +link.title.single=Enlazar {0} a... +link.title.multi=Enlazar {0} elementos a... +link.button=Enlazar +link.message.no-files=Seleccione al menos un fichero +link.message.please-wait=Vinculando ficheros... +link.message.success=Se duplicaron {0} elementos correctamente. +link.message.failure=No se pudieron vincular los elementos. Puede que ya est\u00e9n en uso. Trate de actualizar el navegador. + +## File To +file.node.root=Cuadro de clasificaci\u00f3n +file.node.unfiledroot=Documentos de archivo no archivados +file.title.single=Archivar {0} a... +file.title.multi=Archivar {0} elementos a... +file.button=Fichero +file.message.no-files=Seleccione al menos un fichero +file.message.please-wait=Archivando... +file.message.success=Se duplicaron {0} elementos correctamente +file.message.failure=No se pudieron archivar los elementos. Puede que ya est\u00e9n en uso. Trate de actualizar el navegador. + +## Declare Record And File To +declareAndFile.node.root=Cuadro de clasificaci\u00f3n +declareAndFile.node.unfiledroot=Documentos de archivo no archivados +declareAndFile.title.single=Declarar como documento de archivo y archivar {0} en... +declareAndFile.button=Declarar y archivar + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Cuadro de clasificaci\u00f3n +declareVersionAndFile.node.unfiledroot=Documentos de archivo no archivados +declareVersionAndFile.title.single=Declarar versi\u00f3n como documento de archivo y archivar {0} en... +declareVersionAndFile.button=Declarar y archivar diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_fr.properties new file mode 100644 index 0000000000..ad6339652d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_fr.properties @@ -0,0 +1,58 @@ +## Common +header=Choisir le dossier de destination + +## Copy To +copy.node.root=Plan de classement +copy.node.unfiledroot=Documents d'archives non class\u00e9s +copy.title.single=Copier {0} vers... +copy.title.multi=Copier {0} \u00e9l\u00e9ments vers... +copy.button=Copier +copy.message.no-files=S\u00e9lectionner au moins un fichier +copy.message.please-wait=Copie des fichiers... +copy.message.success={0} \u00e9l\u00e9ments ont bien \u00e9t\u00e9 copi\u00e9s +copy.message.failure=Impossible de copier les \u00e9l\u00e9ments. Ils sont peut-\u00eatre d\u00e9j\u00e0 en cours d'utilisation. Essayez d'actualiser votre navigateur. + +## Move To +move.node.root=Plan de classement +move.node.unfiledroot=Documents d'archives non class\u00e9s +move.title.single=D\u00e9placer {0} vers... +move.title.multi=D\u00e9placer {0} \u00e9l\u00e9ments vers... +move.button=D\u00e9placer +move.message.no-files=S\u00e9lectionner au moins un fichier +move.message.please-wait=D\u00e9placement des fichiers... +move.message.success={0} \u00e9l\u00e9ments ont bien \u00e9t\u00e9 d\u00e9plac\u00e9s +move.message.failure=Impossible de d\u00e9placer les \u00e9l\u00e9ments. Ils sont peut-\u00eatre d\u00e9j\u00e0 en cours d'utilisation. Essayez d'actualiser votre navigateur. + +## Link To +link.node.root=Plan de classement +link.node.unfiledroot=Documents d'archives non class\u00e9s +link.title.single=Lier {0} \u00e0... +link.title.multi=Lier {0} \u00e9l\u00e9ments \u00e0... +link.button=Lien +link.message.no-files=S\u00e9lectionner au moins un fichier +link.message.please-wait=Lien des fichiers... +link.message.success={0} \u00e9l\u00e9ments ont bien \u00e9t\u00e9 li\u00e9s +link.message.failure=Impossible de lier les \u00e9l\u00e9ments. Ils sont peut-\u00eatre d\u00e9j\u00e0 en cours d'utilisation. Essayez d'actualiser votre navigateur. + +## File To +file.node.root=Plan de classement +file.node.unfiledroot=Documents d'archives non class\u00e9s +file.title.single=Archiver {0} vers... +file.title.multi=Archiver {0} \u00e9l\u00e9ments vers... +file.button=Fichier +file.message.no-files=S\u00e9lectionner au moins un fichier +file.message.please-wait=Archivage... +file.message.success={0} \u00e9l\u00e9ments ont bien \u00e9t\u00e9 class\u00e9s +file.message.failure=Impossible d'archiver les \u00e9l\u00e9ments. Ils sont peut-\u00eatre d\u00e9j\u00e0 en cours d'utilisation. Essayez d'actualiser votre navigateur. + +## Declare Record And File To +declareAndFile.node.root=Plan de classement +declareAndFile.node.unfiledroot=Documents d'archives non class\u00e9s +declareAndFile.title.single=D\u00e9clarer comme document d''archives et classer {0} dans... +declareAndFile.button=D\u00e9clarer et classer + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Plan de classement +declareVersionAndFile.node.unfiledroot=Documents d'archives non class\u00e9s +declareVersionAndFile.title.single=D\u00e9clarer la version comme document d''archives et classer {0} dans... +declareVersionAndFile.button=D\u00e9clarer et classer diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_it.properties new file mode 100644 index 0000000000..c21315da07 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_it.properties @@ -0,0 +1,58 @@ +## Common +header=Scegli cartella di destinazione + +## Copy To +copy.node.root=Piano di fascicolazione +copy.node.unfiledroot=Record non archiviati +copy.title.single=Copia {0} in... +copy.title.multi=Copia {0} elementi in... +copy.button=Copia +copy.message.no-files=Seleziona almeno un file +copy.message.please-wait=Copia dei file... +copy.message.success={0} elementi copiati +copy.message.failure=Impossibile copiare gli elementi. Potrebbero essere gi\u00e0 in uso. Provare ad aggiornare il browser. + +## Move To +move.node.root=Piano di fascicolazione +move.node.unfiledroot=Record non archiviati +move.title.single=Sposta {0} in... +move.title.multi=Sposta {0} elementi in... +move.button=Sposta +move.message.no-files=Seleziona almeno un file +move.message.please-wait=Spostamento dei file... +move.message.success=Spostamento {0} elementi riuscito +move.message.failure=Impossibile spostare gli elementi. Potrebbero essere gi\u00e0 in uso. Provare ad aggiornare il browser. + +## Link To +link.node.root=Piano di fascicolazione +link.node.unfiledroot=Record non archiviati +link.title.single=Collega {0} a... +link.title.multi=Collega {0} elementi a... +link.button=Collega +link.message.no-files=Seleziona almeno un file +link.message.please-wait=Collegamento file... +link.message.success=Collegamento {0} elementi riuscito +link.message.failure=Impossibile collegare elementi. Potrebbero essere gi\u00e0 in uso. Provare ad aggiornare il browser. + +## File To +file.node.root=Piano di fascicolazione +file.node.unfiledroot=Record non archiviati +file.title.single=Archivia {0} su... +file.title.multi=Archivia {0} elementi su... +file.button=File +file.message.no-files=Seleziona almeno un file +file.message.please-wait=Archiviazione... +file.message.success=Archiviazione {0} elementi riuscita +file.message.failure=Impossibile archiviare gli elementi. Potrebbero essere gi\u00e0 in uso. Provare ad aggiornare il browser. + +## Declare Record And File To +declareAndFile.node.root=Piano di fascicolazione +declareAndFile.node.unfiledroot=Record non archiviati +declareAndFile.title.single=Dichiara come record e archivia {0} in... +declareAndFile.button=Dichiara e archivia + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Piano di fascicolazione +declareVersionAndFile.node.unfiledroot=Record non archiviati +declareVersionAndFile.title.single=Dichiara versione come record e archivia {0} in... +declareVersionAndFile.button=Dichiara e archivia diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_ja.properties new file mode 100644 index 0000000000..ab9e283d32 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_ja.properties @@ -0,0 +1,58 @@ +## Common +header=\u30bf\u30fc\u30b2\u30c3\u30c8\u30d5\u30a9\u30eb\u30c0\u306e\u9078\u629e + +## Copy To +copy.node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +copy.node.unfiledroot=\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +copy.title.single={0} \u306e\u30b3\u30d4\u30fc\u5148... +copy.title.multi={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u30b3\u30d4\u30fc\u5148... +copy.button=\u30b3\u30d4\u30fc +copy.message.no-files=\u30d5\u30a1\u30a4\u30eb\u3092\u6700\u4f4e 1 \u3064\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +copy.message.please-wait=\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059... +copy.message.success={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u30b3\u30d4\u30fc\u3055\u308c\u307e\u3057\u305f +copy.message.failure=\u30a2\u30a4\u30c6\u30e0\u3092\u30b3\u30d4\u30fc\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30a2\u30a4\u30c6\u30e0\u304c\u4f7f\u7528\u4e2d\u306e\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +## Move To +move.node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +move.node.unfiledroot=\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +move.title.single={0} \u306e\u79fb\u52d5\u5148... +move.title.multi={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u79fb\u52d5\u5148... +move.button=\u79fb\u52d5 +move.message.no-files=\u30d5\u30a1\u30a4\u30eb\u3092\u6700\u4f4e 1 \u3064\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +move.message.please-wait=\u30d5\u30a1\u30a4\u30eb\u3092\u79fb\u52d5\u3057\u3066\u3044\u307e\u3059... +move.message.success={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u79fb\u52d5\u3055\u308c\u307e\u3057\u305f +move.message.failure=\u30a2\u30a4\u30c6\u30e0\u3092\u79fb\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f \u30a2\u30a4\u30c6\u30e0\u304c\u4f7f\u7528\u4e2d\u306e\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +## Link To +link.node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +link.node.unfiledroot=\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +link.title.single={0} \u306e\u30ea\u30f3\u30af\u5148... +link.title.multi={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u30ea\u30f3\u30af\u5148... +link.button=\u30ea\u30f3\u30af +link.message.no-files=\u30d5\u30a1\u30a4\u30eb\u3092\u6700\u4f4e 1 \u3064\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +link.message.please-wait=\u30d5\u30a1\u30a4\u30eb\u3092\u30ea\u30f3\u30af\u3057\u3066\u3044\u307e\u3059... +link.message.success={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u30ea\u30f3\u30af\u3055\u308c\u307e\u3057\u305f +link.message.failure=\u30a2\u30a4\u30c6\u30e0\u3092\u30ea\u30f3\u30af\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f \u30a2\u30a4\u30c6\u30e0\u304c\u4f7f\u7528\u4e2d\u306e\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +## File To +file.node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +file.node.unfiledroot=\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +file.title.single={0} \u306e\u6574\u7406\u4fdd\u7ba1\u5148... +file.title.multi={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u6574\u7406\u4fdd\u7ba1\u5148... +file.button=\u30d5\u30a1\u30a4\u30eb +file.message.no-files=\u30d5\u30a1\u30a4\u30eb\u3092\u6700\u4f4e 1 \u3064\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +file.message.please-wait=\u6574\u7406\u4fdd\u7ba1\u3057\u3066\u3044\u307e\u3059... +file.message.success={0} \u4ef6\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u6b63\u5e38\u306b\u30d5\u30a1\u30a4\u30eb\u3057\u307e\u3057\u305f +file.message.failure=\u30a2\u30a4\u30c6\u30e0\u3092\u6574\u7406\u4fdd\u7ba1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f \u30a2\u30a4\u30c6\u30e0\u304c\u4f7f\u7528\u4e2d\u306e\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +## Declare Record And File To +declareAndFile.node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +declareAndFile.node.unfiledroot=\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +declareAndFile.title.single={0} \u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3057\u3066\u6574\u7406\u4fdd\u7ba1... +declareAndFile.button=\u5ba3\u8a00\u3057\u3066\u6574\u7406\u4fdd\u7ba1 + +## Declare Version As Record And File To +declareVersionAndFile.node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +declareVersionAndFile.node.unfiledroot=\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9 +declareVersionAndFile.title.single=\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3057\u3001{0} \u3092\u6b21\u306e\u5834\u6240\u306b\u6574\u7406\u4fdd\u7ba1... +declareVersionAndFile.button=\u5ba3\u8a00\u3057\u3066\u6574\u7406\u4fdd\u7ba1 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_nb.properties new file mode 100644 index 0000000000..c7a6b50040 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_nb.properties @@ -0,0 +1,58 @@ +## Common +header=Velg m\u00e5lmappe + +## Copy To +copy.node.root=Filplan +copy.node.unfiledroot=Oppf\u00f8ringer som ikke er registrert +copy.title.single=Kopier {0} til... +copy.title.multi=Kopier {0} elementer til... +copy.button=Kopier +copy.message.no-files=Velg minst \u00e9n fil +copy.message.please-wait=Kopierer filer... +copy.message.success={0} elementer er n\u00e5 kopiert +copy.message.failure=Kunne ikke kopiere elementene. De er muligens allerede i bruk. Pr\u00f8v \u00e5 oppdatere nettleseren. + +## Move To +move.node.root=Filplan +move.node.unfiledroot=Oppf\u00f8ringer som ikke er registrert +move.title.single=Flytt {0} til... +move.title.multi=Flytt {0} elementer til... +move.button=Flytt +move.message.no-files=Velg minst \u00e9n fil +move.message.please-wait=Flytter filer... +move.message.success={0} elementer er n\u00e5 flyttet +move.message.failure=Kunne ikke flytte elementene. De er muligens allerede i bruk. Pr\u00f8v \u00e5 oppdatere nettleseren. + +## Link To +link.node.root=Filplan +link.node.unfiledroot=Oppf\u00f8ringer som ikke er registrert +link.title.single=Koble {0} til... +link.title.multi=Koble {0} elementer til... +link.button=Kobling +link.message.no-files=Velg minst \u00e9n fil +link.message.please-wait=Kobler filer... +link.message.success={0} elementer er n\u00e5 koblet +link.message.failure=Kunne ikke koble elementene. De er muligens allerede i bruk. Pr\u00f8v \u00e5 oppdatere nettleseren. + +## File To +file.node.root=Filplan +file.node.unfiledroot=Oppf\u00f8ringer som ikke er registrert +file.title.single=Arkiver {0} i... +file.title.multi=Arkiver {0} elementer i... +file.button=Fil +file.message.no-files=Velg minst \u00e9n fil +file.message.please-wait=Arkiverer... +file.message.success={0} elementer er n\u00e5 registrert +file.message.failure=Kunne ikke registrere elementene. De er muligens allerede i bruk. Pr\u00f8v \u00e5 oppdatere nettleseren. + +## Declare Record And File To +declareAndFile.node.root=Filplan +declareAndFile.node.unfiledroot=Oppf\u00f8ringer som ikke er registrert +declareAndFile.title.single=Erkl\u00e6r som oppf\u00f8ring og arkiver {0} til... +declareAndFile.button=Erkl\u00e6r og arkiver + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Filplan +declareVersionAndFile.node.unfiledroot=Oppf\u00f8ringer som ikke er registrert +declareVersionAndFile.title.single=Erkl\u00e6r versjonen som en oppf\u00f8ring og arkiver {0} til... +declareVersionAndFile.button=Erkl\u00e6r og arkiver diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_nl.properties new file mode 100755 index 0000000000..e34b4eddd6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_nl.properties @@ -0,0 +1,58 @@ +## Common +header=De doelmap selecteren + +## Copy To +copy.node.root=Ordeningsplan +copy.node.unfiledroot=Niet-gearchiveerde archiefstukken +copy.title.single={0} kopi\u00ebren naar... +copy.title.multi={0} items kopi\u00ebren naar... +copy.button=Kopi\u00ebren +copy.message.no-files=Selecteer minstens \u00e9\u00e9n bestand +copy.message.please-wait=Bestanden kopi\u00ebren... +copy.message.success={0} items gekopieerd +copy.message.failure=Kan de items niet kopi\u00ebren. Ze zijn mogelijk al in gebruik. Vernieuw de browser. + +## Move To +move.node.root=Ordeningsplan +move.node.unfiledroot=Niet-gearchiveerde archiefstukken +move.title.single={0} verplaatsen naar... +move.title.multi={0} items verplaatsen naar... +move.button=Verplaatsen +move.message.no-files=Selecteer minstens \u00e9\u00e9n bestand +move.message.please-wait=Bestanden verplaatsen... +move.message.success={0} items verplaatst +move.message.failure=Kan de items niet verplaatsen. Ze zijn mogelijk al in gebruik. Vernieuw de browser. + +## Link To +link.node.root=Ordeningsplan +link.node.unfiledroot=Niet-gearchiveerde archiefstukken +link.title.single={0} koppelen aan... +link.title.multi={0} items koppelen aan... +link.button=Koppeling +link.message.no-files=Selecteer minstens \u00e9\u00e9n bestand +link.message.please-wait=Bestanden koppelen... +link.message.success={0} items gekoppeld +link.message.failure=Kan de items niet koppelen Ze zijn mogelijk al in gebruik. Vernieuw de browser. + +## File To +file.node.root=Ordeningsplan +file.node.unfiledroot=Niet-gearchiveerde archiefstukken +file.title.single={0} archiveren naar... +file.title.multi={0} items archiveren naar... +file.button=Archiveren +file.message.no-files=Selecteer minstens \u00e9\u00e9n bestand +file.message.please-wait=Archiveren... +file.message.success={0} items gearchiveerd +file.message.failure=Kan de items niet archiveren Ze zijn mogelijk al in gebruik. Vernieuw de browser. + +## Declare Record And File To +declareAndFile.node.root=Ordeningsplan +declareAndFile.node.unfiledroot=Niet-gearchiveerde archiefstukken +declareAndFile.title.single=Declareren als archiefstuk en {0} archiveren in... +declareAndFile.button=Declareren en archiveren + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Ordeningsplan +declareVersionAndFile.node.unfiledroot=Niet-gearchiveerde archiefstukken +declareVersionAndFile.title.single=Versie declareren als archiefstuk en {0} archiveren in... +declareVersionAndFile.button=Declareren en archiveren diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_pt_BR.properties new file mode 100644 index 0000000000..f0e3f10ccc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_pt_BR.properties @@ -0,0 +1,58 @@ +## Common +header=Escolher a pasta de destino + +## Copy To +copy.node.root=Plano de arquivamento +copy.node.unfiledroot=Documentos arquiv\u00edsticos n\u00e3o arquivados +copy.title.single=Copiar {0} para... +copy.title.multi=Copiar {0} itens para... +copy.button=Copiar +copy.message.no-files=Selecione pelo menos um arquivo +copy.message.please-wait=Copiando arquivos... +copy.message.success={0} itens copiados com sucesso +copy.message.failure=N\u00e3o foi poss\u00edvel copiar os itens. Eles podem j\u00e1 estar em uso. Tente atualizar seu navegador. + +## Move To +move.node.root=Plano de arquivamento +move.node.unfiledroot=Documentos arquiv\u00edsticos n\u00e3o arquivados +move.title.single=Mover {0} para... +move.title.multi=Mover ''{0}'' itens para... +move.button=Mover +move.message.no-files=Selecione pelo menos um arquivo +move.message.please-wait=Movendo arquivos... +move.message.success={0} itens movidos com sucesso +move.message.failure=N\u00e3o foi poss\u00edvel mover os itens. Eles podem j\u00e1 estar em uso. Tente atualizar seu navegador. + +## Link To +link.node.root=Plano de arquivamento +link.node.unfiledroot=Documentos arquiv\u00edsticos n\u00e3o arquivados +link.title.single=Vincular {0} a... +link.title.multi=Vincular {0} itens a... +link.button=Vincular +link.message.no-files=Selecione pelo menos um arquivo +link.message.please-wait=Vinculando arquivos... +link.message.success={0} itens vinculados com sucesso +link.message.failure=N\u00e3o foi poss\u00edvel vincular os itens. Eles podem j\u00e1 estar em uso. Tente atualizar seu navegador. + +## File To +file.node.root=Plano de arquivamento +file.node.unfiledroot=Documentos arquiv\u00edsticos n\u00e3o arquivados +file.title.single=Arquivar {0} em... +file.title.multi=Arquivar {0} itens em... +file.button=Arquivo +file.message.no-files=Selecione pelo menos um arquivo +file.message.please-wait=Arquivando... +file.message.success={0} itens arquivados com sucesso +file.message.failure=N\u00e3o foi poss\u00edvel arquivar os itens. Eles podem j\u00e1 estar em uso. Tente atualizar seu navegador. + +## Declare Record And File To +declareAndFile.node.root=Plano de arquivamento +declareAndFile.node.unfiledroot=Documentos arquiv\u00edsticos n\u00e3o arquivados +declareAndFile.title.single=Declarar como documento arquiv\u00edstico e arquivar {0} em... +declareAndFile.button=Declarar e arquivar + +## Declare Version As Record And File To +declareVersionAndFile.node.root=Plano de arquivamento +declareVersionAndFile.node.unfiledroot=Documentos arquiv\u00edsticos n\u00e3o arquivados +declareVersionAndFile.title.single=Declarar vers\u00e3o como documento arquiv\u00edstico e arquivar {0} em... +declareVersionAndFile.button=Declarar e arquivar diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_ru.properties new file mode 100644 index 0000000000..c337551f06 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_ru.properties @@ -0,0 +1,58 @@ +## Common +header=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f + +## Copy To +copy.node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +copy.node.unfiledroot=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +copy.title.single=\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c {0} \u0432... +copy.title.multi=\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432... +copy.button=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c +copy.message.no-files=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b +copy.message.please-wait=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432... +copy.message.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e {0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +copy.message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +## Move To +move.node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +move.node.unfiledroot=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +move.title.single=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c {0} \u0432... +move.title.multi=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b ''{0}'' \u0432... +move.button=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c +move.message.no-files=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b +move.message.please-wait=\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432... +move.message.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u043e {0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +move.message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +## Link To +link.node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +link.node.unfiledroot=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +link.title.single=\u0421\u0432\u044f\u0437\u0430\u0442\u044c {0} \u0441... +link.title.multi=\u0421\u0432\u044f\u0437\u0430\u0442\u044c {0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441... +link.button=\u0421\u0432\u044f\u0437\u0430\u0442\u044c +link.message.no-files=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b +link.message.please-wait=\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432... +link.message.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0441\u0432\u044f\u0437\u0438 \u0434\u043b\u044f {0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +link.message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +## File To +file.node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +file.node.unfiledroot=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +file.title.single=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c {0} \u0432 \u0444\u0430\u0439\u043b... +file.title.multi=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c {0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b... +file.button=\u0424\u0430\u0439\u043b +file.message.no-files=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b +file.message.please-wait=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b... +file.message.success={0}\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u0432 \u0444\u0430\u0439\u043b +file.message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u0430\u0439\u043b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. + +## Declare Record And File To +declareAndFile.node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +declareAndFile.node.unfiledroot=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +declareAndFile.title.single=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c {0} \u043a\u0430\u043a \u0444\u0430\u0439\u043b \u0432... +declareAndFile.button=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u0444\u0430\u0439\u043b + +## Declare Version As Record And File To +declareVersionAndFile.node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +declareVersionAndFile.node.unfiledroot=\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +declareVersionAndFile.title.single=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b {0} \u0432... +declareVersionAndFile.button=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u0444\u0430\u0439\u043b diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_zh_CN.properties new file mode 100644 index 0000000000..1848422839 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/copy-move-link-file-to.get_zh_CN.properties @@ -0,0 +1,58 @@ +## Common +header=\u9009\u62e9\u76ee\u6807\u6587\u4ef6\u5939 + +## Copy To +copy.node.root=\u5f52\u7c7b\u65b9\u6848 +copy.node.unfiledroot=\u672a\u7acb\u5377\u8bb0\u5f55 +copy.title.single=\u5c06 {0} \u590d\u5236\u5230... +copy.title.multi=\u5c06{0}\u4e2a\u9879\u76ee\u590d\u5236\u5230... +copy.button=\u590d\u5236 +copy.message.no-files=\u9009\u62e9\u81f3\u5c11\u4e00\u4e2a\u6587\u4ef6 +copy.message.please-wait=\u6b63\u5728\u590d\u5236\u6587\u4ef6... +copy.message.success=\u6210\u529f\u590d\u5236 {0} \u4e2a\u9879\u76ee +copy.message.failure=\u6211\u4eec\u65e0\u6cd5\u590d\u5236\u9879\u76ee\u3002 \u5b83\u4eec\u53ef\u80fd\u5df2\u88ab\u4f7f\u7528\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +## Move To +move.node.root=\u5f52\u7c7b\u65b9\u6848 +move.node.unfiledroot=\u672a\u7acb\u5377\u8bb0\u5f55 +move.title.single=\u5c06 {0} \u79fb\u52a8\u5230... +move.title.multi=\u5c06 {0} \u4e2a\u9879\u76ee\u79fb\u52a8\u5230... +move.button=\u79fb\u52a8 +move.message.no-files=\u9009\u62e9\u81f3\u5c11\u4e00\u4e2a\u6587\u4ef6 +move.message.please-wait=\u6b63\u5728\u79fb\u52a8\u6587\u4ef6... +move.message.success=\u5df2\u6210\u529f\u79fb\u52a8 {0} \u4e2a\u9879\u76ee +move.message.failure=\u6211\u4eec\u65e0\u6cd5\u79fb\u52a8\u9879\u76ee\u3002 \u5b83\u4eec\u53ef\u80fd\u5df2\u88ab\u4f7f\u7528\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +## Link To +link.node.root=\u5f52\u7c7b\u65b9\u6848 +link.node.unfiledroot=\u672a\u7acb\u5377\u8bb0\u5f55 +link.title.single=\u5c06 {0} \u94fe\u63a5\u81f3... +link.title.multi=\u5c06 {0} \u4e2a\u9879\u76ee\u94fe\u63a5\u81f3... +link.button=\u94fe\u63a5 +link.message.no-files=\u9009\u62e9\u81f3\u5c11\u4e00\u4e2a\u6587\u4ef6 +link.message.please-wait=\u6b63\u5728\u94fe\u63a5\u6587\u4ef6... +link.message.success=\u5df2\u6210\u529f\u94fe\u63a5 {0} \u4e2a\u9879\u76ee +link.message.failure=\u6211\u4eec\u65e0\u6cd5\u94fe\u63a5\u9879\u76ee\u3002 \u5b83\u4eec\u53ef\u80fd\u5df2\u88ab\u4f7f\u7528\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +## File To +file.node.root=\u5f52\u7c7b\u65b9\u6848 +file.node.unfiledroot=\u672a\u7acb\u5377\u8bb0\u5f55 +file.title.single=\u5c06 {0} \u7acb\u5377\u81f3... +file.title.multi=\u5c06 {0} \u4e2a\u9879\u76ee\u7acb\u5377\u81f3... +file.button=\u6587\u4ef6 +file.message.no-files=\u9009\u62e9\u81f3\u5c11\u4e00\u4e2a\u6587\u4ef6 +file.message.please-wait=\u6b63\u5728\u7acb\u5377... +file.message.success=\u5df2\u6210\u529f\u7acb\u5377 {0} \u4e2a\u9879\u76ee +file.message.failure=\u6211\u4eec\u65e0\u5bf9\u9879\u76ee\u7acb\u5377\u3002 \u5b83\u4eec\u53ef\u80fd\u5df2\u88ab\u4f7f\u7528\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u3002 + +## Declare Record And File To +declareAndFile.node.root=\u5f52\u7c7b\u65b9\u6848 +declareAndFile.node.unfiledroot=\u672a\u7acb\u5377\u8bb0\u5f55 +declareAndFile.title.single=\u58f0\u660e\u4e3a\u8bb0\u5f55\u5e76\u5c06 {0} \u7acb\u5377\u81f3... +declareAndFile.button=\u58f0\u660e\u548c\u7acb\u5377 + +## Declare Version As Record And File To +declareVersionAndFile.node.root=\u5f52\u7c7b\u65b9\u6848 +declareVersionAndFile.node.unfiledroot=\u672a\u7acb\u5377\u8bb0\u5f55 +declareVersionAndFile.title.single=\u5c06\u7248\u672c\u58f0\u660e\u4e3a\u8bb0\u5f55\uff0c\u5e76\u5c06 {0} \u5f52\u6863\u5230... +declareVersionAndFile.button=\u58f0\u660e\u548c\u7acb\u5377 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.desc.xml new file mode 100644 index 0000000000..ce92607399 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.desc.xml @@ -0,0 +1,5 @@ + + Export dialog + Export module for Records Management Document Library + /rm/modules/documentlibrary/export + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.html.ftl new file mode 100644 index 0000000000..d98a51098f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.html.ftl @@ -0,0 +1,53 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid> +
+
${msg("header")}
+
+
+ + + + +
+
${msg("label.transferFormat")}
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.properties new file mode 100644 index 0000000000..c16a56ce0e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get.properties @@ -0,0 +1,4 @@ +header=Export +label.transferFormat=Select the file format for the export: +label.acp=Alfresco Content Package (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_de.properties new file mode 100644 index 0000000000..a1aea2f0ac --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_de.properties @@ -0,0 +1,4 @@ +header=Exportieren +label.transferFormat=Dateiformat f\u00fcr den Export ausw\u00e4hlen: +label.acp=Alfresco Content Package Datei (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_es.properties new file mode 100755 index 0000000000..275498a579 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_es.properties @@ -0,0 +1,4 @@ +header=Exportar +label.transferFormat=Seleccionar el formato de fichero para exportar: +label.acp=Fichero de paquete de contenidos de Alfresco (.acp) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_fr.properties new file mode 100644 index 0000000000..78f3f6bb73 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_fr.properties @@ -0,0 +1,4 @@ +header=Exporter +label.transferFormat=S\u00e9lectionnez le format de fichier pour l'exportation : +label.acp=Package de contenu Alfresco (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_it.properties new file mode 100644 index 0000000000..b00d35b3c0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_it.properties @@ -0,0 +1,4 @@ +header=Esporta +label.transferFormat=Seleziona formato file da esportare: +label.acp=Pacchetto di contenuti Alfresco +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_ja.properties new file mode 100644 index 0000000000..dd94e4a792 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_ja.properties @@ -0,0 +1,4 @@ +header=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +label.transferFormat=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306e\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044: +label.acp=Alfresco \u30b3\u30f3\u30c6\u30f3\u30c4\u30d1\u30c3\u30b1\u30fc\u30b8 (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_nb.properties new file mode 100644 index 0000000000..76c4842a8b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_nb.properties @@ -0,0 +1,4 @@ +header=Eksporter +label.transferFormat=Velg filformat etil eksporteringen: +label.acp=Alfresco-innholdspakke (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_nl.properties new file mode 100755 index 0000000000..176e0578dc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_nl.properties @@ -0,0 +1,4 @@ +header=Exporteren +label.transferFormat=Selecteer de bestandsindeling voor de export: +label.acp=Alfresco Content Package (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_pt_BR.properties new file mode 100644 index 0000000000..a71a38e711 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_pt_BR.properties @@ -0,0 +1,4 @@ +header=Exportar +label.transferFormat=Selecione o formato de arquivo para exporta\u00e7\u00e3o: +label.acp=Pacote de conte\u00fado Alfresco (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_ru.properties new file mode 100644 index 0000000000..9a5afcfb85 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_ru.properties @@ -0,0 +1,4 @@ +header=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 +label.transferFormat=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430: +label.acp=\u041f\u0430\u043a\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e Alfresco (ACP) +label.zip=ZIP-\u0430\u0440\u0445\u0438\u0432 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_zh_CN.properties new file mode 100644 index 0000000000..9839975f95 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/export.get_zh_CN.properties @@ -0,0 +1,4 @@ +header=\u5bfc\u51fa +label.transferFormat=\u9009\u62e9\u5bfc\u51fa\u7684\u6587\u4ef6\u683c\u5f0f\uff1a +label.acp=Alfresco \u5185\u5bb9\u5305 (ACP) +label.zip=ZIP diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.desc.xml new file mode 100644 index 0000000000..ee74d5a82c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.desc.xml @@ -0,0 +1,5 @@ + + file-report + File Report Module for Records Management + /rm/modules/documentlibrary/file-report + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.html.ftl new file mode 100644 index 0000000000..14cf02eeb5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.html.ftl @@ -0,0 +1,51 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid?html> +
+
+
+
+ + +
+
+
+

${msg("header")}

+
+
+
+ + +
+
+
+<#assign treeConfig = config.scoped["DocumentLibrary"]["tree"]!> +<#if treeConfig.getChildValue??><#assign evaluateChildFolders = treeConfig.getChildValue("evaluate-child-folders")!"true"> + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.properties new file mode 100644 index 0000000000..1242d70dd3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get.properties @@ -0,0 +1,7 @@ +header=Select the destination record folder +node.root=File Plan +title.single=File report to... +button.file=File Report +message.no-files=Select at least one file +message.please-wait=Filing report... +label.unfiled-records=File report to 'Unfiled Records' \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_de.properties new file mode 100644 index 0000000000..1a6293b330 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_de.properties @@ -0,0 +1,7 @@ +header=Record-Zielordner ausw\u00e4hlen +node.root=Ablageplan +title.single=Bericht ablegen unter... +button.file=Bericht ablegen +message.no-files=W\u00e4hlen Sie mindestens eine Datei aus. +message.please-wait=Bericht wird abgelegt... +label.unfiled-records=Bericht unter 'Nicht abgelegte Records' abgelegt diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_es.properties new file mode 100755 index 0000000000..1e1ce9c363 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_es.properties @@ -0,0 +1,7 @@ +header=Seleccionar la carpeta de documentos de archivo de destino +node.root=Cuadro de clasificaci\u00f3n +title.single=Archivar informe a... +button.file=Archivar informe +message.no-files=Seleccione al menos un fichero +message.please-wait=Archivando informe... +label.unfiled-records=Archivar informe en "Documentos de archivo no archivados" diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_fr.properties new file mode 100644 index 0000000000..5d78289d84 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_fr.properties @@ -0,0 +1,7 @@ +header=S\u00e9lectionnez le dossier de destination contenant des documents d'archives +node.root=Plan de classement +title.single=Archiver le rapport vers... +button.file=Archiver le rapport +message.no-files=S\u00e9lectionner au moins un fichier +message.please-wait=Archivage du rapport... +label.unfiled-records=Classer le rapport vers les documents d'archives non class\u00e9s diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_it.properties new file mode 100644 index 0000000000..c1f280d4be --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_it.properties @@ -0,0 +1,7 @@ +header=Seleziona destinazione della cartella di record +node.root=Piano di fascicolazione +title.single=Archivia rapporto in... +button.file=Archivia rapporto +message.no-files=Seleziona almeno un file +message.please-wait=Archiviazione rapporto... +label.unfiled-records=Archivia rapporto in "Record non archiviati" diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_ja.properties new file mode 100644 index 0000000000..654cbd7b23 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_ja.properties @@ -0,0 +1,7 @@ +header=\u30bf\u30fc\u30b2\u30c3\u30c8\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u9078\u629e +node.root=\u6574\u7406\u4fdd\u7ba1\u30d7\u30e9\u30f3 +title.single=\u30ec\u30dd\u30fc\u30c8\u306e\u6574\u7406\u4fdd\u7ba1\u5148... +button.file=\u30ec\u30dd\u30fc\u30c8\u306e\u6574\u7406\u4fdd\u7ba1 +message.no-files=\u30d5\u30a1\u30a4\u30eb\u3092\u6700\u4f4e 1 \u3064\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +message.please-wait=\u30ec\u30dd\u30fc\u30c8\u3092\u6574\u7406\u4fdd\u7ba1\u3057\u3066\u3044\u307e\u3059... +label.unfiled-records=\u30ec\u30dd\u30fc\u30c8\u3092\u300c\u30d5\u30a1\u30a4\u30eb\u3055\u308c\u3066\u3044\u306a\u3044\u30ec\u30b3\u30fc\u30c9\u300d\u306b\u30d5\u30a1\u30a4\u30eb diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_nb.properties new file mode 100644 index 0000000000..2de047f890 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_nb.properties @@ -0,0 +1,7 @@ +header=Velg m\u00e5loppf\u00f8ringsmappe +node.root=Filplan +title.single=Registrer rapport i... +button.file=Registrer rapport +message.no-files=Velg minst \u00e9n fil +message.please-wait=Registrerer rapport... +label.unfiled-records=Registrer rapport i 'Oppf\u00f8ringer som ikke er registrert' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_nl.properties new file mode 100644 index 0000000000..27689dac88 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_nl.properties @@ -0,0 +1,7 @@ +header=De doelarchiefmap selecteren +node.root=Ordeningsplan +title.single=Rapport archiveren naar... +button.file=Rapport archiveren +message.no-files=Selecteer minstens \u00e9\u00e9n bestand +message.please-wait=Rapport archiveren... +label.unfiled-records=Rapport archiveren naar 'Niet-gearchiveerde archiefstukken' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_pt_BR.properties new file mode 100644 index 0000000000..42b375f805 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_pt_BR.properties @@ -0,0 +1,7 @@ +header=Selecionar a pasta de destino do documento arquiv\u00edstico +node.root=Plano de arquivamento +title.single=Arquivar relat\u00f3rio em... +button.file=Arquivar relat\u00f3rio +message.no-files=Selecione pelo menos um arquivo +message.please-wait=Arquivando relat\u00f3rio... +label.unfiled-records=Arquivar relat\u00f3rio em 'Documentos arquiv\u00edsticos n\u00e3o arquivados' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_ru.properties new file mode 100644 index 0000000000..c6c8ab54e2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_ru.properties @@ -0,0 +1,7 @@ +header=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +node.root=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 +title.single=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b... +button.file=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b +message.no-files=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b +message.please-wait=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u0430 \u0432 \u0444\u0430\u0439\u043b... +label.unfiled-records=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0432 '\u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438' diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_zh_CN.properties new file mode 100644 index 0000000000..5c79451d48 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/file-report.get_zh_CN.properties @@ -0,0 +1,7 @@ +header=\u9009\u62e9\u76ee\u6807\u8bb0\u5f55\u6587\u4ef6\u5939 +node.root=\u5f52\u7c7b\u65b9\u6848 +title.single=\u5c06\u62a5\u544a\u7acb\u5377\u81f3... +button.file=\u7acb\u5377\u62a5\u544a +message.no-files=\u9009\u62e9\u81f3\u5c11\u4e00\u4e2a\u6587\u4ef6 +message.please-wait=\u6b63\u5728\u7acb\u5377\u62a5\u544a... +label.unfiled-records=\u5c06\u62a5\u544a\u7acb\u5377\u81f3\u201c\u672a\u7acb\u5377\u8bb0\u5f55\u201d diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.desc.xml new file mode 100644 index 0000000000..01b27907cc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.desc.xml @@ -0,0 +1,5 @@ + + Add to hold dialog + A dialog which displays the list of holds so that the item can be added to the hold(s) + /rm/modules/documentlibrary/hold/add-to-hold + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.html.ftl new file mode 100644 index 0000000000..2d69faf9c2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.html.ftl @@ -0,0 +1,45 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid?html> + + + +
+
${msg("header.hold")}
+
+
+
+
+ + +
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.properties new file mode 100644 index 0000000000..32a55eea53 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=We couldn't load the Add to Hold template. Try refreshing your browser or contact your I.T. Dept. +message.empty.holds=There aren't any available holds for the selected item +header.hold=Add to Hold +message.hold-success=The selected item(s) has been successfully added to the selected hold(s) +message.failure=Add to Hold Unsuccessful +name.column.header=Name \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_de.properties new file mode 100644 index 0000000000..bf01f756c0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_de.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Mustervorlage 'Zum Legal Hold hinzuf\u00fcgen' konnte nicht geladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen, oder kontakten Sie Ihre IT-Abteilung. +message.empty.holds=Keine verf\u00fcgbaren Legal Holds f\u00fcr das ausgew\u00e4hlte Element +header.hold=Zum Legal Hold hinzuf\u00fcgen +message.hold-success=Ausgew\u00e4hltes Element bzw. ausgew\u00e4hlte Elemente erfolgreich zu ausgew\u00e4hltem Legal Hold bzw. ausgew\u00e4hlten Legal Holds hinzugef\u00fcgt +message.failure='Zum Legal Hold hinzuf\u00fcgen' fehlgeschlagen +name.column.header=Name diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_es.properties new file mode 100644 index 0000000000..061af509a1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_es.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=No se pudo cargar la plantilla A\u00f1adir a retenci\u00f3n legal. Trate de actualizar el navegador o p\u00f3ngase en contacto con el dep. de TI. +message.empty.holds=No hay retenciones legales disponibles para el elemento seleccionado +header.hold=A\u00f1adir a retenci\u00f3n legal +message.hold-success=Los elementos seleccionados se han a\u00f1adido correctamente a las retenciones legales seleccionadas +message.failure=Error en A\u00f1adir a retenci\u00f3n legal +name.column.header=Nombre diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_fr.properties new file mode 100644 index 0000000000..7639cc4bde --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_fr.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Impossible de charger le mod\u00e8le d'ajout \u00e0 la suspension. Essayez d'actualiser votre navigateur ou contactez votre DSI. +message.empty.holds=Il n'y a pas de suspensions disponibles pour l'\u00e9l\u00e9ment s\u00e9lectionn\u00e9 +header.hold=Ajouter \u00e0 la suspension +message.hold-success=Le ou les \u00e9l\u00e9ments s\u00e9lectionn\u00e9s ont bien \u00e9t\u00e9 ajout\u00e9s \u00e0 la ou aux suspensions s\u00e9lectionn\u00e9es +message.failure=Echec de l'ajout \u00e0 la suspension +name.column.header=Nom diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_it.properties new file mode 100644 index 0000000000..9968f428d9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_it.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Impossibile caricare il modello Aggiungi a sospesi. Provare ad aggiornare il browser o contattare il proprio reparto IT. +message.empty.holds=Nessuna sospensione disponibile per l'elemento selezionato +header.hold=Aggiungi a sospesi +message.hold-success=Gli elementi selezionati sono stati aggiunti alle sospensioni selezionate +message.failure=Operazione Aggiungi a sospesi non riuscita +name.column.header=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_ja.properties new file mode 100644 index 0000000000..84044f6485 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_ja.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=[\u30db\u30fc\u30eb\u30c9\u306b\u8ffd\u52a0] \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u308c\u3067\u3082\u554f\u984c\u304c\u89e3\u6c7a\u3055\u308c\u306a\u3044\u5834\u5408\u306f\u3001IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.empty.holds=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306b\u4f7f\u7528\u3067\u304d\u308b\u30db\u30fc\u30eb\u30c9\u306f\u3042\u308a\u307e\u305b\u3093 +header.hold=\u30db\u30fc\u30eb\u30c9\u306b\u8ffd\u52a0 +message.hold-success=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306f\u9078\u629e\u3057\u305f\u30db\u30fc\u30eb\u30c9\u306b\u6b63\u5e38\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f +message.failure=\u30db\u30fc\u30eb\u30c9\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +name.column.header=\u540d\u524d diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_nb.properties new file mode 100644 index 0000000000..873f77cf7c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_nb.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Kunne ikke laste inn malen Legg til hold. Pr\u00f8v \u00e5 oppdatere nettleseren, eller kontakt din IT- avdeling. +message.empty.holds=Det finnes ingen tilgjengelig hold til det valgte elementet +header.hold=Legg til hold +message.hold-success=Valgte oppf\u00f8ring(er) er n\u00e5 lagt til valgte hold +message.failure=Legg til hold var mislykket +name.column.header=Navn diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_nl.properties new file mode 100644 index 0000000000..0e9b26e5db --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_nl.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Kan de sjabloon Toevoegen aan bewaring niet laden. Vernieuw de browser of neem contact op met uw IT-afdeling +message.empty.holds=Er zijn geen beschikbare bewaringen voor het geselecteerde item +header.hold=Toevoegen aan bewaring +message.hold-success=De geselecteerde item(s) zijn toegevoegd aan de geselecteerde bewaring(en) +message.failure=Toevoegen aan bewaring niet geslaagd +name.column.header=Naam diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_pt_BR.properties new file mode 100644 index 0000000000..9de581c116 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_pt_BR.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=N\u00e3o foi poss\u00edvel carregar o modelo Adicionar \u00e0 espera. Tente atualizar seu navegador ou entre em contato com o Dept. de TI. +message.empty.holds=N\u00e3o h\u00e1 esperas dispon\u00edveis para o item selecionado +header.hold=Adicionar \u00e0 espera +message.hold-success=Os documentos arquiv\u00edsticos selecionados foram adicionados com sucesso \u00e0s esperas selecionadas +message.failure=Falha ao Adicionar \u00e0 espera +name.column.header=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_ru.properties new file mode 100644 index 0000000000..c17c3bb355 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_ru.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.empty.holds=\u0414\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +header.hold=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +message.hold-success=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 +name.column.header=\u0418\u043c\u044f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_zh_CN.properties new file mode 100644 index 0000000000..0c6cf68d2f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/add-to-hold.get_zh_CN.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d\u6dfb\u52a0\u5230\u4fdd\u5b58\u6a21\u677f\u3002 \u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.empty.holds=\u5df2\u9009\u9879\u6ca1\u6709\u4efb\u4f55\u53ef\u7528\u7684\u4fdd\u5b58 +header.hold=\u52a0\u5165\u4fdd\u5b58 +message.hold-success=\u5df2\u9009\u9879\u5df2\u6210\u529f\u52a0\u5165\u6240\u9009\u4fdd\u5b58 +message.failure=\u52a0\u5165\u4fdd\u5b58\u5931\u8d25 +name.column.header=\u540d\u79f0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.desc.xml new file mode 100644 index 0000000000..17e9d5fa2d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.desc.xml @@ -0,0 +1,5 @@ + + Remove from hold dialog + A dialog which displays the list of holds which include the item so that the item can be removed from the hold(s) + /rm/modules/documentlibrary/hold/remove-from-hold + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.html.ftl new file mode 100644 index 0000000000..c8dd8eca58 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.html.ftl @@ -0,0 +1,45 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid?html> + + + +
+
${msg("header.hold")}
+
+
+
+
+ + +
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.properties new file mode 100644 index 0000000000..85e081c2e4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=We couldn't load the Remove from Hold template.Try refreshing your browser or contact your I.T. Dept. +message.empty.holds=There aren't any available holds for the selected item +header.hold=Remove from Hold +message.hold-success=The selected item(s) has been successfully removed from the selected hold(s) +message.failure=Remove from Hold Unsuccessful +name.column.header=Name \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_de.properties new file mode 100644 index 0000000000..7282733129 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_de.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Mustervorlage 'Vom Legal Hold entfernen' konnte nicht geladen werden. Aktualisieren Sie Ihren Browser, um es noch einmal zu versuchen, oder kontakten Sie Ihre IT-Abteilung. +message.empty.holds=Keine verf\u00fcgbaren Legal Holds f\u00fcr das ausgew\u00e4hlte Element +header.hold=Vom Legal Hold entfernen +message.hold-success=Ausgew\u00e4hltes Element bzw. ausgew\u00e4hlte Elemente erfolgreich aus ausgew\u00e4hltem Legal Hold bzw. ausgew\u00e4hlten Legal Holds entfernt +message.failure='Vom Legal Hold entfernen' fehlgeschlagen +name.column.header=Name diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_es.properties new file mode 100644 index 0000000000..fc8f01096e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_es.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=No se pudo cargar la plantilla Eliminar de retenci\u00f3n legal. Trate de actualizar el navegador o p\u00f3ngase en contacto con el dep. de TI. +message.empty.holds=No hay retenciones legales disponibles para el elemento seleccionado +header.hold=Eliminar de retenci\u00f3n legal +message.hold-success=Los elementos seleccionados se han eliminado correctamente de las retenciones legales seleccionadas +message.failure=Error al Eliminar de retenci\u00f3n legal +name.column.header=Nombre diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_fr.properties new file mode 100644 index 0000000000..4d482adf60 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_fr.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Impossible de charger le mod\u00e8le Supprimer de la suspension. Essayez d'actualiser votre navigateur ou contactez votre DSI. +message.empty.holds=Il n'y a pas de suspensions disponibles pour l'\u00e9l\u00e9ment s\u00e9lectionn\u00e9 +header.hold=Supprimer de la suspension +message.hold-success=Le ou les \u00e9l\u00e9ments s\u00e9lectionn\u00e9s ont bien retir\u00e9s de la ou des suspensions s\u00e9lectionn\u00e9es +message.failure=Echec de la suppression depuis la suspension +name.column.header=Nom diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_it.properties new file mode 100644 index 0000000000..b6096021d7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_it.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Impossibile caricare il modello Rimuovi da sospesi. Provare ad aggiornare il browser o contattare il proprio reparto IT. +message.empty.holds=Nessuna sospensione disponibile per l'elemento selezionato +header.hold=Rimuovi da sospesi +message.hold-success=Rimozione degli elementi selezionati dai sospesi selezionati riuscita +message.failure=Operazione Rimuovi da sospesi non riuscita +name.column.header=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_ja.properties new file mode 100644 index 0000000000..a9940526e2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_ja.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=[\u30db\u30fc\u30eb\u30c9\u304b\u3089\u524a\u9664] \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u308c\u3067\u3082\u554f\u984c\u304c\u89e3\u6c7a\u3055\u308c\u306a\u3044\u5834\u5408\u306f\u3001IT \u62c5\u5f53\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.empty.holds=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306b\u4f7f\u7528\u3067\u304d\u308b\u30db\u30fc\u30eb\u30c9\u306f\u3042\u308a\u307e\u305b\u3093 +header.hold=\u30db\u30fc\u30eb\u30c9\u304b\u3089\u524a\u9664 +message.hold-success=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306f\u9078\u629e\u3057\u305f\u30db\u30fc\u30eb\u30c9\u304b\u3089\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.failure=\u30db\u30fc\u30eb\u30c9\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3057\u305f +name.column.header=\u540d\u524d diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_nb.properties new file mode 100644 index 0000000000..870590f14e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_nb.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Kunne ikke laste inn malen Fjern fra hold. Pr\u00f8ve \u00e5 oppdatere nettleseren, eller kontakt din IT- avdeling. +message.empty.holds=Det finnes ingen tilgjengelig hold til det valgte elementet +header.hold=Fjern fra hold +message.hold-success=Valgte oppf\u00f8ring(er) er n\u00e5 fjernet fra valgte hold +message.failure=Mislykket fjerning fra hold +name.column.header=Navn diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_nl.properties new file mode 100644 index 0000000000..22d61facae --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_nl.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=Kan de sjabloon Verwijderen uit bewaring niet laden.Vernieuw de browser of neem contact op met uw IT-afdeling +message.empty.holds=Er zijn geen beschikbare bewaringen voor het geselecteerde item +header.hold=Verwijderen uit bewaring +message.hold-success=Het/de geselecteerde item(s) is/zijn verwijderd uit de geselecteerde bewaring(en) +message.failure=Verwijderen uit bewaring niet geslaagd +name.column.header=Naam diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_pt_BR.properties new file mode 100644 index 0000000000..31e36b18cb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_pt_BR.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=N\u00e3o foi poss\u00edvel carregar o modelo Remover da espera. Tente atualizar seu navegador ou entre em contato com o Dept. de TI. +message.empty.holds=N\u00e3o h\u00e1 esperas dispon\u00edveis para o item selecionado +header.hold=Remover da espera +message.hold-success=Os documentos arquiv\u00edsticos selecionados foram removidos com sucesso das esperas selecionadas +message.failure=Falha ao Remover da espera +name.column.header=Nome diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_ru.properties new file mode 100644 index 0000000000..fed070bc88 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_ru.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u0432 IT- \u043e\u0442\u0434\u0435\u043b. +message.empty.holds=\u0414\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +header.hold=\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +message.hold-success=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a +message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +name.column.header=\u0418\u043c\u044f diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_zh_CN.properties new file mode 100644 index 0000000000..1fddecc611 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/hold/remove-from-hold.get_zh_CN.properties @@ -0,0 +1,6 @@ +failure.template.not.loaded=\u6211\u4eec\u65e0\u6cd5\u52a0\u8f7d''\u89e3\u9664\u4fdd\u5b58''\u6a21\u677f\u3002\u8bf7\u5c1d\u8bd5\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u8054\u7cfb\u60a8\u7684 IT \u90e8\u95e8\u3002 +message.empty.holds=\u5df2\u9009\u9879\u6ca1\u6709\u4efb\u4f55\u53ef\u7528\u7684\u4fdd\u5b58 +header.hold=\u89e3\u9664\u4fdd\u5b58 +message.hold-success=\u6240\u9009\u9879\u76ee\u5df2\u6210\u529f\u5730\u4ece\u9009\u4e2d\u7684\u4fdd\u5b58\u4e2d\u79fb\u9664 +message.failure=\u89e3\u9664\u4fdd\u5b58\u5931\u8d25 +name.column.header=\u540d\u79f0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.desc.xml new file mode 100644 index 0000000000..7febb9074c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.desc.xml @@ -0,0 +1,5 @@ + + Recorded version config dialog + Recorded version config module for the Document Library + /rm/modules/documentlibrary/recorded-version-config + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.html.ftl new file mode 100644 index 0000000000..fac941fdf7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.html.ftl @@ -0,0 +1,48 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#assign el=args.htmlid> +
+
${msg("header")}
+
+
+
+
+
+ +
+
+
+ + +
+
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.js new file mode 100644 index 0000000000..2668649fee --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.js @@ -0,0 +1,37 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +function main() +{ + model.recordableVersions = []; + var result = remote.call("/slingshot/doclib/action/recorded-version-config/node/" + args.nodeRef); + if (result.status == 200) + { + model.recordableVersions = eval('(' + result + ')').data.recordableVersions; + } +} + +main(); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.properties new file mode 100644 index 0000000000..4ade090660 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get.properties @@ -0,0 +1,5 @@ +header=Set Auto-Declare Options +label.recorded-versions=Automatically declare versions as records +option.none.displayValue=Never +option.major_only.displayValue=For major versions only +option.all.displayValue=For all major and minor versions \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_de.properties new file mode 100644 index 0000000000..029f5f56f4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_de.properties @@ -0,0 +1,5 @@ +header=Optionen f\u00fcr automatische Deklaration +label.recorded-versions=Versionen automatisch als Record deklarieren +option.none.displayValue=Nie +option.major_only.displayValue=Nur f\u00fcr Hauptversionen +option.all.displayValue=F\u00fcr alle Haupt- und Nebenversionen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_es.properties new file mode 100644 index 0000000000..a0f88aa787 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_es.properties @@ -0,0 +1,5 @@ +header=Configurar las opciones de declaraci\u00f3n autom\u00e1tica +label.recorded-versions=Declarar autom\u00e1ticamente versiones como documentos de archivo +option.none.displayValue=Nunca +option.major_only.displayValue=Solo para versiones mayores +option.all.displayValue=Para todas las versiones mayores y menores diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_fr.properties new file mode 100644 index 0000000000..66de84091b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_fr.properties @@ -0,0 +1,5 @@ +header=D\u00e9finir les options de d\u00e9claration automatique +label.recorded-versions=D\u00e9clarer automatiquement les versions comme documents d'archives +option.none.displayValue=Jamais +option.major_only.displayValue=Uniquement les versions majeures +option.all.displayValue=Versions majeures et mineures diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_it.properties new file mode 100644 index 0000000000..d481228cec --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_it.properties @@ -0,0 +1,5 @@ +header=Imposta opzioni di dichiarazione automatica +label.recorded-versions=Dichiara automaticamente versioni come record +option.none.displayValue=Mai +option.major_only.displayValue=Solo per versioni maggiori +option.all.displayValue=Per tutte le versioni maggiori e minori diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_ja.properties new file mode 100644 index 0000000000..22436c5c47 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_ja.properties @@ -0,0 +1,5 @@ +header=\u81ea\u52d5\u5ba3\u8a00\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a +label.recorded-versions=\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u81ea\u52d5\u7684\u306b\u30ec\u30b3\u30fc\u30c9\u3068\u3057\u3066\u5ba3\u8a00\u3059\u308b +option.none.displayValue=\u5ba3\u8a00\u3057\u306a\u3044 +option.major_only.displayValue=\u30e1\u30b8\u30e3\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u307f +option.all.displayValue=\u3059\u3079\u3066\u306e\u30e1\u30b8\u30e3\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u30de\u30a4\u30ca\u30fc\u30d0\u30fc\u30b8\u30e7\u30f3 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_nb.properties new file mode 100644 index 0000000000..ceeb440fa8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_nb.properties @@ -0,0 +1,5 @@ +header=Still inn alternativer med automatiske erkl\u00e6ringer +label.recorded-versions=Erkl\u00e6rer alternativene med automatiske erkl\u00e6ringer som oppf\u00f8ringer +option.none.displayValue=Aldri +option.major_only.displayValue=Kun hovedversjoner +option.all.displayValue=Til alle hovedversjoner og mindre versjoner diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_nl.properties new file mode 100644 index 0000000000..ee25522472 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_nl.properties @@ -0,0 +1,5 @@ +header=Opties voor automatisch declareren instellen +label.recorded-versions=Versies automatisch declareren als archiefstukken +option.none.displayValue=Nooit +option.major_only.displayValue=Alleen voor primaire versies +option.all.displayValue=Voor alle primaire en secundaire versies diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_pt_BR.properties new file mode 100644 index 0000000000..0918ea91b3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_pt_BR.properties @@ -0,0 +1,5 @@ +header=Definir op\u00e7\u00f5es de auto declara\u00e7\u00e3o +label.recorded-versions=Declarar automaticamente vers\u00f5es como documentos arquiv\u00edsticos +option.none.displayValue=Nunca +option.major_only.displayValue=Somente para vers\u00f5es principais +option.all.displayValue=Para todas as vers\u00f5es principais e secund\u00e1rias diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_ru.properties new file mode 100644 index 0000000000..72e0e1979b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_ru.properties @@ -0,0 +1,5 @@ +header=\u0417\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f +label.recorded-versions=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u0438 +option.none.displayValue=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 +option.major_only.displayValue=\u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 +option.all.displayValue=\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_zh_CN.properties new file mode 100644 index 0000000000..0d6962a425 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/recorded-version-config.get_zh_CN.properties @@ -0,0 +1,5 @@ +header=\u8bbe\u7f6e\u81ea\u52a8\u58f0\u660e\u9009\u9879 +label.recorded-versions=\u81ea\u52a8\u58f0\u660e\u7248\u672c\u4e3a\u8bb0\u5f55 +option.none.displayValue=\u4ece\u4e0d +option.major_only.displayValue=\u4ec5\u9002\u7528\u4e8e\u4e3b\u8981\u7248\u672c +option.all.displayValue=\u9002\u7528\u4e8e\u6240\u6709\u4e3b\u8981\u548c\u6b21\u8981\u7248\u672c diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.desc.xml new file mode 100644 index 0000000000..e4a314cfb4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.desc.xml @@ -0,0 +1,5 @@ + + Recorded version config dialog + Recorded version config module for the Document Library + /rm/modules/documentlibrary/rejected-record-info + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.html.ftl new file mode 100644 index 0000000000..5b0d036d92 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.html.ftl @@ -0,0 +1,47 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +
+
${msg("header")}
+
+
+
+ +
+
+ + + + + + +
+
+
+ +
+
+
diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.properties new file mode 100644 index 0000000000..b3c8caa982 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get.properties @@ -0,0 +1,5 @@ +header=Rejected Record +label.description=The file ''{0}'' has been rejected +label.by=By +label.at=At +label.reason=With the reason \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_de.properties new file mode 100644 index 0000000000..e698da09c0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_de.properties @@ -0,0 +1,5 @@ +header=Abgelehnter Record +label.description=Datei ''{0}'' wurde abgelehnt. +label.by=Von +label.at=Bei +label.reason=Grund diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_es.properties new file mode 100644 index 0000000000..eb915bef6f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_es.properties @@ -0,0 +1,5 @@ +header=Documento de archivo de rechazado +label.description=El fichero ''{0}'' se ha rechazado +label.by=Por +label.at=En +label.reason=Con el motivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_fr.properties new file mode 100644 index 0000000000..e664f28fdd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_fr.properties @@ -0,0 +1,5 @@ +header=Document d'archives rejet\u00e9 +label.description=Le fichier ''{0}'' a \u00e9t\u00e9 rejet\u00e9 +label.by=Par +label.at=A +label.reason=Pour le motif suivant : diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_it.properties new file mode 100644 index 0000000000..f0671e5d27 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_it.properties @@ -0,0 +1,5 @@ +header=Record respinto +label.description=Il file ''{0}'' \u00e8 stato respinto +label.by=Da +label.at=A +label.reason=Con il motivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_ja.properties new file mode 100644 index 0000000000..acecfeaaf1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_ja.properties @@ -0,0 +1,5 @@ +header=\u5374\u4e0b\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9 +label.description=\u30d5\u30a1\u30a4\u30eb ''{0}'' \u306f\u5374\u4e0b\u3055\u308c\u3066\u3044\u307e\u3059 +label.by=\u62c5\u5f53\u8005 +label.at=\u65e5\u6642 +label.reason=\u7406\u7531 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_nb.properties new file mode 100644 index 0000000000..7c8a7b3ad9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_nb.properties @@ -0,0 +1,5 @@ +header=Avvist oppf\u00f8ring +label.description=Filen ''{0}'' er blitt avvist +label.by=Av +label.at=Den +label.reason=Med grunnen diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_nl.properties new file mode 100644 index 0000000000..28e5cfc524 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_nl.properties @@ -0,0 +1,5 @@ +header=Afgewezen archiefstuk +label.description=Het archiefstuk ''{0}'' is afgewezen +label.by=Door +label.at=Om +label.reason=Met de reden diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_pt_BR.properties new file mode 100644 index 0000000000..6c3875f408 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_pt_BR.properties @@ -0,0 +1,5 @@ +header=Documento arquiv\u00edstico rejeitado +label.description=O arquivo ''{0}'' foi rejeitado +label.by=Por +label.at=Em +label.reason=Com a raz\u00e3o diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_ru.properties new file mode 100644 index 0000000000..9c55b00d0a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_ru.properties @@ -0,0 +1,5 @@ +header=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +label.description=\u0424\u0430\u0439\u043b ''{0}'' \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d +label.by=\u041f\u043e +label.at=\u041a\u043e\u0433\u0434\u0430 +label.reason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_zh_CN.properties new file mode 100644 index 0000000000..9df2539b82 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/documentlibrary/rejected-record-info.get_zh_CN.properties @@ -0,0 +1,5 @@ +header=\u62d2\u7edd\u7684\u8bb0\u5f55 +label.description=\u6587\u4ef6 ''{0}'' \u5df2\u88ab\u62d2\u7edd +label.by=\u4f5c\u8005 +label.at=\u65f6\u95f4 +label.reason=\u542b\u539f\u56e0 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.desc.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.desc.xml new file mode 100644 index 0000000000..87c29d0af2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.desc.xml @@ -0,0 +1,5 @@ + + RM Save Search Module GUI + Records Management Save Search GUI module + /rm/modules/search/save-search + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.html.ftl new file mode 100644 index 0000000000..fdcc68bc95 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.html.ftl @@ -0,0 +1,51 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.properties new file mode 100644 index 0000000000..bb84d8f6f4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get.properties @@ -0,0 +1 @@ +header.savesearch=Save Search diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_de.properties new file mode 100644 index 0000000000..b709b39391 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_de.properties @@ -0,0 +1 @@ +header.savesearch=Suche speichern diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_es.properties new file mode 100755 index 0000000000..d721b00deb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_es.properties @@ -0,0 +1 @@ +header.savesearch=Guardar b\u00fasqueda diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_fr.properties new file mode 100644 index 0000000000..14ce3ed01a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_fr.properties @@ -0,0 +1 @@ +header.savesearch=Enregistrer la recherche diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_it.properties new file mode 100644 index 0000000000..f1910de5c0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_it.properties @@ -0,0 +1 @@ +header.savesearch=Salva ricerca diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_ja.properties new file mode 100644 index 0000000000..6dca55d510 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_ja.properties @@ -0,0 +1 @@ +header.savesearch=\u691c\u7d22\u6761\u4ef6\u306e\u4fdd\u5b58 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_nb.properties new file mode 100644 index 0000000000..97801f29ee --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_nb.properties @@ -0,0 +1 @@ +header.savesearch=Lagre s\u00f8k diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_nl.properties new file mode 100755 index 0000000000..4cf11669d4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_nl.properties @@ -0,0 +1 @@ +header.savesearch=Zoekopdracht opslaan diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_pt_BR.properties new file mode 100644 index 0000000000..401573f3bd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_pt_BR.properties @@ -0,0 +1 @@ +header.savesearch=Salvar pesquisa diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_ru.properties new file mode 100644 index 0000000000..175d3067c7 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_ru.properties @@ -0,0 +1 @@ +header.savesearch=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_zh_CN.properties new file mode 100644 index 0000000000..9eb440670b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/rm/modules/search/save-search.get_zh_CN.properties @@ -0,0 +1 @@ +header.savesearch=\u4fdd\u5b58\u641c\u7d22 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/share/pages/rm-customizations/share/header/share-header.get.js b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/share/pages/rm-customizations/share/header/share-header.get.js new file mode 100644 index 0000000000..f72a8a7557 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/site-webscripts/org/alfresco/share/pages/rm-customizations/share/header/share-header.get.js @@ -0,0 +1,170 @@ +// +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +// Insert a new NotificationService as the first entry in the services array (because this +// is the first entry all others will be discarded)... +var siteService = widgetUtils.findObject(model.jsonModel, "id", "SITE_SERVICE"), + RMSitePresetId = "rm-site-dashboard", + isRMSitePreset = { + targetId: "PRESET", + is: [RMSitePresetId] + }, + stdRMType = "{http://www.alfresco.org/model/recordsmanagement/1.0}rmsite", + dod5015Type = "{http://www.alfresco.org/model/dod5015/1.0}site", + additionalSitePresets = (siteService && siteService.config && siteService.config.additionalSitePresets) ? + siteService.config.additionalSitePresets : [], + widgetsForCreateSiteDialogOverrides = (siteService && siteService.config && siteService.config.widgetsForCreateSiteDialogOverrides) ? + siteService.config.widgetsForCreateSiteDialogOverrides : []; + +additionalSitePresets.unshift({ + label: "description.recordsManagementSite", + value: RMSitePresetId +}); + +widgetsForCreateSiteDialogOverrides = widgetsForCreateSiteDialogOverrides.concat([{ + // Force site tile to match the rm site title + id: "CREATE_SITE_FIELD_TITLE", + config: { + disablementConfig: { + rules: [isRMSitePreset] + }, + autoSetConfig: [{ + rulePassValue: msg.get("title.recordsManagementSite"), + ruleFailValue: "", + rules: [isRMSitePreset] + }] + } +}, { + // Force site shortname to be "rm" + id: "CREATE_SITE_FIELD_SHORTNAME", + config: { + disablementConfig: { + rules: [isRMSitePreset] + }, + autoSetConfig: [{ + rulePassValue: "rm", + ruleFailValue: "", + rules: [isRMSitePreset] + }] + } +}, { + // Force site visibility to be public + id: "CREATE_SITE_FIELD_VISIBILITY", + config: { + disablementConfig: { + rules: [isRMSitePreset] + }, + autoSetConfig: [{ + rulePassValue: "PUBLIC", + rules: [isRMSitePreset] + }] + } +}, { + // Add default site description (which can be modified) + id: "CREATE_SITE_FIELD_DESCRIPTION", + config: { + autoSetConfig: [{ + rulePassValue: msg.get("description.recordsManagementSite"), + ruleFailValue: "", + rules: [isRMSitePreset] + }] + } +}, { + // Add compliance dropdown option + id: "CREATE_SITE_FIELD_COMPLIANCE", + targetPosition: "END", + name: "alfresco/forms/controls/Select", + config: { + fieldId: "COMPLIANCE", + label: "label.compliance", + name: "compliance", + optionsConfig: { + fixed: [ + { + label: "compliance.standard", + value: stdRMType + }, + { + label: "compliance.dod5015", + value: dod5015Type + } + ] + }, + visibilityConfig: { + rules: [isRMSitePreset] + } + } +}, { + // Add hidden type field + id: "CREATE_SITE_FIELD_TYPE", + targetPosition: "END", + name: "alfresco/forms/controls/HiddenValue", + config: { + fieldId: "TYPE", + name: "type", + autoSetConfig: [{ + ruleFailValue: "{http://www.alfresco.org/model/site/1.0}site", + rules: [isRMSitePreset] + }, { + rulePassValue: stdRMType, + rules: [ + isRMSitePreset, + { + targetId: "COMPLIANCE", + is: [stdRMType] + } + ] + }, { + rulePassValue: dod5015Type, + rules: [ + isRMSitePreset, + { + targetId: "COMPLIANCE", + is: [dod5015Type] + } + ] + }] + } +}]); + +var siteServiceConfig = { + legacyMode: false, + additionalSitePresets: additionalSitePresets, + widgetsForCreateSiteDialogOverrides: widgetsForCreateSiteDialogOverrides +}; + +model.jsonModel.services.unshift({ + name: "alfresco/services/NotificationService", + config: { + showProgressIndicator: true + } +}, { + id: "SITE_SERVICE", + name: "alfresco/services/SiteService", + config: siteServiceConfig +}); diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/audit.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/audit.ftl new file mode 100644 index 0000000000..6bb0c318d2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/audit.ftl @@ -0,0 +1,44 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> +
+
+
+ <@region id="rmaudit" scope="template" protected=true /> +
+
+
+ + +<@templateFooter> +
+ <@region id="footer" scope="global" protected=true /> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/disposition-edit.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/disposition-edit.ftl new file mode 100644 index 0000000000..395e2cad0f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/disposition-edit.ftl @@ -0,0 +1,45 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<#import "/org/alfresco/import/alfresco-layout.ftl" as layout /> +<@templateHeader /> + +<@templateBody> +
+ <@region scope="global" id="share-header" chromeless="true"/> +

<#if page.titleId??>${msg(page.titleId)!page.title}<#else>${page.title}

+
+
+ <@region id="disposition-edit" scope="template" protected=true /> +
+ + +<@templateFooter> +
+ <@region id="footer" scope="global" protected=true /> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/fileplan-report.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/fileplan-report.ftl new file mode 100644 index 0000000000..0962403ca0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/fileplan-report.ftl @@ -0,0 +1,38 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<#import "/org/alfresco/import/alfresco-layout.ftl" as layout /> +<@templateHeader /> + +<@templateBody> +
+ <@region id="fileplan-report" scope="template" protected=true /> + +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/new-reference.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/new-reference.ftl new file mode 100644 index 0000000000..aea2f1f1af --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/new-reference.ftl @@ -0,0 +1,45 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+
+ +
+ + +<@templateFooter> +
+ <@region id="footer" scope="global" protected=true /> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-category-details.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-category-details.ftl new file mode 100644 index 0000000000..1a6e7e2d74 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-category-details.ftl @@ -0,0 +1,60 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<@templateHeader> + <@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/doclib-actions.js"> + <@script type="text/javascript" src="${url.context}/res/components/object-finder/object-finder.js"> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/folder-details/folder-details-panel.css" /> + + +<@templateBody> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+
+ <@region id="actions-common" scope="template"/> + <@region id="actions" scope="template"/> + <@region id="node-header" scope="template"/> +
+
+ <@region id="disposition" scope="template"/> +
+
+ <@region id="folder-actions" scope="template"/> + <@region id="folder-metadata" scope="template"/> + <@region id="folder-links" scope="template"/> +
+
+
+ <@region id="doclib-custom" scope="template"/> + + +<@templateFooter> +
+ <@region id="footer" scope="global" /> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-folder-details.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-folder-details.ftl new file mode 100644 index 0000000000..32a1ccd238 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-folder-details.ftl @@ -0,0 +1,60 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<@templateHeader> + <@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/doclib-actions.js"> + <@script type="text/javascript" src="${url.context}/res/components/object-finder/object-finder.js"> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/folder-details/folder-details-panel.css" /> + + +<@templateBody> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+
+ <@region id="actions-common" scope="template"/> + <@region id="actions" scope="template"/> + <@region id="node-header" scope="template"/> +
+
+ <@region id="events" scope="template"/> +
+
+ <@region id="folder-actions" scope="template"/> + <@region id="folder-metadata" scope="template"/> + <@region id="folder-links" scope="template"/> +
+
+
+ <@region id="doclib-custom" scope="template"/> + + +<@templateFooter> +
+ <@region id="footer" scope="global"/> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-series-details.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-series-details.ftl new file mode 100644 index 0000000000..b0e433534b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/record-series-details.ftl @@ -0,0 +1,26 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/references.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/references.ftl new file mode 100644 index 0000000000..ae1ccbc99f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/references.ftl @@ -0,0 +1,47 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+
+
+
+ <@region id="references" scope="template" protected=true /> +
+
+
+ + +<@templateFooter> +
+ <@region id="footer" scope="global" protected=true /> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/search.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/search.ftl new file mode 100644 index 0000000000..9a968cac0f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/templates/org/alfresco/rm/search.ftl @@ -0,0 +1,47 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<#include "/org/alfresco/include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+
+
+
+ <@region id="search" scope="template" protected=true /> +
+
+
+ + +<@templateFooter> +
+ <@region id="footer" scope="global" protected=true /> +
+ diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/rm-context.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/rm-context.xml new file mode 100644 index 0000000000..c4982466b9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/rm-context.xml @@ -0,0 +1,408 @@ + + + + + + + + alfresco.messages.rm + + + + + + + + + classpath:alfresco/rm-share-config.xml + classpath:alfresco/rm-form-config.xml + classpath:alfresco/rm-share-workflow-form-config.xml + + + + classpath:alfresco/web-extension/rm-share-config-custom.xml + + jar:*!/META-INF/rm-share-config-custom.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rma:recordRejectionDetails + + + + + + + + + + + + + + clf:childClassificationInProgress + + + + + + + + clf:childClassificationComplete + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rma:frozen + + + + + + + + + + + + cm:versionable + + + + + + + + rma:record + + + + + + + + + + cm:content + + + + + + + site-dashboard + + + + + + + rm-site-dashboard + + + + + + + + + + qshare:shared + + + + + + + \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/rm-share-config-custom.xml.sample b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/rm-share-config-custom.xml.sample new file mode 100644 index 0000000000..77dcaeb4ef --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/rm-share-config-custom.xml.sample @@ -0,0 +1,32 @@ + + + + + + + + + + + onActionSimpleRepoAction + create-record + onCreateRecordSuccess + message.create-record.success + message.create-record.failure + + Write + + + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + evaluator.doclib.action.isWorkingCopy + evaluator.rm.doclib.isRejectedRecord + evaluator.doclib.action.siteBased + evaluator.rm.doclib.action.rmSiteExists + evaluator.rm.doclib.isUserRecordContributor + evaluator.doclib.action.disableAction + + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get.config.xml b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get.config.xml new file mode 100644 index 0000000000..f47ad39232 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get.config.xml @@ -0,0 +1,101 @@ + + + + DM.RuleConfigActionCustom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select + SpecialiseType + AddFeatures + RemoveFeatures + CheckIn + Checkout + Copy + Move + SimpleWorkflow + Mail + LinkCategory + Script + Transform + Transform + Import + SetPropertyValue + DeclareAndFileRecord + DeclareAndFileVersionRecord + + + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get.properties new file mode 100644 index 0000000000..90b5512daa --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get.properties @@ -0,0 +1,11 @@ +button.select-folder=Select... + +dialog.destination.title=Select destination folder + +record.folder.path.title=Click for more details on typing a record folder location. +record.folder.path.help=

Select a record folder or type in the full path.

\ + +create-record.path.label=Record Folder Location +create-record.hide-record.label=Hide Record +create-record.button=Declare and File +declare-as-version-record.path.label=Record Folder Location \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_de.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_de.properties new file mode 100644 index 0000000000..d91ed8c253 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_de.properties @@ -0,0 +1,11 @@ +button.select-folder=Ausw\u00e4hlen... + +dialog.destination.title=Zielordner ausw\u00e4hlen + +record.folder.path.title=Klicken Sie, um weitere Einzelheiten zur Eingabe eines Orts f\u00fcr Record-Ordner zu erhalten. +record.folder.path.help=

W\u00e4hlen Sie einen Record-Ordner aus oder geben Sie den vollst\u00e4ndigen Pfad ein.

\ + +create-record.path.label=Ort f\u00fcr Record-Ordner +create-record.hide-record.label=Record ausblenden +create-record.button=Deklarieren und ablegen +declare-as-version-record.path.label=Ort f\u00fcr Record-Ordner diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_es.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_es.properties new file mode 100644 index 0000000000..c17e91d740 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_es.properties @@ -0,0 +1,11 @@ +button.select-folder=Seleccionar... + +dialog.destination.title=Seleccione la carpeta de destino + +record.folder.path.title=Haga clic para obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo escribir la ubicaci\u00f3n de una carpeta de documentos de archivo. +record.folder.path.help=

Seleccione una carpeta de documentos de archivo o escriba la ruta completa.

\ + +create-record.path.label=Ubicaci\u00f3n de la carpeta de documentos de archivo +create-record.hide-record.label=Ocultar documento de archivo +create-record.button=Declarar y archivar +declare-as-version-record.path.label=Ubicaci\u00f3n de la carpeta de documentos de archivo diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_fr.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_fr.properties new file mode 100644 index 0000000000..ff8d9a24c6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_fr.properties @@ -0,0 +1,11 @@ +button.select-folder=S\u00e9lectionner... + +dialog.destination.title=S\u00e9lectionner le dossier de destination + +record.folder.path.title=Cliquez pour plus d'informations sur la saisie de l'emplacement d'un dossier d'archives. +record.folder.path.help=

S\u00e9lectionnez un dossier d'archives ou saisissez le chemin d'acc\u00e8s complet.

\ + +create-record.path.label=Emplacement du dossier d'archives +create-record.hide-record.label=Masquer le document d'archives +create-record.button=D\u00e9clarer et classer +declare-as-version-record.path.label=Emplacement du dossier d'archives diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_it.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_it.properties new file mode 100644 index 0000000000..dfc9fe86b4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_it.properties @@ -0,0 +1,11 @@ +button.select-folder=Seleziona... + +dialog.destination.title=Seleziona cartella di destinazione + +record.folder.path.title=Fare clic per maggiori dettagli su come inserire una nuova posizione della cartella di record. +record.folder.path.help=

Selezionare una cartella di record o inserire l'intero percorso.

\ + +create-record.path.label=Posizione cartella di record +create-record.hide-record.label=Nascondi record +create-record.button=Dichiara e archivia +declare-as-version-record.path.label=Posizione cartella di record diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_ja.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_ja.properties new file mode 100644 index 0000000000..b427352846 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_ja.properties @@ -0,0 +1,11 @@ +button.select-folder=\u9078\u629e... + +dialog.destination.title=\u6574\u7406\u4fdd\u7ba1\u5148\u30d5\u30a9\u30eb\u30c0\u306e\u9078\u629e + +record.folder.path.title=\u3053\u3053\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u5834\u6240\u3092\u5165\u529b\u3059\u308b\u65b9\u6cd5\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +record.folder.path.help=

\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3059\u308b\u304b\u3001\u305d\u306e\u30d5\u30a9\u30eb\u30c0\u306e\u30d5\u30eb\u30d1\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002

\ + +create-record.path.label=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u5834\u6240 +create-record.hide-record.label=\u30ec\u30b3\u30fc\u30c9\u3092\u975e\u8868\u793a\u306b\u3059\u308b +create-record.button=\u5ba3\u8a00\u3057\u3066\u30d5\u30a1\u30a4\u30eb +declare-as-version-record.path.label=\u30ec\u30b3\u30fc\u30c9\u30d5\u30a9\u30eb\u30c0\u306e\u5834\u6240 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_nb.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_nb.properties new file mode 100644 index 0000000000..3e990ecce3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_nb.properties @@ -0,0 +1,11 @@ +button.select-folder=Velg... + +dialog.destination.title=Velg m\u00e5lmappe + +record.folder.path.title=Klikk for \u00e5 finne flere detaljer om \u00e5 skrive inn en plassering av oppf\u00f8ringsmappen. +record.folder.path.help=

Velg en oppf\u00f8ringsmappe, eller skriv inn hele banen.

\ + +create-record.path.label=Plassering av oppf\u00f8ringsmappe +create-record.hide-record.label=Skjul oppf\u00f8ring +create-record.button=Erkl\u00e6r og arkiver +declare-as-version-record.path.label=Plassering av oppf\u00f8ringsmappe diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_nl.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_nl.properties new file mode 100644 index 0000000000..88f76ea497 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_nl.properties @@ -0,0 +1,11 @@ +button.select-folder=Selecteren... + +dialog.destination.title=Doelmap selecteren + +record.folder.path.title=Klik voor meer informatie over het invoeren van een archiefmaplocatie. +record.folder.path.help=

Selecteer een archiefmap of -type in het volledige pad.

\ + +create-record.path.label=Locatie archiefmap +create-record.hide-record.label=Archiefstuk verbergen +create-record.button=Declareren en archiveren +declare-as-version-record.path.label=Locatie archiefmap diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_pt_BR.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_pt_BR.properties new file mode 100644 index 0000000000..765bebb740 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_pt_BR.properties @@ -0,0 +1,11 @@ +button.select-folder=Selecionar... + +dialog.destination.title=Selecionar pasta de destino + +record.folder.path.title=Clique para obter mais detalhes sobre como digitar um local de pasta de documento arquiv\u00edstico. +record.folder.path.help=

Selecione uma pasta de documento arquiv\u00edstico ou digite o caminho completo.

\ + +create-record.path.label=Local da pasta de documento arquiv\u00edstico +create-record.hide-record.label=Ocultar documento arquiv\u00edstico +create-record.button=Declarar e arquivar +declare-as-version-record.path.label=Local da pasta de documento arquiv\u00edstico diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_ru.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_ru.properties new file mode 100644 index 0000000000..777016671a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_ru.properties @@ -0,0 +1,11 @@ +button.select-folder=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435... + +dialog.destination.title=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f + +record.folder.path.title=\u041d\u0430\u0436\u043c\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. +record.folder.path.help=

\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043b\u0438\u0431\u043e \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c.

\ + +create-record.path.label=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +create-record.hide-record.label=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +create-record.button=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u0444\u0430\u0439\u043b +declare-as-version-record.path.label=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_zh_CN.properties b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_zh_CN.properties new file mode 100644 index 0000000000..569dc86468 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/config/rule-config-action.get_zh_CN.properties @@ -0,0 +1,11 @@ +button.select-folder=\u9009\u62e9... + +dialog.destination.title=\u9009\u62e9\u76ee\u6807\u6587\u4ef6\u5939 + +record.folder.path.title=\u5355\u51fb\u4e86\u89e3\u6709\u5173\u8f93\u5165\u8bb0\u5f55\u6587\u4ef6\u5939\u4f4d\u7f6e\u7684\u66f4\u591a\u8be6\u60c5\u3002 +record.folder.path.help=

\u9009\u62e9\u8bb0\u5f55\u6587\u4ef6\u5939\u6216\u8f93\u5165\u5b8c\u6574\u8def\u5f84\u3002

\ + +create-record.path.label=\u8bb0\u5f55\u6587\u4ef6\u5939\u4f4d\u7f6e +create-record.hide-record.label=\u9690\u85cf\u8bb0\u5f55 +create-record.button=\u58f0\u660e\u548c\u7acb\u5377 +declare-as-version-record.path.label=\u8bb0\u5f55\u6587\u4ef6\u5939\u4f4d\u7f6e diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/rule-details.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/rule-details.get.html.ftl new file mode 100644 index 0000000000..2fc8b250fa --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/rule-details.get.html.ftl @@ -0,0 +1,89 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="css" > +<#-- CSS Dependencies --> + <@link href="${url.context}/res/components/rules/config/rule-config.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-type.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-condition.css" group="rules"/> + <@link href="${url.context}/res/components/rules/rule-details.css" group="rules"/> + <@link href="${url.context}/res/components/documentlibrary/dm-actions.css" group="rules"/> + + +<@markup id="js"> +<#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/rules/config/rule-config-util.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-type.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-condition.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-action.js" group="rules"/> + <@script src="${url.context}/res/components/rules/rule-details.js" group="rules"/> + +<#-- DM rule customizations --> + <@script src="${url.context}/res/components/dm/rules/config/rule-config-action-custom.js" group="rules_custom"> + +<#-- RM customizations --> + <@script src="${url.context}/res/rm/modules/documentlibrary/copy-move-link-file-to.js" group="rules"/> + <@script src="${url.context}/res/modules/simple-dialog.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/site-folder.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/doclib-actions.js" group="rules"/> + + +<@markup id="widgets"> + <@createWidgets group="rules"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid> +
+ +
+ + diff --git a/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/rule-edit.get.html.ftl b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/rule-edit.get.html.ftl new file mode 100644 index 0000000000..8d7d28229c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/config/alfresco/web-extension/site-webscripts/org/alfresco/components/rules/rule-edit.get.html.ftl @@ -0,0 +1,173 @@ +<#-- + #%L + Alfresco Records Management Module + %% + Copyright (C) 2005 - 2023 Alfresco Software Limited + %% + This file is part of the Alfresco software. + - + If the software was purchased under a paid Alfresco license, the terms of + the paid license agreement will prevail. Otherwise, the software is + provided under the following open source license terms: + - + Alfresco is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + - + Alfresco is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + - + You should have received a copy of the GNU Lesser General Public License + along with Alfresco. If not, see . + #L% +--> +<@markup id="css" > +<#-- CSS Dependencies --> + <@link href="${url.context}/res/components/rules/config/rule-config.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-type.css" group="rules"/> + <@link href="${url.context}/res/components/rules/config/rule-config-condition.css" group="rules"/> + <@link href="${url.context}/res/components/rules/rule-edit.css" group="rules"/> + <@link href="${url.context}/res/modules/documentlibrary/global-folder.css" group="rules"/> + <@link href="${url.context}/res/modules/rules/actions/workflow.css" group="rules"/> + <@link href="${url.context}/res/modules/rules/actions/checkin.css" group="rules"/> + <@link href="${url.context}/res/components/people-finder/authority-finder.css" group="rules"/> + <@link href="${url.context}/res/modules/email-form.css" group="rules"/> + <@link href="${url.context}/res/modules/data-picker.css" group="rules"/> + <@link href="${url.context}/res/modules/property-picker.css" group="rules"/> + <@link href="${url.context}/res/modules/rules/rules-property-picker.css" group="rules"/> + <@link href="${url.context}/res/components/object-finder/object-finder.css" group="rules"/> + <@link href="${url.context}/res/components/documentlibrary/dm-actions.css" group="rules"/> + + +<@markup id="js"> +<#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/rules/config/rule-config-util.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-type.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-condition.js" group="rules"/> + <@script src="${url.context}/res/components/rules/config/rule-config-action.js" group="rules"/> + <@script src="${url.context}/res/components/form/date.js" group="rules"/> + <@script src="${url.context}/res/components/form/date-picker.js" group="rules"/> + <@script src="${url.context}/res/yui/calendar/calendar.js" group="rules"/> + <@script src="${url.context}/res/components/rules/rule-edit.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/global-folder.js" group="rules"/> + <@script src="${url.context}/res/modules/rules/actions/workflow.js" group="rules"/> + <@script src="${url.context}/res/modules/rules/actions/checkin.js" group="rules"/> + <@script src="${url.context}/res/components/people-finder/authority-finder.js" group="rules"/> + <@script src="${url.context}/res/modules/email-form.js" group="rules"/> + <@script src="${url.context}/res/modules/data-picker.js" group="rules"/> + <@script src="${url.context}/res/modules/property-picker.js" group="rules"/> + <@script src="${url.context}/res/modules/rules/rules-property-picker.js" group="rules"/> + <@script src="${url.context}/res/components/object-finder/object-finder.js" group="rules"/> + <@script src="${url.context}/res/modules/form/control-wrapper.js" group="rules"/> + <@script src="${url.context}/res/components/common/common-component-style-filter-chain.js" group="rules"/> + +<#-- DM rule customizations --> + <@script src="${url.context}/res/components/dm/rules/config/rule-config-action-custom.js" group="rules_custom"> + +<#-- RM customizations --> + <@script src="${url.context}/res/modules/simple-dialog.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/site-folder.js" group="rules"/> + <@script src="${url.context}/res/modules/documentlibrary/doclib-actions.js" group="rules"/> + <@script src="${url.context}/res/rm/modules/documentlibrary/copy-move-link-file-to.js" group="rules"/> + + +<@markup id="widgets"> + <@createWidgets group="rules"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#include "config/rule-config.lib.ftl" /> + <#assign el=args.htmlid> +
+
+ + + +

${msg("header.editRule")}<#if ruleTitle??>: ${ruleTitle?html}

+

${msg("header.newRule")}

+ +
+ * ${msg("form.required.fields")} +
+ +
+ +

${msg("header.general")}

+
+ +
+ + +
+
+ + +
+ +

${msg("header.defineRule")}

+
+ +
${msg("message.loading")}
+ + +

${msg("header.otherOptions")}

+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
 
+
+
+ + + + + + + + +
+
+
+ + diff --git a/amps/ags/rm-community/rm-community-share/docker-compose.yml b/amps/ags/rm-community/rm-community-share/docker-compose.yml new file mode 100644 index 0000000000..f4714b5936 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/docker-compose.yml @@ -0,0 +1,104 @@ +version: "3" + +services: + alfresco: + image: alfresco/alfresco-governance-repository-community-base:latest + environment: + CATALINA_OPTS: " + -agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n + " + JAVA_TOOL_OPTIONS: " + -Dencryption.keystore.type=JCEKS + -Dencryption.cipherAlgorithm=DESede/CBC/PKCS5Padding + -Dencryption.keyAlgorithm=DESede + -Dencryption.keystore.location=/usr/local/tomcat/shared/classes/alfresco/extension/keystore/keystore + -Dmetadata-keystore.password=mp6yc0UD9e + -Dmetadata-keystore.aliases=metadata + -Dmetadata-keystore.metadata.password=oKIWzVdEdA + -Dmetadata-keystore.metadata.algorithm=DESede + " + JAVA_OPTS: " + -Ddb.driver=org.postgresql.Driver + -Ddb.username=alfresco + -Ddb.password=alfresco + -Ddb.url=jdbc:postgresql://postgres:5432/alfresco + -Dsolr.host=solr6 + -Dsolr.port=8983 + -Dsolr.secureComms=secret + -Dsolr.sharedSecret=secret + -Dsolr.base.url=/solr + -Dindex.subsystem.name=solr6 + -Dalfresco.restApi.basicAuthScheme=true + -Dimap.server.enabled=true + -Dimap.server.port=1143 + -Dftp.enabled=true + -Dftp.port=1221 + -Dftp.dataPortFrom=30000 + -Dftp.dataPortTo=30099 + -Dshare.host=localhost + -Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos + -Dmessaging.broker.url=\"failover:(tcp://activemq:61616)?timeout=3000&jms.useCompression=true\" + -DlocalTransform.core-aio.url=http://transform-core-aio:8090/ + " + ports: + - "8080:8080" + - "8000:8000" + - "1143:1143" + - "21:1221" + - "30000-30099:30000-30099" + + share: + image: alfresco/alfresco-governance-share-community-base:latest + environment: + - REPO_HOST=alfresco + - REPO_PORT=8080 + ports: + - "8181:8080" + + postgres: + image: library/postgres:${POSTGRES_TAG} + environment: + - POSTGRES_PASSWORD=alfresco + - POSTGRES_USER=alfresco + - POSTGRES_DB=alfresco + command: postgres -c max_connections=300 -c log_min_messages=LOG + ports: + - "5432:5432" + + solr6: + image: alfresco/alfresco-search-services:${SOLR6_TAG} + environment: + # Solr needs to know how to register itself with Alfresco + SOLR_ALFRESCO_HOST: "alfresco" + SOLR_ALFRESCO_PORT: "8080" + # Alfresco needs to know how to call solr + SOLR_SOLR_HOST: "solr6" + SOLR_SOLR_PORT: "8983" + # Create the default alfresco and archive cores + SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive" + # HTTPS or SECRET + ALFRESCO_SECURE_COMMS: "secret" + # SHARED SECRET VALUE + JAVA_TOOL_OPTIONS: " + -Dalfresco.secureComms.secret=secret + " + ports: + - "8083:8983" # Browser port + + activemq: + image: alfresco/alfresco-activemq:${ACTIVEMQ_TAG} + ports: + - "8161:8161" # Web Console + - "5672:5672" # AMQP + - "61616:61616" # OpenWire + - "61613:61613" # STOMP + + transform-core-aio: + image: alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx512m + " + ports: + - "8090:8090" diff --git a/amps/ags/rm-community/rm-community-share/jrebel-docker-compose.yml b/amps/ags/rm-community/rm-community-share/jrebel-docker-compose.yml new file mode 100644 index 0000000000..2391b14856 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/jrebel-docker-compose.yml @@ -0,0 +1,34 @@ +version: "2" + +services: + alfresco: + build: + context: jrebel-repo + environment: + JAVA_OPTS: " + -Ddb.driver=org.postgresql.Driver + -Ddb.username=alfresco + -Ddb.password=alfresco + -Ddb.url=jdbc:postgresql://postgres:5432/alfresco + -Dsolr.host=solr6 + -Dsolr.port=8983 + -Dsolr.secureComms=secret + -Dsolr.sharedSecret=secret + -Dsolr.base.url=/solr + -Dindex.subsystem.name=solr6 + -Dalfresco.restApi.basicAuthScheme=true + -Dimap.server.enabled=true + -Dftp.enabled=true + -Dftp.dataPortFrom=30000 + -Dftp.dataPortTo=30099 + -Dshare.host=localhost + -Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos + -Dmessaging.broker.url=\"failover:(tcp://activemq:61616)?timeout=3000&jms.useCompression=true\" + -agentpath:/usr/local/tomcat/jrebel/lib/libjrebel64.so + -Drebel.remoting_plugin=true + -Drebel.log.file=/jrebel.log + -Drebel.remoting_port=12345 + " + ports: + - "8080:8080" + - "12345:12345" # jRebel port diff --git a/amps/ags/rm-community/rm-community-share/jrebel-repo/Dockerfile b/amps/ags/rm-community/rm-community-share/jrebel-repo/Dockerfile new file mode 100644 index 0000000000..9f40ee7583 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/jrebel-repo/Dockerfile @@ -0,0 +1,10 @@ +### AGS community repo image +FROM alfresco/alfresco-governance-repository-community-base:latest + +### Install the jRebel agent +RUN yum install -y unzip +RUN curl http://dl.zeroturnaround.com/jrebel-stable-nosetup.zip --output /usr/local/jrebel-stable-nosetup.zip +RUN unzip /usr/local/jrebel-stable-nosetup.zip + +# This is needed to avoid "access denied" issues with AccessControlException. +RUN echo -e "grant {\n permission java.security.AllPermission;\n};" >> /usr/local/tomcat/conf/catalina.policy diff --git a/amps/ags/rm-community/rm-community-share/pom.xml b/amps/ags/rm-community/rm-community-share/pom.xml new file mode 100644 index 0000000000..0b0fcea24d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/pom.xml @@ -0,0 +1,301 @@ + + 4.0.0 + alfresco-governance-services-community-share + amp + Alfresco Governance Services Community Share + Alfresco Governance Services Share Extension + + + org.alfresco + alfresco-governance-services-community-share-parent + 23.1.0.156-SNAPSHOT + + + + http://localhost:8080/alfresco + + alfresco/alfresco-governance-share-community-base + alfresco/alfresco-share-base:${image.tag} + ${project.parent.parent.parent.parent.basedir}/scripts + + + + + org.alfresco + share + ${project.version} + classes + provided + + + + junit + junit + test + + + org.mockito + mockito-all + test + + + + + jakarta.xml.bind + jakarta.xml.bind-api + provided + + + org.glassfish.jaxb + jaxb-runtime + provided + + + org.apache.bcel + bcel + provided + + + + + source/java + + + config + true + + + source/web + + + + + + net.alchim31.maven + yuicompressor-maven-plugin + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-test-source + + add-test-source + + + + unit-test/java + + + + + + + + maven-surefire-plugin + + + **/*UnitTest.java + + + + + + maven-antrun-plugin + + + prepare-package + + run + + + + + + + + + + + + + + + + + + + + + + + + + + org.alfresco.maven.plugin + alfresco-maven-plugin + true + + + + + org.codehaus.mojo + license-maven-plugin + + alfresco_community + + source/java + config + source/web + unit-test/java + + + + + + + + + build-docker-images + + + + + io.fabric8 + docker-maven-plugin + + + + ${image.name}:${image.tag} + + + ${base.image} + + ${project.basedir} + + + + + + + build-image + package + + build + + + + + + + + + + build-multiarch-docker-images + + + + io.fabric8 + docker-maven-plugin + + + + ${local.registry}/${image.name}:${image.tag} + + + ${builder.name} + + linux/amd64 + linux/arm64 + + + ${project.basedir} + + ${local.registry}/${base.image} + + + + + + + + build-push-image + package + + build + push + + + + + + exec-maven-plugin + org.codehaus.mojo + + + prepare-buildx + generate-sources + + exec + + + ${scripts.directory}/docker/prepare_buildx.sh + + ${builder.name} + ${image.registry} + ${image.name} + ${image.tag} + + + + + + + + + + + push-docker-images + + + + + io.fabric8 + docker-maven-plugin + + + + + ${image.name}:${image.tag} + ${image.registry} + + + ${base.image} + + ${project.basedir} + + + + + + + + + + + build-push-image + install + + build + push + + + + + + + + + diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/ActionEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/ActionEvaluator.java new file mode 100644 index 0000000000..7c41163dc2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/ActionEvaluator.java @@ -0,0 +1,109 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * Check for the validity of Records Management actions + * + * @author: mikeh + */ +public class ActionEvaluator extends BaseRMEvaluator +{ + private String action; + + /** + * Sets the name of the action to check for + * + * @param action The name of the action to check for + */ + public void setAction(String action) + { + this.action = action; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (action == null) + { + return false; + } + + try + { + JSONArray actions = getRMActions(jsonObject); + if (actions == null) + { + return false; + } + else + { + if (actions.contains(action)) + { + return true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return false; + } + + /** + * Retrieve a JSONArray of applicable actions + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return JSONArray containing applicable actions the UI may choose to display + */ + private JSONArray getRMActions(JSONObject jsonObject) + { + JSONArray actions = null; + + try + { + JSONObject rmNode = getRMNode(jsonObject); + if (rmNode != null) + { + actions = (JSONArray) rmNode.get("actions"); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return actions; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/BaseRMEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/BaseRMEvaluator.java new file mode 100644 index 0000000000..e74a7ee432 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/BaseRMEvaluator.java @@ -0,0 +1,111 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * Base class for RM evaluators + * + * @author: mikeh + */ +public abstract class BaseRMEvaluator extends BaseEvaluator +{ + protected final boolean isDocLibRecord(JSONObject jsonObject) + { + boolean result = false; + + String siteId = getSiteId(jsonObject); + JSONObject rmNode = getRMNode(jsonObject); + + // TODO .. need to check the type of the site (not assume the id of the site) + // TODO .. need to ensure this is a record (not something else) + + if (rmNode != null && siteId != null && !siteId.equals("rm")) + { + result = true; + } + return result; + } + + /** + * Retrieve a JSONObject representing the RM extended properties + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return JSONArray containing aspects on the node + */ + protected final JSONObject getRMNode(JSONObject jsonObject) + { + JSONObject rmNode = null; + + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + + if (node != null) + { + rmNode = (JSONObject) node.get("rmNode"); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return rmNode; + } + + /** + * Retrieve a JSONArray of applicable indicators + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return JSONArray containing applicable indicators the UI may choose to display + */ + protected JSONArray getRMIndicators(JSONObject jsonObject) + { + JSONArray indicators = null; + + try + { + JSONObject rmNode = getRMNode(jsonObject); + if (rmNode != null) + { + indicators = (JSONArray) rmNode.get("indicators"); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return indicators; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/BaseRecordedVersionHistoryEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/BaseRecordedVersionHistoryEvaluator.java new file mode 100644 index 0000000000..571279c50a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/BaseRecordedVersionHistoryEvaluator.java @@ -0,0 +1,62 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.web.evaluator.BaseEvaluator; +import org.apache.commons.lang3.StringUtils; +import org.json.simple.JSONObject; + +/** + * Abstract base class for the recorded version history evaluators + * + * @author Tuna Aksoy + * @since 2.3 + */ +public abstract class BaseRecordedVersionHistoryEvaluator extends BaseEvaluator +{ + /** Recordable version policy property */ + private static final String PROP_RECORDABLE_VERSION_POLICY = "rmv:recordableVersionPolicy"; + + /** + * Evaluation execution implementation. + * + * @param jsonObject The json object representing the document wrapping the node as received from a Rhino script + * @param policy The recordable version policy + * @return true if the node's recordable version property value equals to policy, false otherwise + */ + protected boolean evaluate(JSONObject jsonObject, String policy) + { + boolean result = false; + String recordableVersionPolicy = (String) getProperty(jsonObject, PROP_RECORDABLE_VERSION_POLICY); + if (StringUtils.isNotBlank(recordableVersionPolicy) && recordableVersionPolicy.equalsIgnoreCase(policy)) + { + result = true; + } + return result; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibFrozenIndicatorEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibFrozenIndicatorEvaluator.java new file mode 100644 index 0000000000..5fd3ff4232 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibFrozenIndicatorEvaluator.java @@ -0,0 +1,56 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * Frozen indicator shown in non-RM sites that contain frozen active content + * + * @author: Ross Gale + * @author: Sara Aspery + */ +public class DocLibFrozenIndicatorEvaluator extends BaseRMEvaluator +{ + + private static final String ASPECT_FROZEN = "rma:frozen"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = false; + + if (getNodeAspects(jsonObject).contains(ASPECT_FROZEN)) + { + result = true; + } + + return result; + } +} + diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibRecordIndicatorEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibRecordIndicatorEvaluator.java new file mode 100644 index 0000000000..cf0cef6447 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibRecordIndicatorEvaluator.java @@ -0,0 +1,44 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * Record indicator shown in non-RM sites that contain records + * + * @author: mikeh + */ +public class DocLibRecordIndicatorEvaluator extends BaseRMEvaluator +{ + @Override + public boolean evaluate(JSONObject jsonObject) + { + return isDocLibRecord(jsonObject); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibRmSiteExistsEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibRmSiteExistsEvaluator.java new file mode 100644 index 0000000000..c74c23ba87 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/DocLibRmSiteExistsEvaluator.java @@ -0,0 +1,54 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * Checks if an RM site exists or not + * + * @author Tuna Aksoy + * @since 2.1 + */ +public class DocLibRmSiteExistsEvaluator extends BaseRMEvaluator +{ + /** + * @see org.alfresco.web.evaluator.BaseEvaluator#evaluate(org.json.simple.JSONObject) + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = false; + Object isRMSiteCreated = ((JSONObject)jsonObject.get("node")).get("isRmSiteCreated"); + if (isRMSiteCreated != null && ((Boolean) isRMSiteCreated).booleanValue()) + { + result = true; + } + return result; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/HoldsCommonEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/HoldsCommonEvaluator.java new file mode 100644 index 0000000000..2a258b8b0f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/HoldsCommonEvaluator.java @@ -0,0 +1,86 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.web.evaluator.Evaluator; +import org.json.simple.JSONObject; + +/** + * Combined evaluator for records and active content + * for AddTo/RemoveFrom Hold action + * + * @author Roxana Lucanu + * @since 3.2 + */ + +public class HoldsCommonEvaluator extends BaseRMEvaluator +{ + /** evaluator for records */ + private Evaluator recordEvaluator; + + /** evaluator for active content */ + private Evaluator docEvaluator; + + private static final String ASPECT_FILEPLAN_COMPONENT = "rma:filePlanComponent"; + + /** + * Sets the record evaluator + * + * @param recordEvaluator + */ + public void setRecordEvaluator(Evaluator recordEvaluator) + { + this.recordEvaluator = recordEvaluator; + } + + /** + * Sets the active content evaluator + * + * @param docEvaluator + */ + public void setDocEvaluator(Evaluator docEvaluator) + { + this.docEvaluator = docEvaluator; + } + + /** + * Calls specific evaluator considering the document type + * + * @param jsonObject + * @return boolean + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (getNodeAspects(jsonObject).contains(ASPECT_FILEPLAN_COMPONENT)) + { + return recordEvaluator.evaluate(jsonObject); + } + return docEvaluator.evaluate(jsonObject); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IncompleteEventEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IncompleteEventEvaluator.java new file mode 100644 index 0000000000..406b8bb641 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IncompleteEventEvaluator.java @@ -0,0 +1,79 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import java.util.HashMap; +import java.util.Optional; + +import org.json.simple.JSONObject; + +/** + * Check for an incomplete disposition event and the 'combineDispositionStepConditions' property + * + * This will prevent an action being offered while there is an incomplete event if the user has requested to combine an event and date condition + * + * @author ross gale + */ +public class IncompleteEventEvaluator extends BaseRMEvaluator +{ + private static final String NODE = "node"; + + //Property name for boolean value indicating if all conditions need to be fulfilled for the disposition step to be available + private static final String COMBINE_DISPOSITION_STEP_CONDITIONS = "combineDispositionStepConditions"; + + private static final String DISPOSITION_EVENT_COMBINATION = "dispositionEventCombination"; + + private static final String INCOMPLETE_DISPOSITION_EVENT = "incompleteDispositionEvent"; + + + /** + * Returns false if there is an incomplete event and the combineDispositionStepConditions property is true + * otherwise return true. + * @param jsonObject + * @return boolean + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + JSONObject node = (JSONObject) jsonObject.get(NODE); + HashMap properties = (HashMap)((HashMap) node.get("rmNode")).get("properties"); + + Optional combineProp = Optional.ofNullable((Boolean) properties.get(COMBINE_DISPOSITION_STEP_CONDITIONS)); + + if (combineProp.orElse(false)) + { + String combineEvents = (String) properties.get(DISPOSITION_EVENT_COMBINATION); + if(combineEvents != null && combineEvents.equals("and")) + { + return !properties.containsKey(INCOMPLETE_DISPOSITION_EVENT); + } + } + return true; + + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IndicatorEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IndicatorEvaluator.java new file mode 100644 index 0000000000..01b7378336 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IndicatorEvaluator.java @@ -0,0 +1,85 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * Check for the validity of Records Management indicators + * + * @author: mikeh + */ +public class IndicatorEvaluator extends BaseRMEvaluator +{ + private String indicator; + + private boolean expected = true; + + /** + * Sets the name of the indicator to check for + * + * @param indicator The name of the indicator to check for + */ + public void setIndicator(String indicator) + { + this.indicator = indicator; + } + + public void setExpected(boolean expected) + { + this.expected = expected; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (indicator == null) + { + return false; + } + + boolean result = false; + + try + { + JSONArray indicators = getRMIndicators(jsonObject); + if (indicators != null && indicators.contains(indicator)) + { + result = true; + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return (result == expected); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IsElectronicEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IsElectronicEvaluator.java new file mode 100644 index 0000000000..ee996115a1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IsElectronicEvaluator.java @@ -0,0 +1,47 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * @author Roy Wetherall + */ +public class IsElectronicEvaluator extends IndicatorEvaluator +{ + public IsElectronicEvaluator() + { + setIndicator("nonElectronic"); + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + return !super.evaluate(jsonObject); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IsUserRecordContributor.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IsUserRecordContributor.java new file mode 100644 index 0000000000..e343185292 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IsUserRecordContributor.java @@ -0,0 +1,99 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import java.util.Collections; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.util.ParameterCheck; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.alfresco.web.extensibility.SlingshotEvaluatorUtil; +import org.json.simple.JSONObject; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; + +/** + * Checks if the user is a record contributor + * + * @author Roy Wetherall + * @since 2.3 + */ +public class IsUserRecordContributor extends BaseEvaluator +{ + /** json names */ + private static final String IS_RECORD_CONTRIBUTOR_GROUP_ENABLED = "isRecordContributorGroupEnabled"; + private static final String RECORD_CONTRIBUTOR_GROUP_NAME = "recordContributorGroupName"; + + /** slingshot evaluator util */ + protected SlingshotEvaluatorUtil util = null; + + /** + * @param slingshotExtensibilityUtil {@link SlingshotEvaluatorUtil} + */ + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + util = slingshotExtensibilityUtil; + } + + /** + * @see org.alfresco.web.evaluator.BaseEvaluator#evaluate(org.json.simple.JSONObject) + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = true; + ParameterCheck.mandatory("jsonObject", jsonObject); + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + if (node != null) + { + boolean isEnabled = (Boolean)node.get(IS_RECORD_CONTRIBUTOR_GROUP_ENABLED); + if (isEnabled) + { + // get the name of the record contributor group + String groupName = (String)node.get(RECORD_CONTRIBUTOR_GROUP_NAME); + + // check the record contributor group + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + result = util.isMemberOfGroups(rc, Collections.singletonList("GROUP_" + groupName), true); + } + else + { + // if group check is not enabled then allow + result = true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err.getMessage()); + }; + return result; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/RecordedVersionHistoryAllRevisionsEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/RecordedVersionHistoryAllRevisionsEvaluator.java new file mode 100644 index 0000000000..8485cbbf94 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/RecordedVersionHistoryAllRevisionsEvaluator.java @@ -0,0 +1,51 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * Evaluates the indicator for documents which have the recordable version policy "ALL" set. + * + * @author Tuna Aksoy + * @since 2.3 + */ +public class RecordedVersionHistoryAllRevisionsEvaluator extends BaseRecordedVersionHistoryEvaluator +{ + /** Recordable version policy */ + private static final String ALL = "ALL"; + + /** + * @see org.alfresco.web.evaluator.BaseEvaluator#evaluate(org.json.simple.JSONObject) + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + return evaluate(jsonObject, ALL); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/RecordedVersionHistoryMajorRevisionsEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/RecordedVersionHistoryMajorRevisionsEvaluator.java new file mode 100644 index 0000000000..5b10bf7d43 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/RecordedVersionHistoryMajorRevisionsEvaluator.java @@ -0,0 +1,51 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * Evaluates the indicator for documents which have the recordable version policy "MAJOR_ONLY" set. + * + * @author Tuna Aksoy + * @since 2.3 + */ +public class RecordedVersionHistoryMajorRevisionsEvaluator extends BaseRecordedVersionHistoryEvaluator +{ + /** Recordable version policy */ + private static final String MAJOR_ONLY = "MAJOR_ONLY"; + + /** + * @see org.alfresco.web.evaluator.BaseEvaluator#evaluate(org.json.simple.JSONObject) + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + return evaluate(jsonObject, MAJOR_ONLY); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UITypeEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UITypeEvaluator.java new file mode 100644 index 0000000000..a267d403a9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UITypeEvaluator.java @@ -0,0 +1,88 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONObject; + +/** + * Evaluates returned UI convenience type + * + * @author: mikeh + */ +public class UITypeEvaluator extends BaseRMEvaluator +{ + private String type; + + /** + * Sets the name of the node type to check for + * + * @param type The name of the node type to check for + */ + public void setType(String type) + { + this.type = type; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (type == null) + { + return false; + } + + if (isDocLibRecord(jsonObject)) + { + return false; + } + + try + { + JSONObject rmNode = getRMNode(jsonObject); + if (rmNode == null) + { + return false; + } + else + { + String uiType = (String) rmNode.get("uiType"); + if (uiType.equalsIgnoreCase(type)) + { + return true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return false; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UnlinkActionEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UnlinkActionEvaluator.java new file mode 100644 index 0000000000..aca60d7a08 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UnlinkActionEvaluator.java @@ -0,0 +1,80 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * Evaluate whether the unlink action should be shown or not. + * + * @author Roy Wetherall + * @since 2.3 + */ +public class UnlinkActionEvaluator extends BaseRMEvaluator +{ + /** value constants */ + private static final String INDICATOR = "multiParent"; + private static final String NODE = "node"; + private static final String RM_NODE = "rmNode"; + private static final String PRIMARY_PARENT = "primaryParentNodeRef"; + private static final String PARENT = "parent"; + private static final String NODE_REF = "nodeRef"; + + /** + * @see org.alfresco.web.evaluator.BaseEvaluator#evaluate(org.json.simple.JSONObject) + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = false; + + try + { + // first check that the multi parent indicator is present + JSONArray indicators = getRMIndicators(jsonObject); + if (indicators != null && indicators.contains(INDICATOR)) + { + // now check that we are not in the primary location + String primaryParent = (String)((JSONObject)((JSONObject)jsonObject.get(NODE)).get(RM_NODE)).get(PRIMARY_PARENT); + String parent = (String)((JSONObject)jsonObject.get(PARENT)).get(NODE_REF); + if (!primaryParent.equals(parent)) + { + result = true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err); + } + + return result; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/VersionRecordEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/VersionRecordEvaluator.java new file mode 100644 index 0000000000..771db37255 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/VersionRecordEvaluator.java @@ -0,0 +1,58 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import org.json.simple.JSONObject; + +/** + * Evaluates the indicator for records that have the versionRecord aspect + * + * @author Roy Wetherall + * @since 2.3 + */ +public class VersionRecordEvaluator extends BaseRMEvaluator +{ + private static final String ASPECT_VERSION_RECORD = "rmv:versionRecord"; + + /** + * @see org.alfresco.web.evaluator.BaseEvaluator#evaluate(org.json.simple.JSONObject) + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = false; + + if (!isDocLibRecord(jsonObject) && + getNodeAspects(jsonObject).contains(ASPECT_VERSION_RECORD)) + { + result = true; + } + + return result; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/forms/FormUIGet.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/forms/FormUIGet.java new file mode 100644 index 0000000000..615a7a60a3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/forms/FormUIGet.java @@ -0,0 +1,182 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.forms; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.web.config.forms.FormSet; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Form UI GET method implementation override. + *

+ * Allows custom and record metadata to be automatically displayed without need for form modificiations. + * + * @author Roy Wetherall + */ +public class FormUIGet extends org.alfresco.web.scripts.forms.FormUIGet +{ + private static final String SET_RM_CUSTOM = "rm-custom"; + private static final String SET_RM_METADATA = "rm-metadata"; + private static final String LABEL_ID_PREFIX = "label.set."; + + /** + * @see org.alfresco.web.scripts.forms.FormUIGet#getVisibleFieldsInSet(org.alfresco.web.scripts.forms.FormUIGet.ModelContext, org.alfresco.web.config.forms.FormSet) + */ + @Override + protected List getVisibleFieldsInSet(ModelContext context, FormSet setConfig) + { + List result = null; + String id = setConfig.getSetId(); + + if (SET_RM_CUSTOM.equals(id) || id.startsWith(SET_RM_METADATA)) + { + Map> setMembership = discoverSetMembership(context); + result = setMembership.get(id); + } + else + { + result = super.getVisibleFieldsInSet(context, setConfig); + } + + + return result; + } + + /** + * @see org.alfresco.web.scripts.forms.FormUIGet#processVisibleFields(org.alfresco.web.scripts.forms.FormUIGet.ModelContext) + */ + @Override + protected void processVisibleFields(ModelContext context) + { + // iterate over the root sets and generate a model for each one + for (FormSet setConfig : getRootSetsAsList(context)) + { + Set set = generateSetModelUsingVisibleFields(context, setConfig); + + // if the set got created (as it contained fields or other sets) + // add it to the structure list in the model context + if (set != null) + { + context.getStructure().add(set); + } + } + } + + /** + * @see org.alfresco.web.scripts.forms.FormUIGet#processServerFields(org.alfresco.web.scripts.forms.FormUIGet.ModelContext) + */ + @Override + protected void processServerFields(ModelContext context) + { + if (context.getFormConfig() != null) + { + // discover the set membership of the fields using the form definition + Map> setMembership = discoverSetMembership(context); + + // get root sets from config and build set structure using config and lists built above + for (FormSet setConfig : getRootSetsAsList(context)) + { + Set set = generateSetModelUsingServerFields(context, setConfig, setMembership); + + // if the set got created (as it contained fields or other sets) + // add it to the structure list in the model context + if (set != null) + { + context.getStructure().add(set); + } + } + } + else + { + // as there is no config at all generate a default set that contains + // all the fields returned in the form definition + Set set = generateDefaultSetModelUsingServerFields(context); + context.getStructure().add(set); + } + } + + /** + * Gets the root sets as a list, including the dynamically discovered record meta-data sets. + * + * @param context The model context + * @return The root sets as list, including the dynamically discovered record meta-data sets. + */ + protected List getRootSetsAsList(ModelContext context) + { + List result = context.getFormConfig().getRootSetsAsList(); + result.addAll(getRecordMetaDataSetConfig(context)); + return result; + } + + /** + * Gets all the record meta-data sets present in the form data. + * + * @param context The model context + * @return All the record meta-data sets present in the form data. + */ + protected Collection getRecordMetaDataSetConfig(ModelContext context) + { + Map result = new HashMap(13); + + try + { + // get list of fields from form definition + JSONObject data = context.getFormDefinition().getJSONObject(MODEL_DATA); + + JSONObject definition = data.getJSONObject(MODEL_DEFINITION); + JSONArray fieldsFromServer = definition.getJSONArray(MODEL_FIELDS); + + // iterate around fields and pull out the record metadata sets + for (int x = 0; x < fieldsFromServer.length(); x++) + { + JSONObject fieldDefinition = fieldsFromServer.getJSONObject(x); + if (fieldDefinition.has(MODEL_GROUP)) + { + String set = fieldDefinition.getString(MODEL_GROUP); + if (!result.containsKey(set) && set.startsWith(SET_RM_METADATA)) + { + FormSet formSet = new FormSet(set, null, "panel", null, LABEL_ID_PREFIX + set); + result.put(set, formSet); + } + } + } + } + catch (JSONException je) + { + // do nothing + } + + return result.values(); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/forms/KindEvaluator.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/forms/KindEvaluator.java new file mode 100644 index 0000000000..832e6fd008 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/forms/KindEvaluator.java @@ -0,0 +1,149 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.forms; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.alfresco.web.config.forms.ServiceBasedEvaluator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONTokener; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.util.URLEncoder; + +/** + * File plan component kind forms evaluator. + * + * @author Roy Wetherall + */ +public class KindEvaluator extends ServiceBasedEvaluator +{ + private static final String JSON_KIND = "kind"; + + private static Log logger = LogFactory.getLog(KindEvaluator.class); + + protected static final Pattern NODE_REF_PATTERN = Pattern.compile(".+://.+/.+"); + + /** + * Determines whether the given node type matches the path of the given + * object + * + * @see org.springframework.extensions.config.evaluator.Evaluator#applies(java.lang.Object, + * java.lang.String) + */ + public boolean applies(Object obj, String condition) + { + boolean result = false; + + if (obj instanceof String) + { + String objAsString = (String) obj; + // quick test before running slow match for full NodeRef pattern + if (objAsString.indexOf(':') != -1 || objAsString.startsWith("{")) + { + Matcher m = NODE_REF_PATTERN.matcher(objAsString); + if (m.matches()) + { + try + { + String jsonResponseString = callService("/api/rmmetadata?noderef=" + objAsString); + + if (jsonResponseString != null) + { + result = checkJsonAgainstCondition(condition, jsonResponseString); + } + else if (getLogger().isWarnEnabled()) + { + getLogger().warn("RM metadata service response appears to be null!"); + } + } + catch (ConnectorServiceException e) + { + if (getLogger().isWarnEnabled()) + { + getLogger().warn("Failed to connect to RM metadata service.", e); + } + } + } + else + { + try + { + String jsonResponseString = callService("/api/rmmetadata?type=" + URLEncoder.encodeUriComponent(objAsString)); + + if (jsonResponseString != null) + { + result = checkJsonAgainstCondition(condition, jsonResponseString); + } + else if (getLogger().isWarnEnabled()) + { + getLogger().warn("RM metadata service response appears to be null!"); + } + } + catch (ConnectorServiceException e) + { + if (getLogger().isWarnEnabled()) + { + getLogger().warn("Failed to connect to RM metadata service.", e); + } + } + } + } + } + + return result; + } + + protected boolean checkJsonAgainstCondition(String condition, String jsonResponseString) + { + boolean result = false; + try + { + JSONObject json = new JSONObject(new JSONTokener(jsonResponseString)); + String kind = json.getString(JSON_KIND); + result = condition.equals(kind); + } + catch (JSONException e) + { + if (getLogger().isWarnEnabled()) + { + getLogger().warn("Failed to find RM kind in JSON response from metadata service: " + e.getMessage()); + } + } + return result; + } + + @Override + protected Log getLogger() + { + return logger; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/ExtendedDefaultDoclistActionGroupResolver.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/ExtendedDefaultDoclistActionGroupResolver.java new file mode 100644 index 0000000000..0d6944e960 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/ExtendedDefaultDoclistActionGroupResolver.java @@ -0,0 +1,84 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.resolver.doclib; + +import org.alfresco.web.resolver.doclib.DefaultDoclistActionGroupResolver; +import org.json.simple.JSONObject; + +/** + * Extended default doclist action group resolver. + * + * @see DefaultDoclistActionGroupResolver + * @author Roy Wetherall + * @since 2.1 + */ +public class ExtendedDefaultDoclistActionGroupResolver extends DefaultDoclistActionGroupResolver +{ + private static final String FROZEN_ACTIVE_CONTENT = "frozencontent"; + + /** RM group resolver **/ + private FilePlanDoclistActionGroupResolver filePlanDoclistActionGroupResolver; + + /** + * @param filePlanDoclistActionGroupResolver rm group resolver + */ + public void setFilePlanDoclistActionGroupResolver(FilePlanDoclistActionGroupResolver filePlanDoclistActionGroupResolver) + { + this.filePlanDoclistActionGroupResolver = filePlanDoclistActionGroupResolver; + } + + /** + * Extend the default resolution code to account for records. + * + * @see org.alfresco.web.resolver.doclib.DefaultDoclistActionGroupResolver#resolve(org.json.simple.JSONObject, java.lang.String) + */ + @Override + public String resolve(JSONObject jsonObject, String view) + { + String result = null; + + // get the json object representing the node + JSONObject node = (org.json.simple.JSONObject)jsonObject.get("node"); + + // determine whether we are dealing with a RM node or not + Boolean isRMNode = (Boolean) node.get("isRmNode"); + String nodeType = (String) node.get("uiType"); + if ((isRMNode != null && isRMNode.booleanValue()) || FROZEN_ACTIVE_CONTENT.equals(nodeType)) + { + // use the file plan resolver + result = filePlanDoclistActionGroupResolver.resolve(jsonObject, view, true); + } + else + { + // use the default resolver + result = super.resolve(jsonObject, view); + } + + return result; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/FilePlanDoclistActionGroupResolver.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/FilePlanDoclistActionGroupResolver.java new file mode 100644 index 0000000000..7bb81890dd --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/FilePlanDoclistActionGroupResolver.java @@ -0,0 +1,98 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.resolver.doclib; + +import org.alfresco.web.resolver.doclib.DefaultDoclistActionGroupResolver; +import org.json.simple.JSONObject; + +/** + * Resolves which action group if to use in the document library's document list. + * + * @author ewinlof + */ +public class FilePlanDoclistActionGroupResolver extends DefaultDoclistActionGroupResolver +{ + /** + * Will return the action group id matching rm action group configs in rm-share-config.xml. + * + * @param jsonObject An item (i.e. document or folder) in the doclist. + * @param view Name of the type of view in which the action will be displayed. I.e. "details" + * @return The action group id to use for displaying actions + */ + @Override + public String resolve(JSONObject jsonObject, String view) + { + return resolve(jsonObject, view, false); + } + + /** + * Will return the action group id matching rm action group configs in rm-share-config.xml. + * + * @param jsonObject An item (i.e. document or folder) in the doclist. + * @param view Name of the type of view in which the action will be displayed. I.e. "details" + * @param isDocLib true if we are in the doc lib, false otherwise. + * @return The action group id to use for displaying actions + */ + public String resolve(JSONObject jsonObject, String view, boolean isDocLib) + { + String actionGroupId = "rm-"; + + if (isDocLib) + { + actionGroupId += "doclib-"; + } + + JSONObject node = (org.json.simple.JSONObject) jsonObject.get("node"); + boolean isLink = (Boolean) node.get("isLink"); + if (isLink) + { + actionGroupId += "link-"; + } + else + { + JSONObject rmNode = (JSONObject) node.get("rmNode"); + if (rmNode != null) + { + actionGroupId += (String) rmNode.get("uiType") + "-"; + } + else + { + actionGroupId += (String) node.get("uiType") + "-"; + } + } + if (view.equals("details")) + { + actionGroupId += "details"; + } + else + { + actionGroupId += "browse"; + } + return actionGroupId; + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/FilePlanDoclistDataUrlResolver.java b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/FilePlanDoclistDataUrlResolver.java new file mode 100644 index 0000000000..ae980feb21 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/java/org/alfresco/module/org_alfresco_module_rm_share/resolver/doclib/FilePlanDoclistDataUrlResolver.java @@ -0,0 +1,55 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.resolver.doclib; + +import java.util.HashMap; + +import org.alfresco.web.resolver.doclib.DefaultDoclistDataUrlResolver; +import org.springframework.extensions.surf.util.URLEncoder; + +/** + * Returns the url to the RM fileplan (The specific repository doclist webscript to use for RM). + * + * @author ewinlof + */ +public class FilePlanDoclistDataUrlResolver extends DefaultDoclistDataUrlResolver +{ + /** + * Returns the url to the RM specific repository doclist webscript to use, a fileplan. + * + * @param webscript The repo doclib2 webscript to use, i.e. doclist or node + * @param params doclib2 webscript specific parameters + * @param args url parameters, i.e. pagination parameters + * @return The url to use when asking the repository doclist webscript. + */ + @Override + public String resolve(String webscript, String params, HashMap args) + { + return "/slingshot/doclib2/rm/" + webscript + "/" + URLEncoder.encodeUri(params) + getArgsAsParameters(args); + } +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/components/documentlibrary/dm-actions.css b/amps/ags/rm-community/rm-community-share/source/web/components/documentlibrary/dm-actions.css new file mode 100644 index 0000000000..8012dd7715 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/components/documentlibrary/dm-actions.css @@ -0,0 +1,138 @@ +.info-banner a.item-rejected-record-info +{ + /* FIXME: Change image + See RM-RM-3967 */ + background-image: url("../../rm/components/documentlibrary/images/file-document-16.png"); + background-repeat: no-repeat; + float: right; + padding: 0 20px 0 0; +} + +.info-banner a.item-rejected-record-info:hover +{ + text-decoration: none; +} + +.info-banner a.item-rejected-record-close +{ + /* FIXME: Change image + See RM-RM-3967 */ + background-image: url("../../rm/components/documentlibrary/images/select-none-rm-16.png"); + background-repeat: no-repeat; + float: right; + padding: 0 20px 0 0; +} + +.info-banner a.item-rejected-record-close:hover +{ + text-decoration: none; +} + +.rejected-record-info .rejected-record-info-elements > div +{ + margin: 0.5em; +} + +.rejected-record-info .rejected-record-info-elements > div.description > label +{ + display: table; + font-size: 110%; + margin-left: 0.5em; +} + +.rejected-record-info .rejected-record-info-elements > div.elements > label +{ + display: table; + font-weight: 600; + margin-left: 0.5em; +} + +.rejected-record-info .rejected-record-info-elements > div > input, +.rejected-record-info .rejected-record-info-elements > div > textarea +{ + margin: 0.5em; + width: 34em; +} + +.rm-recorded-version-config select[id$=-recordedVersions] +{ + margin-bottom: 9px; + margin-top: 9px; +} + +.rm-recorded-version-config .bd .yui-gd .yui-u.first.rm-recorded-versions +{ + padding-right: 0.4em; + padding-top: 0.6em; + width: 150px; +} + +.rm-recorded-version-config .rm-recorded-versions-select +{ + width: 300px; +} + +.site-folder .hd .light { + font-weight: normal; +} + +.site-folder .treeview { + height: 20em; + overflow-y: auto; + padding: 0.5em; +} + +.site-folder .treeview { + border: 1px solid #e0e0e0; + height: 20em; + margin: 0.5em; + overflow-y: auto; + width: 38em; +} + +.site-folder .treeview .ygtvspacer { + display: block; + width: 18px; +} + +.site-folder .treeview .ygtvchildren { + background-color: #ffffff; + width: 100%; +} + +.site-folder .treeview .ygtvitem { + overflow-x: visible; +} + +.site-folder .ygtvitem .no-permission { + color: #c0c0c0; +} + +.site-folder .ygtvitem .folders-trimmed { + color: #f00; +} + +.site-folder .ygtvlabel, +.site-folder .ygtvlabel:link, +.site-folder .ygtvlabel:visited, +.site-folder .ygtvlabel:hover { + background: none; + color: #000; + white-space: nowrap; +} + +.site-folder .ygtverror, +.site-folder .ygtverror:link, +.site-folder .ygtverror:visited, +.site-folder .ygtverror:hover { + background: red; + color: white; +} + +.site-folder .selected { + background-color: #dceaf4; +} +/** Css style for the Add to Hold action from the Selected Items Menu from Document Library */ +.toolbar .onActionAddToHold { + background-image: url("../../rm/components/documentlibrary/actions/rm-add-to-hold-16.png"); +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/components/documentlibrary/dm-actions.js b/amps/ags/rm-community/rm-community-share/source/web/components/documentlibrary/dm-actions.js new file mode 100644 index 0000000000..a0f655df4c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/components/documentlibrary/dm-actions.js @@ -0,0 +1,450 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Document Library Actions module + * + * @namespace Alfresco.doclib + * @class Alfresco.doclib.Actions + */ +(function() +{ + var $html = Alfresco.util.encodeHTML; + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onHideRecordAction", + fn: function DLTB_onHideRecordAction(record, owner) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.confirm.hide.record.title"), + text: this.msg("message.confirm.hide.record"), + buttons: [ + { + text: this.msg("button.ok"), + handler: function DLTB_onHideRecordAction_confirm_ok() + { + me.onActionSimpleRepoAction(record, owner); + this.destroy(); + } + }, + { + text: this.msg("button.cancel"), + handler: function DLTB_onHideRecordAction_confirm_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + } + }); + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onCreateRecordSuccess", + fn: function DLTB_onCreateRecordSuccess(record, owner) + { + if (this.actionsView === "details") + { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + window.location.reload(true); + } + } + }); + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onHideRecordSuccess", + fn: function DLTB_onHideRecordSuccess(record, owner) + { + if (this.actionsView === "details") + { + window.location.href = window.location.href.split("document-details")[0] + "documentlibrary"; + } + } + }); + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onActionDmMoveTo", + fn: function DLTB_onActionDmMoveTo(record, owner) + { + this.modules.dmMoveTo = new Alfresco.module.DoclibCopyMoveTo(this.id + "-dmMoveTo"); + + this.modules.dmMoveTo.setOptions( + { + mode: "move", + siteId: this.options.siteId, + containerId: this.options.containerId, + path: this.currentPath, + files: record, + rootNode: this.options.rootNode, + parentId: this.getParentNodeRef(record), + width: "10em" + }).showDialog(); + + this.modules.dmMoveTo._showDialog = function DLTB__showDialog() + { + this.widgets.okButton.set("label", this.msg("button")); + + Dom.getPreviousSibling(this.id + "-modeGroup").setAttribute("style", "display:none"); + Dom.get(this.id + "-modeGroup").setAttribute("style", "display:none"); + Dom.getPreviousSibling(this.id + "-sitePicker").setAttribute("style", "display:none"); + Dom.get(this.id + "-sitePicker").setAttribute("style", "display:none"); + Dom.get(this.id + "-treeview").setAttribute("style", "width:35em !important"); + + return Alfresco.module.DoclibCopyMoveTo.superclass._showDialog.apply(this, arguments); + } + + var me = this; + this.modules.dmMoveTo.onOK = function DLTB_onOK(e, p_obj) + { + record.targetNodeRef = this.selectedNode.data.nodeRef; + me.onActionSimpleRepoAction(record, owner); + this.widgets.dialog.hide(); + } + } + }); + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onRecordedVersionConfig", + fn: function DLTB_onRecordedVersionConfig(record, owner) + { + var nodeRef = record.nodeRef.replace(":/", ""), + me = this; + this.modules.recordedVersionConfig = new Alfresco.module.SimpleDialog(this.id + "-recordedVersionConfig").setOptions( + { + width: "40em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/recorded-version-config?nodeRef=" + nodeRef, + actionUrl: Alfresco.constants.PROXY_URI + "slingshot/doclib/action/recorded-version-config/node/" + nodeRef, + onSuccess: + { + fn: function RDLA_onRecordedVersionConfig_SimpleDialog_success(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: me.msg("message.recordedVersionConfig.success") + }); + + if (this.actionsView !== "details") + { + // Fire event so compnents on page are refreshed + YAHOO.Bubbling.fire("metadataRefresh"); + } + }, + scope: this + }, + onFailure: + { + fn: function RDLA_onRecordedVersionConfig_SimpleDialog_failure(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: me.msg("message.recordedVersionConfig.failure") + }); + }, + scope: this + } + }); + this.modules.recordedVersionConfig.show(); + } + }); + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onActionDeclareAndFileTo", + fn: function DLTB_onActionDeclareAndFileTo(assets, owner) { + if (!this.modules.copyMoveLinkFileTo) + { + this.modules.copyMoveLinkFileTo = new Alfresco.rm.module.CopyMoveLinkFileTo(this.id + "-copyMoveLinkFileTo"); + } + + this.modules.copyMoveLinkFileTo.setOptions( + { + mode: "declareAndFile", + siteId: "rm", + containerId: this.options.containerId, + path: this.currentPath, + files: assets, + unfiled: false, + width: "40em" + }).showDialog(); + + var me = this; + currentOwner = owner; + currentAssets = assets; + this.modules.copyMoveLinkFileTo.onOK = function DLTB_onOK(e, p_obj) { + currentAssets.path = me.modules.copyMoveLinkFileTo.selectedNode.data.path.substr(1); + me.onActionSimpleRepoAction(currentAssets, currentOwner); + this.widgets.dialog.hide(); + delete currentAssets; + delete currentOwner; + } + } + + }); + + YAHOO.Bubbling.fire("registerAction", + { + actionName: "onActionDeclareVersionAndFileTo", + fn: function DLTB_onActionDeclareVersionAndFileTo(assets, owner) { + if (!this.modules.copyMoveLinkFileTo) + { + this.modules.copyMoveLinkFileTo = new Alfresco.rm.module.CopyMoveLinkFileTo(this.id + "-copyMoveLinkFileTo"); + } + + this.modules.copyMoveLinkFileTo.setOptions( + { + mode: "declareVersionAndFile", + siteId: "rm", + containerId: this.options.containerId, + path: this.currentPath, + files: assets, + unfiled: false, + width: "40em" + }).showDialog(); + + var me = this; + currentOwner = owner; + currentAssets = assets; + this.modules.copyMoveLinkFileTo.onOK = function DLTB_onOK(e, p_obj) + { + currentAssets.path = me.modules.copyMoveLinkFileTo.selectedNode.data.path.substr(1); + me.onActionSimpleRepoAction(currentAssets, currentOwner); + this.widgets.dialog.hide(); + delete currentAssets; + delete currentOwner; + } + } + }); + + onRejectedRecordInfo = function RM_onRejectedRecordInfo(nodeRef, displayName, rejectReason, userId, date) + { + new Alfresco.module.SimpleDialog("rejectedRecordInfoDialog").setOptions( + { + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/rejected-record-info", + actionUrl: null, + doBeforeDialogShow: + { + fn: function RM_onRejectedRecordInfo_doBeforeDialogShow(p_form, p_dialog) + { + var description = Dom.get("rejectedRecordInfoDialog-description"); + description.innerHTML = YAHOO.lang.substitute(description.innerHTML, {'displayName' : displayName}); + Dom.get("rejectedRecordInfoDialog-userId").setAttribute("value", userId); + Dom.get("rejectedRecordInfoDialog-date").setAttribute("value", date); + Dom.get("rejectedRecordInfoDialog-rejectReason").innerHTML = decodeURI(rejectReason); + }, + scope: this + } + }).show(); + }; + + onRejectedRecordClose = function RM_onRejectedRecordClose(nodeRef, title, text, buttonYes, buttonNo) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: title, + text: text, + buttons: [ + { + text: buttonYes, + handler: function DLTB_onRejectedRecordClose_confirm_yes() + { + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + 'slingshot/doclib/action/aspects/node/' + nodeRef.replace(":/", ""), + dataObj: + { + added: [], + removed: ["rma:recordRejectionDetails"] + }, + successCallback: + { + fn: function DLTB_onRejectedRecordClose_confirm_success() + { + YAHOO.Bubbling.fire("metadataRefresh"); + }, + scope: this + }, + failureCallback: + { + fn: function DLTB_onRejectedRecordClose_confirm_failure(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.Ajax.sanitizeMarkup(response.serverResponse.responseText) + }); + } + } + }); + + this.destroy(); + } + }, + { + text: buttonNo, + handler: function DLTB_onRejectedRecordClose_confirm_no() + { + this.destroy(); + }, + isDefault: true + }] + }); + }; + + onChildClassificationCompleteClose = function RM_onChildClassificationCompleteClose(nodeRef, title, text, buttonYes, buttonNo) { + Alfresco.util.PopupManager.displayPrompt( + { + title: title, + text: text, + buttons: [ + { + text: buttonYes, + handler: function DLTB_onChildClassificationCompleteClose_confirm_yes() { + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + 'api/node/' + nodeRef.replace(":/", "") + '/childclassificationcompleteddismiss', + dataObj: {}, + successCallback: + { + fn: function DLTB_onChildClassificationCompleteClose_confirm_success() { + YAHOO.Bubbling.fire("metadataRefresh"); + }, + scope: this + }, + failureCallback: + { + fn: function DLTB_onChildClassificationCompleteClose_confirm_failure(response) { + Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.Ajax.sanitizeMarkup(response.serverResponse.responseText) + }); + } + } + }); + + this.destroy(); + } + }, + { + text: buttonNo, + handler: function DLTB_onChildClassificationCompleteClose_confirm_no() { + this.destroy(); + }, + isDefault: true + }] + }); + }; + + YAHOO.Bubbling.fire("registerRenderer", + { + propertyName: "RM_rejectedRecordInfo", + renderer: function RM_rejectedRecordInfo_renderer(record, label) + { + var funcArgs = "\"", + properties = record.node.properties; + funcArgs += record.nodeRef; + funcArgs += "\",\""; + funcArgs += record.displayName; + funcArgs += "\",\""; + funcArgs += encodeURI(properties["rma:recordRejectionReason"]); + funcArgs += "\",\""; + funcArgs += properties["rma:recordRejectionUserId"]; + funcArgs += "\",\""; + funcArgs += Alfresco.util.formatDate(properties["rma:recordRejectionDate"].iso8601); + funcArgs += "\""; + + return ' '; + } + }); + + YAHOO.Bubbling.fire("registerRenderer", + { + propertyName: "RM_rejectedRecordClose", + renderer: function RM_rejectedRecordClose_renderer(record, label) + { + var funcArgs = "\""; + funcArgs += record.nodeRef; + funcArgs += "\",\""; + funcArgs += this.msg("message.confirm.close-rejected-record.title"); + funcArgs += "\",\""; + funcArgs += this.msg("message.confirm.close-rejected-record"); + funcArgs += "\",\""; + funcArgs += this.msg("button.yes"); + funcArgs += "\",\""; + funcArgs += this.msg("button.no"); + funcArgs += "\""; + + return ' '; + } + }); + + YAHOO.Bubbling.fire("registerRenderer", + { + propertyName: "RM_childClassificationCompleteClose", + renderer: function RM_childClassificationCompleteClose_renderer(record, label) { + var funcArgs = "\""; + funcArgs += record.nodeRef; + funcArgs += "\",\""; + funcArgs += this.msg("message.confirm.close-child-classification-complete.title"); + funcArgs += "\",\""; + funcArgs += this.msg("message.confirm.close-child-classification-complete"); + funcArgs += "\",\""; + funcArgs += this.msg("button.yes"); + funcArgs += "\",\""; + funcArgs += this.msg("button.no"); + funcArgs += "\""; + + return ' '; + } + }); + + /** + * Create a bridge between an Aikau data-update event and a YAHOO meta-data-refresh event. + */ + require(["rm/services/AlfRmActionBridge"], function (Bridge) + { + var bridge = new Bridge(); + bridge.alfSubscribe("ALF_DOCLIST_RELOAD_DATA", function() + { + // Are we on a Document List page (Collab site or RM File Plan)? + if (Alfresco.util.ComponentManager.findFirst("Alfresco.DocumentList")) + { + // If we are, trigger a data refresh to update: + YAHOO.Bubbling.fire("metadataRefresh"); + } + else + { + // otherwise reload the page to update: + window.location.reload(true); + } + }); + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/components/images/header/rm-management.png b/amps/ags/rm-community/rm-community-share/source/web/components/images/header/rm-management.png new file mode 100644 index 0000000000..b29f79f637 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/components/images/header/rm-management.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/components/images/page-rmsearch-64.png b/amps/ags/rm-community/rm-community-share/source/web/components/images/page-rmsearch-64.png new file mode 100644 index 0000000000..5f6ed90829 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/components/images/page-rmsearch-64.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/AlfRmRecordPickerControl.js b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/AlfRmRecordPickerControl.js new file mode 100644 index 0000000000..1be82ccd2b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/AlfRmRecordPickerControl.js @@ -0,0 +1,305 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * The Record Picker for the relationship list. + * + * @module rm/forms/controls/AlfRmRecordPickerControl + * @extends alfresco/forms/controls/BaseFormControl + * @mixes alfresco/core/CoreWidgetProcessing + * + * @todo Refactor this to make it a more generic record picker (remove relationship specific stuff) + * @todo JSDoc + * + */ + +define(["dojo/_base/declare", + "dojo/_base/lang", + "dojo/dom", + "dojo/dom-construct", + "alfresco/core/CoreWidgetProcessing", + "alfresco/forms/controls/BaseFormControl"], + function(declare, lang, dom, domConstruct, CoreWidgetProcessing, BaseFormControl) { + + return declare([CoreWidgetProcessing, BaseFormControl], { + + /** + * + * NodeRef for root picker node + * + * @instance + * @type {string} + * @default null + */ + pickerRootNode: null, + + /** + * Node selected + * + * @instance + * @type {nodeObject} + * @default null + */ + selectedItem: null, + + /** + * The name of the site to pass to the view + * + * @instance + * @type {string} + * @default null + */ + site: null, + + /** + * + * @instance + * @type {object[]} + * @default [{i18nFile: "./i18n/AlfRmRecordPickerControl.properties"}] + */ + i18nRequirements: [{i18nFile: "./i18n/AlfRmRecordPickerControl.properties"}], + + /** + * The number of children to be shown. + * + * @instance + * @type {number} + * @default + */ + currentPageSize: 100, + + /** + * + * @param args + * + * @listens ALF_RECORD_SELECTED + * @listens ALF_RECORD_REMOVED + */ + constructor: function alfresco_forms_controls_AlfRmRecordPickerControl__constructor(args) { + declare.safeMixin(this, args); + + this.alfSubscribe("ALF_RECORD_SELECTED", lang.hitch(this, this.onRecordSelected), true); + this.alfSubscribe("ALF_RECORD_REMOVED", lang.hitch(this, this.onRecordRemoved), true); + }, + + getWidgetConfig: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__getWidgetConfig() { + return { + id : this.generateUuid(), + name: this.name, + value: this.value + }; + }, + + /** + * + * @param config + * @param domNode + * @returns {*} + * + * @fires ALF_ADD_PICKER + * @fires ALF_RECORD_SELECTED + * @fires + */ + createFormControl: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__createFormControl(config, domNode) { + + this.itemSelectionPubSubScope = this.generateUuid(); + + this.lastValue = null; + + var widgetsForControl = [{ + name: "alfresco/buttons/AlfButton", + config: { + additionalCssClasses: "rm-relationship-select-record-button", + label: this.message("label.button.select-record"), + publishTopic: "ALF_CREATE_DIALOG_REQUEST", + publishPayload: { + dialogTitle: "picker.select.records.title", + handleOverflow: false, + widgetsContent: [{ + name: "alfresco/layout/VerticalWidgets", + config: { + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_CONTAINER", + additionalCssClasses: "rm-relationship-select-record-dialog-container", + widgets: [{ + name: "alfresco/buttons/AlfButton", + config: { + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_UP_BUTTON", + additionalCssClasses: "rm-relationship-select-record-dialog-up-button", + publishTopic: this.itemSelectionPubSubScope + "ALF_DOCLIST_PARENT_NAV", + showLabel: false, + iconClass: "alf-folder-up-icon", + disableOnInvalidControls: true + } + },{ + name: "alfresco/pickers/Picker", + config: { + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_CONTENT", + pubSubScope: this.itemSelectionPubSubScope, + pickedItemsLabel: "picker.pickedRecords.label", + subPickersLabel: "", + widgetsForPickedItems: [{ + name: "alfresco/pickers/PickedItems", + assignTo: "pickedItemsWidget", + config: { + // "PickedItems" does not extend "ProcessWidgets" so it's not possible to use "additionalCssClasses" hence we use an id for the css selector + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_PICKED_ITEM_CONTENT", + singleItemMode: true + } + }], + widgetsForRootPicker: [{ + name: "alfresco/menus/AlfVerticalMenuBar", + config: { + visibilityConfig: { + initialValue: false + }, + widgets: [{ + name: "alfresco/menus/AlfMenuBarItem", + config: { + publishTopic: "ALF_ADD_PICKER", + publishOnRender: true, + publishPayload: { + currentPickerDepth: 1, + picker: [{ + name: "alfresco/pickers/DocumentListPicker", + config: { + // "DocumentListPicker" does not extend "ProcessWidgets" so it's not possible to use "additionalCssClasses" hence we use an id for the css selector + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_DOCUMENT_LIST_CONTENT", + nodeRef: this.pickerRootNode, + currentPageSize: this.currentPageSize + } + }] + } + } + }] + } + }] + } + }] + } + }], + widgetsButtons: [{ + name: "alfresco/buttons/AlfButton", + config: { + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_OK_BUTTON", + label: "picker.ok.label", + publishTopic: "ALF_RECORD_SELECTED" + } + },{ + name: "alfresco/buttons/AlfButton", + config: { + id: "RM_RELATIONSHIP_SELECT_RECORD_DIALOG_CANCEL_BUTTON", + label: "picker.cancel.label", + publishTopic: "NO_OP" + } + }] + }, + publishGlobal: true + } + }]; + + return this.processWidgets(widgetsForControl, this._controlNode); + }, + + /** + * Extended this method in order to hide the validation errors for the select record button. + * In this case we don't need the errors displayed, we only need the create button disabled if we didn't selected the target record. + */ + validate: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__validate() { + this.inherited(arguments); + this.hideValidationFailure(); + }, + + /** + * + * @listens ALF_ITEMS_SELECTED + */ + setupChangeEvents: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__setupChangeEvents() { + this.alfSubscribe(this.itemSelectionPubSubScope + "ALF_ITEMS_SELECTED", lang.hitch(this, this.onItemsSelected), true); + }, + + onItemsSelected: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__onItemsSelected(payload) { + if (payload.pickedItems.length === 0) + { + this.selectedItem = null; + this.value = null; + this.lastValue = this.value; + } + if (payload.pickedItems.length === 1) + { + this.selectedItem = payload.pickedItems[0]; + this.value = lang.clone(this.selectedItem.nodeRef); + this.lastValue = this.value; + } + }, + + processValidationRules: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__processValidationRules() { + var valid = true; + if (this._required === true && (!this.value || this.value.length === 0)) + { + valid = false; + } + return valid; + }, + + getValue: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__getValue() { + return this.value; + }, + + onRecordSelected: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__onRecordSelected(payload) + { + this.onValueChangeEvent(this.name, this.lastValue, this.value); + + if (this.selectedItem) + { + if (dom.byId("alfresco_rm_forms_controls_AlfRmRecordPickerControl")) + { + domConstruct.destroy("alfresco_rm_forms_controls_AlfRmRecordPickerControl"); + } + + this.processWidgets([{ + name: "rm/lists/AlfRmRelationshipList", + config: { + additionalCssClasses: "rm-relationship-select-record-form-info-selected", + showDeleteAction: false, + site: this.site, + currentData: { + items: [this.selectedItem] + }, + waitForPageWidgets: false + } + }], domConstruct.create("div", {id: "alfresco_rm_forms_controls_AlfRmRecordPickerControl"}, this.containerNode.parentElement, "last")); + } + }, + + onRecordRemoved: function alfresco_rm_forms_controls_AlfRmRecordPickerControl__onRecordRemoved(payload) + { + domConstruct.destroy("alfresco_rm_forms_controls_AlfRmRecordPickerControl"); + this.selectedItem = null; + this.value = null; + this.onValueChangeEvent(this.name, this.lastValue, this.value); + } + }); +}); diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl.properties new file mode 100644 index 0000000000..598b9d4483 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl.properties @@ -0,0 +1,3 @@ +label.button.select-record=Select Record +picker.pickedRecords.label=Selected Records +picker.select.records.title=Select Records \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_de.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_de.properties new file mode 100644 index 0000000000..c21e3f87fb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_de.properties @@ -0,0 +1,3 @@ +label.button.select-record=Record ausw\u00e4hlen +picker.pickedRecords.label=Ausgew\u00e4hlte Records +picker.select.records.title=Records ausw\u00e4hlen diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_es.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_es.properties new file mode 100644 index 0000000000..e568e54409 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_es.properties @@ -0,0 +1,3 @@ +label.button.select-record=Seleccionar documento de archivo +picker.pickedRecords.label=Documentos de archivo seleccionados +picker.select.records.title=Seleccionar documentos de archivo diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_fr.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_fr.properties new file mode 100644 index 0000000000..20b7f092e3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_fr.properties @@ -0,0 +1,3 @@ +label.button.select-record=S\u00e9lectionner un document d'archive +picker.pickedRecords.label=Documents d'archives s\u00e9lectionn\u00e9s +picker.select.records.title=S\u00e9lectionner les documents d'archives diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_it.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_it.properties new file mode 100644 index 0000000000..94b4864531 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_it.properties @@ -0,0 +1,3 @@ +label.button.select-record=Seleziona record +picker.pickedRecords.label=Record selezionati +picker.select.records.title=Seleziona record diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_ja.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_ja.properties new file mode 100644 index 0000000000..65b5418283 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_ja.properties @@ -0,0 +1,3 @@ +label.button.select-record=\u30ec\u30b3\u30fc\u30c9\u306e\u9078\u629e +picker.pickedRecords.label=\u9078\u629e\u3057\u305f\u30ec\u30b3\u30fc\u30c9 +picker.select.records.title=\u30ec\u30b3\u30fc\u30c9\u306e\u9078\u629e diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_nb.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_nb.properties new file mode 100644 index 0000000000..a48fae2dbf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_nb.properties @@ -0,0 +1,3 @@ +label.button.select-record=Velg oppf\u00f8ring +picker.pickedRecords.label=Valgte oppf\u00f8ringer +picker.select.records.title=Velg oppf\u00f8ringer diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_nl.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_nl.properties new file mode 100644 index 0000000000..3906455916 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_nl.properties @@ -0,0 +1,3 @@ +label.button.select-record=Archiefstuk selecteren +picker.pickedRecords.label=Geselecteerde archiefstukken +picker.select.records.title=Archiefstukken selecteren diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_pt_BR.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_pt_BR.properties new file mode 100644 index 0000000000..8fe0a6334a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_pt_BR.properties @@ -0,0 +1,3 @@ +label.button.select-record=Selec. registro +picker.pickedRecords.label=Registros Selecionados +picker.select.records.title=Selec. registros diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_ru.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_ru.properties new file mode 100644 index 0000000000..abe5ec32e2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_ru.properties @@ -0,0 +1,3 @@ +label.button.select-record=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u044c +picker.pickedRecords.label=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +picker.select.records.title=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_zh_CN.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_zh_CN.properties new file mode 100644 index 0000000000..4ec8c84fdc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/forms/controls/i18n/AlfRmRecordPickerControl_zh_CN.properties @@ -0,0 +1,3 @@ +label.button.select-record=\u9009\u62e9\u8bb0\u5f55 +picker.pickedRecords.label=\u6240\u9009\u8bb0\u5f55 +picker.select.records.title=\u9009\u62e9\u8bb0\u5f55 diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/images/filetypes/record-16.png b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/images/filetypes/record-16.png new file mode 100644 index 0000000000..b29f79f637 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/images/filetypes/record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/images/filetypes/record-32.png b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/images/filetypes/record-32.png new file mode 100644 index 0000000000..56145803a1 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/images/filetypes/record-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/lists/AlfRmRelationshipList.js b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/lists/AlfRmRelationshipList.js new file mode 100644 index 0000000000..6301bc6840 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/lists/AlfRmRelationshipList.js @@ -0,0 +1,258 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +define(["dojo/_base/declare", + "dojo/dom-class", + "alfresco/lists/AlfList", + "alfresco/core/ObjectProcessingMixin", + "dojo/_base/lang"], + function(declare, domClass, AlfList, ObjectProcessingMixin, lang) { + + return declare([AlfList, ObjectProcessingMixin], { + + /** + * Extra css classes to add to the node. + * + * @instane + * @type {string} + * @default "" + */ + additionalCssClasses: "", + + /** + * placeholder var for the site name + * + * @instance + * @type {string} + * @default null + */ + site: null, + + /** + * placeholder var for the currentData + * + * @instance + * @type {object[]} + * @default null + */ + currentData: null, + + /** + * Should the actions column be shown? + * + * @instance + * @type {boolean} + * @default false + */ + showDeleteAction: false, + + /** + * Should the Relationship column be shown? + * + * @instance + * @type {boolean} + * @default false + */ + showRelationship: false, + + /** + * Instantiate the view widgets. + * + * @instance + */ + postCreate: function alfresco_rm_lists_AlfRmRelationshipList__postCreate() + { + domClass.add(this.domNode, (this.additionalCssClasses != null ? this.additionalCssClasses : "")); + + var clonedWidgets = lang.clone(this.widgets); + this.processObject(["processInstanceTokens"], clonedWidgets); + this.processWidgets(clonedWidgets); + }, + + /** + * Extends the superclass implementation for replacing placeholder vars when this function is called. + * + * FIXME: Remove this override once AKU-993 is resolved + */ + renderView: function alfresco_rm_lists_AlfRmRelationshipList__renderView() { + // Re-render the current view with the new data... + var view = this.viewMap[this._currentlySelectedView]; + if (view && !this.useInfiniteScroll) + { + if (this.useInfiniteScroll) + { + view.augmentData(this.currentData); + this.currentData = view.getData(); + view.renderView(this.useInfiniteScroll); + this.showView(view); + } + else + { + // Overridden superclass in order to fix RM-3198 issue. + // Even if the placeholder vars where replaced in + // postCreate function, when renderView was called + // the placeholders where added back from original + // widget configuration. + var index = this.viewDefinitionMap[this._currentlySelectedView]; + var clonedWidgets = [JSON.parse(JSON.stringify(this.widgets[index]))]; + this.processObject(["processInstanceTokens"], clonedWidgets); + this.processWidgets(clonedWidgets, null, "NEW_VIEW_INSTANCE"); + } + } + + // Hide any messages + this.hideLoadingMessage(); + }, + + widgets: [{ + name: "alfresco/lists/views/AlfListView", + config: { + currentData: "{currentData}", + widgets: [{ + name: "alfresco/lists/views/layouts/Row", + config: { + widgets: [{ + name: "alfresco/documentlibrary/views/layouts/Cell", + config: { + widgets: [{ + name: "alfresco/renderers/Property", + config: { + renderedValueClass: "rm-relationship-table-relationship-name", + propertyToRender: "node.relationshipLabel" + } + }] + }, + visibilityConfig: { + initialValue: "{showRelationship}" + } + }, { + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [{ + name: "alfresco/renderers/FileType", + config: { + size: "medium", + imageUrl: "rm/images/filetypes/record-{size}.png" + } + }] + } + }, { + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [{ + name: "alfresco/lists/views/layouts/Row", + config: { + widgets: [{ + name: "alfresco/renderers/PropertyLink", + config: { + renderedValueClass: "rm-relationship-table-record-name", + propertyToRender: "node.properties.cm:name", + publishGlobal: true, + publishTopic: "ALF_NAVIGATE_TO_PAGE", + useCurrentItemAsPayload: false, + publishPayloadType: "PROCESS", + publishPayloadModifiers: ["processCurrentItemTokens"], + publishPayload: { + url: "site/" + "{site}" + "/document-details?nodeRef={node.nodeRef}", + type: "SHARE_PAGE_RELATIVE" + } + } + }] + } + }, { + name: "alfresco/lists/views/layouts/Row", + config: { + widgets: [{ + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [{ + name: "alfresco/renderers/Property", + config: { + renderedValueClass: "rm-relationship-table-record-identifier", + label: "details.record.identifier", + propertyToRender: "node.properties.rma:identifier" + } + }, { + name: "alfresco/renderers/Separator", + align: "left" + }, { + name: "alfresco/renderers/Property", + config: { + renderedValueClass: "rm-relationship-table-record-version", + label: "details.version.label", + propertyToRender: "node.properties.rmv:versionLabel" + } + }] + } + }] + } + }, { + name: "alfresco/lists/views/layouts/Row", + config: { + widgets: [{ + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [{ + name: "alfresco/renderers/Property", + config: { + propertyToRender: "node.properties.cm:description" + } + }] + } + }] + } + }] + } + }, { + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [{ + name: "alfresco/renderers/PublishAction", + config: { + iconClass: "delete-16", + publishTopic: "RM_RELATIONSHIP_DELETE", + publishPayload: { + nodeRef: "{currentItem.nodeRef}", + // This gets replaced with the current Item when the payload is processed. + node: "{node}" + }, + publishPayloadType: "PROCESS", + publishPayloadModifiers: ["processCurrentItemTokens"], + publishGlobal: true, + visibilityConfig: { + initialValue: "{showDeleteAction}" + } + } + }] + } + }] + } + }] + } + }] + }); +}); diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/AlfRmActionBridge.js b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/AlfRmActionBridge.js new file mode 100644 index 0000000000..6db91addbe --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/AlfRmActionBridge.js @@ -0,0 +1,32 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +define(["dojo/_base/declare", + "alfresco/core/Core"], + function(declare, AlfCore) { + + return declare(AlfCore, {}); +}); diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/RelationshipService.js b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/RelationshipService.js new file mode 100644 index 0000000000..72c2a06b01 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/RelationshipService.js @@ -0,0 +1,254 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * This Aikau Service interacts with the relationship REST API allowing you to create and manage document relationships + * + * @module rm/service/RelationshipService + * @extends alfresco/service/crudService + * + * @author David Webster + * @since 2.4.a + * + * @event RM_RELATIONSHIP_CREATE + * @event RM_RELATIONSHIP_GET_ALL + * @event RM_RELATIONSHIP_DELETE + * @event RM_RELATIONSHIP_ADD + */ + +define(["dojo/_base/declare", + "alfresco/services/CrudService", + "service/constants/Default", + "alfresco/core/NodeUtils", + "dojo/_base/lang"], + function(declare, CrudService, AlfConstants, NodeUtils, lang) { + + return declare([CrudService], { + + /** + * Scope the message keys used in this service + * + * @instance + * @type String + * @default "org.alfresco.rm.RelationshipService" + */ + i18nScope: "org.alfresco.rm.RelationshipService", + + /** + * An array of the i18n files to use with this service. + * + * @instance + * @type {object[]} + * @default [{i18nFile: "./i18n/RelationshipService.properties"}] + */ + i18nRequirements: [{i18nFile: "./i18n/RelationshipService.properties"}], + + /** + * + * URL used to get relationships. Parse through lang.mixin for token substitution. + * + * @instance + * @type {string} + * @default + */ + relationshipAPIGet: "api/node/{nodeRefUrl}/relationships", + + /** + * URL used to delete relationships. Parse through lang.mixin for token substitution. + * + * @instance + * @type {string} + * @default + */ + relationshipAPIDelete: "api/node/{nodeRefUrl}/targetnode/{targetNodeRef}/uniqueName/{relationshipUniqueName}", + + + /** + * URL used to create relationships. Parse through lang.mixin for token substitution. + * + * @instance + * @type {string} + * @default + */ + relationshipAPICreate: "api/node/{nodeRefUrl}/customreferences", + + /** + * + * @instance + * @param {array} args Constructor arguments + * + * @listens RM_RELATIONSHIP_GET_ALL + * @listens RM_RELATIONSHIP_DELETE + */ + registerSubscriptions: function rm_services_relationshipService__registerSubscriptions(args) + { + this.alfSubscribe("RM_RELATIONSHIP_CREATE", lang.hitch(this, this.onCreate)); + this.alfSubscribe("RM_RELATIONSHIP_GET_ALL", lang.hitch(this, this.onGetAll)); + this.alfSubscribe("RM_RELATIONSHIP_DELETE", lang.hitch(this, this.onDelete)); + this.alfSubscribe("RM_RELATIONSHIP_ADD", lang.hitch(this, this.onAddRelationship)); + }, + + /** + * Create a relationship between given nodes. + * + * @param payload + */ + onCreate: function rm_services_relationshipService__onCreate(payload) { + if (!payload.nodeRef) + { + this.alfLog("error", "nodeRef required"); + } + + // Update the payload before calling the superclass method: + payload.nodeRefUrl = NodeUtils.processNodeRef(payload.nodeRef).uri; + payload = lang.mixin(payload, { + url: lang.replace(this.relationshipAPICreate, payload), + successMessage: this.message("label.add.relationship.success") + }); + + this.inherited(arguments); + }, + + + /** + * Get all relationships for given node. + * + * @param payload + */ + onGetAll: function rm_services_relationshipService__onGetAll(payload) { + + if (!payload.nodeRef) + { + this.alfLog("error", "nodeRef required"); + } + + // Update the payload before calling the superclass method: + payload.nodeRefUrl = NodeUtils.processNodeRef(payload.nodeRef).uri; + payload = lang.mixin(payload, { + url: lang.replace(this.relationshipAPIGet, payload) + }); + + this.inherited(arguments); + }, + + /** + * + * Delete the relationship for the given nodes + * + * @instance + * @param payload + */ + onDelete: function rm_services_relationshipService__onDelete(payload) { + if (!payload.nodeRef) + { + this.alfLog("error", "nodeRef required"); + } + + // Update the payload before calling the superclass method: + payload.nodeRefUrl = NodeUtils.processNodeRef(payload.nodeRef).uri; + payload = lang.mixin(payload, { + url: lang.replace(this.relationshipAPIDelete, { + nodeRefUrl: payload.nodeRefUrl, + targetNodeRef: NodeUtils.processNodeRef(payload.node.nodeRef).uri, + relationshipUniqueName: payload.node.relationshipUniqueName + }), + requiresConfirmation: true, + confirmationTitle: this.message("label.confirmation.title.delete-relationship"), + confirmationPrompt: this.message("label.confirmationPrompt.delete-relationship", payload.node.properties['cm:name']), + successMessage: this.message("label.delete-relationship.successMessage", payload.node.properties['cm:name']) + }); + + this.inherited(arguments); + }, + + /** + * Triggered by the add relationship action. Shows dialog using [DialogService] + * + * @instance + * @param payload + * + * @fires ALF_CREATE_FORM_DIALOG_REQUEST + * @fires RM_RELATIONSHIP_CREATE + * @fires ALF_GET_FORM_CONTROL_OPTIONS + */ + onAddRelationship: function rm_services_relationshipService__onAddRelationship(payload){ + var item = payload.item, + site = item.location.site.name; + + this.alfPublish("ALF_CREATE_FORM_DIALOG_REQUEST", { + dialogId: "ADD_RELATIONSHIP_DIALOG", + dialogTitle: this.message("label.title.new-relationship"), + dialogConfirmationButtonTitle: this.message("label.button.create"), + dialogCancellationButtonTitle: this.message("label.button.cancel"), + formSubmissionTopic: "RM_RELATIONSHIP_CREATE", + formSubmissionPayloadMixin: { + nodeRef: item.nodeRef + }, + widgets: [{ + name: "rm/lists/AlfRmRelationshipList", + config: { + additionalCssClasses: "rm-relationship-select-record-form-info", + site: site, + currentData: { + items: [item] + }, + currentItem: item, + waitForPageWidgets: false + } + },{ + name: "alfresco/forms/controls/Select", + config: { + additionalCssClasses: "rm-relationship-select-record-form-select", + name: "refId", + optionsConfig: { + // TODO should this be abstracted out of here? + publishTopic: "ALF_GET_FORM_CONTROL_OPTIONS", + publishPayload: { + url: AlfConstants.PROXY_URI + "api/rma/admin/relationshiplabels", + itemsAttribute: "data.relationshipLabels", + labelAttribute: "label", + valueAttribute: "uniqueName" + } + } + } + },{ + name: "rm/forms/controls/AlfRmRecordPickerControl", + config: + { + additionalCssClasses: "rm-relationship-select-record-form-control", + name: "toNode", + site: site, + pickerRootNode: item.node.rmNode.filePlan, + requirementConfig: { + initialValue: true + } + } + }] + }, true); + + } + }); + }); diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService.properties new file mode 100644 index 0000000000..d42008a1de --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=New Relationship +label.button.create=Create +label.button.cancel=Cancel +label.add.relationship.success=Successfully added relationship +label.confirmation.title.delete-relationship=Delete Relationship +label.confirmationPrompt.delete-relationship=The relationship with record '{0}' will be ended. +label.delete-relationship.successMessage=Successfully deleted '{0}' \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_de.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_de.properties new file mode 100644 index 0000000000..1ecc355d83 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_de.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Neue Beziehung +label.button.create=Erstellen +label.button.cancel=Abbrechen +label.add.relationship.success=Beziehung erfolgreich hinzugef\u00fcgt +label.confirmation.title.delete-relationship=Beziehung l\u00f6schen +label.confirmationPrompt.delete-relationship=Die Beziehung zum Record ''{0}'' wird beendet. +label.delete-relationship.successMessage=''{0}'' erfolgreich gel\u00f6scht diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_es.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_es.properties new file mode 100644 index 0000000000..f9b131f5c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_es.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Nueva relaci\u00f3n +label.button.create=Crear +label.button.cancel=Cancelar +label.add.relationship.success=Relaci\u00f3n a\u00f1adida correctamente +label.confirmation.title.delete-relationship=Eliminar relaci\u00f3n +label.confirmationPrompt.delete-relationship=La relaci\u00f3n con el documento de archivo ''{0}'' se terminar\u00e1. +label.delete-relationship.successMessage=''{0}'' eliminado correctamente diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_fr.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_fr.properties new file mode 100644 index 0000000000..e8fd475d59 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_fr.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Nouvelle relation +label.button.create=Cr\u00e9er +label.button.cancel=Annuler +label.add.relationship.success=La relation a bien \u00e9t\u00e9 ajout\u00e9e +label.confirmation.title.delete-relationship=Supprimer la relation +label.confirmationPrompt.delete-relationship=La relation avec le document d''archives ''{0}'' prendra fin. +label.delete-relationship.successMessage=''{0}'' a bien \u00e9t\u00e9 supprim\u00e9 diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_it.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_it.properties new file mode 100644 index 0000000000..7b41e41632 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_it.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Nuova relazione +label.button.create=Crea +label.button.cancel=Annulla +label.add.relationship.success=Relazione aggiunta +label.confirmation.title.delete-relationship=Elimina relazione +label.confirmationPrompt.delete-relationship=La relazione con il record ''{0}'' verr\u00e0 terminata. +label.delete-relationship.successMessage=Eliminazione di ''{0}'' riuscita diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_ja.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_ja.properties new file mode 100644 index 0000000000..7a8e8501f9 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_ja.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=\u65b0\u3057\u3044\u95a2\u4fc2 +label.button.create=\u4f5c\u6210 +label.button.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +label.add.relationship.success=\u95a2\u4fc2\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f +label.confirmation.title.delete-relationship=\u95a2\u4fc2\u306e\u524a\u9664 +label.confirmationPrompt.delete-relationship=\u30ec\u30b3\u30fc\u30c9 ''{0}'' \u3068\u306e\u95a2\u4fc2\u304c\u7d42\u4e86\u3057\u307e\u3059\u3002 +label.delete-relationship.successMessage=''{0}'' \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_nb.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_nb.properties new file mode 100644 index 0000000000..2af02bfc98 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_nb.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Nytt forhold +label.button.create=Opprett +label.button.cancel=Avbryt +label.add.relationship.success=Forholdet er n\u00e5 lagt til +label.confirmation.title.delete-relationship=Slett forhold +label.confirmationPrompt.delete-relationship=Forholdet til oppf\u00f8ringen ''{0}'' avsluttes. +label.delete-relationship.successMessage=''{0}'' er n\u00e5 slettet diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_nl.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_nl.properties new file mode 100644 index 0000000000..db3976039d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_nl.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Nieuwe relatie +label.button.create=Maken +label.button.cancel=Annuleren +label.add.relationship.success=Relatie is toegevoegd +label.confirmation.title.delete-relationship=Relatie verwijderen +label.confirmationPrompt.delete-relationship=De relatie met archiefstuk ''{0}'' wordt be\u00ebindigd. +label.delete-relationship.successMessage=''{0}'' is verwijderd diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_pt_BR.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_pt_BR.properties new file mode 100644 index 0000000000..e23b9100be --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_pt_BR.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=Novo relacionamento +label.button.create=Criar +label.button.cancel=Cancelar +label.add.relationship.success=Relacionamento acrescentado corretamente +label.confirmation.title.delete-relationship=Excluir relacionamento +label.confirmationPrompt.delete-relationship=O relacionamento com documento arquiv\u00edstico ''{0}''ser\u00e1 encerrado. +label.delete-relationship.successMessage=''{0}'' exclu\u00eddo corretamente diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_ru.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_ru.properties new file mode 100644 index 0000000000..43d12281dc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_ru.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +label.button.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c +label.button.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +label.add.relationship.success=\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e +label.confirmation.title.delete-relationship=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 +label.confirmationPrompt.delete-relationship=\u0421\u0432\u044f\u0437\u044c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e ''{0}'' \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0430. +label.delete-relationship.successMessage=\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_zh_CN.properties b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_zh_CN.properties new file mode 100644 index 0000000000..c9ff3e3bfb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/services/i18n/RelationshipService_zh_CN.properties @@ -0,0 +1,7 @@ +label.title.new-relationship=\u65b0\u5efa\u5173\u7cfb +label.button.create=\u521b\u5efa +label.button.cancel=\u53d6\u6d88 +label.add.relationship.success=\u5df2\u6210\u529f\u6dfb\u52a0\u5173\u7cfb +label.confirmation.title.delete-relationship=\u5220\u9664\u5173\u7cfb +label.confirmationPrompt.delete-relationship=\u5e26\u6709\u8bb0\u5f55 ''{0}'' \u7684\u5173\u7cfb\u5c06\u4f1a\u7ec8\u7ed3\u3002 +label.delete-relationship.successMessage=\u5df2\u6210\u529f\u5220\u9664 ''{0}'' diff --git a/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/util/RmUtils.js b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/util/RmUtils.js new file mode 100644 index 0000000000..c010898a86 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/js/alfresco/rm/util/RmUtils.js @@ -0,0 +1,98 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM Util methods + * + * @module rm/util/RmUtils + * @author David Webster + * @since 2.5.1 + */ +define(["dojo/_base/lang"], + function (lang) { + + // The private container for the functionality and properties of the util + var util = { + + /** + * Locate one object inside another object + * + * @param object {object} The haystack to search through + * @param parameters {object} The needle to find + * @returns {object} + */ + findObject: function rm_util_RmUtils__findObject(object, keyToFind, valueToFind) { + + // Store the object here if we find it. + var returnValue = null; + + if (Array.isArray(object)) + { + object.forEach(function (child, index) { + returnValue = util.findObject(child, keyToFind, valueToFind) || returnValue; + }); + } + else if (typeof object === "object") + { + // Iterate over the object keys... + Object.keys(object).forEach(function (key) { + + if (key === keyToFind && object[key] === valueToFind) + { + returnValue = object; + } + else + { + // Recurse into the object... + returnValue = util.findObject(object[key], keyToFind, valueToFind) || returnValue; + } + }); + } + + return returnValue; + } + }; + + /** + * The public API for this utility class + * + * @alias module:rm/util/util + */ + return { + + /** + * Locate one object inside another object + * + * @instance + * @function + * @param object {object} The haystack to search through + * @param parameters {object} The needle to find + * @returns {object} + */ + findObject: lang.hitch(util, util.findObject) + }; + }); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/groups.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/groups.js new file mode 100644 index 0000000000..1c0563b6eb --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/groups.js @@ -0,0 +1,197 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM ConsoleGroups tool component. + * + * Extends the existing console groups tool component + * + * @namespace Alfresco + * @class Alfresco.rm.ConsoleGroups + */ +(function() +{ + /** + * RM ConsoleGroups constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.ConsoleGroups} The new RM ConsoleGroups instance + * @constructor + */ + Alfresco.rm.ConsoleGroups = function(htmlId) + { + Alfresco.rm.ConsoleGroups.superclass.constructor.call(this, htmlId); + + var parent = this; + + this.panelHandlers.searchPanelHandler.onBuildColumnInfo = function(serverResponse, itemInfo) + { + // Create columnInfo and its header + var headerButtons = []; + if (!itemInfo || itemInfo.cssClass == 'groups-item-group') + { + headerButtons.push({ + title: (itemInfo ? parent._msg("button.newsubgroup") : parent._msg("button.newgroup")), + cssClass: "groups-newgroup-button", + click: { + fn: this.onNewGroupClick, + scope: this + } + }); + } + + if (itemInfo && itemInfo.cssClass == 'groups-item-group') + { + // Only add the following button for NON root columns + headerButtons.push({ + title: parent._msg("button.addgroup"), + cssClass: "groups-addgroup-button", + click: { + fn: this.onAddGroupClick, + scope: this + } + }); + headerButtons.push({ + title: parent._msg("button.adduser"), + cssClass: "groups-adduser-button", + click: { + fn: this.onAddUserClick, + scope: this + } + }); + } + + // Create column descriptor + var column = { + parent: itemInfo, + header: { + buttons: headerButtons + }, + body: { + items: [] + } + }; + + // Get data from request + var obj = {}; + if (serverResponse) + { + // Parse response if there was one + obj = YAHOO.lang.JSON.parse(serverResponse.responseText); + + // Translate group paging attributes to columnbrowser pagination attributes + if (obj.paging) + { + column.pagination = { + totalRecords : obj.paging.totalItems, + recordOffset: obj.paging.skipCount + }; + } + } + + var updategroupButton = + { + title: parent._msg("button.updategroup"), + cssClass: "groups-update-button", + click: { + fn: this.onUpdateClick, + scope: this + } + }; + + var deletegroupButton = + { + title: parent._msg("button.deletegroup"), + cssClass: "groups-delete-button", + click: { + fn: this.onDeleteClick, + scope: this + } + }; + + var deletegroupButtonDisabled = + { + title: parent._msg("button.deletegroup"), + cssClass: "groups-delete-button-disabled", + click: { + fn: function() + { + return false; + }, + scope: this + } + }; + + // Create item buttons for users and groups + var groupButtons = []; + groupButtons.push(updategroupButton); + groupButtons.push(deletegroupButton); + + var groupButtonsDisabled = []; + groupButtonsDisabled.push(updategroupButton); + groupButtonsDisabled.push(deletegroupButtonDisabled); + + var usersButtons = [ + { + title: parent._msg("button.removeuser"), + cssClass: "users-remove-button", + click: { + fn: this.onUserRemoveClick, + scope: this + } + } + ]; + + // Transform server respons to itemInfos and add them to the columnInfo's body + for (var i = 0; obj.data && i < obj.data.length; i++) + { + var o = obj.data[i]; + var label = o.displayName; + if (o.displayName !== o.shortName) + { + label += " (" + o.shortName + ")"; + } + var item = { + shortName: o.shortName, + fullName: o.fullName, + url: o.authorityType == 'GROUP' ? Alfresco.constants.PROXY_URI + o.url + "/children?sortBy=" + this.sortBy : null, + hasNext: o.groupCount > 0 || o.userCount > 0, + label: label, + next : null, + cssClass: o.authorityType == 'GROUP' ? "groups-item-group" : "groups-item-user", + buttons: o.authorityType == 'GROUP' ? ((Alfresco.util.arrayContains(o.zones, "APP.SHARE") || Alfresco.util.arrayContains(o.zones, "APP.RM"))? groupButtonsDisabled : groupButtons) : usersButtons + }; + column.body.items.push(item); + } + + return column; + }; + + return this; + }; + + YAHOO.extend(Alfresco.rm.ConsoleGroups, Alfresco.ConsoleGroups, {}); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-audit.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-audit.css new file mode 100644 index 0000000000..6c4dc5350e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-audit.css @@ -0,0 +1,322 @@ +.rm-audit +{ + padding: 1em; +} + +.rm-audit h2 +{ + font-size: 120%; +} + +.rm-audit-log .yui-u +{ + margin: 0; + float: none; +} + +.rm-audit-log +{ + margin-top: 1em; + position: relative; +} + +.rm-audit-log .yui-dt table +{ + width: 100%; +} + +.rm-audit-log .yui-dt caption +{ + text-align: left; + font: 100% normal Arial,sans-serif; +} + +.rm-audit-log .first +{ + text-align: right; +} + +.rm-audit-info p +{ + margin-top: 0.5em; + padding: 0; +} + +.rm-auditDT table +{ + width: 100%; +} + +.rm-audit-peoplefinder +{ + display: none; + position: absolute; + right: 0; + top: 5em; + width: 30em; + z-index: 100; +} + +.rm-audit-peoplefinder.active +{ + display: block; +} + +.rm-audit-peoplefinder .people-finder, +.rm-audit-peoplefinder .finder-wrapper +{ + margin-top: 0; +} + +.rm-audit-peoplefinder input +{ + width: auto; +} + +.personFilter +{ + display: inline; +} + +.personFilterRemove +{ + vertical-align: middle; + margin: 0 5px; + display: none; +} + +.personFilter.active .personFilterRemove +{ + display: inline; +} + +.personFilterRemove img +{ + vertical-align: middle; +} + +.rm-audit .yui-gb .yui-u +{ + text-align: left; + width: 22% +} + +.filters +{ + border: 1px solid #444444; + height: 10em; + margin-top: 1em; + z-index: 1; + position: relative; +} + +.filters .yui-u.first +{ + margin-right: 0; +} + +.filters select, +.filters input +{ + width: 77%; +} + +.filters .hd, +.filters .bd +{ + margin: 0.5em; +} + +.filter label +{ + display: block; + font-weight: bold; +} + +.filter +{ + position: relative; + height: 10em; + align: left; +} + +.rm-auditDT +{ + position: relative; + left: 0; + width: 100%; +} + +/* audit log popup page */ + +.rm-audit-popup-log .rm-audit-info +{ + margin: 1em 0; + clear: both; +} + +#audit-popup-log h1 +{ + margin: 0.5em 0; + float: left; +} + +#audit-popup-log .label +{ + margin-right: 5px; + font-weight: bold; +} + +#audit-popup-log .value +{ + margin-right: 40px; +} + +#audit-popup-log .rm-audit-info +{ + background-color: #efefef; + padding: 10px; + margin-bottom: 4px; +} + +#audit-popup-log .rm-audit-entry +{ + border: 1px solid #bbb; + margin-top: 15px; +} + +#audit-popup-log .rm-audit-entry-header +{ + background-color: #bbb; + padding: 8px; +} + +#audit-popup-log .rm-audit-entry-node +{ + padding: 10px; +} + +#audit-popup-log .changed-values-table +{ + margin-left: 6px; + margin-bottom: 2px; + width: 99%; +} + +#audit-popup-log .changed-values-table th +{ + text-align: left; + background-color: #eee; + padding: 4px; +} + +#audit-popup-log .changed-values-table td +{ + width: 33%; + padding: 4px; + border-top: 1px solid #eee; +} + +.rm-audit-popup-log .rm-auditActions +{ + float: right; + margin-top: 1em; +} + +.datepicker +{ + display: none; + position: absolute; + z-index: 1000; + left: 0; +} + +.datepicker-icon +{ + vertical-align: top; + cursor: pointer; + margin-bottom: 1em; +} + +.filters .yuimenu .hd, +.filters .yuimenu .bd +{ + margin: 0; +} + +.rm-audit-details-button +{ + float: right; +} + +.rm-audit-apply-filter +{ + height: 4em; + margin-top: 0.5em; +} + +/* dialog */ + +#auditEntry +{ + width: 40em; +} + +#auditEntry div.details +{ +} + +#auditEntry .bd +{ + max-height: 25em; + overflow-y: auto; +} + +#auditEntry .bd table +{ + margin: 0.5em 1em; + width: 93%; +} + +#auditEntry .bd table th +{ + width: 6em; + font-weight: bold; +} + +#auditEntry tr.odd +{ + background-color: #EDF5FF; +} + +#auditEntry table#auditEntry-changedValues td +{ + height: 1em; +} + +.auditActions +{ + float: right; + margin-top: 10px; +} + +body { font-family: arial,verdana; font-size: 81%; color: #333; } +.label { margin-right: 5px; font-weight: bold; } +.value { margin-right: 40px; } +.audit-info { background-color: #efefef; padding: 10px; margin-bottom: 4px; } +.audit-entry { border: 1px solid #bbb; margin-top: 15px; } +.audit-entry-header { background-color: #bbb; padding: 8px; } +.audit-entry-node { padding: 10px; } +.changed-values-table { margin-left: 6px; margin-bottom: 2px;width: 99%; } +.changed-values-table th { text-align: left; background-color: #eee; padding: 4px; } +.changed-values-table td { width: 33%; padding: 4px; border-top: 1px solid #eee; } + +.audit-link-item a, .audit-link-item a:visited { + color: #0C79BF; + text-decoration: none; +} + +.audit-link-item a:hover { + color: #0C79BF; + text-decoration: underline; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-audit.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-audit.js new file mode 100644 index 0000000000..8fb0643bae --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-audit.js @@ -0,0 +1,1114 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Audit component + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMAudit + */ +(function () +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $formatDate = Alfresco.util.formatDate, + $fromISO8601 = Alfresco.util.fromISO8601; + + /** + * RM Audit componentconstructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.RMAudit} The new component instance + * @constructor + */ + Alfresco.rm.component.RMAudit = function RM_Audit_constructor(htmlId) + { + Alfresco.rm.component.RMAudit.superclass.constructor.call(this, "Alfresco.rm.component.RMAudit", htmlId,["button", "container", "datasource", "datatable", "paginator", "json", "calendar"]); + + YAHOO.Bubbling.on("PropertyMenuSelected", this.onPropertyMenuSelected, this); + + this.showingFilter = false; + + //search filter person + this.activePerson = ""; + + //query parameters for datasource + this.queryParams = {}; + + return this; + }; + + YAHOO.lang.augmentObject(Alfresco.rm.component.RMAudit, + { + VIEW_MODE_DEFAULT: "", + VIEW_MODE_COMPACT: "COMPACT" + }); + + YAHOO.extend(Alfresco.rm.component.RMAudit, Alfresco.component.Base, + { + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function RM_Audit_onReady() + { + this.initEvents(); + + // Create "Export" and "File As Record" buttons... + this.widgets.exportButton = Alfresco.util.createYUIButton(this, "export", this.onExportLog, + { + disabled: !Alfresco.util.arrayContains(this.options.capabilities, 'ExportAudit') + }); + this.widgets.fileRecordButton = Alfresco.util.createYUIButton(this, "file-record", this.onFileRecord, + { + disabled: !Alfresco.util.arrayContains(this.options.capabilities, 'DeclareAuditAsRecord') + }); + + // Create the logging control buttons... + this.widgets.toggleLogleButton = Alfresco.util.createYUIButton(this, "toggle", this.onToggleLog, + { + disabled: !Alfresco.util.arrayContains(this.options.capabilities, 'EnableDisableAuditByTypes') + }); + this.widgets.viewLogButton = Alfresco.util.createYUIButton(this, "view", this.onViewLog, + { + disabled: !Alfresco.util.arrayContains(this.options.capabilities, 'AccessAudit') + }); + this.widgets.clearLogButton = Alfresco.util.createYUIButton(this, "clear", this.onClearLog, + { + disabled: !Alfresco.util.arrayContains(this.options.capabilities, 'DeleteAudit') + }); + + // Create the filter buttons... + this.widgets.applyFilterButton = Alfresco.util.createYUIButton(this, "apply", this.onApplyFilters, + { + disabled: !Alfresco.util.arrayContains(this.options.capabilities, 'SelectAuditMetadata') + }); + this.widgets.specifyfilterButton = Alfresco.util.createYUIButton(this, "specifyfilter", this.onSpecifyFilterLog, + { + disabled: this.widgets.applyFilterButton ? this.widgets.applyFilterButton.get("disabled") : false + }); + + // Initialize data URI + // An audit log for node and not in console (all nodes) + if (this.options.nodeRef) + { + var nodeRef = this.options.nodeRef.split('/'); + this.dataUri = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/node/{store_type}/{store_id}/{id}/rmauditlog", { store_type: nodeRef[0], store_id: nodeRef[1], id: nodeRef[2] }); + } + else { + this.dataUri = Alfresco.constants.PROXY_URI+'api/rma/admin/rmauditlog'; + } + + this.initWidgets(); + + // Check if the filter elements should be disabled + if (this.widgets.specifyfilterButton && this.widgets.specifyfilterButton.get("disabled")) + { + Dom.get(this.id + "-entries").disabled = true; + Dom.get(this.id + "-fromDate").disabled = true; + Dom.get(this.id + "-fromDate-icon").innerHTML = ""; + Dom.get(this.id + "-toDate").disabled = true; + Dom.get(this.id + "-toDate-icon").innerHTML = ""; + } + }, + + /** + * Initialises event listening and custom events + */ + initEvents : function RM_Audit_initEvents() + { + Event.on(this.id, 'click', this.onInteractionEvent, null, this); + + // Register events + if (this.options.viewMode === Alfresco.rm.component.RMAudit.VIEW_MODE_DEFAULT) + { + this.registerEventHandler('click',[ + { + rule : 'button.audit-details', + o : { + handler: this.onShowDetails, + scope : this + } + } + ]); + } + + this.registerEventHandler('click', + [ + { + rule : 'a.personFilterRemove img', + o : { + handler:this.onRemoveFilter, + scope : this + } + } + ]); + + // Decoupled event listeners + YAHOO.Bubbling.on("personSelected", this.onPersonSelected, this); + YAHOO.Bubbling.on('PersonFilterActivated',this.onPersonFilterActivated, this); + YAHOO.Bubbling.on('PersonFilterDeactivated',this.onPersonFilterDeactivated,this); + YAHOO.Bubbling.on('AuditRecordLocationSelected', this.onAuditRecordLocationSelected, this); + + return this; + }, + + initWidgets: function RM_Audit_initWidgets() + { + var me = this; + + if (this.options.viewMode==Alfresco.rm.component.RMAudit.VIEW_MODE_DEFAULT) + { + // Initialize dates in UI + this.widgets['status-date'] = Dom.get(this.id+'-status-date'); + +// this.validAuditDates = (this.options.startDate!==""); +// if (this.validAuditDates) +// { +// if (this.options.viewMode==Alfresco.rm.component.RMAudit.VIEW_MODE_COMPACT) +// { +// Dom.get(this.id+'-from-date').innerHTML += ' ' + formatDate(fromISO8601(this.options.startDate), Alfresco.thirdparty.dateFormat.masks.fullDatetime); +// Dom.get(this.id+'-to-date').innerHTML += ' ' + formatDate(fromISO8601(this.options.stopDate), Alfresco.thirdparty.dateFormat.masks.fullDatetime); +// } +// } + + // Initialise menus + + //events menu + this.widgets['eventMenu'] = new YAHOO.widget.Button(this.id + "-events", + { + type: "menu", + menu: this.id + "-events-menu" + }); + + this.widgets['eventMenu'].on("selectedMenuItemChange", function selectedEventMenuItemChange(event) + { + var oMenuItem = event.newValue; + if (oMenuItem) + { + this.set('label', oMenuItem.cfg.getProperty('text')); + } + if (oMenuItem.value !== "ALL") + { + me.queryParams.event=oMenuItem.value; + } + else + { + delete me.queryParams.event; + } + }); + + // Initialise calendar pickers + // fromDate calendar + var theDate = new Date(); + var page = (theDate.getMonth() + 1) + "/" + theDate.getFullYear(); + var selected = (theDate.getMonth() + 1) + "/" + theDate.getDate() + "/" + theDate.getFullYear(); + this.widgets.fromCalendar = new YAHOO.widget.Calendar(null, this.id + "-fromDate-cal", { title: this.msg("message.select-from-date"), close: true }); + this.widgets.fromCalendar.cfg.setProperty("pagedate", page); + this.widgets.fromCalendar.cfg.setProperty("selected", selected); + this.widgets.fromCalendar.selectEvent.subscribe(this.onDatePickerSelection, {cal:this.widgets.fromCalendar,el:Dom.get(this.id+'-fromDate'),scope:this},true); + + Event.addListener(this.id + "-fromDate-icon", "click", function () { this.widgets.toCalendar.hide();this.widgets.fromCalendar.show(); }, this, true); + + YAHOO.util.Event.on(this.id + "-fromDate", "click", function() { + me.widgets.toCalendar.hide(); + me.widgets.fromCalendar.show(); + }); + + //toDate calendar + this.widgets.toCalendar = new YAHOO.widget.Calendar(null, this.id + "-toDate-cal", { title: this.msg("message.select-to-date"), close: true }); + this.widgets.toCalendar.cfg.setProperty("pagedate", page); + this.widgets.toCalendar.cfg.setProperty("selected", selected); + this.widgets.toCalendar.selectEvent.subscribe(this.onDatePickerSelection, {cal:this.widgets.toCalendar,el:Dom.get(this.id+'-toDate'),scope:this}, true ); + + Event.addListener(this.id + "-toDate-icon", "click", function () { this.widgets.fromCalendar.hide();this.widgets.toCalendar.show(); }, this, true); + + YAHOO.util.Event.on(this.id + "-toDate", "click", function() { + me.widgets.fromCalendar.hide(); + me.widgets.toCalendar.show(); + }); + + // render the calendar control + this.widgets.fromCalendar.render(); + this.widgets.toCalendar.render(); + + YAHOO.util.Event.on(this.id + "-entries", "keyup", function() { + var field = Dom.get(this.id); + me.widgets.applyFilterButton.set("disabled", isNaN(field.value)); + }); + + this.toggleUI(); + + //Sets up datatable and datasource. + var DS = this.widgets['auditDataSource'] = new YAHOO.util.DataSource(this.dataUri, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + responseSchema: + { + resultsList:'data.entries', + metaFields: + { + "enabled": "data.enabled", + "stopDate": "data.stopped", + "startDate": "data.started" + } + } + }); + + DS.doBeforeCallback = function ( oRequest , oFullResponse , oParsedResponse , oCallback ) + { + me.options.results = oFullResponse.data.entries; + + // Enable/disable export and file record buttons + if (me.options.results.length===0) + { + me.widgets.exportButton.set('disabled',true); + me.widgets.fileRecordButton.set('disabled',true); + } + else + { + me.widgets.exportButton.set('disabled',false); + me.widgets.fileRecordButton.set('disabled',false); + } + return oParsedResponse; + }; + + //date cell formatter + var renderCellDate = function RecordsResults_renderCellDate(elCell, oRecord, oColumn, oData) + { + if (oData) + { + elCell.innerHTML = $formatDate($fromISO8601(oData)); + } + }; + + var renderCellSafeHTML = function RecordsResults_renderCellSafeHTML(elCell, oRecord, oColumn, oData) + { + if (oData) + { + elCell.innerHTML = $html(oData); + } + }; + + // Add the custom formatter to the shortcuts + YAHOO.widget.DataTable.Formatter.eventCellFormatter = function eventCellFormatter(elLiner, oRecord, oColumn, oData) + { + var oRecordData = oRecord._oData; + if (oRecordData.createPerson === true) + { + if(oRecordData.nodeName != "") + { + elLiner.innerHTML = oRecordData.event + ' - ' + $html(oRecordData.nodeName) + ''; + } + else + { + elLiner.innerHTML = oRecordData.event + '   '; + } + } + else + { + if (oRecordData.noAvailableLink === true) + { + elLiner.innerHTML = oRecordData.event + ' - ' + $html(oRecordData.nodeName) + '   '; + } + else + { + if (oRecordData.nodeName != "") + { + if (oRecordData.nodeName != "documentLibrary") + { + var linkPath = me.getNodeDetailsLink(oRecordData); + elLiner.innerHTML = oRecordData.event + ' - ' + $html(oRecordData.nodeName) + '   '; + } + else + { + elLiner.innerHTML = oRecordData.event + '   '; + } + } + else + { + elLiner.innerHTML = oRecordData.event + '   '; + } + } + } + + //add details button + var but = new YAHOO.widget.Button( + { + label:me.msg('label.button-details'), + //use an id that easily references the results using an array index. + id:'log-' + me.recCount++, + container:elLiner + }); + //need this for display + but.addClass('audit-details-button'); + //and this for event handling1 + but._button.className = 'audit-details'; + }; + + this.widgets['auditDataTable'] = new YAHOO.widget.DataTable(this.id+"-auditDT", + [ + {key:"timestamp", label:this.msg('label.timestamp'), formatter: renderCellDate, sortable:true, resizeable:true}, + {key:"fullName", label:this.msg('label.user'), formatter: renderCellSafeHTML, sortable:true, resizeable:true}, + {key:"userRole", label:this.msg('label.role'), formatter: renderCellSafeHTML, sortable:true, resizeable:true}, + {key:"event", label:this.msg('label.event'), formatter:"eventCellFormatter", sortable:true, resizeable:true} + ], + DS, + { + caption:this.msg('label.pagination','0'), + MSG_EMPTY: this.msg('message.empty'), + initialLoad : false + } + ); + + //we use our own internal counter as oRecord._nCount (from within eventcellformatter) + //accumulates for all requests, not just the current request which is what we need. + this.widgets['auditDataTable'].doBeforeLoadData = function doBeforeLoadData(sRequest , oResponse , oPayload) + { + // reset + me.recCount = 0; + return true; + }; + //subscribe to event so we can update UI + this.widgets['auditDataSource'].subscribe('responseParseEvent', this.updateUI, this, true); + + // Load the People Finder component from the server + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/people-finder", + dataObj: + { + htmlid: this.id + "-peoplefinder" + }, + successCallback: + { + fn: this.onPeopleFinderLoaded, + scope: this + }, + failureMessage: this.msg('message.load-peopleFinder-failure'), + execScripts: true + }); + } + }, + + /** + * Updates the UI to show status of UI and start/stop buttons + */ + toggleUI: function toggleUI() + { + //get started/stopped (status) time + //var statusDate = (this.options.enabled) ? this.options.startDate : this.options.stopDate; + //var statusMessage = (this.options.enabled) ? 'label.started-at' : 'label.stopped-at'; + //this.widgets['status-date'].innerHTML = this.msg(statusMessage,formatDate(fromISO8601(statusDate), Alfresco.thirdparty.dateFormat.masks.fullDatetime)); + + //update start/stop button + if (this.options.viewMode==Alfresco.rm.component.RMAudit.VIEW_MODE_DEFAULT) + { + if (this.widgets['toggleLogleButton']) + { + //if (YAHOO.lang.isUndefined(this.options.enabled) == false) + //{ + this.widgets['toggleLogleButton'].set('value',this.options.enabled); + this.widgets['toggleLogleButton'].set('label',(this.options.enabled)? this.msg('label.button-stop') : this.msg('label.button-start')); + //} + } + } + }, + + /** + * Handler for start/stop log button + */ + onToggleLog: function onToggleLog() + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: (this.options.enabled) ? this.msg('label.stop-log-title') : this.msg('label.start-log-title'), + text: (this.options.enabled) ? this.msg('label.stop-log-confirmation') : this.msg('label.start-log-confirmation'), + buttons: [ + { + text: this.msg('label.yes'), + handler: function() + { + me._toggleLog(); + this.destroy(); + }, + isDefault: false + }, + { + text: this.msg('label.no'), + handler: function() + { + this.destroy(); + }, + isDefault: false + } + ] + }); + }, + + /** + * Handler for clear log button. + */ + onClearLog: function RM_Audit_onClearLog() + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg('label.clear-log-title'), + text: this.msg('label.clear-log-confirmation'), + buttons: [ + { + text: this.msg('label.yes'), // To early to localize at this time, do it when called instead + handler: function() + { + me._clearLog(); + this.destroy(); + }, + isDefault: false + }, + { + text: this.msg('label.no'), // To early to localize at this time, do it when called instead + handler: function() + { + this.destroy(); + }, + isDefault: false + } + ] + }); + }, + + /** + * Handler for view log button. Displays log in new window + */ + onViewLog: function RM_Audit_onViewLog() + { + var openAuditLogWindow = function openAuditLogWindow() + { + return window.open(Alfresco.constants.URL_PAGECONTEXT + 'site/' + this.options.siteId + '/rm-audit', 'Audit_Log', 'resizable=yes,location=no,menubar=no,scrollbars=yes,status=yes,width=1024,height=768'); + }; + // haven't yet opened window yet + if (!this.fullLogWindowReference) + { + this.fullLogWindowReference = openAuditLogWindow.call(this); + } + else + { + // window has been opened already and is still open, so focus and reload it. + if (!this.fullLogWindowReference.closed) + { + this.fullLogWindowReference.focus(); + this.fullLogWindowReference.location.reload(); + } + //had been closed so reopen window + else + { + this.fullLogWindowReference = openAuditLogWindow.call(this); + } + } + }, + + /** + * Handler for export log button. Exports log + */ + onExportLog: function RM_Audit_onExportLog() + { + var exportUri = this.dataUri + this._buildQuery(); + //we can't add 'export' to this.queryParams (for buildQuery to generate query) + //since export is a reserved word. So we add it manually. + exportUri += (exportUri.indexOf('?')==-1) ? '?export=true&format=html' : '&export=true&format=html'; + window.location.href = exportUri; + }, + + /** + * Handler for file as record log button. Files log as record + */ + onFileRecord: function RM_Audit_onFileRecord() + { + //show location dialog + if (!this.modules.selectAuditRecordLocation) + { + this.modules.selectAuditRecordLocation = new Alfresco.rm.module.SelectAuditRecordLocation(this.id + "-copyMoveLinkTo"); + Alfresco.util.addMessages(Alfresco.messages.scope[this.name], "Alfresco.rm.module.SelectAuditRecordLocation"); + } + + this.modules.selectAuditRecordLocation.setOptions( + { + siteId: this.options.siteId, + containerId: this.options.containerId, + path: '', + files: {} + }).showDialog(); + }, + + onAuditRecordLocationSelected : function RM_Audit_AuditRecordLocationSelected(e, args) + { + var me = this; + var dataObj = { + destination: args[1].nodeRef, + user: this.queryParams.user, + size: this.queryParams.size, + event: this.queryParams.event, + from: this.queryParams.from, + to: this.queryParams.to, + property: this.queryParams.property + }; + + if (this.activePerson) + { + dataObj.user = this.activePerson.userName; + } + + var theUrl = this.dataUri + this._buildQuery(); + + Alfresco.util.Ajax.jsonPost( + { + url: theUrl, + dataObj : dataObj, + successCallback: + { + fn: function RM_Audit_FileRecord_success(serverResponse) + { + // apply current property values to form + if (serverResponse.json) + { + var data = serverResponse.json; + + if (data.success) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg('label.file-record'), + text: this.msg("label.filed-log-message"), + noEscape: true, + buttons: [ + { + text: this.msg('button.view-record'), + handler: function viewRecordHandler() + { + window.location.href = Alfresco.constants.URL_PAGECONTEXT+'site/' + me.options.siteId + '/document-details?nodeRef=' + data.record; + } + }, + { + text: this.msg('button.ok'), + handler: function() + { + this.destroy(); + }, + isDefault: true + } + ] + }); + } + else + { + Alfresco.util.PopupManager.displayPrompt( + { + title: me.msg('label.file-record'), + text: data.message, + buttons: [ + { + text: me.msg('button.ok'), + handler: function() + { + this.destroy(); + }, + isDefault: false + }] + }); + } + } + }, + scope: this + }, + failureCallback: { + fn: function fail_file_record(o) + { + if (o.serverResponse.status==400) + { + + Alfresco.util.PopupManager.displayPrompt( + { + title: me.msg('label.file-record'), + text: o.serverResponse.statusText, + buttons: [ + { + text: me.msg('button.ok'), + handler: function() + { + this.destroy(); + }, + isDefault: false + } + ] + }); + } + } + } + }); + }, + + /** + * Handles the date being changed in the date picker YUI control. + * + * @method onDatePickerSelection + * @param type + * @param args + * @param obj + * @private + */ + onDatePickerSelection: function RM_Audit_onDatePickerSelection(type, args, obj) + { + // update the date field - contains an array of [year, month, day] + var selected = args[0][0]; + obj.cal.hide(); + // convert to query date format and insert + var date = YAHOO.lang.substitute("{year}-{month}-{day}", + { + year: selected[0], + month: Alfresco.util.pad(selected[1], 2), + day: Alfresco.util.pad(selected[2], 2) + }); + obj.el.value = date; + }, + + /** + * Handler for specify button. Shows the fields in order for user to + * filter results. Needs to be replaced by people picker + * + */ + onSpecifyFilterLog: function RM_Audit_onSpecifyFilterLog() + { + if (!this.showingFilter) + { + Dom.addClass(this.widgets['people-finder'], 'active'); + this.modules.peopleFinder.clearResults(); + this.widgets.specifyfilterButton.set('label',Alfresco.util.message('label.button-cancel', 'Alfresco.rm.component.RMAudit')); + this.showingFilter = true; + } + else + { + Dom.removeClass(this.widgets['people-finder'], 'active'); + this.widgets.specifyfilterButton.set('label',this.msg('label.button-specify')); + this.showingFilter = false; + } + }, + + /** + * Handler for when a person is selected + */ + onPersonSelected: function RM_Audit_onPersonSelected(e, args) + { + Dom.addClass(Sel.query('.personFilter',this.id)[0], 'active'); + var person = args[1]; + this._changeFilterText($html(person.firstName + ' ' + person.lastName)); + this.widgets.specifyfilterButton.set('label',this.msg('label.button-specify')); + Dom.removeClass(this.widgets['people-finder'],'active'); + this.showingFilter = false; + YAHOO.Bubbling.fire('PersonFilterActivated',{person:person}); + }, + + /** + * Changes the text displayed to show how the audit log is being filtered + * + * @param {text} String object Text to update UI with. If empty string, UI is updated with default label + */ + _changeFilterText: function(text) + { + var el = Sel.query('.personFilter span',this.id)[0]; + el.innerHTML = (text !== "") ? text : this.msg('label.default-filter'); + }, + + /** + * Handler for when people finder has finished loading + * + * @param {text} String object HTML template response from people-finder call + */ + onPeopleFinderLoaded: function RM_Audit_onPeopleFinderLoaded(response) + { + // Inject the component from the XHR request into it's placeholder DIV element + var finderDiv = Dom.get(this.id + "-peoplefinder"); + this.widgets['people-finder'] = finderDiv; + finderDiv.innerHTML = response.serverResponse.responseText; + // Find the People Finder by container ID + this.modules.peopleFinder = Alfresco.util.ComponentManager.get(this.id + "-peoplefinder"); + // Set the correct options for our use + this.modules.peopleFinder.setOptions( + { + viewMode: Alfresco.PeopleFinder.VIEW_MODE_COMPACT, + singleSelectMode: true + }); + }, + + /** + * Remove filter handler + * + * Removes filtered user's name from UI + * + * @param {e} Event + * @param {args} Object Event arguments + */ + onRemoveFilter: function RM_Audit_RemoveFilter(e, args) + { + Dom.removeClass(Sel.query('.personFilter',this.id)[0], 'active'); + this._changeFilterText(''); + YAHOO.Bubbling.fire('PersonFilterDeactivated',{person:null}); + }, + + /** + * Clears logs via ajax call and gives user feedback + * + */ + _clearLog: function RM_Audit_clearLog() + { + var me = this; + Alfresco.util.PopupManager.displayMessage({ + text: this.msg('label.clearing-log-message'), + spanClass: 'message', + modal: true, + noEscape: true, + displayTime: 1 + }); + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmauditlog", + successCallback: + { + fn: function(serverResponse) + { + // apply current property values to form + if (serverResponse.json) + { + var data = serverResponse.json.data; + this.options.enabled = data.enabled; + Alfresco.util.PopupManager.displayMessage({ + text: this.msg('label.cleared-log-message'), + spanClass: 'message', + modal: true, + noEscape: true, + displayTime: 1 + }); + this._query(); + } + }, + scope: this + }, + failureMessage: me.msg("message.clear-log-fail") + }); + }, + + /** + * toggles logs via ajax call and gives user feedback + */ + _toggleLog: function RM_Audit_toggleLog() + { + var me = this; + Alfresco.util.PopupManager.displayMessage({ + text: (this.options.enabled) ? this.msg('label.stopping-log-message'): this.msg('label.starting-log-message'), + spanClass: 'message', + modal: true, + noEscape: true, + displayTime: 1 + }); + + Alfresco.util.Ajax.jsonPut( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmauditlog", + dataObj: + { + enabled:!this.options.enabled + }, + successCallback: + { + fn: function(serverResponse) + { + // apply current property values to form + if (serverResponse.json) + { + var data = serverResponse.json.data; + this.options.enabled = data.enabled; + me.toggleUI(); + Alfresco.util.PopupManager.displayMessage({ + text: (this.options.enabled) ? this.msg('label.started-log-message'): this.msg('label.stopped-log-message'), + spanClass: 'message', + modal: true, + noEscape: true, + displayTime: 1 + }); + } + }, + scope: this + }, + failureMessage: me.msg((this.options.enabled) ? "message.stop-log-fail" : "message.start-log-fail") + }); + + }, + + onPersonFilterActivated: function RM_Audit_personFilterActivated(e,args) + { + this.activePerson = args[1].person; + this.queryParams.user = this.activePerson.userName; + }, + + onPersonFilterDeactivated: function RM_Audit_personFilterDeactivated(e,args) + { + this.activePerson = ""; + delete this.queryParams.user; + }, + + /** + * Bubbling event handler called when a value from the property selection menu has been picked + */ + onPropertyMenuSelected: function RM_Audit_onPropertyMenuSelected(e, args) + { + var item = args[1]; + + if (item.value !== "ALL") + { + this.queryParams.property = item.value; + } + else + { + delete this.queryParams.property; + } + }, + + /** + * Displays dialog with more info about log entry + */ + onShowDetails: function RM_Audit__showDetails(e) + { + var el = Event.getTarget(e); + var data = this.widgets.auditDataTable.getRecord(el).getData(); + var me = this; + + if (!this.widgets.auditDialog) + { + // Construct the YUI Dialog that will display the message + this.widgets.auditDialog = new YAHOO.widget.Dialog("auditEntry", + { + visible: false, + close: true, + draggable: true, + modal: true, + fixedcenter:true, + zIndex: 1000 + }); + } + + var body = ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
' + this.msg('label.event') + ':' + data.event + '
' + this.msg('label.user') + ':' + $html(data.fullName) + '
' + this.msg('label.timestamp') + ':' + $formatDate($fromISO8601(data.timestamp)) + '
' + this.msg('label.role') + ':' + $html(data.userRole) + '
'; + + body+='

'; + + if (data.path) + { + var displayPath = data.path.substring(data.path.indexOf("/Sites")); + + body+=''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
' + this.msg('label.identifier') + ':' + $html(data.identifier) + '
' + this.msg('label.type') + ':' + $html(data.nodeType) + '
' + this.msg('label.location') + ':
'; + } + + if (data.changedValues.length>0) + { + var changedValuesHTML = ''; + var changedValuesHTMLTemplate = ''+ + '{name}'+ + '{previous}'+ + '{new}'+ + ''; + for (var i=0,len=data.changedValues.length;i'; + changedValuesHTML += YAHOO.lang.substitute(changedValuesHTMLTemplate, o, function(p_key, p_value, p_meta) + { + return $html(p_value); + }); + } + + body+=''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + changedValuesHTML+ + ''+ + '
'+ this.msg('label.property') +''+ this.msg('label.previous-value') +''+ this.msg('label.new-value') +'
'; + } + + body +='
'; + this.widgets.auditDialog.setHeader(this.msg('label.dialog-title',data.event)); + this.widgets.auditDialog.setBody(body); + this.widgets.auditDialog.render(document.body); + this.widgets.auditDialog.center(); + if(YAHOO.env.ua.ie==6) + { + Dom.get(Sel.query('#auditEntry .bd')[0]).style.height='25em'; + } + this.widgets.auditDialog.show(); + }, + + _buildQuery : function RM_Audit__buildQuery() + { + //default to 20 if none given + if ((this.options.viewMode==Alfresco.rm.component.RMAudit.VIEW_MODE_DEFAULT) && YAHOO.lang.isUndefined(this.queryParams.size)) + { + this.queryParams.size=20; + } + var qs = []; + for (var p in this.queryParams) + { + qs.push(p+'='+this.queryParams[p]); + } + qs = '?'+qs.join('&'); + return qs; + }, + + onApplyFilters : function RM_Audit__applyFilters() + { + var entriesValue = Dom.get(this.id+'-entries').value; + //event,property and user filters set the queryParams using their handlers so only need to manually + //check if entries or date filters are been used and if so, add to query params. + var filterMap = [{uiId:this.id+'-entries',queryId:'size'},{uiId:this.id+'-fromDate',queryId:'from'},{uiId:this.id+'-toDate',queryId:'to'}]; + for (var i=0,len = filterMap.length;i +
+ Edit Button + Delete Button +
+
+

Project Name

+

Type: Text Selection list: Regions

+
+
+ */ + var div = document.createElement("div"); + Dom.addClass(div, "theme-bg-color-2"); + Dom.addClass(div, "property-item"); + var html = '
'; + html += '

' + $html(prop.label) + '

'; + html += '' + parent._msg('label.label') + ': ' + $html(decodeURIComponent(prop.propId)) + '
'; + html += '' + parent._msg('label.type') + ': ' + $html(parent._dataTypeLabel(prop.dataType)); + // display any selection list constraint applied and if mandatory value + if (prop.constraintRefs.length !== 0) + { + html += '
' + parent._msg('label.selection-list') + ': ' + $html(prop.constraintRefs[0].title); + } + html += '
' + parent._msg('label.mandatory') + ': ' + (prop.mandatory ? parent._msg('mandatory.true') : parent._msg('mandatory.false')); + html += '

'; + div.innerHTML = html; + + // insert into the DOM for display + elPropList.appendChild(div); + + // generate buttons (NOTE: must occur after DOM insertion) + var editBtn = new YAHOO.widget.Button( + { + type: "button", + label: parent._msg("button.edit"), + name: parent.id + '-editButton-' + index, + container: editBtnContainerId, + onclick: + { + fn: this.onClickEditProperty, + obj: index, + scope: this + } + }); + this.propEditButtons[index] = editBtn; + + // TODO: Delete disabled until resolved in the repository + /*var deleteBtn = new YAHOO.widget.Button( + { + type: "button", + label: parent._msg("button.delete"), + name: parent.id + '-deleteButton-' + index, + container: deleteBtnContainerId, + onclick: + { + fn: this.onClickDeleteProperty, + obj: index, + scope: this + } + }); + this.propDeleteButtons[index] = deleteBtn;*/ + } + } + else + { + // no properties found, display message + var div = document.createElement("div"); + Dom.addClass(div, "no-property-item"); + div.innerHTML = parent._msg("message.noproperties"); + + // insert into the DOM for display + elPropList.appendChild(div); + } + Alfresco.util.Anim.fadeIn(elPropList); + + this.updateComplete = true; + }, + + /** + * Edit Property button click handler + * + * @method onClickEditProperty + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onClickEditProperty: function onClickEditProperty(e, obj) + { + // update the current property context + parent.currentProperty = parent.currentProperties[obj]; + parent.showPanel("edit"); + }, + + /** + * Delete Property button click handler + * + * @method onClickDeleteProperty + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onClickDeleteProperty: function onClickDeleteProperty(e, obj) + { + // update the current property context + parent.currentProperty = parent.currentProperties[obj]; + + Alfresco.util.PopupManager.displayPrompt( + { + title: parent._msg("message.delete.title"), + text: parent._msg("message.delete.text", parent.currentProperty.label), + buttons: [ + { + text: parent._msg("button.delete"), + handler: function onClickDeleteProperty_delete() + { + this.destroy(); + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/custompropertydefinitions/" + encodeURIComponent(parent.currentProperty.propId), + method: Alfresco.util.Ajax.DELETE, + successCallback: + { + fn: function(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: parent._msg("message.delete-success") + }); + + // refresh the view panel to display the new property + parent.showPanel("view"); + parent.updateCurrentPanel(); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + var json = Alfresco.util.parseJSON(response.serverResponse.responseText), + failureMsg = response.serverResponse.responseText; + if (json != null && json.message != null) + { + failureMsg = json.message; + } + + Alfresco.util.PopupManager.displayPrompt( + { + title: parent._msg("message.failure"), + text: parent._msg("message.delete-failure", failureMsg) + }); + }, + scope: this + } + }); + } + }, + { + text: parent._msg("button.cancel"), + handler: function onClickDeleteProperty_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * onUpdate ConsolePanel event handler + * + * @method onUpdate + */ + onUpdate: function onUpdate() + { + if (this.updateComplete) + { + this.updateComplete = false; + + // clear the list of meta-data items + var elPropList = Dom.get(parent.id + "-property-list"); + elPropList.innerHTML = ""; + + // reset widget references + this.propDeleteButtons = {}; + this.propEditButtons = {}; + + // perform ajax call to get the custom props for the object type + Alfresco.util.Ajax.request( + { + method: Alfresco.util.Ajax.GET, + url: Alfresco.constants.PROXY_URI + "api/rma/admin/custompropertydefinitions?element=" + parent.currentType, + successCallback: + { + fn: this.onCustomPropertiesLoaded, + scope: this + }, + failureCallback: + { + fn: function() + { + Alfresco.util.PopupManager.displayMessage( + { + text: parent._msg("message.getpropertiesfail") + }); + this.updateComplete = true; + }, + scope: this + } + }); + } + }, + + /** + * New Property button click handler + * + * @method onNewPropertyClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onNewPropertyClick: function onNewPropertyClick(e, obj) + { + parent.showPanel("create"); + } + }); + new ViewPanelHandler(); + + /* Create Metadata Panel Handler */ + CreatePanelHandler = function CreatePanelHandler_constructor() + { + // Initialise prototype properties + + CreatePanelHandler.superclass.constructor.call(this, "create"); + }; + + YAHOO.extend(CreatePanelHandler, Alfresco.ConsolePanelHandler, + { + createForm: null, + + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function onLoad() + { + // Buttons + parent.widgets.createpropertyButton = Alfresco.util.createYUIButton(parent, "createproperty-button", this.onClickCreateProperty); + parent.widgets.cancelcreatepropertyButton = Alfresco.util.createYUIButton(parent, "cancelcreateproperty-button", this.onClickCancelCreateProperty); + + // Form definition + var form = new Alfresco.forms.Form(parent.id + "-create-form"); + form.setSubmitElements(parent.widgets.createpropertyButton); + form.setShowSubmitStateDynamically(true); + + // Form field validation + form.addValidation(parent.id + "-create-label", Alfresco.forms.validation.mandatory, null, "keyup"); + form.addValidation(parent.id + "-create-label", Alfresco.forms.validation.nodeName, null, "keyup"); + form.addValidation(parent.id + "-create-label", Alfresco.forms.validation.regexMatch, + { + pattern: /^[a-zA-Z0-9-_.]+$/ + }, "keyup"); + + // Initialise the form + form.init(); + this.createForm = form; + + // additional events + Event.on(parent.id + "-create-type", "change", this.onCreateTypeChanged, null, this); + }, + + /** + * onBeforeShow ConsolePanel event handler + * + * @method onBeforeShow + */ + onBeforeShow: function onBeforeShow() + { + // reset form + Dom.get(parent.id + "-create-label").value = ""; + Dom.get(parent.id + "-create-type").selectedIndex = 0 + Dom.get(parent.id + "-create-use-list").checked = false; + Dom.get(parent.id + "-create-use-list").disabled = false; + Dom.get(parent.id + "-create-list").disabled = false; + Dom.get(parent.id + "-create-list").selectedIndex = 0; + Dom.get(parent.id + "-create-mandatory").checked = false; + this.createForm.updateSubmitElements(); + }, + + /** + * onShow ConsolePanel event handler + * + * @method onShow + */ + onShow: function onShow() + { + Dom.get(parent.id + "-create-label").focus(); + }, + + /** + * Create Property button click handler + * + * @method onClickCreateProperty + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onClickCreateProperty: function onClickCreateProperty(e, obj) + { + var label = encodeURIComponent(Dom.get(parent.id + "-create-label").value); + var dataType = Dom.get(parent.id + "-create-type").value; + var mandatory = Dom.get(parent.id + "-create-mandatory").checked; + var propId = label; + + var obj = + { + propId: propId, + dataType: dataType, + mandatory: mandatory, + label: label + }; + + var constraint = null; + var useConstraint = Dom.get(parent.id + "-create-use-list").checked; + if (dataType === "d:text" && useConstraint) + { + constraint = Dom.get(parent.id + "-create-list").value; + if (constraint !== null) + { + obj.constraintRef = constraint.replace("_", ":"); + } + } + + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/custompropertydefinitions?element=" + parent.currentType, + method: Alfresco.util.Ajax.POST, + dataObj: obj, + requestContentType: Alfresco.util.Ajax.JSON, + successCallback: + { + fn: function(res) + { + Alfresco.util.PopupManager.displayMessage( + { + text: parent._msg("message.create-success") + }); + + // refresh the view panel to display the new property + parent.showPanel("view"); + parent.updateCurrentPanel(); + }, + scope: this + }, + failureCallback: + { + fn: function(res) + { + var json = Alfresco.util.parseJSON(res.serverResponse.responseText), + failureMsg = res.serverResponse.responseText; + if (json != null && json.message != null) + { + failureMsg = json.message; + } + + Alfresco.util.PopupManager.displayPrompt( + { + title: parent._msg("message.failure"), + text: parent._msg("message.create-failure", failureMsg) + }); + }, + scope: this + } + }); + }, + + /** + * Cancel Create Property button click handler + * + * @method onClickCancelCreateProperty + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onClickCancelCreateProperty: function onClickCancelCreateProperty(e, obj) + { + parent.showPanel("view"); + }, + + /** + * Create Type down-drop changed event handler + * + * @method onCreateTypeChanged + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onCreateTypeChanged: function onCreateTypeChanged(e, obj) + { + var disableList = (Dom.get(parent.id + "-create-type").selectedIndex !== 0); + Dom.get(parent.id + "-create-use-list").disabled = disableList; + Dom.get(parent.id + "-create-list").disabled = disableList; + } + }); + new CreatePanelHandler(); + + /* Edit Metadata Panel Handler */ + EditPanelHandler = function EditPanelHandler_constructor() + { + // Initialise prototype properties + + EditPanelHandler.superclass.constructor.call(this, "edit"); + }; + + YAHOO.extend(EditPanelHandler, Alfresco.ConsolePanelHandler, + { + editForm: null, + + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function onLoad() + { + // Buttons + parent.widgets.savepropertyButton = Alfresco.util.createYUIButton(parent, "saveproperty-button", this.onClickSaveProperty); + parent.widgets.cancelsavepropertyButton = Alfresco.util.createYUIButton(parent, "cancelsaveproperty-button", this.onClickCancelSaveProperty); + + // Form definition + var form = new Alfresco.forms.Form(parent.id + "-edit-form"); + form.setSubmitElements(parent.widgets.savepropertyButton); + form.setShowSubmitStateDynamically(true); + + // Form field validation + form.addValidation(parent.id + "-edit-label", Alfresco.forms.validation.mandatory, null, "keyup"); + form.addValidation(parent.id + "-edit-label", Alfresco.forms.validation.nodeName, null, "keyup"); + form.addValidation(parent.id + "-edit-label", Alfresco.forms.validation.regexMatch, + { + pattern: /^[a-zA-Z0-9-_.]+$/ + }, "keyup"); + + // Initialise the form + form.init(); + this.editForm = form; + }, + + /** + * onBeforeShow ConsolePanel event handler + * + * @method onBeforeShow + */ + onBeforeShow: function onBeforeShow() + { + var prop = parent.currentProperty, + propId = $html(decodeURIComponent(prop.propId)); + + // title label + Dom.get(parent.id + "-edit-metadata-item").innerHTML = propId; + + // apply property values to form + Dom.get(parent.id + "-edit-label").value = propId; + Dom.get(parent.id + "-edit-type").innerHTML = parent._dataTypeLabel(prop.dataType); + + // apply LOV constraints if present + if (prop.dataType === "d:text") + { + if (prop.constraintRefs.length !== 0) + { + // the constraint IDs in the options list are of the form "rmc_name" not "rmc:name" + var constraintId = prop.constraintRefs[0].name.replace(":", "_"); + var listOptions = Dom.get(parent.id + "-edit-list").children; + for (var i=0, j=listOptions.length; i ss2) ? 1 : (ss1 < ss2) ? -1 : 0; + }, + + /** + * Helper to convert a repository datatype string to a label + * + * @method _dataTypeLabel + * @param datatype {string} Repository datatype e.g. "d:text" + * @return {string} I18N label for the datatype + * @private + */ + _dataTypeLabel: function RecordsMetaData__dataTypeLabel(dataType) + { + // convert datatype to readable label + var dataTypeMsgId; + switch (dataType) + { + case "d:text": + dataTypeMsgId = "label.datatype.text"; + break; + case "d:boolean": + dataTypeMsgId = "label.datatype.boolean"; + break; + case "d:date": + dataTypeMsgId = "label.datatype.date"; + break; + default: + dataTypeMsgId = "label.datatype.unknown"; + } + return this._msg(dataTypeMsgId); + }, + + /** + * Gets a custom message + * + * @method _msg + * @param messageId {string} The messageId to retrieve + * @return {string} The custom message + * @private + */ + _msg: function RecordsMetaData__msg(messageId) + { + return Alfresco.util.message.call(this, messageId, "Alfresco.rm.component.RMCustomMetadata", Array.prototype.slice.call(arguments).slice(1)); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-define-roles.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-define-roles.css new file mode 100644 index 0000000000..bdabea93fe --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-define-roles.css @@ -0,0 +1,204 @@ +#viewRoles +{ + text-align: left; + padding: 1em; +} + +#viewRoles h2 +{ + font-size: 123.1%; + margin: 0.5em 0 0.5em 0; + color: #515D6B; + float: left; + font-weight: bold; +} + +#viewRoles h3 +{ + font-size: 118%; + margin: 0.5em 0; + color: #515D6B; + font-weight: bold; + padding: 0 0 0 0.5em; +} + +#viewRoles div.capabilities-header +{ + font-size: 118%; + color: #515D6B; + font-weight: bold; + padding: 0.5em 0 0.5em 0.5em; +} + +#viewRoles span.yui-button +{ + float: right; +} + +#newRole +{ + float: right; + margin-bottom: 1em; +} + +.view-role-list +{ + clear: both; + border: 1px solid #444444; +} + +#roleContent +{ + text-align: right; + border-left: 1px solid #444444; +} + +#roleContent * +{ + text-align: left; +} + +#roleSelection .list-header +{ + margin-right: -7%; + border-bottom: 1px solid #999; +} + +#roleContent .list-header +{ + border-bottom: 1px solid #999; +} + +#roleContent ul.capabilities-list +{ + text-align: left; + margin: 0 0; + clear: both; +} + +#roleContent ul.capabilities-list li +{ + clear: both; + padding: 0.4em; +} + +#editRole, +#deleteRole +{ + margin-top: 0.333em; +} + +#roles +{ + width: 100%; +} + +#roles, +.roleCapabilities +{ + overflow: auto; + height: 24em; +} + +#roles ul +{ + margin: 0.5em; +} + +#roles a +{ + display: block; + padding: 0.333em; + text-decoration: none; + color:inherit; +} + +#manageRoles +{ + text-align: left; + padding: 1em; +} + +#manageRoles h2, +#manageRoles h3, +#manageRoles legend +{ + font-size: 118%; + margin: 0.5em 0 0; + clear: left; + color: #515D6B; + float: left; + font-weight: bold; + padding-top: 0.333em; +} + +#manageRoles h2 +{ + float: none; + font-size: 123.1%; + margin-bottom: 0.5em; +} + +#manageRoles h3 +{ + float: none; + padding-left: 0; +} + +#manageRoles fieldset +{ + width: 100%; + margin-top: -0.1em; + margin-bottom: 1em; +} + +#manageRoles label +{ + margin-left: 0.5em; +} + +#manageRoles input +{ + margin-left: 0.5em; +} + +#manageRoles #roleName +{ + display: block; +} + +#manageRoles ul.capabilities +{ + border-top: 1px solid #999999; + text-align: left; + margin: 0 0; + clear: both; +} + +#manageRoles ul.capabilities li +{ + clear: both; + padding: 0.4em; +} + +#manageRoles ul.capabilities li label +{ + display: inline; + margin: 0 0.5em; +} + +#manageRoles span.yui-button +{ + float: right; +} + +#manageRoles #submit, +#manageRoles #submitCancel +{ + float: left; +} + +#manageRoles ol li button +{ + margin: 0 0.5em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-define-roles.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-define-roles.js new file mode 100644 index 0000000000..a8dae8468a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-define-roles.js @@ -0,0 +1,830 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Admin RM Roles component + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMDefineRoles + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * RM UserRoles constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.RMDefineRoles} The new component instance + * @constructor + */ + Alfresco.rm.component.RMDefineRoles = function RMRoles_constructor(htmlId) + { + Alfresco.rm.component.RMDefineRoles.superclass.constructor.call(this, "Alfresco.rm.component.RMDefineRoles", htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.component.RMDefineRoles, Alfresco.component.Base, + { + /** + * Object representing the current user role and capabilities + * + * @property role + * @type object + */ + role: null, + + /** + * Form Object representing the new/edit role form. + * + * @property roleForm + * @type object + */ + roleForm: null, + + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function RMRoles_onReady() + { + this.initEvents(); + var buttons = Sel.query('button', this.id), + button, id; + + // Create widget button while reassigning classname to src element (since YUI removes classes). + // We need the classname so we can identify what action to take when it is interacted with (event delegation). + for (var i=0, len = buttons.length; i' + $html(role.displayLabel) + ''; + + // add and to the DOM + elRolesList.appendChild(li); + } + + // update the selected role item - may have been set in the options, else show first in the list + var roleId = null; + if (this.options.selectedRoleId) + { + roleId = this.options.selectedRoleId; + } + else if (firstRoleId !== null) + { + roleId = firstRoleId; + } + this.updateSelectedRoleUI(roleId); + }, + + /** + * Event handler for role selection + * @method onRoleSelect + * @param {e} Event object + */ + onRoleSelect: function RMViewRoles_onRoleSelect(e) + { + var el = Event.getTarget(e); + + // get the ID of the element - in the format "role-roleId" and extract the roleId value + var roleId = el.id.substring(5); + // update roleId value + window.location.hash = '#roleId=' + encodeURI(roleId); + this.updateSelectedRoleUI(roleId); + Event.stopEvent(e); + }, + + /** + * Helper to update the capabilities list UI based on selected Role ID. + * + * @method updateSelectedRoleUI + * @param {roleId} Role ID to update for, null to empty the list + */ + updateSelectedRoleUI: function RMViewRoles_updateSelectedRoleUI(roleId) + { + // update selected item background + var roleLinks = Dom.getElementsByClassName("role", "a"); + for (var r in roleLinks) + { + if (roleLinks.hasOwnProperty(r)) + { + // role link ID is in the format "role-roleId" + var roleLinkId = roleLinks[r].id, + liParent = Dom.get(roleLinkId).parentNode; + + if (roleLinkId.substring(5) === roleId) + { + // found item to selected + Dom.addClass(liParent, "selected"); + } + else + { + // deselect previously selected item + Dom.removeClass(liParent, "selected"); + } + } + } + + // clear the capabilities list + var elList = Dom.get("capabilities-list"); + elList.innerHTML = ""; + + // display the query capabilities for the selected user role if any + if (roleId) + { + var caps = this.roles[roleId].capabilities; + var capsArray = []; + for (var c in caps) + { + if (caps.hasOwnProperty(c)) + { + capsArray.push(this.msg(caps[c])); + } + } + capsArray.sort(this._sortByCapabilityName); + + for (var i = 0, length = capsArray.length; i < length; i++) + { + var li = document.createElement("li"); + li.innerHTML = capsArray[i]; + elList.appendChild(li); + } + + // update button values to the current role ID + this.widgets.editRole.set("value", roleId); + this.widgets.deleteRole.set("value", roleId); + } + + // update button state + this.widgets.editRole.set("disabled", roleId === null); + this.widgets.deleteRole.set("disabled", roleId === null || this._isSystemRole(roleId)); + }, + + /** + * Helper method to determine if the passed roleId belongs to reserved role + * @method _isReservedRole + * @param roleId The id of the role to check if it is reserved or not + */ + _isSystemRole: function RMViewRoles__isSystemRole(roleId) + { + return roleId === "ExtendedReaders" || + roleId === "ExtendedWriters" || + roleId === "Administrator"; + }, + + /** + * Event handler for new role button + * @method onNewRole + * @param {e} Event object + */ + onNewRole: function RMViewRoles_onNewRole(e) + { + window.location.assign(window.location.pathname + '?action=new'); + }, + + /** + * Event handler for edit role button + * @method onEditRole + * @param {e} Event object + */ + onEditRole: function RMViewRoles_onEditRole(e) + { + var el = Event.getTarget(e); + + // Get roleId from button value + var roleId = this.widgets[el.id.replace('-button', '')].get('value'), + url = window.location.pathname + '?action=edit&roleId=' + encodeURI(roleId); + window.location.assign(url); + }, + + /** + * Event handler for delete role button + * @method onDeleteRole + * @param {e} Event object + */ + onDeleteRole: function RMViewRoles_onDeleteRole(e) + { + var el = Event.getTarget(e), + performDelete = this.performDelete, + me = this, + roleId = this.widgets[el.id.replace('-button', '')].get("value"); + + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg('label.confirm-delete-title'), + text: this.msg('label.confirm-delete-message'), + modal: true, + close: true, + buttons: + [ + { + text: this.msg("button.ok"), + handler: function RMViewRoles_onDeleteRole_ok() + { + this.destroy(); + performDelete.call(me, roleId); + } + }, + { + text: this.msg("button.cancel"), + handler: function RMViewRoles_onDeleteRole_cancel() + { + this.destroy(); + } + } + ] + }); + }, + + /** + * Method that calls the REST API to delete role. + * + * @method performDelete + * @param {roleId} role id + */ + performDelete: function RMViewRoles_performDelete(roleId) + { + // execute ajax request to delete role + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmroles/" + encodeURI(roleId), + method: Alfresco.util.Ajax.DELETE, + responseContentType: "application/json", + successMessage: this.msg("message.delete.success"), + successCallback: + { + fn: function(res) + { + // delete the selected role id + this.options.selectedRoleId = null; + // delete the hash value + window.location.hash = '#roleId='; + // update the UI on successful delete + this.updateRolesList(); + }, + scope: this + }, + failureMessage: this.msg("message.delete.failure") + }); + }, + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Helper to Array.sort() by the 'displayLabel' field of an object. + * + * @method _sortByDisplayLabel + * @return {Number} + * @private + */ + _sortByDisplayLabel: function RMViewRoles__sortByDisplayLabel(s1, s2) + { + var ss1 = s1.displayLabel.toLowerCase(), ss2 = s2.displayLabel.toLowerCase(); + return (ss1 > ss2) ? 1 : (ss1 < ss2) ? -1 : 0; + }, + + /** + * Helper to Array.sort() by the 'capability name' field of an object. + * + * @method _sortByCapabilityName + * @return {Number} + * @private + */ + _sortByCapabilityName: function RMViewRoles__sortByCapabilityName(s1, s2) + { + var ss1 = s1.toLowerCase(), ss2 = s2.toLowerCase(); + return (ss1 > ss2) ? 1 : (ss1 < ss2) ? -1 : 0; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-email-mappings.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-email-mappings.css new file mode 100644 index 0000000000..0be8db6505 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-email-mappings.css @@ -0,0 +1,67 @@ +.rm-email-mappings +{ + margin:1em; +} + +.rm-email-mappings h2 +{ + margin:1em 0; +} + +.rm-email-mappings .rm-email-mappings-list +{ + background-color:#fff; + border:1px solid #D7D7D7; + margin-top:1em; +} + +.rm-email-mappings .rm-email-mappings-list li +{ + padding:0.5em 1em 1em; + display:block; + text-align:right; + clear:both; + border-bottom:1px dashed #D7D7D7; +} + +.rm-email-mappings .rm-email-mappings-list li p +{ + float:left; + display:inline; +} + +.rm-email-mappings .yuimenubaritemlabel, +.rm-email-mappings .yuimenuitemlabel +{ + font-size: 100%; + color: #000 !important; +} + +.rm-email-mappings .yuimenuitemlabel-selected +{ + background-color: #6CA5CE +} + +.rm-email-mappings .emailProperty-menu +{ + visibility:hidden; +} + +.rm-email-mappings .thin-button +{ + height: 1.7em !important; + min-height: 1.7em !important; +} + +#email-menu-container, +#rm-menu-container +{ + position:relative; + display:inline; +} + +#emailProperty-text, +#rmProperty-text +{ + vertical-align:bottom; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-email-mappings.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-email-mappings.js new file mode 100644 index 0000000000..3341a87a7f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-email-mappings.js @@ -0,0 +1,385 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Email Mappings component + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMEmailMappings + */ +(function RMEmailMappings() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RM EmailMappings componentconstructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.dashlet.MyDocuments} The new component instance + * @constructor + */ + Alfresco.rm.component.RMEmailMappings = function RM_EmailMappings_constructor(htmlId) + { + Alfresco.rm.component.RMEmailMappings.superclass.constructor.call(this, "Alfresco.rm.component.RMEmailMappings", htmlId, ["button", "container", "json", "menu"]); + this.currentValues = {}; + this.dataUri = Alfresco.constants.PROXY_URI + "api/rma/admin/emailmap"; + YAHOO.Bubbling.on("EmailMappingsLoaded", this.onDataLoad, this); + YAHOO.Bubbling.on("PropertyMenuSelected", this.onPropertyMenuSelected, this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.RMEmailMappings, Alfresco.component.Base, + { + /** + * Handler for delete mapping button. Removes from datamap and DOM + * + * @method onDeleteMapping + */ + onDeleteMapping: function RM_EmailMappings_onDeleteMapping(e) + { + var me = this, + li = Dom.getAncestorByTagName(Event.getTarget(e), 'li'), + fromTo = li.id.split('::'); + + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg('message.delete.mapping.title'), + text: this.msg('message.delete.mapping.text', li.textContent), + buttons: [ + { + text: this.msg('label.yes'), + handler: function() + { + Alfresco.util.Ajax.jsonRequest( + { + method: Alfresco.util.Ajax.DELETE, + url: YAHOO.lang.substitute(me.dataUri + "/{from}/{to}", + { + from: encodeURIComponent(fromTo[0]), + to: encodeURIComponent(fromTo[1]) + }), + successCallback: + { + fn: function delete_mapping(args) + { + // Clear the existing list and load the result from the request + me.widgets['list'].innerHTML = ""; + YAHOO.Bubbling.fire('EmailMappingsLoaded', + { + mappings: args.json.data + }); + + // Show a display message + Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message('message.deleted', "Alfresco.rm.component.RMEmailMappings"), + spanClass: 'message', + modal: true, + noEscape: true, + displayTime: 1 + }); + }, + scope: this + }, + failureMessage: Alfresco.util.message("message.saveFailure", "Alfresco.rm.component.RMEmailMappings") + }); + + this.destroy(); + }, + isDefault: false + }, + { + text: this.msg('label.no'), + handler: function() + { + this.destroy(); + }, + isDefault: true + } + ] + }); + }, + + /** + * Handler for add mapping button + * + * @method onAddMapping + */ + onAddMapping: function RM_EmailMappings_onAddMapping() + { + if (this.currentValues['emailProperty'] && this.currentValues['rmProperty']) + { + var oMap = + { + from: this.currentValues['emailProperty'].value, + to: this.currentValues['rmProperty'].value + }; + + var me = this; + Alfresco.util.Ajax.jsonRequest( + { + method: Alfresco.util.Ajax.POST, + url: me.dataUri, + dataObj: oMap, + successCallback: + { + fn: function add_mapping(args) + { + // Clear the existing list and load the result from the request + me.widgets['list'].innerHTML = ""; + YAHOO.Bubbling.fire('EmailMappingsLoaded', + { + mappings: args.json.data + }); + + // Show a display message + Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message('message.saveSuccess', "Alfresco.rm.component.RMEmailMappings"), + spanClass: 'message', + modal: true, + noEscape: true, + displayTime: 1 + }); + }, + scope: this + }, + failureMessage: Alfresco.util.message("message.saveFailure", "Alfresco.rm.component.RMEmailMappings") + }); + } + }, + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + */ + onReady: function RM_EmailMappings_onReady() + { + this.widgets['list'] = Sel.query('#emailMappings-list ul')[0]; + + // Map key text field + this.widgets['emailProperty-text'] = Dom.get('emailProperty-text'); + this.widgets['emailProperty-text'].value = ""; + + // Email property button + this.widgets.emailPropertyButton = Alfresco.util.createYUIButton(this, "emailProperty-button", function emailProperty(e) + { + if (!this.widgets['emailProperty-menu']) + { + // create menu + this.widgets['emailProperty-menu'] = new YAHOO.widget.Menu("emailMappings-emailProperty-menu", + { + context: ['emailProperty-text', 'tl', 'bl'], + width: '202px', + clicktohide: false + }); + + // Email property menu setup and event handler + this.widgets['emailProperty-menu'].addItems(this.options.email); + this.widgets['emailProperty-menu'].render('email-menu-container'); + this.widgets['emailProperty-menu'].subscribe('click', function (e, args) + { + var menuItem = args[1]; + var menuItemText = menuItem.cfg.getConfig().text; + + this.widgets['emailProperty-text'].value = menuItemText; + this.currentValues['emailProperty'] = + { + value: menuItemText, + label: menuItemText + }; + var rmpropertyButton = YAHOO.widget.Button.getButton(this.id + "-rmproperty-button"); + if (rmpropertyButton._configs.selectedMenuItem.value && rmpropertyButton._configs.selectedMenuItem.value.value) + { + Alfresco.util.enableYUIButton(this.widgets.addMappingButton); + } + else + { + Alfresco.util.disableYUIButton(this.widgets.addMappingButton); + } + }, this, true); + } + if (this.widgets['emailProperty-menu'].cfg.getConfig().visible) + { + this.widgets['emailProperty-menu'].hide(); + } + else + { + this.widgets['emailProperty-menu'].show(); + } + }); + + // Email property button + this.widgets.addMappingButton = Alfresco.util.createYUIButton(this, "add-mapping-button", this.onAddMapping, + { + disabled: true + }); + + this.addMappingButtonValidation(); + + this.load(); + }, + + addMappingButtonValidation: function RM_EmailMappings_addMappingButtonValidation() + { + var me = this; + var rmpropertyButton = YAHOO.widget.Button.getButton(this.id + "-rmproperty-button"); + rmpropertyButton.subscribe('selectedMenuItemChange', function (e, args) + { + if (rmpropertyButton._configs.selectedMenuItem.value.value && me.widgets['emailProperty-text'] && me.widgets['emailProperty-text'].value) + { + Alfresco.util.enableYUIButton(me.widgets.addMappingButton); + } + else + { + Alfresco.util.disableYUIButton(me.widgets.addMappingButton); + } + }); + Event.addListener(this.widgets['emailProperty-text'], "keyup", function() + { + var emProp = YAHOO.lang.trim(this.widgets['emailProperty-text'].value); + + // update current value + this.currentValues['emailProperty'] = + { + value: emProp, + label: emProp + }; + + if (rmpropertyButton._configs.selectedMenuItem.value && rmpropertyButton._configs.selectedMenuItem.value.value && emProp != "") + { + Alfresco.util.enableYUIButton(me.widgets.addMappingButton); + } + else + { + Alfresco.util.disableYUIButton(me.widgets.addMappingButton); + } + }, null, this); + }, + + /** + * Loads mapping data via AJAX + * + * @method load + */ + load: function RM_EmailMappings_load() + { + Alfresco.util.Ajax.jsonRequest( + { + method: Alfresco.util.Ajax.GET, + url: this.dataUri, + successCallback: + { + fn: function(args) + { + YAHOO.Bubbling.fire('EmailMappingsLoaded', + { + mappings: args.json.data + }); + }, + scope: this + }, + failureMessage: Alfresco.util.message("message.loadFailure", "Alfresco.rm.component.RMEmailMappings") + }); + }, + + /** + * Handler for when data mapping loads. + * + * @method onDataLoad + * @param e {object} Dom event + * @param args {object} Event parameters + */ + onDataLoad : function RM_EmailMappings_onDataLoad(e, args) + { + args[1] = args[1].mappings; + for (var i=0,len = args[1].mappings.length;i{email} {to} {rm}

", + { + email: $html(oMap.from), + to: this.msg('label.to'), + rm: $html(oMap.to) + }); + + this.widgets['list'].appendChild(newLi); + var button = new YAHOO.widget.Button( + { + id: oMap.from +'-'+ oMap.to + '-button', + label: this.msg('label.delete'), + container: newLi.id + }); + button.on('click', this.onDeleteMapping, this ,true); + button.appendTo(newLi); + }, + + /** + * Event handler called when a value from the property selection menu has been selected + * Updates currently stored values. + * + * @method onPropertyMenuSelected + * @param e {object} Dom event + * @param args {object} Event parameters + */ + onPropertyMenuSelected: function RM_EmailMappings_onPropertyMenuSelected(e, args) + { + var item = args[1]; + + // set current value from rm property selection menu + this.currentValues['rmProperty'] = + { + value: item.value, + label: item.label + }; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-events.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-events.css new file mode 100644 index 0000000000..49c7d18aae --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-events.css @@ -0,0 +1,118 @@ +.rm-events +{ + color: #000000; + margin: 16px 10px 10px; +} + +.rm-events .hidden +{ + display: none; +} + +.rm-events .buttons, +.rm-events .title +{ + margin-top: 0.5em; + line-height: 2em; +} + +.rm-events .title +{ + color: #515D6B; + font-size: 123.1%; + font-weight: bold; + padding-bottom: 0.5em; +} + +.rm-events .buttons, +.rm-events .caption +{ + text-align: right; +} + +.rm-events .rm-events-list +{ + border: 1px solid #D7D7D7; +} + +.rm-events .yui-dt table +{ + border: medium none; + width: 100%; +} + +.rm-events .yui-dt table thead +{ + display: none; +} + +.rm-events tr.yui-dt-odd +{ + background-color:#FFFFFF; +} + +.rm-events .yui-dt table .yui-dt-col-actions +{ + width: 17em; + text-align: right; +} + +.rm-events .yui-dt table td +{ + border: medium none; + border-bottom: 1px dashed #D7D7D7; +} + +.rm-events .yui-dt table .yui-dt-last td +{ + border-bottom: medium none; +} + +.rm-events .event-type-label +{ + color: #515D6B; + padding-right: 0.5em; +} + +.rm-events .edit-main +{ + border: 1px solid #D7D7D7; + margin-bottom: 1.5em; + padding-bottom: 1em; +} + +.rm-events .mandatory-indicator +{ + color: green; + margin-left: 0.4em; + margin-right: 0.4em; +} + +.rm-events .header-bar +{ + background-color: #E3EAEC; + border-bottom: 2px solid #F0F3F4; + font-size: 116%; + font-weight: bold; + height: 1.1em; + margin: 1em; + padding: 0.3em; +} + +.rm-events .field-row +{ + padding: 0.333em; + margin-left: 1em; +} + +.rm-events .crud-label +{ + line-height: 1.5em; + margin-left: 1.5em; +} + +.rm-events .crud-input +{ + margin-left: 1.5em; + margin-bottom: 0.5em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-events.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-events.js new file mode 100644 index 0000000000..b447bb49c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-events.js @@ -0,0 +1,815 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RecordsEvents tool component. + * + * RM Admin ui for creating, editing and deleting events. + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMEvents + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RecordsEvents constructor. + * + * @param {String} htmlId The HTML id ?of the parent element + * @return {Alfresco.rm.component.RMEvents} The new RecordsEvents instance + * @constructor + */ + Alfresco.rm.component.RMEvents = function(htmlId) + { + this.name = "Alfresco.rm.component.RMEvents"; + Alfresco.rm.component.RMEvents.superclass.constructor.call(this, htmlId); + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "container", "datasource", "datatable", "json", "history"], this.onComponentsLoaded, this); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("viewEvents", this.onViewEvents, this); + YAHOO.Bubbling.on("createEvent", this.onCreateEvent, this); + YAHOO.Bubbling.on("editEvent", this.onEditEvent, this); + + /* Define panel handlers */ + var parent = this; + + // NOTE: the panel registered first is considered the "default" view and is displayed first + + /* View Panel Handler */ + ViewPanelHandler = function ViewPanelHandler_constructor() + { + // Initialise prototype properties + ViewPanelHandler.superclass.constructor.call(this, "view"); + }; + + YAHOO.extend(ViewPanelHandler, Alfresco.ConsolePanelHandler, + { + /** + /** + * Remembers if the panel data has been loaded once + * + * @property initialDataLoaded + * @type boolean + */ + initialDataLoaded: false, + + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function ViewPanelHandler_onLoad() + { + // widgets + this.widgets.newEventButton = Alfresco.util.createYUIButton(this, "newevent-button", this.onNewEventClick, {}, parent.id + "-newevent-button"); + + // Setup data table + this._setupDataSource(); + this._setupDataTable(); + }, + + /** + * Setup the datasource for the data table + * + * @method _setupDataSource + * @private + */ + _setupDataSource: function ViewPanelHandler__setupDataSource() + { + // DataSource definition + var uriSearchResults = Alfresco.constants.PROXY_URI + "api/rma/admin/rmevents"; + this.widgets.dataSource = new YAHOO.util.DataSource(uriSearchResults, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "queueRequests", + responseSchema: + { + resultsList: "data" + } + }); + this.widgets.dataSource.doBeforeParseData = function RecordsEvents_doBeforeParseData(oRequest , oFullResponse) + { + if (oFullResponse && oFullResponse.data) + { + var items = oFullResponse.data; + + // Create an array instead of an object + var events = []; + for (var key in items) + { + events.push(items[key]); + } + + // Sort the events by their label + events.sort(function (event1, event2) + { + return (event1.eventDisplayLabel > event2.eventDisplayLabel) ? 1 : (event1.eventDisplayLabel < event2.eventDisplayLabel) ? -1 : 0; + }); + + // we need to wrap the array inside a JSON object so the DataTable is happy + return { + data: events + }; + } + return oFullResponse; + }; + }, + + /** + * Setup the datatable + * + * @method _setupDataTable + * @private + */ + _setupDataTable: function ViewPanelHandler__setupDataTable() + { + // Save reference for future callbacks + var me = this; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellDetails + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellDetails = function ViewPanelHandler__setupDataTable_renderCellDetails(elCell, oRecord, oColumn, oData) + { + var title = document.createElement("h4"); + title.appendChild(document.createTextNode(oRecord.getData("eventDisplayLabel"))); + elCell.appendChild(title); + + var info = document.createElement("div"); + elCell.appendChild(info); + + var typeLabel = document.createElement("span"); + Dom.addClass(typeLabel, "event-type-label"); + typeLabel.appendChild(document.createTextNode(parent.msg("label.type") + ":")); + info.appendChild(typeLabel); + + var typeValue = document.createElement("span"); + typeValue.appendChild(document.createTextNode(parent.options.eventTypes[oRecord.getData("eventType")])); + info.appendChild(typeValue); + }; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellActions = function ViewPanelHandler__setupDataTable_renderCellActions(elCell, oRecord, oColumn, oData) + { + // Edit event button + var editBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.edit") + }); + editBtn.on("click", me.onEditEventClick, oRecord, me); + + /* FIXME: Workaround to avoid problems described in RM-879 + // Delete event button + var deleteBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.delete") + }); + deleteBtn.on("click", me.onDeleteEventClick, oRecord, me); + */ + }; + + // DataTable column defintions + var columnDefinitions = + [ + { + key: "event", label: "Event", sortable: false, formatter: renderCellDetails + }, + { + key: "actions", label: "Actions", formatter: renderCellActions + } + ]; + + // DataTable definition + this.widgets.dataTable = new YAHOO.widget.DataTable(parent.id + "-events", columnDefinitions, this.widgets.dataSource, + { + renderLoopSize: 32, + initialLoad: false, + MSG_EMPTY: parent.msg("message.loadevents.loading") + }); + + // Override abstract function within DataTable to set custom error message + this.widgets.dataTable.doBeforeLoadData = function RecordsEvents_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.dataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + me._setDefaultDataTableErrors(me.widgets.dataTable); + } + } + else if (oResponse.results) + { + if (oResponse.results.length === 0) + { + me.widgets.dataTable.set("MSG_EMPTY", '' + parent.msg("message.empty") + ''); + } + me.renderLoopSize = oResponse.results.length >> (YAHOO.env.ua.gecko === 1.8) ? 3 : 5; + } + + // Must return true to have the "Searching..." message replaced by the error message + return true; + }; + }, + + /** + * Load the events + * + * @method _loadEvents + * @private + */ + _loadEvents: function ViewPanelHandler__loadEvents() + { + + // Reset the custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + // empty results table + this.widgets.dataTable.deleteRows(0, this.widgets.dataTable.getRecordSet().getLength()); + + var successHandler = function ViewPanelHandler__loadEvents_successHandler(sRequest, oResponse, oPayload) + { + // Stop list from getting refreshed when not needed + this.initialDataLoaded = true; + + // Display new data + this.widgets.dataTable.onDataReturnInitializeTable.call(this.widgets.dataTable, sRequest, oResponse, oPayload); + }; + + var failureHandler = function ViewPanelHandler__loadEvents_failureHandler(sRequest, oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(); + } + else + { + try + { + // Display error message in datatable + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.dataTable.set("MSG_ERROR", response.message); + this.widgets.dataTable.showTableMessage(response.message, YAHOO.widget.DataTable.CLASS_ERROR); + } + catch(e) + { + this._setDefaultDataTableErrors(this.widgets.dataTable); + } + } + }; + + // Make the request for the events + this.widgets.dataSource.sendRequest("", + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Resets the YUI DataTable errors to our custom messages + * + * NOTE: Scope could be YAHOO.widget.DataTable, so can't use "this" + * + * @method _setDefaultDataTableErrors + * @param dataTable {object} Instance of the DataTable + */ + _setDefaultDataTableErrors: function ViewPanelHandler__setDefaultDataTableErrors(dataTable) + { + dataTable.set("MSG_EMPTY", parent.msg("message.empty")); + dataTable.set("MSG_ERROR", parent.msg("message.error")); + }, + + /** + * Edit Eventbutton click handler + * + * @method onEditEventClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onEditEventClick: function ViewPanelHandler_onEditEventClick(e, oRecord) + { + // update the current event + YAHOO.Bubbling.fire("editEvent", + { + eventName: oRecord.getData("eventName") + }); + }, + + /** + * Delete Event button click handler. + * Displays a confirmation dialog before the deletion is made. + * + * @method onDeleteEventClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onDeleteEventClick: function ViewPanelHandler_onDeleteEventClick(e, oRecord) + { + // Display confirm delete dialog + var me = this; + var text = parent.msg("message.confirm.removeevent.text", oRecord.getData("eventDisplayLabel")); + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.confirm.removeevent.title"), + text: text, + buttons: [ + { + text: parent.msg("button.yes"), + handler: function ViewPanelHandler_onDeleteEventClick_confirmYes() + { + this.destroy(); + me._deleteEvent.call(me, oRecord); + } + }, + { + text: parent.msg("button.no"), + handler: function ViewPanelHandler_onDeleteEventClick_confirmNo() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Delete the event + * + * @mthod _deleteEvent + * @param oRecord {object} The event + */ + _deleteEvent: function ViewPanelHandler__deleteEvent(oRecord) + { + // Delete event from server + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmevents/" + oRecord.getData("eventName"), + successCallback: + { + fn: function(o) + { + // Reload the events + this._loadEvents(); + + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: parent.msg("message.removeevent.success") + }); + }, + scope: this + }, + failureMessage: parent.msg("message.removeevent.failure") + }); + }, + + /** + * onUpdate ConsolePanel event handler + * + * @method onUpdate + */ + onUpdate: function onUpdate() + { + if (!this.initialDataLoaded || parent.refresh) + { + this._loadEvents(); + } + }, + + /** + * New event button click handler + * + * @method onNewEventClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onNewEventClick: function ViewPanelHandler_onNewEventClick(e, obj) + { + // Send avenet so the create panel will be displayed + YAHOO.Bubbling.fire("createEvent", {}); + } + }); + new ViewPanelHandler(); + + /* Edit Metadata Panel Handler */ + EditPanelHandler = function EditPanelHandler_constructor() + { + // Initialise prototype properties + + EditPanelHandler.superclass.constructor.call(this, "edit"); + }; + + YAHOO.extend(EditPanelHandler, Alfresco.ConsolePanelHandler, + { + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function EditPanelHandler_onLoad() + { + // Buttons + this.widgets.saveButton = Alfresco.util.createYUIButton(parent, "save-button", null, { + type: "submit" + }); + this.widgets.cancelButton = Alfresco.util.createYUIButton(parent, "cancel-button", this.onCancelButtonClick); + + // Form definition + var form = new Alfresco.forms.Form(parent.id + "-edit-form"); + form.setSubmitElements(this.widgets.saveButton); + form.setShowSubmitStateDynamically(true); + + // Form field validation + form.addValidation(parent.id + "-eventDisplayLabel", Alfresco.forms.validation.mandatory, null, "keyup"); + + form.doBeforeFormSubmit = + { + fn: function(formEl) + { + // Disable buttons during submit + this.widgets.saveButton.set("disabled", true); + this.widgets.cancelButton.set("disabled", true); + + // Display a pengding message + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: parent.msg("message.saveevent.saving"), + spanClass: "wait", + displayTime: 0 + }); + }, + scope: this + }; + + // Submit as an ajax submit (not leave the page), in json format + form.setAJAXSubmit(true, + { + successCallback: + { + fn: function(serverResponse, obj) + { + // Hide pending dialog and enable buttons + this.widgets.feedbackMessage.destroy(); + this.widgets.saveButton.set("disabled", false); + this.widgets.cancelButton.set("disabled", false); + + // Display the events list again, and refresh data since we change it + YAHOO.Bubbling.fire('viewEvents', + { + refresh: true + }); + + }, + scope: this + }, + failureCallback: + { + fn: function(serverResponse, obj) + { + // Hide pending dialog and enable buttons + this.widgets.feedbackMessage.destroy(); + this.widgets.saveButton.set("disabled", false); + this.widgets.cancelButton.set("disabled", false); + Alfresco.util.PopupManager.displayPrompt( + { + text: serverResponse.json.message + }); + }, + scope: this + } + }); + form.setSubmitAsJSON(true); + + // Initialise the form + form.init(); + + this.widgets.editForm = form; + }, + + /** + * onBeforeShow ConsolePanel event handler + * + * @method onBeforeShow + */ + onBeforeShow: function EditPanelHandler_onBeforeShow() + { + var editFormEl = Dom.get(parent.id + "-edit-form"); + if (parent.eventName && parent.eventName != "") + { + // Existing event, prepare form + this.widgets.editForm.setAjaxSubmitMethod(Alfresco.util.Ajax.PUT); + editFormEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/rma/admin/rmevents/" + parent.eventName; + Dom.removeClass(parent.id + "-edit-title", "hidden"); + Dom.addClass(parent.id + "-create-title", "hidden"); + + // Load event data + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmevents/" + parent.eventName, + successCallback: + { + fn: function(serverResponse) + { + // Apply current event values to form + if (serverResponse.json) + { + var event = serverResponse.json.data; + Dom.get(parent.id + "-eventName").value = (event.eventName) ? event.eventName : ""; + Dom.get(parent.id + "-eventDisplayLabel").value = (event.eventDisplayLabel) ? event.eventDisplayLabel : ""; + var eventTypeEl = Dom.get(parent.id + "-eventType"); + Alfresco.util.setSelectedIndex(eventTypeEl, event.eventType); + } + }, + scope: this + }, + failureMessage: parent.msg("message.loadevent.failure") + }); + } + else + { + // New event, clear the form + this.widgets.editForm.setAjaxSubmitMethod(Alfresco.util.Ajax.POST); + editFormEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/rma/admin/rmevents"; + Dom.removeClass(parent.id + "-create-title", "hidden"); + Dom.addClass(parent.id + "-edit-title", "hidden"); + Dom.get(parent.id + "-eventName").value = ""; + Dom.get(parent.id + "-eventDisplayLabel").value = ""; + Dom.get(parent.id + "-eventType").selectedIndex = 0; + } + }, + + /** + * onShow ConsolePanel event handler + * + * @method onShow + */ + onShow: function EditPanelHandler_onShow() + { + // Set focus to label field + Dom.get(parent.id + "-eventDisplayLabel").focus(); + }, + + /** + * Cancel edit/create event button click handler + * + * @method onCancelButtonClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onCancelButtonClick: function EditPanelHandler_onCancelButtonClick(e, obj) + { + // Display the events list again, but not need to refresh the data since we canceled + YAHOO.Bubbling.fire('viewEvents', + { + refresh: false + }); + } + + }); + new EditPanelHandler(); + }; + + YAHOO.extend(Alfresco.rm.component.RMEvents, Alfresco.ConsoleTool, + { + /** + * Currently selected event + * + * @property eventName + * @type string + */ + eventName: null, + + /** + * True if the data shall be refreshed on the page + * + * @property refresh + * @type object + */ + refresh: true, + + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * EventType:s and their labels. + * The event type is the key and the event type label is the value. + * + * @property eventTypes + * @type object + */ + eventTypes: {} + }, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function RecordsEvents_onComponentsLoaded() + { + Event.onContentReady(this.id, this.onReady, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RecordsEvents_onReady() + { + // Call super-class onReady() method + Alfresco.rm.component.RMEvents.superclass.onReady.call(this); + }, + + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * View events event handler + * + * @method onViewEvents + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onViewEvents: function RecordsEvents_onViewEvents(e, args) + { + this.refreshUIState( + { + "panel": "view", + "refresh": args[1].refresh + "" + }); + }, + + /** + * Create event event handler + * + * @method onCreateEvent + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onCreateEvent: function RecordsEvents_onCreateEvent(e, args) + { + this.refreshUIState( + { + "panel": "edit", + "eventName": "" + }); + }, + + /** + * Edit event event handler + * + * @method onEditEvent + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onEditEvent: function RecordsEvents_onEditEvent(e, args) + { + this.refreshUIState( + { + "panel": "edit", + "eventName": args[1].eventName + }); + }, + + /** + * History manager state change event handler (override base class) + * + * @method onStateChanged + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onStateChanged: function RecordsEvents_onStateChanged(e, args) + { + // Clear old states + this.eventName = undefined; + this.refresh = true; + + var state = this.decodeHistoryState(args[1].state); + if (state.eventName) + { + this.eventName = state.eventName ? state.eventName : ""; + } + if (state.refresh) + { + this.refresh = state.refresh != "false"; + } + + // test if panel has actually changed? + if (state.panel) + { + this.showPanel(state.panel); + } + this.updateCurrentPanel(); + }, + + /** + * Encode state object into a packed string for use as url history value. + * Override base class. + * + * @method encodeHistoryState + * @param obj {object} state object + * @private + */ + encodeHistoryState: function RecordsEvents_encodeHistoryState(obj) + { + // wrap up current state values + var stateObj = {}; + if (this.currentPanelId !== "") + { + stateObj.panel = this.currentPanelId; + } + + // convert to encoded url history state - overwriting with any supplied values + var state = ""; + if (obj.panel || stateObj.panel) + { + state += "panel=" + encodeURIComponent(obj.panel ? obj.panel : stateObj.panel); + } + if (obj.eventName) + { + state += state.length > 0 ? "&" : ""; + state += "eventName=" + encodeURIComponent(obj.eventName); + } + if (obj.refresh) + { + state += state.length > 0 ? "&" : ""; + state += "refresh=" + encodeURIComponent(obj.refresh); + } + return state; + } + + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-list-of-values.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-list-of-values.css new file mode 100644 index 0000000000..ebeec4e7e5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-list-of-values.css @@ -0,0 +1,206 @@ +.rm-list-of-values +{ + color:#000000; + margin:16px 10px 10px; +} + +.rm-list-of-values .rm-list-of-values-list +{ + border: 1px solid #D7D7D7; +} + +.rm-list-of-values .buttons, +.rm-list-of-values .title +{ + margin-top: 0.5em; + line-height: 2em; +} + +.rm-list-of-values .title +{ + color:#515D6B; + font-size:123.1%; + font-weight:bold; + padding-bottom:0.5em; +} + +.rm-list-of-values .buttons +{ + text-align: right; +} + +.rm-list-of-values .values-list, +.rm-list-of-values .access-list +{ + height: 30em; + overflow-y: auto; + overflow-x: hidden; + clear: both; +} + +.rm-list-of-values .list-header-title +{ + padding-left: 1em; + font-weight: bold; +} + +.rm-list-of-values .list-header-input +{ + float: right; +} + +.rm-list-of-values .list-header-button +{ + float: right; + height: 1em; + line-height: 1em; + padding-top: 0.4em; + padding-left: 0.5em; + padding-right: 0.8em; +} + +.rm-list-of-values .list-header .yui-u.first +{ + text-align: left; + font-weight: bold; + line-height: 2.8em; +} + +.rm-list-of-values .list-header .yui-gf, +.rm-list-of-values .list-body .yui-u +{ + border: 1px solid #D7D7D7; + float: left; +} + +.rm-list-of-values .list-header .yui-gf.first, +.rm-list-of-values .list-body .yui-u.first +{ + border-right: none; +} + +.rm-list-of-values .list-header .yui-gf +{ + background-color: #DEE8ED; + border-bottom: none; + height: 2.8em; + line-height: 2.8em; +} + +.rm-list-of-values .yui-dt table +{ + border: medium none; + width: 100%; +} + +.rm-list-of-values .yui-dt table thead +{ + display: none; +} + +.rm-list-of-values .yui-dt-body +{ + cursor:pointer; +} + +.rm-list-of-values tr.yui-dt-odd +{ + background-color:#FFFFFF; +} + +.rm-list-of-values tr.yui-dt-selected td +{ + background-color:#dceaf4; + color: #000000; +} + +.rm-list-of-values .yui-dt-col-accessicon +{ + width: 3em; +} + +.rm-list-of-values .yui-dt table .yui-dt-col-accessicon div +{ + background-position: center center; + background-repeat: no-repeat; + margin-bottom: 0.25em; + margin-top: 0.25em; + margin-left: 1em; +} + +.rm-list-of-values .yui-dt table .yui-dt-col-accessicon div.authority-user +{ + background-image: url(../../../components/images/user-16.png); +} + +.rm-list-of-values .yui-dt table .yui-dt-col-accessicon div.authority-group +{ + background-image: url(../../../components/images/group-16.png); +} + +.rm-list-of-values .yui-dt table .yui-dt-col-actions +{ + width: 20em; + text-align: right; +} + +.rm-list-of-values .yui-dt table td +{ + border: medium none; + border-bottom: 1px dashed #D7D7D7; +} + +.rm-list-of-values .yui-dt table td.yui-dt-empty +{ + border: none; +} + +.rm-list-of-values .rm-list-of-values-list.yui-dt table .yui-dt-last td +{ + border-bottom: medium none; +} + +.rm-list-of-values .main-buttons +{ + text-align: center; +} + +.rm-list-of-values.yui-panel +{ + margin: 0; +} + +.rm-list-of-values hr +{ + width:98.5%; +} + +/* Group picker */ + +.rm-list-of-values.authority-picker +{ + width: 41em; +} + +.rm-list-of-values.authority-picker .authority-finder.list +{ + margin-bottom: 0; + margin-top: 0; + padding-bottom: 1em; + padding-top: 0.3em; +} + +.rm-list-of-values.authority-picker .authority-finder .title +{ + display: none; +} + +.rm-list-of-values.authority-picker .bd +{ + padding: 1em; +} + +.bd.rm-search-body +{ + padding: 1px !important; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-list-of-values.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-list-of-values.js new file mode 100644 index 0000000000..0ba1063903 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-list-of-values.js @@ -0,0 +1,1651 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RecordsListOfValues tool component. + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMListOfValues + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element, + KeyListener = YAHOO.util.KeyListener; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RecordsListOfValues constructor. + * + * @param {String} htmlId The HTML id ?of the parent element + * @return {Alfresco.rm.component.RMListOfValues} The new RecordsListOfValues instance + * @constructor + */ + Alfresco.rm.component.RMListOfValues = function(htmlId) + { + this.name = "Alfresco.rm.component.RMListOfValues"; + Alfresco.rm.component.RMListOfValues.superclass.constructor.call(this, htmlId); + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "container", "datasource", "datatable", "json", "history"], this.onComponentsLoaded, this); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("viewListOfValues", this.onViewListOfValues, this); + YAHOO.Bubbling.on("createListOfValue", this.onCreateListOfValue, this); + YAHOO.Bubbling.on("editListOfValue", this.onEditListOfValue, this); + + /* Define panel handlers */ + var parent = this; + + // NOTE: the panel registered first is considered the "default" view and is displayed first + + /* View Panel Handler */ + ViewPanelHandler = function ViewPanelHandler_constructor() + { + // Initialise prototype properties + ViewPanelHandler.superclass.constructor.call(this, "view"); + }; + + YAHOO.extend(ViewPanelHandler, Alfresco.ConsolePanelHandler, + { + + /** + /** + * Remembers if the panel data has been loaded once + * + * @property initialDataLoaded + * @type boolean + */ + initialDataLoaded: false, + + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function ViewPanelHandler_onLoad() + { + // widgets + this.widgets.newListButton = Alfresco.util.createYUIButton(this, "newlist-button", this.onNewListOfValueClick, {}, parent.id + "-newlist-button"); + + // Setup data table + this._setupListDataSource(); + this._setupListDataTable(); + }, + + /** + * Setup the datasource for the data table + * + * @method _setupListDataSource + * @private + */ + _setupListDataSource: function ViewPanelHandler__setupListDataSource() + { + // DataSource definition + var uriSearchResults = Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints"; + this.widgets.listDataSource = new YAHOO.util.DataSource(uriSearchResults, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "queueRequests", + responseSchema: + { + resultsList: "data" + } + }); + this.widgets.listDataSource.doBeforeParseData = function RecordsListOfValues_doBeforeParseData(oRequest , oFullResponse) + { + if (oFullResponse && oFullResponse.data) + { + var items = oFullResponse.data; + + // Sort the lists by their title + items.sort(function (list1, list2) + { + return (list1.constraintTitle > list2.constraintTitle) ? 1 : (list1.constraintTitle < list2.constraintTitle) ? -1 : 0; + }); + + // we need to wrap the array inside a JSON object so the DataTable is happy + return { + data: items + }; + } + return oFullResponse; + }; + }, + + /** + * Setup the ListDataTable + * + * @method _setupListDataTable + * @private + */ + _setupListDataTable: function ViewPanelHandler__setupListDataTable() + { + var me = this; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellList + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellList = function ViewPanelHandler__setupListDataTable_renderCellList(elCell, oRecord, oColumn, oData) + { + var title = document.createElement("h4"); + title.appendChild(document.createTextNode(oRecord.getData("constraintTitle"))); + elCell.appendChild(title); + }; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellActions = function ViewPanelHandler__setupListDataTable_renderCellActions(elCell, oRecord, oColumn, oData) + { + // Edit list of value + var editBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.edit") + }); + editBtn.on("click", me.onEditListOfValueClick, oRecord, me); + + // Rename list of value + var renameBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.rename") + }); + renameBtn.on("click", me.onRenameListOfValueClick, oRecord, me); + + // Delete list of value + // NOTE: removed for temp fix to ETHREEOH-3917 - repository side needs to implement Delete! + /*var deleteBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.delete") + }); + deleteBtn.on("click", me.onDeleteListOfValueClick, oRecord, me);*/ + }; + + // ListDataTable column defintions + var columnDefinitions = + [ + { + key: "list", label: parent.msg("table.header.list"), sortable: false, formatter: renderCellList + }, + { + key: "actions", label: parent.msg("table.header.actions"), formatter: renderCellActions + } + ]; + + // ListDataTable definition + this.widgets.listDataTable = new YAHOO.widget.DataTable(parent.id + "-listofvalues", columnDefinitions, this.widgets.listDataSource, + { + renderLoopSize: 32, + initialLoad: false, + MSG_EMPTY: parent.msg("message.loading.lists") + }); + + // Override abstract function within ListDataTable to set custom error message + this.widgets.listDataTable.doBeforeLoadData = function RecordsListOfValues_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.listDataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + parent._setDefaultDataTableErrors(me.widgets.listDataTable, parent.msg("message.empty.lists")); + } + } + else if (oResponse.results) + { + if (oResponse.results.length === 0) + { + me.widgets.listDataTable.set("MSG_EMPTY", '' + parent.msg("message.empty.lists") + ''); + } + me.renderLoopSize = oResponse.results.length >> (YAHOO.env.ua.gecko === 1.8) ? 3 : 5; + } + + // Must return true to have the "Searching..." message replaced by the error message + return true; + }; + }, + + /** + * Load the list of values + * + * @method _loadListOfValues + * @private + */ + _loadListOfValues: function ViewPanelHandler__loadListOfValues() + { + + // Reset the custom error messages + parent._setDefaultDataTableErrors(this.widgets.listDataTable, parent.msg("message.list")); + + // empty results table + this.widgets.listDataTable.deleteRows(0, this.widgets.listDataTable.getRecordSet().getLength()); + + var successHandler = function ViewPanelHandler__loadListOfValues_successHandler(sRequest, oResponse, oPayload) + { + // Stop list from getting refreshed when not needed + this.initialDataLoaded = true; + + // Display new data + this.widgets.listDataTable.onDataReturnInitializeTable.call(this.widgets.listDataTable, sRequest, oResponse, oPayload); + }; + + var failureHandler = function ViewPanelHandler__loadListOfValues_failureHandler(sRequest, oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.listDataTable.set("MSG_ERROR", response.message); + this.widgets.listDataTable.showTableMessage(response.message, YAHOO.widget.DataTable.CLASS_ERROR); + } + catch(e) + { + parent._setDefaultDataTableErrors(this.widgets.listDataTable, parent.msg("message.empty.lists")); + } + } + }; + + this.widgets.listDataSource.sendRequest("", + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Edit List of value button click handler + * + * @method onEditListOfValueClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onEditListOfValueClick: function ViewPanelHandler_onEditListOfValueClick(e, oRecord) + { + // update the current list context + YAHOO.Bubbling.fire("editListOfValue", + { + constraintName: oRecord.getData("constraintName") + }); + }, + + + /** + * Rename list button click handler + * + * @method onRenameListOfValueClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onRenameListOfValueClick: function ViewPanelHandler_onRenameListOfValueClick(e, oRecord) + { + var doSetupFormsValidation = function ViewPanelHandler_onRenameListOfValueClick_doSetupFormsValidation(p_form) + { + // Validation + p_form.addValidation(parent.id + "-renameList-constraintTitle", Alfresco.forms.validation.mandatory, null, "keyup"); + p_form.addValidation(parent.id + "-renameList-constraintTitle", Alfresco.forms.validation.nodeName, null, "keyup"); + p_form.setShowSubmitStateDynamically(true, false); + }; + var renameListUrl = Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints/" + oRecord.getData("constraintName"); + if (!this.modules.renameList) + { + this.modules.renameList = new Alfresco.module.SimpleDialog(parent.id + "-renameList").setOptions( + { + width: "30em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/console/list-of-value-properties", + actionUrl: renameListUrl, + doSetupFormsValidation: + { + fn: doSetupFormsValidation, + scope: this + }, + doBeforeDialogShow: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_doBeforeDialogShow(p_config, p_obj) + { + Dom.get(parent.id + "-renameList-dialogTitle").innerHTML = parent.msg("panel.listproperties.edit"); + Dom.get(parent.id + "-renameList-constraintTitle").value = oRecord.getData("constraintTitle"); + } + }, + doBeforeAjaxRequest: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_doBeforeAjaxRequest(p_config, p_obj) + { + p_config.method = Alfresco.util.Ajax.PUT; + return true; + } + }, + firstFocus: parent.id + "-renameList-constraintTitle", + onSuccess: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_success_callback(response) + { + this._loadListOfValues(); + }, + scope: this + }, + onFailure: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_failure_callback(response) + { + var json = Alfresco.util.parseJSON(response.serverResponse.responseText), + failureMsg = response.serverResponse.responseText; + if (json != null && json.message != null) + { + failureMsg = json.message; + } + + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.renamelist.failure.title"), + text: parent.msg("message.renamelist.failure.text", failureMsg) + }); + }, + scope: this + } + }); + } + else + { + this.modules.renameList.setOptions( + { + actionUrl: renameListUrl, + clearForm: true + }); + } + this.modules.renameList.show(); + }, + + /** + * Delete List button click handler. + * Displays a confirmation dialog before the deletion is made. + * + * @method onDeleteListOfValueClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onDeleteListOfValueClick: function ViewPanelHandler_onDeleteListOfValueClick(e, oRecord) + { + var me = this; + var text = parent.msg("message.confirm.deletelist.text", oRecord.getData("constraintTitle")); + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.confirm.deletelist.title"), + text: text, + buttons: [ + { + text: parent.msg("button.yes"), + handler: function ViewPanelHandler_onDeleteListOfValueClick_confirmYes() + { + this.destroy(); + me._deleteList.call(me, oRecord); + } + }, + { + text: parent.msg("button.no"), + handler: function ViewPanelHandler_onDeleteListOfValueClick_confirmNo() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Delete the list + * + * @method _deleteList + * @param oRecord {object} The list + */ + _deleteList: function ViewPanelHandler__deleteList(oRecord) + { + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints/" + oRecord.getData("constraintName"), + successCallback: + { + fn: function(o) + { + // Reload list of values + this._loadListOfValues(); + + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: parent.msg("message.deletelist.success") + }); + }, + scope: this + }, + failureMessage: parent.msg("message.deletelist.failure") + }); + }, + + /** + * onUpdate ConsolePanel event handler + * + * @method onUpdate + */ + onUpdate: function ViewPanelHandler_onUpdate() + { + if (!this.initialDataLoaded || parent.refresh) + { + this._loadListOfValues(); + } + }, + + /** + * New list button click handler + * + * @method onNewListOfValueClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onNewListOfValueClick: function ViewPanelHandler_onNewListOfValueClick(e, obj) + { + var doSetupFormsValidation = function ViewPanelHandler_onNewListOfValueClick_doSetupFormsValidation(p_form) + { + // Validation + p_form.addValidation(parent.id + "-newList-constraintTitle", Alfresco.forms.validation.mandatory, null, "keyup"); + p_form.addValidation(parent.id + "-newList-constraintTitle", Alfresco.forms.validation.nodeName, null, "keyup"); + p_form.setShowSubmitStateDynamically(true, false); + }; + var createListUrl = Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints"; + if (!this.modules.createList) + { + this.modules.createList = new Alfresco.module.SimpleDialog(parent.id + "-newList").setOptions( + { + width: "30em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/console/list-of-value-properties", + actionUrl: createListUrl, + doSetupFormsValidation: + { + fn: doSetupFormsValidation, + scope: this + }, + doBeforeDialogShow: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_doBeforeDialogShow(p_config, p_obj) + { + Dom.get(parent.id + "-newList-dialogTitle").innerHTML = parent.msg("panel.listproperties.create"); + } + }, + doBeforeAjaxRequest: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_doBeforeAjaxRequest(p_config, p_obj) + { + p_config.method = Alfresco.util.Ajax.POST; + p_config.dataObj.allowedValues = []; + return true; + } + }, + firstFocus: parent.id + "-newList-constraintTitle", + onSuccess: + { + fn: function ViewPanelHandler_onNewListOfValueClick_SimpleDialog_callback(response) + { + this._loadListOfValues(); + }, + scope: this + }, + onFailure: + { + fn: function(response) + { + var json = Alfresco.util.parseJSON(response.serverResponse.responseText), + failureMsg = response.serverResponse.responseText; + if (json != null && json.message != null) + { + failureMsg = json.message; + } + + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.addlist.failure.title"), + text: parent.msg("message.addlist.failure.text", failureMsg) + }); + }, + scope: this + } + }); + } + else + { + this.modules.createList.setOptions( + { + actionUrl: createListUrl, + clearForm: true + }); + } + this.modules.createList.show(); + } + + }); + new ViewPanelHandler(); + + /* Edit Metadata Panel Handler */ + EditPanelHandler = function EditPanelHandler_constructor() + { + // Initialise prototype properties + + EditPanelHandler.superclass.constructor.call(this, "edit"); + }; + + YAHOO.extend(EditPanelHandler, Alfresco.ConsolePanelHandler, + { + + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function ViewPanelHandler_onLoad() + { + var me = this; + + // Buttons + this.widgets.newValueButton = Alfresco.util.createYUIButton(this, "newvalue-button", this.onNewValueClick, {}, parent.id + "-newvalue-button"); + this.widgets.addAccessButton = Alfresco.util.createYUIButton(this, "addaccess-button", this.onAddAccessClick, {}, parent.id + "-addaccess-button"); + this.widgets.newDoneButton = Alfresco.util.createYUIButton(this, "done-button", this.onDoneButtonClick, {}, parent.id + "-done-button"); + + // Make enter key strokes in new value text input add values + var newValueInput = Dom.get(parent.id + "-newvalue-input"), + keyListener = new KeyListener(newValueInput, + { + keys:13 + }, + { + fn: function() + { + if (!this.widgets.newValueButton.get("disabled")) + { + me.onNewValueClick(newValueInput); + } + }, + scope:this, + correctScope:true + }, "keydown").enable(); + + // Make sure the "Add" value button is is enabled when characters are entered in the textinput + Event.addListener(newValueInput, "keyup", function() + { + this._enableNewValueButton(newValueInput); + }, null, this); + this._enableNewValueButton(newValueInput); + + // Setup data table and data sources + this._setupValuesDataSource(); + this._setupAccessDataSource(); + this._setupValuesDataTable(); + this._setupAccessDataTable(); + + // Load in the Authority Finder component from the server + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/authority-finder", + dataObj: + { + htmlid: parent.id + "-search-authorityfinder", + module: "rm" + }, + successCallback: + { + fn: this.onAuthorityFinderLoaded, + scope: this + }, + failureMessage: "Could not load Authority Finder component", + execScripts: true + }); + + }, + + /** + * onUpdate ConsolePanel event handler + * + * @method onUpdate + */ + onUpdate: function ViewPanelHandler_onUpdate() + { + this._loadValues(); + + // empty access table + this.widgets.accessDataTable.deleteRows(0, this.widgets.accessDataTable.getRecordSet().getLength()); + this.widgets.accessDataTable.set("MSG_EMPTY", ""); + + }, + + /** + * Called by the ConsolePanelHandler when this panel is shown + * + * @method onShow + */ + onShow: function ViewPanelHandler_onShow() + { + this._visible = true; + }, + + /** + * Called by the ConsolePanelHandler when this panel is hidden + * + * @method onHide + */ + onHide: function ViewPanelHandler_onHide() + { + this._visible = false; + }, + + /** + * Done button click handler + * + * @method onDoneButtonClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onDoneButtonClick: function EditPanelHandler_onDoneButtonClick(e, obj) + { + // Display the list of values again, but not need to refresh the data since we canceled + YAHOO.Bubbling.fire('viewListOfValues', + { + refresh: false + }); + }, + + /** + * Values + */ + + /** + * Validates the user input for a values title and enables/disables the new value button afterwards + * + * @method _enableNewValueButton + * @param newValueInputEl + * @private + * @return true if the user input is valid + */ + _enableNewValueButton: function ViewPanelHandler__enableNewValueButton(newValueInputEl) + { + this.widgets.newValueButton.set("disabled", (YAHOO.lang.trim(newValueInputEl.value).length === 0)); + }, + + /** + * Setup the datasource for the values data table + * + * @method _setupValuesDataSource + * @private + */ + _setupValuesDataSource: function ViewPanelHandler__setupValuesDataSource() + { + // DataSource definition + var uriSearchResults = Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints"; + this.widgets.valuesDataSource = new YAHOO.util.DataSource(uriSearchResults, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "queueRequests", + responseSchema: + { + resultsList: "data.values" + } + }); + this.widgets.valuesDataSource.doBeforeParseData = function RecordsListOfValues_doBeforeParseData(oRequest , oFullResponse) + { + if (oFullResponse && oFullResponse.data && oFullResponse.data.values) + { + // Display the title of the list in the "edit title" + Dom.get(parent.id + "-edittitle").innerHTML = parent.msg("label.edit-listofvalue-title", $html(oFullResponse.data.constraintTitle)); + + // Get the values from the response + var values = oFullResponse.data.values; + + // Sort the values by their title + values.sort(function (value1, value2) + { + return (value1.valueTitle > value2.valueTitle) ? 1 : (value1.valueTitle < value2.valueTitle) ? -1 : 0; + }); + + // we need to wrap the array inside a JSON object so the DataTable is happy + return ( + { + data: + { + values: values + } + }); + } + return oFullResponse; + }; + }, + + /** + * Setup the ValuesDataTable + * + * @method _setupValuesDataTable + * @private + */ + _setupValuesDataTable: function ViewPanelHandler__setupValuesDataTable() + { + var me = this; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellDescription + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellDescription = function ViewPanelHandler__setupValuesDataTable_renderCellDescription(elCell, oRecord, oColumn, oData) + { + elCell.appendChild(document.createTextNode(oRecord.getData("valueTitle"))); + }; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellActions = function ViewPanelHandler__setupValuesDataTable_renderCellActions(elCell, oRecord, oColumn, oData) + { + var deleteBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.delete") + }); + deleteBtn.on("click", me.onDeleteValueClick, oRecord, me); + }; + + // ValuesDataTable column defintions + var columnDefinitions = + [ + { + key: "reference", label: "List", sortable: false, formatter: renderCellDescription + }, + { + key: "actions", label: "Actions", formatter: renderCellActions + } + ]; + + // ValuesDataTable definition + this.widgets.valuesDataTable = new YAHOO.widget.DataTable(parent.id + "-values", columnDefinitions, this.widgets.valuesDataSource, + { + selectionMode: "single", + renderLoopSize: 32, + initialLoad: false, + MSG_EMPTY: parent.msg("message.loading.values") + }); + + // Listen for when a value is selected so we can reload the access list + this.widgets.valuesDataTable.subscribe("rowSelectEvent", function(e, o) + { + this._loadAccess(); + }, null, this); + this.widgets.valuesDataTable.subscribe("rowClickEvent", this.widgets.valuesDataTable.onEventSelectRow); + + // Override abstract function within ValuesDataTable to set custom error message + this.widgets.valuesDataTable.doBeforeLoadData = function RecordsListOfValues_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.valuesDataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + parent._setDefaultDataTableErrors(me.widgets.valuesDataTable, parent.msg("message.empty.values")); + } + } + else if (oResponse.results) + { + if (oResponse.results.length === 0) + { + me.widgets.valuesDataTable.set("MSG_EMPTY", '' + parent.msg("message.empty.values") + ''); + } + me.renderLoopSize = oResponse.results.length >> (YAHOO.env.ua.gecko === 1.8) ? 3 : 5; + } + + // Must return true to have the "Searching..." message replaced by the error message + return true; + }; + }, + + /** + * Load the list of values + * + * @method _loadValues + * @private + */ + _loadValues: function ViewPanelHandler__loadValues() + { + + // Reset the custom error messages + parent._setDefaultDataTableErrors(this.widgets.valuesDataTable, parent.msg("message.empty.values")); + + // empty results table + this.widgets.valuesDataTable.deleteRows(0, this.widgets.valuesDataTable.getRecordSet().getLength()); + + var successHandler = function ViewPanelHandler__loadValues_successHandler(sRequest, oResponse, oPayload) + { + /** + * Note: The "edit title" will be set in the "doBeforeParseData" callback + * since the "constraintTitle" isn't part of the "tabular data". + */ + + // Display the value list and select the first item so its access authorities are loaded if any + this.widgets.valuesDataTable.onDataReturnInitializeTable.call(this.widgets.valuesDataTable, sRequest, oResponse, oPayload); + if (this.widgets.valuesDataTable.getRecordSet().getLength() > 0) + { + this.widgets.valuesDataTable.selectRow(0); + this.widgets.addAccessButton.set("disabled", false); + } + else + { + this.widgets.accessDataTable.set("MSG_EMPTY", ""); + this.widgets.addAccessButton.set("disabled", true); + } + }; + + var failureHandler = function ViewPanelHandler__loadValues_failureHandler(sRequest, oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.valuesDataTable.set("MSG_ERROR", response.message); + this.widgets.valuesDataTable.showTableMessage(response.message, YAHOO.widget.DataTable.CLASS_ERROR); + } + catch(e) + { + parent._setDefaultDataTableErrors(this.widgets.valuesDataTable, parent.msg("message.empty.values")); + } + } + }; + + this.widgets.valuesDataSource.sendRequest("/" + parent.constraintName + "/values", + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Delete Value button click handler. + * Displays a confirmation dialog before the deletion is made. + * + * @method onDeleteValueClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onDeleteValueClick: function ViewPanelHandler_onDeleteValueClick(e, oRecord) + { + var me = this; + var text = parent.msg("message.confirm.removevalue.text", oRecord.getData("valueTitle")); + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.confirm.removevalue.title"), + text: text, + buttons: [ + { + text: parent.msg("button.yes"), + handler: function ViewPanelHandler_onDeleteValueClick_confirmYes() + { + this.destroy(); + me._deleteValue.call(me, oRecord); + } + }, + { + text: parent.msg("button.no"), + handler: function ViewPanelHandler_onDeleteValueClick_confirmNo() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Remove a value from the list + * + * @method _deleteValue + * @param oRecord {object} The list + */ + _deleteValue: function ViewPanelHandler__deleteValue(oRecord) + { + // Remove value from previous values + var valueRecords = this.widgets.valuesDataTable.getRecordSet().getRecords(), + record, + values = []; + for (var i = 0; i < valueRecords.length; i++) + { + record = valueRecords[i]; + if (oRecord.getId() != record.getId()) + { + values.push(record.getData("valueTitle")); + } + } + + Alfresco.util.Ajax.jsonPut( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints/" + parent.constraintName, + dataObj: + { + allowedValues: values + }, + successCallback: + { + fn: function(o) + { + // Reload the values + this._loadValues(); + }, + scope: this + }, + failureMessage: parent.msg("message.deletevalue.failure") + }); + }, + + /** + * New list button click handler. + * Adds the new value and reloads the list. + * + * @method onNewValueClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onNewValueClick: function ViewPanelHandler_onNewValueClick(e, obj) + { + // Concat previous values with the new one + var valueRecords = this.widgets.valuesDataTable.getRecordSet().getRecords(), + values = []; + for (var i = 0; i < valueRecords.length; i++) + { + values.push(valueRecords[i].getData("valueTitle")); + + } + var newValue = Dom.get(parent.id + "-newvalue-input").value; + values.push(newValue); + + // Submit new value to server and add it to the ui after a successful response + Alfresco.util.Ajax.jsonPut( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints/" + parent.constraintName, + dataObj: + { + allowedValues: values + }, + successCallback: + { + fn: function(o) + { + // Reload the values and clear the textinput + this._loadValues(); + Dom.get(parent.id + "-newvalue-input").value = ""; + this.widgets.newValueButton.set("disabled", true); + }, + scope: this + }, + failureMessage: parent.msg("message.addvalue.failure", newValue) + }); + }, + + + /** + * Access + */ + + /** + * Called when the authority finder template has been loaded. + * Creates a dialog and inserts the authority finder for choosing groups and users to add. + * + * @method onAuthorityFinderLoaded + * @param response The server response + */ + onAuthorityFinderLoaded: function ViewPanelHandler_onAuthorityFinderLoaded(response) + { + // Inject the component from the XHR request into it's placeholder DIV element + var finderDiv = Dom.get(parent.id + "-search-authorityfinder"); + finderDiv.innerHTML = response.serverResponse.responseText; + + // Create the Add Group dialog + this.widgets.addAccessPanel = Alfresco.util.createYUIPanel(parent.id + "-authoritypicker"); + + // Find the Group Finder by container ID + this.modules.searchAuthorityFinder = Alfresco.util.ComponentManager.get(parent.id + "-search-authorityfinder"); + + // Set the correct options for our use + this.modules.searchAuthorityFinder.setOptions( + { + singleSelectMode: true, + minSearchTermLength: 1 + }); + + // Make sure we listen for events when the user selects a group + YAHOO.Bubbling.on("itemSelected", this.onAuthoritySelected, this); + }, + + /** + * Group selected event handler. + * This event is fired from Group picker - so we much ensure + * the event is for the current panel by checking panel visibility. + * + * @method onGroupSelected + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onAuthoritySelected: function ViewPanelHandler_onAuthoritySelected(e, args) + { + // This is a "global" event so we ensure the event is for the current panel by checking panel visibility. + if (this._visible) + { + // Hide the access picker + this.widgets.addAccessPanel.hide(); + + // Concat previous authorities with the new one + var authorityRecords = this.widgets.accessDataTable.getRecordSet().getRecords(), + authorities = []; + for (var i = 0; i < authorityRecords.length; i++) + { + authorities.push(authorityRecords[i].getData("authorityName")); + } + authorities.push(args[1].itemName); + + // Submit new access authorities to server and add it to the ui after a successful response + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints/" + parent.constraintName + "/values", + dataObj: + { + values: [ + { + value: this._getSelectedValueName(), + authorities: authorities + } + ] + }, + successCallback: + { + fn: function(o) + { + // Reload the values + this._loadAccess(); + }, + scope: this + }, + failureMessage: parent.msg("message.addaccess.failure") + }); + + } + }, + + /** + * Setup the datasource for the access data table + * + * @method _setupAccessDataSource + * @private + */ + _setupAccessDataSource: function ViewPanelHandler__setupAccessDataSource() + { + // DataSource definition + var uriSearchResults = Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints"; + this.widgets.accessDataSource = new YAHOO.util.DataSource(uriSearchResults, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "queueRequests", + responseSchema: + { + resultsList: "data.value.authorities" + } + }); + this.widgets.accessDataSource.doBeforeParseData = function RecordsListOfAccess_doBeforeParseData(oRequest , oFullResponse) + { + if (oFullResponse && oFullResponse.data && oFullResponse.data.value.authorities) + { + var authorities = oFullResponse.data.value.authorities; + + // Sort the access authorities by their title + authorities.sort(function (authority1, authority2) + { + return (authority1.authorityTitle > authority2.authorityTitle) ? 1 : (authority1.authorityTitle < authority2.authorityTitle) ? -1 : 0; + }); + + // we need to wrap the array inside a JSON object so the DataTable is happy + return ( + { + data: + { + value: + { + authorities: authorities + } + } + }); + } + return oFullResponse; + }; + }, + + /** + * Setup the AccessDataTable + * + * @method _setupAccessDataTable + * @private + */ + _setupAccessDataTable: function ViewPanelHandler__setupAccessDataTable() + { + var me = this; + + /** + * ListIcon custom datacell formatter + * + * @method renderCellAccessIcon + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellAccessIcon = function ViewPanelHandler__setupListDataTable_renderCellAccessIcon(elCell, oRecord, oColumn, oData) + { + var authority = oRecord.getData("authorityName").indexOf("GROUP_") == 0 ? "group" : "user"; + elCell.innerHTML = ''; + }; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellDescription + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellDescription = function ViewPanelHandler__setupAccessDataTable_renderCellDescription(elCell, oRecord, oColumn, oData) + { + elCell.appendChild(document.createTextNode(oRecord.getData("authorityTitle"))); + }; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellActions = function ViewPanelHandler__setupAccessDataTable_renderCellActions(elCell, oRecord, oColumn, oData) + { + var deleteBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.remove") + }); + deleteBtn.on("click", me.onRemoveAccessClick, oRecord, me); + }; + + // AccessDataTable column defintions + var columnDefinitions = + [ + { key: "accessicon", label: parent.msg("table.header.icon"), sortable: false, formatter: renderCellAccessIcon }, + { key: "access", label: parent.msg("table.header.name"), sortable: false, formatter: renderCellDescription }, + { key: "actions", label: parent.msg("table.header.actions"), formatter: renderCellActions } + ]; + + // AccessDataTable definition + this.widgets.accessDataTable = new YAHOO.widget.DataTable(parent.id + "-access", columnDefinitions, this.widgets.accessDataSource, + { + renderLoopSize: 32, + initialLoad: false, + MSG_EMPTY: "" + }); + + // Override abstract function within AccessDataTable to set custom error message + this.widgets.accessDataTable.doBeforeLoadData = function RecordsListOfAccess_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.accessDataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + parent._setDefaultDataTableErrors(me.widgets.accessDataTable, parent.msg("message.empty.access")); + } + } + else if (oResponse.results) + { + if (oResponse.results.length === 0) + { + me.widgets.accessDataTable.set("MSG_EMPTY", '' + parent.msg("message.empty.access") + ''); + } + me.renderLoopSize = oResponse.results.length >> (YAHOO.env.ua.gecko === 1.8) ? 3 : 5; + } + + // Must return true to have the "Searching..." message replaced by the error message + return true; + }; + }, + + /** + * Load the list of access depending on what value that is selected + * + * @method _loadAccess + * @private + */ + _loadAccess: function ViewPanelHandler__loadAccess() + { + // Reset the custom error messages + parent._setDefaultDataTableErrors(this.widgets.accessDataTable, parent.msg("message.loading.access")); + + // empty results table + this.widgets.accessDataTable.deleteRows(0, this.widgets.accessDataTable.getRecordSet().getLength()); + + var successHandler = function ViewPanelHandler__loadAccess_successHandler(sRequest, oResponse, oPayload) + { + this.widgets.accessDataTable.onDataReturnInitializeTable.call(this.widgets.accessDataTable, sRequest, oResponse, oPayload); + }; + + var failureHandler = function ViewPanelHandler__loadAccess_failureHandler(sRequest, oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.accessDataTable.set("MSG_ERROR", response.message); + this.widgets.accessDataTable.showTableMessage(response.message, YAHOO.widget.DataTable.CLASS_ERROR); + } + catch(e) + { + parent._setDefaultDataTableErrors(this.widgets.accessDataTable, parent.msg("message.empty.access")); + } + } + }; + + var selectedValueName = this._getSelectedValueName(); + if (selectedValueName) + { + // Note: extra manual encoding of %2F ("/") to enable correct HTTP request generation + this.widgets.accessDataSource.sendRequest("/" + parent.constraintName + "/values/" + encodeURIComponent(selectedValueName).replace(/%2F/g, "%252F"), + { + success: successHandler, + failure: failureHandler, + scope: this + }); + } + else + { + this.widgets.accessDataTable.set("MSG_EMPTY", ""); + } + }, + + /** + * Get the valueName of the selected value. + * + * @method _getSelectedValueName + * @private + */ + _getSelectedValueName: function ViewPanelHandler_getSelectedValueName() + { + var selectedRows = this.widgets.valuesDataTable.getSelectedRows(), + selectedRow = selectedRows && selectedRows.length > 0 ? selectedRows[0] : null, + selectedRecord = this.widgets.valuesDataTable.getRecord(selectedRow); + return selectedRecord ? selectedRecord.getData("valueName") : null; + }, + + /** + * Delete Access button click handler. + * Displays a confirmation dialog before the deletion is made. + * + * @method onRemoveAccessClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onRemoveAccessClick: function ViewPanelHandler_onRemoveAccessClick(e, oRecord) + { + var me = this; + var text = parent.msg("message.confirm.removeaccess.text", oRecord.getData("authorityTitle")); + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.confirm.removeaccess.title"), + text: text, + buttons: [ + { + text: parent.msg("button.yes"), + handler: function ViewPanelHandler_onRemoveccessClick_confirmYes() + { + this.destroy(); + me._removeAccess.call(me, oRecord); + } + }, + { + text: parent.msg("button.no"), + handler: function ViewPanelHandler_onRemoveAccessClick_confirmNo() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Remove the access + * + * @method _removeAccess + * @param oRecord {object} The list + */ + _removeAccess: function ViewPanelHandler__removeAccess(oRecord) + { + // Concat previous authorities with the new one + var authorityRecords = this.widgets.accessDataTable.getRecordSet().getRecords(), + authority, + authorities = []; + for (var i = 0; i < authorityRecords.length; i++) + { + authority = authorityRecords[i]; + if (oRecord.getId() != authority.getId()) + { + authorities.push(authorityRecords[i].getData("authorityName")); + } + } + + // Send new list of authorities to server and update ui after + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmconstraints/" + parent.constraintName + "/values", + dataObj: + { + values: [ + { + value: this._getSelectedValueName(), + authorities: authorities + } + ] + }, + successCallback: + { + fn: function(o) + { + // Reload the accesss authorities + this._loadAccess(); + }, + scope: this + }, + failureMessage: parent.msg("message.removeaccess.failure") + }); + }, + + /** + * Add access button click handler + * + * @method onAddAccessClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onAddAccessClick: function ViewPanelHandler_onAddAccessClick(e, obj) + { + this.modules.searchAuthorityFinder.clearResults(); + this.widgets.addAccessPanel.show(); + } + + }); + new EditPanelHandler(); + }; + + YAHOO.extend(Alfresco.rm.component.RMListOfValues, Alfresco.ConsoleTool, + { + /** + * Currently selected list of value. + * + * @property constraintName + * @type string + */ + constraintName: null, + + /** + * True if the data shall be refreshed on the page + * + * @property refresh + * @type object + */ + refresh: true, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function RecordsListOfValues_onComponentsLoaded() + { + Event.onContentReady(this.id, this.onReady, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RecordsListOfValues_onReady() + { + // Call super-class onReady() method + Alfresco.rm.component.RMListOfValues.superclass.onReady.call(this); + }, + + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * View List of Values event handler + * + * @method onViewListOfValues + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onViewListOfValues: function RecordsListOfValues_onViewListOfValues(e, args) + { + this.refreshUIState( + { + "panel": "view", + "refresh": args[1].refresh + "" + }); + }, + + /** + * Create List of Values event handler + * + * @method onCreateListOfValue + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onCreateListOfValue: function RecordsListOfValues_onCreateListOfValue(e, args) + { + this.refreshUIState( + { + "panel": "edit", + "constraintName": "" + }); + }, + + /** + * Edit List of Value event handler + * + * @method onEditListOfValue + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onEditListOfValue: function RecordsListOfValues_onEditListOfValue(e, args) + { + this.refreshUIState( + { + "panel": "edit", + "constraintName": args[1].constraintName + }); + }, + + /** + * History manager state change event handler (override base class) + * + * @method onStateChanged + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onStateChanged: function RecordsListOfValues_onStateChanged(e, args) + { + // Clear old states + this.constraintName = undefined; + this.refresh = true; + + var state = this.decodeHistoryState(args[1].state); + if (state.constraintName) + { + this.constraintName = state.constraintName ? state.constraintName : ""; + } + if (state.refresh) + { + this.refresh = state.refresh != "false"; + } + + // test if panel has actually changed? + if (state.panel) + { + this.showPanel(state.panel); + } + this.updateCurrentPanel(); + }, + + /** + * Encode state object into a packed string for use as url history value. + * Override base class. + * + * @method encodeHistoryState + * @param obj {object} state object + * @private + */ + encodeHistoryState: function RecordsListOfValues_encodeHistoryState(obj) + { + // wrap up current state values + var stateObj = {}; + if (this.currentPanelId !== "") + { + stateObj.panel = this.currentPanelId; + } + + // convert to encoded url history state - overwriting with any supplied values + var state = ""; + if (obj.panel || stateObj.panel) + { + state += "panel=" + encodeURIComponent(obj.panel ? obj.panel : stateObj.panel); + } + if (obj.constraintName) + { + state += state.length > 0 ? "&" : ""; + state += "constraintName=" + encodeURIComponent(obj.constraintName); + } + if (obj.refresh) + { + state += state.length > 0 ? "&" : ""; + state += "refresh=" + encodeURIComponent(obj.refresh); + } + return state; + }, + + /** + * Resets the YUI DataTable errors to our custom messages + * + * NOTE: Scope could be YAHOO.widget.DataTable, so can't use "this" + * + * @method _setDefaultDataTableErrors + * @param dataTable {object} Instance of the DataTable + */ + _setDefaultDataTableErrors: function RecordsListOfValues__setDefaultDataTableErrors(dataTable, emptyMessage) + { + dataTable.set("MSG_EMPTY", emptyMessage); + dataTable.set("MSG_ERROR", this.msg("message.error")); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-references.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-references.css new file mode 100644 index 0000000000..1fbc971988 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-references.css @@ -0,0 +1,109 @@ +.rm-references +{ + color:#000000; + margin:16px 10px 10px; +} + +.rm-references .hidden +{ + display: none; +} + +.rm-references .buttons, +.rm-references .title +{ + margin-top: 0.5em; + line-height: 2em; +} + +.rm-references .title +{ + color:#515D6B; + font-size:123.1%; + font-weight:bold; + padding-bottom:0.5em; +} + +.rm-references .buttons +{ + text-align: right; +} + +.rm-references .rm-references-list +{ + border: 1px solid #D7D7D7; +} + +.rm-references .yui-dt table +{ + border: medium none; + width: 100%; +} + +.rm-references .yui-dt table thead +{ + display: none; +} + +.rm-references tr.yui-dt-odd +{ + background-color:#FFFFFF; +} + +.rm-references .yui-dt table .yui-dt-col-actions +{ + width: 17em; + text-align: right; +} + +.rm-references .yui-dt table td +{ + border: medium none; + border-bottom: 1px dashed #D7D7D7; +} + +.rm-references .yui-dt table .yui-dt-last td +{ + border-bottom: medium none; +} + +.rm-references .reference-type-label +{ + color: #515D6B; + padding-right:0.5em; +} + +.rm-references .edit-main +{ + border: 1px solid #D7D7D7; + margin-bottom: 1.5em; + padding-bottom: 1em; +} + +.rm-references .header-bar +{ + background-color: #E3EAEC; + border-bottom: 2px solid #F0F3F4; + font-size: 116%; + font-weight: bold; + height: 1.1em; + margin: 1em; + padding: 0.3em; +} + +.rm-references .field-row +{ + padding: 0.333em; + margin-left:1em; +} + +.rm-references .crud-label +{ + line-height: 1.5em; + margin-left: 4em; +} + +.rm-references .crud-input +{ + margin-left: 4em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-references.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-references.js new file mode 100644 index 0000000000..f222a9be40 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-references.js @@ -0,0 +1,848 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RecordsReferences tool component. + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMRecordsReferences + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RecordsReferences constructor. + * + * @param {String} htmlId The HTML id ?of the parent element + * @return {Alfresco.rm.component.RMRecordsReferences} The new RecordsReferences instance + * @constructor + */ + Alfresco.rm.component.RMRecordsReferences = function(htmlId) + { + this.name = "Alfresco.rm.component.RMRecordsReferences"; + Alfresco.rm.component.RMRecordsReferences.superclass.constructor.call(this, htmlId); + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "container", "datasource", "datatable", "json", "history"], this.onComponentsLoaded, this); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("viewReferences", this.onViewReferences, this); + YAHOO.Bubbling.on("createReference", this.onCreateReference, this); + YAHOO.Bubbling.on("editReference", this.onEditReference, this); + + /* Define panel handlers */ + var parent = this; + + // NOTE: the panel registered first is considered the "default" view and is displayed first + + /* View Panel Handler */ + ViewPanelHandler = function ViewPanelHandler_constructor() + { + // Initialise prototype properties + ViewPanelHandler.superclass.constructor.call(this, "view"); + }; + + YAHOO.extend(ViewPanelHandler, Alfresco.ConsolePanelHandler, + { + + /** + /** + * Remembers if the panel data has been loaded once + * + * @property initialDataLoaded + * @type boolean + */ + initialDataLoaded: false, + + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function ViewPanelHandler_onLoad() + { + // widgets + this.widgets.newReferenceButton = Alfresco.util.createYUIButton(this, "newreference-button", this.onNewReferenceClick, {}, parent.id + "-newreference-button"); + + // Setup data table + this._setupDataSource(); + this._setupDataTable(); + }, + + /** + * Setup the datasource for the data table + * + * @method _setupDataSource + * @private + */ + _setupDataSource: function ViewPanelHandler__setupDataSource() + { + // DataSource definition + var uriSearchResults = Alfresco.constants.PROXY_URI + "api/rma/admin/customreferencedefinitions"; + this.widgets.dataSource = new YAHOO.util.DataSource(uriSearchResults, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "cancelStaleRequests", + responseSchema: + { + resultsList: "data.customReferences" + } + }); + + this.widgets.dataSource.doBeforeParseData = function RecordsReferences_doBeforeParseData(oRequest , oFullResponse) + { + if (oFullResponse && oFullResponse.data && oFullResponse.data.customReferences) + { + var references = oFullResponse.data.customReferences, + reference; + + // Simplify display handling by creating a title field + for (var i = 0; i < references.length; i++) + { + reference = references[i]; + if (reference.referenceType == "parentchild") + { + reference.title = parent.msg("label.title.parentchild", reference.source, reference.target); + } + else + { + reference.title = reference.label; + } + } + + // Sort the references by their title + references.sort(function (reference1, reference2) + { + return (reference1.title > reference2.title) ? 1 : (reference1.title < reference2.title) ? -1 : 0; + }); + + // we need to wrap the array inside a JSON object so the DataTable is happy + return { + data: + { + customReferences: references + } + }; + } + return oFullResponse; + }; + }, + + /** + * Setup the datatable + * + * @method _setupDataTable + * @private + */ + _setupDataTable: function ViewPanelHandler__setupDataTable() + { + var me = this; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellReference + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellReference = function ViewPanelHandler__setupDataTable_renderCellReference(elCell, oRecord, oColumn, oData) + { + var title = document.createElement("h4"); + title.appendChild(document.createTextNode(oRecord.getData("title"))); + + var info = document.createElement("div"); + + var typeLabel = document.createElement("span"); + Dom.addClass(typeLabel, "reference-type-label"); + typeLabel.appendChild(document.createTextNode(parent.msg("label.type") + ":")); + info.appendChild(typeLabel); + + var typeValue = document.createElement("span"); + typeValue.appendChild(document.createTextNode(parent.msg("label." + oRecord.getData("referenceType")))); + info.appendChild(typeValue); + + elCell.appendChild(title); + elCell.appendChild(info); + }; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellActions = function ViewPanelHandler__setupDataTable_renderCellActions(elCell, oRecord, oColumn, oData) + { + var editBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.edit") + }); + editBtn.on("click", me.onEditReferenceClick, oRecord, me); + /* + var deleteBtn = new YAHOO.widget.Button( + { + container: elCell, + label: parent.msg("button.delete") + }); + deleteBtn.on("click", me.onDeleteReferenceClick, oRecord, me); + */ + }; + + // DataTable column defintions + var columnDefinitions = + [ + { + key: "reference", label: "Reference", sortable: false, formatter: renderCellReference + }, + { + key: "actions", label: "Actions", formatter: renderCellActions + } + ]; + + // DataTable definition + this.widgets.dataTable = new YAHOO.widget.DataTable(parent.id + "-references", columnDefinitions, this.widgets.dataSource, + { + renderLoopSize: 32, + initialLoad: false, + MSG_EMPTY: parent.msg("message.loading") + }); + + // Override abstract function within DataTable to set custom error message + this.widgets.dataTable.doBeforeLoadData = function RecordsReferences_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.dataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + me._setDefaultDataTableErrors(me.widgets.dataTable); + } + } + else if (oResponse.results) + { + if (oResponse.results.length === 0) + { + me.widgets.dataTable.set("MSG_EMPTY", '' + parent.msg("message.empty") + ''); + } + me.renderLoopSize = oResponse.results.length >> (YAHOO.env.ua.gecko === 1.8) ? 3 : 5; + } + + // Must return true to have the "Searching..." message replaced by the error message + return true; + }; + }, + + /** + * Load the references + * + * @method _loadReferences + * @private + */ + _loadReferences: function ViewPanelHandler__loadReferences() + { + + // Reset the custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + // empty results table + this.widgets.dataTable.deleteRows(0, this.widgets.dataTable.getRecordSet().getLength()); + + var successHandler = function ViewPanelHandler__loadReferences_successHandler(sRequest, oResponse, oPayload) + { + // Stop list from getting refreshed when not needed + this.initialDataLoaded = true; + + // Display new data + this.widgets.dataTable.onDataReturnInitializeTable.call(this.widgets.dataTable, sRequest, oResponse, oPayload); + }; + + var failureHandler = function ViewPanelHandler__loadReferences_failureHandler(sRequest, oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.dataTable.set("MSG_ERROR", response.message); + this.widgets.dataTable.showTableMessage(response.message, YAHOO.widget.DataTable.CLASS_ERROR); + } + catch(e) + { + this._setDefaultDataTableErrors(this.widgets.dataTable); + } + } + }; + + this.widgets.dataSource.sendRequest("", + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Resets the YUI DataTable errors to our custom messages + * + * NOTE: Scope could be YAHOO.widget.DataTable, so can't use "this" + * + * @method _setDefaultDataTableErrors + * @param dataTable {object} Instance of the DataTable + */ + _setDefaultDataTableErrors: function ViewPanelHandler__setDefaultDataTableErrors(dataTable) + { + dataTable.set("MSG_EMPTY", parent.msg("message.empty")); + dataTable.set("MSG_ERROR", parent.msg("message.error")); + }, + + /** + * Edit Reference button click handler + * + * @method onEditReferenceClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + onEditReferenceClick: function ViewPanelHandler_onEditReferenceClick(e, oRecord) + { + YAHOO.Bubbling.fire('editReference', + { + refId: oRecord.getData("refId") + }); + }, + + /** + * Delete Reference button click handler. + * Displays a confirmation dialog before the deletion is made. + * + * @method onDeleteReferenceClick + * @param e {object} DomEvent + * @param oRecord {object} Object passed back from addListener method + */ + /* + onDeleteReferenceClick: function ViewPanelHandler_onDeleteReferenceClick(e, oRecord) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: parent.msg("message.confirm.removereference.title"), + text: oRecord.getData("title"), + buttons: [ + { + text: parent.msg("button.yes"), + handler: function ViewPanelHandler_onDeleteReferenceClick_confirmYes() + { + this.destroy(); + me._removeReference.call(me, oRecord); + } + }, + { + text: parent.msg("button.no"), + handler: function ViewPanelHandler_onDeleteReferenceClick_confirmNo() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + */ + + /** + * Remove the reference + * + * @mthod _removeReference + * @param oRecord {object} The reference + */ + /* + _removeReference: function ViewPanelHandler__removeReference(oRecord) + { + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/customreferencedefinitions/" + oRecord.getData("refId"), + successCallback: + { + fn: function(o) + { + // Reload the references + this._loadReferences(); + + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: parent.msg("message.removereference-success") + }); + }, + scope: this + }, + failureMessage: parent.msg("message.removereference-failure") + }); + }, + */ + + /** + * onUpdate ConsolePanel event handler + * + * @method onUpdate + */ + onUpdate: function onUpdate() + { + if (!this.initialDataLoaded || parent.refresh) + { + this._loadReferences(); + } + }, + + /** + * New reference button click handler + * + * @method onNewReferenceClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onNewReferenceClick: function ViewPanelHandler_onNewReferenceClick(e, obj) + { + // Send avenet so the create panel will be displayed + YAHOO.Bubbling.fire('createReference', {}); + } + }); + new ViewPanelHandler(); + + /* Edit Metadata Panel Handler */ + EditPanelHandler = function EditPanelHandler_constructor() + { + // Initialise prototype properties + + EditPanelHandler.superclass.constructor.call(this, "edit"); + }; + + YAHOO.extend(EditPanelHandler, Alfresco.ConsolePanelHandler, + { + /** + * onLoad ConsolePanel event handler + * + * @method onLoad + */ + onLoad: function EditPanelHandler_onLoad() + { + // Buttons + this.widgets.saveButton = Alfresco.util.createYUIButton(parent, "save-button", null, { + type: "submit" + }); + this.widgets.cancelButton = Alfresco.util.createYUIButton(parent, "cancel-button", this.onCancelButtonClick); + + // Checkbox listeners + var biDirectionalCheckBox = Dom.get(parent.id + "-type-bidirectional"); + Event.addListener(biDirectionalCheckBox, "click", this._disableTextInputs, true, this); + var parentChildCheckBox = Dom.get(parent.id + "-type-parentchild"); + Event.addListener(parentChildCheckBox, "click", this._disableTextInputs, true, this); + + // Form definition + var form = new Alfresco.forms.Form(parent.id + "-edit-form"); + form.setSubmitElements(this.widgets.saveButton); + form.setShowSubmitStateDynamically(true); + + // Form field validation + var doubleUnderscoresNotAllowed = { + pattern: /__/, + match: false + }; + form.addValidation(parent.id + "-bidirectional-label", Alfresco.forms.validation.mandatory, null, "keyup"); + form.addValidation(parent.id + "-parentchild-source", Alfresco.forms.validation.mandatory, null, "keyup"); + form.addValidation(parent.id + "-parentchild-source", Alfresco.forms.validation.regexMatch, doubleUnderscoresNotAllowed, "keyup"); + form.addValidation(parent.id + "-parentchild-target", Alfresco.forms.validation.mandatory, null, "keyup"); + form.addValidation(parent.id + "-parentchild-target", Alfresco.forms.validation.regexMatch, doubleUnderscoresNotAllowed, "keyup"); + + form.doBeforeFormSubmit = + { + fn: function(formEl) + { + // Disable buttons during submit + this.widgets.saveButton.set("disabled", true); + this.widgets.cancelButton.set("disabled", true); + + // Display a pengding message + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: parent.msg("message.savingReference"), + spanClass: "wait", + displayTime: 0 + }); + }, + scope: this + }; + + // Submit as an ajax submit (not leave the page), in json format + form.setAJAXSubmit(true, + { + successCallback: + { + fn: function(serverResponse, obj) + { + this.widgets.feedbackMessage.destroy(); + this.widgets.saveButton.set("disabled", false); + this.widgets.cancelButton.set("disabled", false); + + // Display the referencs list again, and refresh data since we change it + YAHOO.Bubbling.fire('viewReferences', + { + refresh: true + }); + + }, + scope: this + }, + failureCallback: + { + fn: function(serverResponse, obj) + { + this.widgets.feedbackMessage.destroy(); + this.widgets.saveButton.set("disabled", false); + this.widgets.cancelButton.set("disabled", false); + Alfresco.util.PopupManager.displayPrompt( + { + text: serverResponse.json.message + }); + }, + scope: this + } + }); + form.setSubmitAsJSON(true); + + // Initialise the form + form.init(); + + this.widgets.editForm = form; + }, + + /** + * onBeforeShow ConsolePanel event handler + * + * @method onBeforeShow + */ + onBeforeShow: function EditPanelHandler_onBeforeShow() + { + var editFormEl = Dom.get(parent.id + "-edit-form"); + if (parent.refId && parent.refId != "") + { + // Existing reference, prepare form + this.widgets.editForm.setAjaxSubmitMethod(Alfresco.util.Ajax.PUT); + + Dom.removeClass(parent.id + "-edit-title", "hidden"); + Dom.addClass(parent.id + "-create-title", "hidden"); + + // Load reference data + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI + "api/rma/admin/customreferencedefinitions/" + parent.refId, + successCallback: + { + fn: function(serverResponse) + { + // apply current property values to form + if (serverResponse.json) + { + var ref = serverResponse.json.data.customReferences[0]; + editFormEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/rma/admin/customreferencedefinitions/" + parent.refId; + Dom.get(parent.id + "-type-" + ref.referenceType).checked = true; + Dom.get(parent.id + "-bidirectional-label").value = (ref.referenceType == "bidirectional" && ref.label) ? ref.label : ""; + Dom.get(parent.id + "-parentchild-source").value = (ref.referenceType == "parentchild" && ref.source) ? ref.source: ""; + Dom.get(parent.id + "-parentchild-target").value = (ref.referenceType == "parentchild" && ref.target) ? ref.target : ""; + this._disableTextInputs(); + + // Hide the type that isn't used for this reference + Dom.addClass(parent.id + "-bidirectional-section", "hidden"); + Dom.addClass(parent.id + "-parentchild-section", "hidden"); + Dom.removeClass(parent.id + "-" + ref.referenceType + "-section", "hidden"); + } + }, + scope: this + }, + failureMessage: parent.msg("message.loadreference-failure") + }); + } + else + { + // New reference, clear the form + this.widgets.editForm.setAjaxSubmitMethod(Alfresco.util.Ajax.POST); + editFormEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/rma/admin/customreferencedefinitions"; + Dom.removeClass(parent.id + "-create-title", "hidden"); + Dom.addClass(parent.id + "-edit-title", "hidden"); + Dom.get(parent.id + "-type-bidirectional").checked = true; + Dom.get(parent.id + "-bidirectional-label").value = ""; + Dom.get(parent.id + "-parentchild-source").value = ""; + Dom.get(parent.id + "-parentchild-target").value = ""; + this._disableTextInputs(); + + // Show both type sections + Dom.removeClass(parent.id + "-bidirectional-section", "hidden"); + Dom.removeClass(parent.id + "-parentchild-section", "hidden"); + } + }, + + /** + * onShow ConsolePanel event handler + * + * @method onShow + */ + onShow: function EditPanelHandler_onShow() + { + Dom.get(parent.id + "-bidirectional-label").focus(); + }, + + /** + * Cancel Property button click handler + * + * @method onCancelButtonClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onCancelButtonClick: function EditPanelHandler_onCancelButtonClick(e, obj) + { + // Display the referencs list again, but not need to refresh the data since we canceled + YAHOO.Bubbling.fire('viewReferences', + { + refresh: false + }); + }, + + /** + * Disables/enables type input fields depending on what type checkbox that was checked + * + * @method _disableTextInputs + * @param e {object} click event object + * @param clearAndFocus {boolean} callback object set to true if disabled fields + * shall be cleared and focus shall be set to appropriate field. + */ + _disableTextInputs: function EditPanelHandler__disableTextInputs(e, clearAndFocus) + { + // Disable all type inputs + var biDirectionalLabel = Dom.get(parent.id + "-bidirectional-label"); + var parentChildSource = Dom.get(parent.id + "-parentchild-source"); + var parentChildTarget = Dom.get(parent.id + "-parentchild-target"); + biDirectionalLabel.disabled = true; + parentChildSource.disabled = true; + parentChildTarget.disabled = true; + if (clearAndFocus) + { + biDirectionalLabel.value = ""; + parentChildSource.value = ""; + parentChildTarget.value = ""; + } + + // ...and then enable only the ones related the checked type checkbox + if (Dom.get(parent.id + "-type-bidirectional").checked) + { + biDirectionalLabel.disabled = false; + if (clearAndFocus) + { + Dom.get(parent.id + "-bidirectional-label").focus(); + } + } + else if (Dom.get(parent.id + "-type-parentchild").checked) + { + parentChildSource.disabled = false; + parentChildTarget.disabled = false; + if (clearAndFocus) + { + Dom.get(parent.id + "-parentchild-source").focus(); + } + } + this.widgets.editForm.updateSubmitElements(); + } + + }); + new EditPanelHandler(); + }; + + YAHOO.extend(Alfresco.rm.component.RMRecordsReferences, Alfresco.ConsoleTool, + { + /** + * Currently selected reference + * + * @property refId + * @type string + */ + refId: null, + + /** + * True if the data shall be refreshed on the page + * + * @property refresh + * @type object + */ + refresh: true, + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * View references event handler + * + * @method onViewReferences + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onViewReferences: function RecordsReferences_onViewReferences(e, args) + { + this.refreshUIState( + { + "panel": "view", + "refresh": args[1].refresh + "" + }); + }, + + /** + * Create reference event handler + * + * @method onCreateReference + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onCreateReference: function RecordsReferences_onCreateReference(e, args) + { + this.refreshUIState( + { + "panel": "edit", + "refId": "" + }); + }, + + /** + * Edit reference event handler + * + * @method onEditReference + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onEditReference: function RecordsReferences_onEditReference(e, args) + { + this.refreshUIState( + { + "panel": "edit", + "refId": args[1].refId + }); + }, + + /** + * History manager state change event handler (override base class) + * + * @method onStateChanged + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onStateChanged: function RecordsReferences_onStateChanged(e, args) + { + // Clear old states + this.refId = undefined; + this.refresh = true; + + var state = this.decodeHistoryState(args[1].state); + if (state.refId) + { + this.refId = state.refId ? state.refId : ""; + } + if (state.refresh) + { + this.refresh = state.refresh != "false"; + } + + // test if panel has actually changed? + if (state.panel) + { + this.showPanel(state.panel); + } + this.updateCurrentPanel(); + }, + + /** + * Encode state object into a packed string for use as url history value. + * Override base class. + * + * @method encodeHistoryState + * @param obj {object} state object + * @private + */ + encodeHistoryState: function RecordsReferences_encodeHistoryState(obj) + { + // wrap up current state values + var stateObj = {}; + if (this.currentPanelId !== "") + { + stateObj.panel = this.currentPanelId; + } + + // convert to encoded url history state - overwriting with any supplied values + var state = ""; + if (obj.panel || stateObj.panel) + { + state += "panel=" + encodeURIComponent(obj.panel ? obj.panel : stateObj.panel); + } + if (obj.refId) + { + state += state.length > 0 ? "&" : ""; + state += "refId=" + encodeURIComponent(obj.refId); + } + if (obj.refresh) + { + state += state.length > 0 ? "&" : ""; + state += "refresh=" + encodeURIComponent(obj.refresh); + } + return state; + } + + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-user-rights.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-user-rights.css new file mode 100644 index 0000000000..afdcbc4944 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-user-rights.css @@ -0,0 +1,42 @@ +.rm-user-rights +{ + margin: 1em 10px; + width: 100%; +} + +.rm-user-rights h1, +.rm-user-rights h2 +{ + font-weight: bold; +} + +.rm-user-rights h2 +{ + margin: 1em 0; +} + +.rm-user-rights dl +{ + border: 1px solid #7F7F7F; +} + +.rm-user-rights dt +{ + padding: 3px; +} + +.rm-user-rights dd +{ + padding-left: 50%; +} + +.rm-user-rights dt.odd, +.rm-user-rights dd.odd +{ + background-color: #EDF5FF; +} + +.rm-user-rights p +{ + padding-top: 0; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-user-rights.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-user-rights.js new file mode 100644 index 0000000000..75d8a3d8a1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-user-rights.js @@ -0,0 +1,254 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM EmailMappings component + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.ManageReferences + */ +(function RM_UserRights() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RM UserRights componentconstructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.dashlet.MyDocuments} The new component instance + * @constructor + */ + Alfresco.rm.component.RMUserRights = function RM_UserRights_constructor(htmlId) + { + Alfresco.rm.component.RMUserRights.superclass.constructor.call(this, "Alfresco.rm.component.RMUserRights", htmlId, ["button", "container", "datasource", "datatable", "paginator", "json"]); + YAHOO.Bubbling.on('UserRights_DataLoad', this.onDataLoad, this, true); + return this; + }; + + YAHOO.extend(Alfresco.rm.component.RMUserRights, Alfresco.component.Base, + { + /** + * Initialises event listening and custom events + * + * @method initEvents + */ + initEvents: function RM_UserRights_initEvents() + { + Event.on(this.id,'click', this.onInteractionEvent, null, this); + //register event + this.registerEventHandler('click', + [ + { + rule: 'button#save-mappings-button', + o: + { + handler:this.onSaveMappings, + scope : this + } + } + ]); + return this; + }, + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + */ + onReady: function RM_UserRights_onReady() + { + this.initEvents(); + + this.widgets['roles'] = Dom.get('userrightsRoles'); + this.widgets['groups'] = Dom.get('userrightsGroups'); + + var DS = this.widgets['datasource'] = new YAHOO.util.DataSource(Alfresco.constants.PROXY_URI + 'api/rma/admin/userrightsreport', + { + responseType: YAHOO.util.DataSource.TYPE_JSARRAY + }); + + DS.doBeforeCallback = function doBeforeCallback(oRequest, oFullResponse, oParsedResponse, oCallback) + { + var responseDataUsers = oFullResponse.data.users; + var responseDataRoles = oFullResponse.data.roles; + var responseDataGroups = oFullResponse.data.groups; + var data = []; + + //massage data into a format that datatable likes + for (var key in responseDataUsers) + { + var userObject = responseDataUsers[key]; + userObject.name = $html(userObject.firstName + ' ' + userObject.lastName); + //create a label so we can use it in the roles and groups renderer + responseDataUsers[key].label = userObject.name; + //convert groups to use label and not name + var grps = []; + for (var i = 0, len = userObject.groups.length; i < len; i++) + { + grps.push(responseDataGroups[userObject.groups[i]].label); + } + userObject.groups = grps; + data.push(userObject); + } + + //User Rights components needs access to roles and groups data + YAHOO.Bubbling.fire('UserRights_DataLoad', + { + users: responseDataUsers, + roles: responseDataRoles, + groups: responseDataGroups + }); + return ( + { + results:data + }); + }; + + /** + * Custom formatter to add a space between each role + * + * @method rolesFormatter + */ + YAHOO.widget.DataTable.Formatter.roles = function rolesFormatter(elLiner, oRecord, oColumn, oData) + { + elLiner.innerHTML = oData.join(', '); + }; + + /** + * Custom formatter to add a space between each role + * + * @method groupsFormatter + */ + YAHOO.widget.DataTable.Formatter.groups = function groupsFormatter(elLiner, oRecord, oColumn, oData) + { + elLiner.innerHTML = oData.join(', '); + }; + + var DT = this.widgets['datasource'] = new YAHOO.widget.DataTable("userrightsDT", + [ + { key: "name", label: this.msg('label.name'), sortable: true, resizeable: true }, + { key: "userName", label: this.msg('label.userid'), sortable: true, resizeable: true }, + { key: "roles", label: this.msg('label.roles'), formatter: "roles", sortable: true, resizeable: true }, + { key: "groups", label: this.msg('label.groups'), formatter: "groups", sortable: true, resizeable: true } + ], DS); + }, + + /** + * Renders role and groups HTML based on data fired from datasource doBeforeCallback + * + * @method onDataLoad + * @param e {object} Dom event + * @param args {object} Event parameters + */ + onDataLoad: function RM_UserRights_onDataLoad(e, args) + { + var rolesHTML = "", + groupsHTML = "", + templates = + { + list: '
{data}
', + title: '
{data}
', + item: '
{data}
', + link: '{name}' + }, + users = args[1].users, + dataKeys = + { + roles: args[1].roles, + groups: args[1].groups + }; + + for (var q in dataKeys) + { + if (dataKeys.hasOwnProperty(q)) + { + var html = "", + ii = 0; + for (var p in dataKeys[q]) + { + if (dataKeys[q].hasOwnProperty(p)) + { + var data = dataKeys[q][p]; + // render dt + html += YAHOO.lang.substitute(templates['title'], + { + data: $html(data.label), + className: (ii % 2 === 0) ? 'odd' : '' + }); + var items = data.users; + if (items.length > 0) + { + for (var i = 0, len = items.length; i < len; i++) + { + //render link + var link = YAHOO.lang.substitute(templates['link'], + { + name: users[items[i]].label, + userId: $html(items[i]) + }); + // render dd + html += YAHOO.lang.substitute(templates['item'], + { + data: link, + className: (ii % 2 === 0) ? 'odd' : '' + }); + } + } + else + { + html += YAHOO.lang.substitute(templates['item'], + { + data: Alfresco.util.message('label.no-users', 'Alfresco.rm.component.RMUserRights'), + className: (ii % 2 === 0) ? 'odd' : '' + }); + } + ii++; + } + } + if (html !== "") + { + //render to DOM + this.widgets[q].innerHTML = YAHOO.lang.substitute(templates['list'], + { + data: html + }); + } + } + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-users-and-groups.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-users-and-groups.css new file mode 100644 index 0000000000..3e76312f44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-users-and-groups.css @@ -0,0 +1,168 @@ +.view-role-list +{ + clear: both; + border: 1px solid #444444; +} + +#roleSelection .list-header, +#roleContentGroups .list-header +{ + margin-right: -7%; + border-bottom: 1px solid #999999; +} + +#roleContentUsers .list-header +{ + margin-right: -6%; + border-bottom: 1px solid #999999; +} + +#usersAndGroups +{ + text-align: left; + padding: 1em; +} + +#usersAndGroups h2 +{ + font-size: 123.1%; + margin: 0.5em 0 0.5em 0; + color: #515D6B; + float: left; + font-weight: bold; +} + +#usersAndGroups h3 +{ + font-size: 118%; + margin: 0.5em 0; + color: #515D6B; + font-weight: bold; + padding: 0 0 0 0.5em; +} + +#usersAndGroups div.groups-header, +#usersAndGroups div.users-header +{ + font-size: 118%; + color: #515D6B; + font-weight: bold; + padding: 0.5em 0 0.5em 0.5em; +} + +#usersAndGroups span.yui-button +{ + float: right; +} + +#addGroup, +#addUser +{ + margin-top: 0.25em; +} + +#removeGroup +{ + margin-top: 0.25em; + margin-right: 9px; +} + +#removeUser +{ + margin-top: 0.25em; + margin-right: 8px; +} + +#roles +{ + width: 100%; +} + +#roles a +{ + display: block; + padding: 0.333em; + text-decoration: none; + color: inherit; +} + +#roleGroups a, +#roleUsers a +{ + text-decoration: none; + color: inherit; +} + +#roles ul, +#roleGroups ul, +#roleUsers ul +{ + margin: 0.5em; +} + +#roles, +.roleGroups +{ + overflow: auto; + height: 24em; +} + +#roles, +.roleUsers +{ + overflow: auto; + height: 24em; +} + +#roleSelection +{ + width: 31%; +} + +#roleContentGroups +{ + border-left: 1px solid #444444; + width: 31%; +} + +#roleContentGroups *, +#roleContentUsers * +{ + text-align: left; +} + +#roleContentUsers +{ + border-left: 1px solid #444444; + width: 32%; +} + +#roleContentGroups ul.groups-list li, +#roleContentUsers ul.users-list li +{ + clear: both; + padding: 0.4em; +} + +.bd.rm-search-body +{ + padding: 1px !important; +} + +.groups.group-picker, +.people-picker +{ + width: 51em; +} + +.group-finder.compact .results, +.people-finder.compact .results +{ + height: 300px !important; +} + +.group-finder .search-text input, +.people-finder .search-text input +{ + width: 20em !important; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-users-and-groups.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-users-and-groups.js new file mode 100644 index 0000000000..b5832027a2 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/console/rm-users-and-groups.js @@ -0,0 +1,781 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Users and Groups component + * + * @namespace Alfresco.rm.component + * @class Alfresco.rm.component.RMUsersAndGroups + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RM Users and Groups component constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.RMUsersAndGroups} The new component instance + * @constructor + */ + Alfresco.rm.component.RMUsersAndGroups = function RM_UsersAndGroups_constructor(htmlId) + { + YAHOO.Bubbling.on("rmRoleSelected", this.onHandleAllButtons, this); + YAHOO.Bubbling.on("rmGroupSelected", this.onHandleRemoveGroupButton, this); + YAHOO.Bubbling.on("rmUserSelected", this.onHandleRemoveUserButton, this); + + return Alfresco.rm.component.RMUsersAndGroups.superclass.constructor.call(this, htmlId); + }; + + YAHOO.extend(Alfresco.rm.component.RMUsersAndGroups, Alfresco.admin.RMViewRoles, + { + /** + * Initialises event listening and custom events + * + * @method: initEvents + */ + initEvents: function RM_UsersAndGroups_initEvents() + { + Event.on(this.id, 'click', this.onInteractionEvent, null, this); + + this.registerEventHandler('click', 'button#addGroup-button', + { + handler: this.onAddGroup, + scope: this + }); + + this.registerEventHandler('click', 'button#removeGroup-button', + { + handler: this.onRemoveGroup, + scope: this + }); + + this.registerEventHandler('click', 'button#addUser-button', + { + handler: this.onAddUser, + scope: this + }); + + this.registerEventHandler('click', 'button#removeUser-button', + { + handler: this.onRemoveUser, + scope: this + }); + + this.registerEventHandler('click', '.role', + { + handler: this.onRoleSelect, + scope: this + }); + + this.registerEventHandler('click', '.group', + { + handler: this.onGroupSelect, + scope: this + }); + + this.registerEventHandler('click', '.user', + { + handler: this.onUserSelect, + scope: this + }) + + return this; + }, + + /** + * Query the list of roles to populate the roles list. + * + * @method updateRolesList + */ + updateRolesList: function RM_UsersAndGroups_updateRolesList() + { + Alfresco.util.Ajax.request( + { + method: Alfresco.util.Ajax.GET, + // FIXME: Use "/api/rma/admin/{store_type}/{store_id}/{id}/rmroles?auths={auths?}" See RM-3968 + url: Alfresco.constants.PROXY_URI + "api/rma/admin/rmroles?auths=true", + successCallback: + { + fn: this.onRolesLoaded, + scope: this + }, + failureCallback: + { + fn: function(res) + { + var json = Alfresco.util.parseJSON(res.serverResponse.responseText); + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.failure"), + text: this.msg("message.get-roles-failure", json.message) + }); + }, + scope: this + } + }); + }, + + /** + * Extends the onRolesLoaded function from the base class + * + * @method onRolesLoaded + * @param res {object} Response + */ + onRolesLoaded: function RM_UsersAndGroups_onRolesLoaded(res) + { + Alfresco.rm.component.RMUsersAndGroups.superclass.onRolesLoaded.call(this, res); + + if (this.options.selectedGroupId) + { + this.updateSelectedGroupUI(this.options.selectedGroupId); + } + + if (this.options.selectedUserId) + { + this.updateSelectedUserUI(this.options.selectedUserId); + } + }, + + /** + * Helper to update the users and groups list UI based on selected Role ID. + * + * @method updateSelectedRoleUI + * @param {roleId} Role ID to update for, null to empty the list + */ + updateSelectedRoleUI: function RM_UsersAndGroups_updateSelectedRoleUI(roleId) + { + // update selected item background + var roleLinks = Dom.getElementsByClassName("role", "a"); + for (var r in roleLinks) + { + if (roleLinks.hasOwnProperty(r)) + { + // role link ID is in the format "role-roleId" + var roleLinkId = roleLinks[r].id, + liParent = Dom.get(roleLinkId).parentNode; + + if (roleLinkId.substring(5) === roleId) + { + // found item to selected + Dom.addClass(liParent, "selected"); + this.options.selectedRoleId = roleId; + YAHOO.Bubbling.fire("rmRoleSelected"); + } + else + { + // deselect previously selected item + Dom.removeClass(liParent, "selected"); + } + } + } + + // clear the groups list + var elGroupsDiv = Dom.get("roleGroups"), + elGroupsList = Dom.getFirstChild(elGroupsDiv); + elGroupsList.innerHTML = ""; + + // clear the users list + var elUsersDiv = Dom.get("roleUsers"); + elUsersList = Dom.getFirstChild(elUsersDiv); + elUsersList.innerHTML = ""; + + // display the query groups/users for the selected user role if any + if (roleId) + { + var groups = this.roles[roleId].assignedGroups; + groups.sort(this._sortByName); + + for (var i = 0, length = groups.length; i < length; i++) + { + var li = document.createElement("li"); + li.innerHTML = '' + $html(groups[i].displayLabel) + ''; + elGroupsList.appendChild(li); + } + + var users = this.roles[roleId].assignedUsers; + users.sort(this._sortByName); + + for (var i = 0, length = users.length; i < length; i++) + { + var li = document.createElement("li"); + li.innerHTML = '' + $html(users[i].displayLabel) + ''; + elUsersList.appendChild(li); + } + } + }, + + /** + * Helper function for 'updateSelectedGroupUI' and 'updateSelectedUserUI' to avoid code duplication. + * + * @method _updateSelectedUI + * @param {id} ID to update for (might be 'groupId' or 'userId') + * @param {param} parameter used in the template file (might be 'group' or 'user') + */ + _updateSelectedUI: function RM_UsersAndGroups__updateSelectedUI(id, param) + { + // update selected item background + var links = Dom.getElementsByClassName(param, "a"); + for (var i in links) + { + if (links.hasOwnProperty(i)) + { + // link id is in the format "group-groupId"/"user-userId" + var linkId = links[i].id, + liParent = Dom.get(linkId).parentNode; + + if (linkId.substring(param.length + 1) === id) + { + // found item to selected + Dom.addClass(liParent, "selected"); + if (param === "group") + { + this.options.selectedGroupId = id; + YAHOO.Bubbling.fire("rmGroupSelected"); + } + else if (param === "user") + { + this.options.selectedUserId = id; + YAHOO.Bubbling.fire("rmUserSelected"); + } + else + { + throw "The paramter '" + param + "' is neither 'group' nor 'user'!"; + } + } + else + { + // deselect previously selected item + Dom.removeClass(liParent, "selected"); + } + } + } + }, + + /** + * Helper to update the group selection. + * + * @method updateSelectedGroupUI + * @param {groupId} Group ID to update for, null to empty the list + */ + updateSelectedGroupUI: function RM_UsersAndGroups_updateSelectedGroupUI(groupId) + { + this._updateSelectedUI(groupId, "group"); + }, + + /** + * Helper to update the user selection. + * + * @method updateSelectedUserUI + * @param {userId} User ID to update for, null to empty the list + */ + updateSelectedUserUI: function RM_UsersAndGroups_updateSelectedUserUI(userId) + { + this._updateSelectedUI(userId, "user"); + }, + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + */ + onReady: function RM_UsersAndGroups_onReady() + { + this.initEvents(); + + var buttons = Sel.query('button', this.id), + button, id; + + // Create widget button while reassigning classname to src element (since YUI removes classes). + // We need the classname so we can identify what action to take when it is interacted with (event delegation). + for (var i = 0, length = buttons.length; i < length; i++) + { + button = buttons[i]; + id = button.id.replace(this.id + '-', ''); + this.widgets[id] = new YAHOO.widget.Button(button.id); + this.widgets[id]._button.className = button.className; + } + + // well known buttons - set the initial state + this.widgets.addGroup.set("disabled", true); + this.widgets.removeGroup.set("disabled", true); + this.widgets.addUser.set("disabled", true); + this.widgets.removeUser.set("disabled", true); + + // get the selected role ID, group ID and user ID + this.options.selectedRoleId = Alfresco.rm.getParamValueFromUrl("roleId"); + this.options.selectedGroupId = Alfresco.rm.getParamValueFromUrl("groupId"); + this.options.selectedUserId = Alfresco.rm.getParamValueFromUrl("userId"); + + // query the list of roles, groups and users to populate the roles list + this.updateRolesList(); + }, + + /** + * This event is fired when a role is selected. + * The add buttons will be enable and the remove buttons will be disabled. + * + * @method onHandleAddButtons + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onHandleAllButtons: function RM_UsersAndGroups_onHandleAllButtons(e, args) + { + this.widgets.addGroup.set("disabled", false); + this.widgets.addUser.set("disabled", false); + this.widgets.removeGroup.set("disabled", true); + this.widgets.removeUser.set("disabled", true); + }, + + /** + * This event is fired when a group is selected. + * The remove button for the groups column will be enabled. + * + * @method onHandleRemoveGroupButton + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onHandleRemoveGroupButton: function RM_UsersAndGroups_onEnableRemoveGroupButton(e, args) + { + this.widgets.removeGroup.set("disabled", false); + }, + + /** + * This event is fired when a user is selected. + * The remove button for the user column will be enabled. + * + * @method onHandleRemoveUserButton + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onHandleRemoveUserButton: function RM_UsersAndGroups_onEnableRemoveUserButton(e, args) + { + this.widgets.removeUser.set("disabled", false); + }, + + /** + * Adds a user or group to a role. + * + * @param objectId The id to a user (userName) or a group (fullName) + * @param roleId The id of the role that the object shall be added under + * @param successMessage Message to display if the request is successful + * @param failureMessage Message to display if the request fails + */ + _addToRole: function RM_UsersAndGroups__addToRole(objectId, roleId, successMessage, failureMessage) + { + Alfresco.util.Ajax.jsonPost( + { + // FIXME: Use "/api/rm/{store_type}/{store_id}/{id}/roles/{roleId}/authorities/{authorityName}" See RM-3968 + url: Alfresco.constants.PROXY_URI + "api/rm/roles/" + encodeURIComponent(roleId) + "/authorities/" + encodeURIComponent(objectId), + successCallback: + { + fn: function(o) + { + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: successMessage + }); + + // Update list + this.updateRolesList(); + }, + scope: this + }, + failureMessage: failureMessage + }); + }, + + /** + * Group selected event handler. + * This event is fired from Group picker - so we much ensure + * the event is for the current panel by checking panel visibility. + * + * @method onGroupSelected + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onGroupSelected: function RM_UsersAndGroups_onGroupSelected(e, args) + { + var displayName = args[1].displayName, + groupName = args[1].itemName, + roleId = this.options.selectedRoleId, + successMessage = this.msg("message.addgroup-success", displayName), + failureMessage = this.msg("message.addgroup-failure", displayName); + + this._addToRole(groupName, roleId, successMessage, failureMessage); + + this.widgets.addGroupPanel.hide(); + }, + + /** + * Called when the group finder template has been loaded. + * Creates a dialog and inserts the group finder for choosing groups to add. + * + * @method onGroupFinderLoaded + * @param response The server response + */ + onGroupFinderLoaded: function RM_UsersAndGroups__onGroupFinderLoaded(response) + { + // Inject the component from the XHR request into it's placeholder DIV element + var finderDiv = Dom.get("rm-search-groupfinder"); + finderDiv.innerHTML = response.serverResponse.responseText; + + // Create the Add Group dialog + this.widgets.addGroupPanel = Alfresco.util.createYUIPanel("rm-grouppicker") + + // Find the Group Finder by container ID + this.modules.searchGroupFinder = Alfresco.util.ComponentManager.get("rm-search-groupfinder"); + + // Set the correct options for our use + this.modules.searchGroupFinder.setOptions( + { + viewMode: Alfresco.GroupFinder.VIEW_MODE_COMPACT, + singleSelectMode: true + }); + + // Make sure we listen for events when the user selects a group + YAHOO.Bubbling.on("itemSelected", this.onGroupSelected, this); + + YAHOO.lang.later(100, this, function() + { + // Show the panel + this.widgets.addGroupPanel.show(); + }); + }, + + /** + * Called when the user has selected a person from the add user dialog. + * + * @method onPersonSelected + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onPersonSelected: function RM_UsersAndGroups_onPersonSelected(e, args) + { + var userName = args[1].userName, + roleId = this.options.selectedRoleId, + successMessage = this.msg("message.adduser-success", userName), + failureMessage = this.msg("message.adduser-failure", userName); + + this._addToRole(userName, roleId, successMessage, failureMessage); + + this.widgets.addUserPanel.hide(); + }, + + /** + * Called when the people finder template has been loaded. + * Creates a dialog and inserts the people finder for choosing users to add. + * + * @method onPeopleFinderLoaded + * @param response The server response + */ + onPeopleFinderLoaded: function RM_UsersAndGroups_onPeopleFinderLoaded(response) + { + // Inject the component from the XHR request into it's placeholder DIV element + var finderDiv = Dom.get("rm-search-peoplefinder"); + finderDiv.innerHTML = response.serverResponse.responseText; + + // Create the Add User dialog + this.widgets.addUserPanel = Alfresco.util.createYUIPanel("rm-peoplepicker"); + + // Find the People Finder by container ID + this.modules.searchPeopleFinder = Alfresco.util.ComponentManager.get("rm-search-peoplefinder"); + + // Set the correct options for our use + this.modules.searchPeopleFinder.setOptions( + { + viewMode: Alfresco.PeopleFinder.VIEW_MODE_COMPACT, + singleSelectMode: true + }); + + // Make sure we listen for events when the user selects a person + YAHOO.Bubbling.on("personSelected", this.onPersonSelected, this); + + YAHOO.lang.later(100, this, function() + { + // Show the panel + this.widgets.addUserPanel.show(); + }); + }, + + /** + * Event handler for add group button + * + * @method onAddGroup + * @param {e} Event object + */ + onAddGroup: function RM_UsersAndGroups_onAddGroup(e) + { + if (this.widgets.addGroupPanel) + { + this.modules.searchGroupFinder.clearResults(); + this.widgets.addGroupPanel.show(); + } + else + { + // Load in the Group Finder component from the server + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/group-finder", + dataObj: + { + htmlid: "rm-search-groupfinder" + }, + successCallback: + { + fn: this.onGroupFinderLoaded, + scope: this + }, + failureMessage: this.msg("message.load-groupFinder-failure"), + execScripts: true + }); + } + }, + + /** + * Removes a user or group from a role. + * + * @param objectId The id to a user (userName) or a group (fullName) + * @param roleId The id of the role that the object shall be removed from + * @param successMessage Message to display if the request is successful + * @param failureMessage Message to display if the request fails + * @param displayPromptTitle Title for the display prompt + * @param displayPromptText Text for the display prompt + */ + _removeFromRole: function RM_UsersAndGroups__removeFromRole(objectId, roleId, successMessage, failureMessage, displayPromptTitle, displayPromptText) + { + var me = this; + + Alfresco.util.PopupManager.displayPrompt( + { + title: displayPromptTitle, + text: displayPromptText, + buttons: [ + { + text: this.msg("button.yes"), + handler: function RM_UsersAndGroups_remove_confirmYes() + { + this.destroy(); + + Alfresco.util.Ajax.request( + { + method: Alfresco.util.Ajax.DELETE, + // FIXME: Use "/api/rm/{store_type}/{store_id}/{id}/roles/{roleId}/authorities/{authorityName}" See RM-3968 + url: Alfresco.constants.PROXY_URI + "api/rm/roles/" + encodeURIComponent(roleId) + "/authorities/" + encodeURIComponent(objectId), + successCallback: + { + fn: function(o) + { + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: successMessage + }); + + // Update list + me.updateRolesList(); + }, + scope: this + }, + failureMessage: failureMessage + }); + } + }, + { + text: this.msg("button.no"), + handler: function RM_UsersAndGroups_remove_confirmNo() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Event handler for remove group button + * + * @method onRemoveGroup + * @param {e} Event object + */ + onRemoveGroup: function RM_UsersAndGroups_onRemoveGroup(e) + { + var groupId = this.options.selectedGroupId, + roleId = this.options.selectedRoleId, + role = this.roles[roleId], + groupName = Alfresco.util.findInArray(role.assignedGroups, groupId, "name")["displayLabel"], + successMessage = this.msg("message.removegroup-success", groupName), + failureMessage = this.msg("message.removegroup-failure", groupName), + displayPromptTitle = this.msg("message.confirm.removegroup.title"), + displayPromptText = this.msg("message.confirm.removegroup", groupName); + + this._removeFromRole(groupId, roleId, successMessage, failureMessage, displayPromptTitle, displayPromptText); + }, + + /** + * Event handler for add user button + * + * @method onAddUser + * @param {e} Event object + */ + onAddUser: function RM_UsersAndGroups_onAddUser(e) + { + if (this.widgets.addUserPanel) + { + this.modules.searchPeopleFinder.clearResults(); + this.widgets.addUserPanel.show(); + } + else + { + // Load in the People Finder component from the server + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/people-finder", + dataObj: + { + htmlid: "rm-search-peoplefinder" + }, + successCallback: + { + fn: this.onPeopleFinderLoaded, + scope: this + }, + failureMessage: this.msg("message.load-peopleFinder-failure"), + execScripts: true + }); + } + }, + + /** + * Event handler for remove user button + * + * @method onRemoveUser + * @param {e} Event object + */ + onRemoveUser: function RM_UsersAndGroups_onRemoveUser(e) + { + var userId = this.options.selectedUserId, + roleId = this.options.selectedRoleId, + successMessage = this.msg("message.removeuser-success", userId), + failureMessage = this.msg("message.removeuser-failure", userId), + displayPromptTitle = this.msg("message.confirm.removeuser.title"), + displayPromptText = this.msg("message.confirm.removeuser", userId); + + this._removeFromRole(userId, roleId, successMessage, failureMessage, displayPromptTitle, displayPromptText); + }, + + /** + * Helper function for 'onGroupSelect' and 'onUserSelect' to avoid code duplication. + * + * @method onGroupSelect + * @param {e} Event object + * @param {param} parameter used in the url (might be 'group' or 'user') + */ + _onSelect: function RM_UsersAndGroups__onSelect(e, param) + { + Event.stopEvent(e); + + var el = Event.getTarget(e), + urlParam = "&" + param + "Id="; + + // get the id of the element + var id = el.id.substring(param.length + 1); + + // add/update id value + var hash = window.location.hash; + if (hash.indexOf(urlParam) !== -1) + { + hash = hash.replace(new RegExp('(' + urlParam + ')[^\&]+'), '$1' + encodeURI(id)); + } + else + { + hash += urlParam + encodeURI(id); + } + window.location.assign(hash); + + if (param === "group") + { + this.updateSelectedGroupUI(id); + } + else if (param === "user") + { + this.updateSelectedUserUI(id); + } + else + { + throw "The paramter '" + param + "' is neither 'group' nor 'user'!"; + } + }, + + /** + * Event handler for group selection + * + * @method onGroupSelect + * @param {e} Event object + */ + onGroupSelect: function RM_UsersAndGroups_onGroupSelect(e) + { + // update groupId value + this._onSelect(e, "group"); + }, + + /** + * Event handler for user selection + * + * @method onUserSelect + * @param {e} Event object + */ + onUserSelect: function RM_UsersAndGroups_onUserSelect(e) + { + // update userId value + this._onSelect(e, "user"); + }, + + /** + * Helper to Array.sort() by the 'name' field of an object. + * + * @method _sortByName + * @return {Number} + * @private + */ + _sortByName: function RM_UsersAndGroups__sortByName(s1, s2) + { + var ss1 = s1.displayLabel.toLowerCase(), ss2 = s2.displayLabel.toLowerCase(); + return (ss1 > ss2) ? 1 : (ss1 < ss2) ? -1 : 0; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/dashlets/datasets.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/dashlets/datasets.css new file mode 100644 index 0000000000..8429233102 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/dashlets/datasets.css @@ -0,0 +1,19 @@ +.dataset-body +{ + padding: 10px; +} + +.dataset-label +{ + float: left; + margin-top: 0.5em; + padding-left: 0.5em; +} + +.dataset-not-rm-admin +{ + clear: both; + line-height: 1.4; + padding: 7px 9px; + color: red; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/dashlets/datasets.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/dashlets/datasets.js new file mode 100644 index 0000000000..cbc30e7299 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/dashlets/datasets.js @@ -0,0 +1,178 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +Alfresco.rm = Alfresco.rm || {}; +Alfresco.rm.dashlet = Alfresco.rm.dashlet || {}; + +/** + * Dashboard DataSet component. + * + * @namespace Alfresco + * @class Alfresco.rm.dashlet.DataSet + */ +(function() +{ + /** + * Dashboard DataSet constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.dashlet.DataSet} The new component instance + * @constructor + */ + Alfresco.rm.dashlet.DataSet = function DataSet_constructor(htmlId) + { + return Alfresco.rm.dashlet.DataSet.superclass.constructor.call(this, "Alfresco.rm.dashlet.DataSet", htmlId); + }; + + YAHOO.extend(Alfresco.rm.dashlet.DataSet, Alfresco.component.Base, + { + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function DataSet_onReady() + { + this.widgets.dataSets = Alfresco.util.createYUIButton(this, "dataSets", this.onDataSetSelected, + { + type: "menu", + menu: "dataSets-menu", + title: this.msg("dataSet.select.title"), + label: this.msg("dataSet.select.label") + " " + Alfresco.constants.MENU_ARROW_SYMBOL, + lazyloadmenu: false + }); + + this.widgets.importButton = Alfresco.util.createYUIButton(this, "import-button", this.onImportClicked, + { + disabled: true + }); + }, + + /** + * Data set selection handler. + * + * @method onDataSetSelected + * @param type {string} Event type + * @param args {object} Event arguments + */ + onDataSetSelected: function DataSet_onDataSetSelected(type, args) + { + var menuItem = args[1]; + if (menuItem) + { + if (menuItem.cfg.getProperty("disabled")) + { + this.widgets.dataSets.set("label", this.msg("dataSet.select.label")); + this.widgets.dataSets.value = undefined; + this.widgets.importButton.set("disabled", true); + } + else + { + this.widgets.dataSets.set("label", menuItem.cfg.getProperty("text")); + this.widgets.dataSets.value = menuItem.value; + this.widgets.importButton.set("disabled", false); + } + } + }, + + /** + * Import button click handler. + * + * @method onImportClicked + * @param type {string} Event type + * @param args {object} Event arguments + */ + onImportClicked: function DataSet_onDataSetSelected(type, args) + { + // Disable the import button + this.widgets.importButton.set("disabled", true); + + // Disable the menu button + this.widgets.dataSets.set("disabled", true); + + // Display a message while importing the test data + var waitMessage = Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("dataSet.message.importing"), + spanClass: "wait", + displayTime: 0 + }); + + // Call web-tier to perform data set import + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + "api/rma/datasets/" + this.widgets.dataSets.value + "?site=" + Alfresco.constants.SITE, + successCallback: + { + fn: function(response) + { + waitMessage.destroy(); + + if (response.json.success) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("dataSet.message.import-ok") + }); + + // Disable the menu item so it cannot be selected again + this.widgets.dataSets.get("selectedMenuItem").cfg.setProperty("disabled", true); + this.widgets.dataSets.set("label", this.msg("dataSet.select.label")); + this.widgets.dataSets.value = undefined; + // Enable the menu button + this.widgets.dataSets.set("disabled", false); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: response.json.message + }); + + // Enable the menu button + this.widgets.dataSets.set("disabled", false); + } + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + waitMessage.destroy(); + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("dataSet.message.import-fail") + }); + + // Enable the menu button + this.widgets.dataSets.set("disabled", false); + }, + scope: this + } + }); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-actions.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-actions.js new file mode 100644 index 0000000000..afd904e781 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-actions.js @@ -0,0 +1,74 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Document actions component - RM extensions. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DocumentActions + */ +(function() +{ + /** + * RecordsDocumentActions constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.DocumentActions} The new RecordsDocumentActions instance + * @constructor + */ + Alfresco.rm.component.DocumentActions = function(htmlId) + { + Alfresco.rm.component.DocumentActions.superclass.constructor.call(this, htmlId); + YAHOO.Bubbling.on("metadataRefresh", function() { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + window.location.reload(true); + }, this); + return this; + }; + + /** + * Extend from Alfresco.DocumentActions + */ + YAHOO.extend(Alfresco.rm.component.DocumentActions, Alfresco.DocumentActions); + + /** + * Augment prototype with RecordActions module, ensuring overwrite is enabled + */ + YAHOO.lang.augmentProto(Alfresco.rm.component.DocumentActions, Alfresco.rm.doclib.Actions, true); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.rm.component.DocumentActions.prototype, + { + doRefresh: function RecordsDocumentActions_doRefresh() + { + var url = 'rm/components/document-details/document-actions?nodeRef={nodeRef}&container={containerId}'; + url += this.options.siteId ? '&site={siteId}' : ''; + this.refresh(url); + } + }, true); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-references.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-references.css new file mode 100644 index 0000000000..59a98f2112 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-references.css @@ -0,0 +1,15 @@ +.document-references h2 .edit +{ + background-image: url(../../../components/images/edit-16.png); +} +.document-references p, +.document-references ul +{ + margin-bottom: 1em; +} +.document-references li +{ + margin: 1em 0; + padding: 1em 3em; + background: transparent url(../documentlibrary/images/record-32.png) no-repeat scroll 0 10px; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-references.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-references.js new file mode 100644 index 0000000000..7c6868a2ce --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-references.js @@ -0,0 +1,104 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Document actions component - RM extensions. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DocumentReferences + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * RecordsDocumentReferences constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.DocumentReferences} The new RecordsDocumentReferences instance + * @constructor + */ + Alfresco.rm.component.DocumentReferences = function(htmlId) + { + Alfresco.rm.component.DocumentReferences.superclass.constructor.call(this, "Alfresco.rm.component.DocumentReferences", htmlId); + YAHOO.Bubbling.on("metadataRefresh", this.doRefresh, this); + return this; + }; + + /** + * Extend from Alfresco.DocumentActions + */ + YAHOO.extend(Alfresco.rm.component.DocumentReferences, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * The nodeRef to the object that owns the disposition schedule that is configured + * + * @property nodeRef + * @type Alfresco.util.NodeRef + */ + nodeRef: null, + + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: null, + + /** + * Current containerId. + * + * @property containerId + * @type string + */ + containerId: null + }, + + doRefresh: function() + { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + + var url = 'config/components/document-details/document-references?nodeRef={nodeRef}&container={containerId}'; + url += this.options.siteId ? '&site={siteId}' : ''; + + this.refresh(url); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-versions.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-versions.css new file mode 100644 index 0000000000..2b2a353e03 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-versions.css @@ -0,0 +1,10 @@ +.document-versions .version-panel-left .document-recorded-version-history +{ + /* FIXME: Change image + See RM-RM-3967 */ + background-image: url("../documentlibrary/images/record-16.png"); + background-position: center; + background-repeat: no-repeat; + display: block; + padding-top: 25px; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-versions.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-versions.js new file mode 100644 index 0000000000..04dd755e24 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/document-versions.js @@ -0,0 +1,130 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Document Details Version component. + * + * Overrides the getDocumentVersionMarkup function to add RM specific information + * and redefines dataSourceURLStem + * + * @namespace Alfresco.rm + * @class Alfresco.rm.DocumentVersions + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $userProfileLink = Alfresco.util.userProfileLink, + $userAvatar = Alfresco.Share.userAvatar; + + /** + * RM DocumentVersions constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.DocumentVersions} The new component instance + * @constructor + */ + Alfresco.rm.DocumentVersions = function RM_DocumentVersions_constructor(htmlId) + { + Alfresco.rm.DocumentVersions.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.DocumentVersions, Alfresco.DocumentVersions, + { + /** + * The data source URL stem + * + * @property dataSourceURLStem + * @type string + */ + dataSourceURLStem: Alfresco.constants.PROXY_URI + "api/rm/rm-version", + + /** + * Builds and returns the markup for a version. + * + * @method getDocumentVersionMarkup + * @param doc {Object} The details for the document + */ + getDocumentVersionMarkup: function RM_DocumentVersions_getDocumentVersionMarkup(doc) + { + var downloadURL = Alfresco.constants.PROXY_URI + 'api/node/content/' + doc.nodeRef.replace(":/", "") + '/' + encodeURIComponent(doc.name) + '?a=true', + html = ''; + + html += '
' + html += ' ' + $html(doc.label) + ''; + if (Alfresco.util.isValueSet(doc.recordNodeRef, false)) + { + html += ''; + } + html += '
'; + html += '
'; + html += '

'; + if (doc.isRecordedVersionDestroyed) + { + html += this.msg("label.destroyed-version"); + } + else + { + html += $html(doc.name); + } + html += '

'; + html += ' '; + if (doc.isRecordedVersionDestroyed == false) + { + if (this.options.allowNewVersionUpload) + { + html += '  '; + } + html += '  '; + html += '  '; + } + html += ' '; + html += '
'; + html += '
'; + html += '
' + html += $userAvatar(doc.creator.userName, 32); + html += '
'; + html += '
'; + html += $userProfileLink(doc.creator.userName, doc.creator.firstName + ' ' + doc.creator.lastName, 'class="theme-color-1"') + ' '; + html += Alfresco.util.relativeTime(Alfresco.util.fromISO8601(doc.createdDateISO)) + '
'; + html += ((doc.description || "").length > 0) ? $html(doc.description, true) : '(' + this.msg("label.noComment") + ')'; + html += '
'; + html += '
'; + html += '
'; + + html += '
'; + return html; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/relationships.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/relationships.css new file mode 100644 index 0000000000..8129f3f07a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/document-details/relationships.css @@ -0,0 +1,130 @@ +#rm-relationships-table +{ + background-color: rgba(250, 250, 250, 1); + border-bottom: 1px solid lightgray; + border-top: 1px solid lightgray; + margin-top: 20px; +} + +.rm-relationship-toolbar-label +{ + font-size: 123.1%; + padding: 5px 0; +} + +#RM_RELATIONSHIP_TOOLBAR +{ + border-bottom: 1px solid #d3d3d3; + padding-bottom: 0.12em; + padding-top: 0.1em; +} + +#RM_RELATIONSHIP_TOOLBAR .left-widgets .horizontal-widget +{ + margin-left: -2px; + margin-top: 3px; +} + +.alfresco-buttons-AlfButton.rm-relationship-toolbar-add-button +{ + background-color: transparent; + border-color: transparent; + margin-right: 5px; +} + +.rm-relationship-toolbar-add-button span[role=button] +{ + background: url("../../../../components/images/add-icon-16.png") no-repeat scroll 1px 1px transparent; + font-size: 12px; + margin-left: -5px; + margin-right: -7px; + padding-left: 20px; +} + +.rm-relationship-table-relationship-name .value +{ + font-size: 110.1%; +} + +.rm-relationship-table-record-name +{ + font-size: 123.1%; + text-decoration: none; +} + +.rm-relationship-table-record-name:hover +{ + text-decoration: underline; +} + +.rm-relationship-table-record-identifier .label, +.rm-relationship-table-record-version .label +{ + color: #606060; +} + +.alfresco-buttons-AlfButton.rm-relationship-select-record-dialog-up-button +{ + margin-bottom: -25px; + margin-left: 5px; + margin-top: 20px; +} + +#RM_RELATIONSHIP_SELECT_RECORD_DIALOG_PICKED_ITEM_CONTENT +{ + width: 400px; + max-width: 400px; +} + +#RM_RELATIONSHIP_SELECT_RECORD_DIALOG_DOCUMENT_LIST_CONTENT +{ + margin-top: 22px; + width: 400px; + max-width: 400px; + position:relative; +} + +.rm-relationship-select-record-dialog-container +{ + margin-top: -20px; +} + +#ADD_RELATIONSHIP_DIALOG .rm-relationship-select-record-form-control +{ + margin-left: 20em; + margin-top: -40px; + margin-bottom: 20px; + text-align: right; +} + +.rm-relationship-select-record-form-info, +.rm-relationship-select-record-form-info-selected +{ + background-color: rgba(250, 250, 250, 1); + border-color: lightgray; + border-style: solid; + border-width: 1px 0; +} + +.rm-relationship-select-record-form-info-selected +{ + margin-top: 20px; +} + +.rm-relationship-select-record-form-select +{ + margin-top: 17px; +} + +.alfresco-forms-controls-BaseFormControl.rm-relationship-select-record-form-select .control table.dijitTextBoxFocused, +.alfresco-forms-controls-BaseFormControl.rm-relationship-select-record-form-select .control table.dijitActive, +.alfresco-forms-controls-BaseFormControl.rm-relationship-select-record-form-select .control table.dijitFocused, +.alfresco-forms-controls-BaseFormControl.rm-relationship-select-record-form-select .control table.dijitSelectHover, +.alfresco-buttons-AlfButton.rm-relationship-select-record-button.dijitButton.dijitButtonFocused.dijitFocused +{ + border-color: rgb(204, 204, 204); +} + +.alfresco-buttons-AlfButton.rm-relationship-select-record-button { + margin-right:-5px; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions.js new file mode 100644 index 0000000000..550b3b9001 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions.js @@ -0,0 +1,1920 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Document Library Actions module + * + * @namespace Alfresco.doclib + * @class Alfresco.rm.doclib.Actions + */ +(function() +{ + /** + * Alfresco.rm.doclib.Actions namespace + */ + Alfresco.rm.doclib.Actions = {}; + + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths, + $siteURL = Alfresco.util.siteURL, + $isValueSet = Alfresco.util.isValueSet; + + Alfresco.rm.doclib.Actions.prototype = + { + /** + * The urls to be used when creating links in the action cell + * + * @method getActionUrls + * @param record {object} Object literal representing the node + * @param siteId {string} Optional siteId override for site-based locations + * @return {object} Object literal containing URLs to be substituted in action placeholders + */ + getActionUrls: function RDLA_getActionUrls(record, siteId) + { + if (record.jsNode.properties.rma_rootNodeRef === undefined) { + var thisfilePlan = ''; + } + else + { + + var thisfilePlan = new Alfresco.util.NodeRef(record.jsNode.properties.rma_rootNodeRef); + } + + var jsNode = record.jsNode, + nodeRef = jsNode.isLink ? jsNode.linkedNode.nodeRef : jsNode.nodeRef, + strNodeRef = nodeRef.toString(), + nodeRefUri = nodeRef.uri, + contentUrl = jsNode.contentURL, + siteObj = YAHOO.lang.isString(siteId) ? { site: siteId } : null, + fnPageURL = Alfresco.util.bind(function(page) + { + return Alfresco.util.siteURL(page, siteObj); + }, this), + filePlan = thisfilePlan, + filePlanUri = filePlan.uri, + filePlanId = filePlan.id; + + return ( + { + downloadUrl: $combine(Alfresco.constants.PROXY_URI, contentUrl) + "?a=true", + viewUrl: $combine(Alfresco.constants.PROXY_URI, contentUrl) + "\" target=\"_blank", + documentDetailsUrl: fnPageURL("document-details?nodeRef=" + strNodeRef), + folderDetailsUrl: fnPageURL("folder-details?nodeRef=" + strNodeRef), + editMetadataUrl: fnPageURL("edit-metadata?nodeRef=" + strNodeRef), + inlineEditUrl: fnPageURL("inline-edit?nodeRef=" + strNodeRef), + recordSeriesDetailsUrl: fnPageURL("rm-record-series-details?nodeRef=" + nodeRef), + recordCategoryDetailsUrl: fnPageURL("rm-record-category-details?nodeRef=" + nodeRef), + recordFolderDetailsUrl: fnPageURL("rm-record-folder-details?nodeRef=" + nodeRef), + transfersZipUrl: $combine(Alfresco.constants.PROXY_URI, "api/node", filePlanUri, "transfers", nodeRef.id), + managePermissionsUrl: fnPageURL("manage-permissions?nodeRef=" + nodeRef + "&itemName=" + encodeURIComponent(record.displayName) + "&nodeType=" + jsNode.type + "&filePlanId=" + filePlanId) + }); + }, + + /** + * Public Action implementations. + * + * NOTE: Actions are defined in alphabetical order by convention. + */ + + /** + * Accession action. + * + * @method onActionAccession + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionAccession: function RDLA_onActionAccession(assets) + { + this._rmAction("message.accession", assets, "accession", null, + { + success: + { + callback: + { + fn: this._transferAccessionComplete, + obj: + { + displayName: YAHOO.lang.isArray(assets) ? this.msg("message.multi-select", assets.length) : $html(assets.displayName) + }, + scope: this + } + } + }); + }, + + /** + * Accession Complete action. + * + * @method onActionAccessionComplete + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionAccessionComplete: function RDLA_onActionAccessionComplete(assets) + { + this._rmAction("message.accession-complete", assets, "accessionComplete"); + }, + + /** + * Copy single document or folder. + * + * @method onActionCopyTo + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionCopyTo: function RDLA_onActionCopyTo(assets) + { + this._copyMoveLinkFileTo("copy", assets); + }, + + /** + * Copy single unfiled document or folder. + * + * @method onActionCopyUnfiledTo + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionCopyUnfiledTo: function RDLA_onActionCopyTo(assets) + { + this._copyMoveLinkFileToUnfiled("copy", assets); + }, + + /** + * Copy record. + * + * @method onActionCopyRecordTo + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionCopyRecordTo: function RDLA_onActionCopyTo(assets) + { + this.onActionCopyTo(assets); + }, + + /** + * Copy unfiled record. + * + * @method onActionCopyUnfiledRecordTo + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionCopyUnfiledRecordTo: function RDLA_onActionCopyTo(assets) + { + this.onActionCopyUnfiledTo(assets); + }, + + /** + * Copy record folder. + * + * @method onActionCopyRecordFolderTo + * @param assets {object} Object literal representing one or more record folder(s) to be actioned + */ + onActionCopyRecordFolderTo: function RDLA_onActionCopyTo(assets) + { + this.onActionCopyTo(assets); + }, + + /** + * Copy unfiled record folder. + * + * @method onActionCopyUnfiledRecordFolderTo + * @param assets {object} Object literal representing one or more record folder(s) to be actioned + */ + onActionCopyUnfiledRecordFolderTo: function RDLA_onActionCopyUnfiledRecordFolderTo(assets) + { + this.onActionCopyUnfiledTo(assets); + }, + + /** + * Copy record category. + * + * @method onActionCopyRecordCategoryTo + * @param assets {object} Object literal representing one or more record category (categories) to be actioned + */ + onActionCopyRecordCategoryTo: function RDLA_onActionCopyTo(assets) + { + this.onActionCopyTo(assets); + }, + + /** + * Link single document or folder. + * + * @method onActionLinkTo + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionLinkTo: function RDLA_onActionLinkTo(assets) + { + this._copyMoveLinkFileTo("link", assets); + }, + + /** + * Unlink record from current record folder + * + * @method onActionUnlinkFrom + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionUnlinkFrom: function RDLA_onActionUnlinkFrom(assets) + { + var me = this; + + // Show the first confirmation dialog + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.confirm.unlink.title"), + text: this.msg("message.confirm.unlink.text"), + buttons: [ + { + text: this.msg("button.ok"), + handler: function RDLA_onActionUnlinkFrom_confirm_ok() + { + // Hide the confirmation dialog + this.destroy(); + + me._rmAction("message.unlink", assets, "unlinkFrom", + { + "recordFolder": me.doclistMetadata.parent.nodeRef + }); + + }, + isDefault: true + }, + { + text: this.msg("button.cancel"), + handler: function RDLA_onActionUnlinkFrom_confirm_cancel() + { + // Hide the confirmation dialog + this.destroy(); + } + }] + }); + + }, + + /** + * Move single document or folder. + * + * @method onActionMoveTo + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionMoveTo: function RDLA_onActionMoveTo(assets) + { + this._copyMoveLinkFileTo("move", assets); + }, + + /** + * Move single unfiled document or folder. + * + * @method onActionMoveToUnfiled + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionMoveToUnfiled: function RDLA_onActionMoveToUnfiled(assets) + { + this._copyMoveLinkFileToUnfiled("move", assets); + }, + + /** + * Move unfiled document + * + * @method onActionMoveUnfiledRecordTo + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionMoveUnfiledRecordTo: function RDLA_onActionMoveUnfiledRecordTo(assets) + { + this.onActionMoveToUnfiled(assets); + }, + + /** + * Move unfiled record folder + * + * @method onActionMoveUnfiledRecordTo + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionMoveUnfiledRecordFolderTo: function RDLA_onActionMoveUnfiledRecordFolderTo(assets) + { + this.onActionMoveToUnfiled(assets); + }, + + /** + * Move record + * + * @method onActionMoveRecordTo + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionMoveRecordTo: function RDLA_onActionMoveTo(assets) + { + this.onActionMoveTo(assets); + }, + + /** + * Move record folder + * + * @method onActionMoveRecordFolderTo + * @param assets {object} Object literal representing one or more record folder(s) to be actioned + */ + onActionMoveRecordFolderTo: function RDLA_onActionMoveTo(assets) + { + this.onActionMoveTo(assets); + }, + + /** + * Move record category + * + * @method onActionMoveRecordCategoryTo + * @param assets {object} Object literal representing one or more record category (categories) to be actioned + */ + onActionMoveRecordCategoryTo: function RDLA_onActionMoveTo(assets) + { + this.onActionMoveTo(assets); + }, + + /** + * Delete record + * + * @method onActionDeleteRecord + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionDeleteRecord: function RDLA_onActionDeleteRecord(assets) + { + this.onActionDelete(assets); + }, + + /** + * Delete record folder + * + * @method onActionDeleteRecordFolder + * @param assets {object} Object literal representing one or more record folder(s) to be actioned + */ + onActionDeleteRecordFolder: function RDLA_onActionDeleteRecordFolder(assets) + { + this.onActionDelete(assets); + }, + + /** + * Delete record category + * + * @method onActionDeleteRecordCategory + * @param assets {object} Object literal representing one or more record category (categories) to be actioned + */ + onActionDeleteRecordCategory: function RDLA_onActionDeleteRecordCategory(assets) + { + this.onActionDelete(assets); + }, + + /** + * File single document. + * + * @method onActionFileTo + * @param assets {object} Object literal representing one or more file(s) to be actioned + */ + onActionFileTo: function RDLA_onActionFileTo(assets) + { + this._copyMoveLinkFileTo("file", assets); + }, + + /** + * Declare Record action. + * Special case handling due to the ability to jump to the Edit Metadata page if the action failed. + * + * @method onActionDeclare + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionDeclare: function RDLA_onActionDeclare(assets) + { + var displayName = $html(assets.displayName), + editMetadataUrl = Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + "/edit-metadata?nodeRef=" + assets.nodeRef; + + this._rmAction("message.declare", assets, "declareRecord", null, + { + success: + { + event: + { + name: "metadataRefresh" + }, + callback: + { + fn: function RDLA_oAD_success(data) + { + var results = data.json.results; + if (results && results != null && results[data.config.dataObj.nodeRef] === "missingProperties") + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.declare.failure", displayName), + text: this.msg("message.declare.failure.more"), + buttons: [ + { + text: this.msg("actions.edit-details"), + handler: function RDLA_oAD_failure_editDetails() + { + window.location = editMetadataUrl; + this.destroy(); + }, + isDefault: true + }, + { + text: this.msg("button.cancel"), + handler: function RDLA_oAD_failure_cancel() + { + this.destroy(); + } + }] + }); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.declare.success", displayName) + }); + } + }, + scope: this + } + } + }); + }, + + /** + * Destroy action. + * + * @method onActionDestroy + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionDestroy: function RDLA_onActionDestroy(assets) + { + // If "Destroy" was triggered from the documentlist assets contain an object instead of an array + var me = this, + noOfAssets = YAHOO.lang.isArray(assets) ? assets.length : 1, + text; + + if (noOfAssets == 1) + { + text = this.msg("message.confirm.destroy", $html((YAHOO.lang.isArray(assets) ? assets[0].displayName : assets.displayName))); + } + else + { + text = this.msg("message.confirm.destroyMultiple", noOfAssets); + } + + // Show the first confirmation dialog + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.confirm.destroy.title"), + text: text, + buttons: [ + { + text: this.msg("button.ok"), + handler: function RDLA_onActionDestroy_confirm_ok() + { + // Hide the first confirmation dialog + this.destroy(); + + // Display the second confirmation dialog + text = (noOfAssets == 1 ? me.msg("message.confirm2.destroy") : me.msg("message.confirm2.destroyMultiple")); + Alfresco.util.PopupManager.displayPrompt( + { + title: me.msg("message.confirm2.destroy.title"), + text: text, + buttons: [ + { + text: me.msg("button.ok"), + handler: function RDLA_onActionDestroy_confirm2_ok() + { + // Hide the second confirmation dialog + this.destroy(); + + // Call the destroy action + me._rmAction("message.destroy", assets, "destroy", null, + { + success: + { + callback: + { + fn: function() + { + Alfresco.util.PopupManager.displayMessage( + { + text: me.msg("message.destroy.success", $html(assets.displayName)) + }); + + if (me.actionsView === "details") + { + var encodedPath = me.currentPath.length > 1 ? "?path=" + encodeURIComponent(me.currentPath) : ""; + window.location = Alfresco.util.siteURL("documentlibrary" + encodedPath); + } + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + }, + scope: this + } + } + }); + }, + isDefault: true + }, + { + text: me.msg("button.cancel"), + handler: function RDLA_onActionDestroy_confirm2_cancel() + { + // Hide the second confirmation dialog + this.destroy(); + } + }] + }); + + }, + isDefault: true + }, + { + text: this.msg("button.cancel"), + handler: function RDLA_onActionDestroy_confirm_cancel() + { + // Hide the first confirmation dialog + this.destroy(); + } + }] + }); + + }, + + _getRmUserInput: function RDLA_getRmUserInput(config) + { + if (Alfresco.util.PopupManager.defaultGetUserInputConfig.buttons[0].text === null) + { + /** + * This default value could not be set at instantion time since the + * localized messages weren't present at that time + */ + Alfresco.util.PopupManager.defaultGetUserInputConfig.buttons[0].text = Alfresco.util.message("button.ok", this.name); + } + if (Alfresco.util.PopupManager.defaultGetUserInputConfig.buttons[1].text === null) + { + Alfresco.util.PopupManager.defaultGetUserInputConfig.buttons[1].text = Alfresco.util.message("button.cancel", this.name); + } + + // Merge users config and the default config and check manadatory properties + var c = YAHOO.lang.merge(Alfresco.util.PopupManager.defaultGetUserInputConfig, config); + + // Create the SimpleDialog that will display the text + var prompt = new YAHOO.widget.SimpleDialog("userInput", + { + close: c.close, + constraintoviewport: c.constraintoviewport, + draggable: c.draggable, + effect: c.effect, + modal: c.modal, + visible: c.visible, + zIndex: this.zIndex++ + }); + + // Show the title if it exists + if (c.title) + { + prompt.setHeader($html(c.title)); + } + + // Generate the HTML mark-up if not overridden + var html = c.html, + id = Alfresco.util.generateDomId(); + + if (html === null) + { + html = ""; + if (c.text) + { + html += '
'; + } + if (c.input == "textarea") + { + html += ''; + } + else if (c.input == "text") + { + html += ''; + } + } + prompt.setBody(html); + + // Show the icon if it exists + if (c.icon) + { + prompt.cfg.setProperty("icon", c.icon); + } + + // Add the buttons to the dialog + if (c.buttons) + { + if (c.okButtonText) + { + // Override OK button label + c.buttons[0].text = c.okButtonText; + } + + // Default handler if no custom button passed-in + if (typeof config.buttons == "undefined" || typeof config.buttons[0] == "undefined") + { + // OK button click handler + c.buttons[0].handler = { + fn: function(event, obj) + { + // Grab the input, destroy the pop-up, then callback with the value + var value = null; + if (YUIDom.get(obj.id)) + { + var inputEl = YUIDom.get(obj.id); + value = YAHOO.lang.trim(inputEl.value || inputEl.text); + } + this.destroy(); + if (obj.callback.fn) + { + obj.callback.fn.call(obj.callback.scope || window, value, obj.callback.obj); + } + }, + obj: + { + id: id, + callback: c.callback + } + }; + } + prompt.cfg.queueProperty("buttons", c.buttons); + } + + // Add the dialog to the dom, center it and show it (unless flagged not to). + prompt.render(document.body); + + // Make sure ok button only is enabled if textfield contains content + if (c.html === null && prompt.getButtons().length > 0) + { + // Make sure button only is disabled if textinput has a proper value + var okButton = prompt.getButtons()[0]; + YAHOO.util.Event.addListener(id, "keyup", function(event, okButton) + { + okButton.set("disabled", YAHOO.lang.trim(this.value || this.text || "").length == 0); + }, okButton); + okButton.set("disabled", YAHOO.lang.trim(c.value).length == 0) + } + + // Center and display + prompt.center(); + if (c.initialShow) + { + prompt.show(); + } + + // If a default value was given, set the selectionStart and selectionEnd properties + if (c.html === null && c.value !== "") + { + YUIDom.get(id).selectionStart = 0; + YUIDom.get(id).selectionEnd = c.value.length; + } + + // Register the ESC key to close the panel + var escapeListener = new YAHOO.util.KeyListener(document, + { + keys: YAHOO.util.KeyListener.KEY.ESCAPE + }, + { + fn: function(id, keyEvent) + { + this.destroy(); + }, + scope: prompt, + correctScope: true + }); + escapeListener.enable(); + + if (YUIDom.get(id)) + { + YUIDom.get(id).focus(); + } + + return prompt; + }, + + /** + * Edit Disposition As Of Date action. + * + * @method onActionEditDispositionAsOf + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionEditDispositionAsOf: function RDLA_onActionEditDispositionAsOf(assets) + { + var calendarId = Alfresco.util.generateDomId(), + properties = assets.jsNode.properties, + panel, + calendar; + + var asOfDate = Alfresco.util.fromISO8601(properties.rma_recordSearchDispositionActionAsOf.iso8601), + + panel = this._getRmUserInput( + { + title: this.msg("message.edit-disposition-as-of-date.title"), + html: '
', + initialShow: false, + okButtonText: this.msg("button.update"), + callback: + { + fn: function RDLA_onActionEditDispositionAsOf_callback(unused, cal) + { + this._rmAction("message.edit-disposition-as-of-date", assets, "editDispositionActionAsOfDate", + { + asOfDate: + { + iso8601: Alfresco.util.toISO8601(cal.getSelectedDates()[0]) + } + }); + }, + scope: this + } + }); + + var page = (asOfDate.getMonth() + 1) + "/" + asOfDate.getFullYear(), + selected = (asOfDate.getMonth() + 1) + "/" + asOfDate.getDate() + "/" + asOfDate.getFullYear(); + calendar = new YAHOO.widget.Calendar(calendarId, + { + iframe: false + }); + calendar.cfg.setProperty("pagedate", page); + calendar.cfg.setProperty("selected", selected); + calendar.render(); + calendar.show(); + // Center the calendar + Dom.setStyle(calendarId, "margin", "0 2em"); + // Only now can we set the panel button's callback reference to the calendar, as it was undefined on panel creation + panel.cfg.getProperty("buttons")[0].handler.obj.callback.obj = calendar; + panel.center(); + panel.show(); + }, + + /** + * Edit Hold Details action. + * + * @method onActionEditHoldDetails + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionEditHoldDetails: function RDLA_onActionEditHoldDetails(assets) + { + var properties = assets.jsNode.properties; + + Alfresco.util.PopupManager.getUserInput( + { + title: this.msg("message.edit-hold.title"), + text: this.msg("message.edit-hold.reason.label"), + value: properties.rma_holdReason, + okButtonText: this.msg("button.update"), + callback: + { + fn: function RDLA_onActionEditHoldDetails_callback(value) + { + this._rmAction("message.edit-hold", assets, "editHoldReason", + { + "reason": value + }); + }, + scope: this + } + }); + }, + + /** + * Edit Review As Of Date action. + * + * @method onActionEditReviewAsOf + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionEditReviewAsOf: function RDLA_onActionEditReviewAsOf(assets) + { + var properties = assets.jsNode.properties, + asOfDate = new Date(); + + if (properties == null) + { + nodeId = Alfresco.util.NodeRef(assets.nodeRef); + + url = Alfresco.constants.PROXY_URI + + "slingshot/rmsearch/rm" + + '?site=rm&query=(ASPECT:"rma:record" AND ASPECT:"rma:declaredRecord") AND (rma:identifier:' + + nodeId.id + ') AND NOT ASPECT:"rma:versionedRecord"'; + + YAHOO.util.Connect.asyncRequest("GET", url, + { + success: function(resp) + { + item = YAHOO.lang.JSON.parse(resp.responseText); + if (null != item.items[0].properties.rma_reviewAsOf) + { + asOfDate = new Date(item.items[0].properties.rma_reviewAsOf); + var page = (asOfDate.getMonth() + 1) + "/" + asOfDate.getFullYear(), + selected = (asOfDate.getMonth() + 1) + "/" + asOfDate.getDate() + "/" + asOfDate.getFullYear(); + calendar.cfg.setProperty("pagedate", page); + calendar.cfg.setProperty("selected", selected); + calendar.render(); + } + } + }, null); + } + else + { + asOfDate = Alfresco.util.fromISO8601(properties.rma_reviewAsOf.iso8601); + } + + var calendarId = Alfresco.util.generateDomId(), + panel, + calendar; + + panel = this._getRmUserInput( + { + title: this.msg("message.edit-review-as-of-date.title"), + html: '
', + initialShow: false, + okButtonText: this.msg("button.update"), + callback: + { + fn: function RDLA_onActionEditReviewAsOf_callback(unused, cal) + { + this._rmAction("message.edit-review-as-of-date", assets, "editReviewAsOfDate", + { + asOfDate: + { + iso8601: Alfresco.util.toISO8601(cal.getSelectedDates()[0]) + } + }); + }, + scope: this + } + }); + + var page = (asOfDate.getMonth() + 1) + "/" + asOfDate.getFullYear(), + selected = (asOfDate.getMonth() + 1) + "/" + asOfDate.getDate() + "/" + asOfDate.getFullYear(); + + calendar = new YAHOO.widget.Calendar(calendarId, + { + iframe: false + }); + calendar.cfg.setProperty("pagedate", page); + calendar.cfg.setProperty("selected", selected); + calendar.render(); + calendar.show(); + // Center the calendar + Dom.setStyle(calendarId, "margin", "0 2em"); + // Only now can we set the panel button's callback reference to the calendar, as it was undefined on panel creation + panel.cfg.getProperty("buttons")[0].handler.obj.callback.obj = calendar; + panel.center(); + panel.show(); + }, + + /** + * Export action. + * + * @method onActionExport + * @param assets {array} Array representing one or more file(s) or folder(s) to be exported + */ + onActionExport: function RDLA_onActionExport(assets) + { + // Save the nodeRefs + var nodeRefs = []; + for (var i = 0, ii = assets.length; i < ii; i++) + { + nodeRefs.push(assets[i].nodeRef); + } + + // Open the export dialog + if (!this.modules.exportDialog) + { + // Load if for the first time + this.modules.exportDialog = new Alfresco.module.SimpleDialog(this.id + "-exportDialog").setOptions( + { + width: "30em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/export", + actionUrl: Alfresco.constants.PROXY_URI + "api/rma/admin/export", + firstFocus: this.id + "-exportDialog-acp", + doBeforeFormSubmit: + { + fn: function RDLA_onActionExport_SimpleDialog_doBeforeFormSubmit() + { + // Close dialog now since no callback is provided since we are submitting in a hidden iframe. + this.modules.exportDialog.hide(); + }, + scope: this + } + }); + } + + // doBeforeDialogShow needs re-registering each time as nodeRefs array is dynamic + this.modules.exportDialog.setOptions( + { + clearForm: true, + doBeforeDialogShow: + { + fn: function RDLA_onActionExport_SimpleDialog_doBeforeDialogShow(p_config, p_simpleDialog, p_obj) + { + // Set the hidden nodeRefs field to a comma-separated list of nodeRefs + Dom.get(this.id + "-exportDialog-nodeRefs").value = p_obj.join(","); + var failure = "window.parent.Alfresco.util.ComponentManager.get('" + this.id + "')"; + Dom.get(this.id + "-exportDialog-failureCallbackFunction").value = failure + ".onExportFailure"; + Dom.get(this.id + "-exportDialog-failureCallbackScope").value = failure; + }, + obj: nodeRefs, + scope: this + } + }); + + this.modules.exportDialog.show(); + }, + + + /** + * Called from the hidden iframe if the Export action fails. + * + * @method onExportFailure + * @param error {object} Object literal describing the error + * @param error.status.code {string} The http status code + * @param error.status.name {string} The error name + * @param error.status.description {string} A description of the error status + * @param error.message {string} An error message describing the error + */ + onExportFailure: function RDLA_onExportFailure(error) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.failure"), + text: error.message + }); + }, + + /** + * File report action. + * + * @method onActionFileReport + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + * @param owner {HTMLElement} The action html element + * @param type {string} The report type + */ + onActionFileReport: function RDLA_onActionFileReport(assets, owner, type) + { + if (!this.modules.fileReport) + { + this.modules.fileReport = new Alfresco.rm.module.FileReport(this.id + "-fileReport"); + } + + var selectedNodePath = ""; + if (this.modules.fileReport.selectedNode) + { + selectedNodePath = this.modules.fileReport.selectedNode.data.path; + } + + this.modules.fileReport.setOptions( + { + siteId: this.options.siteId, + containerId: this.options.containerId, + path: selectedNodePath, + assets: assets, + owner: owner, + type: type + }).showDialog(); + + var me = this; + this.modules.fileReport.onOK = function RDLA_onActionFileReport_onOK() + { + var destination; + + if (Dom.get(this.id + "-unfiled-records").checked == false) + { + destination = this.selectedNode.data.nodeRef; + } + else if (me.actionsView === "details") + { + destination = me.recordData.node.rmNode.unfiledRecordContainer; + } + else + { + destination = me.doclistMetadata.parent.rmNode.unfiledRecordContainer; + } + + me.onActionRecordsManagementRepoAction(this.options.assets, this.options.owner, + { + "reportType": this.options.type, + "destination": destination + }); + }; + }, + + /** + * Success callback for file report. + * + * @method fileReportSuccess + * @param data {object} Object literal containing ajax request and response + * @param obj {object} Caller-supplied object + *
+       *       obj.displayName {string} Filename or number of files submitted to the action.
+       *    
+ */ + fileReportSuccess: function RDLA_fileReportSuccess(data, obj) + { + // Hide the dialog + this.modules.fileReport.widgets.dialog.hide(); + + // Record name + var recordName = data.json.results[data.config.dataObj.nodeRef]; + + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.file-success", recordName) + }); + }, + + /** + * Failure callback for file report. + * + * @method fileReportFailure + * @param data {object} Object literal containing ajax request and response + * @param obj {object} Caller-supplied object + *
+       *       obj.displayName {string} Filename or number of files submitted to the action.
+       *    
+ */ + fileReportFailure: function RDLA_fileReportFailure(data, obj) + { + // Display error + var text = this.msg("message.file-failure"); + if(data.json && data.json.message) + { + text = data.json.message; + } + Alfresco.util.PopupManager.displayPrompt( + { + title: Alfresco.util.message("message.failure"), + text: text + }); + + // Enable dialog buttons again + this.modules.fileReport.widgets.okButton.set("disabled", false); + this.modules.fileReport.widgets.cancelButton.set("disabled", false); + }, + + /** + * File transport report action. + * + * @method onActionFileTransferReport + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + * @param owner {HTMLElement} The action html element + */ + onActionFileTransferReport: function RDLA_onActionFileTransferReport(assets, owner) + { + this.onActionFileReport(assets, owner, "rmr:transferReport"); + }, + + /** + * File destruction report action. + * + * @method onActionFileDestructionReport + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + * @param owner {HTMLElement} The action html element + */ + onActionFileDestructionReport: function RDLA_onActionFileDestructionReport(assets, owner) + { + this.onActionFileReport(assets, owner, "rmr:destructionReport"); + }, + + /** + * File hold report action. + * + * @method onActionFileHoldReport + * @param assets {object} Object literal representing one or more hold(s) to be actioned + * @param owner {HTMLElement} The action html element + */ + onActionFileHoldReport: function RDLA_onActionFileHoldReport(assets, owner) + { + this.onActionFileReport(assets, owner, "rmr:holdReport"); + }, + + /** + * Set Record Type + * + * @method onActionAddRecordMetadata + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionAddRecordMetadata: function RDLA_onActionAddRecordMetadata(assets) + { + // Open the set record type dialog + var addRecordMetadataWebscriptUrl = Alfresco.constants.PROXY_URI + "slingshot/doclib/action/aspects/node/" + assets.nodeRef.replace(":/", ""); + this.modules.addRecordMetadataDialog = new Alfresco.module.SimpleDialog(this.id + "-addRecordMetadataDialog").setOptions( + { + width: "30em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/add-record-metadata?nodeRef=" + encodeURIComponent(assets.nodeRef), + actionUrl: addRecordMetadataWebscriptUrl, + firstFocus: this.id + "-addRecordMetadataDialog-recordType", + onSuccess: + { + fn: function RDLA_onActionAddRecordMetadata_SimpleDialog_success(response) + { + // Fire event so compnents on page are refreshed + YAHOO.Bubbling.fire("metadataRefresh"); + } + } + }); + this.modules.addRecordMetadataDialog.show(); + }, + + /** + * Transfer action. + * + * @method onActionTransfer + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionTransfer: function RDLA_onActionTransfer(assets) + { + this._rmAction("message.transfer", assets, "transfer", null, + { + success: + { + callback: + { + fn: this._transferAccessionComplete, + obj: + { + displayName: YAHOO.lang.isArray(assets) ? this.msg("message.multi-select", assets.length) : $html(assets.displayName) + }, + scope: this + } + } + }); + }, + + /** + * View Audit log + * + * @method onActionViewAuditLog + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionViewAuditLog: function RDLA_onActionViewAuditLog(assets) + { + var openAuditLogWindow = function openAuditLogWindow() + { + return window.open(Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + '/rm-audit?nodeName='+ encodeURIComponent(assets.displayName) + '&nodeRef=' + assets.nodeRef.replace(':/',''), 'Audit_Log', 'resizable=yes,location=no,menubar=no,scrollbars=yes,status=yes,width=700,height=500'); + }; + // haven't yet opened window yet + if (!this.fullLogWindowReference) + { + this.fullLogWindowReference = openAuditLogWindow.call(this); + } + else + { + // window has been opened already and is still open, so focus and reload it. + if (!this.fullLogWindowReference.closed) + { + this.fullLogWindowReference.focus(); + this.fullLogWindowReference.location.reload(); + } + //had been closed so reopen window + else + { + this.fullLogWindowReference = openAuditLogWindow.call(this); + } + } + }, + + /** + * Private action helper functions + */ + + /** + * Copy/Move/Link/File To implementation. + * + * @method _copyMoveLinkFileTo + * @param mode {String} Operation mode: copy|move|link|file + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + * @private + */ + _copyMoveLinkFileTo: function RDLA__copyMoveLinkFileTo(mode, assets) + { + // Check mode is an allowed one + if (!mode in + { + copy: true, + move: true, + link: true, + file: true + }) + { + throw new Error("'" + mode + "' is not a valid Copy/Move/Link/File to mode."); + } + + if (!this.modules.copyMoveLinkFileTo) + { + this.modules.copyMoveLinkFileTo = new Alfresco.rm.module.CopyMoveLinkFileTo(this.id + "-copyMoveLinkFileTo"); + } + + this.modules.copyMoveLinkFileTo.setOptions( + { + mode: mode, + siteId: this.options.siteId, + containerId: this.options.containerId, + path: this.currentPath, + files: assets, + unfiled: false + }).showDialog(); + }, + + /** + * Copy/Move/Link/File To implementation for unfiled. + * + * @method _copyMoveLinkUnfi,edFileTo + * @param mode {String} Operation mode: copy|move|link|file + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + * @private + */ + + _copyMoveLinkFileToUnfiled: function RDLA__copyMoveLinkFileToUnfiled(mode, assets) + { + // Check mode is an allowed one + if (!mode in + { + copy: true, + move: true, + link: true, + file: true + }) + { + throw new Error("'" + mode + "' is not a valid Copy/Move/Link/File to mode."); + } + + if (!this.modules.copyMoveLinkFileTo) + { + this.modules.copyMoveLinkFileTo = new Alfresco.rm.module.CopyMoveLinkFileTo(this.id + "-copyMoveLinkFileTo"); + } + + this.modules.copyMoveLinkFileTo.setOptions( + { + mode: mode, + siteId: this.options.siteId, + containerId: this.options.containerId, + path: "/Unfiled Records", + files: assets, + unfiled: true + }).showDialog(); + }, + + /** + * Transfer and Accession action result processing. + * + * @method _transferAccessionComplete + * @param data {object} Object literal containing ajax request and response + * @param obj {object} Caller-supplied object + *
+       *       obj.displayName {string} Filename or number of files submitted to the action.
+       *    
+ * @private + */ + _transferAccessionComplete: function RDLA__transferAccession(data, obj) + { + var displayName = obj.displayName; + + /** + * Transfer / Accession container query success callback. + * + * @method fnTransferQuerySuccess + * @param data {object} Object literal containing ajax request and response + * @param obj {object} Caller-supplied object + */ + var fnTransferQuerySuccess = function RDLA_onActionTransfer_fnTransferQuerySuccess(data, obj) + { + // Check the transfer details to optionally show the PDF warning + if (data.json && data.json.transfer) + { + var transfer = data.json.transfer, + fileName = transfer.name, + accessionIndicator = transfer["rma:transferAccessionIndicator"], + pdfIndicator = transfer["rma:transferPDFIndicator"]; + + // If we're a Document Library, then swap to the transfers filter and highlight the newly-created transfer + if (this.name === "Alfresco.DocumentList") + { + var fnAfterUpdate = function RDLA_onActionTransfer_fnTransferQuerySuccess_fnAfterUpdate() + { + YAHOO.Bubbling.fire("highlightFile", + { + fileName: fileName + }); + + if (pdfIndicator) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.pdf-record-fonts.title"), + text: this.msg(accessionIndicator ? "message.pdf-record-fonts.accession" : "message.pdf-record-fonts.transfer"), + icon: YAHOO.widget.SimpleDialog.ICON_WARN + }); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.transfer.success", displayName) + }); + } + }; + this.afterDocListUpdate.push(fnAfterUpdate); + YAHOO.Bubbling.fire("changeFilter", + { + filterOwner: "Alfresco.DocListFilePlan", + filterId: "transfers" + }); + } + // Otherwise, use the metadataRefresh event + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + + if (pdfIndicator) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.pdf-record-fonts.title"), + text: this.msg(accessionIndicator ? "message.pdf-record-fonts.accession" : "message.pdf-record-fonts.transfer"), + icon: YAHOO.widget.SimpleDialog.ICON_WARN + }); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.transfer.success", displayName) + }); + } + } + } + }; + + /** + * Transfer / Accession container query failure callback. + * + * @method fnTransferQueryFailure + * @param data {object} Object literal containing ajax request and response + * @param obj {object} Caller-supplied object + */ + var fnTransferQueryFailure = function RDLA_onActionTransfer_fnTransferQueryFailure(data, obj) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.pdf-record-fonts.title"), + text: this.msg("message.pdf-record-fonts.unknown"), + icon: YAHOO.widget.SimpleDialog.ICON_WARN + }); + }; + + // Extract the transfer container nodeRef to query it's properties + if (data.json && data.json.results) + { + // Grab the resulting transfer container nodeRef + var dataObj = data.config.dataObj, + nodeRef = YAHOO.lang.isArray(dataObj.nodeRefs) ? dataObj.nodeRefs[0] : dataObj.nodeRef, + transfer = new Alfresco.util.NodeRef(data.json.results[nodeRef]); + + // Now query the transfer nodeRef, looking for the rma:transferPDFIndicator flag + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI + "slingshot/doclib/rm/transfer/node/" + transfer.uri, + successCallback: + { + fn: fnTransferQuerySuccess, + scope: this + }, + failureCallback: + { + fn: fnTransferQueryFailure, + scope: this + } + }); + } + }, + + /** + * Records Management Repo Action. + * + * Accepts the following declarations from the config: + * + * action - The name of the action (e.g. closeRecordFolder) + * success - (Optional) The name of the callback function + * failure - (Optional) The name of the callback function + * message - The stem of the I18N key to use when the action succeeds or fails + * + * @method onActionRecordsManagementRepoAction + * @param record {object} Object literal representing the file or folder to be actioned + * @param owner {HTMLElement} The action html element + * @param actionParams {object} Optional object literal to pass parameters to the action + */ + onActionRecordsManagementRepoAction: function RDLA_onActionRecordsManagementRepoAction(record, owner, actionParams) + { + // Get action params + var params = this.getAction(record, owner).params; + + // Prepare genericAction config + var config = {}; + + // Add configured success callback if provided + if (YAHOO.lang.isFunction(this[params.success])) + { + config.success = + { + callback: + { + fn: this[params.success], + obj: record, + scope: this + } + }; + } + + // Add configured failure callback if provided + if (YAHOO.lang.isFunction(this[params.failure])) + { + config.failure = + { + callback: + { + fn: this[params.failure], + obj: record, + scope: this + } + }; + } + + // Execute the repo action + this._rmAction(params.message, record, params.action, actionParams, config); + }, + + /** + * RM action. + * + * @method _rmAction + * @param i18n {string} Will be appended with ".success" or ".failure" depending on action outcome + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + * @param actionName {string} Name of repository action to run + * @param actionParams {object} Optional object literal to pass parameters to the action + * @param configOverride {object} Optional object literal to override default configuration parameters + * @private + */ + _rmAction: function RDLA__rmAction(i18n, assets, actionName, actionParams, configOverride) + { + var displayName = "", + dataObj = + { + name: actionName + }; + + if (YAHOO.lang.isArray(assets)) + { + displayName = this.msg("message.multi-select", assets.length); + dataObj.nodeRefs = []; + for (var i = 0, ii = assets.length; i < ii; i++) + { + dataObj.nodeRefs.push(assets[i].nodeRef); + } + } + else + { + displayName = assets.displayName; + dataObj.nodeRef = assets.nodeRef; + } + + if (YAHOO.lang.isObject(actionParams)) + { + dataObj.params = actionParams; + } + + var config = + { + success: + { + event: + { + name: "metadataRefresh" + }, + message: this.msg(i18n + ".success", displayName) + }, + failure: + { + message: this.msg(i18n + ".failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + stem: Alfresco.constants.PROXY_URI + "api/rma/actions/", + name: "ExecutionQueue" + }, + config: + { + requestContentType: Alfresco.util.Ajax.JSON, + dataObj: dataObj + } + }; + + if (YAHOO.lang.isObject(configOverride)) + { + config = YAHOO.lang.merge(config, configOverride); + } + + this.modules.actions.genericAction(config); + }, + + + /** + * LEGACY ACTION SUPPORT + * + * These action handlers are no longer needed by the document list component, but are needed + * by this toolbar until it has been refactored to use the 4.0 actions configuration. + */ + + /** + * Cut Off action. + * + * @method onActionCutoff + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionCutoff: function DLTB_onActionCutoff(assets) + { + this._rmAction("message.cutoff", assets, "cutoff"); + }, + + /** + * Cut Off record + * + * @method onActionCutoffRecord + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionCutoffRecord: function DLTB_onActionCutoffRecord(assets) + { + this.onActionCutoff(assets); + }, + + /** + * Cut Off record folder + * + * @method onActionCutoffRecordFolder + * @param assets {object} Object literal representing one or more record folder(s) to be actioned + */ + onActionCutoffRecordFolder: function DLTB_onActionCutoffRecordFolder(assets) + { + this.onActionCutoff(assets); + }, + + /** + * Cut Off record category + * + * @method onActionCutoffRecordCategory + * @param assets {object} Object literal representing one or more record category (categories) to be actioned + */ + onActionCutoffRecordCategory: function DLTB_onActionCutoffRecordCategory(assets) + { + this.onActionCutoff(assets); + }, + + /** + * Transfer Complete action. + * + * @method onActionTransferComplete + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionTransferComplete: function DLTB_onActionTransferComplete(assets) + { + this._rmAction("message.transfer-complete", assets, "transferComplete"); + }, + + /** + * Undo Cut Off action. + * + * @method onActionUndoCutoff + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionUndoCutoff: function DLTB_onActionUndoCutoff(assets) + { + this._rmAction("message.undo-cutoff", assets, "unCutoff"); + }, + + /** + * Create Disposition. + * + * @method onActionCreateDisposition + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionCreateDisposition: function DLTB_onActionCreateDisposition(assets) + { + this._rmAction("message.create-disposition-schedule", assets, "createDispositionSchedule"); + }, + + /** + * Reject action for an unfiled record + * + * @method onActionReject + * @param assets {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionReject: function DLTB_onActionReject(assets) + { + Alfresco.util.PopupManager.getUserInput( + { + title: this.msg("message.reject.title"), + text: this.msg("message.reject.reason"), + okButtonText: this.msg("button.reject.record"), + callback: + { + fn: function RDLA_onActionReject_callback(value) + { + this._rmAction("message.reject", assets, "reject", + { + "reason": value + }, + { + success: + { + callback: + { + fn: function() + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.reject.success", $html(assets.displayName)) + }); + + if (this.actionsView === "details") + { + window.location = Alfresco.util.siteURL("documentlibrary#filter=unfiledRecords") + } + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + }, + scope: this + } + } + }); + }, + scope: this + } + }); + }, + + /** + * Request info action start a worklfow for an unfiled record + * + * @method onActionRequestInfo + * @param assets {object} Object literal representing a record to be actioned + */ + onActionRequestInfo: function DLTB_onActionRequestInfo(assets) + { + // Intercept before dialog show and change the button label + var doBeforeDialogShow = function DLTB_requestInfo_doBeforeDialogShow(p_form, p_dialog) + { + p_dialog.widgets.okButton.set("label", this.msg("button.request-info")); + }; + + var executed = false; + YAHOO.Bubbling.on("objectFinderReady", function DLTB_onActionRequestInfo_onObjectFinderReady(layer, args) + { + var objectFinder = args[1].eventGroup; + if (objectFinder.options.field == "assoc_packageItems" && objectFinder.eventGroup.indexOf(this.id) == 0 && executed == false) + { + executed = true; + objectFinder.selectItems(assets.node.nodeRef); + } + }, this); + + var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&mode={mode}&submitType={submitType}&showCancelButton=true", + { + htmlid: this.id + "-startWorkflowForm-" + Alfresco.util.generateDomId(), + itemKind: "workflow", + itemId: "activiti$activitiRequestForInformation", + mode: "create", + submitType: "json", + showCaption: true, + formUI: true, + showCancelButton: true + }); + + // Using Forms Service, so always create new instance + var requestInfo = new Alfresco.module.SimpleDialog(this.id + "-request-info"); + + requestInfo.setOptions( + { + width: "auto", + templateUrl: templateUrl, + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + }, + onSuccess: + { + fn: function DLTB__newContainer_success(response) + { + YAHOO.Bubbling.fire("metadataRefresh"); + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.request-info-success") + }); + }, + scope: this + }, + onFailure: + { + fn: function DLTB__newContainer_failure(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.request-info-failure") + }); + }, + scope: this + } + }).show(); + }, + + /** + * Add a record/folder to the hold(s) + * + * @method onActionAddToHold + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionAddToHold: function RDLA_onActionAddToHold(assets) + { + if (!this.modules.addToHold) + { + this.modules.addToHold = new Alfresco.rm.module.AddToHold(this.id + "-listofholds"); + } + var itemNodeRef; + if (YAHOO.lang.isArray(assets)) + { + itemNodeRef = []; + for (var i = 0, l = assets.length; i < l; i++) + { + itemNodeRef.push(assets[i].nodeRef); + } + } + else + { + itemNodeRef = assets.nodeRef; + } + this.modules.addToHold.setOptions({ + itemNodeRef: itemNodeRef + }).show(); + }, + + /** + * Add a record folder to the hold(s) + * + * @method onActionAddToHoldRecordFolder + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionAddToHoldRecordFolder: function RDLA_onActionAddToHoldRecordFolder(assets) + { + this.onActionAddToHold(assets); + }, + + /** + * Add a record to the hold(s) + * + * @method onActionAddToHoldRecord + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionAddToHoldRecord: function RDLA_onActionAddToHoldRecord(assets) + { + this.onActionAddToHold(assets); + }, + + /** + * Remove a record/folder from the hold(s) + * + * @method onActionRemoveFromHold + * @param assets {object} Object literal representing one or more record(s) to be actioned + */ + onActionRemoveFromHold: function RDLA_onActionRemoveFromHold(assets) + { + if (!this.modules.removeFromHold) + { + this.modules.removeFromHold = new Alfresco.rm.module.RemoveFromHold(this.id + "-listofholds"); + } + this.modules.removeFromHold.setOptions({ + itemNodeRef: assets.nodeRef + }).show(); + }, + + /** + * Delete hold + * + * @method onHoldDelete + * @param assets {object} Object literal representing one or more record(s) to be actioned + * @param owner {HTMLElement} The action html element + */ + onHoldDelete: function RDLA_onHoldDelete(assets, owner) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.confirm.delete-hold.title"), + text: this.msg("message.confirm.delete-hold", assets.displayName), + buttons: [ + { + text: this.msg("button.ok"), + handler: function RDLA_onHoldDelete_confirm_ok() + { + me._rmAction("message.delete-hold", assets, "deleteHold", null, + { + failure: + { + callback: + { + fn: function RDLA_onHoldDelete_failure(data) + { + var text = me.msg("message.delete-hold.failure"); + if(data.json && data.json.message) + { + text = data.json.message; + } + Alfresco.util.PopupManager.displayPrompt( + { + title: Alfresco.util.message("message.failure"), + text: text + }); + }, + scope: this + } + } + }); + this.destroy(); + } + }, + { + text: this.msg("button.cancel"), + handler: function RDLA_onHoldDelete_confirm_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Helper method to publish aikau events + * + * @method _publishAikauEvent + * @param assets {object} Object literal representing one or more record(s) to be actioned + * @param owner {HTMLElement} The action html element + * @param topic The aikau topic which will be published + */ + _publishAikauEvent: function RDLA___publishAikauEvent(assets, owner, topic) + { + require(["rm/services/AlfRmActionBridge"], function(Bridge) { + var bridge = new Bridge(); + bridge.alfPublish(topic, { + "item": assets, + "owner": owner + }); + }); + }, + + /** + * Add relatinship action + * + * @method onAddRelationship + * @param assets {object} Object literal representing one or more record(s) to be actioned + * @param owner {HTMLElement} The action html element + */ + onAddRelationship: function RDLA_onAddRelationship(assets, owner) + { + this._publishAikauEvent(assets, owner, "RM_RELATIONSHIP_ADD"); + } + }; +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/folder-manage-permissions-disabled-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/folder-manage-permissions-disabled-16.png new file mode 100644 index 0000000000..0253615ae3 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/folder-manage-permissions-disabled-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/folder-manage-rules-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/folder-manage-rules-16.png new file mode 100644 index 0000000000..7833d0b227 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/folder-manage-rules-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-accession-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-accession-16.png new file mode 100644 index 0000000000..cd46a851a3 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-accession-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-accession-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-accession-record-16.png new file mode 100644 index 0000000000..3a6f625afe Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-accession-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-record-metadata-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-record-metadata-16.png new file mode 100644 index 0000000000..da78072712 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-record-metadata-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-relationship-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-relationship-16.png new file mode 100644 index 0000000000..311a6e86d8 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-relationship-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-to-hold-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-to-hold-16.png new file mode 100644 index 0000000000..ea7743e80c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-to-hold-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-to-hold-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-to-hold-folder-16.png new file mode 100644 index 0000000000..464551d13a Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-add-to-hold-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-close-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-close-folder-16.png new file mode 100644 index 0000000000..ab58853724 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-close-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-copy-folder-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-copy-folder-to-16.png new file mode 100644 index 0000000000..3f53672d28 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-copy-folder-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-copy-record-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-copy-record-to-16.png new file mode 100644 index 0000000000..dbf7316ac0 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-copy-record-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-create-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-create-record-16.png new file mode 100644 index 0000000000..d98c9c5b69 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-create-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-cutoff-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-cutoff-16.png new file mode 100644 index 0000000000..29c5d77717 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-cutoff-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-cutoff-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-cutoff-folder-16.png new file mode 100644 index 0000000000..cf2f760127 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-cutoff-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-declare-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-declare-16.png new file mode 100644 index 0000000000..25a1ca7054 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-declare-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-declare-version-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-declare-version-record-16.png new file mode 100644 index 0000000000..22d028d127 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-declare-version-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-destroy-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-destroy-16.png new file mode 100644 index 0000000000..6c08d8e46f Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-destroy-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-destruction-report-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-destruction-report-16.png new file mode 100644 index 0000000000..b0a2550127 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-destruction-report-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-download-zip-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-download-zip-16.png new file mode 100644 index 0000000000..af5b71fb2e Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-download-zip-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-disposition-as-of-date-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-disposition-as-of-date-16.png new file mode 100644 index 0000000000..8cbc002819 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-disposition-as-of-date-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-reason-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-reason-16.png new file mode 100644 index 0000000000..8b7fb5ba97 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-reason-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-review-as-of-date-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-review-as-of-date-16.png new file mode 100644 index 0000000000..8cbc002819 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-edit-review-as-of-date-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-export-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-export-16.png new file mode 100644 index 0000000000..24dd89ccbf Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-export-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-export-disabled-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-export-disabled-16.png new file mode 100644 index 0000000000..13228949a9 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-export-disabled-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-file-report-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-file-report-16.png new file mode 100644 index 0000000000..28eb7eb106 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-file-report-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-file-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-file-to-16.png new file mode 100644 index 0000000000..f3946a1b1c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-file-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-hide-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-hide-record-16.png new file mode 100644 index 0000000000..f3aa7e468d Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-hide-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-import-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-import-16.png new file mode 100644 index 0000000000..03e29caa86 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-import-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-import-disabled-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-import-disabled-16.png new file mode 100644 index 0000000000..bf6874f6b0 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-import-disabled-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-link-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-link-to-16.png new file mode 100644 index 0000000000..bae375d3cf Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-link-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-open-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-open-folder-16.png new file mode 100644 index 0000000000..868f487c46 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-open-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-recorded-version-config-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-recorded-version-config-16.png new file mode 100644 index 0000000000..ed135c2661 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-recorded-version-config-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-reject-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-reject-16.png new file mode 100644 index 0000000000..5695e5ce4b Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-reject-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-relinquish-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-relinquish-16.png new file mode 100644 index 0000000000..a875b883c4 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-relinquish-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-remove-from-hold-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-remove-from-hold-16.png new file mode 100644 index 0000000000..0e44688de1 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-remove-from-hold-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-remove-from-hold-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-remove-from-hold-folder-16.png new file mode 100644 index 0000000000..176d14c0a2 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-remove-from-hold-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-request-info-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-request-info-16.png new file mode 100644 index 0000000000..54be9b2de5 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-request-info-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-review-all-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-review-all-16.png new file mode 100644 index 0000000000..7e315eb77c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-review-all-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-reviewed-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-reviewed-16.png new file mode 100644 index 0000000000..77a53aa40b Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-reviewed-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-split-email-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-split-email-16.png new file mode 100644 index 0000000000..2e30a6a155 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-split-email-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-transfer-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-transfer-16.png new file mode 100644 index 0000000000..44f5493fd2 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-transfer-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-transfer-complete-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-transfer-complete-16.png new file mode 100644 index 0000000000..5ab74a40e5 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-transfer-complete-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-undeclare-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-undeclare-16.png new file mode 100644 index 0000000000..a42b75cafd Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-undeclare-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-undo-cutoff-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-undo-cutoff-16.png new file mode 100644 index 0000000000..3bb9cf0428 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-undo-cutoff-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-unlink-from-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-unlink-from-16.png new file mode 100644 index 0000000000..8cc656c72d Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-unlink-from-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-view-audit-log-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-view-audit-log-16.png new file mode 100644 index 0000000000..e9328aa5b0 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/actions/rm-view-audit-log-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/documentlist.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/documentlist.css new file mode 100644 index 0000000000..187386db02 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/documentlist.css @@ -0,0 +1,59 @@ +/* DocList bar Select menu */ + +.toolbar .file-select .selectRecords +{ + background-image: url(images/select-records-16.png); +} + +.toolbar .file-select .selectUndeclaredRecords +{ + background-image: url(images/select-undeclared-16.png); +} + +.toolbar .file-select .selectRecordFolders +{ + background-image: url(images/record-folder-16.png); +} + +.toolbar .file-select .selectRecordCategories +{ + background-image: url(images/record-category-16.png); +} + +.toolbar .file-select .selectAll +{ + background-image: url(images/select-all-rm-16.png); +} + +.toolbar .file-select .selectNone +{ + background-image: url(images/select-none-rm-16.png); +} + +/* File Plan Filter Styling */ + +.fileplan-filter span.holds +{ + background-image: url(actions/rm-add-to-hold-16.png); + background-repeat: no-repeat; + padding-left: 20px; +} + +.fileplan-filter span.transfers +{ + background-image: url(actions/rm-transfer-16.png); + background-repeat: no-repeat; + padding-left: 20px; +} + +.fileplan-filter span.unfiledRecords +{ + background-image: url(actions/rm-add-record-metadata-16.png); + background-repeat: no-repeat; + padding-left: 20px; +} + +.doclist .documents .yui-dt-highlighted .filename span.document-version +{ + visibility: hidden !important; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/documentlist.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/documentlist.js new file mode 100644 index 0000000000..0a14e6577a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/documentlist.js @@ -0,0 +1,550 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM DocumentList component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DocumentList + * @superclass Alfresco.DocumentList + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths, + $jsonDate = Alfresco.util.fromExplodedJSONDate, + $date = function $date(date, format) { return Alfresco.util.formatDate(Alfresco.util.fromISO8601(date), format) }, + $isValueSet = Alfresco.util.isValueSet; + + /** + * RecordsDocumentList constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.DocumentList} The new Records DocumentList instance + * @constructor + */ + Alfresco.rm.component.DocumentList = function(htmlId) + { + Alfresco.rm.component.DocumentList.superclass.constructor.call(this, htmlId); + + this.dataSourceUrl = $combine(Alfresco.constants.URL_SERVICECONTEXT, "rm/components/documentlibrary/data/doclist/"); + + return this; + }; + + /** + * Extend Alfresco.DocumentList + */ + YAHOO.extend(Alfresco.rm.component.DocumentList, Alfresco.DocumentList); + + /** + * Augment prototype with RecordsActions module, ensuring overwrite is enabled + */ + YAHOO.lang.augmentProto(Alfresco.rm.component.DocumentList, Alfresco.rm.doclib.Actions, true); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.rm.component.DocumentList.prototype, + { + /** + * Fired by YUI when parent element is available for scripting. + * + * @method onReady + * @override + */ + onReady: function RDL_onReady() + { + // Disable drag and drop upload + this.dragAndDropAllowed = false; + + // Set-up custom title renderers + this._setupTitleRenderers(); + + return Alfresco.rm.component.DocumentList.superclass.onReady.apply(this, arguments); + }, + + /** + * Configure Records Management title renderers + * + * @method _setupMetadataRenderers + */ + _setupTitleRenderers: function RDL__setupTitleRenderers() + { + // Transfer Container title + this.registerRenderer("RM_transferContainer", function rma_transferContainer(record, label) + { + var properties = record.jsNode.properties, + transferTitle = this.msg("details.transfer-container.title", $html(record.displayName)), + filterObj = + { + filterId: "transfers", + filterData: record.nodeRef, + filterDisplay: transferTitle + }; + + // Transfer location if available + var titleHTML = ""; + if ($isValueSet(properties.rma_transferLocation)) + { + titleHTML = '(' + $html(properties.rma_transferLocation) + ')'; + } + + return '

' + + $html(transferTitle) + '' + titleHTML + '

'; + }); + + // Hold title + this.registerRenderer("RM_hold", function rma_hold(record, label) + { + var holdName = $html(record.jsNode.properties.cm_name), + filterObj = + { + filterId: "holds", + filterData: record.nodeRef, + filterDisplay: holdName + }; + + return '

' + holdName + '

'; + }); + + // Unfiled Record Folder title + this.registerRenderer("RM_unfiledRecordFolder", function rma_unfiledRecordFolder(record, label) + { + var displayName = $html(record.jsNode.properties.cm_name); + filterObj = + { + filterId: "unfiledRecords", + filterData: record.nodeRef, + filterDisplay: displayName + }; + + return '

' + displayName + '

'; + }); + }, + + /** + * Configure Records Management metadata renderers + * + * @method _setupMetadataRenderers + */ + _setupMetadataRenderers: function RDL__setupMetadataRenderers() + { + // Vital Record Indicator + this.registerRenderer("RM_vitalRecordIndicator", function rma_vitalRecordIndicator(record, label) + { + var vitalRecord = record.jsNode.properties["rma:vitalRecordIndicator"], + html = ""; + + if (vitalRecord !== undefined) + { + html = '' + label + this.msg(vitalRecord == "true" ? "label.yes" : "label.no") + ''; + } + return html; + }); + + // Created by + this.registerRenderer("RM_createdBy", function(record, label) + { + return '' + label + Alfresco.DocumentList.generateUserLink(this, record.jsNode.properties.creator) + ''; + }); + + // Modified by + this.registerRenderer("RM_modifiedBy", function(record, label) + { + return '' + label + Alfresco.DocumentList.generateUserLink(this, record.jsNode.properties.modifier) + ''; + }); + + // Modified on + this.registerRenderer("RM_modifiedOn", function(record, label) + { + return '' + label + Alfresco.util.formatDate(record.jsNode.properties.modified.iso8601) + ''; + }); + + // Date Filed + this.registerRenderer("RM_dateFiled", function(record, label) + { + var dateFiled = record.jsNode.properties["rma:dateFiled"], + html = ""; + if (dateFiled !== undefined) + { + html = '' + label + Alfresco.util.formatDate(record.jsNode.properties.rma_dateFiled.iso8601) + ''; + } + return html; + }); + + // Publication Date + this.registerRenderer("RM_publicationDate", function(record, label) + { + return '' + label + Alfresco.util.formatDate(record.jsNode.properties.rma_publicationDate.iso8601, "defaultDateOnly") + ''; + }); + + // Hold Reason + this.registerRenderer("RM_holdReason", function(record, label) + { + var holdReason = $html(record.jsNode.properties.rma_holdReason) || scope.msg("details.hold.reason.none"); + + return '' + label + holdReason + ''; + }); + + return Alfresco.rm.component.DocumentList.superclass._setupMetadataRenderers.apply(this, arguments); + }, + + /** + * DataTable Cell Renderers + */ + + /** + * Returns thumbnail custom datacell formatter + * + * @method fnRenderCellThumbnail + */ + fnRenderCellThumbnail: function RDL_fnRenderCellThumbnail() + { + var scope = this; + + /** + * Thumbnail custom datacell formatter + * + * @method renderCellThumbnail + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function RDL_renderCellThumbnail(elCell, oRecord, oColumn, oData) + { + if (oRecord.getData().node.rmNode === undefined) + { + var nodeuitype = oRecord.getData().node.uiType; + } + else + { + var nodeuitype = oRecord.getData().node.rmNode.uiType; + } + + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + name = record.fileName, + title = properties.title, + type = nodeuitype, + isLink = node.isLink, + locn = record.location, + extn = name.substring(name.lastIndexOf(".")), + docDetailsUrl; + + if (scope.options.viewRendererName === "simple") + { + /** + * Simple View + */ + oColumn.width = 40; + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + switch (type) + { + case "record-category": + case "record-folder": + case "metadata-stub-folder": + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "transfer-container": + var filterObj = + { + filterId: "transfers", + filterData: record.nodeRef, + filterDisplay: scope.msg("details.transfer-container.title", $html(record.displayName)) + }; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "hold": + var filterObj = + { + filterId: "holds", + filterData: record.nodeRef, + filterDisplay: $html(record.displayName) + }; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "unfiled-record-folder": + var filterObj = + { + filterId: "unfiledRecords", + filterData: record.nodeRef, + filterDisplay: $html(record.displayName) + }; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "record-nonelec": + case "undeclared-record-nonelec": + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "metadata-stub": + var id = scope.id + '-preview-' + oRecord.getId(); + docDetailsUrl = Alfresco.constants.URL_PAGECONTEXT + "site/" + scope.options.siteId + "/document-details?nodeRef=" + record.nodeRef; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "folder": + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + default: + var id = scope.id + '-preview-' + oRecord.getId(); + docDetailsUrl = Alfresco.constants.URL_PAGECONTEXT + "site/" + scope.options.siteId + "/document-details?nodeRef=" + record.nodeRef; + elCell.innerHTML = '' + (isLink ? '' : '') + '' + extn + ''; + + // Preview tooltip + scope.previewTooltips.push(id); + break; + } + } + else + { + /** + * Detailed View + */ + oColumn.width = 100; + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + switch (type) + { + case "record-category": + case "record-folder": + case "metadata-stub-folder": + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "transfer-container": + var filterObj = + { + filterId: "transfers", + filterData: record.nodeRef, + filterDisplay: scope.msg("details.transfer-container.title", $html(record.displayName)) + }; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "hold": + var filterObj = + { + filterId: "holds", + filterData: record.nodeRef, + filterDisplay: $html(record.displayName) + }; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "unfiled-record-folder": + var filterObj = + { + filterId: "unfiledRecords", + filterData: record.nodeRef, + filterDisplay: $html(record.displayName) + }; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "record-nonelec": + case "undeclared-record-nonelec": + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "metadata-stub": + docDetailsUrl = Alfresco.constants.URL_PAGECONTEXT + "site/" + scope.options.siteId + "/document-details?nodeRef=" + record.nodeRef; + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + case "folder": + elCell.innerHTML = '' + (isLink ? '' : '') + ''; + break; + + default: + docDetailsUrl = $combine(Alfresco.constants.URL_PAGECONTEXT, "site", scope.options.siteId, "document-details?nodeRef=" + record.nodeRef); + elCell.innerHTML = '' + (isLink ? '' : '') + '' + extn + ''; + break; + } + } + }; + }, + + /** + * Public functions + * + * Functions designed to be called form external sources + */ + + /** + * Public function to select files by specified groups + * + * @method selectFiles + * @param p_selectType {string} Can be one of the following: + *
+       * selectAll - all documents and folders
+       * selectNone - deselect all
+       * selectInvert - invert selection
+       * selectRecords - select all records
+       * selectFolders - select all folders
+       * 
+ */ + selectFiles: function RDL_selectFiles(p_selectType) + { + var recordSet = this.widgets.dataTable.getRecordSet(), + checks = YAHOO.util.Selector.query('input[type="checkbox"]', this.widgets.dataTable.getTbodyEl()), + len = checks.length, + record, i, fnCheck, typeMap; + + var typeMapping = + { + selectRecords: + { + "record": true, + "record-nonelec": true + }, + selectUndeclaredRecords: + { + "undeclared-record": true, + "undeclared-record-nonelec": true + }, + selectRecordFolders: + { + "record-folder": true + }, + selectRecordCategories: + { + "record-category": true + } + }; + + switch (p_selectType) + { + case "selectAll": + fnCheck = function(assetType, isChecked) + { + return true; + }; + break; + + case "selectNone": + fnCheck = function(assetType, isChecked) + { + return false; + }; + break; + + case "selectInvert": + fnCheck = function(assetType, isChecked) + { + return !isChecked; + }; + break; + + case "selectRecords": + case "selectUndeclaredRecords": + case "selectRecordFolders": + case "selectRecordCategories": + typeMap = typeMapping[p_selectType]; + fnCheck = function(assetType, isChecked) + { + if (typeof typeMap === "object") + { + return typeMap[assetType]; + } + return assetType == typeMap; + }; + break; + + default: + fnCheck = function(assetType, isChecked) + { + return isChecked; + }; + } + + for (i = 0; i < len; i++) + { + record = recordSet.getRecord(i); + if (record.getData("node").rmNode === undefined) + { + nodeuitype = record.getData("node").uiType; + } + else + { + nodeuitype = record.getData("node").rmNode.uiType; + } + this.selectedFiles[record.getData("nodeRef")] = checks[i].checked = fnCheck(nodeuitype, checks[i].checked); + } + + YAHOO.Bubbling.fire("selectedFilesChanged"); + }, + + /** + * DocList View change filter request event handler + * + * This function extends the original function in order to + * reflect the changed filter id in the url + * + * @method onChangeFilter + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (new filterId) + */ + onChangeFilter: function RDL_onChangeFilter(layer, args) + { + Alfresco.rm.component.DocumentList.superclass.onChangeFilter.call(this, layer, args); + var currentFilter = this.currentFilter.filterId, + filterId = args[1].filterId; + if (currentFilter !== filterId && filterId !== "path" && filterId !== "savedsearch") + { + var hash = window.location.hash; + hash = hash.replace(/(filter=)[^\&]+/, '$1' + filterId); + window.location.assign(hash); + } + if (currentFilter === "path" && args[1].filterData === "/Unfiled Records") + { + var hash = window.location.hash; + hash = hash.replace(/(filter=)[^\&]+/, '$1' + "unfiledRecords") + "&page=" + this.currentPage; + window.location.assign(hash); + } + } + }, true); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/close-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/close-record-16.png new file mode 100644 index 0000000000..1b43de2a89 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/close-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/delete-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/delete-record-16.png new file mode 100644 index 0000000000..6ed3f4cecb Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/delete-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/file-document-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/file-document-16.png new file mode 100644 index 0000000000..3bf6fba666 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/file-document-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/generic-file-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/generic-file-to-16.png new file mode 100644 index 0000000000..fc1d2acd22 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/generic-file-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/hold-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/hold-32.png new file mode 100644 index 0000000000..38b5ba0458 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/hold-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/hold-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/hold-48.png new file mode 100644 index 0000000000..01f4efe7d2 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/hold-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/meta-stub-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/meta-stub-32.png new file mode 100644 index 0000000000..7781bb5c64 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/meta-stub-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/meta-stub-75x100.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/meta-stub-75x100.png new file mode 100644 index 0000000000..f21bc65222 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/meta-stub-75x100.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-16.png new file mode 100644 index 0000000000..159de10e1f Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-32.png new file mode 100644 index 0000000000..8b61ad246a Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-48.png new file mode 100644 index 0000000000..e6ce96ba10 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/metadata-stub-folder-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/move-folder-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/move-folder-to-16.png new file mode 100644 index 0000000000..bf2c5acd16 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/move-folder-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/move-record-to-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/move-record-to-16.png new file mode 100644 index 0000000000..4fd6aee606 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/move-record-to-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-32.png new file mode 100644 index 0000000000..eb335a3156 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-75x100.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-75x100.png new file mode 100644 index 0000000000..82346a3ea2 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-75x100.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-record.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-record.png new file mode 100644 index 0000000000..86f63be142 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/non-electronic-record.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/open-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/open-record-16.png new file mode 100644 index 0000000000..58168d6d7b Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/open-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-16.png new file mode 100644 index 0000000000..b29f79f637 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-32.png new file mode 100644 index 0000000000..56145803a1 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-64.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-64.png new file mode 100644 index 0000000000..2d36e7abdb Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-64.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-add-ref-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-add-ref-16.png new file mode 100644 index 0000000000..bae375d3cf Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-add-ref-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-16.png new file mode 100644 index 0000000000..fa9499eaf8 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-32.png new file mode 100644 index 0000000000..76d8f97b9c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-48.png new file mode 100644 index 0000000000..7244bc9000 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-category-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-16.png new file mode 100644 index 0000000000..bb87d23f4e Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-32.png new file mode 100644 index 0000000000..358fc9169c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-48.png new file mode 100644 index 0000000000..41e96fcc0c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-folder-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-16.png new file mode 100644 index 0000000000..68260efd7a Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-32.png new file mode 100644 index 0000000000..cc496a1d48 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-48.png new file mode 100644 index 0000000000..3a15c924f3 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/record-series-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-all-rm-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-all-rm-16.png new file mode 100644 index 0000000000..ffbd6b61ec Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-all-rm-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-none-rm-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-none-rm-16.png new file mode 100644 index 0000000000..94e76ae0a5 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-none-rm-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-records-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-records-16.png new file mode 100644 index 0000000000..c7852b670e Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-records-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-undeclared-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-undeclared-16.png new file mode 100644 index 0000000000..77a53aa40b Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/select-undeclared-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-container-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-container-32.png new file mode 100644 index 0000000000..bc2dae65ad Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-container-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-container-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-container-48.png new file mode 100644 index 0000000000..1aa8d2c63e Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-container-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-list-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-list-48.png new file mode 100644 index 0000000000..8088308dca Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-list-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-record-16.png new file mode 100644 index 0000000000..ee830fddcc Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/transfer-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/unfiled-record-folder-32.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/unfiled-record-folder-32.png new file mode 100644 index 0000000000..358fc9169c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/unfiled-record-folder-32.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/unfiled-record-folder-48.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/unfiled-record-folder-48.png new file mode 100644 index 0000000000..41e96fcc0c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/unfiled-record-folder-48.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/warning-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/warning-16.png new file mode 100644 index 0000000000..c4da7f820d Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/images/warning-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-accession-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-accession-16.png new file mode 100644 index 0000000000..cd46a851a3 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-accession-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-accessioned-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-accessioned-16.png new file mode 100644 index 0000000000..10f767da5d Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-accessioned-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-all-revisions-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-all-revisions-16.png new file mode 100644 index 0000000000..368f4f0098 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-all-revisions-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-closed-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-closed-16.png new file mode 100644 index 0000000000..731bf7184c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-closed-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-cutoff-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-cutoff-16.png new file mode 100644 index 0000000000..29c5d77717 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-cutoff-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-cutoff-folder-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-cutoff-folder-16.png new file mode 100644 index 0000000000..cf2f760127 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-cutoff-folder-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-destroyed-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-destroyed-16.png new file mode 100644 index 0000000000..c9820a7921 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-destroyed-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-digital-photograph-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-digital-photograph-record-16.png new file mode 100644 index 0000000000..b77eea6271 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-digital-photograph-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-disposition-schedule-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-disposition-schedule-16.png new file mode 100644 index 0000000000..25e8d4842b Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-disposition-schedule-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-frozen-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-frozen-16.png new file mode 100644 index 0000000000..b933cc6fb3 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-frozen-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-major-revisions-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-major-revisions-16.png new file mode 100644 index 0000000000..18a692e113 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-major-revisions-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-multi-parent-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-multi-parent-16.png new file mode 100644 index 0000000000..f76d26a715 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-multi-parent-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-open-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-open-16.png new file mode 100644 index 0000000000..88baa92aa8 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-open-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-pdf-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-pdf-record-16.png new file mode 100644 index 0000000000..ca88229790 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-pdf-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-record-16.png new file mode 100644 index 0000000000..b29f79f637 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-scanned-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-scanned-record-16.png new file mode 100644 index 0000000000..b003dcaad0 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-scanned-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-transfer-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-transfer-16.png new file mode 100644 index 0000000000..44f5493fd2 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-transfer-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-transferred-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-transferred-16.png new file mode 100644 index 0000000000..5f3df0818f Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-transferred-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-version-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-version-record-16.png new file mode 100644 index 0000000000..2015884b4a Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-version-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-vital-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-vital-record-16.png new file mode 100644 index 0000000000..6cb7c2173c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-vital-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-web-record-16.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-web-record-16.png new file mode 100644 index 0000000000..c4698fcbe6 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/indicators/rm-web-record-16.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/toolbar.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/toolbar.css new file mode 100644 index 0000000000..30be94da5c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/toolbar.css @@ -0,0 +1,208 @@ +/* Header- and Navigation-Bar Buttons */ + +.toolbar .import button +{ + background: transparent url(actions/rm-import-16.png) no-repeat 12px 4px; + padding-left: 32px; +} +.toolbar .import .yui-button-disabled button +{ + background-image: url(actions/rm-import-disabled-16.png); +} + +.toolbar .export-all button +{ + background: transparent url(actions/rm-export-16.png) no-repeat 12px 4px; + padding-left: 32px; +} +.toolbar .export-all .yui-button-disabled button +{ + background-image: url(actions/rm-export-disabled-16.png); +} + +.toolbar .manage-permissions button +{ + background: transparent url(../../../components/documentlibrary/actions/folder-manage-permissions-16.png) no-repeat 12px 4px; + padding-left: 32px; +} +.toolbar .manage-permissions .yui-button-disabled button +{ + background-image: url(actions/folder-manage-permissions-disabled-16.png); +} + +.toolbar .report button +{ + background: transparent url(actions/rm-file-report-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +.toolbar .manage-rules button +{ + background: transparent url(actions/folder-manage-rules-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +.toolbar .selected-items +{ + float: left; +} + +/* Multi-Select Actions */ + +.toolbar .onActionAccession +{ + background-image: url(actions/rm-accession-16.png); +} + +.toolbar .onActionCutoffRecord +{ + background-image: url(actions/rm-cutoff-16.png); +} + +.toolbar .onActionCutoffRecordFolder +{ + background-image: url(actions/rm-cutoff-folder-16.png); +} + +.toolbar .onActionCutoffRecordCategory +{ + background-image: url(actions/rm-cutoff-folder-16.png); +} + +.toolbar .onActionDestroy +{ + background-image: url(actions/rm-destroy-16.png); +} + +.toolbar .onActionExport +{ + background-image: url(actions/rm-export-16.png); +} + +.toolbar .onActionLinkTo +{ + background-image: url(actions/rm-link-to-16.png); +} + +.toolbar .onActionFileTo +{ + background-image: url(actions/rm-link-to-16.png); +} + +.toolbar .onActionSplitEmail +{ + background-image: url(actions/rm-split-email-16.png); +} + +.toolbar .onActionTransfer +{ + background-image: url(actions/rm-transfer-16.png); +} + +.toolbar .onActionTransferComplete +{ + background-image: url(actions/rm-transfer-complete-16.png); +} + +.toolbar .onActionUndoCutoff +{ + background-image: url(actions/rm-undo-cutoff-16.png); +} + +.toolbar .onActionCopyRecordTo +{ + background-image: url(actions/rm-copy-record-to-16.png); +} + +.toolbar .onActionCopyUnfiledRecordTo +{ + background-image: url(actions/rm-copy-record-to-16.png); +} + +.toolbar .onActionCopyRecordFolderTo +{ + background-image: url(actions/rm-copy-folder-to-16.png); +} + +.toolbar .onActionCopyUnfiledRecordFolderTo +{ + background-image: url(actions/rm-copy-folder-to-16.png); +} + +.toolbar .onActionCopyRecordCategoryTo +{ + background-image: url(actions/rm-copy-folder-to-16.png); +} + +.toolbar .onActionMoveRecordTo +{ + background-image: url(images/move-record-to-16.png); +} + +.toolbar .onActionMoveUnfiledRecordTo +{ + background-image: url(images/move-record-to-16.png); +} + +.toolbar .onActionMoveRecordFolderTo +{ + background-image: url(images/move-folder-to-16.png); +} + +.toolbar .onActionMoveUnfiledRecordFolderTo +{ + background-image: url(images/move-folder-to-16.png); +} + +.toolbar .onActionMoveRecordCategoryTo +{ + background-image: url(images/move-folder-to-16.png); +} + +.toolbar .onActionDeleteRecord +{ + background-image: url(images/delete-record-16.png); +} + +.toolbar .onActionDeleteRecordFolder +{ + background-image: url(../../../components/documentlibrary/actions/folder-delete-16.png); +} + +.toolbar .onActionDeleteRecordCategory +{ + background-image: url(../../../components/documentlibrary/actions/folder-delete-16.png); +} + +.toolbar .onActionAddToHoldRecord +{ + background-image: url(../../../rm/components/documentlibrary/actions/rm-add-to-hold-16.png); +} + +.toolbar .onActionAddToHoldRecordFolder +{ + background-image: url(../../../rm/components/documentlibrary/actions/rm-add-to-hold-folder-16.png); +} + +.toolbar .onActionRemoveFromHold { + background-image: url(../../../rm/components/documentlibrary/actions/rm-remove-from-hold-16.png); +} + +/* Messages (e.g. Delete confirmation) */ +.toolbar-file-list span.record-category, +.toolbar-file-list span.record-folder +{ + background-image: url(indicators/rm-open-16.png); +} + +.toolbar-file-list span.record, +.toolbar-file-list span.undeclared-record +{ + background-image: url(../../../components/images/generic-16.png); +} + +.form-container .form-fields +{ + border-bottom: medium none; + padding: 1em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/toolbar.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/toolbar.js new file mode 100644 index 0000000000..91f233bf39 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/toolbar.js @@ -0,0 +1,1152 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * DocumentList Toolbar component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DocListToolbar + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $siteURL = Alfresco.util.siteURL, + $html = Alfresco.util.encodeHTML, + $createYUIButton = Alfresco.util.createYUIButton, + $popupManager = Alfresco.util.PopupManager; + + /** + * RecordsDocListToolbar constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.DocListToolbar} The new RecordsDocListToolbar instance + * @constructor + */ + Alfresco.rm.component.DocListToolbar = function(htmlId, registerListeners) + { + return Alfresco.rm.component.DocListToolbar.superclass.constructor.call(this, htmlId, registerListeners); + }; + + /** + * Extend Alfresco.DocListToolbar + */ + YAHOO.extend(Alfresco.rm.component.DocListToolbar, Alfresco.DocListToolbar); + + /** + * Augment prototype with RecordsActions module, ensuring overwrite is enabled + */ + YAHOO.lang.augmentProto(Alfresco.rm.component.DocListToolbar, Alfresco.rm.doclib.Actions, true); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.rm.component.DocListToolbar.prototype, + { + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function DLTB_onReady() + { + // New Record Category button: user needs "newCategory" access + this.widgets.newCategory = $createYUIButton(this, "newCategory-button", this.onNewCategory, + { + disabled: true, + value: "newCategory" + }); + + // New Record Folder button: user needs "newFolder" access + this.widgets.newFolder = $createYUIButton(this, "newFolder-button", this.onNewFolder, + { + disabled: true, + value: "newFolder" + }); + + // New Unfiled Records Folder button: user needs "newFolder" access + this.widgets.newUnfiledRecordsFolder = $createYUIButton(this, "newUnfiledRecordsFolder-button", this.onNewUnfiledRecordsFolder, + { + disabled: true, + value: "newUnfiledRecordsFolder" + }); + + // New Hold button: user needs "newHold" access + this.widgets.newHold = $createYUIButton(this, "newHold-button", this.onNewHold, + { + disabled: true, + value: "newHold" + }); + + // File Upload button: user needs "file" access + this.widgets.fileUpload = $createYUIButton(this, "fileUpload-button", this.onFileUpload, + { + disabled: true, + value: "file" + }); + + // Declare record button: user needs "file" access + this.widgets.declareRecord = $createYUIButton(this, "declareRecord-button", this.onFileUpload, + { + disabled: true, + value: "file" + }); + + // Import button: user needs "import" access + this.widgets.importButton = $createYUIButton(this, "import-button", this.onImport, + { + disabled: true, + value: "import" + }); + + // RM-318 - removing Report button temporarily + /*this.widgets.reportButton = $createYUIButton(this, "report-button", this.onPrintReport, + { + disabled: true + });*/ + + // Export All button: user needs "export" access + this.widgets.exportAllButton = $createYUIButton(this, "exportAll-button", this.onExportAll, + { + disabled: true, + value: "export" + }); + + // Manage Rules button: + this.widgets.manageRules = $createYUIButton(this, "manageRules-button", this.onManageRules, + { + disabled: true, + value: "manageRules" + }); + + // Manage permissions button: user needs "file" permissions and the capability to modify permissions + this.widgets.managePermissionsButton = $createYUIButton(this, "managePermissions-button", this.onManagePermissions, + { + disabled: true, + value: "managePermissions" + }); + + // Manage Rules button: + this.widgets.unfiledManageRules = $createYUIButton(this, "unfiledManageRules-button", this.onManageRules, + { + disabled: true, + value: "manageRules" + }); + + // Manage permissions button for unfiled records toolbar: user needs "file" permissions and the capability to modify permissions + this.widgets.unfiledManagePermissionsButton = $createYUIButton(this, "unfiledManagePermissions-button", this.onManagePermissions, + { + disabled: true, + value: "managePermissions" + }); + + // Manage permissions button for holds toolbar: user needs "file" permissions and the capability to modify permissions + this.widgets.holdPermissionsButton = $createYUIButton(this, "holdPermissions-button", this.onManagePermissions, + { + disabled: true, + value: "managePermissions" + }); + + // Manage permissions button for transfers toolbar: user needs "file" permissions and the capability to modify permissions + this.widgets.transferPermissionsButton = $createYUIButton(this, "transferPermissions-button", this.onManagePermissions, + { + disabled: true, + value: "managePermissions" + }); + + // Selected Items menu button + this.widgets.selectedItems = $createYUIButton(this, "selectedItems-button", this.onSelectedItems, + { + type: "menu", + menu: "selectedItems-menu", + lazyloadmenu: false, + disabled: true + }); + + // Hide/Show NavBar button + this.widgets.hideNavBar = $createYUIButton(this, "hideNavBar-button", this.onHideNavBar, + { + type: "checkbox", + checked: this.options.hideNavBar + }); + if (this.widgets.hideNavBar !== null) + { + this.widgets.hideNavBar.set("title", this.msg(this.options.hideNavBar ? "button.navbar.show" : "button.navbar.hide")); + Dom.setStyle(this.id + "-navBar", "display", this.options.hideNavBar ? "none" : "block"); + } + + // Folder Up Navigation button + this.widgets.folderUp = Alfresco.util.createYUIButton(this, "folderUp-button", this.onFolderUp, + { + disabled: true + }); + + // DocLib Actions module + this.modules.actions = new Alfresco.module.DoclibActions(); + + // Reference to Document List component + this.modules.docList = Alfresco.util.ComponentManager.findFirst("Alfresco.DocumentList"); + + // Preferences service + this.services.preferences = new Alfresco.service.Preferences(); + + // Finally show the component body here to prevent UI artifacts on YUI button decoration + Dom.setStyle(this.id + "-body", "visibility", "visible"); + }, + + /** + * Document List Metadata event handler + * + * @method onDoclistMetadata + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDoclistMetadata: function DLTB_onDoclistMetadata(layer, args) + { + var obj = args[1]; + this.folderDetailsUrl = null; + //doclistMetadata.parent.permissions.user.CreateChildren + if (obj && obj.metadata && obj.metadata.parent) + { + this.doclistMetadata = Alfresco.util.deepCopy(obj.metadata); + var p = obj.metadata.parent, + userPerms; + + if (p && p.rmNode) + { + if (p.rmNode.uiType !== "fileplan") + { + this.folderDetailsUrl = Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + "/rm-" + p.rmNode.uiType + "-details?nodeRef=" + p.nodeRef; + } + + // Copy parent's viable actions into user permissions object for legacy support + if (p.rmNode.actions) + { + userPerms = p.permissions.user; + for (var l = 0, m = p.rmNode.actions.length; l < m; l++) + { + if (!userPerms.hasOwnProperty(p.rmNode.actions[l])) + { + userPerms[p.rmNode.actions[l]] = true; + } + } + } + } + + // We need to remove the "CreateChildren" permission so that the default "Upload Files" help templates are not rendered + delete p.permissions.user.CreateChildren; + } + }, + + /** + * Selected Files Changed event handler. + * Determines whether to enable or disable the multi-file action drop-down + * + * @method onSelectedFilesChanged + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onSelectedFilesChanged: function DLTB_onSelectedFilesChanged(layer, args) + { + /** + * Legacy action support: loop through each record, adding the available actions as viable + * "permissions" for the current user. + */ + var files = this.modules.docList.getSelectedFiles(), + file, rmNode, i, j, l, m, + userPerms; + + if (files.length == 0) + { + this.widgets.selectedItems.set("disabled", true); + return; + } + + for (i = 0, j = files.length; i < j; i++) + { + file = files[i]; + rmNode = file.node.rmNode; + if (rmNode && rmNode.actions) + { + userPerms = file.node.permissions.user; + for (l = 0, m = rmNode.actions.length; l < m; l++) + { + if (!userPerms.hasOwnProperty(rmNode.actions[l])) + { + userPerms[rmNode.actions[l]] = true; + } + } + } + if (file.node.rmNode === undefined) + { + //Add in permission to non-rm nodes to bulk remove from hold if the node has the remove from hold single item action available + for (count = 0, actionsCount = file.actions.length; count < actionsCount; count++) + { + if (file.actions[count].id === 'rm-remove-from-hold') + { + file.node.permissions.user['removeFromHold'] = true; + break; + } + } + } + } + + if (this.modules.docList) + { + var files = this.modules.docList.getSelectedFiles(), fileTypes = [], file, + fileType, userAccess = {}, fileAccess, index, + menuItems = this.widgets.selectedItems.getMenu().getItems(), menuItem, + actionPermissions, typeGroups, typesSupported, disabled, + commonAspects = [], allAspects = [], commonProperties = [], allProperties = [], + i, ii, j, jj; + + var fnFileType = function fnFileType(file) + { + //Add check to make the selected items dropdown responsive to active content + if (file.node.rmNode === undefined) + { + return file.node.uiType; + } + else + { + return file.node.rmNode.uiType; + } + }; + + // first time around fill with permissions from first node + // NOTE copy so we don't remove permissions from first node + userAccess = Alfresco.util.deepCopy(files[0].node.permissions.user); + // Check each file for user permissions + for (i = 0, ii = files.length; i < ii; i++) + { + file = files[i]; + + // Required user access level - logical AND of each file's permissions + // every time after that remove permission if it isn't present on the current node. + fileAccess = file.node.permissions.user; + for (index in userAccess) + { + if (!fileAccess.hasOwnProperty(index)) + { + userAccess[index] = undefined; + } + else + { + userAccess[index] = userAccess[index] && fileAccess[index]; + } + } + + // Make a note of all selected file types Using a hybrid array/object so we can use both array.length and "x in object" + fileType = fnFileType(file); + if (!(fileType in fileTypes)) + { + fileTypes[fileType] = true; + fileTypes.push(fileType); + } + + // Build a list of common aspects + + + if (i === 0) + { + // first time around fill with aspects/properties from first node - + // NOTE copy so we don't remove aspects/properties from file node. + commonAspects = Alfresco.util.deepCopy(file.node.aspects); + commonProperties = Alfresco.util.deepCopy(file.node.properties); + } else + { + // every time after that remove aspect if it isn't present on the current node. + for (j = 0, jj = commonAspects.length; j < jj; j++) + { + if (!Alfresco.util.arrayContains(file.node.aspects, commonAspects[j])) + { + Alfresco.util.arrayRemove(commonAspects, commonAspects[j]) + } + } + } + + // Build a list of all aspects + for (j = 0, jj = file.node.aspects.length; j < jj; j++) + { + if (!Alfresco.util.arrayContains(allAspects, file.node.aspects[j])) + { + allAspects.push(file.node.aspects[j]) + } + } + + // Build a list of all properties + var properties = file.node.properties; + for (var pIndex in properties) + { + if (properties.hasOwnProperty(pIndex)) + { + allProperties.push(pIndex); + } + } + } + + // Now go through the menu items, setting the disabled flag appropriately + for (index in menuItems) + { + if (menuItems.hasOwnProperty(index)) + { + // Defaulting to enabled + menuItem = menuItems[index]; + disabled = false; + + if (menuItem.element.firstChild) + { + // Check permissions required - stored in "rel" attribute in the DOM + if (menuItem.element.firstChild.rel && menuItem.element.firstChild.rel !== "") + { + // Comma-separated indicates and "AND" match + actionPermissions = menuItem.element.firstChild.rel.split(","); + for (i = 0, ii = actionPermissions.length; i < ii; i++) + { + // Disable if the user doesn't have ALL the permissions + if (!userAccess[actionPermissions[i]]) + { + disabled = true; + break; + } + } + } + + // Check required aspects. + // Disable if any node DOES NOT have ALL required aspects + var hasAspects = Dom.getAttribute(menuItem.element.firstChild, "data-has-aspects"); + if (hasAspects && hasAspects !== "") + { + hasAspects = hasAspects.split(","); + for (i = 0, ii = hasAspects.length; i < ii; i++) + { + if (!Alfresco.util.arrayContains(commonAspects, hasAspects[i])) + { + disabled = true; + break; + } + } + } + + // Check forbidden aspects. + // Disable if any node DOES have ANY forbidden aspect + var notAspects = Dom.getAttribute(menuItem.element.firstChild, "data-not-aspects"); + if (notAspects && notAspects !=="") + { + notAspects = notAspects.split(","); + for (i = 0, ii = notAspects.length; i < ii; i++) + { + if(Alfresco.util.arrayContains(allAspects, notAspects[i])) + { + disabled = true; + break; + } + } + } + + // Check required properties. + // Disable if any node DOES NOT have ALL required properties + var hasProperties = Dom.getAttribute(menuItem.element.firstChild, "data-has-properties"); + if (hasProperties && hasProperties !== "") + { + hasProperties = hasProperties.split(","); + for (i = 0, ii = hasProperties.length; i < ii; i++) + { + if (!Alfresco.util.arrayContains(commonProperties, hasProperties[i])) + { + disabled = true; + break; + } + } + } + + // Check forbidden properties. + // Disable if any node DOES have ANY forbidden properties + var notProperties = Dom.getAttribute(menuItem.element.firstChild, "data-not-properties"); + if (notProperties && notProperties !=="") + { + notProperties = notProperties.split(","); + for (i = 0, ii = notProperties.length; i < ii; i++) + { + if(Alfresco.util.arrayContains(allProperties, notProperties[i])) + { + disabled = true; + break; + } + } + } + + if (!disabled) + { + // Check filetypes supported + if (menuItem.element.firstChild.type && menuItem.element.firstChild.type !== "") + { + // Pipe-separation indicates grouping of allowed file types + typeGroups = menuItem.element.firstChild.type.split("|"); + + for (i = 0; i < typeGroups.length; i++) // Do not optimize - bounds updated within loop + { + typesSupported = Alfresco.util.arrayToObject(typeGroups[i].split(",")); + + for (j = 0, jj = fileTypes.length; j < jj; j++) + { + if (!(fileTypes[j] in typesSupported)) + { + typeGroups.splice(i, 1); + --i; + break; + } + } + } + disabled = (typeGroups.length === 0); + } + } + menuItem.cfg.setProperty("disabled", disabled); + } + } + } + this.widgets.selectedItems.set("disabled", (files.length === 0)); + } + }, + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * New Category button click handler + * + * @method onNewCategory + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onNewCategory: function DLTB_onNewCategory(e, p_obj) + { + this._newContainer("rma:recordCategory"); + }, + + /** + * New Folder button click handler + * + * @method onNewFolder + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onNewFolder: function DLTB_onNewFolder(e, p_obj) + { + this._newContainer("rma:recordFolder"); + }, + + /** + * New Unfiled Records Folder button click handler + * + * @method onNewUnfiledRecordsFolder + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onNewUnfiledRecordsFolder: function DLTB_onNewUnfiledRecordsFolder(e, p_obj) + { + this._newContainer("rma:unfiledRecordFolder"); + }, + + /** + * New Hold button click handler + * + * @method onNewHold + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onNewHold: function DLTB_onNewHold(e, p_obj) + { + this._newContainer("rma:hold"); + }, + + /** + * New Container handler + * + * @method _newContainer + * @protected + * @param folderType {string} Folder type to create + */ + _newContainer: function DLTB__newContainer(folderType) + { + var destination = this._getFolderDestination(); + + // Intercept before dialog show + var doBeforeDialogShow = function DLTB__newContainer_doBeforeDialogShow(p_form, p_dialog) + { + var label = "label.new-" + folderType.replace(":", "_"); + Dom.get(p_dialog.id + "-dialogTitle").innerHTML = this.msg(label + ".title"); + Dom.get(p_dialog.id + "-dialogHeader").innerHTML = this.msg(label + ".header"); + }; + + var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&destination={destination}&mode={mode}&submitType={submitType}&formId={formId}&showCancelButton=true", + { + itemKind: "type", + itemId: folderType, + destination: destination, + mode: "create", + submitType: "json", + formId: "doclib-common" + }); + + // Using Forms Service, so always create new instance + var createFolder = new Alfresco.module.SimpleDialog(this.id + "-createFolder"); + + createFolder.setOptions( + { + width: "33em", + templateUrl: templateUrl, + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + }, + onSuccess: + { + fn: function DLTB__newContainer_success(response) + { + var folderName = response.config.dataObj["prop_cm_name"]; + YAHOO.Bubbling.fire("folderCreated", + { + name: folderName, + parentNodeRef: destination + }); + this._displayMessageByType(folderType, "success", folderName); + }, + scope: this + }, + onFailure: + { + fn: function DLTB__newContainer_failure(response) + { + var folderName = response.config.dataObj["prop_cm_name"]; + this._displayMessageByType(folderType, "failure", folderName); + createFolder.widgets.cancelButton.set("disabled", false); + }, + scope: this + } + }).show(); + }, + + /** + * Helper method to display the correct message for each type in the UI + * + * @method _displayMessageByType + * @param type The type of the created element + * @param callbackAction The callback action type which is either "success" or "failure" + * @param name The name of the created element + */ + _displayMessageByType: function DLTB_getMessageByType(type, callbackAction, name) + { + var message = null; + switch (type) + { + case "rma:recordCategory": + message = "message.new-category."; + break; + case "rma:recordFolder": + message = "message.new-folder."; + break; + case "rma:unfiledRecordFolder": + message = "message.new-unfiledRecordsFolder."; + break; + case "rma:hold": + message = "message.new-hold."; + break; + default: + throw this.msg("message.new-unknown.error", type); + } + + $popupManager.displayMessage( + { + text: this.msg(message + callbackAction, name) + }); + }, + + /** + * Helper method to find the destination for record folder creation. + * + * @method _getFolderDestination + */ + _getFolderDestination: function DLTB__getFolderDestination() + { + var destination = this.modules.docList.doclistMetadata.parent.nodeRef; + var filterParam = Alfresco.rm.getParamValueFromUrl("filter"); + if (filterParam) + { + var filter = filterParam.split("|"); + if (filter[0] !== 'path' && filter[1]) + { + destination = decodeURIComponent(filter[1]); + } + } + return destination; + }, + + /** + * File Upload button click handler + * + * @method onFileUpload + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onFileUpload: function DLTB_onFileUpload(e, p_obj) + { + var me = this; + + $popupManager.displayPrompt( + { + title: this.msg("message.file.type.title"), + text: this.msg("message.file.type"), + buttons: [ + { + text: this.msg("button.electronic"), + handler: function DLTB_onFileUpload_electronic() + { + this.destroy(); + me.onElectronicRecord.call(me); + }, + isDefault: true + }, + { + text: this.msg("button.non-electronic"), + handler: function DLTB_onFileUpload_nonElectronic() + { + this.destroy(); + me.onNonElectronicDocument.call(me); + } + }, + { + text: this.msg("button.cancel"), + handler: function DLTB_onFileUpload_cancel() + { + this.destroy(); + } + }] + }); + }, + + /** + * Electronic Record button click handler + * + * @method onElectronicRecord + */ + onElectronicRecord: function DLTB_onElectronicRecord() + { + if (this.fileUpload === null) + { + this.fileUpload = Alfresco.getRecordsFileUploadInstance(); + } + + // Show uploader for multiple files + this.fileUpload.show( + { + containerId: this.options.containerId, + destination: this._getFolderDestination(), + filter: [], + mode: this.fileUpload.MODE_MULTI_UPLOAD, + thumbnails: "doclib", + onFileUploadComplete: + { + fn: this.onFileUploadComplete, + scope: this + } + }); + }, + + /** + * Non-Electronic Record button click handler + * + * @method onNonElectronicDocument + */ + onNonElectronicDocument: function DLTB_onNonElectronicDocument() + { + var destination = this._getFolderDestination(), + label = "label.new-rma_nonElectronicDocument", + msgTitle = this.msg(label + ".title"), + msgHeader = this.msg(label + ".header"); + + // Intercept before dialog show + var doBeforeDialogShow = function DLTB_onNonElectronicDocument_doBeforeDialogShow(p_form, p_dialog) + { + Dom.get(p_dialog.id + "-dialogTitle").innerHTML = msgTitle; + Dom.get(p_dialog.id + "-dialogHeader").innerHTML = msgHeader; + }; + + var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&destination={destination}&mode={mode}&submitType={submitType}&showCancelButton=true", + { + itemKind: "type", + itemId: "rma:nonElectronicDocument", + destination: destination, + mode: "create", + submitType: "json" + }); + + // Using Forms Service, so always create new instance + var createRecord = new Alfresco.module.SimpleDialog(this.id + "-createRecord"); + + createRecord.setOptions( + { + width: "33em", + templateUrl: templateUrl, + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + }, + onSuccess: + { + fn: function DLTB_onNonElectronicDocument_success(response) + { + var fileName = response.config.dataObj["prop_cm_name"]; + YAHOO.Bubbling.fire("metadataRefresh", + { + highlightFile: fileName + }); + $popupManager.displayMessage( + { + text: this.msg("message.new-record.success", fileName) + }); + }, + scope: this + }, + onFailure: + { + fn: function DLTB_onNonElectronicDocument_failure(response) + { + var fileName = response.config.dataObj["prop_cm_name"]; + $popupManager.displayMessage( + { + text: this.msg("message.new-record.failure", fileName) + }); + }, + scope: this + } + }).show(); + }, + + /** + * Import button click handler + * + * @method onImport + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onImport: function DLTB_onImport(e, p_obj) + { + // Create Uploader (Importer) component if it doesn't exist + if (this.fileUpload === null) + { + this.fileUpload = Alfresco.getRecordsFileUploadInstance(); + } + + // Show uploader for single import file + this.fileUpload.show( + { + mode: this.fileUpload.MODE_SINGLE_IMPORT, + importDestination: this.modules.docList.doclistMetadata.parent.nodeRef, + destination: this.modules.docList.doclistMetadata.parent.nodeRef, + flashUploadURL: "api/rma/admin/import", + htmlUploadURL: "api/rma/admin/import.html", + filter: [ + { + description: this.msg("label.filter-description.acp"), + extensions: "*.acp" + }, + { + description: this.msg("label.filter-description.zip"), + extensions: "*.zip" + }] + }); + }, + + /** + * Print Report button click handler + * + * @method onPrintReport + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onPrintReport: function DLTB_onPrintReport(e, p_obj) + { + var url = Alfresco.constants.URL_PAGECONTEXT + 'rm-fileplan-report?nodeRef=' + this.modules.docList.doclistMetadata.parent.nodeRef; + window.open(url, 'rm-fileplan-report', 'width=550,height=650,scrollbars=yes,resizable=yes,toolbar=no,menubar=no'); + }, + + /** + * Export All button click handler + * + * @method onExportAll + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onExportAll: function DLTB_onExportAll(e, p_obj) + { + // Url to webscript to get the nodeRefs for the top level series + var url = Alfresco.constants.PROXY_URI + "slingshot/doclib/rm/treenode/site/"; + url += encodeURIComponent(this.options.siteId) + "/" + encodeURIComponent(this.options.containerId); + url += "?perms=false&children=false"; + + // Load all series so they (and all their child objects) can be exported + Alfresco.util.Ajax.jsonGet( + { + url: url, + successCallback: + { + fn: function(serverResponse) + { + if (serverResponse.json && serverResponse.json.items && serverResponse.json.items.length > 0) + { + // Display the export dialog and do the export + this.onActionExport(serverResponse.json.items); + } + else + { + $popupManager.displayMessage( + { + text: this.msg("message.nothing-to-export") + }); + } + }, + scope: this + }, + failureMessage: this.msg("message.load-top-level-assets.failure") + }); + }, + + /** + * Manage rules button click handler + * + * @method onManageRules + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onManageRules: function DLTB_onManageRules(e, p_obj) + { + var parent = this.modules.docList.doclistMetadata.parent, + nodeRef = parent.nodeRef, + unfiled = (parent.type === "rma:unfiledRecordContainer" || parent.type === "rma:unfiledRecordFolder") ? true : false, + page = "folder-rules?nodeRef=" + nodeRef + "&unfiled=" + unfiled; + + window.location.href = $siteURL(page); + }, + + /** + * Manage permissions button click handler + * + * @method onManagePermissions + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onManagePermissions: function DLTB_onManagePermissions(e, p_obj) + { + var parent = this.modules.docList.doclistMetadata.parent, + nodeRef = parent.nodeRef, + itemName = encodeURIComponent(parent.properties["cm:name"]), + nodeType = parent.type, + filePlanId = new Alfresco.util.NodeRef(parent.rmNode.filePlan).id, + page = "manage-permissions?nodeRef=" + nodeRef + "&itemName=" + itemName + "&nodeType=" + nodeType + "&filePlanId=" + filePlanId; + + window.location.href = $siteURL(page); + }, + + + /** + * Delete Multiple Records confirmation. + * + * @method _onActionDeleteConfirm + * @param records {array} Array containing records to be deleted + * @private + */ + _onActionDeleteConfirm: function DLTB__onActionDeleteConfirm(records) + { + var multipleRecords = [], i, ii; + for (i = 0, ii = records.length; i < ii; i++) + { + multipleRecords.push(records[i].jsNode.nodeRef.nodeRef); + } + + // Success callback function + var fnSuccess = function DLTB__oADC_success(data, records) + { + var result; + var successFileCount = 0; + var successFolderCount = 0; + + for (i = 0, ii = data.json.totalResults; i < ii; i++) + { + result = data.json.results[i]; + + if (result.success) + { + if (result.type === "folder") + { + successFolderCount++; + } + else + { + successFileCount++; + } + + YAHOO.Bubbling.fire(result.type === "folder" ? "folderDeleted" : "fileDeleted", + { + multiple: true, + nodeRef: result.nodeRef + }); + } + } + // Did the operation succeed? + if (!data.json.overallSuccess) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.multiple-delete.failure", data.json.successCount, data.json.failureCount) + }); + // not automatically fired + YAHOO.Bubbling.fire("filesDeleted"); + return; + } + + this.modules.docList.totalRecords -= data.json.totalResults; + YAHOO.Bubbling.fire("filesDeleted"); + // Activities, in Site mode only + var successCount = successFolderCount + successFileCount; + if (Alfresco.util.isValueSet(this.options.siteId)) + { + var activityData; + + if (successCount > 0) + { + if (successCount < this.options.groupActivitiesAt) + { + // Below cutoff for grouping Activities into one + for (i = 0; i < successCount; i++) + { + activityData = + { + fileName: data.json.results[i].id, + nodeRef: data.json.results[i].nodeRef, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + + if (data.json.results[i].type === "folder") + { + this.modules.actions.postActivity(this.options.siteId, "folder-deleted", "documentlibrary", activityData); + } + else + { + this.modules.actions.postActivity(this.options.siteId, "file-deleted", "documentlibrary", activityData); + } + } + } + else + { + if (successFileCount > 0) + { + // grouped into one message + activityData = + { + fileCount: successFileCount, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "files-deleted", "documentlibrary", activityData); + } + if (successFolderCount > 0) + { + // grouped into one message + activityData = + { + fileCount: successFolderCount, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "folders-deleted", "documentlibrary", activityData); + } + } + } + } + + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.multiple-delete.success", successCount) + }); + }; + + // Construct the data object for the genericAction call + this.modules.actions.genericAction( + { + success: + { + callback: + { + fn: fnSuccess, + scope: this, + obj: records + } + }, + failure: + { + message: this.msg("message.multiple-delete.failure") + }, + webscript: + { + method: Alfresco.util.Ajax.DELETE, + name: "files" + }, + wait: + { + message: this.msg("message.multiple-delete.please-wait") + }, + config: + { + requestContentType: Alfresco.util.Ajax.JSON, + dataObj: + { + nodeRefs: multipleRecords + } + } + }); + } + + + }, true); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/tree.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/tree.css new file mode 100644 index 0000000000..e1b7b8e5f8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/tree.css @@ -0,0 +1,48 @@ +.treeview .tree +{ + padding: 0.5em 0 1em; +} + +.treeview .ygtvspacer +{ + width: 18px; +} + +.treeview .ygtvchildren +{ + width: 150%; +} + +.treeview .ygtvitem +{ + background-color: #ffffff; + overflow-x: hidden; +} + +.treeview .ygtvitem .folders-trimmed +{ + color: #f00; +} + +.treeview .ygtvlabel, +.treeview .ygtvlabel:link, +.treeview .ygtvlabel:visited, +.treeview .ygtvlabel:hover +{ + background: none; + color: #000; +} + +.treeview .ygtverror, +.treeview .ygtverror:link, +.treeview .ygtverror:visited, +.treeview .ygtverror:hover +{ + background: red; + color: white; +} + +.treeview .selected +{ + background-color: #dceaf4; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/tree.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/tree.js new file mode 100644 index 0000000000..74af893675 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/documentlibrary/tree.js @@ -0,0 +1,78 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * DocumentList TreeView component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DocListTree + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths; + + /** + * Records DocumentList TreeView constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.DocListTree} The new RecordsDocListTree instance + * @constructor + */ + Alfresco.rm.component.DocListTree = function DLT_constructor(htmlId) + { + return Alfresco.rm.component.DocListTree.superclass.constructor.call(this, htmlId); + }; + + YAHOO.extend(Alfresco.rm.component.DocListTree, Alfresco.DocListTree, + { + /** + * PRIVATE FUNCTIONS + */ + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + */ + _buildTreeNodeUrl: function DLT__buildTreeNodeUrl(path) + { + var uriTemplate ="slingshot/doclib/rm/treenode/site/" + $combine(encodeURIComponent(this.options.siteId), encodeURIComponent(this.options.containerId), Alfresco.util.encodeURIPath(path)); + return Alfresco.constants.PROXY_URI + uriTemplate + "?perms=false&children=" + this.options.evaluateChildFolders; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition-edit.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition-edit.css new file mode 100644 index 0000000000..36f48f91ce --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition-edit.css @@ -0,0 +1,296 @@ +.rm-disposition-edit .caption, +.rm-disposition-edit .disposition-form, +.rm-disposition-edit .main-buttons +{ + width: 50em; +} + +.rm-disposition-edit .flow-buttons +{ + width: 52em; +} + +.rm-disposition-edit .caption +{ + text-align: right; + padding: 0 1em 0.5em 1em; +} + +.rm-disposition-edit .disposition-form +{ + background-color: #F5FFF2; + border: 1px solid #C2C2C2 !important; + padding: 1em !important; +} + +.rm-disposition-edit .mandatory-indicator +{ + color:green; + margin-left:0.4em; + margin-right:0.4em; +} + +.rm-disposition-edit .header +{ + font-weight: bold; +} + +.rm-disposition-edit .hidden +{ + display: none; +} + +.rm-disposition-edit textarea +{ + height: 5em; + width: 99%; + margin-top: 0.5em; +} + +.rm-disposition-edit input[type="text"].period-amount +{ + width: 2em; + text-align:center; +} + +.rm-disposition-edit select.period-unit +{ + width: 8.5em; +} + +.rm-disposition-edit select.action-type, +.rm-disposition-edit select.action-event-name-value +.rm-disposition-edit select.relation +{ + width: 15em; +} + +.rm-disposition-edit select.relation +{ + margin-left: 1.2em; +} + +.rm-disposition-edit select.action-type +{ + margin-top: 0.5em; +} + +.rm-disposition-edit .action +{ + clear: both; + margin-bottom: 0.3em; + min-height: 2em; +} + +.rm-disposition-edit .action +{ + border: 1px solid #D5D5D5; +} + +.rm-disposition-edit .action .header +{ + background-color: #EAEAEA; + height:2.5em; + padding:0; +} + +.rm-disposition-edit .action .header div +{ + height:2.5em; + line-height:2.5em; +} + +.rm-disposition-edit .action .header .no +{ + position: absolute; + text-align: center; + width: 3em; + color: #FFFFFF; + background-image:url(../../../components/images/green-step-circle.png); + background-position:center center; + background-repeat:no-repeat; + margin-left: 0.25em; +} + +.rm-disposition-edit .action .header .title +{ + color: #008000; + padding-left: 3.25em; +} + + +.rm-disposition-edit .action .header .buttons +{ + float: right; + margin-right: 1em; +} + +.rm-disposition-edit .action .details +{ + border-top: 1px solid #D5D5D5; + background-color: #FFFFFF; +} + +.rm-disposition-edit .action .relation-label +{ + text-align:center; + width:3em; +} + +.rm-disposition-edit .action .section +{ + padding-left: 3.25em; + line-height:1em; + clear: both; + padding-top: 0.5em; + padding-bottom: 0.5em; + width: 90%; +} + +.rm-disposition-edit .action .section.events .events-header +{ + margin-left: 4em; + padding-left: 0.5em; + width: 40.5em; +} + +.rm-disposition-edit .action .section.events .event-completion-header, +.rm-disposition-edit .action .section.events .event-name-header +{ + float: left; + margin-bottom: 0.2em; +} + +.rm-disposition-edit .action .section.events .event-completion-header +{ + width: 15em; +} + +.rm-disposition-edit .action .section.events .event-name-header +{ + width: 21em; +} + +.rm-disposition-edit .action .section.events .event-name-header +{ + padding-left: 0.6em; +} + + +.rm-disposition-edit .action .details .buttons, +.rm-disposition-edit .main-buttons +{ + text-align: center; + padding-bottom: 0.5em; + padding-top: 0.5em; +} + +.rm-disposition-edit .main-buttons +{ + padding:1em; +} + +.rm-disposition-edit .action .details .buttons +{ + background-color: #D4D4D4; + border-top: 1px solid #D5D5D5; +} + + +.rm-disposition-edit .action .header .buttons .delete, +.rm-disposition-edit .action .action-event-buttons .delete, +.rm-disposition-edit .action .header .buttons .edit +{ + cursor: pointer; + background-position: center center; + background-repeat: no-repeat; + padding: 0.5em 0.5em 0.5em 1em; +} + +.rm-disposition-edit .action .header .buttons .delete, +.rm-disposition-edit .action .action-event-buttons .delete +{ + background-image:url(../../../components/images/delete-16.png); +} + +.rm-disposition-edit .action .header .buttons .edit +{ + background-image:url(../../../components/images/edit-16.png); +} + +.rm-disposition-edit .action .action-event-relation +{ + position: absolute; + width: 3em; + text-align: center; +} + +.rm-disposition-edit .action .or-relation, +.rm-disposition-edit .action .and-relation, +.rm-disposition-edit .action .or, +.rm-disposition-edit .action .and +{ + font-weight: bold; +} + +.rm-disposition-edit .action .events-list .first .action-event-relation, +.rm-disposition-edit .action.or .and, +.rm-disposition-edit .action.and .or, +.rm-disposition-edit .action.and .or-relation, +.rm-disposition-edit .action.or .and-relation, +.rm-disposition-edit .action.relation-disabled .or-relation, +.rm-disposition-edit .action.relation-disabled .and-relation, +.rm-disposition-edit .action.expanded .header .buttons +{ + display: none; +} + +.rm-disposition-edit .action .action-event-name +{ + position: absolute; + margin-left: 3.25em; + width: 22em; + padding-left: 0.5em +} + +.rm-disposition-edit .action .action-event-completion +{ + position: absolute; + margin-left: 25.25em; + width: 16em; +} + +.rm-disposition-edit .action .action-event-buttons +{ + position: absolute; + width: 2em; + margin-left: 41.25em; +} + + +.rm-disposition-edit .action .events-list +{ + padding-bottom: 1em; + padding-left: 1em; +} + +.rm-disposition-edit .action .events-list li +{ + clear: both; + height: 2.5em; + line-height: 2.5em; +} + +.rm-disposition-edit .action .events-list li div +{ + height: 2.5em; + line-height: 2.5em; +} + +.rm-disposition-edit .action .events-list li.even .action-event-name, +.rm-disposition-edit .action .events-list li.even .action-event-completion, +.rm-disposition-edit .action .events-list li.even .action-event-buttons +{ + background-color: #EFEFEF; +} + diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition-edit.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition-edit.js new file mode 100644 index 0000000000..d3c9bd4eb4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition-edit.js @@ -0,0 +1,1289 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * DispositionEdit component. + * + * User can add, edit and remove action (steps) in the disposition schedule + * and to each action ad and remove events. + * Meta data properties can be edited on a different page. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DispositionEdit + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $encodeHtml = Alfresco.util.encodeHTML; + $decodeHtml = Alfresco.util.decodeHTML; + + /** + * DispositionEdit constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.DispositionEdit} The new component instance + * @constructor + */ + Alfresco.rm.component.DispositionEdit = function DispositionEdit_constructor(htmlId) + { + return Alfresco.rm.component.DispositionEdit.superclass.constructor.call(this, "Alfresco.rm.component.DispositionEdit", htmlId, ["button", "container"]); + }; + + YAHOO.extend(Alfresco.rm.component.DispositionEdit, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * The nodeRef to the object that owns the disposition schedule that is configured + * + * @property nodeRef + * @type {string} + */ + nodeRef: null, + + /** + * The url to the filePlan that is configured + * + * @property fileplanUrl + * @type {string} + */ + siteId: null, + + /** + * The events available and information about if they are autmatic or not + * + * @property events + * @type {object} with objects like { label: string, automatic: boolean} + * and the event name {string} as the key. + */ + events: {}, + + /** + * The actions available and their labels + * + * @property actions + * @type {object} with objects like { label: string} + * and the action name/type {string} as the key. + */ + actions: {}, + + recordLevelDisposition: false, + + /** + * Local copy of the defined action used to undo cancelled edits + */ + actionMap: {} + }, + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + */ + onReady: function DispositionEdit_onReady() + { + // Save a reference to important elements + this.widgets.actionListEl = Dom.get(this.id + "-actionList"); + this.widgets.flowButtons = Dom.get(this.id + "-flowButtons"); + + // Create done button + this.widgets.doneButton = Alfresco.util.createYUIButton(this, "done-button", this.onDoneActionsButtonClick); + + // Create action button + var createActionButtonEl = Dom.get(this.id + "-createaction-button"), + createActionMenuEl = Dom.get(this.id + "-createaction-menu") + me = this; + var createActionButton = Alfresco.util.createYUIButton(this, "createaction-button", null, + { + type: "menu", + lazyloadmenu: false, + menu: createActionMenuEl, + disabled: true + }, createActionButtonEl); + this.widgets.createActionButton = createActionButton; + + // Make sure only allowed actions are enabled when the menu appears + createActionButton.getMenu().subscribe("beforeShow", function(p_sType, p_aArgs, aItemsArray) + { + me._disableUnallowedActions(); + }, []); + + // Make sure clicks on disabled values doesn't add an action + createActionButton.getMenu().subscribe("click", function(p_sType, p_aArgs) + { + if (p_aArgs[1] && !p_aArgs[1].cfg.getProperty("disabled")) + { + me._createNewAction(p_aArgs[1].value); + } + }); + + // Get the templates and remove the dummy placeholders from the DOM + this.widgets.eventTemplateEl = Dom.get(this.id + "-event-template"); + var dummyEl = Dom.get(this.id + "-event-template-dummy"); + dummyEl.parentNode.removeChild(dummyEl); + this.widgets.actionTemplateEl = Dom.get(this.id + "-action-template"); + + this._loadActions(); + }, + + /** + * Loads actions from the server + * + * @method _loadActions + * @private + */ + _loadActions: function DispositionEdit__loadActions() + { + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI_RELATIVE + "api/node/" + this.options.nodeRef.replace(":/", "") + "/dispositionschedule", + successCallback: + { + fn: function(response) + { + if (response.json) + { + var dummyEl = Dom.get(this.id + "-action-template-dummy"), + schedule = response.json.data, + actions = schedule.actions ? schedule.actions : [], + action, + actionEl; + + this.options.recordLevelDisposition = schedule.recordLevelDisposition; + + if (actions.length == 0) + { + dummyEl.innerHTML = this.msg("message.noSteps"); + } + else + { + dummyEl.parentNode.removeChild(dummyEl); + for (var i = 0, ii = actions.length; i < ii; i++) + { + action = actions[i]; + action.deleteable = schedule.canStepsBeRemoved; + actionEl = this._createAction(action); + actionEl = this.widgets.actionListEl.appendChild(actionEl); + this._setupActionForm(action, actionEl); + this.options.actionMap[action.id] = action; + } + } + } + this.widgets.createActionButton.set("disabled", false); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.getActionFailure", this.name) + }); + }, + scope: this + } + }); + }, + + /** + * Loads disposition properties from the server + * + * @method _loadDispositionProperties + * @private + */ + _loadDispositionProperties: function DispositionEdit__loadDispostionProperties(action, actionEl) + { + var remoteUrl = Alfresco.constants.PROXY_URI_RELATIVE + "api/rma/dispositionproperties?recordlevel=" + this.options.recordLevelDisposition + "&dispositionaction=" + action.name; + + Alfresco.util.Ajax.jsonGet( + { + url: remoteUrl, + successCallback: + { + fn: function(response) + { + if (response.json) + { + var periodActionEl = Dom.getElementsByClassName("period-action", "select", actionEl)[0], + data = response.json.data, + properties = data.properties ? data.properties : [], + property, + option; + + if (properties.length !== 0) + { + for (var i = 0, ii = properties.length; i < ii; i++) + { + property = properties[i]; + + option = document.createElement("option"); + option.text = property.label; + option.value = property.value; + if (action.periodProperty === property.value) + { + option.selected = true; + } + try + { + periodActionEl.add(option, null); + } + catch(ex) + { + // IE catch + var index = (periodActionEl.selectedIndex != -1) ? periodActionEl.selectedIndex : periodActionEl.length; + periodActionEl.add(option, index); + } + } + } + } + this.widgets.createActionButton.set("disabled", false); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.getActionFailure", this.name) + }); + }, + scope: this + } + }); + }, + + /** + * Create a action in the list + * + * @method _createAction + * @param action The action info object + * @private + */ + _createAction: function DispositionEdit__createAction(action) + { + var me = this; + + // Clone template + var actionEl = this.widgets.actionTemplateEl.cloneNode(true), + elId = Alfresco.util.generateDomId(actionEl); + + // Action Id + Dom.getElementsByClassName("id", "input", actionEl)[0].value = action.id; + + // Period + var period = action.period ? action.period.split("|") : []; + + // Sequence Number + Dom.getElementsByClassName("no", "div", actionEl)[0].innerHTML = action.index + 1; + + // Description + Dom.getElementsByClassName("description", "textarea", actionEl)[0].value = action.description ? action.description : ""; + + // Ghost on destroy + Dom.getElementsByClassName("ghostOnDestroy", "input", actionEl)[0].checked = (action.ghostOnDestroy == "ghost"); + + // Combine disposition step conditions + var radioButtonOrAnd = Dom.getElementsByClassName("combineDispositionStepConditions", "input", actionEl), + radioButtonOr = radioButtonOrAnd[0], + radioButtonAnd = radioButtonOrAnd[1]; + + radioButtonOr.checked = !(action.combineDispositionStepConditions && action.combineDispositionStepConditions === "true"); + radioButtonAnd.checked = (action.combineDispositionStepConditions && action.combineDispositionStepConditions === "true"); + + // Action name & location + var actionName = action.name, + actionNameEl = Dom.getElementsByClassName("action-name", "input", actionEl)[0], + actionLocationEl = Dom.getElementsByClassName("action-location", "select", actionEl)[0], + actionLocationSpan = Dom.getElementsByClassName("action-location-section", "span", actionEl)[0], + actionGhostSpan = Dom.getElementsByClassName("action-ghost-section", "span", actionEl)[0], + actionOrStepConditionsSpan = Dom.getElementsByClassName("action-or-step-conditions-span", "span", actionEl)[0], + actionCombineStepConditionsSpan = Dom.getElementsByClassName("action-combine-step-conditions-span", "span", actionEl)[0], + actionLocationRestrictedSpan = Dom.getElementsByClassName("action-location-restricted-section", "span", actionEl)[0]; + if (actionName == "transfer") + { + // Display location since its a transfer action + Dom.removeClass(actionLocationSpan, "hidden"); + Dom.addClass(actionLocationRestrictedSpan, "hidden"); + var locationSetInDropDown = Alfresco.util.setSelectedIndex(actionLocationEl, action.location) !== null; + if (action.location && action.location !== "" && !locationSetInDropDown) + { + /** + * The action/step had a location set but the current user hasn't been granted access + * to the value of the location, there display the location as a text label instead + */ + actionLocationRestrictedSpan.innerHTML = action.location; + Dom.removeClass(actionLocationRestrictedSpan, "hidden"); + Dom.addClass(actionLocationEl, "hidden"); + actionLocationEl.disabled = true; + } + } + else + { + Alfresco.util.setSelectedIndex(actionLocationEl, ""); + Dom.addClass(actionLocationSpan, "hidden"); + } + if(actionName == "destroy") + { + Dom.removeClass(actionGhostSpan, "hidden"); + } + else + { + Dom.addClass(actionGhostSpan, "hidden"); + } + if (actionName === "accession") + { + Dom.addClass(actionOrStepConditionsSpan, "hidden"); + Dom.removeClass(actionCombineStepConditionsSpan, "hidden"); + } + else + { + Dom.removeClass(actionOrStepConditionsSpan, "hidden"); + Dom.addClass(actionCombineStepConditionsSpan, "hidden"); + } + // Display the actions label and set it in the form + actionNameEl.value = actionName; + + // Period Amount + var periodAmount = (period && period.length > 1) ? period[1] : null, + periodAmountEl = Dom.getElementsByClassName("period-amount", "input", actionEl)[0]; + periodAmountEl.value = periodAmount ? $decodeHtml(periodAmount) : ""; + periodAmountEl.setAttribute("id", elId + "-periodAmount"); + Event.addListener(periodAmountEl, "keyup", this.onPeriodAmountTextKeyUp, + { + actionEl: actionEl + }, this); + + // Load the disposition properties + this._loadDispositionProperties(action, actionEl); + + // Period Unit + var periodUnit = (period && period.length > 0) ? period[0] : null, + periodActionEl = Dom.getElementsByClassName("period-action", "select", actionEl)[0], + periodUnitEl = Dom.getElementsByClassName("period-unit", "select", actionEl)[0]; + Event.addListener(periodUnitEl, "change", this.onPeriodUnitSelectChange, + { + actionEl: actionEl, + periodAmountEl: periodAmountEl, + periodActionEl: periodActionEl + }, this); + Alfresco.util.setSelectedIndex(periodUnitEl, periodUnit); + + // Add event button + var addEventButtonEl = Dom.getElementsByClassName("addevent-button", "button", actionEl)[0], + addEventMenuEl = Dom.getElementsByClassName("addevent-menu", "select", actionEl)[0]; + var addEventButton = Alfresco.util.createYUIButton(this, "addevent-button", null, + { + type: "menu", + lazyloadmenu: false, + menu: addEventMenuEl + }, addEventButtonEl); + + addEventButton.getMenu().subscribe("beforeShow", function(p_sType, p_aArgs, aItemsArray) + { + me._disableUsedEvents(addEventButton, actionEl); + }, []); + + addEventButton.getMenu().subscribe("click", function(p_sType, p_aArgs) + { + if (p_aArgs[1] && !p_aArgs[1].cfg.getProperty("disabled")) + { + me._addSelectedEventItem(p_aArgs[1].value, actionEl, addEventButton); + } + }); + + // Enable/Disable period & events section + var periodEnabledCheckBox = Dom.getElementsByClassName("period-enabled", "input", actionEl)[0]; + periodEnabledCheckBox.checked = periodUnit || periodAmount; + this._disablePeriodSection(!periodEnabledCheckBox.checked, actionEl); + var eventsEnabledCheckBox = Dom.getElementsByClassName("events-enabled", "input", actionEl)[0]; + eventsEnabledCheckBox.checked = action.events && action.events.length > 0; + this._disableEventsSection(!eventsEnabledCheckBox.checked, actionEl); + if (!periodEnabledCheckBox.checked || !eventsEnabledCheckBox.checked) + { + Dom.addClass(actionEl, "relation-disabled"); + } + + // Add listeners to toggle enabling/disabling + Event.addListener(periodEnabledCheckBox, "click", this.onRelationEnablingCheckBoxClick, + { + actionEl: actionEl, + checkBoxEls: [periodEnabledCheckBox, eventsEnabledCheckBox] + }, this); + + Event.addListener(periodEnabledCheckBox, "click", function(e, checkBox) + { + this._disablePeriodSection(!checkBox.checked, actionEl); + }, periodEnabledCheckBox, this); + + Event.addListener(eventsEnabledCheckBox, "click", this.onRelationEnablingCheckBoxClick, + { + actionEl: actionEl, + checkBoxEls: [eventsEnabledCheckBox, periodEnabledCheckBox] + }, this); + + Event.addListener(eventsEnabledCheckBox, "click", function(e, checkBox) + { + this._disableEventsSection(!checkBox.checked, actionEl); + }, eventsEnabledCheckBox, this); + + // Relation + var relationSelect = Dom.getElementsByClassName("relation", "select", actionEl)[0]; + Dom.addClass(actionEl, action.eligibleOnFirstCompleteEvent ? "or" : "and"); + Alfresco.util.setSelectedIndex(relationSelect, action.eligibleOnFirstCompleteEvent + ""); + Event.addListener(relationSelect, "change", this.onRelationSelectChange, + { + actionEl: actionEl, + relationSelect: relationSelect + }, this); + + // Add listener to display edit and delete action + var detailsEl = Dom.getElementsByClassName("details", "div", actionEl)[0], + editEl = Dom.getElementsByClassName("edit", "span", actionEl)[0]; + Event.addListener(editEl, "click", this.onEditActionClick, + { + actionEl: actionEl, + detailsEl: detailsEl + }, this); + + var deleteEl = Dom.getElementsByClassName("delete", "span", actionEl)[0]; + if (action.deleteable) + { + Event.addListener(deleteEl, "click", this.onDeleteActionClick, actionEl, this); + } + else + { + Dom.addClass(deleteEl, "hidden"); + } + + // Add events + var eventListEl = Dom.getElementsByClassName("events-list", "ul", actionEl)[0]; + for (var i = 0; action.events && i < action.events.length; i++) + { + eventListEl.appendChild(this._createEvent(i, action.events[i])); + } + + // Set id on description textarea so it later can be referenced for validation + var descriptionEl = Dom.getElementsByClassName("description", "textarea", actionEl)[0]; + descriptionEl.setAttribute("id", elId + "-description"); + + // Make sure enabling and disabling is correct + this._disableEnablePeriodElements(periodUnitEl, periodAmountEl, periodActionEl); + + // Title + this._refreshTitle(actionEl); + + return actionEl; + }, + + /** + * Create an action in the list + * + * @method _setupActionForm + * @param action The action info object + * @param actionEl The action HTMLElement + * @private + */ + _setupActionForm: function DispositionEdit__setupActionForm(action, actionEl) + { + // Find id + var elId = actionEl.attributes["id"].value; + + // Setup form + var formEl = Dom.getElementsByClassName("action-form", "form", actionEl)[0], + formId = elId + "-action-form"; + + if (YAHOO.env.ua.ie > 0 && YAHOO.env.ua.ie < 8) + { + // MSIE 6 & 7 mix up name and id attributes on form children. Which is always useful. + formEl.attributes["id"].value = formId; + } + else + { + formEl.setAttribute("id", formId); + } + var actionForm = new Alfresco.forms.Form(formId); + + // Add validation + + // Temporary fix for RM-1044 + //actionForm.addValidation(elId + "-periodAmount", Alfresco.forms.validation.number, null, "keyup"); + + actionForm.addValidation(elId + "-description", Alfresco.forms.validation.mandatory, null, "keyup"); + var periodEnabledCheckBox = Dom.getElementsByClassName("period-enabled", "input", actionEl)[0]; + Event.addListener(periodEnabledCheckBox, "click", function(e, obj) + { + // Make sure save button is updated + obj.form.updateSubmitElements(); + }, + { + form: actionForm + }, this); + + // Create buttons + var saveActionEl = Dom.getElementsByClassName("saveaction", "span", actionEl)[0], + saveActionButton = Alfresco.util.createYUIButton(this, "saveaction-button", null, + { + type: "submit" + }, saveActionEl), + cancelEl = Dom.getElementsByClassName("cancel", "span", actionEl)[0], + cancelActionButton = Alfresco.util.createYUIButton(this, "cancel-button", null, {}, cancelEl); + + this.widgets.saveActionButton = saveActionButton; + saveActionButton.on("click", function() + { + this.widgets.saveActionButton.set("disabled", true); + }, null, this); + + cancelActionButton.on("click", this.onCancelActionButtonClick, + { + action: action, + actionEl: actionEl + }, this); + + // Set form url + var actionId = Dom.getElementsByClassName("id", "input", formEl)[0].value; + if (actionId && actionId.length > 0) + { + actionForm.setAjaxSubmitMethod(Alfresco.util.Ajax.PUT); + formEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/node/" + this.options.nodeRef.replace(":/", "") + "/dispositionschedule/dispositionactiondefinitions/" + actionId; + } + else + { + actionForm.setAjaxSubmitMethod(Alfresco.util.Ajax.POST); + formEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/node/" + this.options.nodeRef.replace(":/", "") + "/dispositionschedule/dispositionactiondefinitions"; + } + + // Setup form buttons + actionForm.setShowSubmitStateDynamically(true, false); + actionForm.setSubmitElements(saveActionButton); + actionForm.doBeforeFormSubmit = + { + fn: function(formEl, obj) + { + // Merge period value + var puEl = Dom.getElementsByClassName("period-unit", "select", formEl)[0], + paEl = Dom.getElementsByClassName("period-amount", "input", formEl)[0]; + + var pa = "", pu = ""; + if (!paEl.disabled) + { + pa = $encodeHtml(paEl.value); + } + if (!puEl.disabled) + { + pu = puEl.options[puEl.selectedIndex].value; + } + var periodEl = Dom.getElementsByClassName("period", "input", formEl)[0]; + periodEl.value = pu + "|" + pa; + + // Disable buttons during submit + obj.saveButton.set("disabled", true); + obj.cancelButton.set("disabled", true); + + // Display a pending message + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.savingAction", this.name), + spanClass: "wait", + displayTime: 0 + }); + }, + obj: + { + saveButton: saveActionButton, + cancelButton: cancelActionButton, + actionForm: actionForm + }, + scope: this + }; + actionForm.doBeforeAjaxRequest = + { + fn: function(p_config) + { + // Inject empty events[] if all events hhave been removed + if (YAHOO.lang.isUndefined(p_config.dataObj.events)) + { + p_config.dataObj.events = []; + } + return true; // Continue with AjaxRequest + }, + scope: this + }; + + + // Submit as an ajax submit (not leave the page), in json format + actionForm.setAJAXSubmit(true, + { + successCallback: + { + fn: function(serverResponse, obj) + { + this.widgets.feedbackMessage.destroy(); + obj.saveButton.set("disabled", false); + obj.cancelButton.set("disabled", false); + Dom.removeClass(obj.actionEl, "expanded"); + Dom.addClass(obj.actionEl, "collapsed"); + + // Get the created action id + var newActionId = serverResponse.json.data.id; + + // Save new info for future cancels and hide details div + Dom.getElementsByClassName("id", "input", actionEl)[0].value = newActionId; + action = YAHOO.lang.merge(action, serverResponse.json.data); + var details = Dom.getElementsByClassName("details", "div", actionEl)[0]; + Dom.setStyle(details, "display", "none"); + + // Update form action + if (newActionId && newActionId.length > 0) + { + actionForm.setAjaxSubmitMethod(Alfresco.util.Ajax.PUT); + formEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI_RELATIVE + "api/node/" + this.options.nodeRef.replace(":/", "") + "/dispositionschedule/dispositionactiondefinitions/" + newActionId; + } + + // Update action map + this.options.actionMap[action.id] = action; + + // Refresh the title from the choices + this._refreshTitle(obj.actionEl); + + // Display add step button + Dom.removeClass(this.widgets.flowButtons, "hidden"); + + }, + obj: + { + saveButton: saveActionButton, + cancelButton: cancelActionButton, + actionEl: actionEl + }, + scope: this + }, + failureCallback: + { + fn: function(serverResponse, obj) + { + this.widgets.feedbackMessage.destroy(); + obj.saveButton.set("disabled", false); + obj.cancelButton.set("disabled", false); + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.saveActionFailure", this.name) + }); + }, + obj: + { + saveButton: saveActionButton, + cancelButton: cancelActionButton + }, + scope: this + } + }); + actionForm.setSubmitAsJSON(true); + actionForm.init(); + }, + + /** + * Disable the period elements + * + * @method _disablePeriodSection + * @param disabled + * @param actionEl The action HTMLElement + */ + _disablePeriodSection: function DispositionEdit__disablePeriodSection(disabled, actionEl) + { + Dom.getElementsByClassName("period-amount", "input", actionEl)[0].disabled = disabled; + Dom.getElementsByClassName("period-unit", "select", actionEl)[0].disabled = disabled; + Dom.getElementsByClassName("period-action", "select", actionEl)[0].disabled = disabled; + }, + + /** + * handles disabling and enabling of period elements + * + * @method _disableEnablePeriodElements + * @param periodUnitEl The period unit select + * @param periodAmountEl The period unit text input + * @param periodActionEl The period action select + */ + _disableEnablePeriodElements: function DispositionEdit__disableEnablePeriodElements(periodUnitEl, periodAmountEl, periodActionEl) + { + var periodUnit = periodUnitEl.options[periodUnitEl.selectedIndex].value; + periodAmountEl.disabled = Alfresco.util.arrayContains(["none", "immediately", "fmend", "fqend", "fyend", "monthend", "quarterend", "yearend"], periodUnit); + if (periodAmountEl.disabled) + { + periodAmountEl.value = ""; + } + periodActionEl.disabled = Alfresco.util.arrayContains(["none", "immediately"], periodUnit); + }, + + /** + * Disable the events elements + * + * @method _disableEventsSection + * @param disabled + * @param actionEl The action HTMLElement + */ + _disableEventsSection: function DispositionEdit__disableEventsSection(disabled, actionEl) + { + var eventsDivEl = Dom.getElementsByClassName("events", "div", actionEl)[0]; + Dom.setStyle(eventsDivEl, "display", disabled ? "none" : "block"); + var eventEls = Dom.getElementsByClassName("action-event-name-value", "", actionEl); + for (var i = 0; i < eventEls.length; i++) + { + eventEls[i].disabled = disabled; + } + }, + + /** + * Set the title header + * + * @method _refreshTitle + * @param actionEl The action HTML element + */ + _refreshTitle: function DispositionEdit__refreshTitle(actionEl) + { + var actionName = Dom.getElementsByClassName("action-name", "input", actionEl)[0].value, + actionDescriptor = this.options.actions[actionName]; + actionNameLabel = actionDescriptor ? actionDescriptor.label : actionName; + periodUnitSelect = Dom.getElementsByClassName("period-unit", "select", actionEl)[0], + periodAmountEl = Dom.getElementsByClassName("period-amount", "input", actionEl)[0], + title = ""; + if (!periodUnitSelect.disabled && periodUnitSelect.options[periodUnitSelect.selectedIndex].value != "none") + { + if (periodAmountEl.disabled || periodAmountEl.value == "" || periodAmountEl.value == "0") + { + title = this.msg( + "label.title.noTime", + actionNameLabel, + periodUnitSelect.options[periodUnitSelect.selectedIndex].text.toLowerCase()); + } + else + { + title = this.msg( + "label.title.complex", + actionNameLabel, + $encodeHtml(periodAmountEl.value), + periodUnitSelect.options[periodUnitSelect.selectedIndex].text.toLowerCase()); + } + } + else + { + title = this.msg( + "label.title.simple", + actionNameLabel + ); + } + + Dom.getElementsByClassName("title", "div", actionEl)[0].innerHTML = title; + }, + + /** + * Create a action in the list + * + * @method _createEvent + * @param p_sequence {number} The (zero-based) sequence number of the event + * @param p_eventName {string} The event key/name + * @private + */ + _createEvent: function DispositionEdit__createEvent(p_sequence, p_eventName) + { + // Clone template + var eventEl = this.widgets.eventTemplateEl.cloneNode(true), + elId = Alfresco.util.generateDomId(eventEl); + + Dom.addClass(eventEl, p_sequence % 2 === 0 ? "even" : "odd"); + if (p_sequence === 0) + { + Dom.addClass(eventEl, "first"); + } + + // Event Type + var eventNameHidden = Dom.getElementsByClassName("action-event-name-value", "input", eventEl)[0], + eventNameLabel = Dom.getElementsByClassName("action-event-name-label", "span", eventEl)[0], + label = this.options.events[p_eventName] ? this.options.events[p_eventName].label + "" : p_eventName;; + eventNameHidden.value = p_eventName; + eventNameLabel.innerHTML = label; + + // Display data + var automatic = this.options.events[p_eventName] ? this.options.events[p_eventName].automatic + "" : null, + completion = ""; + if (automatic) + { + completion = this.msg("label.automatic." + automatic); + } + Dom.getElementsByClassName("action-event-completion", "div", eventEl)[0].innerHTML = completion; + + // Add listener to delete event + var deleteEventEl = Dom.getElementsByClassName("delete", "span", eventEl)[0]; + Event.addListener(deleteEventEl, "click", function(e, obj) + { + this._deleteClickedEvent(eventEl); + }, null, this); + + return eventEl; + }, + + + /** + * Refreshes the action sequence labels. + * + * Ideally li.style.list-style: should be used with decimal and inline + * so this would be handled automatically but hasn't been due to styling issues. + * + * @method _refreshActionList + * @private + */ + _refreshActionList: function DispositionEdit__refreshActionList() + { + var actionNos = Dom.getElementsByClassName("no", "div", this.widgets.actionListEl); + for (var i = 0; i < actionNos.length; i++) + { + actionNos[i].innerHTML = i + 1; + } + }, + + /** + * Refreshes the event list so first event doesn't display the relation. + * + * @method _refreshEventList + * @param eventList The event list HTMLElement + * @private + */ + _refreshEventList: function DispositionEdit__refreshEventList(eventList) + { + var events = eventList.getElementsByTagName("li"); + for (var i = 0; i < events.length; i++) + { + Dom.removeClass(events[i], "even"); + Dom.removeClass(events[i], "odd"); + Dom.removeClass(events[i], "first"); + Dom.addClass(events[i], ((i + 1) % 2) === 0 ? "odd" : "even"); + if (i === 0) + { + Dom.addClass(events[i], "first"); + } + } + }, + + /** + * Called when user changes the period amount + * + * @method onPeriodAmountTextKeyUp + * @param e click event object + * @param obj callback object containg action info & HTMLElements + */ + onPeriodAmountTextKeyUp: function DispositionEdit_onPeriodAmountTextKeyUp(e, obj) + { + this._refreshTitle(obj.actionEl); + }, + + /** + * Called when user toggles one of the checkboxes related to + * + * @method onPeriodUnitSelectChange + * @param e click event object + * @param obj callback object containg action info & HTMLElements + */ + onPeriodUnitSelectChange: function DispositionEdit_onPeriodUnitSelectChange(e, obj) + { + var periodUnitEl = Event.getTarget(e); + this._disableEnablePeriodElements(periodUnitEl, obj.periodAmountEl, obj.periodActionEl); + this._refreshTitle(obj.actionEl); + }, + + /** + * Called when user toggles one of the checkboxes related to + * + * @method onRelationEnablingCheckBoxClick + * @param e click event object + * @param obj callback object containg action info & HTMLElements + */ + onRelationEnablingCheckBoxClick: function DispositionEdit_onRelationEnablingCheckBoxClick(e, obj) + { + for (var i = 0; i < obj.checkBoxEls.length; i++) + { + if (!obj.checkBoxEls[i].checked) + { + Dom.addClass(obj.actionEl, "relation-disabled"); + return; + } + } + Dom.removeClass(obj.actionEl, "relation-disabled"); + }, + + /** + * Called when user changes the relation option select + * + * @method onRelationSelectChange + * @param e click event object + * @param obj callback object containg action info & HTMLElements + */ + onRelationSelectChange: function DispositionEdit_onRelationSelectChange(e, obj) + { + var relation = obj.relationSelect.options[obj.relationSelect.selectedIndex].value; + Dom.removeClass(obj.actionEl, "or"); + Dom.removeClass(obj.actionEl, "and"); + Dom.addClass(obj.actionEl, relation == "true" ? "or" : "and"); + }, + + + /** + * Makes sure only allowed actions are enabled in the menu + * + * @method _disableUnallowedActions + * @private + */ + _disableUnallowedActions: function DispositionEdit__disableUnallowedActions() + { + // Find out what actions that has been used + var actionNames = Dom.getElementsByClassName("action-name", "input", this.widgets.actionListEl); + var usedActionNames = {}; + for (var i = 0; i < actionNames.length; i++) + { + // transfer action is allowed many times + if (actionNames[i].value !== "transfer") + { + usedActionNames[actionNames[i].value] = true; + } + + // can't use cutoff after transfer or accession + if (!usedActionNames["cutoff"] && ((actionNames[i].value == "transfer") || (actionNames[i].value == "accession"))) + { + usedActionNames["cutoff"] = true; + } + } + + // Clear event menu and disable/enable events in the menu + var items = this.widgets.createActionButton.getMenu().getItems(), + item, + disabled, + disableAll = usedActionNames["destroy"], // "destroy" is in use and it MUST be the last action + onlyEnableCutoffRetain = (actionNames.length === 0); // No actions in use and "cutoff" or "retain" must be first + for (i = 0; i < items.length; i++) + { + item = items[i]; + /** + * Disable item if: + * - all items shall be disabled + * - OR the item already is used + * - OR if only cutoff/retain shall be enabled (and this isn't "cutoff" or "retain") + */ + disabled = (disableAll) || + (usedActionNames[item.value]) || + (onlyEnableCutoffRetain && (item.value !== "cutoff" && item.value !== "retain")); + item.cfg.setProperty("disabled", disabled); + } + }, + + /** + * Makes sure only unused events are enabled in the menu + * + * @method _disableUsedEvents + * @param addEventButton The button used to add event + * @param actionEl The action HTMLElement + */ + _disableUsedEvents: function DispositionEdit__disableUsedEvents(addEventButton, actionEl) + { + // Find out what events that has been used + var actionEventValues = Dom.getElementsByClassName("action-event-name-value", "input", actionEl); + var usedEventNames = {}; + for (var i = 0; i < actionEventValues.length; i++) + { + usedEventNames[actionEventValues[i].value] = true; + } + + // Clear event menu and disable/enable events in the menu + var items = addEventButton.getMenu().getItems(), + item; + for (i = 0; i < items.length; i++) + { + item = items[i]; + item.cfg.setProperty("disabled", usedEventNames[item.value] ? true : false); + } + }, + + /** + * Called when user has selected an event to add + * + * @method _addSelectedEventItem + * @param eventType The type of event that shall get added + * @param actionEl The action HTMLElement + */ + _addSelectedEventItem: function DispositionEdit__addSelectedEventItem(eventType, actionEl) + { + var eventListEl = Dom.getElementsByClassName("events-list", "ul", actionEl)[0], + sequence = eventListEl.getElementsByTagName("li").length; + + // Create new event + var eventEl = this._createEvent(sequence, eventType); + eventListEl.appendChild(eventEl); + }, + + /** + * Called when user clicks the delete event icon + * + * @method _deleteClickedEvent + * @param eventEl The event HTMLElement + */ + _deleteClickedEvent: function DispositionEdit__deleteClickedEvent(eventEl) + { + var parent = eventEl.parentNode; + parent.removeChild(eventEl); + this._refreshEventList(parent); + }, + + /** + * Called when user clicks the edit action icon + * + * @method onEditClick + * @param e click event object + * @param obj callback object containg action info & HTMLElements + */ + onEditActionClick: function DispositionEdit_onEditClick(e, obj) + { + Alfresco.util.Anim.fadeIn(obj.detailsEl); + Dom.removeClass(obj.actionEl, "collapsed"); + Dom.addClass(obj.actionEl, "expanded"); + }, + + /** + * Called when user clicks the delete action icon + * + * @method onDeleteActionClick + * @param e click event object + * @param actionEl THe action HTMLElement + */ + onDeleteActionClick: function DispositionEdit_onDeleteActionClick(e, actionEl) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: Alfresco.util.message("title.deleteAction", this.name), + text: Alfresco.util.message("label.confirmDeleteAction", this.name), + noEscape: true, + buttons: [ + { + text: Alfresco.util.message("button.yes", this.name), + handler: function DispositionEdit_delete() + { + this.destroy(); + me._onDeleteActionConfirmedClick.call(me, actionEl); + } + }, + { + text: Alfresco.util.message("button.no", this.name), + handler: function DispositionEdit_cancel() + { + me.deletePromptActive = false; + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Called when user clicks the delete action icon + * + * @method onDeleteActionClick + * @param actionEl THe action HTMLElement + */ + _onDeleteActionConfirmedClick: function DispositionEdit_onDeleteActionClick(actionEl) + { + var actionId = Dom.getElementsByClassName("id", "input", actionEl)[0].value, + feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.deletingAction"), + spanClass: "wait", + displayTime: 0 + }); + + // user has confirmed, perform the actual delete + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI_RELATIVE + "api/node/" + this.options.nodeRef.replace(":/", "") + "/dispositionschedule/dispositionactiondefinitions/" + actionId, + successCallback: + { + fn: function(response) + { + feedbackMessage.destroy(); + deleteMessage = Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.deleteActionSuccess") + }); + + if (response.json) + { + var actionList = Dom.get(this.id + "-actionList"), + schedule = response.json.data, + actions = schedule.actions ? schedule.actions : [], + action, + actionEl; + + this.options.recordLevelDisposition = schedule.recordLevelDisposition; + + if (actions.length == 0) + { + actionList.innerHTML = this.msg("message.noSteps"); + } + else + { + actionList.innerHTML = ""; + for (var i = 0, ii = actions.length; i < ii; i++) + { + action = actions[i]; + action.deleteable = schedule.canStepsBeRemoved; + actionEl = this._createAction(action); + actionEl = this.widgets.actionListEl.appendChild(actionEl); + this._setupActionForm(action, actionEl); + } + } + } + deleteMessage.destroy(); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + feedbackMessage.destroy(); + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.deleteActionFailure", this.name) + }); + }, + scope: this + } + }); + }, + + /** + * Called when user clicks the cancel action button + * + * @method onCancelActionButtonClick + * @param e click event object + * @param obj callback object containg action info & HTMLElements + */ + onCancelActionButtonClick: function DispositionEdit_onCancelActionButtonClick(e, obj) + { + var actionId = Dom.getElementsByClassName("id", "input", obj.actionEl)[0].value; + if (actionId && actionId.length > 0) + { + /** + * It is a previous action, cancel it by removing the action element + * from the dom and insert a new fresh one by using the template and + * the original data. + */ + var action = (actionId in this.options.actionMap ? this.options.actionMap[actionId] : obj.action); + var newActionEl = this._createAction(action); + obj.actionEl.parentNode.insertBefore(newActionEl, obj.actionEl); + obj.actionEl.parentNode.removeChild(obj.actionEl); + this._setupActionForm(action, newActionEl); + this._refreshActionList(); + } + else + { + // It was an unsaved action, just remove it + obj.actionEl.parentNode.removeChild(obj.actionEl); + } + Dom.removeClass(this.widgets.flowButtons, "hidden"); + }, + + /** + * Called when user selected a vliad option in the create action menu button + * + * @method _createNewAction + * @param actionName {string} The name of the action to create + */ + _createNewAction: function DispositionEdit__createNewAction(actionName) + { + var noOfActions = Dom.getElementsByClassName("action", "li", this.widgets.actionListEl).length; + var action = + { + id: "", + index: noOfActions, + title: this.msg("label.title.new"), + name: actionName, + ghostOnDestroy: "ghost", + combineDispositionStepConditions: false, + period : null, + periodProperty: (noOfActions == 0 ? "rma:dateFiled": "rma:cutOffDate"), + description: "", + eligibleOnFirstCompleteEvent: true, + deleteable: true, + events: [] + }; + var newActionEl = this._createAction(action), + dummyEl = Dom.get(this.id + "-action-template-dummy"); + if (dummyEl) + { + dummyEl.parentNode.removeChild(dummyEl); + } + this.widgets.actionListEl.appendChild(newActionEl); + this._setupActionForm(action, newActionEl); + this.onEditActionClick(null, + { + detailsEl: Dom.getElementsByClassName("details", "div", newActionEl)[0], + actionEl: newActionEl + }); + Dom.addClass(this.widgets.flowButtons, "hidden"); + }, + + /** + * Fired when the user clicks the Cancel button. + * Takes the user back to the details edit page without saving anything. + * + * @method onDoneActionsButtonClick + * @param event {object} a "click" event + */ + onDoneActionsButtonClick: function DispositionEdit_onDoneActionsButtonClick(event) + { + // Disable buttons to avoid double submits or cancel during post + this.widgets.doneButton.set("disabled", true); + + // Send the user to this page again without saving changes + document.location.href = Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + "/rm-record-category-details?nodeRef=" + this.options.nodeRef; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition.css new file mode 100644 index 0000000000..c2a25f0a03 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition.css @@ -0,0 +1,114 @@ +.disposition +{ + padding: 1.5em 0 1.5em; + border-bottom: 1px dashed #CCCCCC; +} + +.disposition .heading +{ + color:#333333; + font-size:131%; + padding-bottom:1em; +} + +.disposition .header +{ + height:2.5em; + line-height:2.5em; +} + +.disposition .header .title +{ + color:#333333; + float:left; + font-size:112%; +} + +.disposition .header .buttons +{ + float: right; + padding-top:0.2em; +} + +.disposition .actions, +.disposition .properties +{ + clear: both; +} + +.disposition .field +{ + margin-bottom:1em; +} + +.disposition .field .label +{ + color:#606060; + margin-right:0.4em; + font-weight:normal; +} + +.disposition .field .value +{ + display:inline-table; + color:#333333; +} + +.disposition .actions +{ +} + +.disposition .actions .action +{ + clear: both; + margin-bottom: 0.3em; + min-height: 2.5em; +} + +.disposition .actions .action .no, +.disposition .actions .action .name, +.disposition .actions .action .more +{ + line-height: 2.5em; + height: 2.5em; +} + +.disposition .actions .action .no +{ + position: absolute; + margin-left: 0.5em; + text-align: center; + width: 2em; + color:#FFFFFF; + background-image:url(../../../components/images/green-step-circle.png); + background-position:center center; + background-repeat:no-repeat; +} + +.disposition .actions .action .name +{ + position: absolute; + padding-left: 2.75em; + color:#008000; +} + +.disposition .actions .action .more +{ + float: right; + margin-right:0.75em; +} + +.disposition .actions .action .more.collapsed +{ + +} + + +.disposition .actions .action .description +{ + background-color: #FFFFFF; + min-height: 2em; + padding-left:2.75em; + padding-top:0.75em; + clear: both; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition.js new file mode 100644 index 0000000000..95e4dad0cf --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/disposition.js @@ -0,0 +1,229 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Disposition component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.Disposition + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Disposition constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.Disposition} The new component instance + * @constructor + */ + Alfresco.rm.component.Disposition = function Disposition_constructor(htmlId) + { + Alfresco.rm.component.Disposition.superclass.constructor.call(this, "Alfresco.rm.component.Disposition", htmlId, ["button", "container"]); + YAHOO.Bubbling.on("metadataRefresh", this.doRefresh, this); + return this; + }; + + /** + * Extend Alfresco.component.Base + */ + YAHOO.extend(Alfresco.rm.component.Disposition, Alfresco.component.Base); + + /** + * Augment prototype with Actions modules + */ + YAHOO.lang.augmentProto(Alfresco.rm.component.Disposition, Alfresco.doclib.Actions, true); + YAHOO.lang.augmentProto(Alfresco.rm.component.Disposition, Alfresco.rm.doclib.Actions, true); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.rm.component.Disposition.prototype, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * The nodeRef to the object that owns the disposition schedule that is configured + * + * @property nodeRef + * @type {string} + */ + nodeRef: null, + + /** + * The display name to the object that owns the disposition schedule that is configured + * + * @property displayName + * @type {string} + */ + displayName: null, + + /** + * The siteId to the site that this disposition belongs to + * + * @property siteId + * @type {string} + */ + siteId: null, + + /** + * The nodeRef for the dispostion schedule + * + * @property dipositionScheduleNodeRef + * @type {string} + */ + dipositionScheduleNodeRef: null + }, + + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function Disposition_onReady() + { + this.modules.actions = new Alfresco.module.DoclibActions(); + + // Create buttons + this.widgets.editPropertiesButton = Alfresco.util.createYUIButton(this, "editproperties-button", this.onEditPropertiesButtonClick); + this.widgets.editScheduleButton = Alfresco.util.createYUIButton(this, "editschedule-button", this.onEditScheduleButtonClick); + this.widgets.createScheduleButton = Alfresco.util.createYUIButton(this, "createschedule-button", this.onCreateScheduleButtonClick); + + // Add listeners that displays/hides the description + var actionsEl = Dom.get(this.id + "-actions"), + actionEls = Dom.getElementsByClassName("action", "div", actionsEl), + actionEl, more, a, description; + + for (var i = 0, ii = actionEls.length; i < ii; i++) + { + actionEl = actionEls[i]; + more = Dom.getElementsByClassName("more", "div", actionEl)[0]; + a = document.getElementsByTagName("a", more)[0]; + + if (a) + { + description = Dom.getElementsByClassName("description", "div", actionEl)[0]; + Event.addListener(more, "click", function (event, obj) + { + if (obj.description && Dom.hasClass(obj.more, "collapsed")) + { + Alfresco.util.Anim.fadeIn(obj.description); + Dom.removeClass(obj.more, "collapsed"); + Dom.addClass(obj.more, "expanded"); + } + else + { + Dom.setStyle(obj.description, "display", "none"); + Dom.removeClass(obj.more, "expanded"); + Dom.addClass(obj.more, "collapsed"); + } + }, + { + more: more, + description: description + }, this); + } + } + }, + + /** + * Fired when the user clicks the edit properties button. + * Takes the user to the edit page. + * + * @method onEditPropertiesButtonClick + * @param event {object} a "click" event + */ + onEditPropertiesButtonClick: function Disposition_onEditPropertiesButtonClick(event) + { + // Disable buttons to avoid double submits or cancel during post + this.widgets.editPropertiesButton.set("disabled", true); + + // Send the user to the edit proprties page + document.location.href = Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + "/edit-metadata?nodeRef=" + this.options.dipositionScheduleNodeRef; + }, + + /** + * Fired when the user clicks the edit schedule button. + * Takes the user to the edit page. + * + * @method onEditScheduleButtonClick + * @param event {object} a "click" event + */ + onEditScheduleButtonClick: function Disposition_onEditScheduleButtonClick(event) + { + // Disable buttons to avoid double submits or cancel during post + this.widgets.editScheduleButton.set("disabled", true); + + // Send the user to the edit schedule page + document.location.href = Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + "/rm-disposition-edit?nodeRef=" + this.options.nodeRef; + }, + + /** + * Fired when the user clicks the create schedule button. + * Creates the schedule and refreshes itself + * + * @method onCreateScheduleButtonClick + * @param event {object} a "click" event + */ + onCreateScheduleButtonClick: function Disposition_onCreateScheduleButtonClick(event) + { + // Disable buttons to avoid double submits or cancel during post + this.widgets.createScheduleButton.set("disabled", true); + + this.onActionCreateDisposition( + { + nodeRef: this.options.nodeRef, + displayName: this.options.displayName + }); + }, + + doRefresh: function() + { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + + var url = 'rm/components/fileplan/disposition?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : ''); + + this.refresh(url); + } + + }, true); + +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/events.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/events.css new file mode 100644 index 0000000000..3ce56def1c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/events.css @@ -0,0 +1,121 @@ +.events +{ + padding: 1.5em 0 1.5em; +} + +.events .hidden +{ + display: none; +} + +.events .header +{ + height: 2.5em; + line-height: 2.5em; + color: #333333; + font-size: 112%; +} + +.events .event +{ + clear: both; + margin-bottom: 0.3em; + min-height: 7.5em; +} + +.events .event .icons, +.events .event .info, +.events .event .buttons +{ + line-height: 2.5em; + height: 2.5em; +} + +.events .event .icons +{ + position: absolute; + text-align: center; + width: 2em; + background-position: center center; + background-repeat: no-repeat; +} + +.events .event.completed .icons +{ + background-image: url(../../../components/images/complete-16.png); +} + +.events .event .info +{ + position: absolute; + padding-left: 2.5em; +} + +.events .event .info .field +{ + margin-bottom: 0.5em; + line-height: 1em; +} + +.events .event .info .field.name +{ + line-height: 2.5em; + margin-bottom: 0; +} + +.events .event .info .field .label +{ + color: #606060; + margin-right: 0.4em; + font-weight: normal; +} + +.events .event .info .field .value +{ + color: #333333; +} + +.events .event .buttons +{ + float: right; + margin-right: 0.75em; + padding-top: 0.2em; +} + +.events.complete-event-panel +{ + width: 38em; + padding: 0; +} + +.events.complete-event-panel .section +{ + padding-bottom:0.5em; + padding-left:1em; + padding-top:0.5em; +} + +#complete-event-panel .bd div.section.yui-g div.yui-u.first +{ + text-align: left; +} + +#complete-event-panel .bd div.section.yui-g div.yui-u +{ + padding: 0; +} + +#complete-event-panel input[type="text"].completedAtTime +{ + width: 5em; +} + +#complete-event-panel .completedAtPicker +{ + background-image:url(../../../components/calendar/images/calendar-16.png); + background-position:center center; + background-repeat:no-repeat; + margin-left:0.5em; + padding:0 0.5em; + cursor: pointer; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/events.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/events.js new file mode 100644 index 0000000000..ca4b5a60a0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/events.js @@ -0,0 +1,580 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Events component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.Events + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Selector = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Internal date formats + */ + var DATE_LONG = "dddd, d mmmm yyyy", + DATE_SHORT = "yyyy/mm/dd", + TIME_24H = "HH:MM"; + + /** + * Events constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.Events} The new component instance + * @constructor + */ + Alfresco.rm.component.Events = function Events_constructor(htmlId) + { + Alfresco.rm.component.Events.superclass.constructor.call(this, "Alfresco.rm.component.Events", htmlId, ["button", "container", "calendar"]); + this._lookForParentsDispositionSchedule = true; + this._dispositionScheduleAppliedToParent = false; + this.eventButtons = {}; + this.eventButtonsEnabled = false; + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("metadataRefresh", this.refreshEvents, this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.Events, Alfresco.component.Base, + { + /** + * Makes sure a check for the parents file plan is done only once. + * + * @property _lookForParentsDispositionSchedule + * @type boolean + * @private + */ + _lookForParentsDispositionSchedule: null, + + /** + * True if the disposition schedule is applied to the parent + * + * @property dispositionScheduleAppliedToParent + * @type boolean + */ + _dispositionScheduleAppliedToParent: null, + + /** + * Object container for event complete / undo buttons + * + * @property eventButtons + * @type object + */ + eventButtons: null, + + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * The nodeRef to the object that owns the disposition schedule that is configured + * + * @property nodeRef + * @type Alfresco.util.NodeRef + */ + nodeRef: null, + + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: null + }, + + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function Events_onReady() + { + // Save a reference to important elements + this.widgets.messageEl = Dom.get(this.id + "-message"); + this.widgets.completedEl = Dom.get(this.id + "-completed"); + this.widgets.completedEventsEl = Dom.get(this.id + "-completed-events"); + this.widgets.incompleteEl = Dom.get(this.id + "-incomplete"); + this.widgets.incompleteEventsEl = Dom.get(this.id + "-incomplete-events"); + + // Get the templates and remove them from the DOM + this.widgets.completedEventTemplate = Dom.get(this.id + "-completedEventTemplate"); + this.widgets.completedEventTemplate.parentNode.removeChild(this.widgets.completedEventTemplate); + this.widgets.incompleteEventTemplate = Dom.get(this.id + "-incompleteEventTemplate"); + this.widgets.incompleteEventTemplate.parentNode.removeChild(this.widgets.incompleteEventTemplate); + + // Setup complete event dialog + this._setupEventDialog(); + + // Load events data + this.refreshEvents(); + }, + + /** + * Refresh the events list + * + * @method refreshEvents + */ + refreshEvents: function Events_refreshEvents() + { + if (!this._dispositionScheduleAppliedToParent) + { + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI_RELATIVE + "api/node/" + this.options.nodeRef.uri + "/nextdispositionaction", + successCallback: + { + fn: function(response) + { + var nextDispositionAction = response.json.data; + if (!nextDispositionAction.notFound) + { + if (nextDispositionAction && nextDispositionAction.events.length === 0 && nextDispositionAction.label) + { + this._displayMessage(this.msg("label.noEventsInDispositionSchedule", nextDispositionAction.label)); + } + else + { + Dom.addClass(this.widgets.messageEl, "hidden"); + this._onEventsLoaded(nextDispositionAction); + } + } + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + this._displayMessage(this.msg("label.loadFailure")); + }, + scope: this + } + }); + } + }, + + /** + * Called when the events information has been loaded + * + * @method _displayMessage + * @param msg {string} THe message to display + * @private + */ + _displayMessage: function Events__displayMessage(msg) + { + Dom.removeClass(this.widgets.messageEl, "hidden"); + this.widgets.messageEl.innerHTML = msg; + Dom.addClass(this.widgets.completedEl, "hidden"); + Dom.addClass(this.widgets.incompleteEl, "hidden"); + }, + + /** + * Called when the events information has been loaded + * + * @method _onEventsLoaded + * @param nextDispositionAction {object} Object literal containing Next Disposition Action details + * @private + */ + _onEventsLoaded: function Events__onEventsLoaded(nextDispositionAction) + { + if (this.widgets.feedbackMessage) + { + this.widgets.feedbackMessage.destroy(); + this.widgets.feedbackMessage = null; + } + + // Destroy any existing YUI buttons + var index; + for (index in this.eventButtons) + { + if (this.eventButtons.hasOwnProperty(index) && YAHOO.lang.isFunction(this.eventButtons[index].destroy)) + { + this.eventButtons[index].destroy(); + delete this.eventButtons[index]; + } + } + + this.widgets.completedEventsEl.innerHTML = ""; + this.widgets.incompleteEventsEl.innerHTML = ""; + var events = nextDispositionAction.events ? nextDispositionAction.events : [], + completed = 0, + incomplete = 0, + ev, completedAt, eventEl, asOf; + + for (var i = 0, ii = events.length; i < ii; i++) + { + ev = events[i]; + if (ev.complete) + { + completedAt = Alfresco.util.fromISO8601(ev.completedAt); + eventEl = this._createEvent(ev, + [ + { "name" : ev.label }, + { "automatic" : ev.automatic ? this.msg("label.automatic") : this.msg("label.manual") }, + { "completed-at" : completedAt ? Alfresco.util.formatDate(completedAt) : "" }, + { "completed-by" : ev.completedByFirstName + " " + ev.completedByLastName } + ], "undo-button", this.onUndoEventButtonClick, this.widgets.completedEventTemplate); + + eventEl = this.widgets.completedEventsEl.appendChild(eventEl); + completed++; + } + else + { + asOf = Alfresco.util.fromISO8601(nextDispositionAction.asOf); + eventEl = this._createEvent(ev, + [ + { "name" : ev.label }, + { "automatic" : ev.automatic ? this.msg("label.automatic") : this.msg("label.manual") }, + { "asof" : asOf ? Alfresco.util.formatDate(asOf) : this.msg("label.none") } + ], "complete-button", this.onCompleteEventButtonClick, this.widgets.incompleteEventTemplate); + + eventEl = this.widgets.incompleteEventsEl.appendChild(eventEl); + incomplete++; + } + } + if (completed === 0) + { + Dom.addClass(this.widgets.completedEl, "hidden"); + } + else + { + Dom.removeClass(this.widgets.completedEl, "hidden"); + } + if (incomplete === 0) + { + Dom.addClass(this.widgets.incompleteEl, "hidden"); + } + else + { + Dom.removeClass(this.widgets.incompleteEl, "hidden"); + } + }, + + /** + * Create an event + * + * @method _createEvent + * @param event The event info object + * @private + */ + _createEvent: function Events__createEvent(event, attributes, buttonClass, clickHandler, template) + { + // Clone template + var eventEl = template.cloneNode(true), + attribute; + + Alfresco.util.generateDomId(eventEl); + + // Display data + for (var i = 0, ii = attributes.length; i < ii; i++) + { + attribute = attributes[i]; + for (var key in attribute) + { + if (attribute.hasOwnProperty(key)) + { + Selector.query("." + key + " .value", eventEl, true).innerHTML = $html(attribute[key]); + break; + } + } + } + + // Create button + var buttonEl = Dom.getElementsByClassName(buttonClass, "span", eventEl)[0], + eventButton = Alfresco.util.createYUIButton(this, buttonClass, null, {}, buttonEl); + + eventButton.on("click", clickHandler, + { + event: event, + button: eventButton + }, this); + + this.eventButtons[event.name] = eventButton; + return eventEl; + }, + + /** + * Fired when the user clicks the complete button for an event. + * + * @method onCompleteEventButtonClick + * @param e {object} a "click" event + * @param obj.event {object} object with event info + * @param obj.button {YAHOO.widget.Button} The button that was clicked + */ + onCompleteEventButtonClick: function Events_onCompleteEventButtonClick(e, obj) + { + var currentDate = new Date(); + Dom.get(this.id + "-eventName").value = obj.event.name; + Dom.get(this.id + "-completedAtTime").value = Alfresco.util.formatDate(currentDate, TIME_24H); + Dom.get(this.id + "-completedAtDate").value = Alfresco.util.formatDate(currentDate, DATE_LONG); + Dom.get(this.id + "-completedAtDateShort").value = Alfresco.util.formatDate(currentDate, DATE_SHORT); + + this.widgets.completeEventPanel.show(); + }, + + /** + * Fired when the user clicks the undo button for an event. + * + * @method onUndoEventButtonClick + * @param e {object} a "click" event + * @param obj.event {object} object with event info + * @param obj.button {YAHOO.widget.Button} The button that was clicked + */ + onUndoEventButtonClick: function Events_onUndoEventButtonClick(e, obj) + { + // Disable buttons to avoid double submits or cancel during post + obj.button.set("disabled", true); + + // Undo event and refresh events afterwards + this._doEventAction("undoEvent", + { + eventName: obj.event.name + }, "message.revokingEvent", "message.revokeEventFailure"); + }, + + /** + * Fired when the user clicks the undo button for an event. + * + * @method _doEventAction + * @param params the params to the action + * @param action The name of action the action to be invoked + * @param pendingMessage Message displayed durint action invocation and + * the event data is refreshed afterwards + * @param failureMessage Displayed if the action failed + * @private + */ + _doEventAction: function Events__doEventAction(action, params, pendingMessage, failureMessage) + { + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: this.msg(pendingMessage), + spanClass: "wait", + displayTime: 0 + }); + + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI_RELATIVE + "api/rma/actions/ExecutionQueue", + dataObj: + { + nodeRef: this.options.nodeRef.nodeRef, + name: action, + params: params + }, + successCallback: + { + fn: function(response) + { + // Fire event so the events panel and other listeners may refresh + YAHOO.Bubbling.fire("metadataRefresh"); + }, + scope: this + }, + failureCallback: + { + fn: function() + { + this.widgets.feedbackMessage.destroy(); + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg(failureMessage) + }); + }, + scope: this + } + }); + }, + + /** + * Setup UI components and form for event dialog + * + * @method _setupEventDialog + * @private + */ + _setupEventDialog: function Events__setupEventDialog() + { + // TODO stop using a static id after RM, needed now so the text-align in #Share .yui-panel .bd .yui-u.first can be overriden + // The panel is created from the HTML returned in the XHR request, not the container + this.widgets.completeEventPanel = Alfresco.util.createYUIPanel("complete-event-panel"); + + // Make sure the completed at date picker is closed if its opened when the dialog is closed + this.widgets.completeEventPanel.subscribe("hide", function(p_sType, p_aArgs) + { + if (this.widgets.completedAtPicker) + { + this.widgets.completedAtPicker.hide(); + } + }, null, this); + + // Buttons + this.widgets.completeEventOkButton = Alfresco.util.createYUIButton(this, "completeEvent-ok-button", this.onCompleteEventOkClick); + this.widgets.completeEventCancelButton = Alfresco.util.createYUIButton(this, "completeEvent-cancel-button", this.onCompleteEventCancelClick); + var completedAtPickerEl = Dom.get(this.id + "-completedAtPicker"); + Event.addListener(completedAtPickerEl, "click", this.onCompletedAtPickerButtonClick, completedAtPickerEl, this); + + // Form definition + var form = new Alfresco.forms.Form(this.id + "-completeEvent-form"); + form.setSubmitElements(this.widgets.completeEventOkButton); + form.setShowSubmitStateDynamically(true); + + // Setup date validation + form.addValidation(this.id + "-completedAtTime", Alfresco.forms.validation.time, null, "keyup"); + + // Initialise the form + form.init(); + + // Register the ESC key to close the panel + var escapeListener = new YAHOO.util.KeyListener(document, + { + keys: YAHOO.util.KeyListener.KEY.ESCAPE + }, + { + fn: function(id, keyEvent) + { + this.onCompleteEventCancelClick(); + }, + scope: this, + correctScope: true + }); + escapeListener.enable(); + + this.widgets.completeEventForm = form; + }, + + /** + * Event handler that gets fired when a user clicks on the date selection + * button in the compelte event form. Displays a mini YUI calendar. + * + * @method onCompletedAtPickerButtonClick + * @param e {object} DomEvent + */ + onCompletedAtPickerButtonClick: function Events_onCompletedAtPickerButtonClick(e, completedAtPickerEl) + { + var me = this; + var oCalendarMenu = new YAHOO.widget.Overlay(this.id + "-calendarmenu"); + oCalendarMenu.setBody(" "); + oCalendarMenu.body.id = this.id + "-calendarcontainer"; + this.widgets.completedAtPicker = oCalendarMenu; + + // Render the Overlay instance into the Button's parent element + oCalendarMenu.render(completedAtPickerEl.parentNode); + + // Align the Overlay to the Button instance + oCalendarMenu.align(); + + var oCalendar = new YAHOO.widget.Calendar("buttoncalendar", oCalendarMenu.body.id); + oCalendar.render(); + + oCalendar.changePageEvent.subscribe(function() + { + window.setTimeout(function() + { + oCalendarMenu.show(); + }, 0); + }); + + oCalendar.selectEvent.subscribe(function (type, args) + { + if (args) + { + var date = args[0][0], + selectedDate = new Date(date[0], (date[1]-1), date[2]), + elem = Dom.get(me.id + "-completedAtDate"); + elemShort = Dom.get(me.id + "-completedAtDateShort"); + + elem.value = Alfresco.util.formatDate(selectedDate, DATE_LONG); + elemShort.value = Alfresco.util.formatDate(selectedDate, DATE_SHORT); + } + oCalendarMenu.hide(); + }, this); + }, + + /** + * Event handler that gets fired when a user clicks + * on the ok button in the complete event panel. + * + * @method onCompleteEventOkClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onCompleteEventOkClick: function AddEvent_onCompleteEventOkClick(e, obj) + { + // Get completed at value and time and convert to iso format + var completedAt = Dom.get(this.id + "-completedAtDateShort").value; + completedAt = new Date(completedAt + " " + Dom.get(this.id + "-completedAtTime").value); + var completedAtIso = Alfresco.util.toISO8601(completedAt); + + // Get the name of the event to complete + var eventName = Dom.get(this.id + "-eventName").value; + + // Complete the event with the completed at date and refresh events afterwards + this._doEventAction("completeEvent", + { + eventName: eventName, + eventCompletedBy: Alfresco.constants.USERNAME, + eventCompletedAt: + { + iso8601: completedAtIso + } + }, "message.completingEvent", "message.completeEventFailure"); + + // Hide panel + this.widgets.completeEventPanel.hide(); + }, + + /** + * Event handler that gets fired when a user clicks + * on the cancel button in the complete event panel. + * + * @method onCompleteEventCancelClick + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onCompleteEventCancelClick: function AddEvent_onCompleteEventCancelClick(e, obj) + { + // Hide panel + this.widgets.completeEventPanel.hide(); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/report.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/report.css new file mode 100644 index 0000000000..4f3fb98bac --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/fileplan/report.css @@ -0,0 +1,74 @@ +.rm-report .report-property +{ + color: #515D6B; + padding: 0.25em 1em; +} + + +.rm-report .report-label +{ + color: #515D6B; +} + +.rm-report .report-value +{ + color: #000000; + padding: 0.3em; +} + +.rm-report .report-title +{ + color: #000000; + font-size: 116%; + font-weight: bold; + background-repeat: no-repeat; + height: 3em; + line-height: 3em; +} + +.rm-report .report-title div +{ + float: left; + height: 3em; + line-height: 3em; + padding-right: 0.75em; +} + +.rm-report .report-title, +.rm-report .report-section +{ + border-bottom: 1px solid #D7D7D7; + padding-top: 0.5em; + padding-bottom: 0.5em; + clear: both; +} + +.rm-report .recordseries.report-title +{ + padding-left: 1em; +} + +.rm-report .recordseries.report-section +{ + padding-left: 5em; +} + +.rm-report .recordcategory.report-title +{ + padding-left: 5em; +} + +.rm-report .recordcategory.report-section +{ + padding-left: 9.5em; +} + +.rm-report .recordfolder.report-title +{ + padding-left: 9.5em; +} + +.rm-report .recordfolder.report-section +{ + padding-left: 14.5em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/folder-details/folder-actions.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/folder-details/folder-actions.js new file mode 100644 index 0000000000..56a758e61b --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/folder-details/folder-actions.js @@ -0,0 +1,75 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Folder actions component - RM extensions. + * + * @namespace Alfresco + * @class Alfresco.rm.doclib.FolderActions + */ +(function() +{ + /** + * RecordsFolderActions constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.doclib.FolderActions} The new RecordsFolderActions instance + * @constructor + */ + Alfresco.rm.doclib.FolderActions = function(htmlId) + { + Alfresco.rm.doclib.FolderActions.superclass.constructor.call(this, htmlId); + YAHOO.Bubbling.on("metadataRefresh", function() { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + window.location.reload(true); + }, this); + return this; + }; + + /** + * Extend from Alfresco.FolderActions + */ + YAHOO.extend(Alfresco.rm.doclib.FolderActions, Alfresco.FolderActions); + + /** + * Augment prototype with RecordActions module, ensuring overwrite is enabled + */ + YAHOO.lang.augmentProto(Alfresco.rm.doclib.FolderActions, Alfresco.rm.doclib.Actions, true); + + YAHOO.lang.augmentObject(Alfresco.rm.doclib.FolderActions.prototype, { + /** + * Refresh component in response to filesPermissionsUpdated event + * + * @method doRefresh + */ + doRefresh: function FolderActions_doRefresh() + { + YAHOO.Bubbling.unsubscribe("filesPermissionsUpdated", this.doRefresh, this); + this.refresh('rm/components/folder-details/folder-actions?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : '')); + } + }, true); + +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/manage-permissions/manage-permissions.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/manage-permissions/manage-permissions.js new file mode 100644 index 0000000000..566b12c4c5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/manage-permissions/manage-permissions.js @@ -0,0 +1,397 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM Manage Permissions component. + * Overrides/adds methods for the manage permissions page in RM site. + * + * @namespace Alfresco.rm + * @class Alfresco.rm.component.ManagePermissions + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RM Manage Permissions constructor. + * + * @param {String} htmlId The HTML id of the element + * @return {Alfresco.rm.component.ManagePermissions} The new manage permissions instance + * @constructor + */ + Alfresco.rm.component.ManagePermissions = function(htmlId) + { + Alfresco.rm.component.ManagePermissions.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.component.ManagePermissions, Alfresco.component.ManagePermissions, + { + /** + * Overrides the existing function to change the authority finder + * + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RM_Permissions_onReady() + { + // YUI Buttons + this.widgets.inherited = Alfresco.util.createYUIButton(this, "inheritedButton", this.onInheritedButton); + this.widgets.saveButton = Alfresco.util.createYUIButton(this, "okButton", this.onSaveButton); + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "cancelButton", this.onCancelButton); + this.widgets.rolesTooltip = new Array(); + + // DataSource set-up and event registration + this._setupDataSources(); + + // DataTable set-up and event registration + this._setupDataTables(); + + // Load the Authority Finder component + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/authority-finder", + dataObj: + { + htmlid: this.id + "-authorityFinder", + module: "rm" + }, + successCallback: + { + fn: this.onAuthorityFinderLoaded, + scope: this + }, + failureMessage: this.msg("message.authorityFinderFail"), + execScripts: true + }); + + if (this.options.site) + { + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "api/sites/" + encodeURIComponent(this.options.site) + "/memberships/", + successCallback: + { + fn: function(o) + { + for (var i = 0; i < o.json.length; i++) + { + this.sitePermissions[o.json[i].authority.fullName] = o.json[i].role; + } + }, + scope: this + } + }); + } + + // Finally show the component body here to prevent UI artifacts on YUI button decoration + Dom.setStyle(this.id + "-body", "visibility", "visible"); + }, + + /** + * Overrides the existing function to change the URL for the post request + * + * Called when the authority finder template has been loaded. + * Creates a dialog and inserts the authority finder for choosing groups and users to add. + * + * @method onAuthorityFinderLoaded + * @param response The server response + */ + onAuthorityFinderLoaded: function RM_Permissions_onAuthorityFinderLoaded(response) + { + // Inject the component from the XHR request into it's placeholder DIV element + var finderDiv = Dom.get(this.id + "-authorityFinder"); + if (finderDiv) + { + finderDiv.innerHTML = response.serverResponse.responseText; + + this.widgets.authorityFinder = finderDiv; + + // Find the Authority Finder by container ID + this.modules.authorityFinder = Alfresco.util.ComponentManager.get(this.id + "-authorityFinder"); + + // Set the correct options for our use + this.modules.authorityFinder.setOptions( + { + dataWebScript: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/authority-query", + viewMode: Alfresco.AuthorityFinder.VIEW_MODE_COMPACT, + siteId: this.options.site, + singleSelectMode: true, + minSearchTermLength: 3, + authorityType: (this.options.showGroups) ? Alfresco.AuthorityFinder.AUTHORITY_TYPE_ALL : Alfresco.AuthorityFinder.AUTHORITY_TYPE_USERS + }); + + // Add User/Group button + this.widgets.addUserGroup = Alfresco.util.createYUIButton(this, "addUserGroupButton", this.onAddUserGroupButton, + { + label: (this.options.showGroups) ? this.msg("button.addUserGroup") : this.msg("button.addUser") + }); + + var btnRegion = Dom.getRegion(this.id + "-addUserGroupButton"); + Dom.setStyle(this.widgets.authorityFinder, "top", (btnRegion.bottom + 4) + "px"); + } + + // Retrieve current permissions and settable roles for this node + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI + 'slingshot/doclib/rm/permissions/' + Alfresco.util.NodeRef(this.options.nodeRef).uri, + successCallback: + { + fn: this.onPermissionsLoaded, + scope: this + }, + failureMessage: this.msg("message.permissionsGetFail") + }); + }, + + /** + * Overrides the existing function to change the URL for the post request + * + * Called when user clicks on the save button. + * + * @method onSaveButtonClick + * @param type + * @param args + */ + onSaveButton: function RM_Permissions_onSaveButton(type, args) + { + this.widgets.saveButton.set("disabled", true); + + var permissions = [], + perm; + + for (var i = 0, ii = this.permissions.current.length; i < ii; i++) + { + perm = this.permissions.current[i]; + // Newly created, or existing and removed or modified + if ((perm.created && !perm.removed) || (!perm.created && (perm.removed || perm.modified))) + { + // Modified existing + // First add a new one, see MNT-11725 + permissions.push( + { + authority: perm.authority.name, + role: perm.role, + remove: perm.removed + }); + + // Remove old permission + if (perm.modified && !perm.created) + { + permissions.push( + { + authority: perm.authority.name, + role: this.permissions.original[i].role, + remove: true + }); + } + } + } + + if (permissions.length > 0 || this.permissions.isInherited !== this.permissions.originalIsInherited) + { + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + "api/node/" + this.options.nodeRef.replace(":/", "") + "/rmpermissions", + dataObj: + { + permissions: permissions, + isInherited: this.permissions.isInherited + }, + successCallback: + { + fn: function(res) + { + // Return to appropriate location + this._navigateForward(); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + var json = Alfresco.util.parseJSON(response.serverResponse.responseText); + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.failure"), + text: this.msg("message.permissionsSaveFail", json.message) + }); + this.widgets.saveButton.set("disabled", false); + }, + scope: this + } + }); + } + else + { + // Nothing to save + this._navigateForward(); + } + }, + + /** + * Overrides the existing function to add RM specific behaviour. + * + * Authority selected event handler. This event is fired from Authority picker. + * + * @method onAuthoritySelected + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onAuthoritySelected: function RM_Permissions_onAuthoritySelected(e, args) + { + // Construct permission descriptor and add permission row. + this.permissions.current.push( + { + authority: + { + name: args[1].itemName, + displayName: args[1].displayName, + iconUrl: args[1].iconUrl + }, + role: this.settableRoles[1], + created: true + }); + + // Remove authority selector popup + this.widgets.addUserGroup.set("checked", false); + Dom.removeClass(this.widgets.authorityFinder, "active"); + Dom.removeClass(this.id + "-inheritedContainer", "table-mask"); + Dom.removeClass(this.id + "-directContainer", "table-mask"); + this.showingAuthorityFinder = false; + + this.render(); + }, + + /** + * Overrides the existing function to add RM specific behaviour. + * + * Success handler called when the AJAX call to the doclist permissions web script returns successfully + * + * @method onPermissionsLoaded + * @param response {object} Ajax response details + */ + onPermissionsLoaded: function RM_Permissions_onPermissionsLoaded(response) + { + var data = response.json, + direct = this._filterSpecialRoles(data.direct), + inherited = this._filterSpecialRoles(data.inherited); + + // Update local copy of permissions + this.permissions = + { + originalIsInherited: data.isInherited, + isInherited: data.isInherited, + canReadInherited: data.canReadInherited, + inherited: inherited, + original: Alfresco.util.deepCopy(direct), + current: Alfresco.util.deepCopy(direct) + }; + + // Does the user have permissions to read the parent node's permissions? + if (!this.permissions.canReadInherited) + { + this.widgets.dtInherited.set("MSG_EMPTY", this.msg("message.empty.no-permission")); + } + + // Need the inheritance warning? + this.inheritanceWarning = !data.isInherited; + + // Roles the user is allowed to select from + this.settableRoles = ["Filing", "ReadRecords"]; + this.settableRolesMenuData = []; + for (var i = 0, ii = this.settableRoles.length; i < ii; i++) + { + this.settableRoles[this.settableRoles[i]] = true; + this.settableRolesMenuData.push( + { + text: this.settableRoles[i], + value: this.settableRoles[i] + }); + } + + this._disableInheritPermissionsButtton(); + + this.deferredReady.fulfil("onPermissionsLoaded"); + }, + + /** + * Filters roles out which are specific to RM. + * + * @method _filterSpecialRoles + * @param roles {array} The list to filter + * @private + */ + _filterSpecialRoles: function RM_Permissions__filterSpecialRoles(roles) + { + var filteredRoles = []; + + for (var i = 0; i < roles.length; i++) + { + var name = roles[i].authority.name; + if (name === "ROLE_EXTENDED_READER" || name === "ROLE_EXTENDED_WRITER" || name === "GROUP_Administrator" + YAHOO.util.History.getQueryStringParameter("filePlanId")) + { + continue; + } + else + { + var role = roles[i].role; + if (role === "Filing" || role === "ReadRecords") + { + filteredRoles.push(roles[i]); + } + } + } + + return filteredRoles; + }, + + /** + * Disables the inherit permissions button for fileplan, unfiled records container and root categories + * + * @method _disableInheritPermissionsButtton + * @private + */ + _disableInheritPermissionsButtton: function RM_Permissions__disableInheritPermissionsButtton() + { + var nodeType = YAHOO.util.History.getQueryStringParameter("nodeType"); + if (nodeType === "rma:unfiledRecordContainer" || + nodeType === "rma:holdContainer" || + nodeType === "rma:transferContainer" || + nodeType === "rma:filePlan" || + (nodeType === "rma:recordCategory") && (new Alfresco.util.NodeRef(this.nodeData.location.parent.nodeRef)).id === YAHOO.util.History.getQueryStringParameter("filePlanId")) + { + Alfresco.util.disableYUIButton(this.widgets.inherited); + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/node-details/node-header.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/node-details/node-header.css new file mode 100644 index 0000000000..d7ac98b38e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/node-details/node-header.css @@ -0,0 +1,5 @@ +/* Hide version details RM-2887 */ +.node-header .document-version +{ + display:none; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/people-finder/authority-finder.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/people-finder/authority-finder.js new file mode 100644 index 0000000000..1edabd5855 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/people-finder/authority-finder.js @@ -0,0 +1,279 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RM AuthorityFinder component. + * + * Extends the base AuthorityFinder component + * + * @namespace Alfresco.rm + * @class Alfresco.rm.AuthorityFinder + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $userProfile = Alfresco.util.userProfileLink; + + /** + * RM AuthorityFinder constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.AuthorityFinder} The new RM AuthorityFinder instance + * @constructor + */ + Alfresco.rm.AuthorityFinder = function(htmlId) + { + Alfresco.rm.AuthorityFinder.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.AuthorityFinder, Alfresco.AuthorityFinder, + { + /** + * Overrides the _setupDataTable from the base class. + * + * Setup the YUI DataTable with custom renderers. + * + * @method _setupDataTable + * @private + */ + _setupDataTable: function RM_AuthorityFinder__setupDataTable() + { + /** + * DataTable Cell Renderers + * + * Each cell has a custom renderer defined as a custom function. See YUI documentation for details. + * These MUST be inline in order to have access to the Alfresco.AuthorityFinder class (via the "me" variable). + */ + var me = this; + + /** + * Icon custom datacell formatter + * + * @method renderCellIcon + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + var renderCellIcon = function AuthorityFinder_renderCellIcon(elCell, oRecord, oColumn, oData) + { + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + var authType = oRecord.getData("authorityType"), + metadata = oRecord.getData("metadata") || {}, + avatarUrl = Alfresco.constants.URL_RESCONTEXT + "components/images/" + (authType == "USER" ? "no-user-photo-64.png" : "group-64.png"); + + if (metadata.avatar && metadata.avatar.length !== 0) + { + avatarUrl = Alfresco.constants.PROXY_URI + metadata.avatar + "?c=queue&ph=true"; + } + + // Store calculated URL to icon + oRecord.setData("calc_iconUrl", avatarUrl); + + elCell.innerHTML = 'avatar'; + }; + + /** + * Description/detail custom datacell formatter - compact mode + * + * @method renderCellDescriptionCompact + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + var renderCellDescriptionCompact = function AuthorityFinder_renderCellDescriptionCompact(elCell, oRecord, oColumn, oData) + { + var authType = oRecord.getData("authorityType"), + metadata = oRecord.getData("metadata"), + desc = ''; + + if (authType == "USER") + { + var userName = oRecord.getData("shortName"), + jobTitle = metadata.jobTitle || "", + organization = metadata.organization || ""; + + desc = '

' + $userProfile(userName, oRecord.getData("displayName"), 'class="theme-color-1"') + ' (' + $html(userName) + ')

'; + if (jobTitle.length > 0) + { + desc += '
' + $html(jobTitle) + '
'; + } + if (organization.length > 0) + { + desc += '
 (' + $html(organization) + ')
'; + } + } + else if (authType == "GROUP") + { + // Changed for RM to hide the 'fullName' in the result list + desc = '

' + $html(oRecord.getData("displayName")) + '

'; + } + elCell.innerHTML = desc; + }; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellDescription + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + var renderCellDescription = function AuthorityFinder_renderCellDescription(elCell, oRecord, oColumn, oData) + { + var authType = oRecord.getData("authorityType"), + metadata = oRecord.getData("metadata"), + desc = ''; + + if (authType == "USER") + { + var userName = oRecord.getData("shortName"), + jobTitle = metadata.jobTitle || "", + organization = metadata.organization || ""; + + desc = '

' + $userProfile(userName, oRecord.getData("displayName"), 'class="theme-color-1"') + ' (' + $html(userName) + ')

'; + if (jobTitle.length > 0) + { + desc += '
' + me.msg("label.title") + ": " + $html(jobTitle) + '
'; + } + if (organization.length > 0) + { + desc += '
' + me.msg("label.company") + ": " + $html(organization) + '
'; + } + } + else if (authType == "GROUP") + { + desc = '

' + $html(oRecord.getData("displayName")) + '

'; + desc += '
' + me.msg("label.name") + ": " + $html(oRecord.getData("fullName")) + '
'; + } + elCell.innerHTML = desc; + }; + + /** + * Add button datacell formatter + * + * @method renderCellIcon + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + var renderCellAddButton = function AuthorityFinder_renderCellAddButton(elCell, oRecord, oColumn, oData) + { + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "text-align", "right"); + + var domId = Alfresco.util.generateDomId(), + desc = '', + itemName = oRecord.getData("fullName"); + + elCell.innerHTML = desc; + + // create button if require - it is not required in the fullpage view mode + if (me.options.viewMode !== Alfresco.AuthorityFinder.VIEW_MODE_FULLPAGE) + { + var button = new YAHOO.widget.Button( + { + type: "button", + label: me.msg("button.add") + " " + me.options.addButtonSuffix, + name: domId + "-name", + container: domId, + disabled: itemName in me.notAllowed, + onclick: + { + fn: me.onItemSelect, + obj: oRecord, + scope: me + } + }); + me.itemSelectButtons[itemName] = button; + + if ((itemName in me.selectedItems) || (me.options.singleSelectMode && me.singleSelectedItem !== "")) + { + me.itemSelectButtons[itemName].set("disabled", true); + } + } + }; + + // DataTable column defintions + var isCompact = this.options.viewMode == Alfresco.AuthorityFinder.VIEW_MODE_COMPACT, + columnDefinitions = + [ + { key: "authorityType", label: "Icon", sortable: false, formatter: renderCellIcon, width: (isCompact ? 36 : 70) }, + { key: "fullName", label: "Description", sortable: false, formatter: (isCompact ? renderCellDescriptionCompact : renderCellDescription) }, + { key: "actions", label: "Actions", sortable: false, formatter: renderCellAddButton, width: 80 } + ]; + + // DataTable definition + this.widgets.dataTable = new YAHOO.widget.DataTable(this.id + "-results", columnDefinitions, this.widgets.dataSource, + { + renderLoopSize: 32, + initialLoad: false, + MSG_EMPTY: this.msg("message.instructions") + }); + + this.widgets.dataTable.doBeforeLoadData = function AuthorityFinder_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.results) + { + this.renderLoopSize = Alfresco.util.RENDERLOOPSIZE; + } + return true; + }; + + // Enable row highlighting + this.widgets.dataTable.subscribe("rowMouseoverEvent", this.widgets.dataTable.onEventHighlightRow); + this.widgets.dataTable.subscribe("rowMouseoutEvent", this.widgets.dataTable.onEventUnhighlightRow); + }, + + /** + * Overrides the _buildSearchParams from the base class. + * + * Build URI parameter string for Group Finder JSON data webscript + * + * @method _buildSearchParams + * @param searchTerm {string} Search terms to query + */ + _buildSearchParams: function RM_AuthorityFinder__buildSearchParams(searchTerm) + { + var searchParams = Alfresco.rm.AuthorityFinder.superclass._buildSearchParams.call(this, searchTerm), + filePlanId = Alfresco.util.getQueryStringParameter("filePlanId"); + return searchParams + "&showGroups=true&zone=APP.RM&shortName=*" + filePlanId; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/permissions/permissions.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/permissions/permissions.css new file mode 100644 index 0000000000..7ff00fdcbe --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/permissions/permissions.css @@ -0,0 +1,127 @@ +.rm-permissions .hidden +{ + display: none; +} + +.rm-permissions .title +{ + margin: 16px 10px 4px; + font-size: 146.5%; + font-weight: bold; + color: #515D6B; + padding-bottom: 0.5em; +} + +.rm-permissions .alignright +{ + text-align: right; +} + +.rm-permissions .floatright +{ + float: right; +} + +.rm-permissions .header +{ + font-weight: bold; + font-size: 108%; +} + +.rm-permissions .permlist +{ + margin: 0.5em; + border: 1px solid #444; +} + +.rm-permissions .permlist-border +{ + padding: 1px; +} + +.rm-permissions .inherit +{ + padding: 0.5em 1em 0em 0em; +} + +.rm-permissions .list-item-header +{ + padding: 0.7em 0.6em 0.5em 0.6em; +} + +.rm-permissions .list-item +{ + padding: 0.7em 0.6em 0.5em 0.6em; + border-top: 1px dotted #999; +} + +.rm-permissions .label +{ + color: #000; +} + +.rm-permissions .readonly-label +{ + color: #000; + margin-top: 0.3em; +} + +.rm-permissions .hint-label +{ + margin-left: 0.5em; + color: #444; +} + +.rm-permissions .controls-header +{ + float: right; + min-width: 12em; +} + +.rm-permissions .controls +{ + float: right; + margin-top: -0.5em; + min-width: 12em; +} + +.rm-permissions .actions-header +{ + float: right; + min-width: 8em; +} + +.rm-permissions .actions +{ + float: right; + margin-top: -0.5em; + min-width: 8em; +} + +.rm-permissions .center +{ + padding-top: 1em; + text-align: center; + width: 100%; +} + +.rm-permissions .authority-picker +{ + display: none; + position: absolute; + right: 1em; + top: 12em; + z-index: 100; + min-width: 30em; + *width: 30em; +} + +.rm-permissions .authority-picker.active +{ + display: inline; +} + +.rm-permissions .authority-finder +{ + margin: 0; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/permissions/permissions.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/permissions/permissions.js new file mode 100644 index 0000000000..e60b078254 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/permissions/permissions.js @@ -0,0 +1,538 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Records Search component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.RecordsPermissions + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Search constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.RecordsPermissions} The new RecordsPermissions instance + * @constructor + */ + Alfresco.rm.component.RecordsPermissions = function(htmlId) + { + /* Super class constructor call */ + Alfresco.rm.component.RecordsPermissions.superclass.constructor.call( + this, "Alfresco.rm.component.RecordsPermissions", htmlId, + ["button", "container", "datasource", "datatable", "json", "menu"]); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.RecordsPermissions, Alfresco.component.Base, + { + /** + * Object container for storing YUI menu instances, indexed by property name. + * + * @property modifyMenus + * @type object + */ + modifyMenus: null, + + /** + * Object container for storing YUI button instances, indexed by property name. + * + * @property removeButtons + * @type object + */ + removeButtons: null, + + /** + * Array of objects representing the permissions list as displayed. + * Of the form: + * { + * "authority": "GROUP|USERNAME", + * "id": "PERMISSIONID", + * "remove": BOOLEAN, + * "modified": BOOLEAN, + * "el": DOMELEMENT + * } + * + * @property permissions + * @type Array + */ + permissions: null, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RecordsPermissions_onReady() + { + var me = this; + + // Buttons + this.widgets.addButton = Alfresco.util.createYUIButton(this, "addusergroup-button", this.onAddClick); + this.widgets.finishButton = Alfresco.util.createYUIButton(this, "finish-button", this.onFinishClick); + + // Load in the Authority Finder component from the server + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/authority-finder", + dataObj: + { + htmlid: this.id + "-authoritypicker", + module: "rm" + }, + successCallback: + { + fn: this.onAuthorityFinderLoaded, + scope: this + }, + failureMessage: this.msg("message.authoritypickerfail"), + execScripts: true + }); + + // initial update of the UI + this.refreshPermissionsList(); + }, + + /** + * Called when the authority finder template has been loaded. + * Creates a dialog and inserts the authority finder for choosing groups and users to add. + * + * @method onAuthorityFinderLoaded + * @param response The server response + */ + onAuthorityFinderLoaded: function RecordsPermissions_onAuthorityFinderLoaded(response) + { + // Inject the component from the XHR request into it's placeholder DIV element + var finderDiv = Dom.get(this.id + "-authoritypicker"); + finderDiv.innerHTML = response.serverResponse.responseText; + + this.widgets.authorityFinder = finderDiv; + + // Find the Authority Finder by container ID + this.modules.authorityFinder = Alfresco.util.ComponentManager.get(this.id + "-authoritypicker"); + + // Set the correct options for our use + this.modules.authorityFinder.setOptions( + { + viewMode: Alfresco.AuthorityFinder.VIEW_MODE_COMPACT, + singleSelectMode: true, + minSearchTermLength: 3 + }); + + // Make sure we listen for events when the user selects an authority + YAHOO.Bubbling.on("itemSelected", this.onAuthoritySelected, this); + }, + + /** + * Authority selected event handler. This event is fired from Authority picker. + * + * @method onAuthoritySelected + * @param e DomEvent + * @param args Event parameters (depends on event type) + */ + onAuthoritySelected: function ViewPanelHandler_onAuthoritySelected(e, args) + { + // construct permission descriptor and add permission row + var permission = + { + "id": "ReadRecords", + "authority": + { + "id": args[1].itemName, + "label": args[1].displayName + } + }; + this.addPermissionRow(permission, true); + + // remove authority selector popup + Dom.removeClass(this.widgets.authorityFinder, "active"); + this.showingFilter = false; + }, + + /** + * Refresh the permissions list. + * + * @method refreshPermissionsList + */ + refreshPermissionsList: function RecordsPermissions_refreshPermissionsList() + { + // clear the list of meta-data items + var elPermList = Dom.get(this.id + "-list"); + elPermList.innerHTML = ""; + + // reset widget references + this.modifyMenus = {}; + this.removeButtons = {}; + + // perform ajax call to get the current permissions for the node + Alfresco.util.Ajax.request( + { + method: Alfresco.util.Ajax.GET, + url: Alfresco.constants.PROXY_URI + "api/node/" + this.options.nodeRef.replace(":/", "") + "/rmpermissions", + successCallback: + { + fn: this.onPermissionsLoaded, + scope: this + }, + failureCallback: + { + fn: function() + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.getpermissionsfail") + }); + }, + scope: this + } + }); + }, + + /** + * Permissions list - ajax handler callback + * + * @method onPermissionsLoaded + * @param res {object} Response + */ + onPermissionsLoaded: function RecordsPermissions_onPermissionsLoaded(res) + { + // clear the list of local permissions + this.permissions = []; + + var json = Alfresco.util.parseJSON(res.serverResponse.responseText); + var perms = json.data.permissions; + + // sort the array from the json response - alphabetically + perms.sort(function(a, b) + { + return (a.authority.label > b.authority.label) ? -1 : (a.authority.label < b.authority.label) ? 1 : 0; + }); + + for (var i in perms) + { + this.addPermissionRow(perms[i], false); + } + }, + + /** + * Add a row to the list of permissions. Also updates the internal local + * permission object list. + * Expects a permission object descriptor: + * { + * "id": "Filing", + * "authority": + * { + * "id": "GROUP_ALFRESCO_ADMINISTRATORS", + * "label": "ALFRESCO_ADMINISTRATORS" + * } + * } + * Generally provided via JSON call or created for a new permission. + * + * @method addPermissionRow + * @param permission {object} See above + * @param created {boolean} If true then this is a newly created permission. + */ + addPermissionRow: function RecordsPermissions_addPermissionRow(permission, created) + { + var me = this; + + // quick exit from the function if the added authority already exists as a local permission + if (created) + { + for (var n in this.permissions) + { + var perm = this.permissions[n]; + if (perm.remove === false && perm.authority === permission.authority.id) + { + return; + } + } + } + + var elPermList = Dom.get(this.id + "-list"); + + // build row item for the permission and controls + var div = document.createElement("div"); + + // construct local permission reference from current data + var i = this.permissions.length; + var p = + { + "authority": permission.authority.id, + "id": permission.id, + "remove": false, + "created": created, + "modified": false, + "el": div + }; + this.permissions.push(p); + + // dynamically generated button ids + var modifyMenuContainerId = this.id + '-edit-' + i; + var removeBtnContainerId = this.id + '-remove-' + i; + + // messages + var msgReadOnly = this.msg("label.readonly"); + var msgReadFile = this.msg("label.readandfile"); + + // construct row data + var html = '
'; + html += '
'; + html += '
' + $html(permission.authority.label) + '
'; + + div.innerHTML = html; + + // insert into the DOM for display + elPermList.appendChild(div); + + // generate menu and buttons (NOTE: must occur after DOM insertion) + this.modifyMenus[i] = new YAHOO.widget.Button( + { + type: "menu", + container: modifyMenuContainerId, + menu: [ + { text: msgReadOnly, value: "ReadRecords" }, + { text: msgReadFile, value: "Filing" } + ] + }); + // set menu button text on current permission + this.modifyMenus[i].set("label", (permission.id === "Filing" ? msgReadFile : msgReadOnly) + " " + Alfresco.constants.MENU_ARROW_SYMBOL); + // subscribe to the menu click event + this.modifyMenus[i].getMenu().subscribe("click", function(p_sType, p_aArgs, index) + { + var menuItem = p_aArgs[1]; + if (menuItem) + { + // update menu button text to selected item label + me.modifyMenus[index].set("label", menuItem.cfg.getProperty("text")); + + // update modified permissions value and set as modified + me.permissions[i].id = menuItem.value; + me.permissions[i].modified = true; + } + }, i); + + this.removeButtons[i] = new YAHOO.widget.Button( + { + type: "button", + label: this.msg("button.remove"), + name: this.id + '-removeButton-' + i, + container: removeBtnContainerId, + onclick: + { + fn: this.onClickRemovePermission, + obj: i, + scope: this + } + }); + + if (permission.authority.id.toLowerCase().indexOf("GROUP_Administrator".toLowerCase()) !== -1) + { + Alfresco.util.disableYUIButton(this.removeButtons[i]); + Alfresco.util.disableYUIButton(this.modifyMenus[i]); + } + }, + + /** + * Remove Permission button click handler + * + * @method onClickRemovePermission + * @param e {object} DomEvent + * @param obj {object} Object passed back from addListener method + */ + onClickRemovePermission: function RecordsPermissions_onClickRemovePermission(e, obj) + { + // mark as removed and clear related DOM element + var permission = this.permissions[obj]; + permission.remove = true; + permission.el.parentNode.removeChild(permission.el); + permission.el = null; + }, + + /** + * Fired when the Add User/Group button is clicked. + * + * @method onAddClick + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onAddClick: function RecordsPermissions_onAddClick(e, args) + { + if (!this.showingFilter) + { + this.modules.authorityFinder.clearResults(); + Dom.addClass(this.widgets.authorityFinder, "active"); + var el = Dom.get(this.id + "-authoritypicker-search-text"); + el.focus(); + this.showingFilter = true; + } + else + { + Dom.removeClass(this.widgets.authorityFinder, "active"); + this.showingFilter = false; + } + }, + + /** + * Fired when the Finish button is clicked. + * + * @method onFinishClick + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onFinishClick: function RecordsPermissions_onFinishClick(e, args) + { + this.widgets.finishButton.set("disabled", true); + + var obj = + { + "permissions": [] + }; + + for (var i in this.permissions) + { + var p = this.permissions[i]; + // we either: add newly created permissions or remove existing ones or update existing ones + if ((p.created && p.remove === false) || + (p.created === false && p.remove) || + (p.created === false && p.modified)) + { + // special case for "upgrading" or "downgrading" existing permissions + if (p.created === false && p.modified) + { + // first remove existing permission + var permission = + { + "id": (p.id === "Filing" ? "ReadRecords": "Filing"), + "authority": p.authority, + "remove": true + }; + obj.permissions.push(permission); + } + var permission = + { + "id": p.id, + "authority": p.authority, + "remove": p.remove + }; + obj.permissions.push(permission); + } + } + + if (obj.permissions.length !== 0) + { + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "api/node/" + this.options.nodeRef.replace(":/", "") + "/rmpermissions", + method: Alfresco.util.Ajax.POST, + dataObj: obj, + requestContentType: Alfresco.util.Ajax.JSON, + successCallback: + { + fn: function(res) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.finish-success") + }); + + // return to appropriate location + this._navigateForward(); + }, + scope: this + }, + failureCallback: + { + fn: function(res) + { + var json = Alfresco.util.parseJSON(res.serverResponse.responseText); + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.failure"), + text: this.msg("message.finish-failure", json.message) + }); + this.widgets.finishButton.set("disabled", false); + }, + scope: this + } + }); + } + else + { + // return to appropriate location + this._navigateForward(); + } + }, + + /** + * Displays the corresponding return page for the current node. + * + * @method _navigateForward + * @private + */ + _navigateForward: function RecordsPermissions__navigateForward() + { + // Did we come from the document library? If so, then direct the user back there + if (document.referrer.match(/documentlibrary([?]|$)/)) + { + history.go(-1); + } + else + { + var nodeType = this.options.nodeType; + switch (this.options.nodeType) + { + case "rma:recordCategory": + nodeType = "rm-record-category"; + break; + case "rma:recordFolder": + nodeType = "rm-record-folder"; + break; + default : + nodeType = "document"; + break; + } + // go back to the appropriate details page for the node + window.location.href = nodeType + "-details?nodeRef=" + this.options.nodeRef; + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/manage-references.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/manage-references.css new file mode 100644 index 0000000000..1d2f55ae8c --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/manage-references.css @@ -0,0 +1,72 @@ +.rm-manage-references .title { + color:#515D6B; + font-size:123.1%; + font-weight:bold; + padding-bottom:0.5em; +} + +.rm-manage-references +{ + text-align: right; + padding:1em 0; +} +.rm-manage-references h2 +{ + float: left; + font-size:118%; +} +.rm-manage-references h3 +{ + clear:both; + text-align:left; + margin-top:0.5em; +} +.rm-manage-references ol +{ + text-align: left; + border: 1px solid #999; + margin:1em 0; +} +.rm-manage-references li +{ + clear:both; + padding: 1em 0.5em 1em 3em; + background: transparent url(../documentlibrary/images/record-32.png) no-repeat scroll 4px 7px; + text-align: right; + border-bottom: 1px solid #999; +} +.rm-manage-references li:last-child +{ + border-bottom: none; +} +.rm-manage-references ol li span +{ + float: left; +} +.rm-manage-references ol li span.yui-button +{ + float: none; +} +.rm-manage-references ol li button +{ + margin:0 0.5em; +} +.rm-manage-references div.componentFtr +{ + width:100%; + text-align:center; +} + +.rm-manage-references p#to-no-refs, +.rm-manage-references p#from-no-refs +{ + text-align: left; + display:none; + margin-bottom:1em; +} + +.rm-manage-references p#to-no-refs.active, +.rm-manage-references p#from-no-refs.active +{ + display:block; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/manage-references.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/manage-references.js new file mode 100644 index 0000000000..efbf7b7393 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/manage-references.js @@ -0,0 +1,218 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM References component + * + * @namespace Alfresco + * @class Alfresco.rm.component.ManageReferences + */ +(function RM_References() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * RM References component constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.ManageReferences} The new component instance + * @constructor + */ + Alfresco.rm.component.ManageReferences = function RM_References_constructor(htmlId) + { + return Alfresco.rm.component.ManageReferences.superclass.constructor.call(this, "Alfresco.rm.component.ManageReferences", htmlId); + }; + + /** + * Extend Alfresco.component.Base with class implementation + */ + YAHOO.extend(Alfresco.rm.component.ManageReferences, Alfresco.component.Base, + { + /** + * Initialises event listening and custom events + * + * @method initEvents + */ + initEvents: function RM_References_initEvents() + { + Event.on(this.id, 'click', this.onInteractionEvent, null, this); + + this.registerEventHandler('click', + [ + { + rule: 'button.deleteRef', + o: + { + handler: this.onDeleteReference, + scope: this + } + }, + { + rule: 'button.doneRef', + o: + { + handler: this.onDoneReference, + scope: this + } + }, + { + rule: 'button.newRef', + o: + { + handler:this.onNewReference, + scope:this + } + } + ]); + return this; + }, + + /** + * Handler for Done button + * + * @method onDoneReference + * @param e {object} Event + * @param args {object} Event arguments + */ + onDoneReference: function RM_References_onDoneReference(e, args) + { + var uriTemplate = 'document-details?nodeRef={nodeRef}', + pageUrl = YAHOO.lang.substitute(uriTemplate, + { + site: encodeURIComponent(this.options.siteId), + nodeRef: this.options.nodeRef + }); + + window.location.href = pageUrl; + }, + + /** + * Handler for delete button + * + * @method onDeleteReference + * @param e {object} Event + * @param args {object} Event arguments + */ + onDeleteReference: function RM_References_onDeleteReference(e, args) + { + var eTarget = Event.getTarget(e), + refId = this.widgets[eTarget.id.replace('-button', '')].get('value'), + nodeRefEl = Dom.getAncestorByTagName(eTarget, 'li'), + href = nodeRefEl.getElementsByTagName('a')[0].href, + nodeRef = new Alfresco.util.NodeRef(Alfresco.util.getQueryStringParameter("nodeRef", href)), + queryString = "?st=" + nodeRef.storeType + "&si=" + nodeRef.storeId + "&id=" + nodeRef.id, + type = (nodeRefEl.className.indexOf('fromRef')!=-1) ? 'from' : 'to'; + + Alfresco.util.Ajax.jsonRequest( + { + method: Alfresco.util.Ajax.DELETE, + url: Alfresco.constants.PROXY_URI + "api/node/" + this.options.nodeRef.replace(':/', '') + '/customreferences' + '/' + refId + queryString, + successCallback: + { + fn: function(e) + { + this.onDeleteSuccess(nodeRefEl, type); + }, + scope: this + }, + successMessage: Alfresco.util.message("message.delete.success", 'Alfresco.rm.component.ManageReferences'), + failureMessage: Alfresco.util.message("message.delete.fail", 'Alfresco.rm.component.ManageReferences') + }); + }, + + /** + * Handler for new reference button + * + * @method onNewReference + * @param e {object} Event + * @param args {object} Event arguments + */ + onNewReference: function RM_References_onNewReference(e, args) + { + var uriTemplate = 'rm-reference-new?nodeRef={nodeRef}&parentNodeRef={parentNodeRef}&docName={docName}', + url = YAHOO.lang.substitute(uriTemplate, + { + site: encodeURIComponent(this.options.siteId), + nodeRef: this.options.nodeRef, + parentNodeRef: this.options.parentNodeRef, + docName: encodeURIComponent(this.options.docName) + }); + + window.location.href = url; + }, + + /** + * Handler for deletion success + * + * @method onDeleteSuccess + * @param nodeRefEl {string} ID portion of nodeRef that was successfully deleted + * @param type {string} Type of reference (from or to) + */ + onDeleteSuccess: function RM_References_onDeleteSuccess(nodeRefEl, type) + { + var ul = nodeRefEl.parentNode; + + // Remove list item + ul.removeChild(nodeRefEl); + + // If no more references, remove list and display message + if (ul.getElementsByTagName('li').length === 0) + { + ul.parentNode.removeChild(ul); + Dom.addClass(type+"-no-refs", 'active'); + } + }, + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + * @override + */ + onReady: function RM_References_onReady() + { + this.initEvents(); + + // Create widget button while reassigning classname to src element (since YUI removes classes). + // We need the classname so we can identify what action to take when it is interacted with (event delegation). + var buttons = Sel.query('button', this.id), + button, id; + for (var i = 0, len = buttons.length; i < len; i++) + { + button = buttons[i]; + id = button.id; + this.widgets[id] = new YAHOO.widget.Button(id); + this.widgets[id]._button.className = button.className; + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/new-reference.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/new-reference.css new file mode 100644 index 0000000000..8c5f890d73 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/new-reference.css @@ -0,0 +1,20 @@ +.rm-new-reference .heading +{ + color:#333333; + font-size:154%; + padding:1em 1em 0; +} +#selection +{ + display:none; + padding: 2px 0 3px 1.5em; + background: transparent url(../../../components/images/generic-file-16.png) no-repeat scroll 0 0; + margin:0.5em 0; +} +#selection.active +{ + display: block; +} +input#submitCreate { + width:auto; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/new-reference.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/new-reference.js new file mode 100644 index 0000000000..bd0e122f7d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/references/new-reference.js @@ -0,0 +1,277 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM References component + * + * @namespace Alfresco + * @class Alfresco.rm.component.NewReference + */ +(function RM_NewReference() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $links = Alfresco.util.activateLinks; + + /** + * RM References component constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.dashlet.MyDocuments} The new component instance + * @constructor + */ + Alfresco.rm.component.NewReference = function RM_NewReference_constructor(htmlId) + { + Alfresco.rm.component.NewReference.superclass.constructor.call(this, "Alfresco.rm.component.NewReference", htmlId, ["button", "menu", "container", "resize", "datatable", "datasource"]); + + // this.eventHandlers = {}; + return this; + }; + + YAHOO.extend(Alfresco.rm.component.NewReference, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * String Id used for document picker control + * + * @property controlId + * @type String + */ + controlId: "", + + /** + * String Id used for document picker picker + * + * @property pickerId + * @type String + */ + pickerId: "", + + /** + * Comma separated value of selected documents (nodeRefs). + * + * @property pickerId + * @type String + */ + currentValue: "" + + }, + + /** + * Initialises event listening and custom events + * + * @method initEvents + */ + initEvents : function RM_NewReference_initEvents() + { + Event.on(this.id, 'click', this.onInteractionEvent, null, this); + Event.on('new-ref-name', 'keyup', function(e) + { + this.checkRequiredFields(); + }, null, this); + return this; + }, + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + */ + onReady: function RM_NewReference_onReady() + { + this.widgets.createButton = Alfresco.util.createYUIButton(this, "create", this.onCreate); + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "cancel", this._navigateForward); + + this.initEvents(); + this.widgets.documentPicker = new Alfresco.module.DocumentPicker(this.id + '-docPicker', Alfresco.rm.module.ObjectRenderer); + + parentNodeRef = Alfresco.util.getQueryStringParameter('parentNodeRef') + this.widgets.documentPicker.setOptions( + { + controlId: this.options.controlId, + pickerId: this.options.pickerId, + disabled: false, + compactMode: false, + displaySmallAddButtonIcon:true, + currentValue: this.options.currentValue, + minSearchTermLength: 3, + maxSearchResults: 100, + multipleSelectMode: false, + parentNodeRef: Alfresco.util.getQueryStringParameter('parentNodeRef'), + itemFamily: "node", + showLinkToTarget: false, + maintainAddedRemovedItems:false, + mandatory:true, + docLibNameAlias:this.msg('label.fileplan'), + restrictParentNavigationToDocLib: true, + params:'filterType=rma:dispositionSchedule,rma:dispositionActionDefinition,rma:dispositionAction,rma:hold,rma:transfer,cm:thumbnail' + }); + + // Clear the previous selection... + this.widgets.documentPicker.selectedItems = []; + Alfresco.util.setVar('DocumentPickerSelection',[]); + + // RM-398 - Override default onCancel function which does not re-enable the select button + // when the picker is cancelled. It was not possible to fix this in the core for + // 2.0 because the targeted Alfresco release was already frozen. + this.widgets.documentPicker.onCancel = function(e, p_obj) + { + this.widgets.panel.hide(); + this.widgets.showPicker.set("disabled", false); + this.resetSelection(); + Event.preventDefault(e); + }; + + this.widgets.documentPicker.resetSelection = function() + { + this.singleSelectedItem = null; + }; + + YAHOO.Bubbling.on('onDocumentsSelected', this.updateSelectionField, this); + }, + + /** + * Updates UI with details about the selected documents + * + * Also updates the internal value as nodeRefs, so the document picker can + * reload the selection if user selects the picker again. + * + * @method updateSelectionField + * @param e {object} Event + * @param args {object} Event arguments + */ + updateSelectionField: function RM_NewReference_updateSelectionField(e, args) + { + var selectedEl = Dom.get(this.options.pickerId), + selectedItems = args[1].items; + if (selectedItems.length > 0) + { + // We only need one + var selectedItem = selectedItems[0], + docUrl = Alfresco.constants.URL_PAGECONTEXT + 'site/rm/document-details?nodeRef=' + selectedItem.nodeRef, + docLibPath = selectedItem.displayPath.split('documentLibrary')[1]; + selectedEl.innerHTML = ''+ $html(docLibPath + '/' + selectedItem.name) +''; + Dom.addClass(selectedEl,'active'); + // Note: if more than one than we must store as comma separated + this.options.currentValue = selectedItem.nodeRef; + } + else + { + selectedEl.innerHTML = ""; + Dom.removeClass(selectedEl,'active'); + this.options.currentValue = ""; + } + + this.widgets.documentPicker.widgets.showPicker.set("disabled", false); + this.checkRequiredFields(); + }, + + /** + * Updates state of submit button based on required valued + * + * @method checkRequiredFields + */ + checkRequiredFields: function() + { + if (this.options.currentValue != "" && Dom.get('new-ref-name').value != "") + { + this.widgets.createButton.set('disabled', false); + } + else + { + this.widgets.createButton.set('disabled', true); + } + }, + + /** + * Displays the corresponding details page for the current node + * + * @method _navigateForward + * @private + */ + _navigateForward: function RM_NewReference__navigateForward() + { + this.widgets.documentPicker.resetSelection(); + var uriTemplate = Alfresco.constants.URL_PAGECONTEXT + 'site/{site}/rm-references?nodeRef={nodeRef}&parentNodeRef={parentNodeRef}&docName={docName}', + pageUrl = YAHOO.lang.substitute(uriTemplate, + { + site: encodeURIComponent(this.options.siteId), + nodeRef: this.options.nodeRef, + parentNodeRef: this.options.parentNodeRef, + docName: encodeURIComponent(this.options.docName) + }); + + window.location.href = pageUrl; + }, + + /** + * Create button event handler + * + * @method onCreate + * @params e {object} Event + */ + onCreate: function RM_NewReference__onCreate(e) + { + var refTypeEl = document.getElementById('record-rel'), + referenceType = refTypeEl.options[refTypeEl.selectedIndex].value; + + Alfresco.util.Ajax.jsonRequest( + { + method: Alfresco.util.Ajax.POST, + url: Alfresco.constants.PROXY_URI + "api/node/" + this.options.nodeRef.replace(':/', '') + '/customreferences', + dataObj: + { + refId: referenceType, + toNode: this.options.currentValue + }, + successCallback: + { + fn: this._navigateForward, + scope: this + }, + failureMessage: this.msg("message.createfail") + }); + return false; + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/config/rule-config-util.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/config/rule-config-util.js new file mode 100644 index 0000000000..1b21be23e5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/config/rule-config-util.js @@ -0,0 +1,305 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Rule config util + * + * @namespace Alfresco + * @class Alfresco.RuleConfigUtil + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths; + + /** + * Alfresco.RuleConfigUtil implementation + */ + Alfresco.RuleConfigUtil = {}; + Alfresco.RuleConfigUtil.prototype = + { + + /** + * Flag to help us add listener for "ruleConfigReady" only once + * + * @property ruleConfigs + * @type boolean + * @default false + */ + listeningForReadyRuleConfigs: false, + + /** + * This is where the rule configs will be stored: type (event), condition (if & unless) & action (action). + * Will first contain the componentId as key and a false boolean value to indicate that a component is being + * loaded but hasn't fired its "ruleConfigReady" event. When the config component has fired the event + * onRuleConfigReady method will replace the boolean value with the component instance to + * indicate the config component is ready to be used. + * + * @property ruleConfigs + * @type object + */ + ruleConfigs: {}, + + /** + * Load rule config components and insert them inside this component + * + * @method loadRuleConfigs + * @private + */ + loadRuleConfigs: function RuleEditUtil_loadRuleConfigs() + { + // Make sure we have a hash for storing the rule configs + if (!this.modules.ruleConfigs) + { + this.modules.ruleConfigs = {}; + } + + if (!this.listeningForReadyRuleConfigs) + { + // Listen for "ruleConfigReady" events + YAHOO.Bubbling.on("ruleConfigReady", this.onRuleConfigReady, this); + } + + this._loadRuleConfigs( + [ + { component: "components/rules/config/type", name: "ruleConfigType", dataObj: {} }, + { component: "rm/components/rules/config/condition", name: "ruleConfigIfCondition", dataObj: { mode: "if" } }, + { component: "rm/components/rules/config/condition", name: "ruleConfigUnlessCondition", dataObj: { mode: "unless" } }, + { component: "rm/components/rules/config/action", name: "ruleConfigAction", dataObj: {} } + ]); + }, + + /** + * Load rule config components and insert them inside this component + * + * @method _loadRuleConfigs + * @param {array} ruleConfigs array with objects describing from where to load the components and where to insert them + * @private + */ + _loadRuleConfigs: function RuleEditUtil__loadRuleConfigs(ruleConfigs) + { + if (ruleConfigs && ruleConfigs.length > 0) + { + var ruleConfig = ruleConfigs[0], + ruleConfigComponentId = this.id + "-" + ruleConfig.name, + dataObj = YAHOO.lang.merge( + { + htmlid: ruleConfigComponentId, + site: this.options.siteId + }, ruleConfig.dataObj); + + this.ruleConfigs[ruleConfigComponentId] = false; + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + ruleConfig.component, + dataObj: dataObj, + successCallback: + { + fn: function (response) + { + // Insert config components html to this component + Dom.get(this.id + "-" + ruleConfig.name).innerHTML = response.serverResponse.responseText; + + // Get the rest of the configs + ruleConfigs.splice(0, 1); + this._loadRuleConfigs(ruleConfigs); + }, + scope: this + }, + execScripts: true + }); + } + else + { + this.onRuleConfigsLoaded(); + } + }, + + + /** + * Called when a rule config component has sent event telling its ready. + * This method will display the configs when all 4 of them are ready. + * + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters + */ + onRuleConfigReady: function RuleEditUtil_onRuleConfigReady(layer, args) + { + // Check the event is directed towards this instance + var configComponent = args[1].eventGroup, + configComponentId = configComponent.id; + if (YAHOO.lang.isBoolean(this.ruleConfigs[configComponentId])) + { + // The config component belongs to this component and is ready + // Save reference to config component instance + this.ruleConfigs[configComponentId] = configComponent; + } + + // Check if all config components are ready, if so display the rules rule config sections + if (!this.ruleConfigs[this.id + "-ruleConfigType"] || + !this.ruleConfigs[this.id + "-ruleConfigIfCondition"] || + !this.ruleConfigs[this.id + "-ruleConfigUnlessCondition"] || + !this.ruleConfigs[this.id + "-ruleConfigAction"]) + { + // Not all config components are ready + return; + } + + // Let superclass + this.onRuleConfigsReady(); + }, + + /** + * Called then the rule config components have been loaded, inserted has loaded all of their + * dependecies, and thereofre is ready to use. + * In other words ready for getting their displayRuleConfigs() invoked. + * + * @method onRuleConfigsReady + */ + onRuleConfigsReady: function RuleEditUtil_onRuleConfigsReady() + { + /** + * Override this method to take appropriate actions when the config has been loaded, + * inserted to the Dom and has loaded all of it's own dependencies and is ready to + * get it's displayRuleConfig method invoked. + */ + }, + + /** + * Called then the rule config components have been loaded and inserted. + * + * @method onRuleConfigsLoaded + */ + onRuleConfigsLoaded: function RuleEditUtil_onRuleConfigsLoaded() + { + /** + * Override this method to take appropriate actions when the config has been loaded, + * inserted to the Dom and is looking visually ok. + */ + }, + + /** + * Takes a rule and displays the info inside the rule config components in editable mode + * if editMode is true. + * + * @method displayRuleConfigs + * @param rule {object} The object describing the rule with the info to display as rule configs + * @param mode {string} + * @return {array} the number of configs for each of the for config types. + */ + displayRuleConfigs: function RuleEditUtil_displayRuleConfigs(rule, mode, form) + { + var ruleConfig = null, + result = []; + + // Transform types into a config object for event section + var typeConfigs = []; + for (var i = 0, il = rule.ruleType.length; i < il; i++) + { + typeConfigs.push( + { + name: rule.ruleType[i] + }); + } + + // Initialise type config + ruleConfig = this.ruleConfigs[this.id + "-ruleConfigType"]; + ruleConfig.setOptions( + { + siteId: this.options.siteId, + form: form, + mode: mode + }); + ruleConfig.displayRuleConfigs(typeConfigs); + result.push(typeConfigs.length); + + // Add all conditions to if OR unless config sections + var ifConditionConfigs = [], + unlessConditionConfigs = [], + config; + for (i = 0, il = rule.action.conditions ? rule.action.conditions.length : 0; i < il; i++) + { + config = rule.action.conditions[i]; + if (config.invertCondition) + { + unlessConditionConfigs.push(config); + } + else + { + ifConditionConfigs.push(config); + } + } + + // Initialise if condition config + ruleConfig = this.ruleConfigs[this.id + "-ruleConfigIfCondition"]; + ruleConfig.setOptions( + { + siteId: this.options.siteId, + form: form, + mode: mode, + ruleConfigDefinitionKey: "conditionDefinitionName" + }); + ruleConfig.displayRuleConfigs(ifConditionConfigs); + result.push(ifConditionConfigs.length); + + // Initialise unless condition config + ruleConfig = this.ruleConfigs[this.id + "-ruleConfigUnlessCondition"]; + ruleConfig.setOptions( + { + siteId: this.options.siteId, + form: form, + mode: mode, + ruleConfigDefinitionKey: "conditionDefinitionName" + }); + ruleConfig.displayRuleConfigs(unlessConditionConfigs); + result.push(unlessConditionConfigs.length); + + // Add actions to action section and initilise action config + ruleConfig = this.ruleConfigs[this.id + "-ruleConfigAction"]; + ruleConfig.setOptions( + { + siteId: this.options.siteId, + form: form, + mode: mode, + ruleConfigDefinitionKey: "actionDefinitionName" + }); + ruleConfig.displayRuleConfigs(rule.action.actions); + result.push(rule.action.actions.length); + + return result; + } + + }; +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-config-action-custom.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-config-action-custom.js new file mode 100644 index 0000000000..1e1f6ebe50 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-config-action-custom.js @@ -0,0 +1,742 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * RuleConfigActionCustom. + * + * @namespace Alfresco + * @class Alfresco.RuleConfigActionCustom + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $hasEventInterest = Alfresco.util.hasEventInterest; + + Alfresco.RuleConfigActionCustom = function(htmlId) + { + Alfresco.RuleConfigActionCustom.superclass.constructor.call(this, htmlId); + + // Re-register with our own name + this.name = "Alfresco.RuleConfigActionCustom"; + Alfresco.util.ComponentManager.reregister(this); + + // Instance variables + this.customisations = YAHOO.lang.merge(this.customisations, Alfresco.RuleConfigActionCustom.superclass.customisations); + this.renderers = YAHOO.lang.merge(this.renderers, Alfresco.RuleConfigActionCustom.superclass.renderers); + + return this; + }; + + YAHOO.extend(Alfresco.RuleConfigActionCustom, Alfresco.RuleConfigAction, + { + customisations: + { + Reject: + { + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + configDef.parameterDefinitions.push({ + type: "arca:reject-dialog-button", + _buttonLabel: this.msg("button.reject") + }); + return configDef; + } + }, + RequestInfo: + { + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + configDef.parameterDefinitions.push({ + type: "arca:requestInfo-dialog-button", + _buttonLabel: this.msg("button.requestInfo") + }); + return configDef; + } + }, + FileTo: + { + text: function(configDef, ruleConfig, configEl) + { + this._getParamDef(configDef, "createRecordPath").displayLabel = this.msg("fileTo.createRecordPath.label"); + this._getParamDef(configDef, "path").displayLabel = this.msg("fileTo.path.label"); + return configDef; + }, + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + + configDef.parameterDefinitions.splice(0, 0, + { + type: "arca:rm-destination-dialog-button", + _buttonLabel: this.msg("button.select-folder"), + _destinationParam: "destination-folder" + }); + + configDef.parameterDefinitions.splice(1, 0, + { + type: "arca:record-path-help-icon" + }); + + var path = this._getParamDef(configDef, "path"); + path._type = "hidden"; + path.displayLabel = this.msg("fileTo.path.label"), + path._displayLabelToRight = false; + path._hideColon = true; + + var createRecordPath = this._getParamDef(configDef, "createRecordPath"); + createRecordPath._type = null; + createRecordPath.displayLabel = this.msg("fileTo.createRecordPath.label"), + createRecordPath._displayLabelToRight = false; + createRecordPath._hideColon = true; + + return configDef; + } + }, + CopyTo: + { + text: function(configDef, ruleConfig, configEl) + { + this._getParamDef(configDef, "createRecordPath").displayLabel = this.msg("fileTo.createRecordPath.label"); + this._getParamDef(configDef, "path").displayLabel = this.msg("fileTo.path.label"); + return configDef; + }, + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + + configDef.parameterDefinitions.splice(0, 0, + { + type: "arca:rm-destination-dialog-button", + _buttonLabel: this.msg("button.select-folder"), + _destinationParam: "destination-folder" + }); + + configDef.parameterDefinitions.splice(1, 0, + { + type: "arca:record-path-help-icon" + }); + + var path = this._getParamDef(configDef, "path"); + path._type = "hidden"; + path.displayLabel = this.msg("fileTo.path.label"), + path._displayLabelToRight = false; + path._hideColon = true; + + var createRecordPath = this._getParamDef(configDef, "createRecordPath"); + createRecordPath._type = null; + createRecordPath.displayLabel = this.msg("fileTo.createRecordPath.label"), + createRecordPath._displayLabelToRight = false; + createRecordPath._hideColon = true; + + return configDef; + } + }, + MoveTo: + { + text: function(configDef, ruleConfig, configEl) + { + this._getParamDef(configDef, "createRecordPath").displayLabel = this.msg("fileTo.createRecordPath.label"); + this._getParamDef(configDef, "path").displayLabel = this.msg("fileTo.path.label"); + return configDef; + }, + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + + configDef.parameterDefinitions.splice(0, 0, + { + type: "arca:rm-destination-dialog-button", + _buttonLabel: this.msg("button.select-folder"), + _destinationParam: "destination-folder" + }); + + configDef.parameterDefinitions.splice(1, 0, + { + type: "arca:record-path-help-icon" + }); + + var path = this._getParamDef(configDef, "path"); + path._type = "hidden"; + path.displayLabel = this.msg("fileTo.path.label"), + path._displayLabelToRight = false; + path._hideColon = true; + + var createRecordPath = this._getParamDef(configDef, "createRecordPath"); + createRecordPath._type = null; + createRecordPath.displayLabel = this.msg("fileTo.createRecordPath.label"), + createRecordPath._displayLabelToRight = false; + createRecordPath._hideColon = true; + + return configDef; + } + }, + LinkTo: + { + text: function(configDef, ruleConfig, configEl) + { + this._getParamDef(configDef, "createRecordPath").displayLabel = this.msg("fileTo.createRecordPath.label"); + this._getParamDef(configDef, "path").displayLabel = this.msg("fileTo.path.label"); + return configDef; + }, + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + + configDef.parameterDefinitions.splice(0, 0, + { + type: "arca:rm-destination-dialog-button", + _buttonLabel: this.msg("button.select-folder"), + _destinationParam: "destination-folder" + }); + + configDef.parameterDefinitions.splice(1, 0, + { + type: "arca:record-path-help-icon" + }); + + var path = this._getParamDef(configDef, "path"); + path._type = "hidden"; + path.displayLabel = this.msg("fileTo.path.label"), + path._displayLabelToRight = false; + path._hideColon = true; + + var createRecordPath = this._getParamDef(configDef, "createRecordPath"); + createRecordPath._type = null; + createRecordPath.displayLabel = this.msg("fileTo.createRecordPath.label"), + createRecordPath._displayLabelToRight = false; + createRecordPath._hideColon = true; + + return configDef; + } + }, + AddRecordTypes: + { + edit: function(configDef, ruleConfig, configEl) + { + this._hideParameters(configDef.parameterDefinitions); + configDef.parameterDefinitions.push({ + type: "arca:rm-add-record-types-dialog-button", + _buttonLabel: this.msg("button.addRecordTypes") + }); + return configDef; + } + } + }, + renderers: + { + "arca:reject-dialog-button": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + this._createButton(containerEl, configDef, paramDef, ruleConfig, function RCAC_rejectFormButton_onClick(type, obj) + { + this.renderers["arca:reject-dialog-button"].currentCtx = + { + configDef: obj.configDef, + ruleConfig: obj.ruleConfig + }; + Alfresco.util.PopupManager.getUserInput( + { + title: this.msg("message.reject.title"), + text: this.msg("message.reject.reason"), + okButtonText: this.msg("button.ok"), + value: this._getParameters(obj.configDef).reason || "", + callback: + { + fn: function RCAC_rejectOKButton_callback(value) + { + var ctx = this.renderers["arca:reject-dialog-button"].currentCtx; + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "reason", value); + this._updateSubmitElements(ctx.configDef); + }, + scope: this + } + }); + }); + } + }, + "arca:requestInfo-dialog-button": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + this._createButton(containerEl, configDef, paramDef, ruleConfig, function RCAC_requestInfoFormButton_onClick(type, obj) + { + this.renderers["arca:requestInfo-dialog-button"].currentCtx = + { + configDef: obj.configDef, + ruleConfig: obj.ruleConfig + }; + + // Intercept before dialog show and change the button type and the onClick functionality + // And also hide the div for showing the record information + var doBeforeDialogShow = function DLTB_requestInfo_doBeforeDialogShow(p_form, p_dialog) + { + var recordInfo_div = p_dialog.dialog.form.children[0].children[0], + assignees = Dom.get(p_dialog.id + "_assoc_rmwf_mixedAssignees"), + requestedInfo = Dom.get(p_dialog.id + "_prop_rmwf_requestedInformation"); + + recordInfo_div.style.display = "none"; + assignees.value = this._getParameters(obj.configDef).assignees || ""; + requestedInfo.value = this._getParameters(obj.configDef).requestedInfo || ""; + + // Change the button type and functionality + var okButton = p_dialog.widgets.okButton; + okButton._configs.type.value = "push"; + okButton.on('click', function(type, args) + { + var ctx = this.renderers["arca:requestInfo-dialog-button"].currentCtx; + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "assignees", assignees.value); + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "requestedInfo", requestedInfo.value); + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "ruleCreator", Alfresco.constants.USERNAME); + this._updateSubmitElements(ctx.configDef); + + // Hide dialog + args.hide(); + }, requestInfo, this); + }; + + var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&mode={mode}&submitType={submitType}&showCancelButton=true", + { + htmlid: this.id + "-startWorkflowForm-" + Alfresco.util.generateDomId(), + itemKind: "workflow", + itemId: "activiti$activitiRequestForInformation", + mode: "create", + submitType: "json", + showCaption: true, + formUI: true, + showCancelButton: true + }); + + // Using Forms Service, so always create new instance + var requestInfo = new Alfresco.module.SimpleDialog(this.id + "-request-info"); + + requestInfo.setOptions( + { + width: "auto", + templateUrl: templateUrl, + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + } + }).show(); + }); + } + }, + "arca:rm-destination-dialog-button": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + var unfiledParameter = Alfresco.util.getQueryStringParameter("unfiled"); + var unfiled = (configDef.name != "fileTo") && (unfiledParameter == "true"); + var mode; + switch(configDef.name) + { + case "moveTo": mode = "move"; break; + case "copyTo": mode = "copy"; break; + case "linkTo": mode = "link"; break; + default: mode = "file"; break; + } + if (this.widgets.destinationDialog) + { + this.widgets.destinationDialog.setOptions( + { + unfiled: unfiled + }); + } + var selectedPath = ruleConfig.parameterValues && ruleConfig.parameterValues.path; + this._createButton(containerEl, configDef, paramDef, ruleConfig, function RCA_destinationDialogButton_onClick(type, obj) + { + this.renderers["arca:rm-destination-dialog-button"].currentCtx = + { + configDef: obj.configDef, + ruleConfig: obj.ruleConfig, + paramDef: obj.paramDef + }; + this.widgets.destinationDialog = new Alfresco.rm.module.CopyMoveLinkFileTo(this.id + "-destinationDialog"); + this.widgets.destinationDialog.setOptions( + { + title: this.msg("dialog.destination.title"), + mode: mode, + files: "", + siteId: this.options.siteId, + path: selectedPath, + unfiled: unfiled + }); + + YAHOO.Bubbling.on("folderSelected", function (layer, args) + { + if ($hasEventInterest(this.widgets.destinationDialog, args)) + { + var selectedFolder = args[1].selectedFolder; + if (selectedFolder !== null) + { + var ctx = this.renderers["arca:rm-destination-dialog-button"].currentCtx; + var path = selectedFolder.path; + if(unfiled) + { + if((path.match(/\//g)||[]).length < 2) + { + path = '/'; + } + else + { + path = path.replace(/^\/.*?\//, '/'); + } + } + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "path", path); + Dom.get(this.id + "-recordFolderPath").value = path; + this._updateSubmitElements(ctx.configDef); + this.widgets.destinationDialog.setOptions({ + path: selectedFolder.path + }); + } + } + }, this); + var pathNodeRef = this._getParameters(obj.configDef)["destination-folder"], + allowedViewModes = + [ + Alfresco.module.DoclibGlobalFolder.VIEW_MODE_SITE + ]; + + if (this.options.repositoryBrowsing === true) + { + allowedViewModes.push(Alfresco.module.DoclibGlobalFolder.VIEW_MODE_REPOSITORY, Alfresco.module.DoclibGlobalFolder.VIEW_MODE_USERHOME); + } + this.widgets.destinationDialog.setOptions( + { + allowedViewModes: allowedViewModes, + nodeRef: this.options.rootNode, + pathNodeRef: pathNodeRef ? new Alfresco.util.NodeRef(pathNodeRef) : null + }); + + this.widgets.destinationDialog.onOK = function() + { + YAHOO.Bubbling.fire("folderSelected", + { + selectedFolder: this.selectedNode ? this.selectedNode.data : null, + eventGroup: this + }); + this.widgets.dialog.hide(); + } + + var me = this; + this.widgets.destinationDialog._showDialog = function() + { + this.widgets.okButton.set("label", me.msg("button.ok")); + return Alfresco.rm.module.CopyMoveLinkFileTo.superclass._showDialog.apply(this, arguments); + } + + this.widgets.destinationDialog.showDialog(); + }); + this._createLabel(this._getParamDef(configDef, "path").displayLabel, containerEl); + var el = document.createElement("input"); + el.setAttribute("type", "text"); + el.setAttribute("name", "-"); + el.setAttribute("title", paramDef.displayLabel ? paramDef.displayLabel : paramDef.name); + el.setAttribute("param", paramDef.name); + el.setAttribute("value", (selectedPath != undefined && selectedPath != null) ? selectedPath : ""); + el.setAttribute("id", this.id + "-recordFolderPath"); + el.addEventListener("blur", function() + { + Selector.query("[param=" + "path" + "]")[0].value = this.value; + }, false); + + containerEl.appendChild(el); + + // create an autocomplete div which will get populated with the drop down containing + // the autocomplete suggestions + var autoCompleteDiv = document.createElement("div"); + containerEl.appendChild(autoCompleteDiv); + var dataSource = new YAHOO.util.XHRDataSource(Alfresco.constants.PROXY_URI + "api/rm/rm-substitutionsuggestions"); + dataSource.responseType = YAHOO.util.XHRDataSource.TYPE_JSON; + dataSource.responseSchema = + { + resultsList : "substitutions" + }; + + // create the auto complete widget. + var autoComp = new YAHOO.widget.AutoComplete(el, autoCompleteDiv, dataSource); + // sanity check as server should limit number of results based on configuration + autoComp.maxResultsDisplayed = 30; + + // fix any css applied by creating the autocomplete widget and tweak a couple of other styles + YUIDom.setStyle(autoCompleteDiv, "width", "500px"); + YUIDom.setStyle(el, "position", "relative"); + YUIDom.setStyle(el, "width", "500px"); + + // format the items in the autosuggest list + var me = this; + autoComp.formatResult = function(oResultData, sQuery, sResultMatch) { + var prefix = ""; + var postfix = ""; + var message = ""; + if(sResultMatch.indexOf("/") == 0) + { + message = + "" + + sResultMatch + + ""; + } + else if(sResultMatch.indexOf("node.") == 0) + { + message = me.msg("file-to.substitution." + sResultMatch.replace(/:/g,'.') + ".label"); + message = + "" + + (message.indexOf("file-to.substitution.") != -1 ? " {" + sResultMatch + "}" : message + " {" + sResultMatch + "}") + + ""; + } + else + { + message = me.msg("file-to.substitution." + sResultMatch + ".label"); + message = + "" + + (message.indexOf("file-to.substitution.") != -1 ? " {" + sResultMatch + "}" : message + " {" + sResultMatch + "}") + + ""; + } + return message; + }; + + // work in both directions from the cursor to get the current fragment to send to the + // substitution suggestions api + autoComp.generateRequest = function(sQuery) + { + Selector.query("[param=" + "path" + "]")[0].value = el.value; + var fragmentDetails = getAutoCompleteFragment(el.value, getCursorPosition(el)); + autoCompleteSelectPreFragment = fragmentDetails[0]; + var fragment = fragmentDetails[1]; + autoCompleteSelectPostFragment = fragmentDetails[2]; + var parameterString = "?fragment=" + fragment.replace(/ /g,'+') + "&path="; + if((autoCompleteSelectPreFragment.indexOf("{") == -1) && (autoCompleteSelectPreFragment.indexOf("}") == -1)) + { + parameterString += autoCompleteSelectPreFragment.replace(/ /g,'+'); + } + parameterString += "&unfiled=" + unfiled; + parameterString = Alfresco.util.encodeURIPath(parameterString); + return parameterString; + } + + // handle the autocomplete selection handler so we place the suggestion in the + // current path value at the correct place rather than the default behaviour + // of overwriting the whole thing + var itemSelectHandler = function(sType, aArgs) + { + var oData = aArgs[2]; + var selectedValue = oData[0]; + var path = autoCompleteSelectPreFragment; + if(selectedValue.indexOf("/") == 0) + { + if((autoCompleteSelectPreFragment.length > 0) && (autoCompleteSelectPreFragment.charAt(autoCompleteSelectPreFragment.length - 1) == "/")) + { + path += selectedValue.substring(1); + } + else + { + path += selectedValue; + } + } + else + { + if(!((autoCompleteSelectPreFragment.length > 0) && (autoCompleteSelectPreFragment.charAt(autoCompleteSelectPreFragment.length - 1) == "{"))) + { + path += "{"; + } + path += selectedValue; + if(!((autoCompleteSelectPostFragment.length > 0) && (autoCompleteSelectPostFragment.charAt(0) == "}"))) + { + path += "}"; + } + } + path += autoCompleteSelectPostFragment; + el.value = path; + }; + autoComp.itemSelectEvent.subscribe(itemSelectHandler); + + function getCursorPosition(textField) + { + if(!textField) return; + if('selectionStart' in textField) + { + return textField.selectionStart; + } + else if(document.selection) + { + // IE8 + input.focus(); + var sel = document.selection.createRange(); + var selLen = document.selection.createRange().text.length; + sel.moveStart('character', -input.value.length); + return sel.text.length - selLen; + } + } + + // get the auto complete fragment from the whole path by traveling in both directions + // from the cursor position looking for curly braces and path separators + function getAutoCompleteFragment(fullPathText, cursorPosition) + { + var fragment = fullPathText; + var preFragment = ""; + var postFragment = ""; + if(cursorPosition != undefined) + { + var preCursorText = fullPathText.substring(0, cursorPosition); + var postCursorText = fullPathText.substring(cursorPosition); + var lastPathDelim = preCursorText.lastIndexOf('/'); + var lastStartSubstitutionDelim = preCursorText.lastIndexOf('{'); + var lastEndSubstitutionDelim = preCursorText.lastIndexOf('}'); + var startFragment = Math.max(lastPathDelim, lastStartSubstitutionDelim, lastEndSubstitutionDelim); + var firstPathDelim = postCursorText.indexOf('/'); + var firstStartSubstitutionDelim = postCursorText.indexOf('{'); + var firstEndSubstitutionDelim = postCursorText.indexOf('}'); + var endFragment = Math.min( + firstPathDelim == -1 ? Number.MAX_VALUE : firstPathDelim, + firstStartSubstitutionDelim == -1 ? Number.MAX_VALUE : firstStartSubstitutionDelim, + firstEndSubstitutionDelim == -1 ? Number.MAX_VALUE : firstEndSubstitutionDelim + ); + preFragment = preCursorText.substring(0, startFragment + 1); + fragment = preCursorText.substring(startFragment + 1) + (endFragment == -1 ? postCursorText : postCursorText.substring(0, endFragment)); + postFragment = postCursorText.substring(endFragment); + } + return [preFragment, fragment, postFragment]; + } + } + }, + "arca:rm-add-record-types-dialog-button": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + this._createButton(containerEl, configDef, paramDef, ruleConfig, function RCAC_addRecordTypesFormButton_onClick(type, obj) + { + this.renderers["arca:rm-add-record-types-dialog-button"].currentCtx = + { + configDef: obj.configDef, + ruleConfig: obj.ruleConfig + }; + + var me = this; + + // Intercept before dialog show and change the button type and the onClick functionality + var doBeforeDialogShow = function DLTB_requestInfo_doBeforeDialogShow(p_form, p_dialog) + { + var selectedTypes = me._getParameters(obj.configDef).recordTypes; + if (selectedTypes) + { + selectedTypes = selectedTypes.split(','); + var types = Dom.get(this.id + "-addRecordMetadataDialog-recordType"); + + for (var i = 0; i < types.length; i++) + { + if (Alfresco.util.arrayContains(selectedTypes, types[i].value)) + { + types[i].selected = true; + } + } + } + + // Change the button type and functionality + var okButton = p_dialog.widgets.okButton; + okButton._configs.type.value = "push"; + okButton.on('click', function(type, args) + { + var ctx = this.renderers["arca:rm-add-record-types-dialog-button"].currentCtx, + selectedRecordTypes = [], + recordTypes = Dom.get(this.id + "-addRecordMetadataDialog-recordType"); + + for (var i = 0; i < recordTypes.length; i++) + { + if (recordTypes[i].selected) + { + selectedRecordTypes.push(recordTypes[i].value); + } + } + + this._setHiddenParameter(ctx.configDef, ctx.ruleConfig, "recordTypes", selectedRecordTypes.join(',')); + this._updateSubmitElements(ctx.configDef); + + // Hide dialog + args.hide(); + }, addRecordMetadataDialog, this); + }; + + // Open the set record type dialog + var addRecordMetadataDialog = new Alfresco.module.SimpleDialog(this.id + "-addRecordMetadataDialog").setOptions( + { + width: "30em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/add-record-metadata", + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + } + }); + addRecordMetadataDialog.show(); + }); + } + }, + "arca:record-path-help-icon": + { + manual: { edit: true }, + currentCtx: {}, + edit: function (containerEl, configDef, paramDef, ruleConfig, value) + { + var me = this, + image = document.createElement("img"); + image.src = Alfresco.constants.URL_CONTEXT + "res/components/form/images/help.png"; + image.title = this.msg("record.folder.path.title"); + image.onclick = function() + { + var balloon = Alfresco.util.createInfoBalloon(this, { + html: me.msg("record.folder.path.help"), + width: "25em" + }); + balloon.show(); + }; + + var helpIcon = document.createElement("span"); + helpIcon.setAttribute('class', 'help-icon'); + helpIcon.appendChild(image); + containerEl.appendChild(helpIcon); + } + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-details.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-details.js new file mode 100644 index 0000000000..504ec699e0 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-details.js @@ -0,0 +1,82 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Rm RuleDetails component. + * + * @namespace Alfresco + * @class Alfresco.RuleDetails + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $siteURL = Alfresco.util.siteURL; + + /** + * RuleDetails constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.RuleDetails} The new RuleDetails instance + * @constructor + */ + Alfresco.rm.RuleDetails = function RM_RuleDetails_constructor(htmlId) + { + Alfresco.rm.RuleDetails.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.RuleDetails, Alfresco.RuleDetails, + { + /** + * Fired when the user clicks the Edit button. + * Takes the user back to the edit rule page. + * + * @method onEditButtonClick + * @param event {object} a "click" event + */ + onEditButtonClick: function RM_RuleDetails_onEditButtonClick(event) + { + // Disable buttons to avoid double submits or cancel during post + this.widgets.editButton.set("disabled", true); + + // Send the user to edit rule page + var unfiled = Alfresco.util.getQueryStringParameter("unfiled"); + if(unfiled != "true") + { + unfiled = "false"; + } + window.location.href = $siteURL("rule-edit?nodeRef={nodeRef}&ruleId={ruleId}&unfiled=" + unfiled, + { + nodeRef: Alfresco.util.NodeRef(this.options.nodeRef).toString(), + ruleId: this.ruleDetails.id.toString() + }); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-edit.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-edit.js new file mode 100644 index 0000000000..8e8db5a18d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rule-edit.js @@ -0,0 +1,75 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Rm RuleEdit component. + * + * @namespace Alfresco + * @class Alfresco.RuleEdit + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $siteURL = Alfresco.util.siteURL; + + /** + * RuleEdit constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.RuleEdit} The new RuleEdit instance + * @constructor + */ + Alfresco.rm.RuleEdit = function RM_RuleEdit_constructor(htmlId) + { + Alfresco.rm.RuleEdit.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.RuleEdit, Alfresco.RuleEdit, + { + /** + * Navigate to the main folder rules page + * + * @method _navigateToFoldersPage + * @private + */ + _navigateToFoldersPage: function RE__navigateToFoldersPage() + { + var unfiled = Alfresco.util.getQueryStringParameter("unfiled"); + if(unfiled != "true") + { + unfiled = "false"; + } + window.location.href = $siteURL("folder-rules?nodeRef={nodeRef}&unfiled=" + unfiled, + { + nodeRef: Alfresco.util.NodeRef(this.options.nodeRef).toString() + }); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-header.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-header.js new file mode 100644 index 0000000000..48038b2797 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-header.js @@ -0,0 +1,97 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM RulesHeader template. + * + * Overrides the _displayDetails method so that the file plan label can be shown when creating a rule for the file plan + * + * @namespace Alfresco.rm + * @class Alfresco.rm.RulesHeader + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $siteURL = Alfresco.util.siteURL; + + /** + * RM RulesHeader constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.RulesHeader} The new RM RulesHeader instance + * @constructor + */ + Alfresco.rm.RulesHeader = function RM_RulesHeader_constructor(htmlId) + { + Alfresco.rm.RulesHeader.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.RulesHeader, Alfresco.RulesHeader, + { + /** + * Overrides the _displayDetails method from the base class + * + * @method _displayDetails + */ + _displayDetails: function RM_RulesHeader__displayDetails() + { + if (this.isReady && this.folderDetails) + { + Alfresco.rm.RulesHeader.superclass._displayDetails.call(this); + if ($html(this.folderDetails.fileName) == "") + { + // Display file name + this.widgets.titleEl.innerHTML = $html(this.msg("path.fileplan")); + } + } + }, + + /** + * Overrides the _displayDetails method from the base class + * + * @method onNewRuleButtonClick + * @param type + * @param args + */ + onNewRuleButtonClick: function RulesHeader_onNewRuleButtonClick(type, args) + { + var unfiled = Alfresco.util.getQueryStringParameter("unfiled"); + if(unfiled != "true") + { + unfiled = "false"; + } + window.location.href = $siteURL("rule-edit?nodeRef={nodeRef}&unfiled=" + unfiled, + { + nodeRef: Alfresco.util.NodeRef(this.options.nodeRef).toString() + }); + }, + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-linked.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-linked.js new file mode 100644 index 0000000000..b722453db3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-linked.js @@ -0,0 +1,95 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM RulesLinked template. + * + * @namespace Alfresco.rm.module + * @class Alfresco.rm.module.RulesLinked + */ +(function() +{ + /** + * YUI Library aliases + */ + var $siteURL = Alfresco.util.siteURL; + + /** + * RM RulesLinked constructor. + * + * @param htmlId {string} A unique id for this component + * @return {Alfresco.rm.module.RulesLinked} The new rm rules linked instance + * @constructor + */ + Alfresco.rm.module.RulesLinked = function RM_RulesLinked_constructor(htmlId) + { + Alfresco.rm.module.RulesLinked.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.module.RulesLinked, Alfresco.RulesLinked, + { + /** + * Called when user clicks on the change link from button. + * Displays a rule folder dialog. + * + * @method onChangeLinkButtonClick + * @param type + * @param args + */ + onChangeLinkButtonClick: function RulesLinked_onChangeLinkButtonClick(type, args) + { + if (!this.modules.rulesPicker) + { + this.modules.rulesPicker = new Alfresco.rm.module.RulesPicker(this.id + "-rulesPicker"); + } + + Alfresco.rm.module.RulesLinked.superclass.onChangeLinkButtonClick.call(this, type, args); + }, + + /** + * Displays the corresponding details page for the current folder + * + * @method _navigateForward + * @private + */ + _navigateForward: function RM_RulesLinked__navigateForward() + { + /* Did we come from the document library? If so, then direct the user back there */ + if (document.referrer.match(/documentlibrary([?]|$)/) || document.referrer.match(/repository([?]|$)/)) + { + // go back to the referrer page + history.go(-1); + } + else + { + // go forward to the appropriate details page for the node + window.location.href = $siteURL("rm-record-folder-details?nodeRef=" + this.options.nodeRef.toString()); + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-none.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-none.js new file mode 100644 index 0000000000..2bc99570ca --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-none.js @@ -0,0 +1,68 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM RulesNone component. + * + * @namespace Alfresco.rm + * @class Alfresco.rm.RulesNone + */ +(function() +{ + /** + * Alfresco.rm.RulesNone constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.RulesNone} The new RM RulesNone instance + * @constructor + */ + Alfresco.rm.RulesNone = function(htmlId) + { + Alfresco.rm.RulesNone.superclass.constructor.call(this, htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.RulesNone, Alfresco.RulesNone, + { + /** + * Called when user clicks on the link to rules set link. + * + * @method onLinkToRuleSetClick + * @param event + * @param obj + */ + onLinkToRuleSetClick: function RM_RulesNone_onLinkToRuleSetClick(event, obj) + { + if (!this.modules.rulesPicker) + { + this.modules.rulesPicker = new Alfresco.rm.module.RulesPicker(this.id + "-rulesPicker"); + } + + Alfresco.rm.RulesNone.superclass.onLinkToRuleSetClick.call(this, event, obj); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-picker.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-picker.js new file mode 100644 index 0000000000..d555f150d1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/rules/rules-picker.js @@ -0,0 +1,72 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM Rules Picker. + * + * Extends the rule picker module from core to hide some panels from rules picker dialog + * + * @namespace Alfresco.rm.module + * @class Alfresco.rm.module.RulesPicker + */ +(function() +{ + /** + * RM Rules Picker module constructor. + * + * @param containerId {string} A unique id for this component + * @return {Alfresco.rm.module.RulesPicker} The new rm rules picker instance + * @constructor + */ + Alfresco.rm.module.RulesPicker = function RM_RulesPicker_constructor(containerId) + { + Alfresco.rm.module.RulesPicker.superclass.constructor.call(this, containerId); + return this; + }; + + YAHOO.extend(Alfresco.rm.module.RulesPicker, Alfresco.module.RulesPicker, + { + /** + * Internal show dialog function + * + * @method _showDialog + * @override + */ + _showDialog: function RM_RulesPicker__showDialog() + { + Dom.getPreviousSibling(this.id + "-modeGroup").setAttribute("style", "display:none;"); + Dom.getPreviousSibling(this.id + "-sitePicker").setAttribute("style", "display:none;"); + Dom.get(this.id + "-modeGroup").setAttribute("style", "display:none;"); + Dom.get(this.id + "-sitePicker").setAttribute("style", "display:none;"); + Dom.get(this.id + "-treeview").setAttribute("style", "width: 19.5em !important;"); + Dom.get(this.id + "-dialog").setAttribute("style", "width:31.5em; min-width:31.5em;"); + Dom.get(this.id + "-dialog").setAttribute("style", "visibility:inherit;"); + + Alfresco.rm.module.RulesPicker.superclass._showDialog.call(this); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/images/collapsed.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/images/collapsed.png new file mode 100644 index 0000000000..b5110d209c Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/images/collapsed.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/images/expanded.png b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/images/expanded.png new file mode 100644 index 0000000000..09ee8dad94 Binary files /dev/null and b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/images/expanded.png differ diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/options.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/options.css new file mode 100644 index 0000000000..7c1426a79d --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/options.css @@ -0,0 +1,62 @@ +.rm-options +{ + width: 80em; +} + +.rm-options .metadata +{ + border: 1px solid #AAAAAA; + background-color: #FFFFFF; + line-height: 1.5em; + padding: 6px 6px 4px 8px; + height: 12.5em; + min-width: 20em; + overflow-y: auto; + overflow-x: hidden; +} + +.rm-options .metadata-header +{ + border-bottom: 1px solid lightgrey; + font-weight: bold; + margin-bottom: 4px; +} + +.rm-options label +{ + padding-left: 4px; + vertical-align: 5%; +} + +.rm-options .sortlabel +{ + vertical-align: 15%; +} + +.rm-options .separator +{ + background: transparent url(images/collapsed.png) no-repeat 4px 8px; + cursor: pointer; +} + +.rm-options .options +{ + margin-left: 20px; + margin-right: 8px; + display: block; +} + +.rm-options .options-hidden +{ + display: none; +} + +.rm-options .components +{ + line-height: 1.75em; +} + +.rm-options .indented +{ + margin-left: 20px; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/results.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/results.css new file mode 100644 index 0000000000..8b177a2233 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/results.css @@ -0,0 +1,34 @@ +.rm-results +{ + margin: 4px 0px; +} + +.rm-results .yui-dt table +{ + border: 1px solid #C0C0C0; +} + +/* +.rm-results td.yui-dt-asc, +.rm-results td.yui-dt-desc +{ + background-color: #ffffff !important; +} +*/ + +.rm-results tr.yui-dt-odd +{ + cursor: auto; + background-color: #f0f0f0 !important; +} + +.rm-results tr.yui-dt-even +{ + cursor: auto; + background-color: #ffffff !important; +} + +.rm-results img +{ + vertical-align: -20%; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/results.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/results.js new file mode 100644 index 0000000000..054e8cf042 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/search/results.js @@ -0,0 +1,757 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Records results common code component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.Results + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Search constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.Results} The new RecordsSearch instance + * @constructor + */ + Alfresco.rm.component.Results = function(htmlId) + { + /* Mandatory properties */ + this.id = htmlId; + + this.sortby = [{"field": "rma:identifier", "order": "asc"}, {"field": "", "order": "asc"}, {"field": "", "order": "asc"}]; + + YAHOO.Bubbling.on("dataTableHeaderCheckboxChange", this.onDataTableHeaderCheckboxChange, this); + YAHOO.Bubbling.on("dataTableCheckboxChange", this.onDataTableCheckboxChange, this); + + return this; + }; + + Alfresco.rm.component.Results.prototype = + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * siteId to search in. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * Custom property groups + * + * @property groups + * @type Array + */ + groups: [], + + /** + * Saved searches + * + * @property savedSearches + * @type Array + */ + savedSearches: [] + }, + + /** + * Object container for storing YUI widget instances. + * + * @property widgets + * @type object + */ + widgets: {}, + + /** + * Object container for storing module instances. + * + * @property modules + * @type object + */ + modules: {}, + + /** + * Number of search results. + * + * @property resultsCount + * @type number + */ + resultsCount: 0, + + /** + * Array of NodeRef strings from the search results. + * + * @property resultNodeRefs + * @type Array + */ + resultNodeRefs: [], + + /** + * Array of sort descriptor objects. See constructor above for example object structure. + * + * @property sortby + * @type Array + */ + sortby: null, + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + * @return {Alfresco.rm.component.Results} returns 'this' for method chaining + */ + setOptions: function RecordsResults_setOptions(obj) + { + this.options = YAHOO.lang.merge(this.options, obj); + return this; + }, + + /** + * Set messages for this component. + * + * @method setMessages + * @param obj {object} Object literal specifying a set of messages + * @return {Alfresco.rm.component.Results} returns 'this' for method chaining + */ + setMessages: function RecordsResults_setMessages(obj) + { + Alfresco.util.addMessages(obj, this.name); + return this; + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RecordsResults_onReady() + { + var me = this; + + // Sorting option menus + this.widgets.sortMenus = []; + this.widgets.sortOrderMenus = []; + this._setupSortControls(3); + + // Column hide/show meta-data options + var onMetadataClick = function onMetadataClick(e) + { + var el = Event.getTarget(e); + var columnKey = el.id.substring(el.id.lastIndexOf('-') + 1); + var col = me.widgets.dataTable.getColumn(columnKey) + if (col) + { + if (col.hidden) + { + me.widgets.dataTable.showColumn(col); + } + else + { + me.widgets.dataTable.hideColumn(col); + } + } + }; + + var elAcceptor = function(el) + { + return (el.id.indexOf("-metadata-") != -1); + }; + + var elVisitor = function(el) + { + Event.on(el, "click", onMetadataClick); + }; + + // Apply meta-data field event handlers via element visitor pattern + Dom.getElementsBy(elAcceptor, "input", Dom.get(this.id + "-metadata"), elVisitor); + + var onResultOptionsClick = function onResultOptionsClick(e) + { + var elToggle = Dom.get(me.id + "-options-toggle"); + var el = Dom.get(me.id + "-options"); + if (el.style.display === "block") + { + el.style.display = "none"; + Dom.setStyle(elToggle, "background-image", "url(" + Alfresco.constants.URL_RESCONTEXT + "components/images/collapsed.png)"); + } + else + { + el.style.display = "block"; + Dom.setStyle(elToggle, "background-image", "url(" + Alfresco.constants.URL_RESCONTEXT + "components/images/expanded.png)"); + } + }; + + // Click handler for result options + Event.on(Dom.get(this.id + "-options-toggle"), "click", onResultOptionsClick); + // Initial image background css + Dom.setStyle(this.id + "-options-toggle", "url(" + Alfresco.constants.URL_RESCONTEXT + "components/images/expanded.png)"); + + // add the well known fields + var fields = + [ + "nodeRef", "type", "name", "title", "description", "modifiedOn", "modifiedByUser", "modifiedBy", + "createdOn", "createdByUser", "createdBy", "author", "size", "browseUrl", "parentFolder", + "properties.rma_identifier", "properties.rma_dateFiled", "properties.rma_location", + "properties.rmc_supplementalMarkingList", "properties.sc_classificationSearch", + "properties.rma_recordCategoryIdentifier", "properties.sc_securityMarksSearch", "properties.rma_reviewAsOf", + "properties.rma_recordSearchDispositionEvents", "properties.rma_recordSearchHasDispositionSchedule", + "properties.rma_recordSearchDispositionActionName", "properties.rma_recordSearchDispositionActionAsOf", + "properties.rma_recordSearchDispositionInstructions", "properties.rma_recordSearchDispositionAuthority", + "properties.rma_recordSearchDispositionPeriod", "properties.rma_recordSearchDispositionEventsEligible", + "properties.rma_recordSearchVitalRecordReviewPeriod" + ]; + + // add the custom groups of properties + for (var l=0, k=this.options.groups.length; l' + name + '
'; + }; + + /** + * Vital Record indicator custom datacell formatter + * + * @method renderCellVitalRecord + */ + var renderCellVitalRecord = function RecordsResults_renderCellVitalRecord(elCell, oRecord, oColumn, oData) + { + var reviewDate = oRecord.getData("properties.rma_reviewAsOf"); + if (reviewDate) + { + // found a vital record - is it due for review? + var html; + if (Alfresco.util.fromISO8601(reviewDate) < new Date()) + { + var imageUrl = Alfresco.constants.URL_RESCONTEXT + 'rm/components/documentlibrary/images/warning-16.png'; + var review = $html(me._msg("label.dueForReview")); + html = '' + $html(me._msg("label.yes")) + ' ' + review + ''; + } + else + { + html = '' + $html(me._msg("label.yes")) + ''; + } + elCell.innerHTML = html; + } + }; + + /** + * URI custom datacell formatter + * + * @method renderCellURI + */ + var renderCellURI = function RecordsResults_renderCellURI(elCell, oRecord, oColumn, oData) + { + Dom.setStyle(elCell.parentNode, "white-space", "nowrap"); + var url = me._getBrowseUrlForRecord(oRecord); + elCell.innerHTML = '' + $html(oRecord.getData("properties.rma_identifier")) + ''; + }; + + /** + * Date custom datacell formatter + * + * @method renderCellDate + */ + var renderCellDate = function RecordsResults_renderCellDate(elCell, oRecord, oColumn, oData) + { + if (oData) + { + elCell.innerHTML = Alfresco.util.formatDate(Alfresco.util.fromISO8601(oData)); + } + }; + + /** + * Generic HTML-safe custom datacell formatter + */ + var renderCellSafeHTML = function renderCellSafeHTML(elCell, oRecord, oColumn, oData) + { + elCell.innerHTML = $html(oData); + }; + + /** + * URI custom datacell sorter + */ + var sortCellURI = function sortCellURI(a, b, desc) + { + // identifier format is: YYYY-NNNNNNNNNN where Y=4 digit year and N=zero padded DBID + var sa = a.getData("properties.rma_identifier"); + var sb = b.getData("properties.rma_identifier"); + var numA = parseInt(sa.substring(0, 4) + sa.substring(5)), + numB = parseInt(sb.substring(0, 4) + sb.substring(5)); + + if (desc) + { + return (numA < numB ? 1 : (numA > numB ? -1 : 0)); + } + return (numA < numB ? -1 : (numA > numB ? 1 : 0)); + }; + + /** + * Vital Record custom datacell sorter + */ + var sortCellVitalRecord = function sortCellVitalRecord(a, b, desc) + { + var sa = null; + var sb = null; + if (a.getData("properties.rma_reviewAsOf")) + { + sa = Alfresco.util.fromISO8601(a.getData("properties.rma_reviewAsOf")); + } + if (b.getData("properties.rma_reviewAsOf")) + { + sb = Alfresco.util.fromISO8601(b.getData("properties.rma_reviewAsOf")); + } + if (sa === null && sb === null) return 0; + if (desc) + { + if (sa === null) return -1; + if (sb === null) return 1; + return (sa < sb ? 1 : (sa > sb ? -1 : 0)); + } + if (sa === null) return 1; + if (sb === null) return -1; + return (sa < sb ? -1 : (sa > sb ? 1 : 0)); + }; + + // DataTable column definitions + var columnDefinitions = + [ + { key: "check", label: "", sortable: false, formatter: "checkbox" }, + { key: "currentClassification", label: me._msg("label.currentClassification"), field: "properties.sc_classificationSearch", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "image", label: me._msg("label.type"), field: "type", sortable: true, formatter: renderCellImage, width: "64px" }, + { key: "identifier", label: me._msg("label.identifier"), sortable: true, sortOptions: {sortFunction: sortCellURI}, resizeable: true, formatter: renderCellURI }, + + { key: "name", label: me._msg("label.name"), field: "name", sortable: true, resizeable: true, formatter: renderCellSafeHTML }, + { key: "title", label: me._msg("label.title"), field: "title", sortable: true, resizeable: true, formatter: renderCellSafeHTML }, + { key: "description", label: me._msg("label.description"), field: "description", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "parentFolder", label: me._msg("label.parentFolder"), field: "parentFolder", sortable: true, resizeable: true, formatter: renderCellSafeHTML }, + { key: "creator", label: me._msg("label.creator"), field: "createdBy", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "created", label: me._msg("label.created"), field: "createdOn", sortable: true, resizeable: true, formatter: renderCellDate, hidden: true }, + { key: "modifier", label: me._msg("label.modifier"), field: "modifiedBy", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "modified", label: me._msg("label.modified"), field: "modifiedOn", sortable: true, resizeable: true, formatter: renderCellDate }, + { key: "author", label: me._msg("label.author"), field: "author", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + + { key: "dateFiled", label: me._msg("label.dateFiled"), field: "properties.rma_dateFiled", sortable: true, resizeable: true, formatter: renderCellDate }, + { key: "reviewDate", label: me._msg("label.reviewDate"), field: "properties.rma_reviewAsOf", sortable: true, resizeable: true, formatter: renderCellDate, hidden: true }, + { key: "vitalRecord", label: me._msg("label.vitalRecord"), sortable: true, sortOptions: {sortFunction: sortCellVitalRecord}, resizeable: false, formatter: renderCellVitalRecord }, + { key: "location", label: me._msg("label.location"), field: "properties.rma_location", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "supplementalMarkingList", label: me._msg("label.supplementalMarkingList"), field: "properties.rmc_supplementalMarkingList", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "recordCategoryIdentifier", label: me._msg("label.recordCategoryIdentifier"), field: "properties.rma_recordCategoryIdentifier", resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "securityMarksSearch", label: me._msg("label.securityMarks"), field: "properties.sc_securityMarksSearch", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + + { key: "dispositionEvents", label: me._msg("label.dispositionEvents"), field: "properties.rma_recordSearchDispositionEvents", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "dispositionActionName", label: me._msg("label.dispositionActionName"), field: "properties.rma_recordSearchDispositionActionName", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "dispositionActionAsOf", label: me._msg("label.dispositionActionAsOf"), field: "properties.rma_recordSearchDispositionActionAsOf", sortable: true, resizeable: true, formatter: renderCellDate, hidden: true }, + { key: "dispositionEventsEligible", label: me._msg("label.dispositionEventsEligible"), field: "properties.rma_recordSearchDispositionEventsEligible", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "dispositionPeriod", label: me._msg("label.dispositionPeriod"), field: "properties.rma_recordSearchDispositionPeriod", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "hasDispositionSchedule", label: me._msg("label.hasDispositionSchedule"), field: "properties.rma_recordSearchHasDispositionSchedule", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "dispositionInstructions", label: me._msg("label.dispositionInstructions"), field: "properties.rma_recordSearchDispositionInstructions", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "dispositionAuthority", label: me._msg("label.dispositionAuthority"), field: "properties.rma_recordSearchDispositionAuthority", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true }, + { key: "vitalRecordReviewPeriod", label: me._msg("label.vitalRecordReviewPeriod"), field: "properties.rma_recordSearchVitalRecordReviewPeriod", sortable: true, resizeable: true, formatter: renderCellSafeHTML, hidden: true } + ]; + + // add the custom groups of properties + for (var l=0, k=this.options.groups.length; l. + * #L% + */ + +/** + * Records Search component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.Search + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Search constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.Search} The new RecordsSearch instance + * @constructor + */ + Alfresco.rm.component.Search = function(htmlId) + { + /* Mandatory properties */ + this.name = "Alfresco.rm.component.Search"; + + /* Super class constructor call */ + Alfresco.rm.component.Search.superclass.constructor.call(this, htmlId); + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "calendar", "container", "datasource", "datatable", "json", "menu", "tabview"], this.onComponentsLoaded, this); + + YAHOO.Bubbling.on("savedSearchAdded", this.onSavedSearchAdded, this); + YAHOO.Bubbling.on("searchComplete", this.onSearchComplete, this); + YAHOO.Bubbling.on("PropertyMenuSelected", this.onPropertyMenuSelected, this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.Search, Alfresco.rm.component.Results, + { + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function RecordsSearch_onComponentsLoaded() + { + Event.onContentReady(this.id, this.onReady, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RecordsSearch_onReady() + { + var me = this; + + // Wire up tab component + this.widgets.tabs = new YAHOO.widget.TabView(this.id + "-tabs"); + + // Buttons + this.widgets.searchButton = Alfresco.util.createYUIButton(this, "search-button", this.onSearchClick); + this.widgets.saveButton = Alfresco.util.createYUIButton(this, "savesearch-button", this.onSaveSearch); + this.widgets.deleteButton = Alfresco.util.createYUIButton(this, "deletesearch-button", this.onDeleteSearch, + { + disabled: true + }); + this.widgets.newButton = Alfresco.util.createYUIButton(this, "newsearch-button", this.onNewSearch); + var btnDisabled = { disabled: true }; + this.widgets.addToHold = Alfresco.util.createYUIButton(this, "add-to-hold-button", this.onAddToHold, btnDisabled); + this.widgets.printButton = Alfresco.util.createYUIButton(this, "print-button", this.onPrint, btnDisabled); + this.widgets.exportButton = Alfresco.util.createYUIButton(this, "export-button", this.onExport, btnDisabled); + + // retrieve the public saved searches + // TODO: user specific searches? + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "slingshot/rmsavedsearches/site/" + this.options.siteId, + successCallback: + { + fn: this.onSavedSearchesLoaded, + scope: this + }, + failureMessage: me._msg("message.errorloadsearches") + }); + + // construct the date picker calendar + var theDate = new Date(); + var page = (theDate.getMonth() + 1) + "/" + theDate.getFullYear(); + var selected = (theDate.getMonth() + 1) + "/" + theDate.getDate() + "/" + theDate.getFullYear(); + this.widgets.calendar = new YAHOO.widget.Calendar(null, this.id + "-date", { title: this._msg("message.selectdate"), close: true }); + this.widgets.calendar.cfg.setProperty("pagedate", page); + this.widgets.calendar.cfg.setProperty("selected", selected); + + // setup date picker events + this.widgets.calendar.selectEvent.subscribe(this.onDatePickerSelection, this, true); + Event.addListener(this.id + "-date-icon", "click", function () { this.widgets.calendar.show(); }, this, true); + + // render the calendar control + this.widgets.calendar.render(); + + // wire up misc events + Event.on(me.id + "-records", "change", this.onRecordsCheckChanged, this, true); + + // Call super class onReady() method + Alfresco.rm.component.Search.superclass.onReady.call(this); + }, + + /** + * BUBBLING LIBRARY EVENT HANDLERS FOR PAGE EVENTS + * Disconnected event handlers for inter-component event notification + */ + + /** + * Handles the date being changed in the date picker YUI control. + * + * @method onDatePickerSelection + * @param type + * @param args + * @param obj + * @private + */ + onDatePickerSelection: function RecordsSearch_onDatePickerSelection(type, args, obj) + { + // update the date field - contains an array of [year, month, day] + var selected = args[0][0]; + this.widgets.calendar.hide(); + + // convert to query date format and insert + var date = YAHOO.lang.substitute('"{year}-{month}-{day}"', + { + year: selected[0], + month: Alfresco.util.pad(selected[1], 2), + day: Alfresco.util.pad(selected[2], 2) + }); + Alfresco.util.insertAtCursor(Dom.get(this.id + "-terms"), date); + }, + + /** + * Saved Searches AJAX success callback + * + * @method onSavedSearchesLoaded + * @param res {object} Server response + */ + onSavedSearchesLoaded: function RecordsSearch_onSavedSearchesLoaded(res) + { + var me = this; + + var searches = this.options.savedSearches, + items = YAHOO.lang.JSON.parse(res.serverResponse.responseText).items, + index; + + for (index in items) + { + if (items.hasOwnProperty(index)) + { + s = items[index]; + searches.push( + { + id: s.name, + label: s.name, + description: s.description, + query: s.query, + params: s.params, + sort: s.sort + }); + } + } + + this._initSavedSearchMenu(); + }, + + /** + * Records checkbox change event handler + * + * @method onRecordsCheckChanged + * @param e {object} DomEvent + */ + onRecordsCheckChanged: function RecordsSearch_onRecordsCheckChanged(e) + { + var disable = !(Dom.get(this.id + "-records").checked); + Dom.get(this.id + "-undeclared").disabled = disable; + Dom.get(this.id + "-vital").disabled = disable; + }, + + /** + * Search button click event handler + * + * @method onSearchClick + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onSearchClick: function RecordsSearch_onSearchClick(e, args) + { + // switch to results tab + this._clearSearchResults(); + this.widgets.tabs.selectTab(1); + + // execute the search and populate the results + var query = this._getSearchQuery(); + if (query != null) + { + var filters = this._getSearchFilters(); + this._performSearch(query, filters); + } + }, + + /** + * Save Search button click event handler + * + * @method onSaveSearch + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onSaveSearch: function RecordsSearch_onSaveSearch(e, args) + { + // get values to pass to the module + var query = this._getSearchQuery(); + if (query != null) + { + // build up params to pass to the module + // query terms + var termsElem = Dom.get(this.id + "-terms"); + var terms = YAHOO.lang.trim(termsElem.value); + var params = "terms=" + encodeURIComponent(terms); + // search components + params += "&records=" + (Dom.get(this.id + "-records").checked); + params += "&undeclared=" + (Dom.get(this.id + "-undeclared").checked); + params += "&vital=" + (Dom.get(this.id + "-vital").checked); + params += "&folders=" + (Dom.get(this.id + "-folders").checked); + params += "&categories=" + (Dom.get(this.id + "-categories").checked); + params += "&frozen=" + (Dom.get(this.id + "-frozen").checked); + params += "&cutoff=" + (Dom.get(this.id + "-cutoff").checked); + + // TODO: prepopulate dialog with current saved search name if any selected + + // display the SaveSearch module dialog + var module = Alfresco.module.getSaveSearchInstance(); + module.setOptions( + { + siteId: this.options.siteId, + query: query, + params: params, + sort: this._buildSortParam() + }); + module.show(); + } + }, + + /** + * Delete Search button click event handler + * + * @method onDeleteSearch + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onDeleteSearch: function RecordsSearch_onDeleteSearch(e, args) + { + var name = this.widgets.savedSearchMenu.get("label"), + me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this._msg("message.deletesearch.title"), + text: this._msg("message.deletesearch.description", $html(name)), + buttons: [ + { + text: this._msg("button.remove"), + handler: function RecordsSearch__onDeleteSearch_delete() + { + this.destroy(); + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI + "slingshot/rmsavedsearches/site/" + me.options.siteId + "/" + encodeURIComponent(name), + successCallback: + { + fn: function() + { + for (var i = 0, il = me.options.savedSearches.length; i < il; i++) + { + if (me.options.savedSearches[i].label === name) + { + // Remove old search + me.options.savedSearches.splice(i, 1); + break; + } + } + // reset the ui + me._initSavedSearchMenu(); + me._resetUI(); + } + }, + successMessage: me._msg("message.deletesearch.success"), + failureMessage: me._msg("message.deletesearch.failure") + }); + } + }, + { + text: this._msg("button.cancel"), + handler: function CMU__onRemoveUserClick_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + Event.stopEvent(e); + }, + + /** + * New Search button click event handler + * + * @method onNewSearch + * @param e {object} DomEvent + * @param args {array} Event parameters (depends on event type) + */ + onNewSearch: function RecordsSearch_onNewSearch(e, args) + { + this._resetUI(); + }, + + /** + * Prepares ui for new search input + * + * @method _resetUI + */ + _resetUI: function RecordsSearch__resetUI() + { + // reset fields and clear values + if (this.widgets.savedSearchMenu) + { + this.widgets.savedSearchMenu.set("label", this._msg("button.savedsearches")); + } + + // Disable delete button + this.widgets.deleteButton.set("disabled", true); + + Dom.get(this.id + "-records").checked = true; + Dom.get(this.id + "-undeclared").disabled = false; + Dom.get(this.id + "-vital").disabled = false; + Dom.get(this.id + "-undeclared").checked = false; + Dom.get(this.id + "-vital").checked = false; + Dom.get(this.id + "-folders").checked = true; + Dom.get(this.id + "-categories").checked = false; + Dom.get(this.id + "-frozen").checked = false; + Dom.get(this.id + "-cutoff").checked = false; + Dom.get(this.id + "-terms").value = ""; + + // reset sorting options + for (var i=0, j=this.widgets.sortMenus.length; i ss2) ? 1 : (ss1 < ss2) ? -1 : 0; + }, + + /** + * Gets a custom message + * + * @method _msg + * @param messageId {string} The messageId to retrieve + * @return {string} The custom message + * @private + */ + _msg: function RecordsSearch__msg(messageId) + { + return Alfresco.util.message.call(this, messageId, "Alfresco.rm.component.Search", Array.prototype.slice.call(arguments).slice(1)); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/dnd-upload.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/dnd-upload.js new file mode 100644 index 0000000000..4a195e44ea --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/dnd-upload.js @@ -0,0 +1,99 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RMDnDUpload component. + * + * @namespace Alfresco + * @class Alfresco.rm.component.DNDUpload + * @extends Alfresco.DNDUpload + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + KeyListener = YAHOO.util.KeyListener; + + /** + * RMDnDUpload constructor. + * + * RMDnDUpload is considered a singleton so constructor should be treated as private, + * please use Alfresco.getRecordsHtmlUploadInstance() instead. + * + * @param htmlId {String} The HTML id of the parent element + * @return {Alfresco.rm.component.DNDUpload} The new RMDnDUpload instance + * @constructor + * @private + */ + Alfresco.rm.component.DNDUpload = function(htmlId) + { + Alfresco.rm.component.DNDUpload.superclass.constructor.call(this, htmlId); + + this.name = "Alfresco.rm.component.DNDUpload"; + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.DNDUpload, Alfresco.DNDUpload, + { + /** + * Shows uploader in single import mode. + * + * @property MODE_SINGLE_IMPORT + * @static + * @type int + */ + MODE_SINGLE_IMPORT: 4, + + /** + * Overrides the _applyConfig from the base class to adjust the gui. + * + * @method _applyConfig + * @override + */ + _applyConfig: function RMDnDUpload__applyConfig() + { + // Call super class that does the main part of the config attributes + Alfresco.rm.component.DNDUpload.superclass._applyConfig.call(this); + + // Change the panel header text and the button label + if (this.showConfig.mode === this.MODE_SINGLE_IMPORT) + { + this.titleText.innerHTML = this.msg("header.import"); + this.widgets.fileSelectionOverlayButton.set("label", this.msg("button.selectImportFile")); + } + else + { + this.titleText.innerHTML = this.msg("header.multiUpload"); + this.widgets.fileSelectionOverlayButton.set("label", this.msg("button.selectFiles")); + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/file-upload.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/file-upload.js new file mode 100644 index 0000000000..9cc1418b23 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/file-upload.js @@ -0,0 +1,128 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Records FileUpload component. + * + * Checks if Flash is installed or not and uses either the RecordsFlashUpload or + * RecordsHtmlUpload component. + * + * A multi file upload scenario could look like: + * + * var fileUpload = Alfresco.getRecordsFileUploadInstance(); + * var multiUploadConfig = + * { + * siteId: siteId, + * containerId: doclibContainerId, + * path: docLibUploadPath, + * filter: [], + * mode: fileUpload.MODE_MULTI_UPLOAD, + * } + * this.fileUpload.show(multiUploadConfig); + * + * If flash is installed it would use the RecordsFlashUpload component in multi upload mode + * If flash isn't installed it would use the RecordsHtmlUpload in single upload mode instead. + * + * @namespace Alfresco.component + * @class Alfresco.rm.component.FileUpload + * @extends Alfresco.FileUpload + */ +(function() +{ + /** + * RecordsFileUpload constructor. + * + * RecordsFileUpload is considered a singleton so constructor should be treated as private, + * please use Alfresco.getRecordsFileUploadInstance() instead. + * + * @param {string} htmlId The HTML id of the parent element + * @return {Alfresco.RecordsFileUpload} The new RecordsFileUpload instance + * @constructor + * @private + */ + Alfresco.RecordsFileUpload = function(instanceId) + { + var instance = Alfresco.util.ComponentManager.get(instanceId); + if (instance !== null) + { + throw new Error("An instance of Alfresco.RecordsFileUpload already exists."); + } + + Alfresco.RecordsFileUpload.superclass.constructor.call(this, instanceId); + this.name = "Alfresco.RecordsFileUpload"; + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.RecordsFileUpload, Alfresco.FileUpload, + { + /** + * Shows uploader in single import mode. + * + * @property MODE_SINGLE_IMPORT + * @static + * @type int + */ + MODE_SINGLE_IMPORT: 4, + + /** + * The default config for the gui state for the uploader. + * The user can override these properties in the show() method to use the + * uploader for both single & multi uploads and single updates. + * + * @property defaultShowConfig + * @type object + */ + defaultShowConfig: + { + siteId: null, + containerId: null, + destination: null, + uploadDirectory: null, + updateNodeRef: null, + updateFilename: null, + mode: this.MODE_SINGLE_UPLOAD, + filter: [], + onFileUploadComplete: null, + overwrite: false, + thumbnails: null, + htmlUploadURL: null, + flashUploadURL: null, + username: null, + importDestination: null, + htmlImportURL: null, + flashImportURL: null + } + }); +})(); + +Alfresco.getRecordsFileUploadInstance = function() +{ + var instanceId = "alfresco-recordsfileupload-instance"; + return Alfresco.util.ComponentManager.get(instanceId) || new Alfresco.RecordsFileUpload(instanceId); +}; diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/flash-upload.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/flash-upload.css new file mode 100644 index 0000000000..4f3d843fed --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/flash-upload.css @@ -0,0 +1,296 @@ +/* Style YUI components */ + +.flash-upload.hidden, +.flash-upload .hidden +{ + display: none; +} + +/* Center text and buttons inside p elements */ + +.flash-upload p +{ + text-align: center; +} + +.flash-upload div.recordTypes br +{ + margin: 1px; +} + +.flash-upload div.browse-wrapper +{ + text-align: center; +} + +.flash-upload div.browse-wrapper div.center +{ + padding-top: 0.5em; + line-height: 2em; + margin-left: auto; + margin-right: auto; + width: 18em; +} + +.flash-upload div.browse-wrapper div.browse, +.flash-upload div.browse-wrapper div.label +{ + float: left; +} + +.flash-upload div.tip-wrapper +{ + padding-top: 0.5em; + line-height: 2em; + text-align: center; + clear: both; +} + +.flash-upload div.status-wrapper +{ + padding-bottom: 0.5em; + text-align: center; +} + +.flash-upload .browse, +.flash-upload .tip +{ + float: left; +} + +.flash-upload .browse +{ + width: 38px; + height: 26px; + margin-left: 10px; + margin-right: 10px; +} + +.flash-upload .browse.button-fix +{ + width: 39px; +} + +.flash-upload .tip +{ + height: 40px; + line-height: 40px; +} + +.flash-upload div.section span.status +{ + margin-left: 210px; +} + +/* Add som padding to the file list so it looks centered */ + +.yui-skin-default .yui-panel .bd .fileUpload-filelist-table +{ + padding: 0.8em; +} + +/* Remove the padding inherited from the panel for divs in the file list */ + +.yui-skin-default .yui-panel .bd .fileUpload-filelist-table div.yui-dt-hd +{ + height: 0; + padding: 0; +} + +.yui-skin-default .yui-panel .bd .fileUpload-filelist-table tbody.yui-dt-message td +{ + border: none; +} + +.yui-skin-default .yui-panel .bd .fileUpload-filelist-table tbody.yui-dt-message tr td div.yui-dt-empty +{ + border: none; + padding: 0.5em !important; +} + +/* Create a visible gray line beneath each row */ + +.fileUpload-filelist-table tbody .yui-dt-liner +{ + border-bottom-style: solid; + border-bottom-color: #CBCBCB; + border-bottom-width: 1px; + margin: 0; + padding: 0; + white-space: nowrap; +} + +/* Width of the file list - needs to override YUI element style setting */ + +.fileUpload-filelist-table .yui-dt table +{ + width: 620px !important; +} + +/* Hide the table header */ + +.fileUpload-filelist-table .yui-dt table thead +{ + display: none; +} + +/** + * If an element with "position: relative;" is used inside + * another element with "overflow: scroll;" IE takes the inner element "out of + * the flow" which makes statically positioned on the screen ignoring to be + * hidden and following the scrollbar. + * + * In this component, position relative is used for the progress bars, but + * a YUI button is also used which causes the same problem. + * + * If the outer element also has "position: relative;" it works though. + */ + +.fileUpload-filelist-table .yui-dt-bd +{ + position: relative; + width: 620px; + overflow-x: hidden; +} + +/* Style left column and its elements */ + +.fileUpload-filelist-table tbody .col-left +{ + height: 40px; + width: 100px; +} + +.fileupload-left-div +{ + text-align: center; + height: 40px; + background-color: #FAF9F9; +} + +.fileupload-percentage-span +{ + font-weight: bold; + font-size: 123.1%; + line-height: 2.5em; +} + +.fileupload-contentType-menu +{ + position: relative; + top: 10px; +} + +/* Style center column and its elements */ + +.fileUpload-filelist-table tbody .col-center +{ + height: 40px; + width: 400px; +} + +.fileupload-center-div +{ + background-color: #FFFFFF; + position: relative; + height: 40px; + padding: 0px 0px 0px 0px; + margin: 0px; + overflow: hidden; +} + +.fileupload-docImage-img +{ + position: absolute; + left: 5px; + top: 4px; +} + +.fileupload-progressInfo-span +{ + position: absolute; + left: 40px; + top: 12px; + font-weight: bold; + font-size: 108%; +} + +.fileupload-center-div .fileupload-progressSuccess-span, +.fileupload-center-div .fileupload-progressFailure-span, +.fileupload-center-div .fileupload-progressFinished-span +{ + position: absolute; + top: 0px; + left: -400px; + height: 40px; + width: 400px; +} + +.fileupload-progressSuccess-span +{ + background-color: #9AC68C; +} + +.fileupload-progressFinished-span +{ + background-color: #DCECCC; +} + +.fileupload-progressFailure-span +{ + background-color: #E98B3C; +} + +/* Style right column and its elements */ + +.fileUpload-filelist-table tbody .col-right, +.fileUpload-filelist-table tbody .col-right div.fileupload-right-div +{ + height: 40px; + width: 130px; +} + +.fileupload-right-div +{ + text-align: center; + height: 40px; +} + +.fileUpload-filelist-table tbody .col-right +{ + background-color: #FAF9F9; + border-style: none; +} + +.fileupload-fileButton-span +{ + top: 7px; +} + +.flash-upload .fileupload-fileButton-span button +{ + padding-left: 2.5em; + background: url(../../../components/images/remove-16.png) 10% 50% no-repeat; +} + +.yui-skin-default .fileUpload-filelist-table.yui-dt.yui-dt-scrollable tbody.yui-dt-data tr.yui-dt-last td +{ + border-bottom: medium none; +} + +/* General styling */ + +.yui-panel-container .flash-upload +{ + width: 640px; +} + +.flash-upload .yui-gd div.first +{ + width: 10.5em; +} + +.flash-upload textarea +{ + width: 30em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/flash-upload.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/flash-upload.js new file mode 100644 index 0000000000..a9bba63ab3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/flash-upload.js @@ -0,0 +1,272 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RecordsFlashUpload component. + * + * Popups a YUI panel and displays a filelist and buttons to browse for files + * and upload them. Files can be removed and uploads can be cancelled. + * For single file uploads version input can be submitted. + * + * A multi file upload scenario could look like: + * + * var flashUpload = Alfresco.component.getRecordsFlashUploadInstance(); + * var multiUploadConfig = + * { + * siteId: siteId, + * containerId: doclibContainerId, + * path: docLibUploadPath, + * filter: [], + * mode: flashUpload.MODE_MULTI_UPLOAD, + * } + * this.flashUpload.show(multiUploadConfig); + * + * @namespace Alfresco.module + * @class Alfresco.rm.component.FlashUpload + * @extends Alfresco.FlashUpload + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * RecordsFlashUpload constructor. + * + * RecordsFlashUpload is considered a singleton so constructor should be treated as private, + * please use Alfresco.component.getRecordsFlashUploadInstance() instead. + * + * @param htmlId {String} The HTML id of the parent element + * @return {Alfresco.component.RecordsFlashUpload} The new RecordsFlashUpload instance + * @constructor + * @private + */ + Alfresco.rm.component.FlashUpload = function(htmlId) + { + Alfresco.rm.component.FlashUpload.superclass.constructor.call(this, htmlId); + + this.name = "Alfresco.rm.component.FlashUpload"; + this.defaultShowConfig.importDestination = null; + this.defaultShowConfig.importUrl = null; + + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.FlashUpload, Alfresco.FlashUpload, + { + /** + * Shows uploader in single import mode. + * + * @property MODE_SINGLE_IMPORT + * @static + * @type int + */ + MODE_SINGLE_IMPORT: 4, + + /** + * Fired by YUI when parent element is available for scripting. + * Initial History Manager event registration + * + * @method onReady + * @override + */ + onReady: function RecordsFlashUpload_onReady() + { + Alfresco.rm.component.FlashUpload.superclass.onReady.call(this); + + var recordTypesContainer = Dom.get(this.id + "-recordTypes-select-container"); + this.widgets.recordTypes = []; + if (recordTypesContainer) + { + var kids = Selector.filter(Dom.getChildren(recordTypesContainer), "span"); + + for (var i = 0, ii = kids.length; i < ii; i++) + { + this.widgets.recordTypes.push(new YAHOO.widget.Button(kids[i], + { + type: "checkbox" + })); + } + } + + // Save a reference to the HTMLElement displaying recordTypeSection input so we can hide or show it + this.widgets.recordTypeSection = Dom.get(this.id + "-recordTypeSection-div"); + }, + + /** + * Disables Flash uploader if an error is detected. + * Possibly a temporary workaround for bugs in SWFObject v1.5 + * + * @method _disableFlashUploader + * @override + */ + _disableFlashUploader: function FlashUpload__disableFlashUploader() + { + var fileUpload = Alfresco.util.ComponentManager.findFirst("Alfresco.RecordsFileUpload"); + if (fileUpload) + { + fileUpload.hasRequiredFlashPlayer = false; + } + return fileUpload; + }, + + /** + * Adjust the gui according to the config passed into the show method. + * + * @method _applyConfig + * @private + * @override + */ + _applyConfig: function RecordsFlashUpload__applyConfig() + { + Alfresco.rm.component.FlashUpload.superclass._applyConfig.call(this); + + // Set the panel title + if (this.showConfig.mode === this.MODE_SINGLE_IMPORT) + { + this.titleText.innerHTML = this.msg("header.singleImport"); + } + + if (this.showConfig.mode === this.MODE_SINGLE_IMPORT) + { + // Hide the record type form + Dom.addClass(this.widgets.recordTypeSection, "hidden"); + } + else + { + // Display the record type form + Dom.removeClass(this.widgets.recordTypeSection, "hidden"); + } + }, + + /** + * Starts to upload as many files as specified by noOfUploadsToStart + * as long as there are files left to upload. + * + * @method _uploadFromQueue + * @param noOfUploadsToStart + * @private + * @override + */ + _uploadFromQueue: function RecordsFlashUpload__uploadFromQueue(noOfUploadsToStart) + { + // Generate upload POST url + var url = Alfresco.constants.PROXY_URI, + fileParamName; + + if (this.showConfig.mode === this.MODE_SINGLE_IMPORT) + { + url += (this.showConfig.importURL) ? this.showConfig.importURL : "api/rma/admin/import"; + fileParamName = "archive"; + } + else + { + url += (this.showConfig.uploadURL) ? this.showConfig.uploadURL : "api/upload"; + fileParamName = "filedata"; + } + + // Flash does not correctly bind to the session cookies during POST + // so we manually patch the jsessionid directly onto the URL instead + url += ";jsessionid=" + YAHOO.util.Cookie.get("JSESSIONID") + "?lang=" + Alfresco.constants.JS_LOCALE; + + // Pass the CSRF token if the CSRF token filter is enabled + if (Alfresco.util.CSRFPolicy.isFilterEnabled()) + { + url += "&" + Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken()); + } + + // Find files to upload + var startedUploads = 0, + length = this.widgets.dataTable.getRecordSet().getLength(), + record, flashId, fileInfo, attributes, contentType, aspects = [], + recordType; + + // Record Types + for (var i = 0, ii = this.widgets.recordTypes.length; i < ii; i++) + { + recordType = this.widgets.recordTypes[i]; + if (recordType.get("checked")) + { + aspects.push(recordType.get("value")) + } + } + + for (var i = 0; i < length && startedUploads < noOfUploadsToStart; i++) + { + record = this.widgets.dataTable.getRecordSet().getRecord(i); + flashId = record.getData("id"); + fileInfo = this.fileStore[flashId]; + if (fileInfo.state === this.STATE_BROWSING) + { + // Upload has NOT been started for this file, start it now + fileInfo.state = this.STATE_UPLOADING; + if (this.showConfig.mode === this.MODE_SINGLE_IMPORT) + { + attributes = + { + destination: this.showConfig.importDestination, + username: this.showConfig.username + }; + } + else + { + attributes = + { + siteId: this.showConfig.siteId, + containerId: this.showConfig.containerId, + username: this.showConfig.username + }; + if (this.showConfig.mode === this.MODE_SINGLE_UPDATE) + { + attributes.updateNodeRef = this.showConfig.updateNodeRef; + attributes.majorVersion = !this.minorVersion.checked; + attributes.description = this.description.value; + } + else + { + attributes.uploadDirectory = this.showConfig.uploadDirectory; + attributes.contentType = fileInfo.contentType.options[fileInfo.contentType.selectedIndex].value; + attributes.aspects = aspects.join(","); + attributes.overwrite = this.showConfig.overwrite; + attributes.destination = this.showConfig.destination; + if (this.showConfig.thumbnails) + { + attributes.thumbnails = this.showConfig.thumbnails; + } + } + } + this.uploader.upload(flashId, url, "POST", attributes, fileParamName); + startedUploads++; + } + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/html-upload.css b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/html-upload.css new file mode 100644 index 0000000000..d97a468c26 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/html-upload.css @@ -0,0 +1,34 @@ +/* Style YUI components */ +.html-upload.hidden, +.html-upload .hidden +{ + display: none; +} + +/* Center text and buttons inside p elements */ +.html-upload p +{ + text-align: center; +} + +.html-upload div.recordTypes br +{ + margin: 1px; +} + +/* General styling */ + +.yui-panel-container .html-upload +{ + width: 440px; +} + +.html-upload .yui-gd div.first +{ + width: 10.5em; +} + +.html-upload textarea +{ + width: 20em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/html-upload.js b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/html-upload.js new file mode 100644 index 0000000000..1d6a388777 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/components/upload/html-upload.js @@ -0,0 +1,208 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RecordsHtmlUpload component. + * + * Popups a YUI panel and displays a filelist and buttons to browse for files + * and upload them. Files can be removed and uploads can be cancelled. + * For single file uploads version input can be submitted. + * + * A multi file upload scenario could look like: + * + * var htmlUpload = Alfresco.getRecordsRecordsHtmlUploadInstance(); + * var multiUploadConfig = + * { + * siteId: siteId, * containerId: doclibContainerId, + * path: docLibUploadPath, + * filter: [], + * mode: htmlUpload.MODE_MULTI_UPLOAD, + * } + * this.htmlUpload.show(multiUploadConfig); + * + * @namespace Alfresco + * @class Alfresco.rm.component.HtmlUpload + * @extends Alfresco.HtmlUpload + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + KeyListener = YAHOO.util.KeyListener; + + /** + * RecordsRecordsHtmlUpload constructor. + * + * RecordsHtmlUpload is considered a singleton so constructor should be treated as private, + * please use Alfresco.getRecordsHtmlUploadInstance() instead. + * + * @param htmlId {String} The HTML id of the parent element + * @return {Alfresco.rm.component.HtmlUpload} The new RecordsHtmlUpload instance + * @constructor + * @private + */ + Alfresco.rm.component.HtmlUpload = function(htmlId) + { + Alfresco.rm.component.HtmlUpload.superclass.constructor.call(this, htmlId); + + this.name = "Alfresco.rm.component.HtmlUpload"; + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.component.HtmlUpload, Alfresco.HtmlUpload, + { + /** + * Shows uploader in single import mode. + * + * @property MODE_SINGLE_IMPORT + * @static + * @type int + */ + MODE_SINGLE_IMPORT: 4, + + /** + * Fired by YUI when parent element is available for scripting. + * Initial History Manager event registration + * + * @method onReady + */ + onReady: function RecordsHtmlUpload_onReady() + { + var recordTypesContainer = Dom.get(this.id + "-recordTypes-select-container"); + this.widgets.recordTypes = []; + if (recordTypesContainer) + { + var kids = Selector.filter(Dom.getChildren(recordTypesContainer), "span"), + btn; + + for (var i = 0, ii = kids.length; i < ii; i++) + { + btn = new YAHOO.widget.Button(kids[i], + { + type: "checkbox" + }); + btn.addListener("checkedChange", this._populateAspectsField, null, this); + this.widgets.recordTypes.push(btn); + } + } + + // Save reference to html elements so we can modify them later + this.widgets.destination = Dom.get(this.id + "-destination-hidden"); + this.widgets.recordTypeSection = Dom.get(this.id + "-recordTypeSection-div"); + this.widgets.aspects = Dom.get(this.id + "-aspects-hidden"); + + // Call super class + Alfresco.rm.component.HtmlUpload.superclass.onReady.call(this); + }, + + /** + * Adjust the gui according to the config passed into the show method. + * + * @method _applyConfig + * @protected + */ + _applyConfig: function RecordsHtmlUpload__applyConfig() + { + // Call super class that does that applies the main part of the config attributes + Alfresco.rm.component.HtmlUpload.superclass._applyConfig.call(this); + + for (var i = 0, ii = this.widgets.recordTypes.length; i < ii; i++) + { + this.widgets.recordTypes[i].set("checked", false); + } + + if (this.showConfig.mode === this.MODE_SINGLE_IMPORT) + { + // Hide the record type form & flash tips + Dom.addClass(this.widgets.recordTypeSection, "hidden"); + Dom.addClass(this.widgets.singleUploadTip, "hidden"); + + // Set the panel title + this.widgets.titleText.innerHTML = this.msg("header.singleImport", this.name); + + // Set the forms action url + var formEl = Dom.get(this.id + "-htmlupload-form"); + if (!this.showConfig.importURL) + { + // The .html suffix is required - it is not possible to do a multipart post using an ajax call. + // So it has to be a FORM submit, to make it feel like an ajax call a a hidden iframe is used. + // Since the component still needs to be called when the upload is finished, the script returns + // an html template with SCRIPT tags inside that which calls the component that triggered it. + formEl.action = Alfresco.constants.PROXY_URI + "api/rma/admin/import.html"; + } + else + { + formEl.action = Alfresco.constants.PROXY_URI + this.showConfig.importURL; + } + // Set the file input name to match the import webscripts + this.widgets.filedata.setAttribute("name", "archive"); + + // Set the hidden parameters + this.widgets.destination.value = this.showConfig.importDestination; + } + else + { + // Display the record type form & flash tips + Dom.removeClass(this.widgets.recordTypeSection, "hidden"); + Dom.addClass(this.widgets.singleUploadTip, "hidden"); + // Only show the "Install Flash" message if Flash is enabled via config + if (this.showConfig.adobeFlashEnabled) + { + // Show the help label for single uploads + Dom.removeClass(this.widgets.singleUploadTip, "hidden"); + } + + // Set the file input name to match the upload webscripts + this.widgets.filedata.setAttribute("name", "filedata"); + } + }, + + /** + * Populate hidden "aspects" field from checked state of recordTypes controls + * + * @method _populateAspectsField + * @protected + */ + _populateAspectsField: function RecordsHtmlUpload__populateAspectsField() + { + var aspects = [], btn; + for (var i = 0, ii = this.widgets.recordTypes.length; i < ii; i++) + { + btn = this.widgets.recordTypes[i]; + if (btn.get("checked")) + { + aspects.push(btn.get("value")) + } + } + this.widgets.aspects.value = aspects.join(","); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/css/rm.css b/amps/ags/rm-community/rm-community-share/source/web/rm/css/rm.css new file mode 100644 index 0000000000..78ac425bb3 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/css/rm.css @@ -0,0 +1,17 @@ +/* RM-376 - ensure that calendar doesn't get lost off the end of forms + */ +.form-container .datepicker +{ + display: none; + position: relative; + float: right; + z-index: 1; + margin-left: 1.5em; +} + +/* RM-5794 - allow scrolling on yui select lists that are very slow + */ +.rm-audit .yuimenu .yui-menu-body-scrolled +{ + overflow: auto; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/js/alfresco-rm.js b/amps/ags/rm-community/rm-community-share/source/web/rm/js/alfresco-rm.js new file mode 100644 index 0000000000..6d1b2f2da5 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/js/alfresco-rm.js @@ -0,0 +1,182 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +/** + * Alfresco RM top-level namespaces. + */ +Alfresco.rm = Alfresco.rm || {}; +Alfresco.rm.component = Alfresco.rm.component || {}; +Alfresco.rm.module = Alfresco.rm.module || {}; +Alfresco.rm.template = Alfresco.rm.component.template || {}; +Alfresco.rm.doclib = Alfresco.rm.component.doclib || {}; + +/** + * Gets the value for the specified parameter from the URL + * + * @method getParamValueFromUrl + */ +Alfresco.rm.getParamValueFromUrl = function(param) +{ + var token, + result = null, + hash = window.location.hash, + params = hash.replace('#', '').split("&"); + for (var i = 0; i < params.length; i++) + { + token = params[i].split("="); + if (token[0] === param) + { + result = token[1]; + break; + } + } + return result; +}; + +/** + * Header check box click handler for a YUI data table. + * + * This functions expects that the check box column + * is the first column in the table and the table + * does not allow column dragging. + * + * If the header check box is ticked/unticked all check + * boxes in the same column will be ticked/unticked. + * + * @method dataTableHeaderCheckboxClick + */ +Alfresco.rm.dataTableHeaderCheckboxClick = function(oArgs) +{ + var key = this.getColumnSet().headers[0][0]; + if (this.getColumn(oArgs.target).key == key) + { + var rs = this.getRecordSet(), + checked = YAHOO.util.Event.getTarget(oArgs.event).checked; + for (var i = 0; i < rs.getLength(); i++) + { + if (checked !== undefined) + { + rs.getRecord(i).setData(key, checked); + this.getRow(i).cells[0].children[0].firstChild.checked = checked; + } + } + YAHOO.Bubbling.fire("dataTableHeaderCheckboxChange", + { + headerCheckBoxChecked: checked + }); + } +}; + +/** + * Cell check box click handler for a YUI data table. + * + * This functions expects that the check box column + * is the first column in the table and the table + * does not allow column dragging. + * + * If a check box in the column is ticked/unticked + * it will be check if all other check boxes have the + * same state. If they are all ticked/unticked the + * header checkbox will also be ticked/unticked. + * + * @method dataTableCheckboxClick + */ +Alfresco.rm.dataTableCheckboxClick = function(oArgs) +{ + var key = this.getColumnSet().headers[0][0], + target = oArgs.target, + column = this.getColumn(target); + if (column.key == key) + { + var checked = target.checked, + headerChecked = true, + atLeastOneChecked = false, + rs = this.getRecordSet(); + this.getRecord(target).setData(key, checked); + for (var i = 0; i < rs.getLength(); i++) + { + var checkedData = rs.getRecord(i).getData(key); + if (headerChecked && !checkedData) + { + headerChecked = false; + } + if (!atLeastOneChecked && checkedData) + { + atLeastOneChecked = true; + } + if (!headerChecked && atLeastOneChecked) + { + break; + } + } + column.getThLinerEl().children[0].firstChild.checked = headerChecked; + + YAHOO.Bubbling.fire("dataTableCheckboxChange", + { + checkBoxChecked: checked, + headerCheckBoxChecked: headerChecked, + atLeastOneChecked: atLeastOneChecked + }); + } +}; + +/** + * Gets the nodeRefs of selected items in a data table. + * This helper method is specific for a table with + * check box column, which has the key 'check'. + * + * @method dataTableSelectedItems + */ +Alfresco.rm.dataTableSelectedItems = function(dataTable) +{ + var records = dataTable.getRecordSet().getRecords(); + selectedHolds = []; + for (var i = 0; i < records.length; i++) + { + var record = records[i]; + if (record.getData('check')) + { + selectedHolds.push(record.getData('nodeRef')); + } + } + return selectedHolds; +}; + +/** + * Checks if the given site is an RM site by checking + * the preset attribute of the give site object + * + * @method isRMPreset + */ +Alfresco.rm.isRMSite = function(site) +{ + var isRMSite = false; + if (site && site.preset === "rm-site-dashboard") + { + isRMSite = true; + } + return isRMSite; +}; diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/js/event-delegator.js b/amps/ags/rm-community/rm-community-share/source/web/rm/js/event-delegator.js new file mode 100644 index 0000000000..d5adfd7485 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/js/event-delegator.js @@ -0,0 +1,143 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * This is meant to be used as an augmentation to Alfresco.component.Base. + * It allows events to be delegated to the root element of the component + * and passes events through to the correct event handler using CSS rules. + * + * Usage: + * Component must have an initEvents method which registers event handlers + * via registerEventHandler(). initEvents() must be called in component's + * onReady() method. + * Example call of registerEventHandler from with initEvents() : + * (2nd parameter can be an array of third parameters) + * this.registerEventHandler('click', 'button.editRef', + * { + * handler: function editReference(e, args) + * { + * console.log(arguments, '[editReference]'); + * }, + * scope : this + * }); + * + * or multiple handlers for the same event: + * + * this.registerEventHandler('click', + * [ + * { + * rule: 'button.editRef', + * o: + * { + * handler: function editReference(e,args) + * { + * alert('editReference'); + * }, + * scope : this + * } + * }, + * { + * rule: 'button.deleteRef', + * o: + * { + * handler: this.onDeleteReference, + * scope: this + * } + * } + * ]); + * + */ +(function Base_Component_Event_Delegator() +{ + /** + * YUI Library aliases + */ + var Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector; + + var eventDelegator = function(){}; + + eventDelegator.prototype = + { + /** + * Container for event handlers + */ + eventHandlers: {}, + + /** + * Registers an event handler against a specific CSS rule + * @method registerEventHandler + */ + registerEventHandler: function registerEventHandler(eventName, rule, o) + { + if ((!YAHOO.lang.isUndefined(rule)) && YAHOO.lang.isArray(rule)) + { + for (var i = 0, len = rule.length; i < len; i++) + { + this.registerEventHandler(eventName, rule[i].rule, rule[i].o); + } + return this; + } + this.eventHandlers[eventName] = this.eventHandlers[eventName] || {}; + this.eventHandlers[eventName][rule] = o; + return this; + }, + + /** + * Event delegation handler for any event type + * @method onInteractionEvent + */ + onInteractionEvent: function RM_References_onInteractionEvent(e, args) + { + // get element that triggered event + var elTarget = Event.getTarget(e), + eventName = e.type; + + // Event.preventDefault(e) + // Iterate through rules and execute handlers + if (this.eventHandlers[eventName]) + { + var rules = this.eventHandlers[eventName], + handlerObj; + for (var rule in rules) + { + if (Sel.test(elTarget, rule)) + { + handlerObj = rules[rule]; + if (handlerObj.handler && YAHOO.lang.isFunction(handlerObj.handler)) + { + return handlerObj.handler.apply(handlerObj.scope || window, arguments); + } + } + } + } + return this; + } + }; + + YAHOO.augment(Alfresco.component.Base, eventDelegator); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/js/property-menu.js b/amps/ags/rm-community/rm-community-share/source/web/rm/js/property-menu.js new file mode 100644 index 0000000000..52c155c112 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/js/property-menu.js @@ -0,0 +1,395 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM Property Selector Menu Component + * + * @namespace Alfresco + * @class Alfresco.rm.component.PropertyMenu + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * RMPropertyMenu constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.rm.component.PropertyMenu} The new component instance + * @constructor + */ + Alfresco.rm.component.PropertyMenu = function RMPropertyMenu_constructor(htmlId) + { + Alfresco.rm.component.PropertyMenu.superclass.constructor.call(this, "Alfresco.rm.component.PropertyMenu", htmlId, ["button", "container", "menu"]); + return this; + }; + + YAHOO.extend(Alfresco.rm.component.PropertyMenu, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Flag indicating whether to display enterprise-only features. + * + * @property isEnterprise + * @type boolean + */ + isEnterprise: false, + + /** + * Flag indicating whether search related fields are visible or not. + * + * @property showSearchFields + * @type boolean + */ + showSearchFields: false, + + /** + * Flag indicating whether special type related fields are visible or not. + * + * @property showSpecialTypeFields + * @type boolean + */ + showSpecialTypeFields: true, + + /** + * Flag indicating whether IMAP related fields are visible or not. + * + * @property showIMAPFields + * @type boolean + */ + showIMAPFields: false, + + /** + * Flag indicating whether Record Identifier field is visible or not. + * + * @property showIdentiferField + * @type boolean + */ + showIdentiferField: false, + + /** + * Flag indicating whether special 'All' field is visible or not. + * + * @property showAllField + * @type boolean + */ + showAllField: false, + + /** + * Flag passed to YUI menu constructor whether to wait for first display to render menu. + * + * @property lazyLoadMenu + * @type boolean + */ + lazyLoadMenu: true, + + /** + * Flag indicating whether the menu button should update the label to mirror the selected item text. + * + * @property updateButtonLabel + * @type boolean + */ + updateButtonLabel: true, + + /** + * Groups of custom properties + * + * @property group + * @type Array + */ + groups: [] + }, + + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function RMPropertyMenu_onReady() + { + var items = []; + + if (this.options.showSearchFields) + { + // add content fields + items.push( + { + text: this.msg("label.menu.content"), + submenu: + { + id: this.id + "_content", + itemdata: + [ + { text: this.msg("label.name"), value: "name" }, + { text: this.msg("label.title"), value: "title" }, + { text: this.msg("label.description"), value: "description" }, + { text: this.msg("label.creator"), value: "creator" }, + { text: this.msg("label.created"), value: "created" }, + { text: this.msg("label.modifier"), value: "modifier" }, + { text: this.msg("label.modified"), value: "modified" }, + { text: this.msg("label.author"), value: "author" } + ] + } + }); + + var recordFields = [ + { text: this.msg("label.dateFiled"), value: "rma:dateFiled" }, + { text: this.msg("label.reviewDate"), value: "rma:reviewAsOf" }, + { text: this.msg("label.location"), value: "rma:location" }, + { text: this.msg("label.supplementalMarkingList"), value: "markings" } + ]; + + if (this.options.isEnterprise) + { + recordFields.push( + { text: this.msg("label.currentClassification"), value: "sc:classificationSearch" }, + { text: this.msg("label.securityMarks"), value: "sc:securityMarksSearch" } + ); + } + + // add record fields + items.push( + { + text: this.msg("label.menu.records"), + submenu: + { + id: this.id + "_records", + itemdata: recordFields + } + }); + } + else + { + // add content fields + items.push( + { + text: this.msg("label.menu.content"), + submenu: + { + id: this.id + "_content", + itemdata: + [ + { text: this.msg("label.name"), value: "cm:name" }, + { text: this.msg("label.title"), value: "cm:title" }, + { text: this.msg("label.description"), value: "cm:description" }, + { text: this.msg("label.creator"), value: "cm:creator" }, + { text: this.msg("label.created"), value: "cm:created" }, + { text: this.msg("label.modifier"), value: "cm:modifier" }, + { text: this.msg("label.modified"), value: "cm:modified" }, + { text: this.msg("label.author"), value: "cm:author" } + ] + } + }); + + var recordFields = [ + { text: this.msg("label.dateFiled"), value: "rma:dateFiled" }, + { text: this.msg("label.reviewDate"), value: "rma:reviewAsOf" }, + { text: this.msg("label.location"), value: "rma:location" }, + { text: this.msg("label.supplementalMarkingList"), value: "markings" } + ]; + + if (this.options.isEnterprise) + { + recordFields.push( + { text: this.msg("label.currentClassification"), value: "sc:classificationSearch" }, + { text: this.msg("label.securityMarks"), value: "sc:securityMarksSearch" } + ); + } + + // add record fields + items.push( + { + text: this.msg("label.menu.records"), + submenu: + { + id: this.id + "_records", + itemdata: recordFields + } + }); + } + + if (this.options.showAllField) + { + items.splice(0, 0, + { + text: this.msg("label.all"), + value: "ALL" + }); + } + + if (this.options.showIdentiferField) + { + // insert RMA Identifer field + items[1].submenu.itemdata.splice(0, 0, + { + text: this.msg("label.identifier"), + value: "rma:identifier" + }); + } + + if (this.options.showSearchFields) + { + // insert KEYWORDS special search field + items[0].submenu.itemdata.splice(0, 0, + { + text: this.msg("label.keywords"), + value: "keywords" + }); + + // insert search roll-up special field menu + items.push( + { + text: this.msg("label.menu.disposition"), + submenu: + { + id: this.id + "_disposition", + itemdata: + [ + { text: this.msg("label.dispositionEvents"), value: "dispositionEvents" }, + { text: this.msg("label.dispositionActionName"), value: "dispositionActionName" }, + { text: this.msg("label.dispositionActionAsOf"), value: "dispositionActionAsOf" }, + { text: this.msg("label.dispositionEventsEligible"), value: "dispositionEventsEligible" }, + { text: this.msg("label.dispositionPeriod"), value: "dispositionPeriod" }, + { text: this.msg("label.hasDispositionSchedule"), value: "hasDispositionSchedule" }, + { text: this.msg("label.dispositionInstructions"), value: "dispositionInstructions" }, + { text: this.msg("label.dispositionAuthority"), value: "dispositionAuthority" }, + { text: this.msg("label.vitalRecordReviewPeriod"), value: "vitalRecordReviewPeriod" } + ] + } + }); + } + + if (this.options.showIMAPFields) + { + // insert IMAP field menu + items.push( + { + text: this.msg("label.menu.imap"), + submenu: + { + id: this.id + "_imap", + itemdata: + [ + { text: this.msg("label.imap.threadIndex"), value: "imap:threadIndex" }, + { text: this.msg("label.imap.messageFrom"), value: "imap:messageFrom" }, + { text: this.msg("label.imap.messageTo"), value: "imap:messageTo" }, + { text: this.msg("label.imap.messageCc"), value: "imap:messageCc" }, + { text: this.msg("label.imap.messageSubject"), value: "imap:messageSubject" }, + { text: this.msg("label.imap.dateReceived"), value: "imap:dateReceived" }, + { text: this.msg("label.imap.dateSent"), value: "imap:dateSent" } + ] + } + }); + } + + // Add groups of properties to the property menu + for (var i=0, j=this.options.groups.length; i. + * #L% + */ + +/** + * Mandatory validation handler, tests that the value of the given field has a certain length (min = 0 and max = 4000) + * + * @method maxTextLength + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @param silent {boolean} Determines whether the user should be informed upon failure + * @param message {string} Message to display when validation fails, maybe null + * @static + */ +Alfresco.forms.validation.maxTextLength = function maxTextLength(field, args, event, form, silent, message) +{ + var min = 0, + max = 4000, + length = YAHOO.lang.trim(field.value).length; + + if (length > max) + { + this.message = YAHOO.lang.substitute(Alfresco.messages.global["message.max.text.length.validation"], + { + max: max + }); + } + + return (length > min && length <= max) ? true : false; +}; diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/js/validation.js b/amps/ags/rm-community/rm-community-share/source/web/rm/js/validation.js new file mode 100644 index 0000000000..e5eb52b1c1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/js/validation.js @@ -0,0 +1,68 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Mandatory validation handler, tests that the given field has a value. + * + * @method mandatory + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @param silent {boolean} Determines whether the user should be informed upon failure + * @param message {string} Message to display when validation fails, maybe null + * @static + */ +Alfresco.forms.validation.rmVitalRecordPeriodMandatory = function rmVitalRecordPeriodMandatory(field, args, event, form, silent, message) +{ + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating mandatory state of vital record period '" + field.id + "'"); + + // if the vital record indicator checkbox is checked the period must + // be set to a valid period. + var form = YAHOO.util.Dom.get(form.formId); + var vitalRecordIndicator = form["prop_rma_vitalRecordIndicator"]; + if ((typeof vitalRecordIndicator !== undefined) && vitalRecordIndicator !== null) + { + if (vitalRecordIndicator.value === "true") + { + // if the vital record indicator is checked ensure that a value + // has been set and that "None" is not selected + var fieldValue = YAHOO.lang.trim(field.value); + var valid = (fieldValue.length !== 0) && (fieldValue !== "none") && (fieldValue !== "none|0"); + + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Checked vital record period value as vital record indicator is true, period value: " + valid); + + return valid; + } + } + + // if we get this far just do the normal mandatory check + return Alfresco.forms.validation.mandatory(field, args, event, form, silent, message); +}; + diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/create-site.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/create-site.js new file mode 100644 index 0000000000..6efc98227e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/create-site.js @@ -0,0 +1,205 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM CreateSite module + * + * Overrides/adds methods so that an RM site can be created from the create site dialog + * + * @namespace Alfresco.rm.module + * @class Alfresco.rm.module.CreateSite + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + KeyListener = YAHOO.util.KeyListener; + + /** + * RM CreateSite module constructor. + * + * @param containerId {string} A unique id for this component + * @return {Alfresco.rm.module.CreateSite} The new rm create site instance + * @constructor + */ + Alfresco.rm.module.CreateSite = function RM_CreateSite_constructor(containerId) + { + Alfresco.rm.module.CreateSite.superclass.constructor.call(this, containerId); + return this; + }; + + YAHOO.extend(Alfresco.rm.module.CreateSite, Alfresco.module.CreateSite, + { + /** + * Overrides the onTemplateLoaded from the base class. + * + * Called when the CreateSite html template has been returned from the server. + * Creates the YUI gui objects such as buttons and a panel and shows it. + * + * @method onTemplateLoaded + * @param response {object} An Alfresco.util.Ajax.request response object + */ + onTemplateLoaded: function RM_CreateSite_onTemplateLoaded(response) + { + Alfresco.rm.module.CreateSite.superclass.onTemplateLoaded.call(this, response); + Event.removeListener(this.widgets.panel.close, "click"); + Event.addListener(this.widgets.panel.close, "click", this.onCancelButtonClick, this, true); + }, + + /** + * Helper method to disable certain form elements like Name, URL Name and Visibility + * + * @method disableFormElements + */ + disableFormElements: function RM_CreateSite_disableFormElements() + { + Dom.get(this.id + "-title").disabled = true; + Dom.get(this.id + "-shortName").disabled = true; + Dom.get(this.id + "-isPrivate").disabled = true; + Dom.get(this.id + "-isModerated").disabled = true; + Dom.get(this.id + "-compliance-field").hidden = false; + }, + + /** + * Helper method to enable certain form elements like Name, URL Name and Visibility + * + * @method enableFormElements + */ + enableFormElements: function RM_CreateSite_enableFormElements() + { + Dom.get(this.id + "-title").disabled = false; + Dom.get(this.id + "-shortName").disabled = false; + Dom.get(this.id + "-isPrivate").disabled = false; + Dom.get(this.id + "-isModerated").disabled = false; + Dom.get(this.id + "-compliance-field").hidden = true; + }, + + /** + * Overrides the doBeforeSubmit from the base class + * + * @method doBeforeFormSubmit + * @param form {HTMLFormElement} The create site form + * @param obj {Object} Callback object + */ + doBeforeFormSubmit: function RM_CreateSite_doBeforeFormSubmit(form, obj) + { + var sitePresetEl = Dom.get(this.id + "-sitePreset"); + if (sitePresetEl.value === "rm-site-dashboard") + { + Dom.get(this.id + "-type").value = Dom.get(this.id + "-compliance").value; + } + else + { + Dom.get(this.id + "-type").value = "{http://www.alfresco.org/model/site/1.0}site"; + } + + Alfresco.rm.module.CreateSite.superclass.doBeforeFormSubmit.call(this, form, obj); + this.enableFormElements(); + }, + + /** + * Overrides the onCancelButtonClick from the base class + * + * @method onCancelButtonClick + * @param type + * @param args + */ + onCancelButtonClick: function RM_CreateSite_onCancelButtonClick(type, args) + { + Alfresco.rm.module.CreateSite.superclass.onCancelButtonClick.call(this, type, args); + this.enableFormElements(); + }, + + /** + * Overrides the onCreateSiteFailure from the base class + * + * @method onCreateSiteFailure + * @param response + */ + onCreateSiteFailure: function RM_CreateSite_onCreateSiteFailure(response) + { + Alfresco.rm.module.CreateSite.superclass.onCreateSiteFailure.call(this, response); + + var sitePresetEl = Dom.get(this.id + "-sitePreset"); + if (sitePresetEl.value === "rm-site-dashboard") + { + this.disableFormElements(); + } + else + { + this.enableFormElements(); + } + }, + + /** + * Called when a preset has been selected. + * + * @method onSitePresetChange + * @param sitePreset {string} Site preset + */ + onSitePresetChange: function RM_CreateSite_onSitePresetChange(sitePreset) + { + var input = Dom.get(this.id + "-type"); + if (!input) + { + input = document.createElement("input"); + input.setAttribute("type", "hidden"); + input.setAttribute("name", "type"); + input.setAttribute("id", this.id + "-type"); + Dom.get(this.id + "-form").appendChild(input); + } + + if (sitePreset === "rm-site-dashboard") + { + Dom.get(this.id + "-shortName").value = "rm"; + Dom.get(this.id + "-title").value = this.msg("title.recordsManagementSite"); + Dom.get(this.id + "-description").value = this.msg("description.recordsManagementSite"); + Dom.get(this.id + "-isPublic").checked = true; + Dom.get(this.id + "-isModerated").checked = false; + + this.disableFormElements(); + } + else + { + Dom.get(this.id + "-shortName").value = ""; + Dom.get(this.id + "-title").value = ""; + Dom.get(this.id + "-description").value = ""; + + this.enableFormElements(); + } + } + }); +})(); + +Alfresco.module.getCreateSiteInstance = function() +{ + var instanceId = "alfresco-rm-createSite-instance"; + return Alfresco.util.ComponentManager.get(instanceId) || new Alfresco.rm.module.CreateSite(instanceId); +}; diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/document-picker/object-renderer.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/document-picker/object-renderer.js new file mode 100644 index 0000000000..9f461fb8cc --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/document-picker/object-renderer.js @@ -0,0 +1,114 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RM_ObjectRenderer component + * + * Overrides certain methods so RM doc picker can display RM icons + * + * @namespace Alfresco + * @class Alfresco.RM_ObjectRenderer + */ +(function RM_ObjectRenderer() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * RM_ObjectRenderer component constructor. + * + * @param {object} Instance of the DocumentPicker + * @return {Alfresco.module.ObjectRenderer} The new ObjectRenderer instance + * @constructor + */ + Alfresco.rm.module.ObjectRenderer = function RM_ObjectRenderer_constructor(DocumentPicker) + { + Alfresco.rm.module.ObjectRenderer.superclass.constructor.call(this,DocumentPicker); + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.ObjectRenderer, Alfresco.ObjectRenderer, + { +/** + * Generate item icon URL - displays RM icons depending on type + * + * @method getIconURL + * @param item {object} Item object literal + * @param size {number} Icon size (16, 32) + */ + getIconURL : function RM_ObjectRenderer_getIconURL(item, size) + { + var types = item.type.split(':'); + if (types[0] !== 'rma' && types[0] !== 'dod') + { + return Alfresco.rm.module.ObjectRenderer.superclass.getIconURL.call(this, item, size); + } + else + { + var type = ""; + switch (types[1]) + { + case "recordSeries": + { + type = 'record-series'; + break; + } + case "recordCategory": + { + type = 'record-category'; + break; + } + case "recordFolder": + { + type = 'record-folder'; + break; + } + case "nonElectronicDocument": + { + type = 'non-electronic'; + break; + } + case "metadataStub": + { + type = 'meta-stub'; + break; + } + default: + { + return Alfresco.constants.URL_RESCONTEXT + 'components/images/filetypes/' + Alfresco.util.getFileIcon(item.name, item.type, size); + } + } + return Alfresco.constants.URL_RESCONTEXT + 'rm/components/documentlibrary/images/' + type + '-'+size+'.png'; + } + } + }); + +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/copy-move-link-file-to.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/copy-move-link-file-to.js new file mode 100644 index 0000000000..19f7b1b348 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/copy-move-link-file-to.js @@ -0,0 +1,429 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Document Library "Copy-, Move-, Link- and File-To" module for Records Management. + * + * @namespace Alfresco.module + * @class Alfresco.rm.module.CopyMoveLinkFileTo + */ +(function() +{ + Alfresco.rm.module.CopyMoveLinkFileTo = function(htmlId) + { + Alfresco.module.DoclibSiteFolder.superclass.constructor.call(this, htmlId); + + // Re-register with our own name + this.name = "Alfresco.rm.module.CopyMoveLinkFileTo"; + Alfresco.util.ComponentManager.reregister(this); + + // Initialise prototype properties + this.modules.actions = new Alfresco.module.DoclibActions(); + this.pathsToExpand = []; + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.CopyMoveLinkFileTo, Alfresco.module.DoclibSiteFolder, + { + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @override + * @param obj {object} Object literal specifying a set of options + * @return {Alfresco.rm.module.CopyMoveLinkFileTo} returns 'this' for method chaining + */ + setOptions: function RMCMFT_setOptions(obj) + { + var myOptions = + { + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/copy-move-link-file-to" + }; + + if (typeof obj.mode !== "undefined") + { + var dataWebScripts = + { + copy: "rm-copy-to", + move: "rm-move-to", + link: "rm-link", + file: "rm-move-to", + declareAndFile: "create-record", + declareVersionAndFile: "declare-as-version-record" + }; + + if (typeof dataWebScripts[obj.mode] == "undefined") + { + throw new Error("Alfresco.rm.module.CopyMoveLinkFileTo: Invalid mode '" + obj.mode + "'"); + } + myOptions.dataWebScript = dataWebScripts[obj.mode]; + } + + return Alfresco.rm.module.CopyMoveLinkFileTo.superclass.setOptions.call(this, YAHOO.lang.merge(myOptions, obj)); + }, + + /** + * Gets a custom message + * + * @method msg + * @param messageId {string} The messageId to retrieve + * @return {string} The custom message + * @override + */ + msg: function RMCMFT_msg(messageId) + { + return Alfresco.util.message.call(this, this.options.mode + "." + messageId, this.name, Array.prototype.slice.call(arguments).slice(1)); + }, + + /** + * Gets a custom message for the current file + * + * @method fileMsg + * @param fileName {string} The name of the current file + * @param error {object} The error returned for the current file + * @return {string} The custom message + * @override + */ + fileMsg: function RMCMFT_fileMsg(fileName, error) + { + return "
" + fileName + " - " + error; + }, + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * Dialog OK button event handler + * + * @method onOK + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + * @override + */ + onOK: function RMCMFT_onOK(e, p_obj) + { + var files, multipleFiles = [], params, i, j; + + // Single/multi files into array of nodeRefs + if (YAHOO.lang.isArray(this.options.files)) + { + files = this.options.files; + } + else + { + files = [this.options.files]; + } + for (i = 0, j = files.length; i < j; i++) + { + multipleFiles.push(files[i].nodeRef); + } + + // Success callback function + var fnSuccess = function RMCMFT__onOK_success(p_data) + { + var result, + successCount = p_data.json.successCount, + failureCount = p_data.json.failureCount; + + this.widgets.dialog.hide(); + + // Did the operation succeed? + if (!p_data.json.overallSuccess) + { + // generate a detailed error message + var errorMessage = this.msg("message.failure") + ":"; + for (var i = 0, j = p_data.json.totalResults; i < j; i++) + { + result = p_data.json.results[i]; + if (!result.success) + { + errorMessage += this.fileMsg(result.name, result.error); + } + } + + Alfresco.util.PopupManager.displayPrompt( + { + title: "Error", + noEscape: true, + text: errorMessage + }); + return; + } + + YAHOO.Bubbling.fire("filesMoved", + { + destination: this.currentPath, + successCount: successCount, + failureCount: failureCount + }); + + for (var i = 0, j = p_data.json.totalResults; i < j; i++) + { + result = p_data.json.results[i]; + + if (result.success) + { + YAHOO.Bubbling.fire(result.type == "folder" ? "folderMoved" : "fileMoved", + { + multiple: true, + nodeRef: result.nodeRef, + destination: this.currentPath + }); + } + } + + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.success", successCount) + }); + }; + + // Failure callback function + var fnFailure = function RMCMFT__onOK_failure(p_data) + { + this.widgets.dialog.hide(); + + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.failure") + }); + }; + + // Construct webscript URI based on current viewMode + var webscriptName = this.options.dataWebScript + "/site/{site}/{container}{path}"; + params = + { + site: this.options.siteId, + container: this.options.containerId, + path: Alfresco.util.encodeURIPath(this.selectedNode.data.path) + }; + + // Construct the data object for the genericAction call + this.modules.actions.genericAction( + { + success: + { + callback: + { + fn: fnSuccess, + scope: this + } + }, + failure: + { + callback: + { + fn: fnFailure, + scope: this + } + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: webscriptName, + params: params + }, + wait: + { + message: this.msg("message.please-wait") + }, + config: + { + requestContentType: Alfresco.util.Ajax.JSON, + dataObj: + { + nodeRefs: multipleFiles + } + } + }); + + this.widgets.okButton.set("disabled", true); + this.widgets.cancelButton.set("disabled", true); + }, + + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Internal show dialog function + * @method _showDialog + * @override + */ + _showDialog: function RMCMFT__showDialog() + { + this.widgets.okButton.set("label", this.msg("button")); + return Alfresco.rm.module.CopyMoveLinkFileTo.superclass._showDialog.apply(this, arguments); + }, + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + */ + _buildTreeNodeUrl: function RMCMFT__buildTreeNodeUrl(path) + { + var uriTemplate = Alfresco.constants.PROXY_URI + "slingshot/doclib/rm/treenode/site/{site}/{container}{path}"; + uriTemplate += "?children=" + this.options.evaluateChildFolders; + uriTemplate += "&max=" + this.options.maximumFolderCount; + + var url = YAHOO.lang.substitute(uriTemplate, + { + site: encodeURIComponent(this.options.siteId), + container: encodeURIComponent(this.options.containerId), + path: Alfresco.util.encodeURIPath(path) + }); + + return url; + }, + + /** + * Creates the TreeView control and renders it to the parent element. + * + * @method _buildTree + * @private + */ + _buildTree: function RMCMLFT__buildTree() + { + Alfresco.logger.debug("RMCMLFT__buildTree"); + + // Create a new tree + var tree = new YAHOO.widget.TreeView(this.id + "-treeview"); + this.widgets.treeview = tree; + + // Having both focus and highlight are just confusing (YUI 2.7.0 addition) + YAHOO.widget.TreeView.FOCUS_CLASS_NAME = ""; + + // Turn dynamic loading on for entire tree + tree.setDynamicLoad(this.fnLoadNodeData); + + // Add Unfiled Records container as default selected node for dm actions + if (this.options.mode === "declareVersionAndFile" || this.options.mode === "declareAndFile") + { + if (this.options.rmSiteExists) + { + + var unfiledRecordsNode = new YAHOO.widget.TextNode( + { + label: this.msg("node.unfiledroot"), + path: "/", + nodeRef: "" + }, tree.getRoot(), false); + + // set the options path to unfiled records node to have it selected by default + this.options.path = unfiledRecordsNode.data.path; + + // Register tree-level listeners + tree.subscribe("expand", function (node) { + //disable expand for unfiledRecordsNode node because items aren't declared to an unfiled record folder + if (node === unfiledRecordsNode) + { + return false; + } + }, this, true); + + // if user doesn't have an rm role or is not an alfresco administrator don't display the fileplan node + if (this.options.isRmUser || this.options.isAdmin) + { + // Add file plan top-level node + var filePlanNode = new YAHOO.widget.TextNode( + { + label: "", + path: "/", + hasIcon: false, + nodeRef: "" + }, tree.getRoot(), true); + + tree.subscribe("expandComplete", function (node) { + //remove filePlanNode if it hasn't children + if (node === filePlanNode && filePlanNode.getNodeCount() === 1) + { + tree.removeNode(filePlanNode); + return; + } + + filePlanNode.label = this.msg("node.root"); + filePlanNode.hasIcon = true; + Alfresco.rm.module.CopyMoveLinkFileTo.superclass.onExpandComplete.call(this, node); + + //make filePlanNode not selected + if (this.selectedNode !== null && this.selectedNode.label === filePlanNode.label) + { + Alfresco.rm.module.CopyMoveLinkFileTo.superclass._showHighlight.call(this, false); + } + }, this, true); + + tree.subscribe("clickEvent", function (args) { + // call onNodeClicked method only + // if node is expanded and click event triggers collapse event or + // if node is not expanded and click event triggers expand event for the first time + // otherwise clickEvent toggles the node (expands the node then collapses it) + if ((args.node.dynamicLoadComplete && args.node.expanded) || + (!args.node.dynamicLoadComplete && !args.node.expanded)) + { + Alfresco.rm.module.CopyMoveLinkFileTo.superclass.onNodeClicked.call(this, args); + } + else + { + Alfresco.rm.module.CopyMoveLinkFileTo.superclass._updateSelectedNode.call(args.node); + } + + //make filePlanNode not selected + if (this.selectedNode !== null && this.selectedNode.label === filePlanNode.label) + { + Alfresco.rm.module.CopyMoveLinkFileTo.superclass._showHighlight.call(this, false); + } + }, this, true); + } + } + } + else + { + // Add default top-level node + var tempNode = new YAHOO.widget.TextNode( + { + label: (this.options.unfiled ? this.msg("node.unfiledroot") : this.msg("node.root")), + path: (this.options.unfiled ? "/Unfiled Records" : "/"), + nodeRef: "" + }, tree.getRoot(), false); + // Register tree-level listeners + tree.subscribe("clickEvent", this.onNodeClicked, this, true); + tree.subscribe("expandComplete", this.onExpandComplete, this, true); + } + // Render tree with this one top-level node + tree.render(); + } + }); + + /* Dummy instance to load optional YUI components early */ + var dummyInstance = new Alfresco.rm.module.CopyMoveLinkFileTo("null"); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/file-report.css b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/file-report.css new file mode 100644 index 0000000000..c1fc46dd96 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/file-report.css @@ -0,0 +1,24 @@ +.file-report-unfiled-records +{ + font-size: 123.1%; + font-weight: normal; + padding: 10px 0 0 5px; +} + +.file-report-unfiled-records hr +{ + background-color: #EEEEEE; + height: 1px !important; + margin: 15px 0 10px 50px; + width: 80%; +} + +.file-report-treeview-disabled +{ + opacity: 0.2; +} + +.file-report-treeview-enabled +{ + opacity: 1; +} \ No newline at end of file diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/file-report.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/file-report.js new file mode 100644 index 0000000000..d73a56b60a --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/file-report.js @@ -0,0 +1,211 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * "File Report" module for Records Management. + * + * @namespace Alfresco.module + * @class Alfresco.rm.module.FileReport + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths; + + Alfresco.rm.module.FileReport = function(htmlId) + { + Alfresco.module.DoclibSiteFolder.superclass.constructor.call(this, htmlId); + + // Re-register with our own name + this.name = "Alfresco.rm.module.FileReport"; + Alfresco.util.ComponentManager.reregister(this); + + // Initialise prototype properties + this.pathsToExpand = []; + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.FileReport, Alfresco.module.DoclibSiteFolder, + { + /** + * Object container for initialization options + */ + options: + { + /** + * Evaluate child folders flag - for tree control + * + * @property evaluateChildFolders + * @type boolean + * @default true + */ + evaluateChildFolders: true + }, + + /** + * Event callback when dialog template has been loaded + * + * @method onTemplateLoaded + * @override + * @param response {object} Server response from load template XHR request + */ + onTemplateLoaded: function DLSF_onTemplateLoaded(response) + { + Alfresco.rm.module.FileReport.superclass.onTemplateLoaded.call(this, response); + + this.widgets.unfiledRecordsCheckbox = Dom.get(this.id + "-unfiled-records"); + + Event.addListener(this.widgets.unfiledRecordsCheckbox, "click", this.onCheckChange, this, true); + Event.addListener(this.widgets.dialog.close, "click", this.onCancel, this, true); + }, + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @override + * @param obj {object} Object literal specifying a set of options + * @return {Alfresco.rm.module.FileReport} returns 'this' for method chaining + */ + setOptions: function RMCMFT_setOptions(obj) + { + return Alfresco.rm.module.FileReport.superclass.setOptions.call(this, YAHOO.lang.merge( + { + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/file-report", + files: obj.assets // To make the DoclibSiteFolder component happy + }, obj)); + }, + + /** + * Check box change event handler + * + * @method onCheckChange + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onCheckChange: function RMCMFT_onCheckChange(e, p_obj) + { + var treeView = Dom.get(this.id + "-treeview") + if (this.widgets.unfiledRecordsCheckbox.checked) + { + Dom.removeClass(treeView, "file-report-treeview-enabled"); + Dom.addClass(treeView, "file-report-treeview-disabled"); + } + else + { + Dom.removeClass(treeView, "file-report-treeview-disabled"); + Dom.addClass(treeView, "file-report-treeview-enabled"); + } + }, + + /** + * Dialog Cancel button event handler + * + * @method onCancel + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onCancel: function RMCMFT_onCancel(e, p_obj) + { + this.widgets.unfiledRecordsCheckbox.checked = true; + var treeView = Dom.get(this.id + "-treeview") + Dom.removeClass(treeView, "file-report-treeview-enabled"); + Dom.addClass(treeView, "file-report-treeview-disabled"); + + Alfresco.rm.module.FileReport.superclass.onCancel.call(this, e, p_obj); + }, + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Internal show dialog function + * @method _showDialog + * @override + */ + _showDialog: function RMCMFT__showDialog() + { + this.widgets.okButton.set("label", this.msg("button.file")); + + var dialog = Alfresco.rm.module.FileReport.superclass._showDialog.apply(this, arguments); + + this.widgets.treeview.subscribe("expand", function(node) + { + if (this.widgets.unfiledRecordsCheckbox.checked) + { + return false; + } + }, this, true); + + this.widgets.treeview.subscribe("collapse", function(node) + { + if (this.widgets.unfiledRecordsCheckbox.checked) + { + return false; + } + }, this, true); + + return dialog; + }, + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + */ + _buildTreeNodeUrl: function RMCMFT__buildTreeNodeUrl(path) + { + var uriTemplate = Alfresco.constants.PROXY_URI + "slingshot/doclib/rm/treenode/site/{site}/{container}{path}"; + uriTemplate += "?children=" + this.options.evaluateChildFolders; + + var url = YAHOO.lang.substitute(uriTemplate, + { + site: encodeURIComponent(this.options.siteId), + container: encodeURIComponent(this.options.containerId), + path: Alfresco.util.encodeURIPath(path) + }); + + return url; + } + }); + + /* Dummy instance to load optional YUI components early */ + var dummyInstance = new Alfresco.rm.module.FileReport("null"); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/add-to-hold.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/add-to-hold.js new file mode 100644 index 0000000000..b760363a44 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/add-to-hold.js @@ -0,0 +1,87 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Dialog to add a record or a folder to hold(s). + * + * @namespace Alfresco.rm.module + * @class Alfresco.rm.module.AddToHold + */ +(function() +{ + /** + * YUI Library aliases + */ + var KeyListener = YAHOO.util.KeyListener; + + /** + * AddToHold constructor. + * + * @param htmlId {string} A unique id for this component + * @return {Alfresco.rm.module.AddToHold} The new AddToHold instance + * @constructor + */ + Alfresco.rm.module.AddToHold = function(htmlId) + { + Alfresco.rm.module.AddToHold.superclass.constructor.call(this, "Alfresco.rm.module.AddToHold", htmlId); + + // Re-register with our own name + this.name = "Alfresco.rm.module.AddToHold"; + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.AddToHold, Alfresco.rm.module.Hold, + { + /** + * Indicates whether the holds should be retrieved which include the itemNodeRef + * + * @type boolean + * @default false + */ + includedInHold: false, + + /** + * The URL for the dialog template + * + * @property templateUrl + * @type string + * @default Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/hold/add-to-hold" + */ + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/hold/add-to-hold", + + /** + * The ajax request method type when the user clicks on the OK button + * + * @property onOKAjaxRequestMethodType + * @type string + * @default Alfresco.util.Ajax.POST + */ + onOKAjaxRequestMethodType: Alfresco.util.Ajax.POST + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/hold.css b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/hold.css new file mode 100644 index 0000000000..ecd815bf98 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/hold.css @@ -0,0 +1,11 @@ +.hold +{ + padding: 10px; +} + +.hold-search +{ + padding-right: 5px; + vertical-align: bottom; + line-height: 22px; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/hold.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/hold.js new file mode 100644 index 0000000000..69adf6b6ea --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/hold.js @@ -0,0 +1,321 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Base dialog class for hold actions. + * + * @namespace Alfresco.rm.module + * @class Alfresco.rm.module.Hold + */ +(function() +{ + /** + * YUI Library aliases + */ + var KeyListener = YAHOO.util.KeyListener; + + /** + * Hold constructor. + * + * @param htmlId {string} A unique id for this component + * @return {Alfresco.rm.module.Hold} The new Hold instance + * @constructor + */ + Alfresco.rm.module.Hold = function(htmlId) + { + Alfresco.rm.module.Hold.superclass.constructor.call(this, "Alfresco.rm.module.Hold", htmlId); + return this; + }; + + YAHOO.extend(Alfresco.rm.module.Hold, Alfresco.component.Base, + { + /** + * Object container for initialization options + */ + options: + { + /** + * Node reference of the item which will be added/removed to/from the hold(s) + * + * @type string + * @default null + */ + itemNodeRef: null + }, + + /** + * Shows the from hold dialog to the user. + * + * @method show + */ + show: function Hold_show() + { + if (this.widgets.dialog) + { + // Dialog is already in the DOM, so just show it + this._showDialog(); + } + else + { + Alfresco.util.Ajax.request( + { + url: this.templateUrl, + dataObj: + { + htmlid: this.id + }, + successCallback: + { + fn: this.onTemplateLoaded, + scope: this + }, + failureMessage: this.msg("failure.template.not.loaded"), + execScripts: true + }); + } + }, + + /** + * Called when the Hold html template has been returned from the server. + * Creates the YUI gui objects such as buttons and a dialog and shows it. + * + * @method onTemplateLoaded + * @param response {object} a Alfresco.util.Ajax.request response object + */ + onTemplateLoaded: function Hold_onTemplateLoaded(response) + { + // Inject the template from the XHR request into a new DIV element + var containerDiv = document.createElement("div"); + containerDiv.innerHTML = response.serverResponse.responseText; + + // The dialog is created from the HTML returned in the XHR request, not the container + var dialogDiv = Dom.getFirstChild(containerDiv); + + // Create the panel + this.widgets.dialog = Alfresco.util.createYUIPanel(dialogDiv); + + // OK button + this.widgets.okButton = Alfresco.util.createYUIButton(this, "ok", this.onOK); + + // Cancel button + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "cancel", this.onCancel); + + // Show the dialog + this._showDialog(); + }, + + /** + * Setup the data source for the data table. + * + * @method _setupListDataSource + * @private + */ + _setupDataSource: function Hold__setupDataSource() + { + var itemNodeRef = ""; + if (!YAHOO.lang.isArray(this.options.itemNodeRef)) + { + itemNodeRef = YAHOO.lang.substitute("itemNodeRef={itemNodeRef}&", + { + itemNodeRef: this.options.itemNodeRef + }); + } + + var includedInHold = YAHOO.lang.substitute("includedInHold={includedInHold}", + { + includedInHold: (this.includedInHold).toString() + }); + + // DataSource definition + var uriHolds = encodeURI(Alfresco.constants.PROXY_URI + "api/rma/holds?" + itemNodeRef + includedInHold + "&fileOnly=true"); + this.widgets.listDataSource = new YAHOO.util.DataSource(uriHolds, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "queueRequests", + responseSchema: + { + resultsList: "data.holds" + } + }); + }, + + /** + * Setup the data table. + * + * @method _setupListDataTable + * @private + */ + _setupDataTable: function Hold__setupDataTable() + { + // Data table column definitions + var columnDefinitions = + [{ + key: "check", label: "", sortable: false, formatter: "checkbox" + }, + { + key: "name", label: this.msg("name.column.header"), sortable: true, width: 450 + }]; + + // ListDataTable definition + this.widgets.listDataTable = new YAHOO.widget.DataTable(this.id + "-listofholds", columnDefinitions, this.widgets.listDataSource, + { + renderLoopSize: 32, + scrollable: true, + height: "200px", + MSG_EMPTY: this.msg("message.empty.holds"), + MSG_ERROR: this.msg("message.empty.holds") + }); + + this.widgets.listDataTable.on('theadCellClickEvent', Alfresco.rm.dataTableHeaderCheckboxClick); + this.widgets.listDataTable.on('checkboxClickEvent', Alfresco.rm.dataTableCheckboxClick); + }, + + /** + * Dialog OK button event handler + * + * @method onOK + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onOK: function Hold_onOK(e, p_obj) + { + var selectedHolds = Alfresco.rm.dataTableSelectedItems(this.widgets.listDataTable); + if (selectedHolds.length > 0) + { + Alfresco.util.Ajax.request( + { + url: encodeURI(Alfresco.constants.PROXY_URI + "api/rma/holds"), + method: this.onOKAjaxRequestMethodType, + dataObj: + { + "nodeRefs": !YAHOO.lang.isArray(this.options.itemNodeRef) ? [this.options.itemNodeRef] : this.options.itemNodeRef, + "holds": selectedHolds + }, + requestContentType: Alfresco.util.Ajax.JSON, + successCallback: + { + fn: function(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.hold-success") + }); + + YAHOO.Bubbling.fire("metadataRefresh"); + this._reset(); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + var json = Alfresco.util.parseJSON(response.serverResponse.responseText), + failureMsg = response.serverResponse.responseText; + if (json != null && json.message != null) + { + failureMsg = json.message; + } + + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.failure"), + text: failureMsg + }); + this._reset(); + }, + scope: this + } + }); + } + else + { + this._reset(); + } + }, + + /** + * Dialog Cancel button event handler + * + * @method onCancel + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onCancel: function Hold_onCancel(e, p_obj) + { + this._reset(); + }, + + /** + * Disables the escape listener, + * hides the dialog and + * resets the array which keeps the selected holds. + * + * @method _reset + * @private + */ + _reset: function Hold__reset() + { + this.widgets.escapeListener.disable(); + this.widgets.dialog.hide(); + }, + + /** + * Prepares the gui and shows the dialog. + * + * @method _showDialog + * @private + */ + _showDialog: function Hold__showDialog() + { + // Setup data table + this._setupDataSource(); + this._setupDataTable(); + + // Show the upload dialog + this.widgets.dialog.show(); + + if (!this.widgets.escapeListener) + { + // Register the ESC key to close the dialog + this.widgets.escapeListener = new KeyListener(Dom.get(this.id + "-dialog"), + { + keys: KeyListener.KEY.ESCAPE + }, + { + fn: function(id, keyEvent) + { + this.onCancel(); + }, + scope: this, + correctScope: true + }); + this.widgets.escapeListener.enable(); + } + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/remove-from-hold.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/remove-from-hold.js new file mode 100644 index 0000000000..f6f55620be --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/hold/remove-from-hold.js @@ -0,0 +1,87 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Dialog to remove a record or a folder from hold(s). + * + * @namespace Alfresco.rm.module + * @class Alfresco.rm.module.RemoveFromHold + */ +(function() +{ + /** + * YUI Library aliases + */ + var KeyListener = YAHOO.util.KeyListener; + + /** + * RemoveFromHold constructor. + * + * @param htmlId {string} A unique id for this component + * @return {Alfresco.rm.module.RemoveFromHold} The new RemoveFromHold instance + * @constructor + */ + Alfresco.rm.module.RemoveFromHold = function(htmlId) + { + Alfresco.rm.module.RemoveFromHold.superclass.constructor.call(this, "Alfresco.rm.module.RemoveFromHold", htmlId); + + // Re-register with our own name + this.name = "Alfresco.rm.module.RemoveFromHold"; + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.RemoveFromHold, Alfresco.rm.module.Hold, + { + /** + * Indicates whether the holds should be retrieved which include the itemNodeRef + * + * @type boolean + * @default true + */ + includedInHold: true, + + /** + * The URL for the dialog template + * + * @property templateUrl + * @type string + * @default Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/hold/remove-from-hold" + */ + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/hold/remove-from-hold", + + /** + * The ajax request method type when the user clicks on the OK button + * + * @property onOKAjaxRequestMethodType + * @type string + * @default Alfresco.util.Ajax.PUT + */ + onOKAjaxRequestMethodType: Alfresco.util.Ajax.PUT + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/select-audit-record-location.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/select-audit-record-location.js new file mode 100644 index 0000000000..fa49fd415e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/documentlibrary/select-audit-record-location.js @@ -0,0 +1,114 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * Document Library Selector. Allows selection of document library (and folder) of a specified site + * + * @namespace Alfresco.module + * @class Alfresco.rm.module.SelectAuditRecordLocation + */ +(function() +{ + Alfresco.rm.module.SelectAuditRecordLocation = function(htmlId) + { + Alfresco.rm.module.SelectAuditRecordLocation.superclass.constructor.call(this, htmlId); + + // Re-register with our own name + this.name = "Alfresco.rm.module.SelectAuditRecordLocation"; + Alfresco.util.ComponentManager.reregister(this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.SelectAuditRecordLocation, Alfresco.module.DoclibSiteFolder, + { + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + * @return {Alfresco.rm.module.SelectAuditRecordLocation} returns 'this' for method chaining + * @override + */ + setOptions: function SARL_setOptions(obj) + { + return Alfresco.rm.module.SelectAuditRecordLocation.superclass.setOptions.call(this, YAHOO.lang.merge( + { + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/documentlibrary/copy-move-link-file-to" + }, obj)); + }, + + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Dialog OK button event handler + * + * @method onOK + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + * @override + */ + onOK: function SARL_onOK(e, p_obj) + { + var node = this.widgets.treeview.getNodeByProperty("path", this.currentPath); + YAHOO.Bubbling.fire("AuditRecordLocationSelected", + { + nodeRef: node.data.nodeRef + }); + this.widgets.dialog.hide(); + }, + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + * @override + */ + _buildTreeNodeUrl: function SARL__buildTreeNodeUrl(path) + { + var uriTemplate = Alfresco.constants.PROXY_URI + "slingshot/doclib/rm/treenode/site/{site}/{container}{path}"; + uriTemplate += "?children=" + this.options.evaluateChildFolders; + + var url = YAHOO.lang.substitute(uriTemplate, + { + site: encodeURIComponent(this.options.siteId), + container: encodeURIComponent(this.options.containerId), + path: Alfresco.util.encodeURIPath(path) + }); + + return url; + } + }); + + /* Dummy instance to load optional YUI components early */ + var dummyInstance = new Alfresco.rm.module.SelectAuditRecordLocation("null"); +})(); + diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/search/save-search.css b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/search/save-search.css new file mode 100644 index 0000000000..fbf5bb49e6 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/search/save-search.css @@ -0,0 +1,4 @@ +.rm-save-search +{ + width: 30em; +} diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/modules/search/save-search.js b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/search/save-search.js new file mode 100644 index 0000000000..a9a1e31e69 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/modules/search/save-search.js @@ -0,0 +1,350 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * SaveSearch module + * + * A dialog for saving RM searches. + * + * @namespace Alfresco.module + * @class Alfresco.rm.module.SaveSearch + */ +(function() +{ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + KeyListener = YAHOO.util.KeyListener; + + /** + * SaveSearch constructor. + * + * @param htmlId {string} A unique id for this component + * @return {Alfresco.SaveSearch} The new Alfresco.SaveSearch instance + * @constructor + */ + Alfresco.rm.module.SaveSearch = function(containerId) + { + var instance = Alfresco.util.ComponentManager.get(this.id); + if (instance !== null) + { + throw new Error("An instance of Alfresco.rm.module.SaveSearch already exists."); + } + + Alfresco.rm.module.SaveSearch.superclass.constructor.call(this, "Alfresco.rm.module.SaveSearch", containerId, ["button", "container", "connection", "selector", "json"]); + + return this; + }; + + YAHOO.extend(Alfresco.rm.module.SaveSearch, Alfresco.component.Base, + { + /** + * Object container for initialization options + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * Search query. + * + * @property query + * @type string + */ + query: "", + + /** + * Search parameters in URI encoded name/value pair format. + * + * @property params + * @type string + */ + params: "", + + /** + * Search sort in comma separated "property/dir" packed format i.e. "cm:name/asc,cm:title/desc" + * + * @property sort + * @type string + */ + sort: "" + }, + + _form: null, + + /** + * Shows the SaveSearch dialog to the user. + * + * @method show + */ + show: function SS_show() + { + if (this.widgets.panel) + { + this._showPanel(); + } + else + { + // Load the gui from the server and let the templateLoaded() method handle the rest. + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "rm/modules/search/save-search", + dataObj: + { + htmlid: this.id + }, + successCallback: + { + fn: this.onTemplateLoaded, + scope: this + }, + execScripts: true, + failureMessage: "Could not load Save Search template." + }); + } + }, + + /** + * Called when the SaveSearch html template has been returned from the server. + * Creates the YUI gui objects such as buttons and a panel and shows it. + * + * @method onTemplateLoaded + * @param response {object} a Alfresco.util.Ajax.request response object + */ + onTemplateLoaded: function SS_onTemplateLoaded(response) + { + // Inject the template from the XHR request into a new DIV element + var containerDiv = document.createElement("div"); + containerDiv.innerHTML = response.serverResponse.responseText; + + // The panel is created from the HTML returned in the XHR request, not the container + var panelDiv = Dom.getFirstChild(containerDiv); + + this.widgets.panel = Alfresco.util.createYUIPanel(panelDiv); + + // Create the cancel button + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "cancel-button", + function() + { + this.widgets.panel.hide(); + } + ); + + // Create the Save button, the forms runtime will handle when its clicked + this.widgets.saveButton = Alfresco.util.createYUIButton(this, "save-button", null, + { + type: "submit" + }); + + // Configure the forms runtime + var form = new Alfresco.forms.Form(this.id + "-form"); + + // Name is a node, mandatory and has a maximum length + form.addValidation(this.id + "-name", Alfresco.forms.validation.nodeName, null, "keyup"); + form.addValidation(this.id + "-name", Alfresco.forms.validation.mandatory, null, "keyup"); + form.addValidation(this.id + "-name", Alfresco.forms.validation.length, + { + max: 1024, + crop: true + }, "keyup"); + + // Description has a maximum length + form.addValidation(this.id + "-description", Alfresco.forms.validation.length, + { + max: 1024, + crop: true + }, "keyup"); + + // The Save button is the submit button, and it should be enabled when the form is ready + form.setShowSubmitStateDynamically(true, false); + form.setSubmitElements(this.widgets.saveButton); + form.doBeforeFormSubmit = + { + fn: function() + { + var formEl = Dom.get(this.id + "-form"); + formEl.attributes.action.nodeValue = Alfresco.constants.PROXY_URI + "slingshot/rmsavedsearches/site/" + this.options.siteId; + + this.widgets.saveButton.set("disabled", true); + + this.widgets.panel.hide(); + + // apply hidden field values for query via module options + Dom.get(this.id + "-query").value = this.options.query; + Dom.get(this.id + "-params").value = this.options.params; + Dom.get(this.id + "-sort").value = this.options.sort; + }, + obj: null, + scope: this + }; + + // Submit as an ajax submit (not leave the page), in json format + form.setAJAXSubmit(true, + { + successCallback: + { + fn: this.onSaveSearchSuccess, + scope: this + }, + failureCallback: + { + fn: this.onSaveSearchFailure, + scope: this + } + }); + form.setSubmitAsJSON(true); + form.applyTabFix(); + form.init(); + this._form = form; + + // Show the panel + this._showPanel(); + }, + + /** + * Called when user clicks on the cancel button. + * Closes the SaveSearch panel. + * + * @method onCancelButtonClick + * @param type + * @param args + */ + onCancelButtonClick: function SS_onCancelButtonClick(type, args) + { + this.widgets.panel.hide(); + }, + + /** + * Called when a search has been successfully saved to the server. + * + * @method onSaveSearchSuccess + * @param response + */ + onSaveSearchSuccess: function SS_onSaveSearchSuccess(response) + { + if (response.json !== undefined && response.json.success) + { + // Fire bubbling event to inform caller search saved + var name = Dom.get(this.id + "-name").value; + var obj = { + id: name, + label: name, + description: Dom.get(this.id + "-description").value, + query: this.options.query, + params: this.options.params, + sort: this.options.sort + }; + YAHOO.Bubbling.fire("savedSearchAdded", obj); + this.widgets.panel.hide(); + } + else + { + this._adjustGUIAfterFailure(response); + } + }, + + /** + * Called when a search failed to save. + * + * @method onSaveSearchFailure + * @param response + */ + onSaveSearchFailure: function SS_onSaveSearchFailure(response) + { + this._adjustGUIAfterFailure(response); + }, + + /** + * Helper method that restores the gui and displays an error message. + * + * @method _adjustGUIAfterFailure + * @param response + */ + _adjustGUIAfterFailure: function SS__adjustGUIAfterFailure(response) + { + this.widgets.saveButton.set("disabled", false); + this.widgets.cancelButton.set("disabled", false); + this.widgets.panel.show(); + var text = Alfresco.util.message("message.failure", this.name); + if (response.json && response.json.message) + { + var tmp = Alfresco.util.message(response.json.message, this.name); + text = tmp ? tmp : text; + } + Alfresco.util.PopupManager.displayPrompt( + { + text: text + }); + }, + + /** + * Prepares the gui and shows the panel. + * + * @method _showPanel + * @private + */ + _showPanel: function SS__showPanel() + { + // The panel gui has been showed before and its gui has already been loaded and created + this.widgets.panel.show(); + + this._form.updateSubmitElements(); + + // Firefox insertion caret fix + Alfresco.util.caretFix(this.id + "-form"); + + // Register the ESC key to close the dialog + var escapeListener = new KeyListener(document, + { + keys: KeyListener.KEY.ESCAPE + }, + { + fn: function(id, keyEvent) + { + this.onCancelButtonClick(); + }, + scope: this, + correctScope: true + }); + escapeListener.enable(); + + // Set the focus on the first field + Dom.get(this.id + "-name").focus(); + } + }); +})(); + +Alfresco.module.getSaveSearchInstance = function() +{ + var instanceId = "alfresco-SaveSearch-instance"; + return Alfresco.util.ComponentManager.get(instanceId) || new Alfresco.rm.module.SaveSearch(instanceId); +}; diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/templates/folder-details/folder-details.js b/amps/ags/rm-community/rm-community-share/source/web/rm/templates/folder-details/folder-details.js new file mode 100644 index 0000000000..78735957c4 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/templates/folder-details/folder-details.js @@ -0,0 +1,76 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +/** + * RecordsFolderDetails template - RM extensions. + * + * @namespace Alfresco + * @class Alfresco.rm.template.FolderDetails + */ +(function() +{ + /** + * RecordsFolderDetails constructor. + * + * @return {Alfresco.rm.template.FolderDetails} The new RecordsFolderDetails instance + * @constructor + */ + Alfresco.rm.template.FolderDetails = function RecordsFolderDetails_constructor() + { + Alfresco.rm.template.FolderDetails.superclass.constructor.call(this); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("detailsRefresh", this.onReady, this); + + return this; + }; + + YAHOO.extend(Alfresco.rm.template.FolderDetails, Alfresco.FolderDetails, + { + /** + * Fired by YUI when parent element is available for scripting. + * Template initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function RecordsFolderDetails_onReady() + { + var config = + { + method: "GET", + url: Alfresco.constants.PROXY_URI + 'slingshot/doclib/rm/node/' + this.options.nodeRef.uri, + successCallback: + { + fn: this._getDataSuccess, + scope: this + }, + failureMessage: "Failed to load data for folder details" + }; + Alfresco.util.Ajax.request(config); + } + }); +})(); diff --git a/amps/ags/rm-community/rm-community-share/source/web/rm/templates/record-series-details/record-series-details.css b/amps/ags/rm-community/rm-community-share/source/web/rm/templates/record-series-details/record-series-details.css new file mode 100644 index 0000000000..0fb579f1b1 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/source/web/rm/templates/record-series-details/record-series-details.css @@ -0,0 +1,10 @@ +.folder-details-comments +{ + border-right: medium none; +} + +.folder-links, +.folder-actions +{ + border-right: 1px solid #cccccc; +} diff --git a/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/ActionEvaluatorUnitTest.java b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/ActionEvaluatorUnitTest.java new file mode 100644 index 0000000000..8126f3094e --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/ActionEvaluatorUnitTest.java @@ -0,0 +1,110 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import org.alfresco.test.BaseUnitTest; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.junit.Test; + +/** + * Action evaluator unit test + * + * @author Roy Wetherall + * @since 2.3 + */ +public class ActionEvaluatorUnitTest extends BaseUnitTest +{ + /** action evaluator */ + private ActionEvaluator actionEvaluator = new ActionEvaluator(); + + /** + * Given the action is null + * When evaluated + * Then the result is false + */ + @Test + public void actionIsNull() + { + assertFalse(actionEvaluator.evaluate(mock(JSONObject.class))); + } + + /** + * Given there are no actions + * When evaluated + * Then the result is false + */ + @Test + public void noActions() + { + actionEvaluator.setAction(generateText()); + assertFalse(actionEvaluator.evaluate(mock(JSONObject.class))); + } + + /** + * Given that the action is not in the action list + * When evaluated + * Then the result is false + */ + @Test + public void actionNotInActionList() throws Exception + { + // set action + actionEvaluator.setAction(generateText()); + + // create json + JSONObject json = (JSONObject)new JSONParser().parse("{\"node\":{\"rmNode\":{\"actions\":[\"" + generateText() + "\"]}}}"); + + // show evaluation true + assertFalse(actionEvaluator.evaluate(json)); + } + + /** + * Given that the action is in the action list + * When evaluated + * Then the result it true + */ + @Test + public void actionInActionList() throws Exception + { + // set action + String action = generateText(); + actionEvaluator.setAction(action); + + // create json + JSONObject json = (JSONObject)new JSONParser().parse("{\"node\":{\"rmNode\":{\"actions\":[\"" + action + "\"]}}}"); + + // show evaluation true + assertTrue(actionEvaluator.evaluate(json)); + } + +} diff --git a/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IncompleteEventEvaluatorUnitTest.java b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IncompleteEventEvaluatorUnitTest.java new file mode 100644 index 0000000000..ad8508e12f --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/IncompleteEventEvaluatorUnitTest.java @@ -0,0 +1,122 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.HashMap; + +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +/** + * @author Ross Gale + * @since 2.7 + */ +public class IncompleteEventEvaluatorUnitTest +{ + @Mock + private JSONObject jsonObject; + + @Mock + private JSONObject node; + + @Mock + private HashMap rmNode; + + @Mock + private HashMap properties; + + private IncompleteEventEvaluator incompleteEventEvaluator; + + @Before + public void setUp() + { + MockitoAnnotations.initMocks(this); + incompleteEventEvaluator = new IncompleteEventEvaluator(); + when(jsonObject.get("node")).thenReturn(node); + when(node.get("rmNode")).thenReturn(rmNode); + when(rmNode.get("properties")).thenReturn(properties); + } + + /** + * Check the evaluate method when no value set in the combine property + */ + @Test + public void testEvaluateReturnsTrueWhenCombineOptionNotSelected() + { + assertTrue(incompleteEventEvaluator.evaluate(jsonObject)); + } + + /** + * Check the evaluate method when the combine property is set to false + */ + @Test + public void testEvaluateReturnsTrueWhenCombineOptionSetToFalse() + { + when(properties.get("combineDispositionStepConditions")).thenReturn(false); + assertTrue(incompleteEventEvaluator.evaluate(jsonObject)); + } + + /** + * Check the evaluate method when the combine property set to true without an incomplete event + */ + @Test + public void testEvaluateReturnsTrueWhenCombineSelectedAndNoIncompleteEvents() + { + when(properties.get("combineDispositionStepConditions")).thenReturn(true); + when(properties.containsKey("incompleteDispositionEvent")).thenReturn(false); + assertTrue(incompleteEventEvaluator.evaluate(jsonObject)); + } + + /** + * Check the evaluate method when the combine property set to true with an incomplete result + */ + @Test + public void testEvaluateReturnsFalseWhenCombineSelectedAndIncompleteEventPresent() + { + when(properties.get("combineDispositionStepConditions")).thenReturn(true); + when(properties.containsKey("incompleteDispositionEvent")).thenReturn(true); + when(properties.get("dispositionEventCombination")).thenReturn("and"); + assertFalse(incompleteEventEvaluator.evaluate(jsonObject)); + } + + /** + * Check the evaluate method when the combine property is null + */ + @Test + public void testEvaluateReturnsTrueWhenCombineSelectedIsNull() + { + when(properties.get("combineDispositionStepConditions")).thenReturn(null); + assertTrue(incompleteEventEvaluator.evaluate(jsonObject)); + } +} diff --git a/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UnlinkActionEvaluatorUnitTest.java b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UnlinkActionEvaluatorUnitTest.java new file mode 100644 index 0000000000..9f8acf7d97 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/module/org_alfresco_module_rm_share/evaluator/UnlinkActionEvaluatorUnitTest.java @@ -0,0 +1,115 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm_share.evaluator; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.alfresco.test.BaseUnitTest; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.junit.Test; + +/** + * Unlink action evaluator unit test + * + * @author Roy Wetherall + * @since 2.3 + */ +public class UnlinkActionEvaluatorUnitTest extends BaseUnitTest +{ + /** unlink action evaluator */ + private UnlinkActionEvaluator evaluator = new UnlinkActionEvaluator(); + + /** + * Given that the "linked" indicator is not present + * When evaluated + * Then the result is false + */ + @Test + public void linkedIndicatorMissing() throws Exception + { + JSONObject json = (JSONObject)new JSONParser().parse("{\"node\":{\"rmNode\":{\"indicators\":[\"" + generateText() + "\"]}}}"); + assertFalse(evaluator.evaluate(json)); + } + + /** + * Given that the primary parent matches the current parent + * And the "linked" indicator is present + * When evaluated + * Then the result is false + */ + @Test + public void inPrimaryParent() throws Exception + { + String nodeRef = generateText(); + JSONObject json = (JSONObject)new JSONParser().parse( + "{" + + " \"node\":" + + " { " + + " \"rmNode\":" + + " {" + + " \"indicators\":[\"multiParent\"]," + + " \"primaryParentNodeRef\":\"" + nodeRef + "\"" + + " }" + + " }," + + " \"parent\":" + + " {" + + " \"nodeRef\":\"" + nodeRef + "\"" + + " }" + + "}"); + assertFalse(evaluator.evaluate(json)); + } + + /** + * Given that the primary parent does not match the current parent + * And the "linked" indicator is present + * When evaluated + * Then the result is true + */ + @Test + public void notInPrimaryParent() throws Exception + { + JSONObject json = (JSONObject)new JSONParser().parse( + "{" + + " \"node\":" + + " { " + + " \"rmNode\":" + + " {" + + " \"indicators\":[\"multiParent\"]," + + " \"primaryParentNodeRef\":\"" + generateText() + "\"" + + " }" + + " }," + + " \"parent\":" + + " {" + + " \"nodeRef\":\"" + generateText() + "\"" + + " }" + + "}"); + assertTrue(evaluator.evaluate(json)); + } +} diff --git a/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/test/BaseUnitTest.java b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/test/BaseUnitTest.java new file mode 100644 index 0000000000..de0bdfaab8 --- /dev/null +++ b/amps/ags/rm-community/rm-community-share/unit-test/java/org/alfresco/test/BaseUnitTest.java @@ -0,0 +1,50 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2023 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.test; + +import java.util.UUID; + +/** + * Base unit test + * + * @author Roy Wetherall + * @since 2.3 + */ +public class BaseUnitTest +{ + /** + * Helper method to generate text value + * + * @return String generated text value + */ + protected String generateText() + { + return UUID.randomUUID().toString(); + } + +} diff --git a/amps/pom.xml b/amps/pom.xml new file mode 100644 index 0000000000..3d008b2508 --- /dev/null +++ b/amps/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + alfresco-share-amps + AMPs + pom + + + org.alfresco + alfresco-share-parent + 23.1.0.156-SNAPSHOT + + + + + + ags + + ags + + + + diff --git a/ide-config/Alfresco Code Style.epf b/ide-config/Alfresco Code Style.epf new file mode 100644 index 0000000000..86d1113cbd --- /dev/null +++ b/ide-config/Alfresco Code Style.epf @@ -0,0 +1,23 @@ +#Tue Jun 10 10:02:35 BST 2014 +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.overrideannotation=true +/instance/org.eclipse.jdt.ui/formatter_settings_version=12 +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=12 +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_code_templates= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.fieldSuffixes= +\!/= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.localSuffixes= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.fieldPrefixes= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.localPrefixes= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.argumentSuffixes= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.argumentPrefixes= +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.gettersetter.use.is=true +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.exception.name=e +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= +@org.eclipse.jdt.ui=3.9.50.v20140317-1811 +/instance/org.eclipse.jdt.ui/formatter_profile=_Alfresco +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= +file_export_version=3.0 +@org.eclipse.jdt.core=3.9.50.v20140317-1741 diff --git a/ide-config/Alfresco_codeFormatter_fromEclipse.xml b/ide-config/Alfresco_codeFormatter_fromEclipse.xml new file mode 100644 index 0000000000..e58d0b511d --- /dev/null +++ b/ide-config/Alfresco_codeFormatter_fromEclipse.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n.properties b/l10n.properties new file mode 100644 index 0000000000..5637cf032e --- /dev/null +++ b/l10n.properties @@ -0,0 +1,4 @@ +# Localisation config overrides for Share codebase +MESSAGE_SEARCH_PATH="share/src/main/resources share-services/src/main/resources wcmquickstart-module/wcmquickstartwebsite/src/main/resources/alfresco/messages share/src/main/webapp/js/alfresco/cmm/dnd/i18n share/src/main/webapp/js/alfresco/cmm/forms/controls/i18n share/src/main/webapp/js/alfresco/cmm/layout/i18n share/src/main/webapp/js/alfresco/cmm/services/i18n wcmquickstart-module/wcmquickstartmodule/src/main/amp/config/alfresco/module/org_alfresco_module_wcmquickstart/message wcmquickstart-module/wcmquickstartmodule/src/main/amp/config/alfresco/module/org_alfresco_module_wcmquickstart/model wcmquickstart-module/wcmquickstartmodule/src/main/amp/config/alfresco/module/org_alfresco_module_wcmquickstart/process wcmquickstart-module/wcmquickstartsharemodule/src/main/amp/config/alfresco/messages wcmquickstart-module/wcmquickstartsharemodule/src/main/amp/config/alfresco/site-webscripts/org/alfresco/components/dashlets wcmquickstart-module/wcmquickstartsharemodule/src/main/amp/config/alfresco/site-webscripts/org/alfresco/components/wcmqs web-framework-commons/src/main/resources/alfresco/messages web-framework-commons/src/main/resources/alfresco/site-webscripts/org/alfresco/components/formamps/ags/rm-enterprise/rm-enterprise-share/src/main amps/ags/rm-community/rm-community-share" + +EXCLUDED_FILES="$EXCLUDED_FILES file-mapping.properties share-config.properties" diff --git a/license-header.txt b/license-header.txt new file mode 100644 index 0000000000..a7efa66750 --- /dev/null +++ b/license-header.txt @@ -0,0 +1,18 @@ +Copyright 2005 - 2020 Alfresco Software Limited. + +This file is part of the Alfresco software. +If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. +Otherwise, the software is provided under the following open source license terms: + +Alfresco is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Alfresco is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with Alfresco. If not, see . \ No newline at end of file diff --git a/packaging/distribution/pom.xml b/packaging/distribution/pom.xml new file mode 100644 index 0000000000..dfdee6d0d8 --- /dev/null +++ b/packaging/distribution/pom.xml @@ -0,0 +1,154 @@ + + 4.0.0 + alfresco-share-base-distribution + Distribution of Alfresco Share + pom + + + org.alfresco + alfresco-share-packaging + 23.1.0.156-SNAPSHOT + + + + + 8080 + + + + + org.alfresco + share + ${project.version} + war + + + org.alfresco + alfresco-share-services + ${dependency.alfresco-community-repo.version} + amp + + + org.alfresco + alfresco-share-encryption + ${project.version} + jar + + + + + ${project.artifactId}-${project.version} + + + src/main/resources + true + + + ${project.build.directory}/dependency/bitrock/bitrock/alfresco/shared/web-extension + ${project.build.outputDirectory}/web-extension-samples + true + + + + + + maven-resources-plugin + + + + default-resources + + resources + + + + ${*} + @@ + + false + + + + copy-resources + process-resources + + copy-resources + + + ${project.build.directory}/licenses + + + ../licenses + true + + + + + + + + + maven-dependency-plugin + + + + extract-keystore + generate-resources + + unpack + + + + + ${project.groupId} + alfresco-repository + ${dependency.alfresco-community-repo.version} + alfresco/keystore/** + + + + + + + + fetch-resources + generate-resources + + copy + + + + + org.alfresco + alfresco-mmt + ${dependency.alfresco-community-repo.version} + ${project.build.outputDirectory}/bin + + + true + + + + + + + maven-assembly-plugin + + + package-share + package + + single + + + + + false + + src/assembly/share-distribution.xml + + + + + + diff --git a/packaging/distribution/src/assembly/share-distribution.xml b/packaging/distribution/src/assembly/share-distribution.xml new file mode 100644 index 0000000000..018fbff6bd --- /dev/null +++ b/packaging/distribution/src/assembly/share-distribution.xml @@ -0,0 +1,61 @@ + + distribution + + zip + + + + + + target/classes + + + **/bitrock/** + + + + + target/dependency/alfresco/keystore + alf_data/keystore + + + target/licenses + licenses + + + + + + + + *:*:war + + web-server/webapps + share.war + true + false + + + + + *:*:amp + + amps + alfresco-share-services.amp + true + false + + + + + *:*:jar + + alfresco-share-encryption + alfresco-share-encryption.jar + true + false + + + + diff --git a/packaging/distribution/src/main/resources/README.txt b/packaging/distribution/src/main/resources/README.txt new file mode 100644 index 0000000000..c85a09aa29 --- /dev/null +++ b/packaging/distribution/src/main/resources/README.txt @@ -0,0 +1,4 @@ +Alfresco Content Services Share ${project.version} +===================================== + +See the Alfresco Support Portal (http://support.alfresco.com) for release notes and detailed information on this release. diff --git a/packaging/distribution/src/main/resources/alfresco-share-encryption/README.txt b/packaging/distribution/src/main/resources/alfresco-share-encryption/README.txt new file mode 100644 index 0000000000..5c9afb0f24 --- /dev/null +++ b/packaging/distribution/src/main/resources/alfresco-share-encryption/README.txt @@ -0,0 +1,75 @@ +Encrypting configuration for share + +You can encrypt sensitive properties from share-custom-config.xml + +1. Run the Alfresco Share Encryption String Tool + + a.Navigate to https://github.com/Alfresco/share/share-encryption + + b.Build the project using maven: mvn clean install + + c.Run the executable jar: + + java -jar alfresco-share-encryption-{version}.jar + Alfresco Share Encrypted String Tool + USAGE : org.alfresco.encryptor.ShareStringEncryption initkey | encrypt | validate + initkey : initialise the public and private keystores + encrypt : encrypt a value + validate : compare an encrypted value with a value to see if they match + +2. Initkey : initialise the public and private keystores in the classpath (/tomcat/shared/classesâ©) + + java -jar alfresco-share-encryption-{version}.jar initkey /tomcat/shared/classesâ© + public key created file: /tomcat/shared/classesâ©/alfresco/web-extension/alfrescoSpringKey.pub + private key created file:/tomcat/shared/classesâ©/alfresco/web-extension/alfrescoSpringKey.pri + The key files have been generated, please set permissions on the private key to keep it protected + +3. Encrypt : encrypt a value + + java -jar alfresco-share-encryption-{version}.jar encrypt /tomcat/shared/classes + Please Enter Value: + Please Repeat Value: + fe6z6Is2VzD8wFTZ3eSikAbv0OpNxCikwVBnfe/LhPdqevCb4G1Vrvt7cTSA9z6OHkSh8ZzyKdEfVNPmTH66QA== + +4. Validate : compare an encrypted value with a value to see if they match + + java -jar alfresco-share-encryption-{version}.jarvalidate /Users/p3700670/work/share/tomcat/shared/classes fe6z6Is2VzD8wFTZ3eSikAbv0OpNxCikwVBnfe/LhPdqevCb4G1Vrvt7cTSA9z6OHkSh8ZzyKdEfVNPmTH66QA== + Please Enter Value: + Please Repeat Value: + The value and encrypted value MATCH + + 5. Add the encrypted password to /tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + using the format: ENC('encypted-value'). + + + + + ENC(hvDxYTho75MVB4sbEzkdTrus6KBV6S5MaDJ/Jpk78b2X5uAvIi02c9A4BEYIu6sHV0mOnJsfHXjLjdQekq4BcQ==) + + SOME_KERBEROS_REALM + + HTTP/SOME_HOST@SOME_KERBEROS_REALM + + ShareHTTP + + true + + + diff --git a/packaging/distribution/src/main/resources/web-extension-samples/custom-slingshot-application-context.xml.sample b/packaging/distribution/src/main/resources/web-extension-samples/custom-slingshot-application-context.xml.sample new file mode 100644 index 0000000000..eee9333078 --- /dev/null +++ b/packaging/distribution/src/main/resources/web-extension-samples/custom-slingshot-application-context.xml.sample @@ -0,0 +1,45 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packaging/distribution/src/main/resources/web-extension-samples/share-config-custom.xml b/packaging/distribution/src/main/resources/web-extension-samples/share-config-custom.xml new file mode 100644 index 0000000000..c19f6d672e --- /dev/null +++ b/packaging/distribution/src/main/resources/web-extension-samples/share-config-custom.xml @@ -0,0 +1,527 @@ + + + + + + + false + + + false + + + + + + + + + + production + + + + + manual + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + 1000 + + + 7000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://localhost:8080/alfresco + + + + + false + + + + application/vnd.openxmlformats-officedocument.wordprocessingml.document + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + application/vnd.ms-powerpoint + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + location.path.documents + + slingshot/doclib/treenode/site/{site}/{container}{path}?children={evaluateChildFoldersSite}&max={maximumFolderCountSite} + + + + + + + + alfresco://company/home + + + + false + + + 500 + + + + true + + + + + + + + secret + + ALFRESCO.ORG + + HTTP/repository.server.com@ALFRESCO.ORG + + ShareHTTP + + true + + + + + + + + + + alfresco-noauth + Alfresco - unauthenticated access + Access to Alfresco Repository WebScripts that do not require authentication + alfresco + http://localhost:8080/alfresco/s + none + + + + alfresco + Alfresco - user access + Access to Alfresco Repository WebScripts that require user authentication + alfresco + http://localhost:8080/alfresco/s + user + + + + alfresco-feed + Alfresco Feed + Alfresco Feed - supports basic HTTP authentication via the EndPointProxyServlet + http + http://localhost:8080/alfresco/s + true + user + + + + alfresco-api + alfresco + Alfresco Public API - user access + Access to Alfresco Repository Public API that require user authentication. + This makes use of the authentication that is provided by parent 'alfresco' endpoint. + alfresco + http://localhost:8080/alfresco/api + user + + + + + + + + 2 + 8 + true + + + false + + + + + + + + + + + + diff --git a/packaging/distribution/src/main/resources/web-extension-samples/smartfolders-amp-actions-config.xml b/packaging/distribution/src/main/resources/web-extension-samples/smartfolders-amp-actions-config.xml new file mode 100644 index 0000000000..f6078bee13 --- /dev/null +++ b/packaging/distribution/src/main/resources/web-extension-samples/smartfolders-amp-actions-config.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packaging/distribution/src/main/resources/web-server/conf/Catalina/localhost/share.xml b/packaging/distribution/src/main/resources/web-server/conf/Catalina/localhost/share.xml new file mode 100644 index 0000000000..faf4a7cb91 --- /dev/null +++ b/packaging/distribution/src/main/resources/web-server/conf/Catalina/localhost/share.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/packaging/docker/.maven-dockerignore b/packaging/docker/.maven-dockerignore new file mode 100644 index 0000000000..112bd18249 --- /dev/null +++ b/packaging/docker/.maven-dockerignore @@ -0,0 +1 @@ +target/docker/ \ No newline at end of file diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile new file mode 100644 index 0000000000..d68ab4d14f --- /dev/null +++ b/packaging/docker/Dockerfile @@ -0,0 +1,30 @@ +FROM alfresco/alfresco-base-tomcat:tomcat9-jre17-rockylinux8-202303081618 + +RUN mkdir -p /usr/local/tomcat/shared/classes/alfresco/web-extension +RUN mkdir -p /usr/local/tomcat/amps_share +RUN mkdir /licenses + +COPY target/war /usr/local/tomcat/webapps +COPY target/alfresco-mmt/* /usr/local/tomcat/alfresco-mmt/ +COPY target/amps_share /usr/local/tomcat/amps_share + +COPY target/classes/web-extension-samples/share-config-custom.xml /usr/local/tomcat/shared/classes/alfresco/web-extension +COPY target/classes/web-extension-samples/custom-slingshot-application-context.xml.sample /usr/local/tomcat/shared/classes/alfresco/web-extension +COPY target/classes/web-extension-samples/smartfolders-amp-actions-config.xml /usr/local/tomcat/shared/classes/alfresco/web-extension + +COPY target/licenses/* /licenses/ + +# not sure if this is needed for share: +RUN sed -i "s/shared.loader=/shared.loader=\${catalina.base}\/shared\/classes/" /usr/local/tomcat/conf/catalina.properties + +COPY substituter.sh /usr/local/tomcat/shared/classes/alfresco +RUN chmod +x /usr/local/tomcat/shared/classes/alfresco/substituter.sh + +# apply amps +RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \ + /usr/local/tomcat/amps_share /usr/local/tomcat/webapps/share -directory -nobackup -force + +ENTRYPOINT ["/usr/local/tomcat/shared/classes/alfresco/substituter.sh", "catalina.sh run"] + +EXPOSE 8000 +LABEL quay.expires-after=${docker.quay-expires.value} diff --git a/packaging/docker/docker-compose/.env b/packaging/docker/docker-compose/.env new file mode 100644 index 0000000000..7919a4ad66 --- /dev/null +++ b/packaging/docker/docker-compose/.env @@ -0,0 +1,26 @@ + +# ALFRESCO REPOSITORY +REPOSITORY_IMAGE=alfresco/alfresco-enterprise-repo-for-share +REPOSITORY_TAG=latest +REPOSITORY_PORT=8080 + +# SHARE IMAGE +SHARE_IMAGE=alfresco/alfresco-share-base +SHARE_TAG=latest +SHARE_PORT=8080 + +#POSTGRES IMAGE +POSTGRES_IMAGE=postgres +POSTGRES_TAG=13.3 +POSTGRES_PORT=5432 + +#SOLR - SEARCH SERVICES IMAGE +SOLR_IMAGE=alfresco/alfresco-search-services +SOLR_TAG=2.0.3 +SOLR_PORT=8983 + +ACTIVEMQ_IMAGE=alfresco/alfresco-activemq +ACTIVEMQ_TAG=5.17.4-jre17-centos7 +TRANSFORM_ROUTER_TAG=3.0.0 +TRANSFORMERS_TAG=4.0.0 +SFS_TAG=0.16.1 diff --git a/packaging/docker/docker-compose/docker-compose.yml b/packaging/docker/docker-compose/docker-compose.yml new file mode 100644 index 0000000000..14d5b65372 --- /dev/null +++ b/packaging/docker/docker-compose/docker-compose.yml @@ -0,0 +1,201 @@ +# This docker-compose file will spin up an ACS cluster on a local host or on a server and it requires a minimum of 14GB Memory to distribute among containers. +# +# For performance tuning, assign the container memory and give a percentage of it to the JVM. +# Use either the -Xms,-Xmx flags or the newly added flags in java 10+: -XX:MaxRAMPercentage and -XX:MinRAMPercentage. More details here: https://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html + +# Note: The docker-compose file from GitHub is a limited trial that goes into read-only mode after 2 days. +# Get the latest docker-compose.yml file with a 30-day trial license by accessing the Alfresco Content Services trial download page at: +# https://www.alfresco.com/platform/content-services-ecm/trial/download + +# Using version 2 as 3 does not support resource constraint options (cpu_*, mem_* limits) for non swarm mode in Compose +version: "2" + +services: + alfresco: + image: ${REPOSITORY_IMAGE}:${REPOSITORY_TAG} + mem_limit: 1900m + environment: + JAVA_TOOL_OPTIONS: " + -Dencryption.keystore.type=JCEKS + -Dencryption.cipherAlgorithm=DESede/CBC/PKCS5Padding + -Dencryption.keyAlgorithm=DESede + -Dencryption.keystore.location=/usr/local/tomcat/shared/classes/alfresco/extension/keystore/keystore + -Dmetadata-keystore.password=mp6yc0UD9e + -Dmetadata-keystore.aliases=metadata + -Dmetadata-keystore.metadata.password=oKIWzVdEdA + -Dmetadata-keystore.metadata.algorithm=DESede + " + JAVA_OPTS: " + -Ddb.driver=org.postgresql.Driver + -Ddb.username=alfresco + -Ddb.password=alfresco + -Ddb.url=jdbc:postgresql://postgres:${POSTGRES_PORT}/alfresco + -Dsolr.host=solr6 + -Dsolr.port=${SOLR_PORT} + -Dsolr.secureComms=secret + -Dsolr.sharedSecret=secret + -Dsolr.base.url=/solr + -Dindex.subsystem.name=solr6 + -Dshare.host=127.0.0.1 + -Dshare.port=${SHARE_PORT} + -Dalfresco.host=localhost + -Dalfresco.port=${REPOSITORY_PORT} + -Daos.baseUrlOverwrite=http://localhost:${REPOSITORY_PORT}/alfresco/aos + -Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\" + -Ddeployment.method=DOCKER_COMPOSE + -Dtransform.service.enabled=true + -Dtransform.service.url=http://transform-router:8095 + -Dsfs.url=http://shared-file-store:8099/ + -DlocalTransform.core-aio.url=http://transform-core-aio:8090/ + -Dcsrf.filter.enabled=false + -Ddsync.service.uris=http://localhost:9090/alfresco + -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80 + " + + transform-router: + mem_limit: 512m + image: quay.io/alfresco/alfresco-transform-router:${TRANSFORM_ROUTER_TAG} + environment: + JAVA_OPTS: " -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80" + ACTIVEMQ_URL: "nio://activemq:61616" + CORE_AIO_URL: "http://transform-core-aio:8090" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ports: + - "8095:8095" + links: + - activemq + + transform-core-aio: + image: alfresco/alfresco-transform-core-aio:2.5.7 + mem_limit: 1536m + environment: + JAVA_OPTS: " -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80" + ACTIVEMQ_URL: "nio://activemq:61616" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ports: + - "8090:8090" + links: + - activemq + + shared-file-store: + image: quay.io/alfresco/alfresco-shared-file-store:${SFS_TAG} + mem_limit: 512m + environment: + JAVA_OPTS: " -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80" + scheduler.content.age.millis: 86400000 + scheduler.cleanup.interval: 86400000 + ports: + - "8099:8099" + volumes: + - shared-file-store-volume:/tmp/Alfresco/sfs + + share: + image: ${SHARE_IMAGE}:${SHARE_TAG} + mem_limit: 1g + environment: + REPO_HOST: "alfresco" + REPO_PORT: "${REPOSITORY_PORT}" + JAVA_OPTS: " + -XX:MinRAMPercentage=50 + -XX:MaxRAMPercentage=80 + -Dalfresco.host=localhost + -Dalfresco.port=${REPOSITORY_PORT} + -Dalfresco.context=alfresco + -Dalfresco.protocol=http + " + + postgres: + image: ${POSTGRES_IMAGE}:${POSTGRES_TAG} + mem_limit: 512m + environment: + - POSTGRES_PASSWORD=alfresco + - POSTGRES_USER=alfresco + - POSTGRES_DB=alfresco + command: postgres -c max_connections=300 -c log_min_messages=LOG + ports: + - "${POSTGRES_PORT}:5432" + + solr6: + image: ${SOLR_IMAGE}:${SOLR_TAG} + mem_limit: 2g + environment: + # Solr needs to know how to register itself with Alfresco + SOLR_ALFRESCO_HOST: "alfresco" + SOLR_ALFRESCO_PORT: "${REPOSITORY_PORT}" + # Alfresco needs to know how to call solr + SOLR_SOLR_HOST: "solr6" + SOLR_SOLR_PORT: "${SOLR_PORT}" + # Create the default alfresco and archive cores + SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive" + # HTTPS or SECRET + ALFRESCO_SECURE_COMMS: "secret" + # SHARED SECRET VALUE + JAVA_TOOL_OPTIONS: " + -Dalfresco.secureComms.secret=secret + " + ports: + - "8083:8983" # Browser port + + activemq: + image: ${ACTIVEMQ_IMAGE}:${ACTIVEMQ_TAG} + mem_limit: 1g + ports: + - "8161:8161" # Web Console + - "5672:5672" # AMQP + - "61616:61616" # OpenWire + - "61613:61613" # STOMP + + digital-workspace: + image: quay.io/alfresco/alfresco-digital-workspace:2.7.0 + mem_limit: 128m + environment: + APP_CONFIG_AUTH_TYPE: "BASIC" + BASE_PATH: ./ + APP_BASE_SHARE_URL: "http://localhost:8080/workspace/#/preview/s" + + control-center: + image: quay.io/alfresco/alfresco-admin-app:7.2.0 + mem_limit: 128m + environment: + APP_CONFIG_PROVIDER: "ECM" + APP_CONFIG_AUTH_TYPE: "BASIC" + BASE_PATH: ./ + + proxy: + image: alfresco/alfresco-acs-nginx:3.3.0 + mem_limit: 128m + depends_on: + - alfresco + - digital-workspace + - control-center + ports: + - "8080:8080" + links: + - digital-workspace + - alfresco + - share + - control-center + + sync-service: + image: quay.io/alfresco/service-sync:3.7.0 + mem_limit: 1g + environment: + JAVA_OPTS: " + -Dsql.db.driver=org.postgresql.Driver + -Dsql.db.url=jdbc:postgresql://postgres:${POSTGRES_PORT}/alfresco + -Dsql.db.username=alfresco + -Dsql.db.password=alfresco + -Dmessaging.broker.host=activemq + -Drepo.hostname=alfresco + -Drepo.port=${REPOSITORY_PORT} + -Ddw.server.applicationConnectors[0].type=http + -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80 + " + ports: + - "9090:9090" + +volumes: + shared-file-store-volume: + driver_opts: + type: tmpfs + device: tmpfs diff --git a/packaging/docker/pom.xml b/packaging/docker/pom.xml new file mode 100644 index 0000000000..569e3b892a --- /dev/null +++ b/packaging/docker/pom.xml @@ -0,0 +1,233 @@ + + 4.0.0 + share-docker + Alfresco Share Docker Image Builder + pom + + + org.alfresco + alfresco-share-packaging + 23.1.0.156-SNAPSHOT + + + + alfresco/alfresco-share-base + ${project.parent.parent.basedir}/scripts + + + + + + src/main/resources + false + + + + + maven-resources-plugin + + + default-resources + + resources + + + + copy-resources + process-resources + + copy-resources + + + ${project.build.directory}/licenses + + + ../licenses + true + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + unpack-resources + process-resources + + unpack + + + + + org.alfresco + share + ${project.version} + war + false + ${project.build.directory}/war/share + share.war + + + + + + copy-resources + process-resources + + copy + + + + + org.alfresco + alfresco-mmt + jar + false + ${project.build.directory}/alfresco-mmt + + + org.alfresco.integrations + alfresco-googledrive-share + amp + false + ${project.build.directory}/amps_share + + + + + + + + + + + + build-docker-images + + + + + io.fabric8 + docker-maven-plugin + + true + + + ${image.name}:${image.tag} + + + + + + build-image + package + + build + + + + + + + + + + build-multiarch-docker-images + + + + io.fabric8 + docker-maven-plugin + + + + ${local.registry}/${image.name}:${image.tag} + + + ${builder.name} + + linux/amd64 + linux/arm64 + + + ${project.basedir} + + + + + + + build-push-image + package + + build + push + + + + + + exec-maven-plugin + org.codehaus.mojo + + + prepare-buildx + generate-sources + + exec + + + ${scripts.directory}/docker/prepare_buildx.sh + + ${builder.name} + ${image.registry} + ${image.name} + ${image.tag} + + + + + + + + + + + push-docker-images + + + + + io.fabric8 + docker-maven-plugin + + true + + + + ${image.name}:${image.tag} + ${image.registry} + + + + + + build-push-image + install + + build + push + + + + + + + + + diff --git a/packaging/docker/src/main/resources/web-extension-samples/custom-slingshot-application-context.xml.sample b/packaging/docker/src/main/resources/web-extension-samples/custom-slingshot-application-context.xml.sample new file mode 100644 index 0000000000..20dd51e83e --- /dev/null +++ b/packaging/docker/src/main/resources/web-extension-samples/custom-slingshot-application-context.xml.sample @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/packaging/docker/src/main/resources/web-extension-samples/share-config-custom.xml b/packaging/docker/src/main/resources/web-extension-samples/share-config-custom.xml new file mode 100644 index 0000000000..65fa6aa3c2 --- /dev/null +++ b/packaging/docker/src/main/resources/web-extension-samples/share-config-custom.xml @@ -0,0 +1,741 @@ + + + + + + + false + + + false + + + + + + + + + + production + + + + + manual + true + + + + + + + + + + + + + Alfresco-CSRFToken + + + + + + + + + + + {token} +
{token}
+ {token} +
+ + + + + + + + /proxy/alfresco/remoteadm/.* + + + It is not allowed to access this url from your browser + + + + + + + POST + /proxy/alfresco/api/publishing/channels/.+ + + + {referer} + + + {origin} + + + + + + + POST + + /page/caches/dependency/clear|/page/index|/page/surfBugStatus|/page/modules/deploy|/page/modules/module|/page/api/javascript/debugger|/page/console + + + + {referer} + + + {origin} + + + + + + + POST + + /page/dologin(\?.+)?|/page/site/[^/]+/start-workflow|/page/start-workflow|/page/context/[^/]+/start-workflow + + + + {referer} + + + {origin} + + + + + + + POST + /page/dologout(\?.+)? + + + {referer} + + + {origin} + + + {token} + {token} + + + + + + + + .+ + + + + + + {token} + {token} + + + + + + + GET + /page/.* + + .+ + .+ + + + + {token} + {token} + + + + + + + POST +
multipart/.+
+ + .+ + +
+ + {token} + {token} + + + {referer} + + + {origin} + +
+ + + + + POST|PUT|DELETE + + .+ + + + + {token} + {token} + + + {referer} + + + {origin} + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + false + + + 1000 + + + 7000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://REPO_HOST:REPO_PORT/alfresco + + + + + false + + + + application/vnd.openxmlformats-officedocument.wordprocessingml.document + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + application/vnd.ms-powerpoint + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + location.path.documents + + slingshot/doclib/treenode/site/{site}/{container}{path}?children={evaluateChildFoldersSite}&max={maximumFolderCountSite} + + + + + + + + alfresco://company/home + + + + false + + + 500 + + + + true + + + + + + + + secret + + ALFRESCO.ORG + + HTTP/repository.server.com@ALFRESCO.ORG + + ShareHTTP + + true + + + + + + + + + + alfresco-noauth + Alfresco - unauthenticated access + Access to Alfresco Repository WebScripts that do not require authentication + alfresco + http://REPO_HOST:REPO_PORT/alfresco/s + none + + + + alfresco + Alfresco - user access + Access to Alfresco Repository WebScripts that require user authentication + alfresco + http://REPO_HOST:REPO_PORT/alfresco/s + user + + + + alfresco-feed + Alfresco Feed + Alfresco Feed - supports basic HTTP authentication via the EndPointProxyServlet + http + http://REPO_HOST:REPO_PORT/alfresco/s + true + user + + + + alfresco-api + alfresco + Alfresco Public API - user access + Access to Alfresco Repository Public API that require user authentication. + This makes use of the authentication that is provided by parent 'alfresco' endpoint. + alfresco + http://REPO_HOST:REPO_PORT/alfresco/api + user + + + + + + + + 2 + 8 + true + + + false + + + + + + + + + + + +
diff --git a/packaging/docker/src/main/resources/web-extension-samples/smartfolders-amp-actions-config.xml b/packaging/docker/src/main/resources/web-extension-samples/smartfolders-amp-actions-config.xml new file mode 100644 index 0000000000..6b6bf41921 --- /dev/null +++ b/packaging/docker/src/main/resources/web-extension-samples/smartfolders-amp-actions-config.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packaging/docker/substituter.sh b/packaging/docker/substituter.sh new file mode 100755 index 0000000000..7e656b1bca --- /dev/null +++ b/packaging/docker/substituter.sh @@ -0,0 +1,37 @@ +#!/bin/sh +set -e + +if [[ $REPO_HOST == "" ]]; then + REPO_HOST=localhost +fi + +if [[ $REPO_PORT == "" ]]; then + REPO_PORT=8080 +fi + +if [[ $USE_SSL == "true" ]]; then +sed -ie 's_port="8080"_port="8080" scheme="https"_' /usr/local/tomcat/conf/server.xml +fi + +echo "Replace 'REPO_HOST' with '$REPO_HOST' and 'REPO_PORT' with '$REPO_PORT'" + +sed -i -e 's/REPO_HOST:REPO_PORT/'"$REPO_HOST:$REPO_PORT"'/g' /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + +echo "NEW -csrf.filter.referer is '$CSRF_FILTER_REFERER'" +echo "NEW -csrf.filter.origin is '$CSRF_FILTER_ORIGIN'" + +if [ "${CSRF_FILTER_REFERER}" != "" ] && [ "${CSRF_FILTER_ORIGIN}" != "" ]; then +# set CSRFPolicy to true and set both properties referer and origin + sed -i -e "s|||" /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + sed -i -e "s|<\/referer>|$CSRF_FILTER_REFERER<\/referer>|" /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + sed -i -e "s|<\/origin>|$CSRF_FILTER_ORIGIN<\/origin>|" /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + +else +# set CSRFPolicy to false and leave empty the properties referer and origin + sed -i -e "s|||" /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + sed -i -e "s|<\/referer>|<\/referer>|" /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + sed -i -e "s|<\/origin>|<\/origin>|" /usr/local/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml +fi + + +bash -c "$@" diff --git a/packaging/docker/tests/docker-env/.env b/packaging/docker/tests/docker-env/.env new file mode 100644 index 0000000000..36d1109c13 --- /dev/null +++ b/packaging/docker/tests/docker-env/.env @@ -0,0 +1,11 @@ +REPOSITORY_TAG=6.2.2 +INSIGHT_ENGINE_TAG=1.4.2 +ZEPPELIN_TAG=1.4.2 +POSTGRES_TAG=13.3 +ACTIVEMQ_TAG=5.15.8 +LEGACY_TRANSFORM_SERVICE_ENABLED=true +LOCAL_TRANSFORM_SERVICE_ENABLED=true +TRANSFORM_SERVICE_ENABLED=true +SYNC_SERVICE_TAG=3.3.3 +HEARTBEAT_ENABLED=false +SELENIUM_VERSION=3.14 diff --git a/packaging/docker/tests/docker-env/docker-compose.yml b/packaging/docker/tests/docker-env/docker-compose.yml new file mode 100644 index 0000000000..87b6a6363f --- /dev/null +++ b/packaging/docker/tests/docker-env/docker-compose.yml @@ -0,0 +1,238 @@ +# This version is for testing and development use. + +# For remote debug we need the CATALINA_OPTS and to expose port 8000. + +version: "3" + +services: + alfresco: + image: alfresco/alfresco-content-repository:${REPOSITORY_TAG} + environment: + CATALINA_OPTS: " + -agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n + " + JAVA_OPTS: " + -Ddb.driver=org.postgresql.Driver + -Ddb.username=alfresco + -Ddb.password=alfresco + -Ddb.url=jdbc:postgresql://postgres:5432/alfresco + -Dalfresco.host=localhost + -Dalfresco.port.ssl=80 + -Dalfresco.protocol=http + -Dalfresco.port=8080 + -Dalfresco.restApi.basicAuthScheme=true + -Dsystem.usages.enabled=true + -Dcsrf.filter.enabled=false + -Dheartbeat.enabled=${HEARTBEAT_ENABLED} + -Dsolr.host=search + -Dsolr.port=8983 + -Dsolr.secureComms=secret + -Dsolr.sharedSecret=secret + -Dsolr.base.url=/solr + -Dindex.subsystem.name=solr6 + -Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos + -Dimap.server.enabled=true + -Dimap.server.port=1143 + -Dimap.server.imaps.port=993 + -Dimap.server.host=0.0.0.0 + -Dmail.protocol=smtp + -Dmail.port=465 + -Dmail.host=smtp.gmail.com + -Demail.inbound.unknownUser=admin@alfresco.com + -Demail.inbound.enabled=true + -Demail.server.enabled=true + -Demail.server.port=1126 + -Dftp.enabled=true + -Dftp.port=1221 + -Dftp.dataPortFrom=30000 + -Dftp.dataPortTo=30099 + -Dshare.host=localhost + + -Dtransform.service.enabled=${TRANSFORM_SERVICE_ENABLED} + -Dtransform.service.url=http://transform-router:8095 + -Dsfs.url=http://shared-file-store:8099/ + + -Dlocal.transform.service.enabled=${LOCAL_TRANSFORM_SERVICE_ENABLED} + -DlocalTransform.pdfrenderer.url=http://alfresco-pdf-renderer:8090/ + -DlocalTransform.imagemagick.url=http://imagemagick:8090/ + -DlocalTransform.libreoffice.url=http://libreoffice:8090/ + -DlocalTransform.tika.url=http://tika:8090/ + -DlocalTransform.misc.url=http://transform-misc:8090/ + + -Dlegacy.transform.service.enabled=${LEGACY_TRANSFORM_SERVICE_ENABLED} + -Dalfresco-pdf-renderer.url=http://alfresco-pdf-renderer:8090/ + -Djodconverter.url=http://libreoffice:8090/ + -Dimg.url=http://imagemagick:8090/ + -Dtika.url=http://tika:8090/ + -Dtransform.misc.url=http://transform-misc:8090/ + + -Dmessaging.broker.url=\"failover:(tcp://activemq:61616)?timeout=3000&jms.useCompression=true\" + -Ddsync.service.uris=http://localhost:8080/alfresco + " + ports: + - "8080:8080" # Browser port + - "8000:8000" # Debug port + - "7203:7203" # JMX connect via service:jmx:rmi:///jndi/rmi://localhost:7203/jmxrmi + - "1143:1143" # IMAP port + - "21:1221" # FTP port + - "30000-30099:30000-30099" # FTP data port + - "446:445" + - "1126:1126" + - "1125:1125" + + share: + image: quay.io/alfresco/alfresco-share-base:latest + environment: + CATALINA_OPTS: " + -agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n + " + REPO_HOST: alfresco + REPO_PORT: 8080 + ports: + - "8181:8080" + - "5005:5005" + + transform-router: + image: quay.io/alfresco/alfresco-transform-router:${TRANSFORM_ROUTER_TAG} + environment: + ACTIVEMQ_URL: "nio://activemq:61616" + ACTIVEMQ_USER: "admin" + ACTIVEMQ_PASSWORD: "admin" + IMAGEMAGICK_URL: "http://imagemagick:8090" + PDF_RENDERER_URL: "http://alfresco-pdf-renderer:8090" + LIBREOFFICE_URL: "http://libreoffice:8090" + TIKA_URL: "http://tika:8090" + MISC_URL: "http://transform-misc:8090" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + links: + - activemq + + alfresco-pdf-renderer: + image: alfresco/alfresco-pdf-renderer:${TRANSFORMERS_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx256m + " + ACTIVEMQ_URL: "nio://activemq:61616" + ACTIVEMQ_USER: "admin" + ACTIVEMQ_PASSWORD: "admin" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ports: + - "8090:8090" + + imagemagick: + image: alfresco/alfresco-imagemagick:${TRANSFORMERS_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx256m + " + ACTIVEMQ_URL: "nio://activemq:61616" + ACTIVEMQ_USER: "admin" + ACTIVEMQ_PASSWORD: "admin" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ports: + - "8091:8090" + + libreoffice: + image: alfresco/alfresco-libreoffice:${TRANSFORMERS_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx256m + " + ACTIVEMQ_URL: "nio://activemq:61616" + ACTIVEMQ_USER: "admin" + ACTIVEMQ_PASSWORD: "admin" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ports: + - "8092:8090" + + tika: + image: alfresco/alfresco-tika:${TRANSFORMERS_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx256m + " + ACTIVEMQ_URL: "nio://activemq:61616" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ACTIVEMQ_USER: "admin" + ACTIVEMQ_PASSWORD: "admin" + ports: + - "8093:8090" + + transform-misc: + image: alfresco/alfresco-transform-misc:${TRANSFORMERS_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx256m + " + ACTIVEMQ_URL: "nio://activemq:61616" + ACTIVEMQ_USER: "admin" + ACTIVEMQ_PASSWORD: "admin" + FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file" + ports: + - "8094:8090" + + shared-file-store: + image: quay.io/alfresco/alfresco-shared-file-store:${TRANSFORM_ROUTER_TAG} + environment: + JAVA_OPTS: " + -Xms256m + -Xmx256m + " + ports: + - "8099:8099" + volumes: + - shared-file-store-volume:/tmp/Alfresco/sfs + + postgres: + image: library/postgres:${POSTGRES_TAG} + environment: + - POSTGRES_PASSWORD=alfresco + - POSTGRES_USER=alfresco + - POSTGRES_DB=alfresco + command: postgres -c max_connections=300 -c log_min_messages=LOG + ports: + - "5432:5432" + + search: + image: quay.io/alfresco/insight-engine:${INSIGHT_ENGINE_TAG} + environment: + # Replication properties + # REPLICATION_TYPE=master + # REPLICATION_AFTER=commit,startup + # REPLICATION_CONFIG_FILES=schema.xml,stopwords.txt + # Solr needs to know how to register itself with Alfresco + SOLR_ALFRESCO_HOST: "alfresco" + SOLR_ALFRESCO_PORT: "8080" + # Alfresco needs to know how to call solr + SOLR_SOLR_HOST: "solr6" + SOLR_SOLR_PORT: "8983" + # Create the default alfresco and archive cores + SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive" + # HTTPS or SECRET + ALFRESCO_SECURE_COMMS: "secret" + # SHARED SECRET VALUE + JAVA_TOOL_OPTIONS: " + -Dalfresco.secureComms.secret=secret + " + ports: + - "8083:8983" # Browser port + + activemq: + image: alfresco/alfresco-activemq:${ACTIVEMQ_TAG} + ports: + - "8161:8161" # Web Console + - "5672:5672" # AMQP + - "61616:61616" # OpenWire + - "61613:61613" # STOMP + +volumes: + shared-file-store-volume: + driver_opts: + type: tmpfs + device: tmpfs diff --git a/packaging/licenses/Apache 2.0.txt b/packaging/licenses/Apache 2.0.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/packaging/licenses/Apache 2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packaging/licenses/BSDlike-ASM.txt b/packaging/licenses/BSDlike-ASM.txt new file mode 100644 index 0000000000..cc529ed123 --- /dev/null +++ b/packaging/licenses/BSDlike-ASM.txt @@ -0,0 +1,29 @@ +Copyright (c) 2000-2005 INRIA, France Telecom +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packaging/licenses/BSDlike-Dojo.txt b/packaging/licenses/BSDlike-Dojo.txt new file mode 100644 index 0000000000..4bb1cc7e6e --- /dev/null +++ b/packaging/licenses/BSDlike-Dojo.txt @@ -0,0 +1,195 @@ +Dojo is available under *either* the terms of the modified BSD license *or* the +Academic Free License version 2.1. As a recipient of Dojo, you may choose which +license to receive this code under (except as noted in per-module LICENSE +files). Some modules may not be the copyright of the Dojo Foundation. These +modules contain explicit declarations of copyright in both the LICENSE files in +the directories in which they reside and in the code itself. No external +contributions are allowed under licenses which are fundamentally incompatible +with the AFL or BSD licenses that Dojo is distributed under. + +The text of the AFL and BSD licenses is reproduced below. + +------------------------------------------------------------------------------- +The "New" BSD License: +********************** + +Copyright (c) 2005-2014, The Dojo Foundation +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Dojo Foundation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- +The Academic Free License, v. 2.1: +********************************** + +This Academic Free License (the "License") applies to any original work of +authorship (the "Original Work") whose owner (the "Licensor") has placed the +following notice immediately following the copyright notice for the Original +Work: + +Licensed under the Academic Free License version 2.1 + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, +royalty-free, non-exclusive, perpetual, sublicenseable license to do the +following: + +a) to reproduce the Original Work in copies; + +b) to prepare derivative works ("Derivative Works") based upon the Original +Work; + +c) to distribute copies of the Original Work and Derivative Works to the +public; + +d) to perform the Original Work publicly; and + +e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, +royalty-free, non-exclusive, perpetual, sublicenseable license, under patent +claims owned or controlled by the Licensor that are embodied in the Original +Work as furnished by the Licensor, to make, use, sell and offer for sale the +Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred +form of the Original Work for making modifications to it and all available +documentation describing how to modify the Original Work. Licensor hereby +agrees to provide a machine-readable copy of the Source Code of the Original +Work along with each copy of the Original Work that Licensor distributes. +Licensor reserves the right to satisfy this obligation by placing a +machine-readable copy of the Source Code in an information repository +reasonably calculated to permit inexpensive and convenient access by You for as +long as Licensor continues to distribute the Original Work, and by publishing +the address of that information repository in a notice immediately following +the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names +of any contributors to the Original Work, nor any of their trademarks or +service marks, may be used to endorse or promote products derived from this +Original Work without express prior written permission of the Licensor. Nothing +in this License shall be deemed to grant any rights to trademarks, copyrights, +patents, trade secrets or any other intellectual property of Licensor except as +expressly stated herein. No patent license is granted to make, use, sell or +offer to sell embodiments of any patent claims other than the licensed claims +defined in Section 2. No right is granted to the trademarks of Licensor even if +such marks are included in the Original Work. Nothing in this License shall be +interpreted to prohibit Licensor from licensing under different terms from this +License any Original Work that Licensor otherwise would have a right to +license. + +5) This section intentionally omitted. + +6) Attribution Rights. You must retain, in the Source Code of any Derivative +Works that You create, all copyright, patent or trademark notices from the +Source Code of the Original Work, as well as any notices of licensing and any +descriptive text identified therein as an "Attribution Notice." You must cause +the Source Code for any Derivative Works that You create to carry a prominent +Attribution Notice reasonably calculated to inform recipients that You have +modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that +the copyright in and to the Original Work and the patent rights granted herein +by Licensor are owned by the Licensor or are sublicensed to You under the terms +of this License with the permission of the contributor(s) of those copyrights +and patent rights. Except as expressly stated in the immediately proceeding +sentence, the Original Work is provided under this License on an "AS IS" BASIS +and WITHOUT WARRANTY, either express or implied, including, without limitation, +the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. +This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No +license to Original Work is granted hereunder except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, +whether in tort (including negligence), contract, or otherwise, shall the +Licensor be liable to any person for any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License +or the use of the Original Work including, without limitation, damages for loss +of goodwill, work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses. This limitation of liability shall not +apply to liability for death or personal injury resulting from Licensor's +negligence to the extent applicable law prohibits such limitation. Some +jurisdictions do not allow the exclusion or limitation of incidental or +consequential damages, so this exclusion and limitation may not apply to You. + +9) Acceptance and Termination. If You distribute copies of the Original Work or +a Derivative Work, You must make a reasonable effort under the circumstances to +obtain the express assent of recipients to the terms of this License. Nothing +else but this License (or another written agreement between Licensor and You) +grants You permission to create Derivative Works based upon the Original Work +or to exercise any of the rights granted in Section 1 herein, and any attempt +to do so except under the terms of this License (or another written agreement +between Licensor and You) is expressly prohibited by U.S. copyright law, the +equivalent laws of other countries, and by international treaty. Therefore, by +exercising any of the rights granted to You in Section 1 herein, You indicate +Your acceptance of this License and all of its terms and conditions. + +10) Termination for Patent Action. This License shall terminate automatically +and You may no longer exercise any of the rights granted to You by this License +as of the date You commence an action, including a cross-claim or counterclaim, +against Licensor or any licensee alleging that the Original Work infringes a +patent. This termination provision shall not apply for an action alleging +patent infringement by combinations of the Original Work with other software or +hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this +License may be brought only in the courts of a jurisdiction wherein the +Licensor resides or in which Licensor conducts its primary business, and under +the laws of that jurisdiction excluding its conflict-of-law provisions. The +application of the United Nations Convention on Contracts for the International +Sale of Goods is expressly excluded. Any use of the Original Work outside the +scope of this License or after its termination shall be subject to the +requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et +seq., the equivalent laws of other countries, and international treaty. This +section shall survive the termination of this License. + +12) Attorneys Fees. In any action to enforce the terms of this License or +seeking damages relating thereto, the prevailing party shall be entitled to +recover its costs and expenses, including, without limitation, reasonable +attorneys' fees and costs incurred in connection with such action, including +any appeal of such action. This section shall survive the termination of this +License. + +13) Miscellaneous. This License represents the complete agreement concerning +the subject matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent necessary to +make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether +in upper or lower case, means an individual or a legal entity exercising rights +under, and complying with all of the terms of, this License. For legal +entities, "You" includes any entity that controls, is controlled by, or is +under common control with you. For purposes of this definition, "control" means +(i) the power, direct or indirect, to cause the direction or management of such +entity, whether by contract or otherwise, or (ii) ownership of fifty percent +(50%) or more of the outstanding shares, or (iii) beneficial ownership of such +entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise +restricted or conditioned by this License or by law, and Licensor promises not +to interfere with or be responsible for such uses by You. + +This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. +Permission is hereby granted to copy and distribute this license without +modification. This license may not be modified without the express written +permission of its copyright owner. diff --git a/packaging/licenses/BSDlike-Jaxen.txt b/packaging/licenses/BSDlike-Jaxen.txt new file mode 100644 index 0000000000..1684786a16 --- /dev/null +++ b/packaging/licenses/BSDlike-Jaxen.txt @@ -0,0 +1,33 @@ +/* + $Id: LICENSE.txt 1128 2006-02-05 21:49:04Z elharo $ + + Copyright 2003-2006 The Werken Company. All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the Jaxen Project nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ diff --git a/packaging/licenses/BSDlike-XMP.txt b/packaging/licenses/BSDlike-XMP.txt new file mode 100644 index 0000000000..ce10be769e --- /dev/null +++ b/packaging/licenses/BSDlike-XMP.txt @@ -0,0 +1,13 @@ +The BSD License + +Copyright (c) 2009, Adobe Systems Incorporated All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of Adobe Systems Incorporated, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packaging/licenses/BSDlike-XStream.txt b/packaging/licenses/BSDlike-XStream.txt new file mode 100644 index 0000000000..28b455b846 --- /dev/null +++ b/packaging/licenses/BSDlike-XStream.txt @@ -0,0 +1,28 @@ +(BSD Style License) + +Copyright (c) 2003-2006, Joe Walnes +Copyright (c) 2006-2011, XStream Committers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +Neither the name of XStream nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/packaging/licenses/BSDlike-YUI.txt b/packaging/licenses/BSDlike-YUI.txt new file mode 100644 index 0000000000..8fc4188195 --- /dev/null +++ b/packaging/licenses/BSDlike-YUI.txt @@ -0,0 +1,145 @@ +Software License Agreement (BSD License) +======================================== + +Copyright (c) 2013, Yahoo! Inc. All rights reserved. +---------------------------------------------------- + +Redistribution and use of this software in source and binary forms, with or +without modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Yahoo! Inc. nor the names of YUI's contributors may be + used to endorse or promote products derived from this software without + specific prior written permission of Yahoo! Inc. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Sources of Intellectual Property Included in the YUI Library +------------------------------------------------------------ + +YUI is issued by Yahoo! under the BSD license above. Below is a list of certain +publicly available software that is the source of intellectual property in YUI, +along with the licensing terms that pertain to those sources of IP. This list is +for informational purposes only and is not intended to represent an exhaustive +list of third party contributions to YUI. + + * **Douglas Crockford's JSON parsing and stringifying methods:** In the JSON + Utility, Douglas Crockford's JSON parsing and stringifying methods are + adapted from work published at [JSON.org](http://json.org/). The adapted + work is in the public domain. + + * **Robert Penner's animation-easing algorithms:** In the Animation Utility, + YUI makes use of Robert Penner's algorithms for easing. + + * **Diego Perini's IEContentLoaded technique:** The Event Utility employs + [a technique developed by Diego Perini](http://javascript.nwbox.com/IEContentLoaded/) + and licensed under GPL. YUI's use of this technique is included under our + BSD license with the author's permission. + + * **Handlebars.js**: The Handlebars component is a YUI port of + [Handlebars.js](https://github.com/wycats/handlebars.js) by Yehuda Katz. It + is distributed with YUI under the terms of the MIT License below. + + * **asap.js**: The timers component includes the Asap.js module by Kris Kowal. + It is distributed with YUI under the terms of the MIT License below. + + +Handlebars.js MIT License +------------------------- + +Copyright (C) 2011 by Yehuda Katz + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Normalize.css MIT License +------------------------- + +Copyright (c) Nicolas Gallagher and Jonathan Neal + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Benchmark.js MIT License +------------------------- +Copyright 2010-2013 Mathias Bynens +Based on JSLitmus.js, copyright Robert Kieffer +Modified by John-David Dalton + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Asap.js MIT License +------------------- +Copyright 2009–2013 Contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/packaging/licenses/BSDlike-dom4j.txt b/packaging/licenses/BSDlike-dom4j.txt new file mode 100644 index 0000000000..a90650a4bc --- /dev/null +++ b/packaging/licenses/BSDlike-dom4j.txt @@ -0,0 +1,40 @@ +Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. + +Redistribution and use of this software and associated documentation +("Software"), with or without modification, are permitted provided +that the following conditions are met: + +1. Redistributions of source code must retain copyright + statements and notices. Redistributions must also contain a + copy of this document. + +2. Redistributions in binary form must reproduce the + above copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. The name "DOM4J" must not be used to endorse or promote + products derived from this Software without prior written + permission of MetaStuff, Ltd. For written permission, + please contact dom4j-info@metastuff.com. + +4. Products derived from this Software may not be called "DOM4J" + nor may "DOM4J" appear in their names without prior written + permission of MetaStuff, Ltd. DOM4J is a registered + trademark of MetaStuff, Ltd. + +5. Due credit should be given to the DOM4J Project - + http://www.dom4j.org + +THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packaging/licenses/BSDlike-protobuf-java.txt b/packaging/licenses/BSDlike-protobuf-java.txt new file mode 100644 index 0000000000..19b305b000 --- /dev/null +++ b/packaging/licenses/BSDlike-protobuf-java.txt @@ -0,0 +1,32 @@ +Copyright 2008 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. diff --git a/packaging/licenses/BSDlike-stax2.txt b/packaging/licenses/BSDlike-stax2.txt new file mode 100644 index 0000000000..07fa368f4a --- /dev/null +++ b/packaging/licenses/BSDlike-stax2.txt @@ -0,0 +1,20 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/packaging/licenses/BSDlike-urlrewritefilter.txt b/packaging/licenses/BSDlike-urlrewritefilter.txt new file mode 100644 index 0000000000..88d5c070cc --- /dev/null +++ b/packaging/licenses/BSDlike-urlrewritefilter.txt @@ -0,0 +1,38 @@ + +Copyright (c) 2005-2012, Paul Tuckey +All rights reserved. +==================================================================== +Licensed under the BSD License. Text as follows. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + - Neither the name tuckey.org nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +==================================================================== + +Please note that some code used in UrlRewriteFilter is under other +permissive licenses. + +==================================================================== diff --git a/packaging/licenses/BSDlike-yuicompressor.txt b/packaging/licenses/BSDlike-yuicompressor.txt new file mode 100644 index 0000000000..2bcc856a00 --- /dev/null +++ b/packaging/licenses/BSDlike-yuicompressor.txt @@ -0,0 +1,54 @@ +YUI Compressor Copyright License Agreement (BSD License) + +Copyright (c) 2013, Yahoo! Inc. +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of Yahoo! Inc. nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of Yahoo! Inc. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software also requires access to software from the following sources: + +The Jarg Library v 1.0 ( http://jargs.sourceforge.net/ ) is available +under a BSD License � Copyright (c) 2001-2003 Steve Purcell, +Copyright (c) 2002 Vidar Holen, Copyright (c) 2002 Michal Ceresna and +Copyright (c) 2005 Ewan Mellor. + +The Rhino Library ( http://www.mozilla.org/rhino/ ) is dually available +under an MPL 1.1/GPL 2.0 license, with portions subject to a BSD license. + +Additionally, this software contains modified versions of the following +component files from the Rhino Library: + +[org/mozilla/javascript/Decompiler.java] +[org/mozilla/javascript/Parser.java] +[org/mozilla/javascript/Token.java] +[org/mozilla/javascript/TokenStream.java] + +The modified versions of these files are distributed under the MPL v 1.1 +( http://www.mozilla.org/MPL/MPL-1.1.html ) diff --git a/packaging/licenses/CDDL-1.0.txt b/packaging/licenses/CDDL-1.0.txt new file mode 100644 index 0000000000..52f3c1fc4d --- /dev/null +++ b/packaging/licenses/CDDL-1.0.txt @@ -0,0 +1,183 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + + * + + 1. Definitions. + o + + 1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications. + o + + 1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + o + + 1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + o + + 1.4. "Executable" means the Covered Software in any form other than Source Code. + o + + 1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License. + o + + 1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + o + + 1.7. "License" means this document. + o + + 1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + o + + 1.9. "Modifications" means the Source Code and Executable form of any of the following: + + + + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + + + + B. Any new file that contains any part of the Original Software or previous Modification; or + + + + C. Any new file that is contributed or otherwise made available under the terms of this License. + o + + 1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License. + o + + 1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + o + + 1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + o + + 1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + * + + 2. License Grants. + o + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + + + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + + + + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + + + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + o + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + + + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + * + + 3. Distribution Obligations. + o + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + o + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + o + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + o + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients� rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + o + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient�s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + o + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + * + + 4. Versions of the License. + o + + 4.1. New Versions. + + Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + o + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + o + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + * + + 5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + * + + 6. TERMINATION. + o + + 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + o + + 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + o + + 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + * + + 7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY�S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + * + + 8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. � 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + * + + 9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction�s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys� fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + * + + 10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + * + + NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) + + The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. diff --git a/packaging/licenses/CDDL-1.1.txt b/packaging/licenses/CDDL-1.1.txt new file mode 100644 index 0000000000..b2c3d26f3c --- /dev/null +++ b/packaging/licenses/CDDL-1.1.txt @@ -0,0 +1,107 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1 + +1. Definitions. + +1.1. “Contributor†means each individual or entity that creates or contributes to the creation of Modifications. + +1.2. “Contributor Version†means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + +1.3. “Covered Software†means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + +1.4. “Executable†means the Covered Software in any form other than Source Code. + +1.5. “Initial Developer†means the individual or entity that first makes Original Software available under this License. + +1.6. “Larger Work†means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + +1.7. “License†means this document. + +1.8. “Licensable†means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.9. “Modifications†means the Source Code and Executable form of any of the following: +A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; +B. Any new file that contains any part of the Original Software or previous Modification; or +C. Any new file that is contributed or otherwise made available under the terms of this License. + +1.10. “Original Software†means the Source Code and Executable form of computer software code that is originally released under this License. + +1.11. “Patent Claims†means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.12. “Source Code†means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + +1.13. “You†(or “Yourâ€) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You†includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control†means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + +2.1. The Initial Developer Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: +(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and +(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). +(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. +(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + +2.2. Contributor Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: +(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and +(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). +(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. +(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Availability of Source Code. +Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + +3.2. Modifications. +The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + +3.3. Required Notices. +You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + +3.4. Application of Additional Terms. +You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.5. Distribution of Executable Versions. +You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.6. Larger Works. +You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + +4.1. New Versions. +Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + +4.2. Effect of New Versions. +You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + +4.3. Modified Versions. +When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS†BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + +6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participantâ€) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + +6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. +The Covered Software is a “commercial item,†as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software†(as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation†as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. diff --git a/packaging/licenses/CPL 1.0.txt b/packaging/licenses/CPL 1.0.txt new file mode 100644 index 0000000000..6eae125eb4 --- /dev/null +++ b/packaging/licenses/CPL 1.0.txt @@ -0,0 +1,214 @@ +Common Public License Version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and +documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are +distributed by that particular Contributor. A Contribution 'originates' from a +Contributor if it was added to the Program by such Contributor itself or anyone +acting on such Contributor's behalf. Contributions do not include additions to +the Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) are not +derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free copyright license to +reproduce, prepare derivative works of, publicly display, publicly perform, +distribute and sublicense the Contribution of such Contributor, if any, and such +derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed +Patents to make, use, sell, offer to sell, import and otherwise transfer the +Contribution of such Contributor, if any, in source code and object code form. +This patent license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, such +addition of the Contribution causes such combination to be covered by the +Licensed Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses +to its Contributions set forth herein, no assurances are provided by any +Contributor that the Program does not infringe the patent or other intellectual +property rights of any other entity. Each Contributor disclaims any liability to +Recipient for claims brought by any other entity based on infringement of +intellectual property rights or otherwise. As a condition to exercising the +rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. +For example, if a third party patent license is required to allow Recipient to +distribute the Program, it is Recipient's responsibility to acquire that license +before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright license set +forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its +own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title and +non-infringement, and implied warranties or conditions of merchantability and +fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and consequential +damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered +by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such +Contributor, and informs licensees how to obtain it in a reasonable manner on or +through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the +Program. + +Each Contributor must identify itself as the originator of its Contribution, if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, if +a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages +and costs (collectively "Losses") arising from claims, lawsuits and other legal +actions brought by a third party against the Indemnified Contributor to the +extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor to +control, and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may participate in +any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If that +Commercial Contributor then makes performance claims, or offers warranties +related to Product X, those performance claims and warranties are such +Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its exercise of +rights under this Agreement, including but not limited to the risks and costs of +program errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS +GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this Agreement, and without further action by the parties hereto, such +provision shall be reformed to the minimum extent necessary to make such +provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to +a patent applicable to software (including a cross-claim or counterclaim in a +lawsuit), then any patent licenses granted by that Contributor to such Recipient +under this Agreement shall terminate as of the date such litigation is filed. In +addition, if Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted under +Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to time. +No one other than the Agreement Steward has the right to modify this Agreement. +IBM is the initial Agreement Steward. IBM may assign the responsibility to serve +as the Agreement Steward to a suitable separate entity. Each new version of the +Agreement will be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the Agreement +is published, Contributor may elect to distribute the Program (including its +Contributions) under the new version. Except as expressly stated in Sections +2(a) and 2(b) above, Recipient receives no rights or licenses to the +intellectual property of any Contributor under this Agreement, whether +expressly, by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + diff --git a/packaging/licenses/GPL2-with-classpath-exception.txt b/packaging/licenses/GPL2-with-classpath-exception.txt new file mode 100644 index 0000000000..8371a05fb2 --- /dev/null +++ b/packaging/licenses/GPL2-with-classpath-exception.txt @@ -0,0 +1,352 @@ + +GNU General Public License, version 2, +with the Classpath Exception + +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must +make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of + this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code +distributed need not include anything that is normally distributed (in either +source or binary form) with the major components (compiler, kernel, and so on) +of the operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not +accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to +copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance by +third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software Foundation. +If the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE +PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., 59 + Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes + with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free + software, and you are welcome to redistribute it under certain conditions; + type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than 'show w' and 'show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + 'Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + diff --git a/packaging/licenses/JSON.txt b/packaging/licenses/JSON.txt new file mode 100644 index 0000000000..182b5294c7 --- /dev/null +++ b/packaging/licenses/JSON.txt @@ -0,0 +1,11 @@ +JSON License + +Copyright (c) 2002 JSON.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packaging/licenses/LGPL 3.0.txt b/packaging/licenses/LGPL 3.0.txt new file mode 100644 index 0000000000..3f7b8b1e5c --- /dev/null +++ b/packaging/licenses/LGPL 3.0.txt @@ -0,0 +1,166 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/packaging/licenses/MIT-args4j.txt b/packaging/licenses/MIT-args4j.txt new file mode 100644 index 0000000000..c49840b2cf --- /dev/null +++ b/packaging/licenses/MIT-args4j.txt @@ -0,0 +1,19 @@ +Copyright (c) 2013 Kohsuke Kawaguchi and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packaging/licenses/MIT-slf4j.txt b/packaging/licenses/MIT-slf4j.txt new file mode 100644 index 0000000000..5d3a83bd59 --- /dev/null +++ b/packaging/licenses/MIT-slf4j.txt @@ -0,0 +1,24 @@ +Copyright (c) 2004-2014 QOS.ch +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + diff --git a/packaging/licenses/Mozilla Public License version 2.0.txt b/packaging/licenses/Mozilla Public License version 2.0.txt new file mode 100644 index 0000000000..14e2f777f6 --- /dev/null +++ b/packaging/licenses/Mozilla Public License version 2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/packaging/pom.xml b/packaging/pom.xml new file mode 100644 index 0000000000..6bd8b8839a --- /dev/null +++ b/packaging/pom.xml @@ -0,0 +1,38 @@ + + 4.0.0 + alfresco-share-packaging + Packaging Alfresco Share + pom + + + org.alfresco + alfresco-share-parent + 23.1.0.156-SNAPSHOT + + + + ${basedir}/../../.. + + + + distribution + webeditor + wcmqs + docker + tests + + + + + docker-alfresco + + + docker-alfresco/pom.xml + + + + docker-alfresco + + + + diff --git a/packaging/tests/pom.xml b/packaging/tests/pom.xml new file mode 100644 index 0000000000..e9abbd97ef --- /dev/null +++ b/packaging/tests/pom.xml @@ -0,0 +1,11 @@ + + 4.0.0 + alfresco-share-tests + pom + + + org.alfresco + alfresco-share-packaging + 23.1.0.156-SNAPSHOT + + diff --git a/packaging/wcmqs/pom.xml b/packaging/wcmqs/pom.xml new file mode 100644 index 0000000000..aa0bd191e5 --- /dev/null +++ b/packaging/wcmqs/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + alfresco-wcmqs-distribution + jar + Alfresco WCMQS Distribution Zip + + + org.alfresco + alfresco-share-packaging + 23.1.0.156-SNAPSHOT + + + + alfresco-wcmqs-${project.version} + + + maven-dependency-plugin + + + fetch-artifacts + prepare-package + + copy + + + + + org.alfresco + alfresco-web-editor + ${project.version} + war + awe.war + + + org.alfresco + alfresco-wcmqs-web + ${project.version} + war + wcmqs.war + + + org.alfresco + alfresco-wcmqs + ${project.version} + amp + alfresco-wcmqs.amp + + + org.alfresco + alfresco-wcmqs-share + ${project.version} + amp + alfresco-wcmqs-share.amp + + + + + + unpack-config + prepare-package + + unpack + + + + + org.alfresco + alfresco-wcmqs-web + ${project.version} + war + ${project.build.directory} + WEB-INF/classes/alfresco/web-extension/awe-config-custom.xml + + + + + + + + + maven-assembly-plugin + + + make-assembly + package + + single + + + + + false + + src/assembly/wcmqs-distribution.xml + + + + + + + diff --git a/packaging/wcmqs/src/assembly/wcmqs-distribution.xml b/packaging/wcmqs/src/assembly/wcmqs-distribution.xml new file mode 100644 index 0000000000..9366b8797d --- /dev/null +++ b/packaging/wcmqs/src/assembly/wcmqs-distribution.xml @@ -0,0 +1,20 @@ + + wcmqs-distribution + + zip + + false + + + + target/dependency + + + + target/WEB-INF/classes/alfresco/web-extension/ + + + + + diff --git a/packaging/webeditor/pom.xml b/packaging/webeditor/pom.xml new file mode 100644 index 0000000000..5bcf5bb155 --- /dev/null +++ b/packaging/webeditor/pom.xml @@ -0,0 +1,126 @@ + + 4.0.0 + alfresco-webeditor-distribution + pom + Alfresco WebEditor Distribution Zip + + + org.alfresco + alfresco-share-packaging + 23.1.0.156-SNAPSHOT + + + + + alfresco-webeditor-${project.version} + + + maven-dependency-plugin + + + + unpack-taglib-files + generate-resources + + unpack + + + + + org.alfresco + alfresco-web-editor + ${project.version} + classes + org/alfresco/web/awe/** + ${project.build.outputDirectory}/taglib + + + org.alfresco + alfresco-web-editor + ${project.version} + war + **/awe.tld + ${project.build.outputDirectory} + + + + + + + fetch-artifacts + prepare-package + + copy + + + + + org.alfresco + alfresco-web-editor + ${project.version} + war + awe.war + + + org.alfresco + alfresco-web-editor-samples + ${project.version} + war + customer.war + + + org.alfresco + alfresco-web-editor-plugin + ${project.version} + + + org.alfresco + alfresco-web-framework-commons + classes + ${project.version} + + + org.alfresco.surf + spring-webeditor + ${dependency.surf.version} + + + org.alfresco.surf + spring-webeditor-client-jsp + ${dependency.surf.version} + + + com.yahoo.platform.yui + yui + ${dependency.yui.version} + zip + + + + + + + + + maven-assembly-plugin + + + make-assembly + package + + single + + + + + false + + src/assembly/webeditor-taglib.xml + src/assembly/webeditor-distribution.xml + + + + + + + diff --git a/packaging/webeditor/src/assembly/webeditor-distribution.xml b/packaging/webeditor/src/assembly/webeditor-distribution.xml new file mode 100644 index 0000000000..b7a3a6d02b --- /dev/null +++ b/packaging/webeditor/src/assembly/webeditor-distribution.xml @@ -0,0 +1,22 @@ + + webeditor-distribution + + zip + + false + + + + ${project.build.directory}/dependency + + + + + + ${project.build.directory}/${build.finalName}.jar + alfresco-webeditor-taglib-${project.version}.jar + + + + diff --git a/packaging/webeditor/src/assembly/webeditor-taglib.xml b/packaging/webeditor/src/assembly/webeditor-taglib.xml new file mode 100644 index 0000000000..a8646e53ec --- /dev/null +++ b/packaging/webeditor/src/assembly/webeditor-taglib.xml @@ -0,0 +1,20 @@ + + webeditor-taglib + + jar + + false + + + + ${project.build.outputDirectory}/taglib + + + + ${project.build.outputDirectory}/WEB-INF + META-INF + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..de45df1434 --- /dev/null +++ b/pom.xml @@ -0,0 +1,823 @@ + + 4.0.0 + alfresco-share-parent + 23.1.0.156-SNAPSHOT + pom + Alfresco Share Parent + + + org.alfresco + alfresco-super-pom + 12 + + + + share + web-framework-commons + web-editor + web-editor-plugin + web-editor-samples/customer-site + wcmquickstart-module + share-encryption + packaging + amps + alfresco-tas-share-test + + + + 23 + 1 + 0 + ${version.major}.0.0 + + 23.1.0.157 + 23.1.0.144 + + 3.0.0 + 4.0.0 + 23.1.0-A1 + + quay.io + latest + 127.0.0.1:5000 + entitled-builder + + + 17 + ${java.version} + ${java.version} + ${java.version} + ${java.version} + -Xmx2G -Duser.language=en -Dcom.sun.management.jmxremote + + + 5.3.18 + 2.9.0-alfresco-20141223 + + 1.0.127 + 2.3.30 + 1.7.12 + 4.5.13 + 7.1 + + 8.44 + 8.29 + 2.2.0 + 2.1.3 + 2.0.3 + 1.7.30 + 3.4.10 + 1.9.4 + 1.2.5 + 2.14.0-rc1 + 2.3.3 + 20230227 + 1.4.11.1 + 5.7.5 + + 3.4.1 + + + ${basedir}/.. + ${runtime.parent.folder}/runtime + ${runtime.parent.folder}/tomcat + ${runtime.data.folder}/solr4-instance + ${runtime.tomcat.conf.folder}/shared/classes/alfresco-global.properties + + ${runtime.data.folder}/alf_data + + true + ${project.build.directory} + convert + pdf2swf + + 3.0 + ${maven.multiModuleProjectDirectory} + + ${dependency.alfresco-enterprise-repo.version} + 1w + 2.19.0 + + + + scm:git:https://github.com/Alfresco/alfresco-enterprise-share.git/ + scm:git:https://github.com/Alfresco/alfresco-enterprise-share.git + https://github.com/Alfresco/alfresco-enterprise-share + HEAD + + + + + alfresco-internal + https://artifacts.alfresco.com/nexus/content/repositories/releases + + + + + + + + org.alfresco + alfresco-jlan-embed + ${dependency.alfresco-jlan.version} + + + org.alfresco.surf + spring-webscripts + ${dependency.webscripts.version} + + + org.alfresco.surf + spring-webscripts-api + ${dependency.webscripts.version} + + + org.alfresco.surf + spring-surf-core + ${dependency.webscripts.version} + + + org.alfresco.surf + spring-surf-core-configservice + ${dependency.webscripts.version} + + + org.alfresco.surf + spring-surf + ${dependency.surf.version} + + + + com.asual.lesscss + lesscss-engine + + + + + org.alfresco.surf + spring-surf-api + ${dependency.surf.version} + + + org.apache.httpcomponents + httpclient + ${dependency.httpcomponents.version} + + + org.apache.httpcomponents + httpmime + ${dependency.httpcomponents.version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + commons-fileupload + commons-fileupload + 1.5 + + + + org.apache.cxf + cxf-core + ${dependency.cxf.version} + + + org.apache.cxf + cxf-rt-frontend-jaxws + ${dependency.cxf.version} + + + org.apache.cxf + cxf-rt-transports-http + ${dependency.cxf.version} + + + org.apache.cxf + cxf-rt-ws-policy + ${dependency.cxf.version} + + + commons-beanutils + commons-beanutils + ${dependency.beanutils.version} + + + + org.springframework.security + spring-security-oauth2-client + ${spring.security.version} + + + org.springframework.security + spring-security-oauth2-jose + ${spring.security.version} + + + + org.apache.maven + maven-artifact + 3.6.3 + + + + org.apache.taglibs + taglibs-standard-spec + ${dependency.apache.taglibs.version} + + + org.apache.taglibs + taglibs-standard-impl + ${dependency.apache.taglibs.version} + + + org.apache.taglibs + taglibs-standard-jstlel + ${dependency.apache.taglibs.version} + + + com.fasterxml.jackson.core + jackson-databind + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${dependency.jackson.version} + + + org.slf4j + jcl-over-slf4j + ${dependency.jcl-over-slf4j.version} + + + org.slf4j + slf4j-api + ${dependency.slf4j.version} + + + org.apache.logging.log4j + log4j-slf4j2-impl + ${dependency.log4j.version} + + + org.apache.logging.log4j + log4j-core + ${dependency.log4j.version} + + + junit + junit + 4.13.1 + test + + + + org.alfresco + alfresco-mmt + ${dependency.alfresco-community-repo.version} + + + + org.alfresco.integrations + alfresco-googledrive-share + ${alfresco.googledrive.version} + amp + + + + + jakarta.xml.bind + jakarta.xml.bind-api + ${dependency.jakarta-jaxb-api.version} + + + org.glassfish.jaxb + jaxb-runtime + ${dependency.jakarta-jaxb-api.version} + + + + org.json + json + ${dependency.org-json.version} + + + com.google.code.gson + gson + 2.8.9 + + + + + + + + com.mycila + license-maven-plugin + ${license-maven-plugin.version} + + + + + + + + + + + + + + + + + + + + + + + + + org.codehaus.mojo + license-maven-plugin + 2.0.1 + + + third-party-licenses + + add-third-party + + generate-resources + + true + provided,test + org.alfresco + false + https://raw.githubusercontent.com/Alfresco/third-party-license-overrides/master/includedLicenses.txt + https://raw.githubusercontent.com/Alfresco/third-party-license-overrides/master/licenseMerges.txt + https://raw.githubusercontent.com/Alfresco/third-party-license-overrides/master/override-THIRD-PARTY.properties + + + + + + org.alfresco.maven.plugin + alfresco-maven-plugin + ${dependency.alfresco-sdk.version} + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M3 + + + enforcer + + enforce + + + + + [1.8.0,) + + + + + + + + + org.codehaus.mojo + properties-maven-plugin + + + + read-alfresco-global-properties + initialize + + read-project-properties + + + + ${alfresco.properties.file} + + true + + + + + + + maven-antrun-plugin + + + set-default-db-props-on-initialize + initialize + + run + + + true + + + + + + + + + + + + + + + + + + + + maven-jar-plugin + + + create-test-jar + + test-jar + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-shared-classes + generate-test-sources + + add-test-resource + + + + + ${runtime.tomcat.conf.folder}/shared/classes + + + + + + + + + net.alchim31.maven + yuicompressor-maven-plugin + 1.5.1 + + + + + + + + maven-release-plugin + 2.5.3 + + @{project.version} + + + + maven-jar-plugin + 3.2.0 + + + + ${version.major}.${version.minor}.${version.revision} + ${project.version} + ${env.TRAVIS_BUILD_NUMBER} + + + + + + maven-war-plugin + 3.3.2 + + + + ${version.major}.${version.minor}.${version.revision} + ${project.version} + ${env.TRAVIS_BUILD_NUMBER} + + + src/main/webapp + + + + + org.alfresco.maven.plugin + alfresco-maven-plugin + ${dependency.alfresco-sdk.version} + + + com.thoughtworks.xstream + xstream + ${dependency.xstream.version} + + + org.alfresco + alfresco-mmt + 17.68 + + + + + maven-surefire-plugin + + + ${project.build.directory} + + + 50521 + true + + ${db.url} + ${db.driver} + ${db.name} + ${db.username} + ${db.password} + ${dir.root} + ${img.exe} + ${swf.exe} + ${index.subsystem.name} + + + + + + io.fabric8 + docker-maven-plugin + 0.42.0 + + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + + + + + + + + ${runtime.solr.folder}/data + + run + + + + org.apache.maven.plugins + maven-dependency-plugin + + + + unpack-tomcat-config + generate-resources + + unpack + + + ${project.build.directory}/tomcat-conf + + + org.alfresco + alfresco-dev-tomcat + 5.2.3 + config + true + zip + + + + + + + + unpack-solr4-config + generate-resources + + unpack + + + ${project.build.directory}/solr4 + + + org.alfresco + alfresco-solr4 + 5.2.3 + + + + config + true + zip + + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter-copy-solr4-config + + copy-resources + + generate-resources + + ${runtime.solr.folder} + + + ${project.build.directory}/solr4 + + workspace-SpacesStore/conf/solrcore.properties + archive-SpacesStore/conf/solrcore.properties + + false + + + ${project.build.directory}/solr4 + + workspace-SpacesStore/conf/solrcore.properties + archive-SpacesStore/conf/solrcore.properties + + true + + + false + + @@ + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + copy-tomcat-config + + run + + generate-resources + + + + + + + + + + + + + + + + + + + + + + ant-contrib + ant-contrib + 20020829 + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + + + run-exploded-webapp + prepare-package + + run + + + + + + + + + + + purge + + + + org.apache.maven.plugins + maven-clean-plugin + + + delete-runtime-folders + initialize + + clean + + + true + + + ${runtime.data.folder} + + + + + + + + org.codehaus.mojo + sql-maven-plugin + + + drop-db + initialize + + execute + + + false + ${db.drop.command} + + + + create-db + initialize + + execute + + + false + ${db.create.command} + + + + + + + + + diff --git a/scripts/docker/prepare_buildx.sh b/scripts/docker/prepare_buildx.sh new file mode 100755 index 0000000000..4d3611c4ea --- /dev/null +++ b/scripts/docker/prepare_buildx.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +BUILDER_NAME="${1}" +TARGET_REGISTRY="${2}" +TARGET_IMAGE="${3}" +IMAGE_TAG="${4}" + +#Create a `docker-container` builder with host networking and required flags (quay.io) +docker --config target/docker/"${TARGET_REGISTRY}"/"${TARGET_IMAGE}"/"${IMAGE_TAG}"/docker \ +buildx create --use --name "${BUILDER_NAME}" --driver-opt network=host \ +--buildkitd-flags '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' + +#Create a `docker-container` builder with host networking and required flags (docker.io) +docker --config target/docker/"${TARGET_IMAGE}"/"${IMAGE_TAG}"/docker \ +buildx create --use --name "${BUILDER_NAME}" --driver-opt network=host \ +--buildkitd-flags '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' + +#Create a `docker-container` builder with host networking and required flags (local registry) +docker --config target/docker/127.0.0.1/5000/"${TARGET_IMAGE}"/"${IMAGE_TAG}"/docker \ +buildx create --use --name "${BUILDER_NAME}" --driver-opt network=host \ +--buildkitd-flags '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' diff --git a/scripts/pre-commit/docker-compose-check.sh b/scripts/pre-commit/docker-compose-check.sh new file mode 100755 index 0000000000..05187ae4a8 --- /dev/null +++ b/scripts/pre-commit/docker-compose-check.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +# Based on https://github.com/IamTheFij/docker-pre-commit/blob/master/compose-check.sh +# This adds support for .env files in the same directory as the docker-compose.yml. + +# Verifies that files passed in are valid for docker-compose +set -e + +if command -v docker-compose &> /dev/null ; then + COMPOSE=docker-compose +elif command -v docker &> /dev/null && docker help compose &> /dev/null; then + COMPOSE=docker compose +else + echo "ERROR: Neither 'docker-compose' or 'docker compose' were found" + exit 1 +fi + +check_file() { + local file=$1 + local dir=$(dirname $file) + local env_instruction="" + if [[ -f "$dir/.env" ]]; then + env_instruction="--env-file $dir/.env" + fi + env $COMPOSE --file "$file" $env_instruction config --quiet 2>&1 \ + | sed "/variable is not set. Defaulting/d" + return "${PIPESTATUS[0]}" +} + +check_files() { + local all_files=( "$@" ) + has_error=0 + for file in "${all_files[@]}" ; do + if [[ -f "$file" ]]; then + if ! check_file "$file" ; then + echo "ERROR: $file" + has_error=1 + fi + fi + done + return $has_error +} + +if ! check_files "$@" ; then + echo "Some compose files failed" +fi + +exit $has_error \ No newline at end of file diff --git a/share-encryption/README.md b/share-encryption/README.md new file mode 100644 index 0000000000..40873e3f06 --- /dev/null +++ b/share-encryption/README.md @@ -0,0 +1,84 @@ +# Encrypting configuration for share +You can encrypt sensitive properties from share-custom-config.xml + +1. Run the Alfresco Share Encryption String Tool + + a.Navigate to https://github.com/Alfresco/share/share-encryption + + b.Build the project using maven: mvn clean install + + c.Run the executable jar: + + ```bash + java -jar alfresco-share-encryption-{version}.jar + Alfresco Share Encrypted String Tool + USAGE : org.alfresco.encryptor.ShareStringEncryption initkey | encrypt | validate + initkey : initialise the public and private keystores + encrypt : encrypt a value + validate : compare an encrypted value with a value to see if they match + ``` + +2. Initkey : initialise the public and private keystores in the classpath (/tomcat/shared/classesâ©) + + ```bash + java -jar alfresco-share-encryption-{version}.jar initkey /tomcat/shared/classesâ© + public key created file: /tomcat/shared/classesâ©/alfresco/web-extension/alfrescoSpringKey.pub + private key created file:/tomcat/shared/classesâ©/alfresco/web-extension/alfrescoSpringKey.pri + The key files have been generated, please set permissions on the private key to keep it protected + ``` + +3. Encrypt : encrypt a value + + ```bash + java -jar alfresco-share-encryption-{version}.jar encrypt /tomcat/shared/classes + Please Enter Value: + Please Repeat Value: + fe6z6Is2VzD8wFTZ3eSikAbv0OpNxCikwVBnfe/LhPdqevCb4G1Vrvt7cTSA9z6OHkSh8ZzyKdEfVNPmTH66QA== + ``` + +4. Validate : compare an encrypted value with a value to see if they match + + ```bash + java -jar alfresco-share-encryption-{version}.jarvalidate /Users/p3700670/work/share/tomcat/shared/classes fe6z6Is2VzD8wFTZ3eSikAbv0OpNxCikwVBnfe/LhPdqevCb4G1Vrvt7cTSA9z6OHkSh8ZzyKdEfVNPmTH66QA== + Please Enter Value: + Please Repeat Value: + The value and encrypted value MATCH + ``` + 5. Add the encrypted password to /tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml + using the format: ENC('encypted-value'). + ```bash + + + + ENC(hvDxYTho75MVB4sbEzkdTrus6KBV6S5MaDJ/Jpk78b2X5uAvIi02c9A4BEYIu6sHV0mOnJsfHXjLjdQekq4BcQ==) + + SOME_KERBEROS_REALM + + HTTP/SOME_HOST@SOME_KERBEROS_REALM + + ShareHTTP + + true + + + + ``` + + diff --git a/share-encryption/pom.xml b/share-encryption/pom.xml new file mode 100644 index 0000000000..230ac7cc90 --- /dev/null +++ b/share-encryption/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + alfresco-share-encryption + Alfresco Share Encryption + jar + + + alfresco-share-parent + org.alfresco + 23.1.0.156-SNAPSHOT + + + + + junit + junit + 4.13.1 + test + + + + org.jasypt + jasypt + 1.9.3 + + + + + + + + + maven-jar-plugin + + false + + + + + maven-shade-plugin + + + make-spring-encryptor + + shade + + + + + + + + org.alfresco.encryptor.ShareStringEncryption + + + + + + + org.jasypt:* + + + + + + *:* + + META-INF/** + + + + + *:* + + org/** + + + + + + + + diff --git a/share-encryption/src/main/java/org/alfresco/encryptor/PublicPrivateKeyShareStringEncryptor.java b/share-encryption/src/main/java/org/alfresco/encryptor/PublicPrivateKeyShareStringEncryptor.java new file mode 100644 index 0000000000..9a2ea9d291 --- /dev/null +++ b/share-encryption/src/main/java/org/alfresco/encryptor/PublicPrivateKeyShareStringEncryptor.java @@ -0,0 +1,520 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.encryptor; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URISyntaxException; +import java.net.URL; +import java.security.InvalidKeyException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; + +import org.jasypt.contrib.org.apache.commons.codec_1_3.binary.Base64; +import org.jasypt.encryption.StringEncryptor; + +public class PublicPrivateKeyShareStringEncryptor implements StringEncryptor +{ + + static final int KEY_SIZE = 512; + protected String keyAlgorithm = "RSA"; + protected String encryptionAlgorithm = "RSA/ECB/PKCS1PADDING"; + + protected PrivateKey privateKey = null; + + protected PublicKey publicKey = null; + + static final String KEYNAME = "alfrescoSpringKey"; + static final String PUBKEYNAME = KEYNAME + ".pub"; + static final String PRIKEYNAME = KEYNAME + ".pri"; + + static final String KEY_PACKAGE = "/alfresco/web-extension"; + static final String PRIKEYPATH = KEY_PACKAGE + "/" + PRIKEYNAME; + static final String PUBKEYPATH = KEY_PACKAGE + "/" + PUBKEYNAME; + + @Override + public String encrypt(String message) + { + Cipher cipher; + byte[] cipherText = new byte[0]; + String retval = message; + if (publicKey == null) + { + return retval; + } + + try + { + cipher = Cipher.getInstance(encryptionAlgorithm); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + // Number of bytes in the key - 11 for padding + int chunkSize = (KEY_SIZE / 8) - 11; + + // bytes to encrypt + byte[] messageBytes = message.getBytes("UTF-8"); + + if (messageBytes.length > chunkSize) + { + // yes we need multiple chunks + byte[] cipherChunk = new byte[0]; // chunk of encrypted stuff + byte[] buffer = new byte[chunkSize]; // working buffer + + for (int i = 0; i < messageBytes.length; i++) + { + // if we filled our buffer array we have our block ready for + // encryption + if ((i > 0) && (i % chunkSize == 0)) + { + // execute the encryption operation + cipherChunk = cipher.doFinal(buffer); + cipherText = append(cipherText, cipherChunk); + + // here we calculate the length of the next buffer + // required + int newlength = chunkSize; + + // if newlength would be longer than remaining bytes in + // the bytes array we + // shorten it. + if (i + chunkSize > messageBytes.length) + { + newlength = messageBytes.length - i; + } + // clean the buffer array + buffer = new byte[newlength]; + } + // copy byte into our buffer. + buffer[i % chunkSize] = messageBytes[i]; + } // for each byte in message + + // Any remaining bytest in buffer + cipherChunk = cipher.doFinal(buffer); + cipherText = append(cipherText, cipherChunk); + } + else + { + // we don't need multiple chunks + cipherText = cipher.doFinal(messageBytes); + } + + retval = new String(Base64.encodeBase64(cipherText)); + } + catch (UnsupportedEncodingException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + catch (NoSuchPaddingException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + catch (NoSuchAlgorithmException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + catch (InvalidKeyException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + catch (IllegalBlockSizeException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + catch (BadPaddingException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + return retval; + } + + /** + * append two byte arrays together + * + * @param prefix + * @param suffix + * @return a byte array containing the contents of prefix + suffix + */ + private static byte[] append(byte[] prefix, byte[] suffix) + { + byte[] toReturn = new byte[prefix.length + suffix.length]; + for (int i = 0; i < prefix.length; i++) + { + toReturn[i] = prefix[i]; + } + for (int i = 0; i < suffix.length; i++) + { + toReturn[i + prefix.length] = suffix[i]; + } + return toReturn; + } + + @Override + public String decrypt(String encryptedMessage) + { + Cipher cipher; + String retval = encryptedMessage; + + byte[] plainText = new byte[0]; + + if (privateKey == null) + { + throw new RuntimeException("Unable to decrypt value, private key not found"); + } + try + { + cipher = Cipher.getInstance(encryptionAlgorithm); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + // Chunk size is Number of bytes in the key + int chunkSize = (KEY_SIZE / 8); + + // bytes to decrypt + byte[] messageBytes = Base64.decodeBase64(encryptedMessage.getBytes("UTF-8")); + + // encrypted chunk + byte[] cipherChunk = new byte[0]; + // Working buffer + byte[] buffer = new byte[chunkSize]; + + for (int i = 0; i < messageBytes.length; i++) + { + // if we filled our buffer array we have our block ready for + // encryption + if ((i > 0) && (i % chunkSize == 0)) + { + // execute the operation + cipherChunk = cipher.doFinal(buffer); + // add the result to our total result. + plainText = append(plainText, cipherChunk); + + // here we calculate the length of the next buffer required + int newlength = chunkSize; + + // if newlength would be longer than remaining bytes in the + // bytes array we + // shorten it. + if (i + chunkSize > messageBytes.length) + { + newlength = messageBytes.length - i; + } + // clean the buffer array + buffer = new byte[newlength]; + } + // copy byte into our buffer. + buffer[i % chunkSize] = messageBytes[i]; + } + + // Any remaining buffer + cipherChunk = cipher.doFinal(buffer); + plainText = append(plainText, cipherChunk); + + retval = new String(plainText, "UTF-8"); + } + catch (UnsupportedEncodingException e) + { + throw new RuntimeException("Could not encrypt value", e); + } + catch (NoSuchPaddingException e) + { + throw new RuntimeException("Could not decrypt value", e); + } + catch (NoSuchAlgorithmException e) + { + throw new RuntimeException("Could not decrypt value", e); + } + catch (InvalidKeyException e) + { + throw new RuntimeException("Could not decrypt value", e); + } + catch (IllegalBlockSizeException e) + { + throw new RuntimeException("Could not decrypt value", e); + } + catch (BadPaddingException e) + { + throw new RuntimeException("Could not decrypt value", e); + } + return retval; + } + + /** + * + * @param alfrescoSharedDir + * @throws RuntimeException + */ + public void initPublic(String alfrescoSharedDir) + { + File webExtensionDir = getWebExtensionDir(alfrescoSharedDir); + + File publicKeyFile = new File(webExtensionDir, PUBKEYNAME); + + if (publicKeyFile.canRead()) + { + try (ObjectInputStream is = new ObjectInputStream(new FileInputStream(publicKeyFile));) + { + publicKey = (PublicKey) is.readObject(); + } + catch (ClassNotFoundException e) + { + throw new RuntimeException("Could not instantiate Public Key", e); + } + catch (IOException e) + { + throw new RuntimeException("Could not open Public Key", e); + } + } + else + { + throw new RuntimeException("Public Key File Not Found :" + publicKeyFile.getPath()); + } + } + + /** + * @param alfrescoSharedDir + * @throws RuntimeException + */ + public void initPrivate(String alfrescoSharedDir) + { + File webExtension = getWebExtensionDir(alfrescoSharedDir); + + File privateKeyFile = new File(webExtension, PRIKEYNAME); + if (privateKeyFile.canRead()) + { + ObjectInputStream is = null; + try + { + is = new ObjectInputStream(new FileInputStream(privateKeyFile)); + privateKey = (PrivateKey) is.readObject(); + } + catch (ClassNotFoundException e) + { + throw new RuntimeException("Could not instantiate Private Key", e); + } + catch (IOException e) + { + throw new RuntimeException("Could not find Private Key", e); + } + finally + { + if (is != null) + { + try + { + is.close(); + } + catch (IOException error) + { + // nothing + } + } + } + } + else + { + throw new RuntimeException("Private Key File Not Found :" + privateKeyFile.getPath()); + } + } + + /** + * createKeyFiles + * + * @param alfrescoSharedDir + * String + */ + public void createKeyFiles(String alfrescoSharedDir) + { + File sharedDir = new File(alfrescoSharedDir); + + File webExtensionDir = getWebExtensionDir(alfrescoSharedDir); + + if (!sharedDir.exists()) + { + throw new RuntimeException("alfresco shared dir does not exist : " + sharedDir); + } + + if (!webExtensionDir.exists()) + { + throw new RuntimeException("alfresco enterprise dir does not exist : " + webExtensionDir); + } + + File publicKeyFile = new File(webExtensionDir, PUBKEYNAME); + File privateKeyFile = new File(webExtensionDir, PRIKEYNAME); + try + { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance(keyAlgorithm); + keyGen.initialize(KEY_SIZE); + KeyPair key = keyGen.generateKeyPair(); + + try (ObjectOutputStream publicKeyOS = new ObjectOutputStream(new FileOutputStream(publicKeyFile));) + { + publicKeyOS.writeObject(key.getPublic()); + + // TODO config log + // info("public key created file: "+ publicKeyFile.getPath()); + } + catch (IOException e) + { + throw new RuntimeException("unable to create public key file", e); + } + + try (ObjectOutputStream privateKeyOS = new ObjectOutputStream(new FileOutputStream(privateKeyFile));) + { + privateKeyOS.writeObject(key.getPrivate()); + + // TODO config log + // info("private key created file:" + privateKeyFile.getPath()); + + } + catch (IOException e) + { + throw new RuntimeException("unable to create private key file", e); + } + } + catch (NoSuchAlgorithmException e) + { + throw new RuntimeException("Unable to generate public/private key", e); + } + } + + private File getWebExtensionDir(String alfrescoSharedDir) + { + File sharedDir = new File(alfrescoSharedDir); + File alfrescoDir = new File(sharedDir, "alfresco"); + File webExtensionDir = new File(alfrescoDir, "web-extension"); + return webExtensionDir; + } + + public String getPasswordFromConsole() + { + String enteredPassword = null; + String verifyPassword = null; + boolean firstOne = true; + do + { + if (!firstOne) + { + System.console().writer().println("Please enter the same value twice to verify your encrypted value"); + System.console().writer().flush(); + } + firstOne = false; + System.console().writer().print("Please Enter Value: "); + System.console().writer().flush(); + enteredPassword = new String(System.console().readPassword()); + System.console().writer().print("Please Repeat Value: "); + System.console().writer().flush(); + verifyPassword = new String(System.console().readPassword()); + } while (enteredPassword == null || enteredPassword.length() < 1 || !enteredPassword.equals(verifyPassword)); + return enteredPassword; + } + + /** + * privateKey initialization using resource from classpath + */ + public void init() + { + /** + * Read the private key file off the classpath and set privateKey + */ + URL privateKeyURL = this.getClass().getResource(PRIKEYPATH); + if (privateKeyURL == null) + { + return; + } + + try + { + File privateKeyFile = new File(privateKeyURL.toURI()); + + initPrivateKeyFile(privateKeyFile); + } + catch (URISyntaxException e) + { + throw new RuntimeException("Could not instantiate Private Key", e); + } + + } + + /** + * privateKey initialization using a defined uri + * + * @param shareDir + */ + public void initConfig(String shareDir) + { + File privateKeyFile = new File(getWebExtensionDir(shareDir), PRIKEYNAME); + initPrivateKeyFile(privateKeyFile); + } + + private void initPrivateKeyFile(File privateKeyFile) + { + if (privateKeyFile.canRead()) + { + ObjectInputStream is = null; + try + { + is = new ObjectInputStream(new FileInputStream(privateKeyFile)); + privateKey = (PrivateKey) is.readObject(); + } + catch (ClassNotFoundException e) + { + throw new RuntimeException("Could not instantiate Private Key", e); + + } + catch (IOException e) + { + throw new RuntimeException("Could not instantiate Private Key", e); + } + finally + { + if (is != null) + { + try + { + is.close(); + } + catch (IOException error) + { + throw new RuntimeException("Problem while closing stream.", error); + } + } + } + } + else + { + throw new RuntimeException("Private Key File: " + privateKeyFile.getAbsolutePath() + " Cannot be read"); + } + + } + +} diff --git a/share-encryption/src/main/java/org/alfresco/encryptor/ShareStringEncryption.java b/share-encryption/src/main/java/org/alfresco/encryptor/ShareStringEncryption.java new file mode 100644 index 0000000000..dfed6eb64a --- /dev/null +++ b/share-encryption/src/main/java/org/alfresco/encryptor/ShareStringEncryption.java @@ -0,0 +1,190 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.encryptor; + +public class ShareStringEncryption +{ + + static final String CMD_INITKEY = "initkey"; + static final String CMD_ENCRYPT = "encrypt"; + static final String CMD_VALIDATE = "validate"; + + static final String USAGE = "USAGE : " + ShareStringEncryption.class.getName() + " " + CMD_INITKEY + " | " + CMD_ENCRYPT + " | " + CMD_VALIDATE + + " "; + static final String USAGE_1 = " initkey : initialise the public and private keystores"; + static final String USAGE_2 = " encrypt : encrypt a value "; + static final String USAGE_3 = " validate : compare an encrypted value with a value to see if they match"; + + private static final int USAGE_EXIT_CODE = 255; + private static final int ERROR_EXIT_CODE = 1; + private static final int SUCCESS_EXIT_CODE = 0; + + static final String USAGE_INITKEY = "USAGE : " + ShareStringEncryption.class.getName() + " " + CMD_INITKEY + " "; + static final String USAGE_ENCRYPT = "USAGE : " + ShareStringEncryption.class.getName() + " " + CMD_ENCRYPT + " [value to encrypt]"; + static final String USAGE_DECRYPT = "USAGE : " + ShareStringEncryption.class.getName() + " " + CMD_VALIDATE + + " encrypted_value [value]"; + + /** + * Main command line program + * + * @return 0 success + * @return 1 error + * @return 255 usage failure + * + * @param args + */ + public static void main(String[] args) + { + if (args.length < 1) + { + System.out.println("Alfresco Share Encrypted String Tool"); + System.err.println(USAGE); + System.err.println(""); + System.err.println(USAGE_1); + System.err.println(USAGE_2); + System.err.println(USAGE_3); + + System.exit(USAGE_EXIT_CODE); + } + PublicPrivateKeyShareStringEncryptor enc = new PublicPrivateKeyShareStringEncryptor(); + String shareExtensionsDirectory = null; + if (args.length > 1) + { + shareExtensionsDirectory = args[1]; + if (!args[0].equalsIgnoreCase(CMD_INITKEY)) + { + enc.initPublic(shareExtensionsDirectory); + enc.initPrivate(shareExtensionsDirectory); + + if (enc.publicKey == null || enc.privateKey == null) + { + System.err.println("Please run " + CMD_INITKEY + " before encrypting or validating passwords"); + System.exit(USAGE_EXIT_CODE); + } + } + } + if (args[0].equalsIgnoreCase(CMD_INITKEY)) + { + if (args.length < 2) + { + System.err.println(USAGE_INITKEY); + System.exit(USAGE_EXIT_CODE); + } + try + { + enc.createKeyFiles(shareExtensionsDirectory); + + System.out.println("The key files have been generated, please set permissions on the private key to keep it protected."); + System.exit(SUCCESS_EXIT_CODE); + + } + catch (Throwable t) + { + System.err.println("unable to initialise keys"); + t.printStackTrace(System.err); + System.exit(ERROR_EXIT_CODE); + } + } + else if (args[0].equalsIgnoreCase(CMD_ENCRYPT)) + { + if (args.length < 2) + { + System.err.println(USAGE_ENCRYPT); + System.exit(USAGE_EXIT_CODE); + } + String password = null; + if (args.length > 2) + { + password = args[2]; + } + else + { + password = enc.getPasswordFromConsole(); + } + + try + { + System.out.println(enc.encrypt(password)); + System.exit(SUCCESS_EXIT_CODE); + } + catch (Throwable t) + { + System.err.println("Error : Unable to encrypt : " + t.getMessage()); + t.printStackTrace(System.err); + System.exit(ERROR_EXIT_CODE); + } + } + else if (args[0].equalsIgnoreCase(CMD_VALIDATE)) + { + if (args.length < 3) + { + System.err.println(USAGE_DECRYPT); + System.exit(USAGE_EXIT_CODE); + } + String password = null; + if (args.length > 3) + { + password = args[3]; + } + else + { + password = enc.getPasswordFromConsole(); + } + String encryptedValue = args[2]; + + try + { + String decryptedValue = enc.decrypt(encryptedValue); + if (decryptedValue.equals(password)) + { + System.out.println("The value and encrypted value MATCH"); + System.exit(SUCCESS_EXIT_CODE); + } + else + { + System.out.println("The value and encrypted value DO NOT MATCH"); + System.exit(ERROR_EXIT_CODE); + } + } + catch (Throwable t) + { + System.err.println("Error : Unable to validate :" + t.getMessage()); + t.printStackTrace(System.err); + System.exit(ERROR_EXIT_CODE); + } + } + else + { + System.err.println(USAGE); + System.err.println(""); + System.err.println(USAGE_1); + System.err.println(USAGE_2); + System.err.println(USAGE_3); + + System.err.println(""); + System.err.println("BAD COMMAND: " + args[0]); + System.exit(USAGE_EXIT_CODE); + } + + // Don't expect to get here + System.exit(ERROR_EXIT_CODE); + } +} diff --git a/share/pom.xml b/share/pom.xml new file mode 100644 index 0000000000..741ef1597a --- /dev/null +++ b/share/pom.xml @@ -0,0 +1,795 @@ + + 4.0.0 + share + war + Alfresco Share WAR + Alfresco Share + + + org.alfresco + alfresco-share-parent + 23.1.0.156-SNAPSHOT + + + + 7.0.86 + ${project.parent.basedir} + + + + + ${project.groupId} + alfresco-web-framework-commons + ${project.version} + classes + + + ${project.groupId} + alfresco-share-encryption + ${project.version} + + + ${project.groupId} + alfresco-core + ${dependency.alfresco-community-repo.version} + + + org.hibernate + hibernate + + + org.mybatis + mybatis + + + org.mybatis + mybatis-spring + + + org.quartz-scheduler + quartz + + + dom4j + dom4j + + + + + ${project.groupId} + alfresco-jlan-embed + + + * + spring-surf-core + + + * + spring-surf-core-configservice + + + + + org.dom4j + dom4j + ${dependency.dom4j.version} + + + javax.portlet + portlet-api + 3.0.1 + provided + + + javax.servlet + javax.servlet-api + provided + + + org.apache.chemistry.opencmis + chemistry-opencmis-client-impl + 1.1.0 + + + org.apache.logging.log4j + log4j-api + ${dependency.log4j.version} + + + org.alfresco.cmis.client + alfresco-opencmis-extension + 2.3 + + + antlr + antlr + + + + + org.alfresco.surf + spring-surf-api + ${dependency.surf.version} + + + org.alfresco + alfresco-core + + + commons-collections + commons-collections + + + + + + org.alfresco.surf + spring-cmis-framework + ${dependency.surf.version} + + + abdera-extensions-main + org.apache.abdera + + + abdera-extensions-html + org.apache.abdera + + + abdera-server + org.apache.abdera + + + geronimo-stax-api_1.0_spec + org.apache.geronimo.specs + + + geronimo-activation_1.0.2_spec + org.apache.geronimo.specs + + + js + rhino + + + jstl + javax.servlet + + + org.jvnet.staxex + stax-ex + + + org.alfresco + alfresco-core + + + + + + + org.mozilla + rhino + ${dependency.rhino.version} + + + json-simple + com.googlecode.json-simple + 1.1.1 + + + junit + junit + + + + + org.tuckey + urlrewritefilter + 4.0.4 + runtime + + + commons-fileupload + commons-fileupload + runtime + + + jaxen + jaxen + 1.2.0 + runtime + + + org.freemarker + freemarker + ${dependency.freemarker.version} + + + ${project.groupId} + alfresco-web-framework-commons + ${project.version} + war + true + + + + stax-api + stax + 1.0.1 + + + com.hazelcast + hazelcast-spring + 3.12.13 + + + hazelcast-client + com.hazelcast + + + jsr250-api + javax.annotation + + + + + + org.apache.taglibs + taglibs-standard-spec + + + org.apache.taglibs + taglibs-standard-impl + + + org.apache.taglibs + taglibs-standard-jstlel + + + + + org.alfresco + aikau + ${dependency.aikau.version} + + + + com.asual.lesscss + lesscss-engine + + + + * + spring-webscripts + + + * + spring-webscripts-api + + + * + spring-surf + + + * + spring-surf-api + + + + + + + com.yahoo.platform.yui + yui + ${dependency.yui.version} + zip + + + + org.mockito + mockito-all + 1.10.19 + test + + + junit + 4.13.1 + junit + test + + + + + org.alfresco.3rdparty.com.asual.lesscss + lesscss-engine + 1.5.1-patched + + + org.mozilla + rhino + + + + + + + org.slf4j + slf4j-api + + + org.apache.logging.log4j + log4j-core + + + org.slf4j + jcl-over-slf4j + + + org.apache.logging.log4j + log4j-slf4j2-impl + + + + + org.bouncycastle + bcprov-jdk15on + 1.69 + + + + + org.springframework.security + spring-security-oauth2-client + + + org.springframework.security + spring-security-oauth2-jose + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + + + share + + + + maven-antrun-plugin + + + duplicate-english-messages + generate-resources + + run + + + + + + + + + + + + + + + + + + + + maven-war-plugin + 3.3.2 + + + + ${project.groupId} + alfresco-web-framework-commons + + WEB-INF/classes/* + WEB-INF/lib/* + META-INF/MANIFEST.MF + + + + com.yahoo.platform.yui + yui + zip + + + + + + Share Libraries + + ${dependency.alfresco-community-repo.version} + ${dependency.alfresco-jlan.version} + ${dependency.spring.version} + ${dependency.surf.version} + ${dependency.aikau.version} + ${dependency.webscripts.version} + ${dependency.yui.version} + ${dependency.freemarker.version} + ${dependency.rhino.version} + + + + + + + + org.alfresco + alfresco-mmt + 17.68 + + + + + + prepare-exploded-war + + exploded + + generate-resources + + + + generate-manifest + generate-resources + + ${project.build.directory}/${project.build.finalName} + + + + + + net.alchim31.maven + yuicompressor-maven-plugin + + + minimize-slingshot-javascript + + compress + + prepare-package + + + + + + com.yahoo.platform.yui + yuicompressor + 2.4.8-rhino-alfresco-patched + + + + false + UTF-8 + + **/*.js + + + + **/sinon-1.10.3/** + **/*-min.js + **/*.min.js + **/WEB-INF/** + **/tinymce/** + **/yui/** + js/lib/dojo*/** + **/log4javascript*.js + **/pdfjs/pdf*.js + + ${project.build.directory}/${project.build.finalName} + ${project.build.directory}/${project.build.finalName} + true + + + + + + + + + ${project.build.directory}/${project.build.finalName}/js/yui-common-min.js + + + ${project.build.directory}/${project.build.finalName}/yui/utilities/utilities.js + ${project.build.directory}/${project.build.finalName}/yui/button/button-min.js + ${project.build.directory}/${project.build.finalName}/yui/button/buttonariaplugin-min.js + ${project.build.directory}/${project.build.finalName}/yui/container/container-min.js + ${project.build.directory}/${project.build.finalName}/yui/menu/menu-min.js + ${project.build.directory}/${project.build.finalName}/yui/json/json-min.js + ${project.build.directory}/${project.build.finalName}/yui/selector/selector-min.js + ${project.build.directory}/${project.build.finalName}/yui/datasource/datasource-min.js + ${project.build.directory}/${project.build.finalName}/yui/autocomplete/autocomplete-min.js + ${project.build.directory}/${project.build.finalName}/yui/paginator/paginator-min.js + ${project.build.directory}/${project.build.finalName}/yui/datatable/datatable-min.js + ${project.build.directory}/${project.build.finalName}/yui/treeview/treeview-min.js + ${project.build.directory}/${project.build.finalName}/yui/cookie/cookie-min.js + ${project.build.directory}/${project.build.finalName}/yui/uploader/uploader-min.js + ${project.build.directory}/${project.build.finalName}/yui/calendar/calendar-min.js + ${project.build.directory}/${project.build.finalName}/yui/resize/resize-min.js + ${project.build.directory}/${project.build.finalName}/yui/history/history-min.js + ${project.build.directory}/${project.build.finalName}/yui/yui-patch.js + + + + + + ${project.build.directory}/${project.build.finalName}/js/yui-common.js + + + ${project.build.directory}/${project.build.finalName}/js/log4javascript.v1.4.1.js + ${project.build.directory}/${project.build.finalName}/yui/yahoo/yahoo-debug.js + ${project.build.directory}/${project.build.finalName}/yui/event/event-debug.js + ${project.build.directory}/${project.build.finalName}/yui/dom/dom-debug.js + ${project.build.directory}/${project.build.finalName}/yui/dragdrop/dragdrop-debug.js + ${project.build.directory}/${project.build.finalName}/yui/animation/animation-debug.js + ${project.build.directory}/${project.build.finalName}/yui/logger/logger-debug.js + ${project.build.directory}/${project.build.finalName}/yui/connection/connection-debug.js + ${project.build.directory}/${project.build.finalName}/yui/element/element-debug.js + ${project.build.directory}/${project.build.finalName}/yui/get/get-debug.js + ${project.build.directory}/${project.build.finalName}/yui/yuiloader/yuiloader-debug.js + ${project.build.directory}/${project.build.finalName}/yui/button/button-debug.js + ${project.build.directory}/${project.build.finalName}/yui/button/buttonariaplugin-debug.js + ${project.build.directory}/${project.build.finalName}/yui/container/container-debug.js + ${project.build.directory}/${project.build.finalName}/yui/menu/menu-debug.js + ${project.build.directory}/${project.build.finalName}/yui/json/json-debug.js + ${project.build.directory}/${project.build.finalName}/yui/selector/selector-debug.js + ${project.build.directory}/${project.build.finalName}/yui/datasource/datasource-debug.js + ${project.build.directory}/${project.build.finalName}/yui/autocomplete/autocomplete-debug.js + ${project.build.directory}/${project.build.finalName}/yui/paginator/paginator-debug.js + ${project.build.directory}/${project.build.finalName}/yui/datatable/datatable-debug.js + ${project.build.directory}/${project.build.finalName}/yui/treeview/treeview-debug.js + ${project.build.directory}/${project.build.finalName}/yui/cookie/cookie-debug.js + ${project.build.directory}/${project.build.finalName}/yui/uploader/uploader-debug.js + ${project.build.directory}/${project.build.finalName}/yui/calendar/calendar-debug.js + ${project.build.directory}/${project.build.finalName}/yui/resize/resize-debug.js + ${project.build.directory}/${project.build.finalName}/yui/history/history-debug.js + ${project.build.directory}/${project.build.finalName}/yui/yui-patch.js + + + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + true + ${basedir}/tomcat/share-context.xml + + + + org.apache.tomcat.embed + tomcat-embed-core + ${tomcat.version} + + + org.apache.tomcat + tomcat-util + ${tomcat.version} + + + org.apache.tomcat + tomcat-coyote + ${tomcat.version} + + + org.apache.tomcat + tomcat-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-jdbc + ${tomcat.version} + + + org.apache.tomcat + tomcat-dbcp + ${tomcat.version} + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-jsp-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-jasper + ${tomcat.version} + + + org.apache.tomcat + tomcat-jasper-el + ${tomcat.version} + + + org.apache.tomcat + tomcat-el-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-catalina + ${tomcat.version} + + + org.apache.tomcat + tomcat-tribes + ${tomcat.version} + + + org.apache.tomcat + tomcat-catalina-ha + ${tomcat.version} + + + org.apache.tomcat + tomcat-annotations-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-juli + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-logging-juli + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-logging-log4j + ${tomcat.version} + + + + + + + + + run + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + run-exploded-webapp + prepare-package + + run + + + + + + org.apache.tomcat.embed + tomcat-embed-core + ${tomcat.version} + + + org.apache.tomcat + tomcat-util + ${tomcat.version} + + + org.apache.tomcat + tomcat-coyote + ${tomcat.version} + + + org.apache.tomcat + tomcat-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-jdbc + ${tomcat.version} + + + org.apache.tomcat + tomcat-dbcp + ${tomcat.version} + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-jsp-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-jasper + ${tomcat.version} + + + org.apache.tomcat + tomcat-jasper-el + ${tomcat.version} + + + org.apache.tomcat + tomcat-el-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-catalina + ${tomcat.version} + + + org.apache.tomcat + tomcat-tribes + ${tomcat.version} + + + org.apache.tomcat + tomcat-catalina-ha + ${tomcat.version} + + + org.apache.tomcat + tomcat-annotations-api + ${tomcat.version} + + + org.apache.tomcat + tomcat-juli + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-logging-juli + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-logging-log4j + ${tomcat.version} + + + + + + + + diff --git a/share/src/main/java/org/alfresco/web/cmis/SlingshotCMISScriptParameterFactory.java b/share/src/main/java/org/alfresco/web/cmis/SlingshotCMISScriptParameterFactory.java new file mode 100644 index 0000000000..2077002efc --- /dev/null +++ b/share/src/main/java/org/alfresco/web/cmis/SlingshotCMISScriptParameterFactory.java @@ -0,0 +1,153 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.cmis; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.alfresco.cmis.client.impl.AlfrescoObjectFactoryImpl; +import org.alfresco.web.site.SlingshotUserFactory; +import org.apache.chemistry.opencmis.commons.SessionParameter; +import org.apache.chemistry.opencmis.commons.enums.BindingType; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.cmis.CMISConnection; +import org.springframework.extensions.cmis.CMISConnectionManagerImpl; +import org.springframework.extensions.cmis.CMISScriptParameterFactory; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.connector.AlfrescoAuthenticator; +import org.springframework.extensions.webscripts.connector.AuthenticatingConnector; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorService; +import org.springframework.extensions.webscripts.connector.Credentials; + +/** + * CMIS Script Parameter Factory that sets the default connection to the + * Alfresco back-end. + * + * @author Florian Mueller + * @since 4.0 + */ +public class SlingshotCMISScriptParameterFactory extends CMISScriptParameterFactory +{ + private static final Log logger = LogFactory.getLog(SlingshotCMISScriptParameterFactory.class); + private static final String CMIS_PATH = "/cmisatom"; + private static final String ALFRESCO_SERVICE_BASE_PATH = "/s"; + + private ConnectorService connectorService; + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + + public void setConnectorService(ConnectorService connectorService) + { + this.connectorService = connectorService; + } + + @Override + public CMISConnection getConnection(CMISConnectionManagerImpl connectionManager) + { + lock.writeLock().lock(); + try + { + CMISConnection connection = super.getConnection(connectionManager); + if (connection != null) + { + return connection; + } + + if (ThreadLocalRequestContext.getRequestContext() == null) + { + return null; + } + + RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + Credentials creds = rc.getCredentialVault().retrieve(SlingshotUserFactory.ALFRESCO_ENDPOINT_ID); + + Connector connector; + try + { + connector = connectorService.getConnector(SlingshotUserFactory.ALFRESCO_ENDPOINT_ID); + connector.setCredentials(creds); + } catch (Exception e) + { + logger.info("Unable to get endpoint connector: " + e, e); + return null; + } + + String alfrescoEndpointUrl = connector.getEndpoint(); + if (alfrescoEndpointUrl.endsWith(ALFRESCO_SERVICE_BASE_PATH)) + { + alfrescoEndpointUrl = alfrescoEndpointUrl.substring(0, alfrescoEndpointUrl.length() + - ALFRESCO_SERVICE_BASE_PATH.length()); + } + + String url = alfrescoEndpointUrl + CMIS_PATH; + + Map parameters = new HashMap(); + parameters.put("name", "default-" + rc.getUserId()); + parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value()); + parameters.put(SessionParameter.ATOMPUB_URL, url); + parameters.put(SessionParameter.OBJECT_FACTORY_CLASS, AlfrescoObjectFactoryImpl.class.getName()); + + String ticket = getTicket(connector); + + if (ticket != null) + { + parameters.put(SessionParameter.USER, ""); + parameters.put(SessionParameter.PASSWORD, ticket); + } else if (creds != null) + { + parameters.put(SessionParameter.USER, (String) creds.getProperty(Credentials.CREDENTIAL_USERNAME)); + parameters.put(SessionParameter.PASSWORD, (String) creds.getProperty(Credentials.CREDENTIAL_PASSWORD)); + } else + { + return null; + } + + return createDefaultConnection(connectionManager, createServerDefinition(parameters)); + } finally + { + lock.writeLock().unlock(); + } + } + + private String getTicket(Connector connector) + { + String ticket = (String) connector.getConnectorSession() + .getParameter(AlfrescoAuthenticator.CS_PARAM_ALF_TICKET); + + if (ticket != null) + { + return ticket; + } + + if (connector instanceof AuthenticatingConnector) + { + if (((AuthenticatingConnector) connector).handshake()) + { + return (String) connector.getConnectorSession().getParameter(AlfrescoAuthenticator.CS_PARAM_ALF_TICKET); + } + } + + return null; + } +} diff --git a/share/src/main/java/org/alfresco/web/cmm/CMMDictionaryGet.java b/share/src/main/java/org/alfresco/web/cmm/CMMDictionaryGet.java new file mode 100644 index 0000000000..05d01eda5e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/cmm/CMMDictionaryGet.java @@ -0,0 +1,109 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.cmm; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.web.cmm.CMMService.TWrapper; +import org.alfresco.web.scripts.DictionaryQuery; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * Share REST API access to basic Dictionary services. + *

+ * See cmm-dictionary.get.desc.xml for API descriptor. + * + * @author Kevin Roast + */ +public class CMMDictionaryGet extends DeclarativeWebScript +{ + private static final Log logger = LogFactory.getLog(CMMDictionaryGet.class); + + protected DictionaryQuery dictionary; + + /** + * Dictionary Query bean reference + * + * @param dictionary DictionaryQuery + */ + public void setDictionary(DictionaryQuery dictionary) + { + this.dictionary = dictionary; + } + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map result = new HashMap<>(); + + String[] classes = null; + + // look for an entity subclass on the request + String entity = req.getServiceMatch().getTemplateVars().get("entity"); + if (entity != null && entity.length() != 0) + { + classes = this.dictionary.getSubTypes(entity); + } + else + { + // look for an aspects/types on the request + String classtype = req.getServiceMatch().getTemplateVars().get("classtype"); + if (classtype != null) + { + switch (classtype) + { + case "aspects": + classes = this.dictionary.getAllAspects(); + break; + case "types": + classes = this.dictionary.getAllTypes(); + break; + } + } + } + + if (classes == null) + { + throw new IllegalArgumentException("No valid entity or types/aspects modifier specified."); + } + + // build template wrappers for our entities + List entities = new ArrayList<>(); + for (String e: classes) + { + entities.add(new TWrapper(4) + .put("name", e) + .put("title", this.dictionary.getTitle(e)) + .put("description", this.dictionary.getDescription(e))); + } + result.put("entities", entities); + + return result; + } +} diff --git a/share/src/main/java/org/alfresco/web/cmm/CMMService.java b/share/src/main/java/org/alfresco/web/cmm/CMMService.java new file mode 100644 index 0000000000..a969a17339 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/cmm/CMMService.java @@ -0,0 +1,1282 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.cmm; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletResponse; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.scripts.DictionaryQuery; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.springframework.extensions.surf.ModuleDeploymentService; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.exception.ModelObjectPersisterException; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.types.ExtensionModule; +import org.springframework.extensions.surf.types.ModuleDeployment; +import org.springframework.extensions.surf.uri.UriUtils; +import org.springframework.extensions.surf.util.StringBuilderWriter; +import org.springframework.extensions.surf.util.URLEncoder; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Description; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptException; +import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorContext; +import org.springframework.extensions.webscripts.connector.HttpMethod; +import org.springframework.extensions.webscripts.connector.Response; +import org.springframework.extensions.webscripts.processor.FTLTemplateProcessor; + +/** + * Base class for CMM WebScript requests to perform a number of service related functions: + *

+ * Each model has associated Share form configuration which is activated or deactivated + * based on the current API state for that model. The dynamic form configuration allows + * the user to make immediate use of the model without server restarts. + *

+ * Each CRUD HTTP method WebScript extends this service and it is responsible for the bulk + * of the work for operations. It will proxy through API calls to the repo via the given + * operation ID mapping to a templated repository API URL. The caller is responsible for + * providing the appropriate bag of arguments to the templated URL and also the data JSON + * as expected by the repository API. Errors and status codes from the repo API are + * proxied back to the caller. + *

+ * Besides proxying the API calls, the main purpose of this service is to provide business + * logic hook points before and after the repository operations for Share. This allows say + * local Data Dictionary modifications and updates based on the success of a repository API. + * + * @author Kevin Roast + */ +public abstract class CMMService extends DeclarativeWebScript +{ + private static final Log logger = LogFactory.getLog(CMMService.class); + + /** JSON string constants */ + private static final String JSON_APPEARANCE = "appearance"; + private static final String JSON_LABEL = "label"; + private static final String JSON_STYLECLASS = "styleclass"; + private static final String JSON_STYLE = "style"; + private static final String JSON_MAXLENGTH = "maxlength"; + private static final String JSON_READ_ONLY = "read-only"; + private static final String JSON_HIDDEN = "hidden"; + private static final String JSON_FORCE = "force"; + private static final String JSON_ANY = "any"; + private static final String JSON_FOR_MODE = "for-mode"; + private static final String JSON_CONTROLTYPE = "controltype"; + private static final String JSON_ELEMENTCONFIG = "elementconfig"; + private static final String JSON_ID = "id"; + private static final String JSON_COLUMN = "column"; + private static final String JSON_PSEUDONYM = "pseudonym"; + private static final String JSON_PROPERTIES = "properties"; + private static final String JSON_TITLE = "title"; + private static final String JSON_PREFIXEDNAME = "prefixedName"; + private static final String JSON_ENTRY = "entry"; + private static final String JSON_ACTIVE = "ACTIVE"; + private static final String JSON_STATUS = "status"; + private static final String JSON_ARGUMENTS = "arguments"; + private static final String JSON_DATA = "data"; + private static final String JSON_OPERATION = "operation"; + private static final String JSON_TYPES = "types"; + + /** template output string constants */ + private static final String TEMPLATE_SET = "set"; + private static final String TEMPLATE_LABEL = "label"; + private static final String TEMPLATE_APPEARANCE = "appearance"; + private static final String TEMPLATE_PASSWORD = "password"; + private static final String TEMPLATE_STYLE = "style"; + private static final String TEMPLATE_STYLECLASS = "styleclass"; + private static final String TEMPLATE_MAXLENGTH = "maxLength"; + private static final String TEMPLATE_READONLY = "readonly"; + private static final String TEMPLATE_FORCE = "force"; + private static final String TEMPLATE_MODE = "mode"; + private static final String TEMPLATE_PARAMS = "params"; + private static final String TEMPLATE_ID = "id"; + private static final String TEMPLATE_FIELDS = "fields"; + private static final String TEMPLATE_SETS = "sets"; + private static final String TEMPLATE_PROPERTIES = "properties"; + private static final String TEMPLATE_TITLE = "title"; + private static final String TEMPLATE_FORM = "form"; + private static final String TEMPLATE_NAME = "name"; + private static final String TEMPLATE_ENTITIES = "entities"; + private static final String TEMPLATE_ASPECTS = "aspects"; + private static final String TEMPLATE_SUBTYPES = "subtypes"; + private static final String TEMPLATE_TYPES = "types"; + private static final String TEMPLATE_MODULE_NAME = "moduleName"; + private static final String TEMPLATE_TEMPLATE = "template"; + + /** control types */ + private static final String CONTROLTYPE_DEFAULT = "default"; + private static final String CONTROLTYPE_PASSWORD = "password"; + private static final String CONTROLTYPE_RICHTEXT = "richtext"; + private static final String CONTROLTYPE_TEXTAREA = "textarea"; + private static final String CONTROLTYPE_CONTENT = "content"; + private static final String CONTROLTYPE_TEXTFIELD = "textfield"; + private static final String CONTROLTYPE_HIDDEN = "hidden"; + private static final String CONTROLTYPE_SIZE = "size"; + private static final String CONTROLTYPE_MIMETYPE = "mimetype"; + private static final String CONTROLTYPE_TAGGABLE = "taggable"; + private static final String CONTROLTYPE_CATEGORIES = "categories"; + + /** well known DD types */ + private static final String CM_FOLDER = "cm:folder"; + private static final String CM_CONTENT = "cm:content"; + + /** Prefix used for all CMM related modules - the suffix is the model ID */ + private static final String MODULE_PREFIX = "CMM_"; + + /** path to the FreeMarker template used to render the module configuration for a model */ + private static final String MODULE_TEMPLATE_PATH = "/org/alfresco/cmm/components/module-configuration.ftl"; + + /** simple default JSON response for services when result value is proxied from the repository */ + protected static final String DEFAULT_OK_RESULT = "{\"success\":true}"; + + /** Repository Operations available from client API */ + private static final String OP_DELETE_PROPERTY = "deleteProperty"; + private static final String OP_EDIT_PROPERTY = "editProperty"; + private static final String OP_CREATE_PROPERTY = "createProperty"; + private static final String OP_DELETE_PROPERTY_GROUP = "deletePropertyGroup"; + private static final String OP_EDIT_PROPERTY_GROUP = "editPropertyGroup"; + private static final String OP_CREATE_PROPERTY_GROUP = "createPropertyGroup"; + private static final String OP_DELETE_TYPE = "deleteType"; + private static final String OP_EDIT_TYPE = "editType"; + private static final String OP_CREATE_TYPE = "createType"; + private static final String OP_DELETE_MODEL = "deleteModel"; + private static final String OP_DEACTIVATE_MODEL = "deactivateModel"; + private static final String OP_ACTIVATE_MODEL = "activateModel"; + private static final String OP_EDIT_MODEL = "editModel"; + private static final String OP_CREATE_MODEL = "createModel"; + + /** + * Mapping of client-side operation name to repository API templated URL + * The caller is responsible for passing the named arguments to the service in the JSON params. This service + * will then apply the template arguments to the URL and then proxy over any associated JSON data blob. + */ + protected static Map operationMapping = new HashMap() { + { + put(OP_CREATE_MODEL, "/-default-/private/alfresco/versions/1/cmm"); + put(OP_EDIT_MODEL, "/-default-/private/alfresco/versions/1/cmm/{name}"); + put(OP_ACTIVATE_MODEL, "/-default-/private/alfresco/versions/1/cmm/{name}?select=status"); + put(OP_DEACTIVATE_MODEL, "/-default-/private/alfresco/versions/1/cmm/{name}?select=status"); + put(OP_DELETE_MODEL, "/-default-/private/alfresco/versions/1/cmm/{name}"); + put(OP_CREATE_TYPE, "/-default-/private/alfresco/versions/1/cmm/{name}/types"); + put(OP_EDIT_TYPE, "/-default-/private/alfresco/versions/1/cmm/{name}/types/{typeName}"); + put(OP_DELETE_TYPE, "/-default-/private/alfresco/versions/1/cmm/{name}/types/{typeName}"); + put(OP_CREATE_PROPERTY_GROUP, "/-default-/private/alfresco/versions/1/cmm/{name}/aspects"); + put(OP_EDIT_PROPERTY_GROUP, "/-default-/private/alfresco/versions/1/cmm/{name}/aspects/{aspectName}"); + put(OP_DELETE_PROPERTY_GROUP, "/-default-/private/alfresco/versions/1/cmm/{name}/aspects/{aspectName}"); + put(OP_CREATE_PROPERTY, "/-default-/private/alfresco/versions/1/cmm/{name}/{entityClass}/{entityName}?select=props"); + put(OP_EDIT_PROPERTY, "/-default-/private/alfresco/versions/1/cmm/{name}/{entityClass}/{entityName}?select=props&update={propertyName}"); + put(OP_DELETE_PROPERTY, "/-default-/private/alfresco/versions/1/cmm/{name}/{entityClass}/{entityName}?select=props&delete={propertyName}"); + } + }; + + + /** + *

A @link ModuleDeploymentService} is required as it is used to refresh the configured module list.

+ */ + protected ModuleDeploymentService moduleDeploymentService; + + /** + * @param moduleDeploymentService ModuleDeploymentService + */ + public void setModuleDeploymentService(ModuleDeploymentService moduleDeploymentService) + { + this.moduleDeploymentService = moduleDeploymentService; + } + + protected DictionaryQuery dictionary; + + /** + * Dictionary Query bean reference + * + * @param dictionary DictionaryQuery + */ + public void setDictionary(DictionaryQuery dictionary) + { + this.dictionary = dictionary; + } + + protected FTLTemplateProcessor templateProcessor; + + /** + * @param templateProcessor FTLTemplateProcessor + */ + public void setTemplateProcessor(FTLTemplateProcessor templateProcessor) + { + this.templateProcessor = templateProcessor; + } + + public final static Cache CACHE_NEVER = new Cache(new Description.RequiredCache() { + @Override + public boolean getNeverCache() + { + return true; + } + + @Override + public boolean getIsPublic() + { + return false; + } + + @Override + public boolean getMustRevalidate() + { + return true; + } + }); + + + /** + * Model operation service call. Provide a proxy through to the given repo API and provides a hook + * for client business logic pertinent that may be required for each operation. + * + * @param status + * @param modelName + * @param json + * @throws IOException + */ + protected String serviceModelOperation(Status status, String modelName, JSONObject json) throws IOException + { + final String opId = (String)json.get(JSON_OPERATION); + + // repository API mapping operation - collect arguments, data blob - http method is as called + JSONObject data = (JSONObject)json.get(JSON_DATA); + + // map operation to URL and apply arguments + String url = operationMapping.get(opId); + if (url == null) + { + throw new IllegalArgumentException("Specified API operation does not map to a known URL: " + opId); + } + final Map args = new HashMap<>(); + JSONObject arguments = (JSONObject)json.get(JSON_ARGUMENTS); + if (arguments != null) + { + for (String key: (Set)arguments.keySet()) + { + args.put(key, URLEncoder.encode((String)arguments.get(key))); + } + } + url = UriUtils.replaceUriTokens(url, args); + + if (logger.isDebugEnabled()) + logger.debug("Executing service operation: " + opId + " with URL: " + url + " method: " + this.getDescription().getMethod() + + " - using data:\n" + (data != null ? data.toJSONString() : "null")); + + // pre operation business logic + Map updatedForms = null; + Response preResponse = null; + switch (opId) + { + case OP_DELETE_MODEL: + case OP_DEACTIVATE_MODEL: + { + // get model ready to remove it from dictionary if deactive is successful + JSONObject model = getModel(modelName); + String prefix = (String) model.get("namespacePrefix"); + preResponse = getConnector().call("/api/dictionary?model=" + URLEncoder.encode(prefix) + ":" + URLEncoder.encode(modelName)); + break; + } + + case OP_EDIT_MODEL: + { + // if a model has form definitions, they may need updating to ensure a modified Model Prefix is applied + // to the widget IDs within the forms - we use the "prefix:field" approach for widget IDs for form elements + JSONObject model = getModel(modelName); + String oldPrefix = (String) model.get("namespacePrefix"); + String newPrefix = (String) data.get("namespacePrefix"); + // if the prefix has changed then the IDs of the widgets in the form definitions will now be incorrect + if (!newPrefix.equals(oldPrefix)) + { + ExtensionModule module = getExtensionModule(modelName); + if (module != null) + { + // retrieve existing form definitions from extension configuration + updatedForms = getFormDefinitions(module); + if (updatedForms.size() != 0) + { + for (String formId: updatedForms.keySet()) + { + // modify the form JSON string - we want to replace "oldprefix:fieldid" with "newprefix:fieldid" to + // ensure the widget IDs in the form will match the expected namespace ID of the custom model + String form = updatedForms.get(formId); + updatedForms.put(formId, form.replace("\"id\":\"" + oldPrefix + ":", "\"id\":\"" + newPrefix + ":")); + } + } + } + } + break; + } + } + + // prepare proxied JSON body data and make the call + Response res; + if (data != null) + { + // make the request with the given data payload + res = getAPIConnector().call( + url, + new ConnectorContext(HttpMethod.valueOf(this.getDescription().getMethod())), + new ByteArrayInputStream(data.toJSONString().getBytes("UTF-8"))); + } + else + { + // no body required for this request + res = getAPIConnector().call( + url, + new ConnectorContext(HttpMethod.valueOf(this.getDescription().getMethod()))); + } + + if (logger.isDebugEnabled()) + logger.debug("Response: " + res.getStatus().getCode() + "\n" + res.getResponse()); + + int statusCode = res.getStatus().getCode(); + if (statusCode >= 200 && statusCode < 300) + { + // if we get here successfully, then perform post operation business logic + switch (opId) + { + case OP_ACTIVATE_MODEL: + { + if (logger.isDebugEnabled()) + logger.debug("ACTIVATE model config id: " + modelName); + + updateDictionaryForModel(modelName); + + buildExtensionModule(status, modelName, null, true); + + break; + } + + case OP_DEACTIVATE_MODEL: + { + if (logger.isDebugEnabled()) + logger.debug("DEACTIVATE model config id: " + modelName); + + // update dictionary - remove classes relating to this namespace + if (preResponse != null && preResponse.getStatus().getCode() == Status.STATUS_OK) + { + this.dictionary.updateRemoveClasses(preResponse.getResponse()); + } + else + { + if (logger.isWarnEnabled()) + logger.warn("Unable to update Share local Data Dictionary as Repository API call failed."); + } + + buildExtensionModule(status, modelName, null, false); + + break; + } + + case OP_CREATE_MODEL: + { + // NOTE: no need to update Dictionary - new model begins lifecycle as deactivated + break; + } + + case OP_EDIT_MODEL: + { + // NOTE: no need to update Dictionary - only deactivated models can be edited + + // updating to ensure form definitions are updated after a Model Prefix change + if (updatedForms != null && updatedForms.size() != 0) + { + buildExtensionModule(status, modelName, new FormOperation(FormOperationEnum.Create, updatedForms), false); + } + break; + } + + case OP_DELETE_MODEL: + { + if (logger.isDebugEnabled()) + logger.debug("Deleting extension and form definitions for model: " + modelName); + + // Delete the model - so delete the entire module definition and related configurations + deleteExtensionModule(status, modelName); + + // NOTE: no need to update Dictionary - only inactive models can be deleted and therefore already processed + break; + } + + case OP_CREATE_TYPE: + case OP_EDIT_TYPE: + { + // update the dictionary is the model is currently active + if (isModelActive(getModel(modelName))) + { + updateDictionaryForModel(modelName); + + buildExtensionModule(status, modelName, null, true); + } + + break; + } + + case OP_DELETE_TYPE: + case OP_DELETE_PROPERTY_GROUP: + { + // NOTE: no need to update Dictionary - only inactive models can have types or aspects deleted! + break; + } + + case OP_CREATE_PROPERTY_GROUP: + case OP_EDIT_PROPERTY_GROUP: + { + // update the dictionary is the model is currently active + if (isModelActive(getModel(modelName))) + { + buildExtensionModule(status, modelName, null, true); + + updateDictionaryForModel(modelName); + } + + break; + } + + case OP_CREATE_PROPERTY: + case OP_DELETE_PROPERTY: + { + if (isModelActive(getModel(modelName))) + { + // TODO: could update Dictionary if the granularity of properties are ever used...? + + buildExtensionModule(status, modelName, null, true); + } + break; + } + } + } + status.setCode(statusCode); + return res.getResponse(); + } + + /** + * Update the Share local Data Dictionary based on the current state of the given model. The model + * is retrieved and merged into the local data dictionary - adding or updating classes as required. + * + * @param modelName Name of the model to update dictionary for + */ + private void updateDictionaryForModel(final String modelName) + { + // update dictionary + if (logger.isDebugEnabled()) + logger.debug("Updating dictionary for model: " + modelName); + JSONObject model = getModel(modelName); + String prefix = (String) model.get("namespacePrefix"); + Response res = getConnector().call("/api/dictionary?model=" + URLEncoder.encode(prefix) + ":" + URLEncoder.encode(modelName)); + if (logger.isDebugEnabled()) + logger.debug("Dictionary get response " + res.getStatus().getCode() + "\n" + res.getResponse()); + if (res.getStatus().getCode() == Status.STATUS_OK) + { + this.dictionary.updateAddClasses(res.getResponse()); + } + } + + /** + * Return the JSON object for the meta description of the given model + * @param modelName Model to retrieve meta for + * @return JSON meta: + * { + * "author":"Kevin Roast", + * "name":"DemoModel", + * "description":"a demo model", + * "namespaceUri":"http://www.mycompany.com/model/demo/1.0", + * "namespacePrefix":"demo", + * "status":"DRAFT" + * } + */ + protected JSONObject getModel(String modelName) + { + Response res = getAPIConnector().call("/-default-/private/alfresco/versions/1/cmm/" + URLEncoder.encode(modelName)); + if (res.getStatus().getCode() == Status.STATUS_OK) + { + return ((JSONObject)getJsonBody(res).get(JSON_ENTRY)); + } + else + { + throw new AlfrescoRuntimeException("Unable to retrieve model information: " + modelName + " (" + res.getStatus().getCode() + ")"); + } + } + + /** + * @return the extension module ID for a given modelName + */ + protected String buildModuleId(String modelName) + { + return MODULE_PREFIX + modelName; + } + + /** + * @param model JSON model object + * @return true if the given model is active, false if deactivated + */ + private boolean isModelActive(JSONObject model) + { + return model.get(JSON_STATUS).equals(JSON_ACTIVE); + } + + protected void buildExtensionModule(Status status, String modelName, FormOperation formOp) + { + // is the model active? + boolean active = isModelActive(getModel(modelName)); + buildExtensionModule(status, modelName, formOp, active); + } + + protected void buildExtensionModule(Status status, String modelName, FormOperation formOp, JSONObject model) + { + // is the model active? + boolean active = isModelActive(model); + buildExtensionModule(status, modelName, formOp, active); + } + + /** + * Construct the Surf Extension Module for a given model. + *

+ * A Freemarker template is used to build the final extension module config from a hiearchy of template objects. See the + * various TEMPLATE_ constants and module-configuration.ftl for the template model object names and template structure. + *

+ * Each model maps to an extension and associated Share Forms and Share Document Library configuration output. If the model + * is active then a number of Share Forms may be generated from persisted JSON form layouts. The template model transforms + * the generic JSON form structure to the esoteric Share Form XML configuration. + * + * @param status WebScript status object - used to set error codes + * @param modelName Model name to construct extension config for + * @param formOp Optional form operation to apply to current Forms before extension module is generated + * @param active Model active/deactive status + */ + protected void buildExtensionModule(Status status, String modelName, FormOperation formOp, boolean active) + { + final String moduleId = buildModuleId(modelName); + + // construct the model used to render the module template configuration + TWrapper model = new TWrapper(8); + model.put(TEMPLATE_MODULE_NAME, moduleId); + + List typeList = new ArrayList<>(); + model.put(TEMPLATE_TYPES, typeList); + List subtypesList = new ArrayList<>(); + model.put(TEMPLATE_SUBTYPES, subtypesList); + List aspectsList = new ArrayList<>(); + model.put(TEMPLATE_ASPECTS, aspectsList); + List entitiesList = new ArrayList<>(); + model.put(TEMPLATE_ENTITIES, entitiesList); + + // retrieve form configuration if present already for this module to update new module definition + Map formDefs = new HashMap<>(); + ExtensionModule module = getExtensionModule(modelName); + if (module != null) + { + // retrieve existing form definitions from extension configuration e.g. + formDefs = getFormDefinitions(module); + } + + // perform optional form CrUD operation + if (formOp != null) + { + formOp.perform(formDefs); + } + + // add form definitions to template model map + for (String entityId : formDefs.keySet()) + { + TWrapper wrapper = new TWrapper(4); + wrapper.put(TEMPLATE_NAME, entityId) + .put(TEMPLATE_FORM, formDefs.get(entityId)); + entitiesList.add(wrapper); + } + + // if the model is active, we want to generate the Share config for types/aspects/forms + if (active) + { + // get all types and aspects for the model and process them + Response response = getAPIConnector().call("/-default-/private/alfresco/versions/1/cmm/"+URLEncoder.encode(modelName)+"?select=all"); + if (response.getStatus().getCode() == Status.STATUS_OK) + { + JSONObject jsonData = getJsonBody(response); + + // process types + final JSONArray types = (JSONArray)((JSONObject)jsonData.get(JSON_ENTRY)).get(JSON_TYPES); + + // walk the types and use form definitions to generate the form config objects + // and also generate the sub-types list + Map> subtypeMap = new HashMap<>(); + for (final Object t : types) + { + final JSONObject type = (JSONObject)t; + String typeName = (String)type.get(JSON_PREFIXEDNAME); + + // generate form wrapper objects for this type + TWrapper formWrappers = processFormWidgets(formDefs, type); + + // form definition present for this type? + if (formWrappers.size() != 0) + { + // add type wrapper for template output + TWrapper typeWrapper = new TWrapper(8); + typeWrapper.put(TEMPLATE_NAME, typeName) + .put(TEMPLATE_TITLE, (String)type.get(JSON_TITLE)); + typeList.add(typeWrapper); + + // add all form wrapper objects for the type + typeWrapper.putAll(formWrappers); + + // for each type, firstly ensure is subtype of cm:content, + // then walk the parent hiearchy and add this type as a subtype of each parent type up to and including cm:content + if (this.dictionary.isSubType(typeName, CM_CONTENT) || this.dictionary.isSubType(typeName, CM_FOLDER)) + { + String parentType = typeName; + do + { + // walk hiearchy to prepare for next loop iteration + parentType = this.dictionary.getParent(parentType); + + List subtypes = subtypeMap.get(parentType); + if (subtypes == null) + { + subtypes = new ArrayList<>(4); + subtypeMap.put(parentType, subtypes); + } + + // check for existing - hierachies of types can repeat the same type from other hierachy + boolean found = false; + for (TWrapper st: subtypes) + { + if (st.get(TEMPLATE_NAME).equals(typeName)) + { + found = true; + break; + } + } + + // add subtype wrapper for template output + if (!found) + { + TWrapper subtypeWrapper = new TWrapper(4); + subtypeWrapper.put(TEMPLATE_NAME, typeName) + .put(TEMPLATE_TITLE, this.dictionary.getTitle(typeName)); + subtypes.add(subtypeWrapper); + } + + } while (!(CM_CONTENT.equals(parentType) || CM_FOLDER.equals(parentType))); + } + } + } + // convert map to List for templates - each parent type then has an associated list of sub-type wrappers + for (final String type : subtypeMap.keySet()) + { + TWrapper stypeWrapper = new TWrapper(4); + stypeWrapper.put(TEMPLATE_NAME, type) + .put(TEMPLATE_SUBTYPES, subtypeMap.get(type)); + subtypesList.add(stypeWrapper); + } + + // process aspects + final JSONArray aspects = (JSONArray)((JSONObject)jsonData.get(JSON_ENTRY)).get(TEMPLATE_ASPECTS); + + for (final Object a : aspects) + { + final JSONObject aspect = (JSONObject)a; + final String aspectName = (String)aspect.get(JSON_PREFIXEDNAME); + + // generate form wrapper objects for this aspect + TWrapper formWrappers = processFormWidgets(formDefs, aspect); + + // add aspect wrapper for template output + TWrapper aspectWrapper = new TWrapper(8); + aspectWrapper.put(TEMPLATE_NAME, aspectName) + .put(TEMPLATE_TITLE, (String)aspect.get(JSON_TITLE)); + aspectsList.add(aspectWrapper); + + // add all form wrapper objects for the type + aspectWrapper.putAll(formWrappers); + } + } + else + { + throw new AlfrescoRuntimeException("Unable to retrieve types and aspects for model id: " + modelName); + } + } + + // render the template to generate the final module configuration and persist it + Writer out = new StringBuilderWriter(4096); + try + { + this.templateProcessor.process(MODULE_TEMPLATE_PATH, model, out); + + if (logger.isDebugEnabled()) + logger.debug("Attempting to save module config:\r\n" + out.toString()); + + if (module == null) + { + this.moduleDeploymentService.addModuleToExtension(out.toString()); + } + else + { + this.moduleDeploymentService.updateModuleToExtension(out.toString()); + } + + if (logger.isDebugEnabled()) + logger.debug("addModuleToExtension() completed."); + } + catch (WebScriptException | DocumentException | ModelObjectPersisterException err) + { + // template error - probably developer exception so report in log + logger.error("Failed to execute template to construct module configuration.", err); + errorResponse(status, err.getMessage()); + } + } + + /** + * Read, process and transform the JSON entity that represents the generic Aikau Form widget tree. + * The elements are nested within panels with varying numbers of column. Each widget within the column + * has a number of configuration parameters. + *

+ * Consume the JSON entity and transform the generic tree into a template model for rendering Share Forms + * configuration for properties and rendering sets of associated fields. + *

+ * See module-configuration.ftl + * + * @param forms List of current Form state + * @param entity JSON object containing Form widget hiearchy + * + * @return Template wrapper objects containing the hierarchical model ready for template rendering + */ + protected TWrapper processFormWidgets(Map forms, JSONObject entity) + { + TWrapper formPropertyWrappers = new TWrapper(8); + + String entityName = (String)entity.get(TEMPLATE_NAME); + + String formDef = forms.get(entityName); + if (formDef != null) + { + // form definition present for this type - transform it into Share Forms Runtime configuration + try + { + Object o = new JSONParser().parse(formDef); + if (o instanceof JSONArray) + { + JSONArray formElements = (JSONArray)o; + + if (formElements.size() != 0) + { + // construct the wrapper collections to hold our properties, sets and field wrappers + List properties = new ArrayList<>(); + formPropertyWrappers.put(TEMPLATE_PROPERTIES, properties); + List sets = new ArrayList<>(); + formPropertyWrappers.put(TEMPLATE_SETS, sets); + List fields = new ArrayList<>(); + formPropertyWrappers.put(TEMPLATE_FIELDS, fields); + // used to ensure a single Set of fields i.e. one per property id + Map fieldMap = new HashMap<>(); + + // process well known component names and output wrappers + for (Object item: formElements) + { + // avoid garbage - there should not be any arrays etc. at root + if (!(item instanceof JSONObject)) + { + throw new IllegalStateException("Unexpected item in form structure: " + formDef); + } + + // prepare state - set by lookup table against the various column layout options + int numCols = 0; + String columnSetTemplate = null; + final String name = (String) ((JSONObject)item).get(JSON_PSEUDONYM); + switch (name) + { + case "cmm/editor/layout/1cols": + { + numCols = 1; + break; + } + case "cmm/editor/layout/2cols": + { + numCols = 2; + columnSetTemplate = "/org/alfresco/components/form/2-column-set.ftl"; + break; + } + case "cmm/editor/layout/2colswideleft": + { + numCols = 2; + columnSetTemplate = "/org/alfresco/components/form/2-column-wide-left-set.ftl"; + break; + } + case "cmm/editor/layout/3cols": + { + numCols = 3; + columnSetTemplate = "/org/alfresco/components/form/3-column-set.ftl"; + break; + } + } + + if (numCols != 0) + { + // process properties containing within the column child object + List colProperties = new ArrayList<>(); + JSONArray column = (JSONArray) ((JSONObject)item).get(JSON_COLUMN); + if (column != null) + { + // process widget list within each column - form fields automatically wrap + // at the appropriate column index when rendered by the Forms Runtime template + for (Object w : column) + { + // process widget list - wraps automatically at column index + JSONObject widget = ((JSONObject)w); + String pseudonym = (String) widget.get(JSON_PSEUDONYM); + String id = (String) widget.get(JSON_ID); + + if (logger.isDebugEnabled()) + logger.debug("Processing widget: " + id + " of type: " + pseudonym); + + // generate a template wrapper for the property widget Form config + TWrapper controlProperties = new TWrapper(4).put(TEMPLATE_NAME, id); + colProperties.add(controlProperties); + + final JSONObject config = (JSONObject) widget.get(JSON_ELEMENTCONFIG); + if (config != null) + { + if (logger.isDebugEnabled()) + logger.debug("Found 'elementconfig' for widget - processing..."); + + // generate wrappers for control params and field properties + Map controlParams = new HashMap<>(4); + TWrapper fieldWrapper = new TWrapper(4).put(TEMPLATE_ID, id) + .put(TEMPLATE_PARAMS, controlParams); + fieldMap.put(id, fieldWrapper); + + // map element config to Forms Config values + // this is fiddly - the simple list of properties is remapped to attributes on + // both the control property and on the associated field mapping for it + String controlType = (String) config.get(JSON_CONTROLTYPE); + String mode = (String) config.get(JSON_FOR_MODE); + if (mode != null && !mode.equals(JSON_ANY)) controlProperties.put(TEMPLATE_MODE, mode); + // deal with annoying checkbox = string when not used, but boolean when clicked nonsense + if (config.get(JSON_FORCE) instanceof Boolean) + { + Boolean force = (Boolean) config.get(JSON_FORCE); + if (Boolean.TRUE == force) controlProperties.put(TEMPLATE_FORCE, true); + } + if (config.get(JSON_HIDDEN) instanceof Boolean) + { + Boolean hidden = (Boolean) config.get(JSON_HIDDEN); + if (Boolean.TRUE == hidden) controlType = CONTROLTYPE_HIDDEN; + } + if (config.get(JSON_READ_ONLY) instanceof Boolean) + { + Boolean readOnly = (Boolean) config.get(JSON_READ_ONLY); + if (Boolean.TRUE == readOnly) fieldWrapper.put(TEMPLATE_READONLY, true); + } + Number maxLength = (Number) config.get(JSON_MAXLENGTH); + if (maxLength != null) controlParams.put(TEMPLATE_MAXLENGTH, maxLength); + String style = (String) config.get(JSON_STYLE); + if (style != null && style.length() != 0) controlParams.put(TEMPLATE_STYLE, style); + String styleClass = (String) config.get(JSON_STYLECLASS); + if (styleClass != null && styleClass.length() != 0) controlParams.put(TEMPLATE_STYLECLASS, styleClass); + + // control type for field wrapper - each control type maps to a wrapper template and params as per Share Forms config + String template = null; + if (controlType != null) + { + switch (controlType) + { + case CONTROLTYPE_TEXTFIELD: + template = "/org/alfresco/components/form/controls/textfield.ftl"; + break; + case CONTROLTYPE_TEXTAREA: + template = "/org/alfresco/components/form/controls/textarea.ftl"; + break; + case CONTROLTYPE_CONTENT: + template = "/org/alfresco/components/form/controls/content.ftl"; + break; + case CONTROLTYPE_RICHTEXT: + template = "/org/alfresco/components/form/controls/richtext.ftl"; + break; + case CONTROLTYPE_PASSWORD: + template = "/org/alfresco/components/form/controls/textfield.ftl"; + controlParams.put(TEMPLATE_PASSWORD, "true"); + break; + case CONTROLTYPE_HIDDEN: + template = "/org/alfresco/components/form/controls/hidden.ftl"; + break; + case CONTROLTYPE_SIZE: + template = "/org/alfresco/components/form/controls/size.ftl"; + break; + case CONTROLTYPE_MIMETYPE: + template = "/org/alfresco/components/form/controls/mimetype.ftl"; + break; + case CONTROLTYPE_TAGGABLE: + controlParams.put("compactMode", "true"); + controlParams.put("params", "aspect=cm:taggable"); + controlParams.put("createNewItemUri", "/api/tag/workspace/SpacesStore"); + controlParams.put("createNewItemIcon", "tag"); + break; + case CONTROLTYPE_CATEGORIES: + controlParams.put("compactMode", "true"); + break; + case CONTROLTYPE_DEFAULT: + break; + default: + if (logger.isDebugEnabled()) + logger.debug("WARNING: unknown control type for template mapping: " + controlType); + } + if (template != null) + { + fieldWrapper.put(TEMPLATE_TEMPLATE, template); + if (logger.isDebugEnabled()) + logger.debug("Widget control template: " + template); + } + } + } + } + } + // output a layout set - if number of columns > 1 then output a set template to render columns + // Example: + // + // also see web-framework-commons/.../form.lib.ftl + final JSONObject config = (JSONObject) ((JSONObject)item).get(JSON_ELEMENTCONFIG); + String panelLabel = (String) config.get(JSON_LABEL); + boolean hasLabel = (panelLabel != null && panelLabel.length() != 0); + final String setId = entity.get(JSON_PREFIXEDNAME) + "_cmm_set" + sets.size(); + TWrapper setWrapper = new TWrapper(8); + setWrapper.put(TEMPLATE_APPEARANCE, hasLabel ? config.get(JSON_APPEARANCE) : "whitespace") + .put(TEMPLATE_ID, setId); + if (numCols > 1) setWrapper.put(TEMPLATE_TEMPLATE, columnSetTemplate); + if (hasLabel) setWrapper.put(TEMPLATE_LABEL, config.get(JSON_LABEL)); + sets.add(setWrapper); + + // bind properties via fields to the column set + // Example: + // + for (TWrapper property: colProperties) + { + String id = (String)property.get(TEMPLATE_NAME); + TWrapper fieldWrapper = fieldMap.get(id); + if (fieldWrapper == null) + { + fieldWrapper = new TWrapper(4).put(TEMPLATE_ID, id); + fieldMap.put(id, fieldWrapper); + } + fieldWrapper.put(TEMPLATE_SET, setId); + if (logger.isDebugEnabled()) + logger.debug("Field mapping of: " + id + " mapped to set:" + setId); + } + + // add all the properties gathered for this column set + properties.addAll(colProperties); + + } // end num cols != check + } // end form elements processing loop + + // add all fields from the map to the list structure used by the template + fields.addAll(fieldMap.values()); + } + } + } + catch (ParseException e) + { + logger.warn("Unable to parse Form definition for entity: " + entityName + "\n" + formDef + "\n" + e.getMessage()); + } + } + return formPropertyWrappers; + } + + /** + * Delete extension module for a given model + * + * @param status WebScript status object - used to set error codes + * @param modelName Model name to delete extension config for + */ + protected void deleteExtensionModule(Status status, String modelName) + { + if (logger.isDebugEnabled()) + logger.debug("Attempting to delete module: " + buildModuleId(modelName)); + + try + { + this.moduleDeploymentService.deleteModuleFromExtension(buildModuleId(modelName)); + } + catch (DocumentException | ModelObjectPersisterException err) + { + // template error - probably developer exception so report in log + logger.error("Failed to execute template to construct module configuration.", err); + errorResponse(status, err.getMessage()); + } + + if (logger.isDebugEnabled()) + logger.debug("deleteModuleFromExtension() completed."); + } + + /** + * @param modelName Model name to get extension module for + * @return ExtensionModule + */ + protected ExtensionModule getExtensionModule(final String modelName) + { + final String moduleId = buildModuleId(modelName); + ExtensionModule module = null; + for (ModuleDeployment m : this.moduleDeploymentService.getDeployedModules()) + { + if (moduleId.equals(m.getId())) + { + module = m.getExtensionModule(); + if (logger.isDebugEnabled()) + logger.debug("Found existing module for ID: " + moduleId); + } + } + if (module == null) + { + // no module yet - lazy create on module save + if (logger.isDebugEnabled()) + logger.debug("No module found for ID: " + moduleId); + } + return module; + } + + /** + * @param modelName Model to get the Form Definitions map for + * @return the Form Definitions map for a given model + */ + protected Map getFormDefinitions(String modelName) + { + return getFormDefinitions(getExtensionModule(modelName)); + } + + protected Map getFormDefinitions(ExtensionModule module) + { + Map forms = new HashMap<>(); + if (module != null) + { + List configs = module.getConfigurations(); + for (Element config: configs) + { + List nodeForms = new ArrayList(); + for (Object obj : config.selectNodes("config/form-definition")) { + nodeForms.add((Element) obj); + } + //for (Element form : (List)config.selectNodes("config/form-definition")) + for (Element form : nodeForms) + { + String formId = form.attributeValue(JSON_ID); + String formJSON = form.getText(); + forms.put(formId, formJSON); + } + } + } + return forms; + } + + protected Connector getConnector() + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + try + { + return rc.getServiceRegistry().getConnectorService().getConnector("alfresco", rc.getUserId(), ServletUtil.getSession()); + } + catch (ConnectorServiceException e) + { + throw new AlfrescoRuntimeException("Connector exception.", e); + } + } + + protected Connector getAPIConnector() + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + try + { + return rc.getServiceRegistry().getConnectorService().getConnector("alfresco-api", rc.getUserId(), ServletUtil.getSession()); + } + catch (ConnectorServiceException e) + { + throw new AlfrescoRuntimeException("Connector exception.", e); + } + } + + protected JSONObject getJsonBody(final WebScriptRequest req) + { + try + { + JSONObject jsonData = null; + final String content = req.getContent().getContent(); + if (content != null && content.length() != 0) + { + Object o = new JSONParser().parse(content); + if (o instanceof JSONObject) + { + jsonData = (JSONObject) o; + } + } + return jsonData; + } + catch (ParseException | IOException e) + { + throw new AlfrescoRuntimeException("Failed to retrieve or parse JSON body.", e); + } + } + + protected JSONObject getJsonBody(final Response res) + { + try + { + JSONObject jsonData = null; + final String content = res.getResponse(); + if (content != null && content.length() != 0) + { + Object o = new JSONParser().parse(content); + if (o instanceof JSONObject) + { + jsonData = (JSONObject) o; + } + } + return jsonData; + } + catch (ParseException e) + { + throw new AlfrescoRuntimeException("Failed to retrieve or parse JSON body.", e); + } + } + + protected void errorResponse(Status status, String msg) + { + status.setCode(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + status.setMessage(msg); + status.setRedirect(true); + } + + + /** + * Enum that represents the operations that can be performed on a Form definition for an entity + */ + enum FormOperationEnum + { + Create, Update, Delete + } + + + /** + * Wrapper class that encapsulates a CRUD operation for a Form definition + */ + class FormOperation + { + private final FormOperationEnum op; + private final String entityId; + private final String form; + private final Map forms; + + FormOperation(FormOperationEnum op, String entityId, String form) + { + this.op = op; + if (entityId == null || entityId.length() == 0) + { + throw new IllegalArgumentException("EntityID is mandatory."); + } + this.entityId = entityId; + this.form = form; + this.forms = null; + } + + FormOperation(FormOperationEnum op, Map forms) + { + this.op = op; + if (forms == null) + { + throw new IllegalArgumentException("Forms map is mandatory."); + } + this.entityId = null; + this.form = null; + this.forms = forms; + } + + /** + * Perform the given operation on the given forms map onto the given output list + * @param forms Map of entity Ids to forms defs + */ + void perform(Map forms) + { + switch (this.op) + { + case Create: + { + forms.putAll(this.forms); + break; + } + case Update: + { + forms.put(this.entityId, this.form); + break; + } + case Delete: + { + forms.remove(this.entityId); + break; + } + } + } + } + + + /** + * Simple wrapper class for a template Map object - to avoid verbose Map generics code. + */ + public static class TWrapper extends HashMap implements Map + { + public TWrapper(int size) + { + super(size); + } + + public TWrapper put(String key, Object value) + { + super.put(key, value); + return this; + } + + public TWrapper putAll(Object... args) + { + for (int i=0; i. + */ +package org.alfresco.web.cmm; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.simple.JSONObject; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * Handles CMM WebScript DELETE requests to perform a number of service related functions: + *

+ * Delete the module configuration for a model.
+ * Delete a type or aspect from a model.
+ * Delete a form definition for a type/aspect from the model.
+ * + * @author Kevin Roast + */ +public class CMMServiceDelete extends CMMService +{ + private static final Log logger = LogFactory.getLog(CMMServiceDelete.class); + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map result = new HashMap<>(); + result.put("result", DEFAULT_OK_RESULT); + try + { + JSONObject json = getJsonBody(req); + if (json != null) + { + /** + * Standard JSON structure for all service requests: + * { + * 'modelName': "modelid", // mandatory model name + * 'operation': "createModel", // operation ID if a proxied repository operation is requested + * 'data': { ... }, // data blob to be proxied over + * 'arguments': { ... } // name/value pairs to be applied to templated operation URL + * } + */ + String modelName = (String)json.get("modelName"); + if (modelName == null || modelName.length() == 0) + { + throw new IllegalArgumentException("No 'modelName' was provided"); + } + else + { + if (json.get("operation") != null) + { + result.put("result", serviceModelOperation(status, modelName, json)); + } + } + } + else + { + // URL pattern based request + final Map params = req.getServiceMatch().getTemplateVars(); + String modelName = params.get("model"); + String entityId = params.get("entity"); + + // modelName is mandatory first body param for all requests + if (modelName != null && modelName.length() != 0 && entityId != null && entityId.length() != 0) + { + String form = params.get("form"); + if (form != null && form.length() != 0) + { + // 1. delete form definition for an entity + if (logger.isDebugEnabled()) + logger.debug("Updating extension for model: " + modelName + " due to deleted form definition for entity: " + entityId); + + // rebuild the extension to remove the specified Form definition + buildExtensionModule(status, modelName, new FormOperation(FormOperationEnum.Delete, entityId, form)); + } + else + { + // 2. delete an entity definition + if (logger.isDebugEnabled()) + logger.debug("Updating extension for model: " + modelName + " due to deleted entity: " + entityId); + + // + // TODO: update dictionary to remove the type/aspect + // + } + } + } + } + catch (IOException err) + { + errorResponse(status, err.getMessage()); + } + return result; + } +} diff --git a/share/src/main/java/org/alfresco/web/cmm/CMMServiceGet.java b/share/src/main/java/org/alfresco/web/cmm/CMMServiceGet.java new file mode 100644 index 0000000000..4e2ba828d8 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/cmm/CMMServiceGet.java @@ -0,0 +1,93 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.cmm; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * Handles CMM WebScript GET requests to perform a number of service related functions: + *

+ * Retrieve a form definition for a type or aspect in a model.
+ * Retrieve the extension module ID for a model.
+ *

+ * Note that this WebScript does not delegate the execute to the base CMMService impl + * as it is only responsible for Read operations - not the CrUD lifecycle operations. + * + * @author Kevin Roast + */ +public class CMMServiceGet extends CMMService +{ + private static final Log logger = LogFactory.getLog(CMMServiceGet.class); + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map result = new HashMap<>(); + + String modelId = req.getServiceMatch().getTemplateVars().get("model"); + if (modelId == null || modelId.length() == 0) + { + throw new IllegalArgumentException("model name is mandatory"); + } + + String entityId = req.getServiceMatch().getTemplateVars().get("entity"); + if (entityId != null && entityId.length() != 0) + { + if (logger.isDebugEnabled()) + logger.debug("Retrieving form definition for model: " + modelId + " and entity: " + entityId); + + // get module and retrieve requested form definition + String formDef = getFormDefinitions(modelId).get(entityId); + + if (logger.isDebugEnabled()) + logger.debug("Form definition: " + (formDef != null ? formDef : "null")); + + result.put("form", formDef != null ? formDef : ""); + } + else + { + if (req.getServiceMatch().getTemplate().endsWith("/forms")) + { + if (logger.isDebugEnabled()) + logger.debug("Retrieving form states for model: " + modelId); + + Map defs = getFormDefinitions(modelId); + result.put("forms", new ArrayList<>(defs.keySet())); + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Retrieving module ID for model: " + modelId); + + result.put("moduleId", getExtensionModule(modelId) != null ? buildModuleId(modelId) : ""); + } + } + return result; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/cmm/CMMServicePost.java b/share/src/main/java/org/alfresco/web/cmm/CMMServicePost.java new file mode 100644 index 0000000000..2220f220e4 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/cmm/CMMServicePost.java @@ -0,0 +1,142 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.cmm; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.json.simple.JSONObject; +import org.springframework.extensions.surf.types.Extension; +import org.springframework.extensions.surf.types.ExtensionModule; +import org.springframework.extensions.surf.util.XMLUtil; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * Handles CMM WebScript POST requests to perform a number of service related functions: + *

+ * Update a model {@link ExtensionModule} to the persisted {@link Extension}.
+ * Save a form definition for a type or aspect in a model.
+ * + * @author Kevin Roast + */ +public class CMMServicePost extends CMMService +{ + private static final Log logger = LogFactory.getLog(CMMServicePost.class); + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map result = new HashMap<>(); + result.put("result", DEFAULT_OK_RESULT); + try + { + JSONObject json = getJsonBody(req); + if (json == null) + { + throw new IllegalArgumentException("No JSON body was provided."); + } + else + { + /** + * Standard JSON structure for all service requests: + * { + * 'modelName': "modelid", // mandatory model name + * 'operation': "createModel", // operation ID if a proxied repository operation is requested + * 'data': { ... }, // data blob to be proxied over + * 'arguments': { ... } // name/value pairs to be applied to templated operation URL + * } + */ + String modelName = (String)json.get("modelName"); + if (modelName == null || modelName.length() == 0) + { + throw new IllegalArgumentException("No 'modelName' was provided"); + } + else + { + if (json.get("operation") != null) + { + result.put("result", serviceModelOperation(status, modelName, json)); + } + else + { + // Form definition update for an entity in the model + String entityId = (String)json.get("entity"); + if (entityId != null && entityId.length() != 0) + { + String form = (String)json.get("form"); + String formOp = (String)json.get("formOperation"); + // construct extension with new form config added + FormOperationEnum op = FormOperationEnum.Update; + if (formOp != null && formOp.length() != 0) + { + op = FormOperationEnum.valueOf(formOp); + } + buildExtensionModule(status, modelName, new FormOperation(op, entityId, form)); + } + // perhaps an Import operation Form post? + else + { + String formExtension = (String)json.get("forms"); + if (formExtension != null && formExtension.length() != 0) + { + // process XML and extract only forms - then regenerate the rest + Map forms = new HashMap<>(); + Document doc = XMLUtil.parse(formExtension); + //List formDefNodes = doc.selectNodes("/module/configurations/config[@condition='FormDefinition']/form-definition"); + List formDefNodes = new ArrayList(); + + for (Object obj : doc.selectNodes("/module/configurations/config[@condition='FormDefinition']/form-definition")) { + formDefNodes.add((Element) obj); + } + + + if (formDefNodes != null) + { + for (Element node: formDefNodes) + { + forms.put(node.attributeValue("id"), node.getText()); + } + } + + buildExtensionModule(status, modelName, new FormOperation(FormOperationEnum.Create, forms), false); + } + } + } + } + } + } + catch (IOException | DocumentException err) + { + errorResponse(status, err.getMessage()); + } + return result; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/cmm/CMMServicePut.java b/share/src/main/java/org/alfresco/web/cmm/CMMServicePut.java new file mode 100644 index 0000000000..3c25e9f0f2 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/cmm/CMMServicePut.java @@ -0,0 +1,86 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.cmm; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.simple.JSONObject; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * Handles CMM WebScript PUT requests to perform a number of service related functions: + * + * @author Kevin Roast + */ +public class CMMServicePut extends CMMService +{ + private static final Log logger = LogFactory.getLog(CMMServicePut.class); + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map result = new HashMap<>(); + result.put("result", DEFAULT_OK_RESULT); + try + { + JSONObject json = getJsonBody(req); + if (json == null) + { + throw new IllegalArgumentException("No JSON body was provided."); + } + else + { + /** + * Standard JSON structure for all service requests: + * { + * 'modelName': "modelid", // mandatory model name + * 'operation': "createModel", // operation ID if a proxied repository operation is requested + * 'data': { ... }, // data blob to be proxied over + * 'arguments': { ... } // name/value pairs to be applied to templated operation URL + * } + */ + String modelName = (String)json.get("modelName"); + if (modelName == null || modelName.length() == 0) + { + throw new IllegalArgumentException("No 'modelName' was provided"); + } + else + { + if (json.get("operation") != null) + { + result.put("result", serviceModelOperation(status, modelName, json)); + } + } + } + } + catch (IOException err) + { + errorResponse(status, err.getMessage()); + } + return result; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/config/header/HeaderConfigElement.java b/share/src/main/java/org/alfresco/web/config/header/HeaderConfigElement.java new file mode 100644 index 0000000000..03c3a3e13f --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/header/HeaderConfigElement.java @@ -0,0 +1,172 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.header; + +import java.util.List; + +import org.alfresco.web.config.forms.DependenciesConfigElement; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.ConfigException; +import org.springframework.extensions.config.element.ConfigElementAdapter; + +/** + * Custom config element that represents 'header' values for the client. + * + * @author Mike Hatfield. + */ +public class HeaderConfigElement extends ConfigElementAdapter +{ + private static final long serialVersionUID = 7721694406825674057L; + + public static final String HEADER_ID = "header"; + + private boolean legacyMode = false; + private int maxRecentSites; + private int maxDisplayedSitePages; + private HeaderItemsConfigElement appItemsConfigElement; + private HeaderItemsConfigElement userItemsConfigElement; + private DependenciesConfigElement dependenciesConfigElement; + + public HeaderConfigElement() + { + super(HEADER_ID); + } + + public HeaderConfigElement(String name) + { + super(name); + } + + /** + * @see ConfigElement#getChildren() + */ + @Override + public List getChildren() + { + throw new ConfigException( + "Reading the header config via the generic interfaces is not supported"); + } + + public boolean getLegacyMode() + { + return this.legacyMode; + } + + void setLegacyMode(boolean enabled) + { + this.legacyMode = enabled; + } + + public int getMaxRecentSites() + { + return this.maxRecentSites; + } + + void setMaxRecentSites(int n) + { + this.maxRecentSites = n; + } + + public int getMaxDisplayedSitePages() + { + return this.maxDisplayedSitePages; + } + + void setMaxDisplayedSitePages(int n) + { + this.maxDisplayedSitePages = n; + } + + public HeaderItemsConfigElement getAppItems() + { + return this.appItemsConfigElement; + } + + void setAppItems(HeaderItemsConfigElement items) + { + this.appItemsConfigElement = items; + } + + public HeaderItemsConfigElement getUserItems() + { + return this.userItemsConfigElement; + } + + void setUserItems(HeaderItemsConfigElement items) + { + this.userItemsConfigElement = items; + } + + public DependenciesConfigElement getDependencies() + { + return this.dependenciesConfigElement; + } + + void setDependencies(DependenciesConfigElement dependencies) + { + this.dependenciesConfigElement = dependencies; + } + + /** + * @see ConfigElement#combine(org.springframework.extensions.config.ConfigElement) + */ + @Override + public ConfigElement combine(ConfigElement otherConfigElement) + { + HeaderConfigElement otherHeaderElem = (HeaderConfigElement)otherConfigElement; + HeaderConfigElement result = new HeaderConfigElement(); + + /* + for (String thisFormId : this.formElementsById.keySet()) + { + if (otherFormsElem.formElementsById.containsKey(thisFormId)) + { + FormConfigElement otherFormCE = otherFormsElem.getForm(thisFormId); + FormConfigElement combinedElement = (FormConfigElement)formElementsById.get(thisFormId).combine(otherFormCE); + result.addFormById(combinedElement, thisFormId); + } + else + { + result.addFormById(this.formElementsById.get(thisFormId), thisFormId); + } + } + for (String otherFormId : otherFormsElem.formElementsById.keySet()) + { + if (this.formElementsById.containsKey(otherFormId)) + { + // Ignore it. The combination was handled in the previous loop. + } + else + { + result.addFormById(otherFormsElem.formElementsById.get(otherFormId), otherFormId); + } + } + */ + + // Combine dependencies + ConfigElement combinedDependencies = this.dependenciesConfigElement == null ? + otherHeaderElem.getDependencies() + : this.dependenciesConfigElement.combine(otherHeaderElem.getDependencies()); + result.setDependencies((DependenciesConfigElement)combinedDependencies); + + return result; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/config/header/HeaderElementReader.java b/share/src/main/java/org/alfresco/web/config/header/HeaderElementReader.java new file mode 100644 index 0000000000..ea405a1009 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/header/HeaderElementReader.java @@ -0,0 +1,141 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.header; + +import java.util.List; + +import org.alfresco.web.config.forms.DependenciesConfigElement; +import org.alfresco.web.config.forms.DependenciesElementReader; +import org.dom4j.Element; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.ConfigException; +import org.springframework.extensions.config.xml.elementreader.ConfigElementReader; + +/** + * This class is a custom element reader to parse the config file for + * <header> elements. + * + * @author Mike Hatfield. + * @see org.alfresco.web.config.forms.DependenciesElementReader + */ +public class HeaderElementReader implements ConfigElementReader +{ + public static final String ELEMENT_HEADER = "header"; + + /** + * @see org.springframework.extensions.config.xml.elementreader.ConfigElementReader#parse(org.dom4j.Element) + */ + public ConfigElement parse(Element headerElement) + { + HeaderConfigElement result = null; + if (headerElement == null) + { + return null; + } + + String name = headerElement.getName(); + if (!name.equals(ELEMENT_HEADER)) + { + throw new ConfigException(this.getClass().getName() + + " can only parse " + ELEMENT_HEADER + + " elements, the element passed was '" + name + "'"); + } + + result = new HeaderConfigElement(); + + // Find all the legacy-mode-enabled elements (there should only be one) and perform an AND on all the + // elements to determine whether or not we're in legacy mode + boolean configuredLegacyMode = true; + @SuppressWarnings("unchecked") + List legacyModeElements = headerElement.elements(HeaderItemsElementReader.ELEMENT_LEGACY); + for (Element legacyModeElement: legacyModeElements) + { + configuredLegacyMode = configuredLegacyMode && Boolean.parseBoolean(legacyModeElement.getStringValue()); + } + // We're in legacy mode if ALL the legacy configuration elements were set to true and there was at least one. + result.setLegacyMode(configuredLegacyMode && legacyModeElements.size() > 0); + + // Set the maximum number of recent items that can be displayed... + Element maxRecentSitesEl = headerElement.element(HeaderItemsElementReader.ELEMENT_MAX_RECENT_SITES); + if (maxRecentSitesEl != null) + { + Integer maxRecentSites = null; + try + { + maxRecentSites = Integer.parseInt(maxRecentSitesEl.getStringValue()); + } + finally + { + // No action required for NumberFormatException + } + result.setMaxRecentSites(maxRecentSites); + } + + // Set the maximum number of site pages to display... + Element maxDisplayedSitePagesEl = headerElement.element(HeaderItemsElementReader.ELEMENT_MAX_DISPLAYED_SITE_PAGES); + if (maxDisplayedSitePagesEl != null) + { + Integer maxDisplayedSitePages = null; + try + { + maxDisplayedSitePages = Integer.parseInt(maxDisplayedSitePagesEl.getStringValue()); + } + finally + { + // No action required for NumberFormatException + } + result.setMaxDisplayedSitePages(maxDisplayedSitePages); + } + + // Go through each of the tags under

+ for (Object obj : headerElement.selectNodes("./app-items")) + { + Element appItemsElement = (Element)obj; + + HeaderItemsElementReader appsReader = new HeaderItemsElementReader(); + HeaderItemsConfigElement appsCE = (HeaderItemsConfigElement)appsReader.parse(appItemsElement); + + result.setAppItems(appsCE); + } + + // Go through each of the tags under
+ for (Object obj : headerElement.selectNodes("./user-items")) { + Element userItemsElement = (Element)obj; + + HeaderItemsElementReader userReader = new HeaderItemsElementReader(); + HeaderItemsConfigElement userCE = (HeaderItemsConfigElement)userReader.parse(userItemsElement); + + result.setUserItems(userCE); + } + + // Go through each of the tags under
+ for (Object obj : headerElement.selectNodes("./dependencies")) { + Element depsElement = (Element)obj; + + DependenciesElementReader depsReader = new DependenciesElementReader(); + DependenciesConfigElement depsCE = (DependenciesConfigElement)depsReader.parse(depsElement); + + result.setDependencies(depsCE); + } + + return result; + } +} diff --git a/share/src/main/java/org/alfresco/web/config/header/HeaderItem.java b/share/src/main/java/org/alfresco/web/config/header/HeaderItem.java new file mode 100644 index 0000000000..0a7fd32210 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/header/HeaderItem.java @@ -0,0 +1,195 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.header; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.config.ConfigException; + +/** + * This class element represents a header item for the client header. + * + * @author Mike Hatfield. + */ +public class HeaderItem +{ + private static final long serialVersionUID = -8543180919661884269L; + + private static final String ATTR_ID = "id"; + private static final String ATTR_TYPE = "type"; + private static final String ATTR_ICON = "icon"; + private static final String ATTR_LABEL = "label"; + private static final String ATTR_DESCRIPTION = "description"; + private static final String ATTR_PERMISSION = "permission"; + private static final String ATTR_CONDITION = "condition"; + + private static Log logger = LogFactory.getLog(HeaderItem.class); + + private String generatedId; + private String text; + private final Map attributes; + private Map containers = new LinkedHashMap(); + + public HeaderItem(String id, Map attributes) + { + this(id, attributes, null); + } + + public HeaderItem(String generatedId, Map attributes, String text) + { + if (generatedId == null) + { + String msg = "Illegal null field id"; + if (logger.isWarnEnabled()) + { + logger.warn(msg); + } + throw new ConfigException(msg); + } + this.generatedId = generatedId; + if (attributes == null) + { + attributes = Collections.emptyMap(); + } + this.attributes = attributes; + this.text = text; + } + + // The generated id contains the id's of all ancestors separated by "_" + public String getGeneratedId() + { + return this.generatedId; + } + + // The following are convenience accessor methods for certain known attributes. + public String getId() + { + return this.attributes.get(ATTR_ID); + } + + public String getType() + { + return this.attributes.get(ATTR_TYPE); + } + + public String getIcon() + { + String icon = this.attributes.get(ATTR_ICON); + if (icon == null) + { + icon = this.getId().concat(".png"); + this.attributes.put(ATTR_ICON, icon); + } + return icon; + } + + public String getLabel() + { + String label = this.attributes.get(ATTR_LABEL); + if (label == null) + { + label = "header.".concat(this.getId()).concat(".label"); + this.attributes.put(ATTR_LABEL, label); + } + return label; + } + + public String getDescription() + { + String description = this.attributes.get(ATTR_DESCRIPTION); + if (description == null) + { + description = "header.".concat(this.getId()).concat(".description"); + this.attributes.put(ATTR_DESCRIPTION, description); + } + return description; + } + + public String getPermission() + { + String permission = this.attributes.get(ATTR_PERMISSION); + if (permission == null) + { + permission = ""; + this.attributes.put(ATTR_PERMISSION, permission); + } + return permission; + } + + public String getCondition() + { + String condition = this.attributes.get(ATTR_CONDITION); + if (condition == null) + { + condition = ""; + this.attributes.put(ATTR_CONDITION, condition); + } + return condition; + } + + public String getValue() + { + return this.text == null ? "" : this.text; + } + + @Override + public String toString() + { + StringBuilder result = new StringBuilder(); + result.append("HeaderItem: ").append(this.generatedId); + if (this.text != null) + { + result.append(" value:").append(this.text); + } + return result.toString(); + } + + public HeaderItemsConfigElement[] getContainers() + { + return this.getContainersAsList().toArray(new HeaderItemsConfigElement[0]); + } + + /** + * This method returns an unmodifiable List of HeaderItemsConfigElement + * objects that are associated with this HeaderItem. + * @return an unmodifiable List of HeaderItemsConfigElement references. + */ + public List getContainersAsList() + { + List result = new ArrayList(containers.size()); + for (Map.Entry entry : containers.entrySet()) + { + result.add(entry.getValue()); + } + return Collections.unmodifiableList(result); + } + + void addContainedItem(String containerId, HeaderItemsConfigElement container) + { + this.containers.put(containerId, container); + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/config/header/HeaderItemsConfigElement.java b/share/src/main/java/org/alfresco/web/config/header/HeaderItemsConfigElement.java new file mode 100644 index 0000000000..7b220ab96e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/header/HeaderItemsConfigElement.java @@ -0,0 +1,214 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.header; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.web.config.header.HeaderItem; +import org.alfresco.web.config.header.HeaderItemsConfigElement; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.ConfigException; +import org.springframework.extensions.config.element.ConfigElementAdapter; + +/** + * Custom config element that represents <items> values for the + * client. + * + * @author Mike Hatfield. + */ +public class HeaderItemsConfigElement extends ConfigElementAdapter +{ + private static final long serialVersionUID = 7464040585168773676L; + private static Log logger = LogFactory.getLog(HeaderItemsConfigElement.class); + + private String id = ""; + private String label = ""; + private String permission = ""; + private String condition = ""; + + public static final String DEFAULT_ELEMENT_ID = "app-items"; + private Map items = new LinkedHashMap(); + + /** + * This constructor creates an instance with the default name. + */ + public HeaderItemsConfigElement() + { + super(DEFAULT_ELEMENT_ID); + } + + /** + * This constructor creates an instance with the specified name. + * + * @param name the name for the ConfigElement. + */ + public HeaderItemsConfigElement(String name) + { + super(name); + } + + public HeaderItem[] getItems() + { + return this.getItemsAsList().toArray(new HeaderItem[0]); + } + + /** + * This method returns an unmodifiable List of HeaderItem + * objects that are associated with this container. + * @return an unmodifiable List of HeaderItem references. + */ + public List getItemsAsList() + { + List result = new ArrayList(items.size()); + for (Map.Entry entry : items.entrySet()) + { + result.add(entry.getValue()); + } + return Collections.unmodifiableList(result); + } + + /** + * This method returns the item having the specified id string from within a + * <header> tag. Items within containers and container-groups are prefixed + * with each parent's id to create a unique id for that item. + * + * @return the ItemConfigElement instance having the correct id, if one exists, + * else null. + */ + public HeaderItem getItem(String id) + { + return this.items.get(id); + } + + /** + * @see ConfigElement#getChildren() + */ + @Override + public List getChildren() + { + throw new ConfigException( + "Reading the default-controls config via the generic interfaces is not supported"); + } + + /** + * @see ConfigElement#combine(org.springframework.extensions.config.ConfigElement) + */ + @Override + public ConfigElement combine(ConfigElement configElement) + { + if (configElement == null) + { + return this; + } + + return configElement; + } + + public void setId(String id) + { + this.id = id; + } + + public void setLabel(String label) + { + this.label = label; + } + + public void setPermission(String permission) + { + this.permission = permission; + } + + public void setCondition(String condition) + { + this.condition = condition; + } + + public String getId() + { + return this.id == null ? "" : this.id; + } + + public String getLabel() + { + String label = this.label; + if (label == null) + { + label = "header.".concat(this.getId()).concat(".label"); + this.label = label; + } + return label; + } + + public String getPermission() + { + return this.permission == null ? "" : this.permission; + } + + public String getCondition() + { + return this.condition == null ? "" : this.condition; + } + + HeaderItem addItem(String id, List attributeNames, List attributeValues) + { + return this.addItem(id, attributeNames, attributeValues, null); + } + + HeaderItem addItem(String id, List attributeNames, List attributeValues, String itemText) + { + if (attributeNames == null) + { + attributeNames = Collections.emptyList(); + } + if (attributeValues == null) + { + attributeValues = Collections.emptyList(); + } + if (attributeNames.size() < attributeValues.size() && logger.isWarnEnabled()) + { + StringBuilder msg = new StringBuilder(); + msg.append("item ") + .append(id) + .append(" has ") + .append(attributeNames.size()) + .append(" xml attribute names and ") + .append(attributeValues.size()) + .append(" xml attribute values. The trailing extra data will be ignored."); + logger.warn(msg.toString()); + } + + Map attrs = new LinkedHashMap(); + for (int i = 0; i < attributeNames.size(); i++) + { + attrs.put(attributeNames.get(i), attributeValues.get(i)); + } + HeaderItem hi = new HeaderItem(id, attrs, itemText); + items.put(id, hi); + return hi; + } +} diff --git a/share/src/main/java/org/alfresco/web/config/header/HeaderItemsElementReader.java b/share/src/main/java/org/alfresco/web/config/header/HeaderItemsElementReader.java new file mode 100644 index 0000000000..a5e62d27e8 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/header/HeaderItemsElementReader.java @@ -0,0 +1,232 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.header; + +import java.util.ArrayList; +import java.util.List; + +import org.dom4j.Attribute; +import org.dom4j.Element; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.ConfigException; +import org.springframework.extensions.config.xml.elementreader.ConfigElementReader; + +/** + * This class is a custom element reader to parse the config file for + * <app-items> and <user-items> elements. + * + * @author Mike Hatfield. + */ +class HeaderItemsElementReader implements ConfigElementReader +{ + public static final String ATTR_ID = "id"; + public static final String ATTR_LABEL = "label"; + public static final String ATTR_PERMISSION = "permission"; + public static final String ATTR_CONDITION = "condition"; + public static final String ELEMENT_APP_ITEMS = "app-items"; + public static final String ELEMENT_USER_ITEMS = "user-items"; + public static final String ELEMENT_CONTAINER_GROUP = "container-group"; + public static final String ELEMENT_LEGACY = "legacy-mode-enabled"; + public static final String ELEMENT_MAX_RECENT_SITES = "max-recent-sites"; + public static final String ELEMENT_MAX_DISPLAYED_SITE_PAGES = "max-displayed-site-pages"; + + public static final String ID_SEPARATOR = "_"; + + private String id_prefix = ""; + private String group_condition = null; + private String group_permission = null; + + /** + * This constructor creates an instance with no id prefix. + */ + public HeaderItemsElementReader() + { + } + + /** + * This constructor creates an instance with the specified id prefix. + * + * @param id of the ancestor elements. + */ + public HeaderItemsElementReader(String id) + { + this.id_prefix = (id == null || id.length() == 0) ? "" : id.concat(ID_SEPARATOR); + } + + /** + * @see org.springframework.extensions.config.xml.elementreader.ConfigElementReader#parse(org.dom4j.Element) + */ + public ConfigElement parse(Element headerItemsElement) + { + HeaderItemsConfigElement result = null; + if (headerItemsElement == null) + { + return null; + } + + String name = headerItemsElement.getName(); + if (!name.equals(ELEMENT_APP_ITEMS) && + !name.equals(ELEMENT_USER_ITEMS) && + !name.equals(ELEMENT_CONTAINER_GROUP) && + !name.equals(ELEMENT_LEGACY)) + { + throw new ConfigException(this.getClass().getName() + + " can only parse " + ELEMENT_APP_ITEMS + ", " + ELEMENT_USER_ITEMS + ", " + ELEMENT_CONTAINER_GROUP + ", " + ELEMENT_LEGACY + + " elements, the element passed was '" + name + "'"); + } + + result = new HeaderItemsConfigElement(name); + + parseId(headerItemsElement, result); + parseLabel(headerItemsElement, result); + parseCondition(headerItemsElement, result); + parsePermission(headerItemsElement, result); + + parseItemTags(headerItemsElement, result); + + return result; + } + + @SuppressWarnings("unchecked") + private void parseItemTags(Element itemsElement, HeaderItemsConfigElement result) + { + HeaderItem lastItem; + + // xpath expressions. + for (Object itemObj : itemsElement.selectNodes("./item")) + { + Element itemElem = (Element)itemObj; + String itemText = itemElem.getTextTrim(); + //List itemAttributes = itemElem.selectNodes("./@*"); + List itemAttributes = new ArrayList(); + + for (Object obj : itemElem.selectNodes("./@*")) { + itemAttributes.add((Attribute) obj); + } + + List itemAttributeNames = new ArrayList(); + List itemAttributeValues = new ArrayList(); + + // Special handling for the mandatory "id" and optional condition & permission attributes + String itemGeneratedId = null; + String itemGroupCondition = this.group_condition; + String itemGroupPermission = this.group_permission; + for (Attribute nextAttr : itemAttributes) + { + String nextAttributeName = nextAttr.getName(); + String nextAttributeValue = nextAttr.getValue(); + + // If the item specifies a condition or permission, it's overriding an optional group default + if (nextAttributeName.equals(ATTR_CONDITION)) + { + itemGroupCondition = null; + } + else if (nextAttributeName.equals(ATTR_PERMISSION)) + { + itemGroupPermission = null; + } + else if (nextAttributeName.equals(ATTR_ID)) + { + itemGeneratedId = this.generateUniqueItemId(nextAttributeValue); + } + itemAttributeNames.add(nextAttributeName); + itemAttributeValues.add(nextAttributeValue); + } + if (itemGeneratedId == null) + { + throw new ConfigException(" node missing mandatory id attribute."); + } + // If the group condition was set and not overridden, add it to the item here + if (itemGroupCondition != null) + { + itemAttributeNames.add(ATTR_CONDITION); + itemAttributeValues.add(itemGroupCondition); + } + // If the group permission was set and not overridden, add it to the item here + if (itemGroupPermission != null) + { + itemAttributeNames.add(ATTR_PERMISSION); + itemAttributeValues.add(itemGroupPermission); + } + + lastItem = result.addItem(itemGeneratedId, itemAttributeNames, itemAttributeValues, itemText); + + // Go through ant of the tags under + for (Object obj : itemElem.selectNodes("./container-group")) + { + Element containerElement = (Element)obj; + + HeaderItemsElementReader containerReader = new HeaderItemsElementReader(lastItem.getId()); + HeaderItemsConfigElement containerCE = (HeaderItemsConfigElement)containerReader.parse(containerElement); + + lastItem.addContainedItem(containerCE.getId(), containerCE); + } + } + } + + private void parseId(Element itemsElement, HeaderItemsConfigElement result) + { + String id = itemsElement.attributeValue(ATTR_ID); + + // Cannot have lower-level items with a null id + if (id == null && this.id_prefix.length() > 0) + { + throw new ConfigException(itemsElement.getName() + " node missing mandatory id attribute."); + } + result.setId(id); + + StringBuilder sb = new StringBuilder(this.id_prefix); + if (id != null) + { + sb.append(id).append(ID_SEPARATOR); + } + this.id_prefix = sb.toString(); + } + + private void parseLabel(Element itemsElement, HeaderItemsConfigElement result) + { + String label = itemsElement.attributeValue(ATTR_LABEL); + result.setLabel(label); + } + + private void parseCondition(Element itemsElement, HeaderItemsConfigElement result) + { + String condition = itemsElement.attributeValue(ATTR_CONDITION); + this.group_condition = condition; + result.setCondition(condition); + } + + private void parsePermission(Element itemsElement, HeaderItemsConfigElement result) + { + String permission = itemsElement.attributeValue(ATTR_PERMISSION); + this.group_permission = permission; + result.setPermission(permission); + } + + private String generateUniqueItemId(String id) + { + if (id == null) + { + return null; + } + return this.id_prefix.concat(id); + } +} diff --git a/share/src/main/java/org/alfresco/web/config/packaging/ModulePackage.java b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackage.java new file mode 100644 index 0000000000..2191e3057a --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackage.java @@ -0,0 +1,44 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.packaging; + +import org.alfresco.util.VersionNumber; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.ComparableVersion; + +import java.util.List; + +/** + * A basic Module Package, eg. a simple jar file. + * @author Gethin James + */ +public interface ModulePackage +{ + String UNSET_VERSION = "0-ERROR_UNSET"; + + String getId(); + ArtifactVersion getVersion(); + String getTitle(); + String getDescription(); + VersionNumber getVersionMin(); + VersionNumber getVersionMax(); + List getDependencies(); +} diff --git a/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageDependency.java b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageDependency.java new file mode 100644 index 0000000000..b69657f174 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageDependency.java @@ -0,0 +1,35 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.packaging; + +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.ComparableVersion; +import org.apache.maven.artifact.versioning.VersionRange; + +/** + * A basic Module Package Dependency on a range of versions + * @author Gethin James + */ +public interface ModulePackageDependency +{ + String getId(); + VersionRange getVersionRange(); +} diff --git a/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageHelper.java b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageHelper.java new file mode 100644 index 0000000000..a36839e701 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageHelper.java @@ -0,0 +1,162 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.packaging; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.util.VersionNumber; +import org.alfresco.web.scripts.ShareManifest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Helpful methods for working with ModulePackages. + * @author Gethin James + */ +public class ModulePackageHelper +{ + private static Log logger = LogFactory.getLog(ModulePackageHelper.class); + private static PropertyDescriptor[] descriptors; + + //see http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Main%20Attributes + protected static final String REGEX_NUMBER_OR_DOT = "[0-9\\.]*"; + public static final String MANIFEST_SHARE = "Alfresco Share"; + + static + { + try + { + BeanInfo moduleinfo = Introspector.getBeanInfo(ModulePackage.class); + descriptors = moduleinfo.getPropertyDescriptors(); + } + catch (IntrospectionException e) + { + logger.error("Unable to read bean info for ModulePackage"); + } + } + + /** + * Rhino Serialization didn't seem to like ModulePackageUsingProperties. It failed + * to read the individual properties so this method converts a ModulePackage into a simple + * Map so its easier to represent as Javascript. + * @param modulePackage + * @return Map property, value + */ + public static Map toMap(ModulePackage modulePackage) + { + Map asMap = new HashMap(descriptors.length); + for (int i = 0; i < descriptors.length; i++) + { + try + { + String propValue = String.valueOf(descriptors[i].getReadMethod().invoke(modulePackage)); + asMap.put(descriptors[i].getName(),propValue); + } + catch (IllegalAccessException iae) + { + logger.error("Unable to turn ModulePackageUsingProperties into a Map ", iae); + } + catch (InvocationTargetException e) + { + logger.error("Unable to turn ModulePackageUsingProperties into a Map ", e); + } + } + return asMap; + } + + /** + * Checks the Module Packages is valid. + */ + public static void checkValid(ModulePackage module, ShareManifest shareManifest) + { + checkVersions(new VersionNumber(shareManifest.getSpecificationVersion()), module); + } + + protected static List toIds(List mods) + { + //In Java 8 this is: mods.stream().map(module -> module.getId()).collect(toList()); + //In Groovy mods.collect { it.id } + //In Java 7 + List ids = new ArrayList<>(mods.size()); + for (ModulePackage mod : mods) + { + ids.add(mod.getId()); + } + return ids; + } + + /** + * Compares the version information with the module details to see if their valid. If they are invalid then it throws an exception. + * @param warVersion VersionNumber + * @param installingModuleDetails ModuleDetails + * @throws AlfrescoRuntimeException + */ + protected static void checkVersions(VersionNumber warVersion, ModulePackage installingModuleDetails) + { + if(warVersion.compareTo(installingModuleDetails.getVersionMin())==-1) { + throw new AlfrescoRuntimeException("The module ("+installingModuleDetails.getTitle()+") must be installed on a Share version equal to or greater than " + +installingModuleDetails.getVersionMin()+". Share is version: "+warVersion+"."); + } + if(warVersion.compareTo(installingModuleDetails.getVersionMax())==1) { + throw new AlfrescoRuntimeException("The module ("+installingModuleDetails.getTitle()+") cannot be installed on a Share version greater than " + +installingModuleDetails.getVersionMax()+". Share is version: "+warVersion+"."); + } + } + + /** + * A BASIC dependency check this is only based on ID and ignores the version. + * @param module + * @param availableModules + */ + protected static void checkDependencies(ModulePackage module, List availableModules) + { + List dependencies = module.getDependencies(); + if (dependencies != null && !dependencies.isEmpty()) + { + List moduleIds = toIds(availableModules); + List missingDependencies = new ArrayList<>(0); + + for (ModulePackageDependency dependency : dependencies) + { + if(!moduleIds.contains(dependency.getId())) + { + missingDependencies.add(dependency); + } + } + + //We have some missing dependencies + if (!missingDependencies.isEmpty()) + { + throw new AlfrescoRuntimeException("The module ("+module.getTitle()+") cannot be installed. The following modules must first be installed: " + missingDependencies); + } + } + + } +} diff --git a/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageManager.java b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageManager.java new file mode 100644 index 0000000000..1c4e728bca --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageManager.java @@ -0,0 +1,145 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.packaging; + +import org.alfresco.web.scripts.ShareManifest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.util.Assert; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Examines Module Packages, on bootstrap lists the modules that are installed. + * @author Gethin James + */ +public class ModulePackageManager implements InitializingBean +{ + public static final String MODULE_RESOURCES = "classpath*:alfresco/module/*/module.properties"; + private static Log logger = LogFactory.getLog(ModulePackageManager.class); + + private ShareManifest shareManifest; + private List modules = new ArrayList<>(); + + /** + * Finds modules based on the resource path. + * @param resourcePath path to resources + * @return List the module packages + */ + protected List resolveModules(String resourcePath) + { + Assert.notNull(resourcePath, "Resource path must not be null"); + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + List modulesFound = new ArrayList<>(); + + try + { + Resource[] resources = resolver.getResources(resourcePath); + for(Resource resource : resources) + { + ModulePackage mp = asModulePackage(resource); + if (mp != null) modulesFound.add(mp); + } + } + catch (IOException ioe) + { + logger.error("Unable to resolve modules ", ioe); + } + return modulesFound; + } + + /** + * Takes a Resource and turns it into a ModulePackage + * The current implementation only supports property files. + * @param resource Spring resource + * @return ModulePackage + */ + protected static ModulePackage asModulePackage(Resource resource) + { + Assert.notNull(resource, "Resource must not be null"); + + try + { + return ModulePackageUsingProperties.loadFromResource(resource); + } + catch (IOException e) + { + logger.error("Failed to load resource "+resource.toString(), e); + return null; + } + } + + + /** + * Writes a list of ModulePackages + * @param foundModules the module packages + * @return String list the modules + */ + protected String writeModuleList(List foundModules) + { + StringBuilder b = new StringBuilder(128); + for (ModulePackage module : foundModules) + { + b.append(module.getTitle()).append(", " + module.getVersion()).append(", "+module.getDescription()); + b.append("\n"); + } + return b.toString(); + } + + /** + * Returns the available module packages in the application. + * @return List the module packages + */ + public List getModulePackages() + { + return modules; + } + + @Override + public void afterPropertiesSet() + + { + logger.debug("Resolving module packages."); + modules = resolveModules(MODULE_RESOURCES); + String moduleList = writeModuleList(modules); + if (!modules.isEmpty()) + { + logger.info("Found "+ modules.size() +" module package(s)"); + logger.info(moduleList); + for (ModulePackage module : modules) + { + ModulePackageHelper.checkValid(module, shareManifest); + ModulePackageHelper.checkDependencies(module, modules); + } + } + } + + public void setShareManifest(ShareManifest shareManifest) + { + this.shareManifest = shareManifest; + } +} diff --git a/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageUsingProperties.java b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageUsingProperties.java new file mode 100644 index 0000000000..e2828fd48c --- /dev/null +++ b/share/src/main/java/org/alfresco/web/config/packaging/ModulePackageUsingProperties.java @@ -0,0 +1,238 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.config.packaging; + +import org.alfresco.util.VersionNumber; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.artifact.versioning.VersionRange; +import org.springframework.core.io.Resource; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * An implementation of a ModulePackage using a properties file. + * @author Gethin James + */ +public class ModulePackageUsingProperties implements ModulePackage +{ + //Copied from ModuleDetails in the Repo. + + public static final String PROP_ID = "module.id"; + public static final String PROP_VERSION = "module.version"; + public static final String PROP_TITLE = "module.title"; + public static final String PROP_DESCRIPTION = "module.description"; + public static final String PROP_EDITIONS = "module.editions"; + public static final String PROP_REPO_VERSION_MIN = "module.repo.version.min"; + public static final String PROP_REPO_VERSION_MAX = "module.repo.version.max"; + public static final String PROP_DEPENDS_PREFIX = "module.depends."; + //End of Copied from ModuleDetails in the Repo. + + public static final String PROP_SHARE_VERSION_MIN = "module.share.version.min"; + public static final String PROP_SHARE_VERSION_MAX = "module.share.version.max"; + private final Properties properties; + private final List dependencies = new ArrayList<>(); + + protected ModulePackageUsingProperties(Properties properties) + { + validateProperties(properties); + this.properties = properties; + } + + public static ModulePackageUsingProperties loadFromResource(Resource resource) throws IOException + { + Properties props = new Properties(); + props.load(resource.getInputStream()); + return new ModulePackageUsingProperties(props); + } + + protected void validateProperties(Properties props) + { + //We haven't got a Share version min then use the repo version min. + if (!props.containsKey(PROP_SHARE_VERSION_MIN) && props.containsKey(PROP_REPO_VERSION_MIN)) + { + props.setProperty(PROP_SHARE_VERSION_MIN, props.getProperty(PROP_REPO_VERSION_MIN)); + } + + //We haven't got a Share version max then use the repo version max. + if (!props.containsKey(PROP_SHARE_VERSION_MAX) && props.containsKey(PROP_REPO_VERSION_MAX)) + { + props.setProperty(PROP_SHARE_VERSION_MAX, props.getProperty(PROP_REPO_VERSION_MAX)); + } + dependencies.addAll(extractDependencies(props)); + } + + @Override + public String getId() + { + return properties.getProperty(PROP_ID); + } + + @Override + public String getTitle() + { + return properties.getProperty(PROP_TITLE); + } + + @Override + public String getDescription() + { + return properties.getProperty(PROP_DESCRIPTION); + } + + @Override + public ArtifactVersion getVersion() + { + String ver = properties.getProperty(PROP_VERSION); + if (StringUtils.isEmpty(ver)) + { + return new DefaultArtifactVersion(UNSET_VERSION); + } + else + { + return new DefaultArtifactVersion(ver); + } + } + + @Override + public VersionNumber getVersionMin() + { + String ver = properties.getProperty(PROP_SHARE_VERSION_MIN); + if (StringUtils.isEmpty(ver)) + { + return VersionNumber.VERSION_ZERO; + } + else + { + return new VersionNumber(ver); + } + } + + @Override + public VersionNumber getVersionMax() + { + String ver = properties.getProperty(PROP_SHARE_VERSION_MAX); + if (StringUtils.isEmpty(ver)) + { + return VersionNumber.VERSION_BIG; + } + else + { + return new VersionNumber(ver); + } + } + + @Override + public List getDependencies() + { + return dependencies; + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder("ModulePackageUsingProperties{"); + sb.append("id='").append(getId()).append('\''); + sb.append(", title='").append(getTitle()).append('\''); + sb.append(", description='").append(getDescription()).append('\''); + sb.append(", version=").append(getVersion()); + sb.append(", versionMin=").append(getVersionMin()); + sb.append(", versionMax=").append(getVersionMax()); + sb.append(", dependencies=").append(dependencies); + sb.append('}'); + return sb.toString(); + } + + + /** + * This method is copied from ModuleDetailsImpl "as-is". It is hoped that this code can be REUSED in the + * future instead of cutting and pasting. + * @param properties + * @return + */ + private static List extractDependencies(Properties properties) + { + int prefixLength = PROP_DEPENDS_PREFIX.length(); + + List dependencies = new ArrayList(2); + for (Map.Entry entry : properties.entrySet()) + { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + if (!key.startsWith(PROP_DEPENDS_PREFIX)) + { + continue; + } + if (key.length() == prefixLength) + { + // Just ignore it + continue; + } + final String dependencyId = key.substring(prefixLength); + // Build the dependency + ModulePackageDependency dependency = new ModulePackageDependencyOnlyId(dependencyId); + // Add it + dependencies.add(dependency); + } + // Done + return dependencies; + } + + /** + * Basic implementation only uses the ID + */ + public static class ModulePackageDependencyOnlyId implements ModulePackageDependency { + + String id; + + public ModulePackageDependencyOnlyId(String dependencyId) + { + this.id = dependencyId; + + } + + @Override + public String getId() + { + return id; + } + + @Override + public VersionRange getVersionRange() + { + //Always ignore the version range for now. + return null; + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(""); + sb.append("id='").append(id).append('\''); + return sb.toString(); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/AlwaysFalseEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/AlwaysFalseEvaluator.java new file mode 100644 index 0000000000..860ed7d765 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/AlwaysFalseEvaluator.java @@ -0,0 +1,37 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Convenience evaluator which always returns false + * + * @author mikeh + */ +public class AlwaysFalseEvaluator extends BaseEvaluator +{ + @Override + public boolean evaluate(JSONObject jsonObject) + { + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/BaseEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/BaseEvaluator.java new file mode 100644 index 0000000000..8a1265cf2a --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/BaseEvaluator.java @@ -0,0 +1,537 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import org.json.simple.parser.ParseException; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; + +import java.util.HashMap; + +/** + * Base class for all UI evaluators. + * + * @author mikeh + */ +public abstract class BaseEvaluator implements Evaluator +{ + private static final String PORTLET_HOST = "portletHost"; + + // optional args from the calling webscript + protected HashMap args = null; + // metadata from the webscript response + protected JSONObject metadata = null; + // negate output flag + protected boolean negateOutput = false; + + /** + * Sets optional negateOutput flag which applies when one of the main entry points is used + */ + public void setNegateOutput(boolean negateOutput) + { + this.negateOutput = negateOutput; + } + + /** + * Optional entry point from Rhino script. Converts JSON String to a JSONObject + * and calls the overridable evaluate() method. + * + * @param record JSON String representing the record wrapping the node as received from a Rhino script + * @return boolean indicating evaluator result + */ + public final boolean evaluate(Object record) + { + return evaluate(record, null, null); + } + + /** + * Optional entry point from Rhino script. Converts JSON String to a JSONObject + * and calls the overridable evaluate() method. + * + * @param record JSON String representing the record wrapping the node as received from a Rhino script + * @param metadata JSON String containing metadata which may be relevant to the evaluation + * @return boolean indicating evaluator result + */ + public final boolean evaluate(Object record, Object metadata) + { + return evaluate(record, metadata, null); + } + + /** + * Main entry point from Rhino script. Converts JSON String to a JSONObject + * and calls the overridable evaluate() method. + * + * @param record JSON String or JSONObject as received from a Rhino script + * @param metadata JSON String or JSONObject as received from a Rhino script + * @param args URL arguments passed to calling webscript + * @return boolean indicating evaluator result + */ + @SuppressWarnings({"WeakerAccess"}) + public final boolean evaluate(Object record, Object metadata, HashMap args) + { + JSONObject jsonObject; + this.args = args; + + try + { + if (record instanceof JSONObject) + { + jsonObject = (JSONObject)record; + } + else if (record instanceof String) + { + jsonObject = (JSONObject)JSONValue.parseWithException((String)record); + } + else + { + throw new IllegalArgumentException("Expecting either JSONObject or JSON String for 'record'"); + } + if (metadata instanceof JSONObject) + { + this.metadata = (JSONObject)metadata; + } + else if (metadata instanceof String) + { + this.metadata = (JSONObject)JSONValue.parseWithException((String)metadata); + } + else + { + throw new IllegalArgumentException("Expecting either JSONObject or JSON String for 'metadata'"); + } + } + catch (ParseException perr) + { + throw new AlfrescoRuntimeException("Failed to parse JSON string: " + perr.getMessage()); + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return (this.negateOutput ^ evaluate(jsonObject)); + } + + /** + * Evaluator implementations abstract method. + * + * @param jsonObject The object the evaluation is for + * @return boolean indicating evaluator result + */ + public abstract boolean evaluate(JSONObject jsonObject); + + /** + * Simple getter for optional webscript args + * + * @return HashMap args map (may be null) + */ + @SuppressWarnings({"UnusedDeclaration"}) + public final HashMap getArgs() + { + return this.args; + } + + /** + * Get webscript argument by name + * + * @param name Argument name + * @return string argument value or null + */ + public final String getArg(String name) + { + if (this.args != null && this.args.containsKey(name)) + { + return this.args.get(name); + } + return null; + } + + /** + * Get metadata + * + * @return JSONObject metadata + */ + public final JSONObject getMetadata() + { + return this.metadata; + } + + /** + * Get request header value + * + * @param name Header name to retrieve + * @return string value or null + */ + public final String getHeader(String name) + { + String header = null; + if (name != null) + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + header = rc.getHeader(name); + } + return header; + } + + /** + * Get flag indicating portlet or standalone mode + * + * @return boolean true for portlet mode, false otherwise + */ + public final boolean getIsPortlet() + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + return rc.getAttribute(PORTLET_HOST) != null; + } + + /** + * Retrieves the type for a node + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return String containing the node type + */ + public final String getNodeType(JSONObject jsonObject) + { + String type = null; + + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + + if (node != null) + { + type = (String) node.get("type"); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err.getMessage()); + } + + return type; + } + + /** + * Retrieves the mimetype for a node + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return String containing the node mimetype + */ + public final String getNodeMimetype(JSONObject jsonObject) + { + String mimetype = null; + + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + + if (node != null) + { + mimetype = (String) node.get("mimetype"); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err.getMessage()); + } + + return mimetype; + } + + /** + * Retrieve a JSONArray of aspects for a node + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return JSONArray containing aspects on the node + */ + public final JSONArray getNodeAspects(JSONObject jsonObject) + { + JSONArray aspects = null; + + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + + if (node != null) + { + aspects = (JSONArray) node.get("aspects"); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err.getMessage()); + } + + return aspects; + } + + /** + * Retrieve a JSONArray of aspects for a node + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @param propertyName Name of the property to retrieve + * @return Object property value + */ + public final Object getProperty(JSONObject jsonObject, String propertyName) + { + Object property = null; + + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + + if (node != null) + { + JSONObject properties = (JSONObject) node.get("properties"); + if (properties != null) + { + property = properties.get(propertyName); + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst running UI evaluator: " + err.getMessage()); + } + + return property; + } + + /** + * Get the current user associated with this request + * + * @return String userId + */ + public final String getUserId() + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final String userId = rc.getUserId(); + if (userId == null || AuthenticationUtil.isGuest(userId)) + { + throw new AlfrescoRuntimeException("User ID must exist and cannot be guest."); + } + + return userId; + } + + /** + * Get the site shortName applicable to this node (if requested via a site-based page context) + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return String siteId or null + */ + public final String getSiteId(JSONObject jsonObject) + { + String siteId = null; + + try + { + JSONObject location = (JSONObject) jsonObject.get("location"); + + if (location != null) + { + JSONObject site = (JSONObject) location.get("site"); + if (site != null) + { + siteId = (String) site.get("name"); + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst querying siteId from location: " + err.getMessage()); + } + + return siteId; + } + + /** + * Get the site preset (e.g. "site-dashboard") applicable to this node (if requested via a site-based page context) + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return String site preset or null + */ + public final String getSitePreset(JSONObject jsonObject) + { + String sitePreset = null; + + try + { + JSONObject location = (JSONObject) jsonObject.get("location"); + + if (location != null) + { + JSONObject site = (JSONObject) location.get("site"); + if (site != null) + { + sitePreset = (String) site.get("preset"); + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst querying site preset from location: " + err.getMessage()); + } + + return sitePreset; + } + + /** + * Get the container node type (e.g. "cm:folder") applicable to this node (if requested via a site-based page context) + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return String container type or null + */ + public final String getContainerType(JSONObject jsonObject) + { + String containerType = null; + + try + { + JSONObject location = (JSONObject) jsonObject.get("location"); + + if (location != null) + { + JSONObject container = (JSONObject) location.get("container"); + if (container != null) + { + containerType = (String) container.get("type"); + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst querying container type from location: " + err.getMessage()); + } + + return containerType; + } + + /** + * Get a boolean value indicating whether the node is locked or not + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return True if the node is locked + */ + public final boolean getIsLocked(JSONObject jsonObject) + { + boolean isLocked = false; + JSONObject node = (JSONObject) jsonObject.get("node"); + if (node != null) + { + isLocked = ((Boolean) node.get("isLocked")); + } + return isLocked; + } + + /** + * Get a boolean value indicating whether the node is a working copy or not + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return True if the node is a working copy + */ + public final boolean getIsWorkingCopy(JSONObject jsonObject) + { + boolean isWorkingCopy = false; + JSONObject workingCopy = (JSONObject) jsonObject.get("workingCopy"); + if (workingCopy != null) + { + isWorkingCopy = ((Boolean) workingCopy.get("isWorkingCopy")); + } + return isWorkingCopy; + } + + /** + * Checks whether the current user matches that of a given user property + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @param propertyName String containing dotted notation path to value + * @return True if the property value matches the current user + */ + public final boolean getMatchesCurrentUser(JSONObject jsonObject, String propertyName) + { + try + { + JSONObject user = (JSONObject)getProperty(jsonObject, propertyName); + if (user != null) + { + if (user.get("userName").toString().equalsIgnoreCase(getUserId())) + { + return true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Exception whilst matching current user: " + err.getMessage()); + } + return false; + } + + /** + * Retrieve a JSON value given an accessor string containing dot notation (e.g. "node.isContainer") + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @param accessor String containing dotted notation path to value + * @return Object value or null + */ + public final Object getJSONValue(JSONObject jsonObject, String accessor) + { + String[] keys = accessor.split("\\."); + Object record = jsonObject; + + for (String key : keys) + { + if (record instanceof JSONObject) + { + record = ((JSONObject)record).get(key); + } + else if (record instanceof JSONArray) + { + record = ((JSONArray)record).get(Integer.parseInt(key)); + } + else + { + return null; + } + } + return record; + } + + /** + * Get a boolean value indicating whether the node has binary content + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @return True if the node has content + */ + public final boolean getHasContent(JSONObject jsonObject) + { + JSONObject node = (JSONObject) jsonObject.get("node"); + if (node != null) + { + return node.get("contentURL") != null; + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/ChainedMatchAllEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/ChainedMatchAllEvaluator.java new file mode 100644 index 0000000000..1e7c62bb96 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/ChainedMatchAllEvaluator.java @@ -0,0 +1,76 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +import java.util.ArrayList; +import java.util.ListIterator; + +/** + * Calls multiple evaluators in turn until either the last one is called + * or one of the evaluators returns false. Effectively becomes a logical + * AND of the participating evaluators. + * + * @author mikeh + */ +public class ChainedMatchAllEvaluator extends BaseEvaluator +{ + private ArrayList evaluators = null; + + /** + * Evaluators to participate in the evaluation chain + * + * @param evaluators ArrayList + */ + public void setEvaluators(ArrayList evaluators) + { + this.evaluators = evaluators; + } + + /** + * Run through each given evaluator until we either get to the end or one returns false + * + * + * @param jsonObject The object the action is for + * @return boolean + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = true; + + if (evaluators != null) + { + ListIterator evalIter = evaluators.listIterator(); + + while (result && evalIter.hasNext()) + { + BaseEvaluator evaluator = (BaseEvaluator)evalIter.next(); + evaluator.args = this.args; + evaluator.metadata = this.metadata; + result = evaluator.negateOutput ^ evaluator.evaluate(jsonObject); + } + } + + return result; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/ChainedMatchOneEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/ChainedMatchOneEvaluator.java new file mode 100644 index 0000000000..95c829f7de --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/ChainedMatchOneEvaluator.java @@ -0,0 +1,77 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +import java.util.ArrayList; +import java.util.ListIterator; + +/** + * Calls multiple evaluators in turn until either the last one is called + * or one of the evaluators returns true. Effectively becomes a logical + * OR of the participating evaluators. + * + * @author mikeh + */ +public class ChainedMatchOneEvaluator extends BaseEvaluator +{ + private ArrayList evaluators = null; + + /** + * Evaluators to participate in the evaluation chain + * + * @param evaluators ArrayList + */ + public void setEvaluators(ArrayList evaluators) + { + this.evaluators = evaluators; + } + + /** + * Run through each given evaluator until we either get to the end or one returns false + * + * + * @param jsonObject The object the action is for + * @return boolean + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = true; + + if (evaluators != null) + { + result = false; + ListIterator evalIter = evaluators.listIterator(); + + while (!result && evalIter.hasNext()) + { + BaseEvaluator evaluator = (BaseEvaluator)evalIter.next(); + evaluator.args = this.args; + evaluator.metadata = this.metadata; + result = evaluator.negateOutput ^ evaluator.evaluate(jsonObject); + } + } + + return result; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/Comparator.java b/share/src/main/java/org/alfresco/web/evaluator/Comparator.java new file mode 100644 index 0000000000..afd00815b2 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/Comparator.java @@ -0,0 +1,39 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +/** + * Contract supported by all classes that provide a comparison service for the ValueEvaluator class. + *

+ * The comparator is free to inject (via Spring config) whatever criteria are needed to decide on the outcome. + * + * @author mikeh + */ +public interface Comparator +{ + /** + * Run the compare logic and return the result. + * + * @param nodeValue Object the node's value to compare + * @return true for a successful result, false otherwise + */ + public boolean compare(Object nodeValue); +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/ContainerTypeEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/ContainerTypeEvaluator.java new file mode 100644 index 0000000000..ff73881baa --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/ContainerTypeEvaluator.java @@ -0,0 +1,69 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONObject; + +import java.util.ArrayList; + +/** + * Check whether the node lives in a Site container of one of the listed types + * + * @author mikeh + */ +public class ContainerTypeEvaluator extends BaseEvaluator +{ + private ArrayList types; + + /** + * Define the list of types to check for + * + * @param types + */ + public void setTypes(ArrayList types) + { + this.types = types; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (types.size() == 0) + { + return false; + } + + try + { + if (!types.contains(getContainerType(jsonObject))) + { + return false; + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return true; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/Evaluator.java b/share/src/main/java/org/alfresco/web/evaluator/Evaluator.java new file mode 100644 index 0000000000..20eff722d1 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/Evaluator.java @@ -0,0 +1,45 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Contract supported by all classes that provide dynamic evaluation for a UI element. + *

+ * Evaluators are supplied with a Node instance context object. + *

+ * The evaluator should decide if the precondition is valid based on the appropriate + * logic and the properties etc. and return the result. + * + * @author mikeh + */ +public interface Evaluator +{ + /** + * The evaluator should decide if the precondition is valid based on the appropriate + * logic and the state etc. of the given object and return the result. + * + * @param jsonObject The record the evaluation is for + * @return result of whether the evaluation succeeded or failed. + */ + public boolean evaluate(JSONObject jsonObject); +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/HasAnyAspectEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/HasAnyAspectEvaluator.java new file mode 100644 index 0000000000..5ba9bfda3a --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/HasAnyAspectEvaluator.java @@ -0,0 +1,85 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.ArrayList; + +/** + * Check for the presence of one or more aspects. + * + * Unlike HasAspectEvaluator this returns true if ANY of the supplied aspects are present + * + * Invert the output of this evaluator to act as a blacklist of aspects which should not be present + * + * @author wabson + */ +public class HasAnyAspectEvaluator extends BaseEvaluator +{ + private ArrayList aspects; + + /** + * Define the list of aspects to check for + * + * @param aspects + */ + public void setAspects(ArrayList aspects) + { + this.aspects = aspects; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (aspects.size() == 0) + { + return false; + } + + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + for (String aspect : aspects) + { + if (nodeAspects.contains(aspect)) + { + return true; + } + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/HasAspectEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/HasAspectEvaluator.java new file mode 100644 index 0000000000..897d390941 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/HasAspectEvaluator.java @@ -0,0 +1,83 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.ArrayList; + +/** + * Check for the presence of one or more aspects. + * + * Where more than one aspect is supplied, all aspects must be present. + * + * @author mikeh + */ +public class HasAspectEvaluator extends BaseEvaluator +{ + private ArrayList aspects; + + /** + * Define the list of aspects to check for + * + * @param aspects + */ + public void setAspects(ArrayList aspects) + { + this.aspects = aspects; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (aspects.size() == 0) + { + return false; + } + + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + for (String aspect : aspects) + { + if (!nodeAspects.contains(aspect)) + { + return false; + } + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return true; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/HasContentEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/HasContentEvaluator.java new file mode 100644 index 0000000000..1da86f1490 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/HasContentEvaluator.java @@ -0,0 +1,39 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Checks that node has binary content + * + * @author pavel.yurkevich + */ +public class HasContentEvaluator extends BaseEvaluator +{ + + @Override + public boolean evaluate(JSONObject jsonObject) + { + return getHasContent(jsonObject); + } + +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/HasGroupMembershipsEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/HasGroupMembershipsEvaluator.java new file mode 100644 index 0000000000..376ca9002b --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/HasGroupMembershipsEvaluator.java @@ -0,0 +1,71 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import java.util.ArrayList; + +import org.alfresco.web.extensibility.SlingshotEvaluatorUtil; +import org.alfresco.web.extensibility.SlingshotGroupComponentElementEvaluator; +import org.json.simple.JSONObject; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; + +/** + * Determines whether or not the current user is a member of a supplied list of groups. The groups should be + * supplied as a list parameter named "groups" and the membership relationship should indicated + * in a String parameter "relation" that should either be "AND" or "OR" indicating whether the user must be + * a member of all supplied groups or only needs to be a member of one of them in order for the evaluator + * to succeed. + * + * @author David Draper + */ +public class HasGroupMembershipsEvaluator extends BaseEvaluator +{ + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + private ArrayList groups; + + public void setGroups(ArrayList groups) + { + this.groups = groups; + } + + private String relation = SlingshotGroupComponentElementEvaluator.AND; + + public void setRelation(String relation) + { + this.relation = relation; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean memberOfAllGroups = (this.relation == null || this.relation.trim().equalsIgnoreCase(SlingshotGroupComponentElementEvaluator.AND)); + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + boolean hasMembership = this.util.isMemberOfGroups(rc, this.groups, memberOfAllGroups); + return hasMembership; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/IsBrowserEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/IsBrowserEvaluator.java new file mode 100644 index 0000000000..acf8054fed --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/IsBrowserEvaluator.java @@ -0,0 +1,73 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONObject; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Check a browser userAgent string against a supplied regular expression + * + * @author mikeh + */ +public class IsBrowserEvaluator extends BaseEvaluator +{ + private String regex; + + /** + * Define the regular expression to test against + * + * @param regex + */ + public void setRegex(String regex) + { + this.regex = regex; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (regex == null) + { + return false; + } + + try + { + String userAgent = getHeader("user-agent"); + if (userAgent != null) + { + Pattern p = Pattern.compile(this.regex); + Matcher m = p.matcher(userAgent); + return m.find(); + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/IsMimetypeEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/IsMimetypeEvaluator.java new file mode 100644 index 0000000000..f8d6633ffa --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/IsMimetypeEvaluator.java @@ -0,0 +1,77 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONObject; + +import java.util.ArrayList; + +/** + * Check whether the node's mimetype is within a configured list + * + * @author mikeh + */ +public class IsMimetypeEvaluator extends BaseEvaluator +{ + private ArrayList mimetypes; + + /** + * Define the list of mimetypes for this evaluator + * + * @param mimetypes + */ + public void setMimetypes(ArrayList mimetypes) + { + this.mimetypes = mimetypes; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (mimetypes.size() == 0) + { + return false; + } + try + { + JSONObject node = (JSONObject) jsonObject.get("node"); + if (node == null) + { + return false; + } + else + { + String mimetype = (String) node.get("mimetype"); + if (mimetype == null || !this.mimetypes.contains(mimetype)) + { + return false; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return true; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/MetadataValueEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/MetadataValueEvaluator.java new file mode 100644 index 0000000000..ad908ef336 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/MetadataValueEvaluator.java @@ -0,0 +1,66 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Tests metadata values against configured values using comparators + * + * @author mikeh + */ +public class MetadataValueEvaluator extends BaseEvaluator +{ + private Comparator comparator = null; + private String accessor = null; + + /** + * Comparator class + * + * @param comparator + */ + public void setComparator(Comparator comparator) + { + this.comparator = comparator; + } + + /** + * Accessor for value to compare against in dot notation format, e.g. "custom.vtiServer" + * + * @param accessor + */ + public void setAccessor(String accessor) + { + this.accessor = accessor; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (comparator == null || accessor == null) + { + return false; + } + + Object metaValue = getJSONValue(getMetadata(), accessor); + return this.comparator.compare(metaValue); + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/NodeTypeEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/NodeTypeEvaluator.java new file mode 100644 index 0000000000..5e51c15a14 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/NodeTypeEvaluator.java @@ -0,0 +1,105 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.scripts.DictionaryQuery; +import org.json.simple.JSONObject; + +import java.util.ArrayList; + +/** + * Evaluates whether a node is of a certain type, optionally checking for subtype + * + * @author mikeh + */ +public class NodeTypeEvaluator extends BaseEvaluator +{ + private DictionaryQuery dictionary; + private boolean allowSubtypes = true; + private ArrayList types; + + /** + * Dictionary Query bean reference + * + * @param dictionary + */ + public void setDictionary(DictionaryQuery dictionary) + { + this.dictionary = dictionary; + } + + /** + * Whether subtypes are allowed or not. Default is that subtypes ARE allowed. + * + * @param allowSubtypes + */ + public void setAllowSubtypes(boolean allowSubtypes) + { + this.allowSubtypes = allowSubtypes; + } + + /** + * Define the list of types to check for + * + * @param types + */ + public void setTypes(ArrayList types) + { + this.types = types; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (types.size() == 0) + { + return false; + } + + String nodeType = getNodeType(jsonObject); + + try + { + if (types.contains(nodeType)) + { + return true; + } + + if (allowSubtypes && dictionary != null) + { + for (String type : types) + { + if (dictionary.isSubType(nodeType, type)) + { + return true; + } + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/NullValueComparator.java b/share/src/main/java/org/alfresco/web/evaluator/NullValueComparator.java new file mode 100644 index 0000000000..112e03e90e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/NullValueComparator.java @@ -0,0 +1,46 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +/** + * @author mikeh + */ +public class NullValueComparator implements Comparator +{ + private String value = null; + + /** + * Setter for static string value to compare to + * + * @param value + */ + public void setValue(String value) + { + this.value = value; + } + + @Override + public boolean compare(Object nodeValue) + { + boolean match = this.value.equalsIgnoreCase("true"); + return match == (nodeValue == null); + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/PropertyNotNullEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/PropertyNotNullEvaluator.java new file mode 100644 index 0000000000..f6d8990ecb --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/PropertyNotNullEvaluator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Checks that a property value on a node is not null (and exists) + * + * @author mikeh + */ +public class PropertyNotNullEvaluator extends BaseEvaluator +{ + private String property = null; + + /** + * Property name + * + * @param name String + */ + public void setProperty(String name) + { + this.property = name; + } + + /** + * Checks that a property value exists and is not null + * + * + * @param jsonObject The object the action is for + * @return boolean + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean result = false; + + if (this.property != null) + { + Object value = getProperty(jsonObject, this.property); + result = (value != null); + } + + return result; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/SiteBasedEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/SiteBasedEvaluator.java new file mode 100644 index 0000000000..c0e6d97e90 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/SiteBasedEvaluator.java @@ -0,0 +1,37 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Determines whether a site-based node is being accessed via the Site Document Library + * + * @author mikeh + */ +public class SiteBasedEvaluator extends BaseEvaluator +{ + @Override + public boolean evaluate(JSONObject jsonObject) + { + return getSiteId(jsonObject) != null; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/SitePresetEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/SitePresetEvaluator.java new file mode 100644 index 0000000000..ea6656ce67 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/SitePresetEvaluator.java @@ -0,0 +1,69 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.json.simple.JSONObject; + +import java.util.ArrayList; + +/** + * Check whether the node lives in a Site of one of the listed presets + * + * @author mikeh + */ +public class SitePresetEvaluator extends BaseEvaluator +{ + private ArrayList presets; + + /** + * Define the list of presets to check for + * + * @param presets + */ + public void setPresets(ArrayList presets) + { + this.presets = presets; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (presets.size() == 0) + { + return false; + } + + try + { + if (!presets.contains(getSitePreset(jsonObject))) + { + return false; + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + err.getMessage()); + } + + return true; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/StringEqualsComparator.java b/share/src/main/java/org/alfresco/web/evaluator/StringEqualsComparator.java new file mode 100644 index 0000000000..f5a9c0f49a --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/StringEqualsComparator.java @@ -0,0 +1,67 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +/** + * Compares a node value against an optionally case-insensitive value + * + * @author mikeh + */ +public class StringEqualsComparator implements Comparator +{ + private Boolean caseInsensitive = true; + private String value = null; + + /** + * Setter for case insensitive comparison override + * + * @param caseInsensitive + */ + public void setCaseInsensitive(Boolean caseInsensitive) + { + this.caseInsensitive = caseInsensitive; + } + + /** + * Setter for static string value to compare to + * + * @param value + */ + public void setValue(String value) + { + this.value = value; + } + + @Override + public boolean compare(Object nodeValue) + { + if (nodeValue == null) + { + return false; + } + + if (caseInsensitive) + { + return nodeValue.toString().equalsIgnoreCase(this.value); + } + return nodeValue.toString().equals(this.value); + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/ValueEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/ValueEvaluator.java new file mode 100644 index 0000000000..6ea3fdea52 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/ValueEvaluator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * @author mikeh + */ +public class ValueEvaluator extends BaseEvaluator +{ + private Comparator comparator = null; + private String accessor = null; + + /** + * Comparator class + * + * @param comparator + */ + public void setComparator(Comparator comparator) + { + this.comparator = comparator; + } + + /** + * Accessor for value to compare against in dot notation format, e.g. "node.properties.cm:name" + * + * @param accessor + */ + public void setAccessor(String accessor) + { + this.accessor = accessor; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (comparator == null || accessor == null) + { + return false; + } + + Object nodeValue = getJSONValue(jsonObject, accessor); + return this.comparator.compare(nodeValue); + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/VirtualBaseEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/VirtualBaseEvaluator.java new file mode 100644 index 0000000000..373fd0b82f --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/VirtualBaseEvaluator.java @@ -0,0 +1,77 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * Base class for all smart evaluators. + * + * @author sdinuta + * + */ +public abstract class VirtualBaseEvaluator extends BaseEvaluator +{ + /** + * Checks if the node is a container. + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * + * @return Boolean true if {jsonObject} parameter is a container, or false otherwise. + */ + Boolean isContainer(JSONObject jsonObject) + { + return (Boolean) getJSONValue(jsonObject,"node.isContainer"); + } + + /** + * Checks if the node isn't in a smart folder context. + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * + * @return boolean true if {jsonObject} parameter isn't in a smart folder context, or false otherwise. + */ + boolean notInVirtualContext(JSONObject jsonObject) + { + boolean virtual = hasAspect(jsonObject,"smf:smartFolder") || hasAspect(jsonObject,"smf:smartFolderChild"); + boolean isContainer = isContainer(jsonObject); + boolean virtualContext = isContainer && hasAspect(jsonObject,"smf:smartFolderChild"); + if (!virtual && !virtualContext) + { + return true; + } + return false; + } + + /** + * Checks if the node has the specified aspect. + * + * @param jsonObject JSONObject containing a "node" object as returned from the ApplicationScriptUtils class. + * @param aspect String + * + * @return boolean true if the node has specified aspect, or false otherwise. + */ + boolean hasAspect(JSONObject jsonObject, String aspect){ + JSONArray nodeAspects = getNodeAspects(jsonObject); + return nodeAspects.contains(aspect); + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/VirtualChainedMatchOneEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/VirtualChainedMatchOneEvaluator.java new file mode 100644 index 0000000000..8262f3643c --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/VirtualChainedMatchOneEvaluator.java @@ -0,0 +1,88 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import java.util.ArrayList; +import java.util.ListIterator; + +import org.json.simple.JSONObject; + +/** + * If the node isn't in smart folder context the evaluator returns always true. + * + * If node is in smart folder context, multiple evaluators are called in turn until either the last one is called + * or one of the evaluators returns true. Effectively becomes a logical + * OR of the participating evaluators. + * + * If no evaluators are configured and the node is not in smart folder context will return always false. + * + * @author sdinuta + * + */ +public class VirtualChainedMatchOneEvaluator extends VirtualBaseEvaluator +{ + private ArrayList evaluators = null; + + /** + * Evaluators to participate in the evaluation chain + * + * @param evaluators ArrayList + */ + public void setEvaluators(ArrayList evaluators) + { + this.evaluators = evaluators; + } + + /** + * If the node isn't in smart folder context the evaluator returns always true. + * + * If no evaluators are configured and the node is not in smart folder context will return always false. + * + * If node is in smart folder context run through each given evaluator until we either get to the end or one returns false. + * + * @param jsonObject The object the evaluation is for + * + * @return boolean. + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + if(notInVirtualContext(jsonObject)) + { + return true; + } + boolean result = false; + + if(evaluators!=null){ + ListIterator evalIter = evaluators.listIterator(); + + while (!result && evalIter.hasNext()) + { + BaseEvaluator evaluator = (BaseEvaluator)evalIter.next(); + evaluator.args = this.args; + evaluator.metadata = this.metadata; + result = evaluator.negateOutput ^ evaluator.evaluate(jsonObject); + } + } + return result; + } + +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/VirtualDocumentEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/VirtualDocumentEvaluator.java new file mode 100644 index 0000000000..680f207901 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/VirtualDocumentEvaluator.java @@ -0,0 +1,49 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Evaluator for documents in smart folder context. + * + * @author sdinuta + * + */ +public class VirtualDocumentEvaluator extends VirtualBaseEvaluator +{ + /** + * Evaluates if we have a document and if it is in a smart folder context. + * + * @param jsonObject The object the evaluation is for + * + * @return true if the document is in smart folder context, or false otherwise. + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (hasAspect(jsonObject,"smf:smartFolderChild") && !isContainer(jsonObject)) + { + return true; + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/VirtualFolderContextEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/VirtualFolderContextEvaluator.java new file mode 100644 index 0000000000..18b07ff48b --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/VirtualFolderContextEvaluator.java @@ -0,0 +1,49 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Evaluator for physical folders in smart folder context. + * + * @author sdinuta + */ +public class VirtualFolderContextEvaluator extends VirtualBaseEvaluator +{ + /** + * Evaluates if we have a folder and if it is in a smart folder context. + * + * @param jsonObject The object the evaluation is for + * + * @return true if the folder is in smart folder context, or false otherwise. + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + boolean virtualContext = isContainer(jsonObject) && hasAspect(jsonObject,"smf:smartFolderChild"); + if (virtualContext) + { + return true; + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/VirtualFolderEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/VirtualFolderEvaluator.java new file mode 100644 index 0000000000..0f3bc217e3 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/VirtualFolderEvaluator.java @@ -0,0 +1,48 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator; + +import org.json.simple.JSONObject; + +/** + * Evaluator for smart folders. + * + * @author sdinuta + * + */ +public class VirtualFolderEvaluator extends VirtualBaseEvaluator +{ + /** + * Evaluates if we have a smart folder. + * + * @param jsonObject The object the evaluation is for + * + * @return true if the folder is smart, or false otherwise. + */ + @Override + public boolean evaluate(JSONObject jsonObject) + { + if(hasAspect(jsonObject, "smf:smartFolder")){ + return true; + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/action/EditableByCurrentUser.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/EditableByCurrentUser.java new file mode 100644 index 0000000000..5ff141a6d2 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/EditableByCurrentUser.java @@ -0,0 +1,72 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.action; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONObject; + +/** + * "Current user can edit document" action evaluator. + * + * Checks if in such a state that the current user can't edit the document: + *

+ *     If node is locked it must be locked by the current user
+ *     If node is a working copy the current user must be the owner
+ * 
+ * + * @author ewinlof + */ +public class EditableByCurrentUser extends BaseEvaluator +{ + private static final String PROP_WORKINGCOPYOWNER = "cm:workingCopyOwner"; + private static final String PROP_LOCKOWNER = "cm:lockOwner"; + private static final String PROP_LOCKTYPE = "cm:lockType"; + private static final String NODE_LOCK = "NODE_LOCK"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + Object lockType = getProperty(jsonObject, PROP_LOCKTYPE); + if (lockType != null && ((String) lockType).equalsIgnoreCase(NODE_LOCK)) + { + return false; + } + if (getIsLocked(jsonObject)) + { + return getMatchesCurrentUser(jsonObject, PROP_LOCKOWNER); + } + else if (getIsWorkingCopy(jsonObject)) + { + return getMatchesCurrentUser(jsonObject, PROP_WORKINGCOPYOWNER); + } + + // Node is in normal state + return true; + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/action/IsNodeEditableAos.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/IsNodeEditableAos.java new file mode 100644 index 0000000000..58454c6ede --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/IsNodeEditableAos.java @@ -0,0 +1,75 @@ +package org.alfresco.web.evaluator.doclib.action; + +import java.util.Map; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; +import org.json.simple.JSONObject; + +/** + * For the node to be editable it needs to be in a supported mimetype and have a valid file extension (matching the + * mimetype) + * + * @author evasques + */ +public class IsNodeEditableAos extends BaseEvaluator +{ + private static final String PROP_NAME = "cm:name"; + + private Map mimetypeExtensionMap; + + /** + * Define the map of mimetype/extension pair for this evaluator + * + * @param mimetypeExtensionMap + */ + public void setMimetypeExtensionMap(Map mimetypeExtensionMap) + { + this.mimetypeExtensionMap = mimetypeExtensionMap; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + if (mimetypeExtensionMap.size() == 0) + { + return false; + } + + try + { + // mimetype and name must not be empty + String mimetype = (String) getNodeMimetype(jsonObject); + String name = (String) getProperty(jsonObject, PROP_NAME); + if (StringUtils.isEmpty(mimetype) || StringUtils.isEmpty(name)) + { + return false; + } + + // filename must have a an extension + String fileExtension = FilenameUtils.getExtension(name); + if (StringUtils.isEmpty(fileExtension)) + { + return false; + } + + // mimetype of the file must be supported (i.e. must be in the map and have an expected extension) and the + // expected extension for the mimetype needs to match the extension in the filename + String expectedExtension = mimetypeExtensionMap.get(mimetype); + if (expectedExtension == null || !expectedExtension.equals(fileExtension.toLowerCase())) + { + return false; + } + + } + catch (Exception ex) + { + throw new AlfrescoRuntimeException("Failed to run action evaluator: " + ex.getMessage()); + } + + return true; + } + +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/action/LocateActionEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/LocateActionEvaluator.java new file mode 100644 index 0000000000..437a2bfbb4 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/LocateActionEvaluator.java @@ -0,0 +1,45 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.action; + +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONObject; + +/** + * Evaluator for the Locate document library action. + * The action is only valid when the current filter is not "path" + * + * @author mikeh + */ +public class LocateActionEvaluator extends BaseEvaluator +{ + @Override + public boolean evaluate(JSONObject jsonObject) + { + String filter = getArg("filter"); + if (filter instanceof String) + { + return !(filter.equalsIgnoreCase("path")); + } + + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/action/ViewInExplorerEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/ViewInExplorerEvaluator.java new file mode 100644 index 0000000000..3b64e93b69 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/action/ViewInExplorerEvaluator.java @@ -0,0 +1,74 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.action; + +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONObject; +import org.springframework.extensions.config.Config; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.ConfigService; + +/** + * Evaluates whether a repositoryUrl config value has been set and that we're not in portlet mode + * + * @author mikeh + */ +public class ViewInExplorerEvaluator extends BaseEvaluator +{ + private static final String CONFIG_CONDITION_DOCUMENTLIBRARY = "DocumentLibrary"; + private static final String CONFIG_ELEMENT_REPOSITORY_URL = "repository-url"; + + private ConfigService configService; + + /** + * Config Service setter + * + * @param configService + */ + public void setConfigService(ConfigService configService) + { + this.configService = configService; + } + + @Override + public boolean evaluate(JSONObject jsonObject) + { + return (getConfigValue(CONFIG_CONDITION_DOCUMENTLIBRARY, CONFIG_ELEMENT_REPOSITORY_URL) != null && !getIsPortlet()); + } + + /** + * Retrieve config value + * + * @param condition Config section + * @param elementName Element within section + * @return Object || null + */ + protected Object getConfigValue(String condition, String elementName) + { + Config config = configService.getConfig(condition); + if (config == null) + { + return null; + } + + return config.getConfigElementValue(elementName); + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/ActiveWorkflowsEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/ActiveWorkflowsEvaluator.java new file mode 100644 index 0000000000..bae60c512b --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/ActiveWorkflowsEvaluator.java @@ -0,0 +1,58 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONObject; + +/** + * "Active workflows" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     activeWorkflows is a number > 0
+ * 
+ * + * @author mikeh + */ +public class ActiveWorkflowsEvaluator extends BaseEvaluator +{ + private final String VALUE_ACTIVEWORKFLOWS = "activeWorkflows"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + Number workflows = (Number) jsonObject.get(VALUE_ACTIVEWORKFLOWS); + if (workflows != null && workflows.intValue() > 0) + { + return true; + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/EditingEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/EditingEvaluator.java new file mode 100644 index 0000000000..cc880cfcaf --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/EditingEvaluator.java @@ -0,0 +1,68 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * "Being edited by you" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     hasAspect("cm:workingcopy")
+ *     property "cm:workingCopyOwner" == (currentUser)
+ * 
+ * + * @author mikeh + */ +public class EditingEvaluator extends BaseEvaluator +{ + private static final String ASPECT_WORKINGCOPY = "cm:workingcopy"; + private static final String PROP_WORKINGCOPYOWNER = "cm:workingCopyOwner"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + if (nodeAspects.contains(ASPECT_WORKINGCOPY)) + { + return getMatchesCurrentUser(jsonObject, PROP_WORKINGCOPYOWNER); + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/LockOwnerEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/LockOwnerEvaluator.java new file mode 100644 index 0000000000..e78ab20fbc --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/LockOwnerEvaluator.java @@ -0,0 +1,75 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * "Current user has document locked" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     node is locked
+ *     NOT hasAspect("trx:transferred")
+ *     NOT hasAspect("cm:workingcopy")
+ *     property "cm:lockOwner" == (currentUser)
+ * 
+ * + * @author mikeh + */ +public class LockOwnerEvaluator extends BaseEvaluator +{ + private static final String ASPECT_TRANSFERRED = "trx:transferred"; + private static final String ASPECT_WORKINGCOPY = "cm:workingcopy"; + private static final String PROP_LOCKOWNER = "cm:lockOwner"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + if (getIsLocked(jsonObject)) + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + if (!nodeAspects.contains(ASPECT_TRANSFERRED) && + !nodeAspects.contains(ASPECT_WORKINGCOPY)) + { + return getMatchesCurrentUser(jsonObject, PROP_LOCKOWNER); + } + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/LockedEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/LockedEvaluator.java new file mode 100644 index 0000000000..8ba0cd0a79 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/LockedEvaluator.java @@ -0,0 +1,78 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * "Locked by another user" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     hasAspect("cm:workingcopy")
+ *     property "cm:workingCopyOwner" != (currentUser)
+ *      -OR-
+ *     node is locked
+ *     NOT hasAspect("trx:transferred")
+ *     property "cm:lockOwner" != (currentUser)
+ * 
+ * + * @author mikeh + */ +public class LockedEvaluator extends BaseEvaluator +{ + private static final String ASPECT_TRANSFERRED = "trx:transferred"; + private static final String ASPECT_WORKINGCOPY = "cm:workingcopy"; + private static final String PROP_LOCKOWNER = "cm:lockOwner"; + private static final String PROP_WORKINGCOPYOWNER = "cm:workingCopyOwner"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + if (nodeAspects.contains(ASPECT_WORKINGCOPY)) + { + return !getMatchesCurrentUser(jsonObject, PROP_WORKINGCOPYOWNER); + } + else if (!nodeAspects.contains(ASPECT_TRANSFERRED)) + { + return (getIsLocked(jsonObject) && !getMatchesCurrentUser(jsonObject, PROP_LOCKOWNER)); + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/RulesEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/RulesEvaluator.java new file mode 100644 index 0000000000..ef351aa64b --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/RulesEvaluator.java @@ -0,0 +1,66 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * "Folder has rules applied" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     hasAspect("rule:rules")
+ * 
+ * + * @author mikeh + */ +public class RulesEvaluator extends BaseEvaluator +{ + private static final String ASPECT_RULES = "rule:rules"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + if (nodeAspects.contains(ASPECT_RULES)) + { + return true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/SimpleWorkflowEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/SimpleWorkflowEvaluator.java new file mode 100644 index 0000000000..664fcd462c --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/SimpleWorkflowEvaluator.java @@ -0,0 +1,66 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * "Node is participating in a simple workflow" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     hasAspect("app:simpleworkflow")
+ * 
+ * + * @author mikeh + */ +public class SimpleWorkflowEvaluator extends BaseEvaluator +{ + private static final String ASPECT_SIMPLEWORKFLOW = "app:simpleworkflow"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + if (nodeAspects.contains(ASPECT_SIMPLEWORKFLOW)) + { + return true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/TransferredNodeEvaluator.java b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/TransferredNodeEvaluator.java new file mode 100644 index 0000000000..601f53b425 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/evaluator/doclib/indicator/TransferredNodeEvaluator.java @@ -0,0 +1,66 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.evaluator.doclib.indicator; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.evaluator.BaseEvaluator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** + * "Node has been transferred from another Repository" status indicator evaluator. + * + * Checks the following conditions are met: + *
+ *     hasAspect("trx:transferred")
+ * 
+ * + * @author mikeh + */ +public class TransferredNodeEvaluator extends BaseEvaluator +{ + private static final String ASPECT_TRANSFERRED = "trx:transferred"; + + @Override + public boolean evaluate(JSONObject jsonObject) + { + try + { + JSONArray nodeAspects = getNodeAspects(jsonObject); + if (nodeAspects == null) + { + return false; + } + else + { + if (nodeAspects.contains(ASPECT_TRANSFERRED)) + { + return true; + } + } + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed to run UI evaluator: " + err.getMessage()); + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotConfigComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotConfigComponentElementEvaluator.java new file mode 100644 index 0000000000..4c7f95f650 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotConfigComponentElementEvaluator.java @@ -0,0 +1,167 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.config.Config; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.ConfigService; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +import java.util.Map; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + *

+ * + *

+ * Finds the value of the config element in share-config.xml (or other deployed xxx-config.xml files) + * specificed by the {@code } parameter. + *

+ * + *

+ * If no additional parameters has been provided it will simply test if the value equals "true". + * If the value instead shall match a different value that value can be specified using a regexp inside the + * {@code } parameter. + *

+ * + *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ *     
+ *         DocumentDetails/document-details/display-web-preview
+ *     
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a site with an id of "marketing" or "engineering". + *

+ * + * @author ewinlof + */ +public class SlingshotConfigComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + private static Log logger = LogFactory.getLog(SlingshotConfigComponentElementEvaluator.class); + + // Evaluator parameters + public static final String ELEMENT = "element"; + public static final String MATCH = "match"; + + protected SlingshotEvaluatorUtil util = null; + protected ConfigService configService = null; + + + /** + * Sets the evaluator util. + * + * @param slingshotExtensibilityUtil the evaluator util + */ + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Sets the config service. + * + * @param configService the new config service + */ + public void setConfigService(ConfigService configService) + { + this.configService = configService; + } + + /** + * Decides if we are inside a site or not. + * + * @param context RequestContext + * @param params Map + * @return true if we are in a site and its id matches the {@code } param (defaults to ".*") + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + String element = util.getEvaluatorParam(params, ELEMENT, null); + if (element != null) + { + String token = null; + String value = null; + Config config = null; + ConfigElement configElement = null; + String[] tokens = element.split("/"); + int i = 0; + for (; i < tokens.length; i++) + { + token = tokens[i]; + if (!token.isEmpty()) + { + if (i == 0) + { + config = configService.getConfig(token); + } + else if (i == 1 && config != null) + { + value = config.getConfigElementValue(token); + configElement = config.getConfigElement(token); + } + else if (i >= 2 && configElement != null) + { + value = configElement.getChildValue(token); + configElement = configElement.getChild(token); + } + } + } + if (value != null && i == tokens.length) + { + String match = util.getEvaluatorParam(params, MATCH, null); + if (match != null) + { + return match.matches(value); + } + + // If no specific parameter instructions was provided just test if the value returns true + return value.equalsIgnoreCase("true"); + } + else + { + if (logger.isDebugEnabled()) + { + logger.debug("Could not find value for " + element + ""); + } + } + } + + // No value was found + return false; + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotEqualsComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotEqualsComponentElementEvaluator.java new file mode 100644 index 0000000000..81490e8f0f --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotEqualsComponentElementEvaluator.java @@ -0,0 +1,90 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.Map; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + * Returns true if all parameter values matches each other AND there are at least 2 parameters. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ *    
+ *       {referrer}
+ *       workflows
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if the resolved value of {referrer} equals the value of the {@code } parameter ("workflows"). + *

+ * + * @author ewinlof + */ +public class SlingshotEqualsComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + /** + * Returns true if all parameter values equal each other. + * + * @param context RequestContext + * @param params Map + * @return true if 2 or more values are equal to each other. + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + if (params.isEmpty()) + { + return false; + } + else if (params.size() < 2) + { + return false; + } + else + { + String firstValue = params.values().iterator().next(); + if (firstValue == null) + { + firstValue = ""; + } + for (String value : params.values()) + { + if (!firstValue.equals(value)) + { + return false; + } + } + return true; + } + } +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotEvaluatorUtil.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotEvaluatorUtil.java new file mode 100644 index 0000000000..a1635e055a --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotEvaluatorUtil.java @@ -0,0 +1,502 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.alfresco.web.site.SlingshotUserFactory; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.simple.parser.ParseException; +import org.springframework.extensions.config.RemoteConfigElement; +import org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.WebFrameworkServiceRegistry; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.support.AlfrescoUserFactory; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.util.URLEncoder; +import org.springframework.extensions.webscripts.ScriptRemote; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.CredentialVault; +import org.springframework.extensions.webscripts.connector.Credentials; +import org.springframework.extensions.webscripts.connector.Response; + +/** + * Utility class for evaluators to pick values from the request and get site information etc. + * + * @author ewinlof + */ +public class SlingshotEvaluatorUtil { + + private static Log logger = LogFactory.getLog(SlingshotEvaluatorUtil.class); + + public static final String SITE_PRESET_CACHE = SlingshotEvaluatorUtil.class.getName() + ".sitePresets"; + + /* Context attributes and url parameters/path tokens */ + protected static final String PORTLET_HOST = "portletHost"; // Set by the ProxyPortlet + protected static final String PORTLET_URL = "portletUrl"; // Set by the ProxyPortlet + protected static final String SITE_PRESET = "sitePreset"; + protected static final String SITE = "site"; + protected static final String PAGE_CONTEXT = "pagecontext"; + + protected WebFrameworkServiceRegistry serviceRegistry = null; + + public void setServiceRegistry(WebFrameworkServiceRegistry serviceRegistry) + { + this.serviceRegistry = serviceRegistry; + } + + /** + * Helper for getting an evaluator parameter trimmed OR defaultValue if no value has been provided. + * + * @param params Map + * @param name String + * @param defaultValue String + * @return A trimmed evaluator parameter OR defaultValue if no value has been provided. + */ + public String getEvaluatorParam(Map params, String name, String defaultValue) + { + String value = params.get(name); + if (value != null && !value.trim().isEmpty()) + { + return value.trim(); + } + return defaultValue; + } + + /** + * Returns true if we are viewed from inside a portal. + * + * @param context RequestContext + * @return true if we are viewed from inside a portal + */ + public Boolean getPortletHost(RequestContext context) + { + Boolean portletHost = (Boolean) context.getAttribute(PORTLET_HOST); + if (portletHost == null) + { + String portletHostParam = context.getParameter(PORTLET_HOST); + portletHost = portletHostParam != null && portletHostParam.equalsIgnoreCase("true"); + } + return portletHost; + } + + /** + * Returns the portal url if we are inside a portal, otherwise null. + * @param context RequestContext + * @return the portal url if we are inside a portal, otherwise null. + */ + public String getPortletUrl(RequestContext context) + { + String portletUrl = (String) context.getAttribute(PORTLET_URL); + if (portletUrl == null) + { + portletUrl = context.getParameter(PORTLET_URL); + } + return portletUrl; + } + + /** + * Returns the current site id OR null if we aren't in a site + * + * @param context RequestContext + * @return The current page id OR null if it doesn't exist + */ + public String getPageId(RequestContext context) + { + // Look for pageId + return context.getPageId(); + } + + /** + * Returns the current site id OR null if we aren't in a site + * + * @param context RequestContext + * @return The current site id OR null if we aren't in a site + */ + public String getSite(RequestContext context) + { + // Look for siteId in url path & parameters + String site = context.getUriTokens().get(SITE); + if (site == null) + { + site = context.getParameter(SITE); + } + if (site == null) + { + String[] pathNames = context.getUri().substring(context.getContextPath().length()).split("/"); + for (int i = 0; i < pathNames.length; i++) { + if (pathNames[i].equals(SITE) && (i + 1 < pathNames.length)) + { + site = pathNames[i + 1]; + break; + } + } + } + return site; + } + + /** + * Returns the current page context id OR null if one isn't supplied + * + * @param context RequestContext + * @return The current page context id OR null if there is no page context + */ + public String getPageContext(RequestContext context) + { + // Look for siteId in url path & parameters + String pageContext = context.getUriTokens().get(PAGE_CONTEXT); + if (pageContext == null) + { + pageContext = context.getParameter(PAGE_CONTEXT); + } + if (pageContext == null) + { + String[] pathNames = context.getUri().substring(context.getContextPath().length()).split("/"); + for (int i = 0; i < pathNames.length; i++) { + if (pathNames[i].equals(PAGE_CONTEXT) && (i + 1 < pathNames.length)) + { + pageContext = pathNames[i + 1]; + break; + } + } + } + return pageContext; + } + + /** + * The site's sitePreset OR null if something goes wrong. + * + * @param context RequestContext + * @param siteId The id of the site to retrieve the sitePreset for. + * @return The site's sitePreset OR null if something goes wrong. + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public String getSitePreset(RequestContext context, String siteId) + { + // Get the preset request cache + HashMap sitePresetCache = (HashMap) context.getAttributes().get(SITE_PRESET_CACHE); + if (sitePresetCache == null) + { + sitePresetCache = new HashMap(); + context.getAttributes().put(SITE_PRESET_CACHE, sitePresetCache); + } + + // Check if site's preset already has been asked for during this request + String sitePresetId = (String) sitePresetCache.get(siteId); + if (sitePresetId == null) + { + try + { + JSONObject site = jsonGet("/api/sites/" + URLEncoder.encode(siteId)); + if (site != null) + { + sitePresetId = site.getString(SITE_PRESET); + sitePresetCache.put(siteId, sitePresetId); + } + } + catch (JSONException e) + { + if (logger.isErrorEnabled()) + { + logger.error("Could not get a sitePreset from site json."); + } + } + } + + // Return sites preset + return sitePresetId; + } + + /** + * Helper method for making a json get remote call to the default repository. + * + * @param uri The uri to get the content for (MUST contain a json response) + * @return The content of the uri resource parsed into a json object. + */ + public JSONObject jsonGet(String uri) + { + ScriptRemote scriptRemote = serviceRegistry.getScriptRemote(); + Response response = scriptRemote.connect().get(uri); + if (response.getStatus().getCode() == 200) + { + try + { + return new JSONObject(response.getResponse()); + } + catch (JSONException e) + { + if (logger.isErrorEnabled()) + { + logger.error("An error occurred when parsing response to json from the uri '" + uri + "': " + e.getMessage()); + } + } + } + return null; + } + + /** + * Determines whether or not the current user is a member of the supplied group. + * + * @param context RequestContext + * @param groups List + * @param memberOfAllGroups boolean + * @return boolean + */ + @SuppressWarnings({ "rawtypes" }) + public boolean isMemberOfGroups(RequestContext context, List groups, boolean memberOfAllGroups) + { + // Initialise the default result to be null... we're intentionally using a Boolean object over boolean + // primitive to give us access to the third value of null. This allows us to determine whether or not + // any membership information has actually been processed (e.g. when NO groups have been specified). + Boolean isMember = null; + + // We're going to store GROUP membership in the HttpSession as this changes infrequently but will be + // accessing SITE membership for every request. Surf will ensure that requests are cached for each + // page so we are not making the same request more than once per page. Site membership can change more + // frequently so we need to be sure that the information we have is up-to-date. + HttpSession session = ServletUtil.getSession(); + org.json.simple.JSONArray groupsList = null; + String GROUP_MEMBERSHIPS = "AlfGroupMembershipsKey"; + + // Get the current site + String currentSite = getSite(context); + + boolean externalAuth = false; + RemoteConfigElement config = (RemoteConfigElement) context.getServiceRegistry().getConfigService().getConfig("Remote").getConfigElement("remote"); + if (config != null) + { + EndpointDescriptor descriptor = config.getEndpointDescriptor(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID); + if (descriptor != null) + { + externalAuth = descriptor.getExternalAuth(); + } + } + + // Get all the group membership first so that we don't perform this operation multiple times... check + // the HttpSession and if it's not already available then make a request for it and cache it for future + // reference. Note that we're ONLY caching the current users membership information. + Object _cachedGroupMemberships = session.getAttribute(GROUP_MEMBERSHIPS); + if (_cachedGroupMemberships instanceof org.json.simple.JSONArray) + { + groupsList = (org.json.simple.JSONArray) _cachedGroupMemberships; + } + else + { + try + { + // Get the Site membership information... + CredentialVault cv = context.getCredentialVault(); + if (cv != null) + { + Credentials creds = cv.retrieve(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID); + // Check for external authentication + // MNT-11857 + if (creds == null && !externalAuth) + { + // User is not logged in anymore + return false; + } + String userName = (String)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID); + Connector connector = context.getServiceRegistry().getConnectorService().getConnector(SlingshotUserFactory.ALFRESCO_ENDPOINT_ID, userName, ServletUtil.getSession()); + Response res = connector.call("/api/people/" + URLEncoder.encode(context.getUserId()) + "?groups=true"); + if (res.getStatus().getCode() == Status.STATUS_OK) + { + String response = res.getResponse(); + org.json.simple.parser.JSONParser p = new org.json.simple.parser.JSONParser(); + Object o2 = p.parse(response); + if (o2 instanceof org.json.simple.JSONObject) + { + org.json.simple.JSONObject jsonRes = (org.json.simple.JSONObject) o2; + groupsList = (org.json.simple.JSONArray) jsonRes.get("groups"); + session.setAttribute(GROUP_MEMBERSHIPS, groupsList); + } + } + } + } + catch (ConnectorServiceException e) + { + e.printStackTrace(); + } + catch (ParseException e) + { + e.printStackTrace(); + } + } + + // Work through the supplied list of groups to determine whether or not the current user is a member of them... + for (String groupName: groups) + { + boolean isMemberOfCurrentGroup = false; + if (groupName != null) + { + // If the requested groupName begins with "Site" then this indicates that we are looking + // for a site specific group such as "SiteConsumer" and we therefore need to modify the + // group name to reflect the current site. If we are not currently viewing a site then + // we will automatically indicate that the user is not a member (how can they be a member + // of the current site if they're not in a site?) and move onto the next group... + if (groupName.startsWith("Site")) + { + if (currentSite == null) + { + isMember = false; + } + else + { + // We're going to rely on URI tokens to determine if we're viewing a site - it's the + // best data available from the RequestContext. + try + { + CredentialVault cv = context.getCredentialVault(); + if (cv != null) + { + Credentials creds = cv.retrieve(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID); + if (creds == null && !externalAuth) + { + // User is not logged in anymore + return false; + } + String userName = (String)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID); + Connector connector = context.getServiceRegistry().getConnectorService().getConnector(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID, userName, ServletUtil.getSession()); + Response res = connector.call("/api/sites/" + currentSite + "/memberships/" + URLEncoder.encode(context.getUserId())); + if (res.getStatus().getCode() == Status.STATUS_OK) + { + String response = res.getResponse(); + org.json.simple.parser.JSONParser p = new org.json.simple.parser.JSONParser(); + Object o2 = p.parse(response); + if (o2 instanceof org.json.simple.JSONObject) + { + org.json.simple.JSONObject jsonRes = (org.json.simple.JSONObject) o2; + String siteMembership = (String) jsonRes.get("role"); + isMemberOfCurrentGroup = siteMembership.equals(groupName); + } + } + else + { + // When the user is NOT a member of the site the request will actually return a 404 (rather than a 200) + // so on any request that fails we will assume they are not a member of the site. + isMemberOfCurrentGroup = false; + } + } + } + catch (ConnectorServiceException e) + { + e.printStackTrace(); + } + catch (ParseException e) + { + e.printStackTrace(); + } + } + } + else if (groupsList != null) + { + // Check for regular GROUP membership... all non-site groups MUST begin "GROUP"... + Iterator i = groupsList.iterator(); + while (i.hasNext()) + { + org.json.simple.JSONObject group = (org.json.simple.JSONObject) i.next(); + String currGroupName = group.get("itemName").toString(); + if (currGroupName.equals(groupName)) + { + isMemberOfCurrentGroup = true; + break; + } + } + } + } + + // Handle the requested membership logic and make a quick exit if possible... + if (memberOfAllGroups) + { + isMember = (isMember == null) ? isMemberOfCurrentGroup : isMember && isMemberOfCurrentGroup; + if (!isMember) + { + // Break out of the main loop if the user must be a member of all groups and is not + // a member of at least one of them. There is no point in checking the remaining groups + break; + } + } + else + { + isMember = (isMember == null) ? isMemberOfCurrentGroup : isMember || isMemberOfCurrentGroup; + if (isMember) + { + // Break out of the main loop if the user is a member of at least one group as that + // is all that is required. + break; + } + } + } + return isMember; + } + + /** + * Gets the list of groups to check for membership of. This assumes that the groups have been + * provided as a comma delimited string and will convert that string into a List removing trailing + * whitespace along the way. + * + * @param groupsParm String + * @return List + */ + public List getGroups(String groupsParm) + { + List groups = new ArrayList(); + if (groupsParm != null) + { + String[] groupsArr = groupsParm.split(","); + for (String group: groupsArr) + { + groups.add(group.trim()); + } + } + return groups; + } + + /** + * Helper method to get a request header value from the current request context + * + * @param name Header name to retrieve + * @return string value or null + */ + protected String getHeader(String name) + { + String header = null; + if (name != null) + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + header = rc.getHeader(name); + } + return header; + } +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotGroupComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotGroupComponentElementEvaluator.java new file mode 100644 index 0000000000..9f095f0235 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotGroupComponentElementEvaluator.java @@ -0,0 +1,84 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.List; +import java.util.Map; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +public class SlingshotGroupComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + public static final String GROUPS = "groups"; + public static final String RELATION = "relation"; + public static final String AND = "AND"; + public static final String NEGATE = "negate"; + + /** + * Checks to see whether or not the current user satisfies the group membership requirements + * specified. + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + boolean memberOfAllGroups = getRelationship(context, params); + List groups = util.getGroups(params.get(GROUPS)); + boolean isMember = util.isMemberOfGroups(context, groups, memberOfAllGroups); + boolean negate = getNegation(context, params); + boolean apply = (isMember && !negate) || (!isMember && negate); + return apply; + } + + /** + * Checks for a request for to negate the ruling. The default is false. + * @param context RequestContext + * @param evaluationProperties Map + * @return boolean + */ + protected boolean getNegation(RequestContext context, Map evaluationProperties) + { + String negateParam = evaluationProperties.get(NEGATE); + return (negateParam != null && negateParam.trim().equalsIgnoreCase(Boolean.TRUE.toString())); + } + + /** + * Gets the logical relationship between all the groups to test for membership of. By default + * this boils down to a straight choice between "AND" (must be a member of ALL groups) and "OR" + * (only needs to be a member of one group) + * + * @param context RequestContext + * @param evaluationProperties Map + * @return boolean + */ + protected boolean getRelationship(RequestContext context, Map evaluationProperties) + { + String relationParam = evaluationProperties.get(RELATION); + return (relationParam != null && relationParam.trim().equalsIgnoreCase(AND)); + } +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotGroupModuleEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotGroupModuleEvaluator.java new file mode 100644 index 0000000000..e6fd44753f --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotGroupModuleEvaluator.java @@ -0,0 +1,87 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.List; +import java.util.Map; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.ExtensionModuleEvaluator; + +public class SlingshotGroupModuleEvaluator implements ExtensionModuleEvaluator +{ + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Checks to see whether or not the current user satisfies the group membership requirements + * specified. + */ + @Override + public boolean applyModule(RequestContext context, Map evaluationProperties) + { + boolean memberOfAllGroups = getRelationship(context, evaluationProperties); + List groups = util.getGroups(evaluationProperties.get(SlingshotGroupComponentElementEvaluator.GROUPS)); + boolean isMember = util.isMemberOfGroups(context, groups, memberOfAllGroups); + boolean negate = getNegation(context, evaluationProperties); + boolean apply = (isMember && !negate) || (!isMember && negate); + return apply; + } + + /** + * Checks for a request for to negate the ruling. The default is false. + * @param context RequestContext + * @param evaluationProperties Map + * @return boolean + */ + protected boolean getNegation(RequestContext context, Map evaluationProperties) + { + String negateParam = evaluationProperties.get(SlingshotGroupComponentElementEvaluator.NEGATE); + return (negateParam != null && negateParam.trim().equalsIgnoreCase(Boolean.TRUE.toString())); + } + + /** + * Gets the logical relationship between all the groups to test for membership of. By default + * this boils down to a straight choice between "AND" (must be a member of ALL groups) and "OR" + * (only needs to be a member of one group) + * + * @param context RequestContext + * @param evaluationProperties Map + * @return boolean + */ + protected boolean getRelationship(RequestContext context, Map evaluationProperties) + { + String relationParam = evaluationProperties.get(SlingshotGroupComponentElementEvaluator.RELATION); + return (relationParam != null && relationParam.trim().equalsIgnoreCase(SlingshotGroupComponentElementEvaluator.AND)); + } + + @Override + public String[] getRequiredProperties() + { + String[] props = { SlingshotGroupComponentElementEvaluator.GROUPS, SlingshotGroupComponentElementEvaluator.RELATION, SlingshotGroupComponentElementEvaluator.NEGATE }; + return props; + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotPageComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotPageComponentElementEvaluator.java new file mode 100644 index 0000000000..53ab4cb203 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotPageComponentElementEvaluator.java @@ -0,0 +1,108 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +import java.util.Map; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + *

+ * + *

+ * Returns true if we are inside a site's id matches the regexp from the {@code } parameter. + *

+ * + *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ *

+ * Note! the value of the {@code } parameter is ".*" which will make it match all page's ids. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ * }
+ * + *

+ * Will return true as long as there is a page id defined. + *

+ * + *

+ * Example 2: + *

+ * + *
{@code
+ * 
+ *    
+ *       foo|bar
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a page with an id of "foo" or "bar". + *

+ * + * @author ewinlof + */ +public class SlingshotPageComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + // Evaluator parameters + public static final String PAGE_FILTER = "pages"; + + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Decides if we are inside a site or not. + * + * @param context RequestContext + * @param params Map + * @return true if we are on a page with an id that matches the {@code } param (defaults to ".*") + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + String pageId = util.getPageId(context); + + // If we are in a site use site filters + if (pageId != null && pageId.matches(util.getEvaluatorParam(params, PAGE_FILTER, ".*"))) + { + return true; + } + + // The page id didn't match the page filter + return false; + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotPageContextComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotPageContextComponentElementEvaluator.java new file mode 100644 index 0000000000..66a6292005 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotPageContextComponentElementEvaluator.java @@ -0,0 +1,108 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.Map; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + *

+ * + *

+ * Returns true if we are inside a site AND that site's id matches the regexp from the {@code } parameter. + *

+ * + *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ *

+ * Note! the default value of the {@code } parameter is ".*" which will make it match all site's ids. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ * }
+ * + *

+ * Will return tru if we are in a site, no matter what the id of the site is. + *

+ * + *

+ * Example 2: + *

+ * + *
{@code
+ * 
+ *    
+ *       marketing|engineering
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a site with an id of "marketing" or "engineering". + *

+ * + * @author ewinlof + */ +public class SlingshotPageContextComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + // Evaluator parameters + public static final String PAGE_CONTEXT_FILTER = "pagecontext"; + + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Decides if we are there is a page context set + * + * @param context RequestContext + * @param params Map + * @return true if we are in a site and its id matches the {@code } param (defaults to ".*") + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + String pageContext = util.getPageContext(context); + + // If we are in a site use site filters + if (pageContext != null && pageContext.matches(util.getEvaluatorParam(params, PAGE_CONTEXT_FILTER, ".*"))) + { + return true; + } + + // The page context didn't match the page context filter + return false; + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotPresetComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotPresetComponentElementEvaluator.java new file mode 100644 index 0000000000..80ad4a40dc --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotPresetComponentElementEvaluator.java @@ -0,0 +1,105 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.Map; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + *

+ * + *

+ * Returns true if we are inside a site AND that site's sitePreset matches the regexp from the {@code } + * parameter. + *

+ * + *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ *

+ * Note! The default value of the {@code } parameter is ".*" which will make it match all site presets. + *

+ * + *

+ * Example: + *

+ * + *

+ *

{@code
+ * 
+ *    
+ *       rm-site-dashboard
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a Records Management site (which always has a sitePreset id set to + * "rm-site-dashboard"). + *

+ * + * @author ewinlof + */ +public class SlingshotPresetComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + // Evaluator Parameters + public static final String SITE_PRESET_FILTER = "sitePresets"; + + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Decides if we are inside a site or not. + * + * @param context RequestContext + * @param params Map + * @return true if we are in a site and its id matches the {@code } param (defaults to ".*") + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + String siteId = util.getSite(context); + + // If we are in a site use site filters + if (siteId != null) + { + // Yes we are in a site now check the preset + String sitePreset = util.getSitePreset(context, siteId); + if (sitePreset != null && sitePreset.matches(util.getEvaluatorParam(params, SITE_PRESET_FILTER, ".*"))) + { + // Yes we are in a site with a preset that matches our filter + return true; + } + } + + // No we are not in a site with a preset + return false; + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotSiteComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotSiteComponentElementEvaluator.java new file mode 100644 index 0000000000..b5025f34f3 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotSiteComponentElementEvaluator.java @@ -0,0 +1,108 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import java.util.Map; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + *

+ * + *

+ * Returns true if we are inside a site AND that site's id matches the regexp from the {@code } parameter. + *

+ * + *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ *

+ * Note! the default value of the {@code } parameter is ".*" which will make it match all site's ids. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ * }
+ * + *

+ * Will return tru if we are in a site, no matter what the id of the site is. + *

+ * + *

+ * Example 2: + *

+ * + *
{@code
+ * 
+ *    
+ *       marketing|engineering
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a site with an id of "marketing" or "engineering". + *

+ * + * @author ewinlof + */ +public class SlingshotSiteComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + // Evaluator parameters + public static final String SITE_FILTER = "sites"; + + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Decides if we are inside a site or not. + * + * @param context RequestContext + * @param params Map + * @return true if we are in a site and its id matches the {@code } param (defaults to ".*") + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + String siteId = util.getSite(context); + + // If we are in a site use site filters + if (siteId != null && siteId.matches(util.getEvaluatorParam(params, SITE_FILTER, ".*"))) + { + return true; + } + + // The site didn't match the site filter + return false; + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotSiteModuleEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotSiteModuleEvaluator.java new file mode 100644 index 0000000000..4c93d6bda4 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotSiteModuleEvaluator.java @@ -0,0 +1,214 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.ExtensionModuleEvaluator; + +import java.util.List; +import java.util.Map; + + +/** + *

+ * Evaluator used to decide if an extension module (and its {@code } & {@code }) shall be + * used for this request. + *

+ * + *

+ * Makes it possible to decide if we are viewed specific sites based on their ids and sitePreset ids by matching them + * against the regexps inside the {@code } and {@code } parameters and the comma separated groups list + * in the {@code } parameter. The {@code } parameter decides if the groups list shall be + * matched using "and" or "or", allowed values are: AND and OR. + *

+ * + *

+ * Note! If we are outside a side (i.e. a "global/non-site-page" page: i.e. the "Repository browser", A users dashboard or the + * "My Workflows" page the evaluator will return true by default. To change this behaviour you can set + * {@code } to false, which means the evaluator will return true ONLY when inside a site. + * Note that the {@code } parameter still applies even + *

+ *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ *    
+ *       rm-site-dashboard
+ *       false
+ *     
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a site with a sitePreset id of "rm-site-dashboard". + *

+ * + *

+ * Example 2: + *

+ * + *
{@code
+ * 
+ *    
+ *       rm|photos
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if we are inside a site with a site id of "rm" or "photos" OR if we are on a global page. + *

+ * + * + *

+ * Example 3: + *

+ * + *
{@code
+ * 
+ *    
+ *       .*
+ *       false
+ *       SiteManager,SiteCollaborator
+ *       OR
+ *    
+ * 
+ * }
+ * + *

+ * Will return true as long as we are in a site and the user is a SiteManager or SiteCollaborator. + *

+ * + * @author ewinlof + */ +public class SlingshotSiteModuleEvaluator implements ExtensionModuleEvaluator +{ + private static Log logger = LogFactory.getLog(SlingshotSiteModuleEvaluator.class); + + /* Evaluator parameters */ + public static final String SITE_PRESET_FILTER = "sitePresets"; + public static final String SITE_FILTER = "sites"; + public static final String APPLY_FOR_NON_SITES = "applyForNonSites"; + public static final String GROUPS = "groups"; + public static final String GROUPS_RELATION = "groupsRelation"; + public static final String GROUPS_RELATION_AND = "AND"; + + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + public String[] getRequiredProperties() + { + String[] properties = new String[2]; + properties[0] = SITE_PRESET_FILTER; + properties[1] = SITE_FILTER; + return properties; + } + + /** + * Will return true if we are outside a site OR inside a site with a sitePreset id of "rm-site-dashboard". + * + * @param context RequestContext + * @param params Map + * @return true if we are outside a site OR inside a site with a sitePreset id of "rm-site-dashboard". + */ + public boolean applyModule(RequestContext context, Map params) + { + String siteId = util.getSite(context); + + // If we are in a site use site filters + if (siteId != null) + { + // Test site filter + if (!siteId.matches(util.getEvaluatorParam(params, SITE_FILTER, ".*"))) + { + return false; + } + + // Test silePresets filter + String sitePreset = util.getSitePreset(context, siteId); + if (sitePreset == null || !sitePreset.matches(util.getEvaluatorParam(params, SITE_PRESET_FILTER, ".*"))) + { + return false; + } + + // Test groups filter + if (!isUserInGroups(context, params)) + { + return false; + } + + // SITE PASSED BOTH SITE ID & SITE PRESET & GROUP FILTERS + return true; + } + + // We are not in a site, test if we shall apply the module anyway + if (!util.getEvaluatorParam(params, APPLY_FOR_NON_SITES, "true").equals("true")) + { + return false; + } + + // Test groups filter + if (!isUserInGroups(context, params)) + { + return false; + } + + return true; + } + + /** + * Checks to see whether or not the current user satisfies the group membership requirements + * specified. + * + * @param context RequestContext + * @param params Map + * @return true if groups param is empty or user is a member of the specified groups (honouring the groupsRelation parameter) + + */ + protected boolean isUserInGroups(RequestContext context, Map params) + { + String groupsParam = util.getEvaluatorParam(params, GROUPS, ".*"); + if (groupsParam.equals(".*")) + { + // Any group is fine, no need to test + return true; + } + + String relationParam = params.get(GROUPS_RELATION); + boolean memberOfAllGroups = (relationParam != null && relationParam.trim().equalsIgnoreCase(GROUPS_RELATION_AND)); + List groups = util.getGroups(groupsParam); + return util.isMemberOfGroups(context, groups, memberOfAllGroups); + } + +} diff --git a/share/src/main/java/org/alfresco/web/extensibility/SlingshotUserAgentComponentElementEvaluator.java b/share/src/main/java/org/alfresco/web/extensibility/SlingshotUserAgentComponentElementEvaluator.java new file mode 100644 index 0000000000..12d3a70960 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/extensibility/SlingshotUserAgentComponentElementEvaluator.java @@ -0,0 +1,109 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.extensibility; + +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.extensibility.impl.DefaultSubComponentEvaluator; + +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + *

+ * Evaluator used to decide if a {@code } shall be bound in to a {@code } and {@code <@region>}. + *

+ * + *

+ * Returns true if the current User Agent matches the regexp from the {@code } parameter. + *

+ * + *

+ * Note! The regexp is expressed without using the surrounding // characters. + *

+ *

+ * Note! the default value of the {@code } parameter is ".*" which will make it match all User Agents. + *

+ * + *

+ * Example: + *

+ * + *
{@code
+ * 
+ * }
+ * + *

+ * Will return true, no matter what User Agent is being used. + *

+ * + *

+ * Example 2: + *

+ * + *
{@code
+ * 
+ *    
+ *       MSIE\s([^;]*)
+ *    
+ * 
+ * }
+ * + *

+ * Will return true if the current User Agent matches Internet Explorer + *

+ * + * @author mikeh + */ +public class SlingshotUserAgentComponentElementEvaluator extends DefaultSubComponentEvaluator +{ + // Evaluator parameters + public static final String USERAGENT_FILTER = "useragent"; + + protected SlingshotEvaluatorUtil util = null; + + public void setSlingshotEvaluatorUtil(SlingshotEvaluatorUtil slingshotExtensibilityUtil) + { + this.util = slingshotExtensibilityUtil; + } + + /** + * Decides if the requesting User Agent matches a given expression. + * + * @param context RequestContext + * @param params Map + * @return true if the requesting User Agent matches the {@code } param (defaults to ".*") + */ + @Override + public boolean evaluate(RequestContext context, Map params) + { + String userAgent = util.getHeader("user-agent"); + if (userAgent != null) + { + Pattern p = Pattern.compile(util.getEvaluatorParam(params, USERAGENT_FILTER, ".*")); + Matcher m = p.matcher(userAgent); + return m.find(); + } + + // No match + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/portlet/LazyDashboardFilter.java b/share/src/main/java/org/alfresco/web/portlet/LazyDashboardFilter.java new file mode 100644 index 0000000000..df570ab858 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/portlet/LazyDashboardFilter.java @@ -0,0 +1,131 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.portlet; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.context.ApplicationContext; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.RequestContextUtil; +import org.springframework.extensions.surf.WebFrameworkServiceRegistry; +import org.springframework.extensions.surf.exception.RequestContextException; +import org.springframework.extensions.surf.util.URLDecoder; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * Performs lazy creation of dashboard pages when they are requested without requiring redirects, thus making them + * addressable from a portlet. + * + * @author dward + */ +public class LazyDashboardFilter implements Filter +{ + private static final Pattern PATTERN_DASHBOARD_PATH = Pattern.compile("/user/([^/]*)/dashboard"); + + private ServletContext servletContext; + + /* + * (non-Javadoc) + * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, + * javax.servlet.FilterChain) + */ + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + ServletException + { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + + // If this is a request for the current user's dashboard page, create it if it doesn't exist + String pathInfo = httpServletRequest.getPathInfo(); + Matcher matcher; + if (pathInfo != null && (matcher = PATTERN_DASHBOARD_PATH.matcher(pathInfo)).matches()) + { + // Get hold of the context + RequestContext context; + try + { + context = RequestContextUtil.initRequestContext(getApplicationContext(),(HttpServletRequest)request); + } + catch (RequestContextException e) + { + throw new ServletException(e); + } + + String userid = context.getUserId(); + + // test user dashboard page exists? + if (userid != null && userid.equals(URLDecoder.decode(matcher.group(1)))) + { + WebFrameworkServiceRegistry serviceRegistry = context.getServiceRegistry(); + + if (serviceRegistry.getModelObjectService().getPage("user/" + userid + "/dashboard") == null) + { + // no site found! create initial dashboard for this user... + Map tokens = new HashMap(); + tokens.put("userid", userid); + serviceRegistry.getPresetsManager().constructPreset("user-dashboard", tokens); + } + } + } + + chain.doFilter(request, response); + } + + /* + * (non-Javadoc) + * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) + */ + public void init(FilterConfig config) throws ServletException + { + // get reference to our ServletContext + this.servletContext = config.getServletContext(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.Filter#destroy() + */ + public void destroy() + { + } + + /** + * Retrieves the root application context + * + * @return application context + */ + private ApplicationContext getApplicationContext() + { + return WebApplicationContextUtils.getWebApplicationContext(servletContext); + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/resolver/doclib/DefaultDoclistActionGroupResolver.java b/share/src/main/java/org/alfresco/web/resolver/doclib/DefaultDoclistActionGroupResolver.java new file mode 100644 index 0000000000..37d804b038 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/resolver/doclib/DefaultDoclistActionGroupResolver.java @@ -0,0 +1,67 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.resolver.doclib; + +import org.json.simple.JSONObject; + +/** + * Resolves which action group if to use in the document library's document list. + * + * @author ewinlof + */ +public class DefaultDoclistActionGroupResolver implements DoclistActionGroupResolver +{ + /** + * Will return the action group id matching action group configs in a, i.e. share-config-custom.xml file. + * + * @param jsonObject An item (i.e. document or folder) in the doclist. + * @param view Name of the type of view in which the action will be displayed. I.e. "details" + * @return The action group id to use for displaying actions + */ + public String resolve(JSONObject jsonObject, String view) + { + String actionGroupId; + JSONObject node = (JSONObject) jsonObject.get("node"); + boolean isContainer = (Boolean) node.get("isContainer"); + if (isContainer) + { + actionGroupId = "folder-"; + } + else + { + actionGroupId = "document-"; + } + boolean isLink = (Boolean) node.get("isLink"); + if (isLink) + { + actionGroupId += "link-" ; + } + if (view.equals("details")) + { + actionGroupId += "details"; + } + else + { + actionGroupId += "browse"; + } + return actionGroupId; + } +} diff --git a/share/src/main/java/org/alfresco/web/resolver/doclib/DefaultDoclistDataUrlResolver.java b/share/src/main/java/org/alfresco/web/resolver/doclib/DefaultDoclistDataUrlResolver.java new file mode 100644 index 0000000000..8a016ffb30 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/resolver/doclib/DefaultDoclistDataUrlResolver.java @@ -0,0 +1,91 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.resolver.doclib; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.extensions.surf.util.URLEncoder; + +/** + * Resolves which data url if to use when asking the repository for nodes in the document library's document list. + * + * @author ewinlof + */ +public class DefaultDoclistDataUrlResolver implements DoclistDataUrlResolver +{ + /** + * The base path to the repository doclist webscript. + */ + public String basePath = null; + + /** + * The base path to the repository doclist webscript. + * + * @param basePath String + */ + public void setBasePath(String basePath) + { + this.basePath = basePath; + } + + /** + * Returns the url to the repository doclist webscript to use. + * + * @param webscript The repository doclib2 webscript tp use, i.e. doclist or node + * @param params doclib2 webscript specific parameters + * @param args url parameters, i.e. pagination parameters + * @return The url to use when asking the repository doclist webscript. + */ + public String resolve(String webscript, String params, HashMap args) + { + return basePath + "/" + webscript + "/" + URLEncoder.encodeUri(params) + getArgsAsParameters(args); + } + + /** + * Helper method that creates a url parameter string from a hash map. + * + * @param args The arguments that will be transformed to a string + * @return A url parameter string + */ + public String getArgsAsParameters(HashMap args) + { + String urlParameters = ""; + // Need to reconstruct and encode original args + if (args.size() > 0) + { + StringBuilder argsBuf = new StringBuilder(128); + argsBuf.append('?'); + for (Map.Entry arg: args.entrySet()) + { + if (argsBuf.length() > 1) + { + argsBuf.append('&'); + } + argsBuf.append(arg.getKey()) + .append('=') + .append(URLEncoder.encodeUriComponent(arg.getValue().replaceAll("%25","%2525"))); + } + urlParameters = argsBuf.toString(); + } + return urlParameters; + } +} diff --git a/share/src/main/java/org/alfresco/web/resolver/doclib/DoclistActionGroupResolver.java b/share/src/main/java/org/alfresco/web/resolver/doclib/DoclistActionGroupResolver.java new file mode 100644 index 0000000000..46b0a11a5e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/resolver/doclib/DoclistActionGroupResolver.java @@ -0,0 +1,40 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.resolver.doclib; + +import org.json.simple.JSONObject; + +/** + * Resolves which action group if to use in the document library's document list. + * + * @author ewinlof + */ +public interface DoclistActionGroupResolver +{ + /** + * Will return the action group id matching action group configs in a, i.e. share-config-custom.xml file. + * + * @param jsonObject An item (i.e. document or folder) in the doclist. + * @param view Name of the type of view in which the action will be displayed. I.e. "details" + * @return The action group id to use for displaying actions + */ + public String resolve(JSONObject jsonObject, String view); +} diff --git a/share/src/main/java/org/alfresco/web/resolver/doclib/DoclistDataUrlResolver.java b/share/src/main/java/org/alfresco/web/resolver/doclib/DoclistDataUrlResolver.java new file mode 100644 index 0000000000..a43ae0f28d --- /dev/null +++ b/share/src/main/java/org/alfresco/web/resolver/doclib/DoclistDataUrlResolver.java @@ -0,0 +1,41 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.resolver.doclib; + +import java.util.HashMap; + +/** + * Resolves which data url if to use when asking the repository for nodes in the document library's document list. + * + * @author ewinlof + */ +public interface DoclistDataUrlResolver +{ + /** + * Returns the url to the repository doclist webscript to use. + * + * @param webscript The repository doclib2 webscript tp use, i.e. doclist or node + * @param params doclib2 webscript specific parameters + * @param args url parameters, i.e. pagination parameters + * @return The url to use when asking the repository doclist webscript. + */ + public String resolve(String webscript, String params, HashMap args); +} diff --git a/share/src/main/java/org/alfresco/web/resources/ShareRemoteResourcesHandler.java b/share/src/main/java/org/alfresco/web/resources/ShareRemoteResourcesHandler.java new file mode 100644 index 0000000000..4bb80e036c --- /dev/null +++ b/share/src/main/java/org/alfresco/web/resources/ShareRemoteResourcesHandler.java @@ -0,0 +1,72 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.resources; + +import org.springframework.extensions.surf.RemoteResourcesHandler; + +/** + *

This class extends the default Surf {@link RemoteResourcesHandler} to process the supplied path. + * It has been provided primarily to provide support for AMD requests. It converts the AMD path + * to a location in the Data Dictionary.

+ */ +public class ShareRemoteResourcesHandler extends RemoteResourcesHandler +{ + /** + * This represents the prefix where the AMD resources will be stored. We need + * to add this as a prefix to each resource request to ensure that look within the + * Data Dictionary. This assumes that the Repository's ShareResources WebScript controller + * is configured to use "Company Home" as a root (which it is by default). + */ + private String repositoryPrefix; + + public String getRepositoryPrefix() + { + return repositoryPrefix; + } + + public void setRepositoryPrefix(String repositoryPrefix) + { + this.repositoryPrefix = repositoryPrefix; + } + + /** + * This represents the filter that MUST be on the path in order for the request to + * have reached this handler (this is the default Spring configured filter - if its + * changed then this will need to be updated) + * + * TODO: Can we get this value from the Surf or Share configuration? + * It should be possible to look up the "alfresco" package in the Surf configuration + */ + public static final String FILTER = "js/alfresco/"; + + public static final int FILTER_LENGTH = FILTER.length(); + + @Override + protected String processPath(String path) + { + StringBuilder processedPath = new StringBuilder(this.getRepositoryPrefix()); + if (path.startsWith(FILTER)) + { + processedPath.append(path.substring(FILTER_LENGTH)); + } + return processedPath.toString(); + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/ActionEvaluatorHelper.java b/share/src/main/java/org/alfresco/web/scripts/ActionEvaluatorHelper.java new file mode 100644 index 0000000000..c9c3befb74 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/ActionEvaluatorHelper.java @@ -0,0 +1,78 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.alfresco.web.evaluator.Evaluator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.webscripts.processor.BaseProcessorExtension; + +/** + * @author mikeh + */ +public class ActionEvaluatorHelper extends BaseProcessorExtension implements ApplicationContextAware +{ + private static Log logger = LogFactory.getLog(ActionEvaluatorHelper.class); + + protected ApplicationContext applicationContext = null; + + /* + * Set ApplicationContext + * + * @param applicationContext + */ + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.applicationContext = applicationContext; + } + + /* + * Returns an evaluator given it's bean reference + * + * @param evaluatorName Bean reference of evaluator + * @return Evaluator + */ + public Evaluator getEvaluator(String evaluatorName) + { + try + { + Evaluator evaluator = (Evaluator) applicationContext.getBean(evaluatorName); + if (evaluator instanceof Evaluator == false) + { + logger.warn("Bean with id '" + evaluatorName + "' does not implement Evaluator interface."); + return null; + } + return evaluator; + } + catch (Exception e) + { + logger.warn("Evaluator '" + evaluatorName + "' not found."); + if (logger.isDebugEnabled()) + { + logger.debug("Exception when trying to get evaluator '" + evaluatorName + "':", e); + } + } + return null; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/AimsStatusWebScript.java b/share/src/main/java/org/alfresco/web/scripts/AimsStatusWebScript.java new file mode 100644 index 0000000000..19a7b2c29f --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/AimsStatusWebScript.java @@ -0,0 +1,59 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.alfresco.web.site.servlet.config.AIMSConfig; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * Java controller to determine if AIMS is enabled or not. + * Used by WebScripts such as users.get, userprofile.get, change-password.get. + */ +public class AimsStatusWebScript extends DeclarativeWebScript implements ApplicationContextAware +{ + private ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.context = applicationContext; + } + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map model = new HashMap(); + + AIMSConfig config = (AIMSConfig) this.context.getBean("aims.config"); + model.put("aimsEnabled", config.isEnabled()); + + return model; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/DictionaryQuery.java b/share/src/main/java/org/alfresco/web/scripts/DictionaryQuery.java new file mode 100644 index 0000000000..872b89c6c9 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/DictionaryQuery.java @@ -0,0 +1,1399 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.util.ParameterCheck; +import org.alfresco.web.scripts.Dictionary.DictionaryAssoc; +import org.alfresco.web.scripts.Dictionary.DictionaryItem; +import org.alfresco.web.scripts.Dictionary.DictionaryProperty; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.extensions.surf.ClusterMessageAware; +import org.springframework.extensions.surf.ClusterService; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.Response; + +/** + * Slingleton scripting host object provided to allows scripts to execute basic + * Alfresco Data Dictionary model queries. + *

+ * Service object that maintains no state other than the dictionary itself. + *

+ * Queries include: isSubType, isAspect, hasProperty, getParentType etc. + * + * @author Kevin Roast + */ +@SuppressWarnings("serial") +public class DictionaryQuery extends SingletonValueProcessorExtension implements Serializable, ClusterMessageAware +{ + private static Log logger = LogFactory.getLog(DictionaryQuery.class); + + + /** + * getAspects - return Array of all aspects in the dictionary. + * + * @return Array of all aspects in the dictionary. + */ + public String[] getAllAspects() + { + return getDictionary().getAllAspects(); + } + + /** + * getTypes - return Array of all types in the dictionary. + * + * @return Array of all types in the dictionary. + */ + public String[] getAllTypes() + { + return getDictionary().getAllTypes(); + } + + /** + * isSubType - return if the supplied type is a sub-type of a given type. + * + * @param type Type to test + * @param isType Is the type a subtype of this type? + * + * @return true if the type is a subtype of isType or the same type + */ + public boolean isSubType(final String type, final String isType) + { + ParameterCheck.mandatoryString("type", type); + ParameterCheck.mandatoryString("isType", isType); + + return type.equals(isType) || getDictionary().isSubType(type, isType); + } + + /** + * getSubTypes - return Array of sub-types for the given class. + * + * @param ddclass DD class to get sub-types for + * + * @return Array of sub-types for the type or aspect, can be empty but never null. + */ + public String[] getSubTypes(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getSubTypes(ddclass); + } + + /** + * hasDefaultAspect - return if the type definition has the default aspect applied.. + * + * @param type Type to test + * @param aspect Aspect to look for in the default aspects + * + * @return true if the aspect is one of the default aspects + */ + public boolean hasDefaultAspect(final String type, final String aspect) + { + ParameterCheck.mandatoryString("type", type); + ParameterCheck.mandatoryString("aspect", aspect); + + return getDictionary().hasDefaultAspect(type, aspect); + } + + /** + * getDefaultAspects - return Array of default aspects for the given type. + * + * @param type Type to inspect + * + * @return Array of default aspects for the type, can be empty but never null. + */ + public String[] getDefaultAspects(final String type) + { + ParameterCheck.mandatoryString("type", type); + + return getDictionary().getDefaultAspects(type); + } + + /** + * isAspect - return if the supplied dd class is an aspect. + * + * @param ddclass DD class to test + * + * @return true if the supplied dd class is an aspect + */ + public boolean isAspect(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return (getDictionary().getAspect(ddclass) != null); + } + + /** + * isType - return if the supplied dd class is a type. + * + * @param ddclass DD class to test + * + * @return true if the supplied dd class is a type + */ + public boolean isType(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return (getDictionary().getType(ddclass) != null); + } + + /** + * hasProperty - return if a type or aspect has the given property definition. + * This method correctly reports properties inherited from base types. + * + * @param ddclass Type or aspect to test + * @param property Property to look for in the type or aspect definition + * + * @return true if the property is defined on the type or aspect + */ + public boolean hasProperty(final String ddclass, final String property) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + ParameterCheck.mandatoryString("property", property); + + return getDictionary().hasProperty(ddclass, property, false); + } + + /** + * hasProperty - return if a type or aspect has the given property definition. + * This method correctly reports properties inherited from base types and also + * optionally checks any default aspects applied to the type for the property. + * + * @param ddclass Type or aspect to test + * @param property Property to look for in the type or aspect definition + * @param includeDefaultAspects If true, check default aspects for the given property. + * + * @return true if the property is defined on the type or aspect or any of its default aspects. + */ + public boolean hasProperty(final String ddclass, final String property, final boolean includeDefaultAspects) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + ParameterCheck.mandatoryString("property", property); + + return getDictionary().hasProperty(ddclass, property, true); + } + + /** + * getTitle - return the title string for the given dd class. + * + * @param ddclass DD class to inspect + * + * @return title string + */ + public String getTitle(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getTitle(ddclass); + } + + /** + * getDescription - return the description string for the given dd class. + * + * @param ddclass DD class to inspect + * + * @return description string + */ + public String getDescription(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getDescription(ddclass); + } + + /** + * getParent - return the parent for the given dd class. + * + * @param ddclass DD class to inspect + * + * @return parent type or null for a root type with no parent. + */ + public String getParent(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getParent(ddclass); + } + + /** + * isContainer - return if the specified type is a container + * + * @param type Type to inspect + * + * @return true if the type is a container, false otherwise + */ + public boolean isContainer(final String type) + { + ParameterCheck.mandatoryString("type", type); + + return getDictionary().isContainer(type); + } + + /** + * getProperty - return a single named property for the given dd class. + * + * @param ddclass DD class to inspect + * @param property Property to look for in the type or aspect definition + * + * @return DictionaryProperty describing the property definition or null if not found + */ + public DictionaryProperty getProperty(final String ddclass, final String property) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + ParameterCheck.mandatoryString("property", property); + + return getDictionary().getProperty(ddclass, property, false); + } + + /** + * getProperty - return a single named property for the given dd class, optionally + * retrieve a property from the default aspects. + * + * @param ddclass DD class to inspect + * @param property Property to look for in the type or aspect definition + * @param includeDefaultAspects If true, check default aspects for the given property. + * + * @return DictionaryProperty describing the property definition or null if not found + */ + public DictionaryProperty getProperty(final String ddclass, final String property, final boolean includeDefaultAspects) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + ParameterCheck.mandatoryString("property", property); + + return getDictionary().getProperty(ddclass, property, true); + } + + /** + * getProperties - return all properties for the given dd class. + * + * @param ddclass DD class to inspect + * + * @return Array of DictionaryProperty objects describing the property definitions for the class. + * Can be empty but never null. + */ + public DictionaryProperty[] getProperties(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getProperties(ddclass, false); + } + + /** + * getProperties - return all properties for the given dd class. + * + * @param ddclass DD class to inspect + * @param includeDefaultAspects If true, also retrieve properties from the default aspects. + * + * @return Array of DictionaryProperty objects describing the property definitions for the class + * and default aspects. Can be empty but never null. + */ + public DictionaryProperty[] getProperties(final String ddclass, final boolean includeDefaultAspects) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getProperties(ddclass, true); + } + + /** + * getAssociations - return the target associations for the given dd class. + * + * @param ddclass DD class to inspect + * + * @return Array of DictionaryAssoc objects describing the target associations for the class. + * Can be empty but never null. + */ + public DictionaryAssoc[] getAssociations(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getAssociations(ddclass); + } + + /** + * getChildAssociations - return the child associations for the given dd class. + * + * @param ddclass DD class to inspect + * + * @return Array of DictionaryAssoc objects describing the child associations for the class. + * Can be empty but never null. + */ + public DictionaryAssoc[] getChildAssociations(final String ddclass) + { + ParameterCheck.mandatoryString("ddclass", ddclass); + + return getDictionary().getChildAssociations(ddclass); + } + + /** + * Add/update a JSON Array of classes to the current Dictionary instance + * + * @param json JSON array of DD classes to add/update + */ + public void updateAddClasses(final String json) + { + ParameterCheck.mandatoryString("json", json); + + getDictionary().updateAddClasses(json); + + // inform cluster of update + if (this.clusterService != null) + { + Map params = new HashMap<>(4); + params.put(DictionaryUpdateMessage.PAYLOAD_ADD, json); + params.put(DictionaryUpdateMessage.PAYLOAD_USERID, ThreadLocalRequestContext.getRequestContext().getUserId()); + this.clusterService.publishClusterMessage(DictionaryUpdateMessage.TYPE, params); + } + } + + /** + * Remove a JSON Array of classes from the current Dictionary instance + * + * @param json JSON array of DD classes to remove + */ + public void updateRemoveClasses(final String json) + { + ParameterCheck.mandatoryString("json", json); + + getDictionary().updateRemoveClasses(json); + + // inform cluster of update + if (this.clusterService != null) + { + Map params = new HashMap<>(4); + params.put(DictionaryUpdateMessage.PAYLOAD_REMOVE, json); + params.put(DictionaryUpdateMessage.PAYLOAD_USERID, ThreadLocalRequestContext.getRequestContext().getUserId()); + this.clusterService.publishClusterMessage(DictionaryUpdateMessage.TYPE, params); + } + } + + @Override + public String toString() + { + try + { + String out = ""; + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final String userId = rc.getUserId(); + if (userId != null && !AuthenticationUtil.isGuest(userId)) + { + int idx = userId.indexOf('@'); + if (idx != -1) + { + out = "Dictionary for user domain: " + userId.substring(idx) + "\r\n"; + } + } + return out + getDictionary().toString(); + } + catch (Throwable e) + { + return super.toString(); + } + } + + /** + * Return the dictionary for the current user context. Takes into account the current user + * tenant domain and will retrieve the data dictionary from the remote Alfresco tier. + * + * @return the dictionary for the current user context + */ + private Dictionary getDictionary() + { + return getSingletonValue(isTenant()); + } + + /** + * @return true for tenant specific Dictionary support, false to share a single Dictionary. + */ + protected boolean isTenant() + { + return true; + } + + @Override + protected Dictionary retrieveValue(final String userId, final String storeId) + throws ConnectorServiceException + { + Dictionary dictionary; + + // initiate a call to retrieve the dictionary from the repository + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco", userId, ServletUtil.getSession()); + final Response response = conn.call("/api/dictionary"); + if (response.getStatus().getCode() == Status.STATUS_OK) + { + logger.info("Successfully retrieved Data Dictionary from Alfresco." + + (storeId.length() != 0 ? (" - for domain: " + storeId) : "")); + + final Map types = new HashMap(128); + final Map aspects = new HashMap(128); + + // TODO: remove url field from response template? waste of space... + + // extract dictionary types and aspects + try + { + JSONArray json = new JSONArray(response.getResponse()); + for (int i=0; i payload) + { + final String userId = (String)payload.get(DictionaryUpdateMessage.PAYLOAD_USERID); + final String jsonAdd = (String)payload.get(DictionaryUpdateMessage.PAYLOAD_ADD); + final String jsonRemove = (String)payload.get(DictionaryUpdateMessage.PAYLOAD_ADD); + + if (jsonAdd != null) + { + if (logger.isDebugEnabled()) + logger.debug("Cluster message to update dictionary with ADD operation: " + jsonAdd); + if (hasSingletonValue(isTenant(), userId)) + { + getSingletonValue(isTenant(), userId).updateAddClasses(jsonAdd); + } + } + if (jsonRemove != null) + { + if (logger.isDebugEnabled()) + logger.debug("Cluster message to update dictionary with REMOVE operation: " + jsonRemove); + if (hasSingletonValue(isTenant(), userId)) + { + getSingletonValue(isTenant(), userId).updateRemoveClasses(jsonRemove); + } + } + } +} + + +/** + * Class representing a Data Dictionary model instance. There will be a DD instance + * for each tenant in Alfresco, for a single tenant instance there will only be one. + *

+ * Handles the internals of various dictionary queries and manipulates the JSON data + * that represents each type, aspect and its properties. The various public methods + * on the DictionaryQuery should stay isolated from the JSON internals. + * + * @author Kevin Roast + */ +class Dictionary +{ + static final String JSON_IS_ASPECT = "isAspect"; + static final String JSON_IS_CONTAINER = "isContainer"; + static final String JSON_DESCRIPTION = "description"; + static final String JSON_TITLE = "title"; + static final String JSON_PROPERTIES = "properties"; + static final String JSON_DEFAULT_ASPECTS = "defaultAspects"; + static final String JSON_NAME = "name"; + static final String JSON_PARENT = "parent"; + static final String JSON_DATATYPE = "dataType"; + static final String JSON_DEFAULTVALUE = "defaultValue"; + static final String JSON_MULTIVALUED = "multiValued"; + static final String JSON_MANDATORY = "mandatory"; + static final String JSON_ENFORCED = "enforced"; + static final String JSON_PROTECTED = "protected"; + static final String JSON_INDEXED = "indexed"; + static final String JSON_ASSOCIATIONS = "associations"; + static final String JSON_CHILDASSOCIATIONS = "childassociations"; + static final String JSON_SOURCE = "source"; + static final String JSON_TARGET = "target"; + static final String JSON_CLASS = "class"; + static final String JSON_ROLE = "role"; + static final String JSON_MANY = "many"; + + private Map types; + private Map aspects; + + /** + * Constructor + * + * @param types Map of short type names to to DictionaryItem objects + * @param aspects Map of short aspect names to to DictionaryItem objects + */ + Dictionary(Map types, Map aspects) + { + this.types = types; + this.aspects = aspects; + } + + public DictionaryItem getType(String type) + { + return this.types.get(type); + } + + public DictionaryItem getAspect(String aspect) + { + return this.aspects.get(aspect); + } + + public DictionaryItem getTypeOrAspect(String ddclass) + { + DictionaryItem item = this.types.get(ddclass); + if (item == null) + { + item = this.aspects.get(ddclass); + } + return item; + } + + public boolean isSubType(String type, String isType) + { + boolean isSubType = false; + try + { + DictionaryItem ddtype = getType(type); + while (!isSubType && ddtype != null) + { + // the parent JSON object will always exist, but may be empty + JSONObject parent = ddtype.data.getJSONObject(JSON_PARENT); + if (parent.has(JSON_NAME)) + { + // found a parent type specified for our type + String parentName = parent.getString(JSON_NAME); + ddtype = this.types.get(parentName); + if (ddtype != null) + { + isSubType = (isType.equals(ddtype.data.getString(JSON_NAME))); + } + } + else + { + // no parent found - end the search + ddtype = null; + } + } + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'isSubType' information for: " + type, jsonErr); + } + return isSubType; + } + + public String[] getSubTypes(String ddclass) + { + try + { + List subTypes = new ArrayList(); + DictionaryItem dditem = getType(ddclass); + if (dditem != null) + { + // TODO: get parent of given ddclass - if that is non-null then can be used as a quick exit for the parent hiearchy search on types + for (String typeName : this.types.keySet()) + { + DictionaryItem ddType = getType(typeName); + String parentType = null; + while (ddType != null) + { + // the parent JSON object will always exist, but name value may be empty + JSONObject parent = ddType.data.getJSONObject(JSON_PARENT); + parentType = parent.optString(JSON_NAME); + if (parentType != null) + { + if (parentType.equals(ddclass)) + { + // found a sub-type - store and exit the loop + subTypes.add(parentType); + ddType = null; + } + else + { + // get the parent type for another loop round + ddType = getType(parentType); + } + } + } + } + } + else + { + dditem = getAspect(ddclass); + if (dditem != null) + { + for (String aspectName : this.aspects.keySet()) + { + DictionaryItem ddAspect = getAspect(aspectName); + String parentAspect = null; + while (ddAspect != null) + { + // the parent JSON object will always exist, but name value may be empty + JSONObject parent = ddAspect.data.getJSONObject(JSON_PARENT); + parentAspect = parent.optString(JSON_NAME); + if (parentAspect != null) + { + if (parentAspect.equals(ddclass)) + { + // found a sub-type - store and exit the loop + subTypes.add(parentAspect); + ddAspect = null; + } + else + { + // get the parent aspect for another loop round + ddAspect = getAspect(parentAspect); + } + } + } + } + } + } + return subTypes.toArray(new String[subTypes.size()]); + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'subtype' information for: " + ddclass, jsonErr); + } + } + + public String[] getAllTypes() + { + return this.types.keySet().toArray(new String[this.types.keySet().size()]); + } + + public String[] getAllAspects() + { + return this.aspects.keySet().toArray(new String[this.aspects.keySet().size()]); + } + + public boolean hasDefaultAspect(String type, String aspect) + { + boolean hasAspect = false; + try + { + DictionaryItem ddtype = getType(type); + if (ddtype != null) + { + JSONObject aspects = ddtype.data.getJSONObject(JSON_DEFAULT_ASPECTS); + Iterator keys = aspects.keys(); + while (!hasAspect && keys.hasNext()) + { + hasAspect = (aspect.equals(keys.next())); + } + } + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'defaultAspects' information for: " + type, jsonErr); + } + return hasAspect; + } + + public String[] getDefaultAspects(String type) + { + String[] defaultAspects = null; + try + { + DictionaryItem ddtype = getType(type); + if (ddtype != null) + { + JSONObject aspects = ddtype.data.getJSONObject(JSON_DEFAULT_ASPECTS); + defaultAspects = new String[aspects.length()]; + int count = 0; + Iterator keys = aspects.keys(); + while (keys.hasNext()) + { + defaultAspects[count++] = keys.next(); + } + } + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'defaultAspects' information for: " + type, jsonErr); + } + return defaultAspects != null ? defaultAspects : new String[0]; + } + + public boolean hasProperty(String ddclass, String property, boolean checkDefaultAspects) + { + boolean hasProperty = false; + try + { + DictionaryItem dditem = getTypeOrAspect(ddclass); + if (dditem != null) + { + JSONObject properties = dditem.data.getJSONObject(JSON_PROPERTIES); + Iterator props = properties.keys(); + while (!hasProperty && props.hasNext()) + { + // test properties and inherited properties + hasProperty = (property.equals(props.next())); + } + if (checkDefaultAspects && !hasProperty) + { + // test each default aspect for the property + JSONObject aspects = dditem.data.getJSONObject(JSON_DEFAULT_ASPECTS); + Iterator keys = aspects.keys(); + while (!hasProperty && keys.hasNext()) + { + // get each aspect defined on the type + DictionaryItem aspect = getAspect(keys.next()); + if (aspect != null) + { + props = aspect.data.getJSONObject(JSON_PROPERTIES).keys(); + while (!hasProperty && props.hasNext()) + { + // test properties on each aspect + hasProperty = (property.equals(props.next())); + } + } + } + } + } + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'properties' information for: " + ddclass, jsonErr); + } + return hasProperty; + } + + public String getTitle(String ddclass) + { + try + { + DictionaryItem dditem = getTypeOrAspect(ddclass); + return dditem != null ? dditem.data.getString(JSON_TITLE) : null; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'title' information for: " + ddclass, jsonErr); + } + } + + public String getDescription(String ddclass) + { + try + { + DictionaryItem dditem = getTypeOrAspect(ddclass); + return dditem != null ? dditem.data.getString(JSON_DESCRIPTION) : null; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'description' information for: " + ddclass, jsonErr); + } + } + + public String getParent(String ddclass) + { + try + { + String parentType = null; + DictionaryItem dditem = getTypeOrAspect(ddclass); + if (dditem != null) + { + // the parent JSON object will always exist, but may be empty + JSONObject parent = dditem.data.getJSONObject(JSON_PARENT); + parentType = parent.optString(JSON_NAME); + } + return parentType; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'parent' information for: " + ddclass, jsonErr); + } + } + + public boolean isContainer(String type) + { + try + { + DictionaryItem ddtype = getType(type); + return ddtype != null ? ddtype.data.getBoolean(JSON_IS_CONTAINER) : false; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'isContainer' information for: " + type, jsonErr); + } + } + + public DictionaryProperty getProperty(String ddclass, String property, boolean checkDefaultAspects) + { + try + { + DictionaryProperty ddprop = null; + DictionaryItem dditem = getTypeOrAspect(ddclass); + if (dditem != null) + { + JSONObject properties = dditem.data.getJSONObject(JSON_PROPERTIES); + if (properties.has(property)) + { + ddprop = new DictionaryProperty(property, properties.getJSONObject(property)); + } + else if (checkDefaultAspects) + { + // test each default aspect for the property + JSONObject aspects = dditem.data.getJSONObject(JSON_DEFAULT_ASPECTS); + Iterator keys = aspects.keys(); + while (ddprop == null && keys.hasNext()) + { + // get each aspect defined on the type + DictionaryItem aspect = getAspect(keys.next()); + if (aspect != null) + { + properties = aspect.data.getJSONObject(JSON_PROPERTIES); + if (properties.has(property)) + { + ddprop = new DictionaryProperty(property, properties.getJSONObject(property)); + } + } + } + } + } + return ddprop; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'properties' information for: " + ddclass, jsonErr); + } + } + + public DictionaryProperty[] getProperties(String ddclass, boolean checkDefaultAspects) + { + try + { + DictionaryProperty[] ddprops = null; + DictionaryItem dditem = getTypeOrAspect(ddclass); + if (dditem != null) + { + JSONObject properties = dditem.data.getJSONObject(JSON_PROPERTIES); + List propList = new ArrayList(properties.length()); + Iterator props = properties.keys(); + while (props.hasNext()) + { + String propName = props.next(); + propList.add(new DictionaryProperty(propName, properties.getJSONObject(propName))); + } + if (checkDefaultAspects) + { + JSONObject aspects = dditem.data.getJSONObject(JSON_DEFAULT_ASPECTS); + Iterator keys = aspects.keys(); + while (keys.hasNext()) + { + // get each aspect defined on the type + DictionaryItem aspect = getAspect(keys.next()); + if (aspect != null) + { + properties = aspect.data.getJSONObject(JSON_PROPERTIES); + props = properties.keys(); + while (props.hasNext()) + { + String propName = props.next(); + propList.add(new DictionaryProperty(propName, properties.getJSONObject(propName))); + } + } + } + } + ddprops = new DictionaryProperty[propList.size()]; + propList.toArray(ddprops); + } + return ddprops != null ? ddprops : new DictionaryProperty[0]; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'properties' information for: " + ddclass, jsonErr); + } + } + + public DictionaryAssoc[] getAssociations(String ddclass) + { + try + { + DictionaryAssoc[] ddassocs = null; + DictionaryItem dditem = getTypeOrAspect(ddclass); + if (dditem != null) + { + JSONObject assocs = dditem.data.getJSONObject(JSON_ASSOCIATIONS); + ddassocs = new DictionaryAssoc[assocs.length()]; + int count = 0; + Iterator assocNames = assocs.keys(); + while (assocNames.hasNext()) + { + String assocName = assocNames.next(); + ddassocs[count++] = new DictionaryAssoc(assocName, assocs.getJSONObject(assocName)); + } + } + return ddassocs != null ? ddassocs : new DictionaryAssoc[0]; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'associations' information for: " + ddclass, jsonErr); + } + } + + public DictionaryAssoc[] getChildAssociations(String ddclass) + { + try + { + DictionaryAssoc[] ddassocs = null; + DictionaryItem dditem = getTypeOrAspect(ddclass); + if (dditem != null) + { + JSONObject assocs = dditem.data.getJSONObject(JSON_CHILDASSOCIATIONS); + ddassocs = new DictionaryAssoc[assocs.length()]; + int count = 0; + Iterator assocNames = assocs.keys(); + while (assocNames.hasNext()) + { + String assocName = assocNames.next(); + ddassocs[count++] = new DictionaryAssoc(assocName, assocs.getJSONObject(assocName)); + } + } + return ddassocs != null ? ddassocs : new DictionaryAssoc[0]; + } + catch (JSONException jsonErr) + { + throw new AlfrescoRuntimeException("Error retrieving 'childassociations' information for: " + ddclass, jsonErr); + } + } + + public void updateAddClasses(String classes) + { + try + { + JSONArray json = new JSONArray(classes); + + // shallow copy types and aspects maps - do not modify the originals as iterators could be running in threads + final Map types = (Map)((HashMap)this.types).clone(); + final Map aspects = (Map)((HashMap)this.aspects).clone(); + for (int i=0; i types = (Map)((HashMap)this.types).clone(); + final Map aspects = (Map)((HashMap)this.aspects).clone(); + for (int i=0; i + * The dd item is backed by the underlying JSON structure from the parent dictionary. + */ + public static class DictionaryItem + { + final private String type; + final private JSONObject data; + + DictionaryItem(String type, JSONObject data) + { + this.type = type; + this.data = data; + } + + @Override + public int hashCode() + { + return this.type.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + return this.type.equals(obj); + } + + @Override + public String toString() + { + return this.type.toString() + "\r\n" + data.toString(); + } + } + + + /** + * Base class representing a single Data Dictionary meta instance. + *

+ * The meta is backed by the underlying JSON structure from the parent dictionary. + */ + private static abstract class DictionaryMetaBase + { + final private JSONObject meta; + final private String name; + + DictionaryMetaBase(String name, JSONObject meta) + { + this.name = name; + this.meta = meta; + } + + public String getName() + { + return this.name; + } + + /** + * Helper to get mandatory string value from the underlying JSON metadata. + * + * @param value name of the value to retrieve + * + * @return the value + */ + protected String getStringValue(String value) + { + try + { + return this.meta.getString(value); + } + catch (JSONException e) + { + throw new AlfrescoRuntimeException("Error retrieving '" + value + "' information for item: " + name, e); + } + } + + /** + * Helper to get optional string value from an object in the underlying JSON metadata. + * + * @param object name of the object containing the value + * @param value name of the value to retrieve + * + * @return the value + */ + protected String getStringValue(String object, String value) + { + try + { + String result = null; + if (this.meta.has(object)) + { + result = this.meta.getJSONObject(object).optString(value); + } + return result; + } + catch (JSONException e) + { + throw new AlfrescoRuntimeException("Error retrieving '" + value + "' information for item: " + name, e); + } + } + + /** + * Helper to get mandatory boolean value from the underlying JSON metadata. + * + * @param value name of the value to retrieve + * + * @return the value + */ + protected boolean getBooleanValue(String value) + { + try + { + return this.meta.getBoolean(value); + } + catch (JSONException e) + { + throw new AlfrescoRuntimeException("Error retrieving '" + value + "' information for item: " + name, e); + } + } + + /** + * Helper to get mandatory boolean value from an object in the underlying JSON metadata. + * + * @param object name of the object containing the value + * @param value name of the value to retrieve + * + * @return the value + */ + protected boolean getBooleanValue(String object, String value) + { + try + { + boolean result = false; + if (this.meta.has(object)) + { + result = this.meta.getJSONObject(object).getBoolean(value); + } + return result; + } + catch (JSONException e) + { + throw new AlfrescoRuntimeException("Error retrieving '" + value + "' information for item: " + name, e); + } + } + + @Override + public String toString() + { + return this.name; + } + } + + + /** + * Simple structure class representing a single Data Dictionary property instance. + *

+ * API is provided to retrieve the various meta-data of the property definition. + */ + public static class DictionaryProperty extends DictionaryMetaBase + { + DictionaryProperty(String name, JSONObject property) + { + super(name, property); + } + + public String getTitle() + { + return getStringValue(Dictionary.JSON_TITLE); + } + + public String getDescription() + { + return getStringValue(Dictionary.JSON_DESCRIPTION); + } + + public String getDataType() + { + return getStringValue(Dictionary.JSON_DATATYPE); + } + + public String getDefaultValue() + { + return getStringValue(Dictionary.JSON_DEFAULTVALUE); + } + + public boolean getIsMultiValued() + { + return getBooleanValue(Dictionary.JSON_MULTIVALUED); + } + + public boolean getIsMandatory() + { + return getBooleanValue(Dictionary.JSON_MANDATORY); + } + + public boolean getIsEnforced() + { + return getBooleanValue(Dictionary.JSON_ENFORCED); + } + + public boolean getIsProtected() + { + return getBooleanValue(Dictionary.JSON_PROTECTED); + } + + public boolean getIsIndexed() + { + return getBooleanValue(Dictionary.JSON_INDEXED); + } + } + + + /** + * Simple structure class representing a single Data Dictionary association instance. + *

+ * API is provided to retrieve the various meta-data of the association definition. + */ + public static class DictionaryAssoc extends DictionaryMetaBase + { + DictionaryAssoc(String name, JSONObject assoc) + { + super(name, assoc); + } + + public String getTitle() + { + return getStringValue(Dictionary.JSON_TITLE); + } + + public String getSourceClass() + { + return getStringValue(Dictionary.JSON_SOURCE, Dictionary.JSON_CLASS); + } + + public String getSourceRole() + { + return getStringValue(Dictionary.JSON_SOURCE, Dictionary.JSON_ROLE); + } + + public boolean getSourceIsMandatory() + { + return getBooleanValue(Dictionary.JSON_SOURCE, Dictionary.JSON_MANDATORY); + } + + public boolean getSourceIsMany() + { + return getBooleanValue(Dictionary.JSON_SOURCE, Dictionary.JSON_MANY); + } + + public String getTargetClass() + { + return getStringValue(Dictionary.JSON_TARGET, Dictionary.JSON_CLASS); + } + + public String getTargetRole() + { + return getStringValue(Dictionary.JSON_TARGET, Dictionary.JSON_ROLE); + } + + public boolean getTargetIsMandatory() + { + return getBooleanValue(Dictionary.JSON_TARGET, Dictionary.JSON_MANDATORY); + } + + public boolean getTargetIsMany() + { + return getBooleanValue(Dictionary.JSON_TARGET, Dictionary.JSON_MANY); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/ImapServerStatus.java b/share/src/main/java/org/alfresco/web/scripts/ImapServerStatus.java new file mode 100644 index 0000000000..d350eabf63 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/ImapServerStatus.java @@ -0,0 +1,81 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.Response; + +/** + * Slingleton scripting host object provided to retrieve the value of the + * IMAP Server enabled status from the Alfresco repository. + * + * @author Kevin Roast + */ +@SuppressWarnings("serial") +public class ImapServerStatus extends SingletonValueProcessorExtension +{ + private static Log logger = LogFactory.getLog(ImapServerStatus.class); + + + /** + * @return the enabled status of the IMAP server + */ + public boolean getEnabled() + { + return getSingletonValue(); + } + + @Override + protected Boolean retrieveValue(String userId, String storeId) throws ConnectorServiceException + { + boolean enabled = false; + + // initiate a call to retrieve the server status from the repository + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco", userId, ServletUtil.getSession()); + final Response response = conn.call("/imap/servstatus"); + if (response.getStatus().getCode() == Status.STATUS_OK) + { + enabled = (response.getText().equals("enabled")); + logger.info("Successfully retrieved IMAP server status from Alfresco: " + response.getText()); + } + else + { + throw new AlfrescoRuntimeException("Unable to retrieve IMAP server status from Alfresco: " + response.getStatus().getCode()); + } + + return enabled; + } + + @Override + protected String getValueName() + { + return "IMAP server status"; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/MessagesWebScript.java b/share/src/main/java/org/alfresco/web/scripts/MessagesWebScript.java new file mode 100644 index 0000000000..ccb4133a30 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/MessagesWebScript.java @@ -0,0 +1,154 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +/* +* There is an Enterprise overlay for this file +*/ + +package org.alfresco.web.scripts; + +import java.io.IOException; +import java.io.Writer; +import java.util.Map; + +import org.alfresco.web.site.EditionInfo; +import org.alfresco.web.site.EditionInterceptor; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.util.I18NUtil; +import org.springframework.extensions.surf.util.StringBuilderWriter; +import org.springframework.extensions.webscripts.WebScriptException; +import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WebScriptResponse; +import org.springframework.extensions.webscripts.json.JSONWriter; + +/** + * WebScript responsible for returning a JavaScript response containing a JavaScript + * associative array of all I18N messages name/key pairs installed on the web-tier. + *

+ * The JavaScript object is created as 'Alfresco.messages' - example usage: + * + * var msg = Alfresco.messages["messageid"]; + * + * + * @author Kevin Roast + */ +public class MessagesWebScript extends org.springframework.extensions.webscripts.MessagesWebScript +{ + /** + * Generate the message for a given locale. + * + * @param locale Java locale format + * + * @return messages as JSON string + * + * @throws IOException + */ + @Override + protected String generateMessages(WebScriptRequest req, WebScriptResponse res, String locale) throws IOException + { + Writer writer = new StringBuilderWriter(8192); + writer.write("if (typeof Alfresco == \"undefined\" || !Alfresco) {var Alfresco = {};}\r\n"); + writer.write("Alfresco.messages = Alfresco.messages || {global: null, scope: {}}\r\n"); + writer.write("Alfresco.messages.global = "); + JSONWriter out = new JSONWriter(writer); + try + { + out.startObject(); + Map messages = I18NUtil.getAllMessages(I18NUtil.parseLocale(locale)); + for (Map.Entry entry : messages.entrySet()) + { + out.writeValue(entry.getKey(), entry.getValue()); + } + out.endObject(); + } + catch (IOException jsonErr) + { + throw new WebScriptException("Error building messages response.", jsonErr); + } + writer.write(";\r\n"); + + if (isCommunity()) + { + // community logo + final String serverPath = req.getServerPath(); + final int schemaIndex = serverPath.indexOf(':'); + writer.write("window.setTimeout(function(){(document.getElementById('alfresco-yuiloader')||document.createElement('div')).innerHTML = '\"*\"\'}, 100);\r\n"); + } + return writer.toString(); + } + + @Override + protected String getMessagesPrefix(WebScriptRequest req, WebScriptResponse res, String locale) throws IOException + { + return "if (typeof Alfresco == \"undefined\" || !Alfresco) {var Alfresco = {};}\r\nAlfresco.messages = Alfresco.messages || {global: null, scope: {}}\r\nAlfresco.messages.global = "; + } + + @Override + protected String getMessagesSuffix(WebScriptRequest req, WebScriptResponse res, String locale) throws IOException + { + StringBuilder sb = new StringBuilder(512); + sb.append(";\r\n"); + + if (isCommunity()) + { + // community logo + final String serverPath = req.getServerPath(); + final int schemaIndex = serverPath.indexOf(':'); + sb.append("window.setTimeout(function(){(document.getElementById('alfresco-yuiloader')||document.createElement('div')).innerHTML = '\"*\"\'}, 100);\r\n"); + } + return sb.toString(); + } + + protected boolean isLicensed() + { + boolean licensed = false; + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + if (rc != null) + { + final String edition = ((EditionInfo)rc.getValue(EditionInterceptor.EDITION_INFO)).getEdition(); + licensed = (EditionInterceptor.ENTERPRISE_EDITION.equals(edition)); + } + return licensed; + } + + /** + * Verifies if the licence edition is community + * @return true if the edition was successfuly retrieved and is UNKNOWN_EDITION , false otherwise + */ + private boolean isCommunity() + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + if (rc != null) + { + EditionInfo editionInfo = ((EditionInfo)rc.getValue(EditionInterceptor.EDITION_INFO)); + if (editionInfo.getValidResponse()) + { + return EditionInterceptor.UNKNOWN_EDITION.equals(editionInfo.getEdition()); + } + //else, could not retrieve licence info from server + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/MimetypesQuery.java b/share/src/main/java/org/alfresco/web/scripts/MimetypesQuery.java new file mode 100644 index 0000000000..be264b25c3 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/MimetypesQuery.java @@ -0,0 +1,250 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.Response; + +/** + * Singleton templating host object provided to allows templates access to + * the Alfresco Repository Mimetypes information. + *

+ * Service object that maintains no state other than the mimetypes info itself. + * + * @author Nick Burch + */ +@SuppressWarnings("serial") +public class MimetypesQuery extends SingletonValueProcessorExtension> implements Serializable +{ + private static Log logger = LogFactory.getLog(MimetypesQuery.class); + + + /** + * Get all human readable mimetype descriptions, indexed by mimetype + * + * @return the map of displays indexed by mimetype + */ + public Map getDisplaysByMimetype() + { + Map descriptions = new HashMap(); + Map mimetypes = getMimetypes(); + + for (Mimetype mimetype : mimetypes.values()) + { + descriptions.put(mimetype.getMimetype(), mimetype.getDescription()); + } + + return descriptions; + } + + /** + * Gets all the human readable mimetype descriptions, sorted, along + * with their mimetypes. + */ + public Map getMimetypesByDisplay() + { + // Sorted by key, case insensitive + Map types = new TreeMap(new Comparator() { + @Override + public int compare(String o1, String o2) + { + return o1.toLowerCase().compareTo(o2.toLowerCase()); + } + }); + + Map mimetypes = getMimetypes(); + for (Mimetype mimetype : mimetypes.values()) + { + types.put(mimetype.getDescription(), mimetype.getMimetype()); + } + + return types; + } + + /** + * Get the extension for the specified mimetype + * + * @param mimetype a valid mimetype + * @return Returns the default extension for the mimetype, or null if the mimetype is unknown + */ + public String getExtension(String mimetype) + { + Mimetype mt = getMimetypes().get(mimetype); + if (mt != null) + { + return mt.getDefaultExtension(); + } + return null; + } + + @Override + public String toString() + { + try + { + String out = ""; + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final String userId = rc.getUserId(); + if (userId != null && !AuthenticationUtil.isGuest(userId)) + { + int idx = userId.indexOf('@'); + if (idx != -1) + { + out = "Mimetypes for user domain: " + userId.substring(idx) + "\r\n"; + } + } + return out + getMimetypes().toString(); + } + catch (Throwable e) + { + return super.toString(); + } + } + + /** + * Return the Mimetypes Details, retrieving as needed from the remote Alfresco tier. + */ + private Map getMimetypes() + { + return getSingletonValue(); + } + + @Override + protected Map retrieveValue(final String userId, final String storeId) throws ConnectorServiceException + { + Map mimetypes; + + // initiate a call to retrieve the dictionary from the repository + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco", userId, ServletUtil.getSession()); + final Response response = conn.call("/api/mimetypes/descriptions"); + if (response.getStatus().getCode() == Status.STATUS_OK) + { + logger.info("Successfully retrieved mimetypes information from Alfresco."); + + mimetypes = new HashMap(128); + + try + { + // Extract mimetype information + final JSONObject json = new JSONObject(response.getResponse()); + final JSONObject data = json.getJSONObject("data"); + + Iterator types = data.keys(); + while (types.hasNext()) + { + // The type is the key + String mimetype = types.next(); + + // The details come from the value + Mimetype details = new Mimetype(mimetype, data.getJSONObject(mimetype)); + + mimetypes.put(mimetype, details); + } + } + catch (JSONException e) + { + throw new AlfrescoRuntimeException(e.getMessage(), e); + } + } + else + { + throw new AlfrescoRuntimeException("Unable to retrieve mimetypes information from Alfresco: " + response.getStatus().getCode()); + } + + return mimetypes; + } + + @Override + protected String getValueName() + { + return "mimetypes information"; + } +} + + +/** + * Holds the information returned on a mimetype, from the repository mimetypes information webscript + */ +class Mimetype +{ + private final String mimetype; + private final String description; + private final String defaultExtension; + private final List additionalExtensions; + + Mimetype(String mimetype, JSONObject json) throws JSONException + { + this.mimetype = mimetype; + this.description = json.getString("description"); + + JSONObject ext = json.getJSONObject("extensions"); + defaultExtension = ext.getString("default"); + + JSONArray additional = ext.getJSONArray("additional"); + additionalExtensions = new ArrayList(additional.length()); + for (int i=0; i getAdditionalExtensions() + { + return additionalExtensions; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/scripts/ModulePackageWebScript.java b/share/src/main/java/org/alfresco/web/scripts/ModulePackageWebScript.java new file mode 100644 index 0000000000..8ecf3701d5 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/ModulePackageWebScript.java @@ -0,0 +1,75 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.alfresco.web.config.packaging.ModulePackage; +import org.alfresco.web.config.packaging.ModulePackageHelper; +import org.alfresco.web.config.packaging.ModulePackageManager; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Gets a list of ModulePackages as JSON. + * @author Gethin James + */ +public class ModulePackageWebScript extends DeclarativeWebScript +{ + private static Log logger = LogFactory.getLog(ModulePackageWebScript.class); + private ModulePackageManager moduleManager; + + protected Map executeImpl( + WebScriptRequest req, Status status, Cache cache) { + + Map model = new HashMap(); + model.put("modulepackages", asMap(moduleManager.getModulePackages())); + return model; + + } + + private List asMap(List mp) + { + List modulesPacks = new ArrayList<>(); + + if (mp!= null && !mp.isEmpty()) + { + for (ModulePackage modulePackage : mp) + { + modulesPacks.add(ModulePackageHelper.toMap(modulePackage)); + } + } + return modulesPacks; + } + + public void setModuleManager(ModulePackageManager moduleManager) + { + this.moduleManager = moduleManager; + } + +} diff --git a/share/src/main/java/org/alfresco/web/scripts/MultiValueEscapeHelper.java b/share/src/main/java/org/alfresco/web/scripts/MultiValueEscapeHelper.java new file mode 100644 index 0000000000..b4c1f31c0e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/MultiValueEscapeHelper.java @@ -0,0 +1,81 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.extensions.webscripts.processor.BaseProcessorExtension; + +/** + * Template helper for splitting and unescaping multi-value fields. + * @author Frederik Heremans + */ +public class MultiValueEscapeHelper extends BaseProcessorExtension +{ + /** + * Returns the individual values of a multi-valued property, which has been properly + * escaped by the {@link org.alfresco.repo.forms.processor.workflow.ExtendedFieldBuilder}. + * + * @param escapedString the string containing the escaped, comma-seperated values. + * @return the values split up and unescaped. + */ + public List getUnescapedValues(String escapedString) + { + List elements = new ArrayList(); + StringBuffer currentElement = new StringBuffer(); + + char currentChar; + boolean isEscaped = false; + for(int i = 0; i < escapedString.length(); i++) + { + currentChar = escapedString.charAt(i); + + if(isEscaped) + { + isEscaped = false; + currentElement.append(currentChar); + } + else if(currentChar == '\\') + { + // Escape character encountered + isEscaped = true; + } + else if(currentChar == ',') + { + // New element encounterd + elements.add(currentElement.toString()); + currentElement.delete(0, currentElement.length()); + } + else + { + // Plain character, push to current value + currentElement.append(currentChar); + } + } + + if(currentElement.length() > 0) + { + elements.add(currentElement.toString()); + } + return elements; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/QuickShareStatus.java b/share/src/main/java/org/alfresco/web/scripts/QuickShareStatus.java new file mode 100644 index 0000000000..e22794f7a9 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/QuickShareStatus.java @@ -0,0 +1,97 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.io.Serializable; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.Response; + +/** + * Singleton scripting host object provided to retrieve the value of the + * Quick Share enabled status configuration from the Alfresco repository. + * + * @author sergey.shcherbovich + */ +@SuppressWarnings("serial") +public class QuickShareStatus extends SingletonValueProcessorExtension implements Serializable +{ + private static Log logger = LogFactory.getLog(QuickShareStatus.class); + + /** + * @return the enabled status of the Quick Share feature + */ + public boolean getEnabled() + { + return getSingletonValue(); + } + + @Override + protected Boolean retrieveValue(final String userId, final String storeId) throws ConnectorServiceException + { + boolean enabled = false; + + // initiate a call to retrieve the dictionary from the repository + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco", userId, ServletUtil.getSession()); + final Response response = conn.call("/quickshare/enabled"); + if (response.getStatus().getCode() == Status.STATUS_OK) + { + logger.info("Successfully retrieved quick share information from Alfresco."); + + try + { + // Extract quick share webscript information + final JSONObject json = new JSONObject(response.getResponse()); + if (json.has("enabled")) + { + enabled = json.getBoolean("enabled"); + } + } + catch (JSONException e) + { + throw new AlfrescoRuntimeException(e.getMessage(), e); + } + } + else + { + throw new AlfrescoRuntimeException("Unable to retrieve quick share information from Alfresco: " + response.getStatus().getCode()); + } + + return enabled; + } + + @Override + protected String getValueName() + { + return "Quick Share enabled"; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/ResolverHelper.java b/share/src/main/java/org/alfresco/web/scripts/ResolverHelper.java new file mode 100644 index 0000000000..0c10e96f76 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/ResolverHelper.java @@ -0,0 +1,106 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.alfresco.web.evaluator.Evaluator; +import org.alfresco.web.resolver.doclib.DoclistActionGroupResolver; +import org.alfresco.web.resolver.doclib.DoclistDataUrlResolver; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.webscripts.processor.BaseProcessorExtension; + +/** + * @author ewinlof + */ +public class ResolverHelper extends BaseProcessorExtension implements ApplicationContextAware +{ + private static Log logger = LogFactory.getLog(ActionEvaluatorHelper.class); + + protected ApplicationContext applicationContext = null; + + /* + * Set ApplicationContext + * + * @param applicationContext + */ + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.applicationContext = applicationContext; + } + + /* + * Returns a DoclistDataUrlResolver bean given it's bean reference + * + * @param resolverName Bean reference of resolver + * @return DoclistDataUrlResolver + */ + public DoclistDataUrlResolver getDoclistDataUrlResolver(String resolverName) + { + try + { + DoclistDataUrlResolver resolver = (DoclistDataUrlResolver) applicationContext.getBean(resolverName); + if (resolver == null) + { + logger.warn("Bean with id '" + resolverName + "' does not implement DoclistDataUrlResolver interface."); + return null; + } + return resolver; + } + catch (Exception e) + { + logger.warn("DoclistDataUrlResolver '" + resolverName + "' not found."); + if (logger.isDebugEnabled()) + { + logger.debug("Exception when trying to get doclistDataUrlResolver '" + resolverName + "':", e); + } + } + return null; + } + + /* + * Returns a DoclistDataUrlResolver bean given it's bean reference + * + * @param resolverName Bean reference of resolver + * @return DoclistActionGroupResolver + */ + public DoclistActionGroupResolver getDoclistActionGroupResolver(String resolverName) + { + try + { + DoclistActionGroupResolver resolver = (DoclistActionGroupResolver) applicationContext.getBean(resolverName); + if (resolver == null) + { + logger.warn("Bean with id '" + resolverName + "' does not implement DoclistActionGroupResolver interface."); + return null; + } + return resolver; + } + catch (Exception e) + { + logger.warn("DoclistActionGroupResolver '" + resolverName + "' not found."); + } + return null; + } + +} diff --git a/share/src/main/java/org/alfresco/web/scripts/RssDashletStatusWebScript.java b/share/src/main/java/org/alfresco/web/scripts/RssDashletStatusWebScript.java new file mode 100644 index 0000000000..b824cd89ad --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/RssDashletStatusWebScript.java @@ -0,0 +1,65 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * Java controller to determine if the RSS dashlet should be enabled (it is disabled by default since MNT-22156). + * Used by the following webscripts: + * org.alfresco.components.dashlets.rssfeed.get + * org.alfresco.components.dashlets.async-rssfeed.get + * org.alfresco.components.dashlets.addons.get + * org.alfresco.components.dashboard.customise-dashlets.get + */ +public class RssDashletStatusWebScript extends DeclarativeWebScript implements ApplicationContextAware +{ + private static final String RSSDASHLET_ENABLED = "rssdashlet.enabled"; + private static final String SHOW_DASHLET = "showDashlet"; + + private ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.context = applicationContext; + } + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map model = new HashMap(); + + boolean rssDashletStatus = Boolean.parseBoolean(System.getProperty(RSSDASHLET_ENABLED)); + model.put(SHOW_DASHLET, rssDashletStatus); + + return model; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/ShareManifest.java b/share/src/main/java/org/alfresco/web/scripts/ShareManifest.java new file mode 100644 index 0000000000..1ae7bc8b84 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/ShareManifest.java @@ -0,0 +1,257 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.io.Resource; +import org.springframework.extensions.webscripts.processor.BaseProcessorExtension; + +/** + * Processor extension that provides access to the specified manifest file. + * + * @author Matt Ward + */ +public class ShareManifest extends BaseProcessorExtension +{ + public static final String MANIFEST_SPECIFICATION_VERSION = "Specification-Version"; + public static final String MANIFEST_IMPLEMENTATION_VERSION = "Implementation-Version"; + public static final String MANIFEST_SPECIFICATION_TITLE = "Specification-Title"; + public static final String MANIFEST_IMPLEMENTATION_TITLE = "Implementation-Title"; + + private final Resource resource; + private Manifest manifest; + + public ShareManifest(Resource resource) + { + if (resource == null) + { + throw new IllegalArgumentException("Manifest 'resource' parameter must not be null."); + } + this.resource = resource; + } + + /** + * Initialise the processor extension. + */ + @Override + public void register() + { + super.register(); + readManifest(); + } + + /** + * Read the manifest file that was specified in the constructor. + */ + public void readManifest() + { + try (InputStream is = resource.getInputStream()) + { + manifest = new Manifest(is); + } + catch (IOException e) + { + throw new RuntimeException("Error reading manifest.", e); + } + } + + /** + * Retrieve attribute value from the main section of a manifest. + * + * @param key The name of the attribute to fetch. + * @return The attribute value. + */ + public String mainAttributeValue(String key) + { + String value = null; + + Attributes attributes = manifest.getMainAttributes(); + if (attributes != null) + { + value = attributes.getValue(key); + } + + return value; + } + + /** + * Retrieve all key/value pairs for the main section of the manifest. + * + * @return Map of attribute name to value. + */ + public Map mainAttributesMap() + { + List names = mainAttributeNames(); + Map map = new HashMap(names.size()); + for (String name : names) + { + String value = mainAttributeValue(name); + map.put(name, value); + } + return map; + } + + /** + * Retrieve a list of attribute names (Strings) for the main + * section of a manifest. + * + * @return The list of attribute names. + */ + public List mainAttributeNames() + { + List names = Collections.emptyList(); + + Attributes attributes = manifest.getMainAttributes(); + if (attributes != null) + { + names = namesToStrings(attributes.keySet()); + } + + return names; + } + + /** + * Retrieve an attribute value by name from the specific named section of a manifest. + * + * @param section Section name. + * @param key Attribute name. + * @return The attribute value. + */ + public String attributeValue(String section, String key) + { + String value = null; + + Attributes attributes = manifest.getAttributes(section); + if (attributes != null) + { + value = attributes.getValue(key); + } + + return value; + } + + /** + * Retrieve all key/value pairs for a particular section in the manifest. + * + * @param section Section name. + * @return Map of attribute name to value. + */ + public Map attributesMap(String section) + { + List names = attributeNames(section); + Map map = new HashMap(names.size()); + for (String name : names) + { + String value = attributeValue(section, name); + map.put(name, value); + } + return map; + } + + /** + * Retrieve a list of attribute names (Strings) for the named section of a manifest. + * + * @param section Section name. + * @return The list of attribute names. + */ + public List attributeNames(String section) + { + List names = Collections.emptyList(); + + Attributes attributes = manifest.getAttributes(section); + if (attributes != null) + { + names = namesToStrings(attributes.keySet()); + } + + return names; + } + + /** + * Retrieve the set of named sections in the manifest. + * + * @return The set of section names. + */ + public Set sectionNames() + { + return manifest.getEntries().keySet(); + } + + protected List namesToStrings(Set names) + { + List strings = new ArrayList(names.size()); + for (Object name : names) + { + if (!String.class.isAssignableFrom(name.getClass()) && + !Attributes.Name.class.isAssignableFrom(name.getClass())) + { + throw new IllegalArgumentException("name parameter must be an Attributes.Name or String, but is " + + name.getClass().getCanonicalName()); + } + strings.add(name.toString()); + } + return strings; + } + + /** + * Returns the version of the war that has been specified + * In general, prefer Specification Version over Implementation Version + * @return String a version number + */ + public String getSpecificationVersion() + { + return getVersion(MANIFEST_SPECIFICATION_VERSION); + } + + /** + * Returns the version of the war that has been implemented + * May be a SNAPSHOT version. + * @return String a version number + */ + public String getImplementationVersion() + { + return getVersion(MANIFEST_IMPLEMENTATION_VERSION); + } + + private String getVersion(String key) + { + String version = manifest.getMainAttributes().getValue(key); + if (StringUtils.isEmpty(version)) + { + throw new AlfrescoRuntimeException("Invalid MANIFEST.MF: Share "+key + +" is missing, are you using the valid MANIFEST.MF supplied with the Share.war?"); + + } + return version; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/SingletonValueProcessorExtension.java b/share/src/main/java/org/alfresco/web/scripts/SingletonValueProcessorExtension.java new file mode 100644 index 0000000000..b9e501f33b --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/SingletonValueProcessorExtension.java @@ -0,0 +1,207 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.processor.BaseProcessorExtension; + +/** + * Helper base class to wrap the thread-safe singleton locking pattern used to retrieve single + * instance values from the repository. Example might be the Data Dictionary (used by all users, + * different per tenant, only retrieved once) or the Sync Mode status (used by all users, + * same per tenant, only retrieved once). + *

+ * The implementing class only needs to provide method to perform the remote retrieval of the + * value and indicate if the value needs to be stored per-tenant or not. + * + * @author Kevin Roast + */ +public abstract class SingletonValueProcessorExtension extends BaseProcessorExtension +{ + /** Map of store ID to value that has been retrieved for it */ + private final Map storeValues = new HashMap(); + + /** Lock for access to store values */ + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + + + /** + * Thread-safe get of the singleton value. + * + * @return singleton value + */ + protected final T getSingletonValue() + { + return getSingletonValue(false); + } + + /** + * Thread-safe get of the singleton value. Can be optionally stored per tenant based on user Id. + * + * @param tenant True to get/store per tenant, false for a single value for all repo instances. + * + * @return singleton value, optionally per tenant. + */ + protected final T getSingletonValue(final boolean tenant) + { + return getSingletonValue(tenant, ThreadLocalRequestContext.getRequestContext().getUserId()); + } + + /** + * Thread-safe get of the singleton value. Can be optionally stored per tenant based on user Id. + * + * @param tenant True to get/store per tenant, false for a single value for all repo instances. + * + * @return singleton value, optionally per tenant. + */ + protected final T getSingletonValue(final boolean tenant, final String userId) + { + T result; + + final String storeId = tenant ? getTenantUserStore(userId) : ""; + + // NOTE: currently there is a single RRW lock for all values - + // in a heavily multi-tenant scenario (especially ones with new tenants + // being created often) the first access of a new tenant dictionary would + // potentially slow other tenant users access to their dictionary. + // In this situation a lock per tenant would be preferable. + this.lock.readLock().lock(); + try + { + result = storeValues.get(storeId); + if (result == null) + { + this.lock.readLock().unlock(); + this.lock.writeLock().lock(); + try + { + // check again, as more than one thread could have been waiting on the Write lock + result = storeValues.get(storeId); + if (result == null) + { + // call the retrieve implementation - probably going to do a remote call or similar + result = retrieveValue(userId, storeId); + + // store result against the current store i.e. tenant + storeValues.put(storeId, result); + } + } + catch (ConnectorServiceException cerr) + { + throw new AlfrescoRuntimeException("Unable to retrieve " + getValueName() + " configuration from Alfresco: " + cerr.getMessage()); + } + catch (Exception err) + { + throw new AlfrescoRuntimeException("Failed during processing of " + getValueName() + " configuration from Alfresco: " + err.getMessage()); + } + finally + { + this.lock.readLock().lock(); + this.lock.writeLock().unlock(); + } + } + } + finally + { + this.lock.readLock().unlock(); + } + + return result; + } + + /** + * Query the existence of a singleton value for the given userId + * + * @param tenant + * @param userId + * + * @return true if singleton value exists, false otherwise + */ + protected final boolean hasSingletonValue(final boolean tenant, final String userId) + { + boolean result = false; + + final String storeId = tenant ? getTenantUserStore(userId) : ""; + this.lock.readLock().lock(); + try + { + result = (storeValues.get(storeId) != null); + } + finally + { + this.lock.readLock().unlock(); + } + + return result; + } + + /** + * Method for implementing class to provide that retrieve the remote value from the appropriate + * endpoint and API. This is generally used to execute a REST API and extract a value from a + * response. The value is then automatically stored by the base class. + * + * @param userId Current user Id + * @param storeId Current store Id if any - may be used if per-tenant values are required + * + * @return value from the remote endpoint + * + * @throws ConnectorServiceException + */ + protected abstract T retrieveValue(String userId, String storeId) throws ConnectorServiceException; + + /** + * Output value name for informational and error messages to the administrator. + * + * @return output value name + */ + protected abstract String getValueName(); + + /** + * Calculate the tenant store for the given user Id. + * + * @param userId User Id to process - must be non-null and cannot be Guest. + * + * @return Tenant store for the user or empty string for the default tenant. + */ + private final String getTenantUserStore(final String userId) + { + if (userId == null || AuthenticationUtil.isGuest(userId)) + { + throw new AlfrescoRuntimeException("User ID must exist and cannot be guest."); + } + String storeId = ""; // default domain + int idx = userId.indexOf('@'); + if (idx != -1) + { + // assume MT so partition by user domain + storeId = userId.substring(idx); + } + return storeId; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/scripts/SlingshotRemoteClient.java b/share/src/main/java/org/alfresco/web/scripts/SlingshotRemoteClient.java new file mode 100644 index 0000000000..3e1b425a02 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/SlingshotRemoteClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.Vector; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.htmlparser.Attribute; +import org.htmlparser.Node; +import org.htmlparser.Parser; +import org.htmlparser.PrototypicalNodeFactory; +import org.htmlparser.tags.DoctypeTag; +import org.htmlparser.util.NodeIterator; +import org.htmlparser.util.ParserException; +import org.springframework.extensions.surf.util.I18NUtil; +import org.springframework.extensions.webscripts.connector.HttpMethod; +import org.springframework.extensions.webscripts.connector.RemoteClient; +import org.springframework.extensions.webscripts.ui.common.StringUtils; + +/** + * Override the Spring WebScripts impl of RemoteClient to provide additional security + * processing of HTML responses retrieved via content APIs. Prevents the execution of + * inline JavaScript proxy driven API calls via XHR requests and similar. + * + * @author Kevin Roast + */ +public class SlingshotRemoteClient extends RemoteClient +{ + private static final Pattern CONTENT_PATTERN_TO_CHECK = Pattern.compile(".*/(api|slingshot)/(node|path)/(content.*/)?workspace/SpacesStore/.+"); + private static final Pattern TRASHCAN_PATTERN_TO_CHECK = Pattern.compile(".*/(api|slingshot)/(node|path)/(content.*/)?archive/SpacesStore/.+"); + private static final Pattern CONTENT_PATTERN_TO_WHITE_LIST = Pattern.compile(".*/api/node/workspace/SpacesStore/[a-z0-9-]+/content/thumbnails/webpreview"); + private static final Pattern SLINGSHOT_WIKI_PAGE_PATTERN = Pattern.compile(".*/slingshot/wiki/page/.*"); + private static final Pattern SLINGSHOT_WIKI_VERSION_PATTERN = Pattern.compile(".*/slingshot/wiki/version/.*"); + + private boolean swfEnabled = false; + + public void setSwfEnabled(boolean swfEnabled) + { + this.swfEnabled = swfEnabled; + } + + @Override + protected void copyResponseStreamOutput(URL url, HttpServletResponse res, OutputStream out, + HttpResponse response, String contentType, int bufferSize) throws IOException + { + boolean processed = false; + if (res != null && getRequestMethod() == HttpMethod.GET && + response.getStatusLine().getStatusCode() >= 200 && + response.getStatusLine().getStatusCode() < 300) + { + // only match if content is not an attachment - don't interfere with downloading of file content + Header cd = response.getFirstHeader("Content-Disposition"); + if (cd == null || !cd.getValue().startsWith("attachment")) + { + // only match appropriate content REST URIs + if (contentType != null && (CONTENT_PATTERN_TO_CHECK.matcher(url.getPath()).matches() + && !CONTENT_PATTERN_TO_WHITE_LIST.matcher(url.getPath()).matches() + || SLINGSHOT_WIKI_PAGE_PATTERN.matcher(url.getPath()).matches() + || SLINGSHOT_WIKI_VERSION_PATTERN.matcher(url.getPath()).matches()) + || TRASHCAN_PATTERN_TO_CHECK.matcher(url.getPath()).matches()) + { + // found a GET request that might be a security risk + String mimetype = contentType; + String encoding = null; + int csi = contentType.indexOf(CHARSETEQUALS); + if (csi != -1) + { + mimetype = contentType.substring(0, csi - 1).toLowerCase(); + encoding = contentType.substring(csi + CHARSETEQUALS.length()); + } + + // examine the mimetype to see if additional processing is required + // MNT-18730 - specifically omit UTF-16 XML content + if (mimetype.contains("text/html") || mimetype.contains("application/xhtml+xml") || (mimetype.contains("text/xml") && !encoding.contains("UTF-16"))) + { + // found HTML content we need to process in-memory and perform stripping on + ByteArrayOutputStream bos = new ByteArrayOutputStream(bufferSize); + final InputStream input; + if (response.getEntity() != null && (input = response.getEntity().getContent()) != null) + { + // get data into our byte buffer for processing + try + { + final byte[] buffer = new byte[bufferSize]; + int read = input.read(buffer); + while (read != -1) + { + // halt on binary file - we assume this is HTML - it might not be - effectively a DNS attack + for (int i=0; i attrs = docTypeTag.getAttributesEx(); + if (attrs != null && attrs.size() > 1) + { + for (Attribute attr : attrs) + { + String name = attr.getName(); + if (name != null && name.equalsIgnoreCase(docType)) + { + return true; + } + } + } + } + } + } + catch (ParserException e) + { + // Not a valid xml document, return false below + } + return false; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/StripLinkedNodePropertiesOption.java b/share/src/main/java/org/alfresco/web/scripts/StripLinkedNodePropertiesOption.java new file mode 100644 index 0000000000..a5be89f3b0 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/StripLinkedNodePropertiesOption.java @@ -0,0 +1,49 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * Java controller to determine if stripping of linked node properties is enabled. + * See MNT-18497. + * Used by WebScripts such as surf-doclist.get. + */ +public class StripLinkedNodePropertiesOption extends DeclarativeWebScript +{ + private static final String STRIP_LINKED_NODE_PROPS = "strip.linked-node.properties"; + + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map model = new HashMap(); + boolean stripLinkedNodeProperties = Boolean.parseBoolean(System.getProperty(STRIP_LINKED_NODE_PROPS)); + model.put("stripLinkedNodeProperties", stripLinkedNodeProperties); + + return model; + } +} diff --git a/share/src/main/java/org/alfresco/web/scripts/UnitTestGetModelWebScript.java b/share/src/main/java/org/alfresco/web/scripts/UnitTestGetModelWebScript.java new file mode 100644 index 0000000000..dda2b87520 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/UnitTestGetModelWebScript.java @@ -0,0 +1,57 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.springframework.extensions.directives.ProcessJsonModelDirective; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * This WebScript controller attempts to retrieve a previously saved unit test page model + * from the {@link HttpSession} which is then stored in the "jsonModel" attribute of the + * overall model. The associated FreeMarker template will call the {@link ProcessJsonModelDirective} + * to convert the JSON string into a page model. + * + * @author Dave Draper + */ +public class UnitTestGetModelWebScript extends DeclarativeWebScript +{ + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map model = new HashMap(7, 1.0f); + HttpSession httpSession = ServletUtil.getSession(false); + if (httpSession != null) + { + String jsonModel = (String) httpSession.getAttribute("unitTestModel"); + model.put("jsonModel", jsonModel); + } + return model; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/scripts/UnitTestSetModelWebScript.java b/share/src/main/java/org/alfresco/web/scripts/UnitTestSetModelWebScript.java new file mode 100644 index 0000000000..ef047d01bd --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/UnitTestSetModelWebScript.java @@ -0,0 +1,90 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; + +/** + * This WebScript controller accepts a posted JSON string that defines a page model to use + * for a unit test and saves it to the {@link HttpSession}. The WebScript backed by the + * {@link UnitTestGetModelWebScript} controller should then be immediately run (in the context + * of a unit test page) to retrieve the JSON model and render it as a page. + * + * @author Dave Draper + */ +public class UnitTestSetModelWebScript extends DeclarativeWebScript +{ + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map model = new HashMap(7, 1.0f); + + try + { + String content = req.getContent().getContent(); + JSONParser jp = new JSONParser(); + Object o = jp.parse(content); + if (o instanceof JSONObject) + { + JSONObject jsonData = (JSONObject) o; + String jsonModel = (String)jsonData.get("unitTestModel"); + if (jsonModel != null) + { + HttpServletRequest httpRequest = ((WebScriptServletRequest)req).getHttpServletRequest(); + HttpSession httpSession = httpRequest.getSession(); + httpSession.setAttribute("unitTestModel", jsonModel); + model.put("result", "SUCCESS"); + } + else + { + model.put("result", "MISSING MODEL"); + } + } + } + catch (IOException e) + { + model.put("result", "IO Exception: " + e.getLocalizedMessage()); + } + catch (ParseException e) + { + model.put("result", "ParseException: " + e.getLocalizedMessage()); + } + finally + { + + } + return model; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/scripts/UserPreferences.java b/share/src/main/java/org/alfresco/web/scripts/UserPreferences.java new file mode 100644 index 0000000000..2a38053e22 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/UserPreferences.java @@ -0,0 +1,83 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.util.URLEncoder; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.Response; +import org.springframework.extensions.webscripts.processor.BaseProcessorExtension; + +/** + * Script host object to retrieve the current user preferences JSON response. + *

+ * The preferences service response is stored and cached in the current RequestContext. + * + * @author Kevin Roast + */ +public class UserPreferences extends BaseProcessorExtension +{ + private static final String USER_PREFERENCES = "_alfUserPreferences"; + + /** + * @return JSON preferences strings for the current user + */ + public String getValue() + { + // the test for cached user preferences is per request thread + // therefore no locking is required around the test logic + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + String prefs = (String)rc.getValue(USER_PREFERENCES); + if (prefs == null) + { + // set to a safe empty value for now - but don't cache the response + // this is valid to return for the guest user and on server response failure + prefs = "{}"; + + if (!AuthenticationUtil.isGuest(rc.getUserId())) + { + // retrieve the preferences and store on the request context for later usage within + // the scope of the current request - multiple components may need the values + try + { + Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco", rc.getUserId(), ServletUtil.getSession()); + Response response = conn.call("/api/people/" + URLEncoder.encode(rc.getUserId()) + "/preferences"); + if (response.getStatus().getCode() == Status.STATUS_OK) + { + prefs = response.getResponse(); + rc.setValue(USER_PREFERENCES, prefs); + } + } + catch (ConnectorServiceException e) + { + throw new AlfrescoRuntimeException("Unable to retrieve user preferences: " + e.getMessage(), e); + } + } + } + return prefs; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/scripts/bean/Authenticated.java b/share/src/main/java/org/alfresco/web/scripts/bean/Authenticated.java new file mode 100644 index 0000000000..61b83e9918 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/scripts/bean/Authenticated.java @@ -0,0 +1,75 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.scripts.bean; + +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.connector.User; +import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; + +/** + * Test if the current user Session contains an authenticated userid. + * + * @author Kevin Roast + */ +public class Authenticated extends DeclarativeWebScript +{ + /* (non-Javadoc) + * @see org.alfresco.web.scripts.DeclarativeWebScript#executeImpl(org.alfresco.web.scripts.WebScriptRequest, org.alfresco.web.scripts.WebScriptResponse) + */ + @Override + protected Map executeImpl(final WebScriptRequest req, final Status status) + { + if (req instanceof WebScriptServletRequest) + { + final WebScriptServletRequest webScriptServletRequest = (WebScriptServletRequest)req; + final HttpSession session = webScriptServletRequest.getHttpServletRequest().getSession(false); + + boolean isAllowedToViewPage = false; + if (session != null) + { + final String userID = (String)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID); + if (userID != null && !UserFactory.USER_GUEST.equals(userID)) + { + final User user = (User)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_OBJECT); + final String auth = webScriptServletRequest.getHttpServletRequest().getParameter("a"); + if (user != null) + { + isAllowedToViewPage = auth != null && auth.equals("admin") ? user.isAdmin() : true; + } + } + } + if (!isAllowedToViewPage) + { + status.setCode(401); + status.setMessage("There is no user ID in session or user is not permitted to view the page"); + status.setRedirect(true); + } + } + return null; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/ClusterTopicService.java b/share/src/main/java/org/alfresco/web/site/ClusterTopicService.java new file mode 100644 index 0000000000..872f6db7f2 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/ClusterTopicService.java @@ -0,0 +1,503 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.util.GUID; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.simple.parser.ContainerFactory; +import org.json.simple.parser.JSONParser; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.surf.ClusterMessageAware; +import org.springframework.extensions.surf.ClusterService; +import org.springframework.extensions.surf.util.ISO8601DateFormat; +import org.springframework.extensions.surf.util.StringBuilderWriter; +import org.springframework.extensions.webscripts.json.JSONWriter; + +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.ITopic; +import com.hazelcast.core.Message; +import com.hazelcast.core.MessageListener; + +/** + * Share cluster service - implemented on Hazelcast. Manages the web cluster by broadcasting + * and receiving messages relating to Surf operations (such as cache changes) that affect + * nodes in the cluster. + *

+ * The current implementation uses a simple broadcast message pattern to other cluster nodes + * that will then for instance; invalidate specific caches or remove/update resource paths. + *

+ * In particular Share deals with addition (caching of nulls), removal and modification of + * model objects relating to site and user dashboards and the site configuration objects. + * These objects are the only dynamic entities in Share and therefore synching in the cluster. + *

+ * Surf beans interested in listening for cluster messages or publishing cluster messages + * should implement the ClusterMessageAware interface. This service will automatically find all + * beans that implement those interfaces and provide them with cluster messages when appropriate. + * Beans implementing that interface can also publish messages to the cluster. + * + * @author Kevin Roast + */ +public class ClusterTopicService implements MessageListener, ClusterService, ApplicationContextAware +{ + private static Log logger = LogFactory.getLog(ClusterTopicService.class); + + /** The Hazelcast cluster bean instance */ + private HazelcastInstance hazelcastInstance; + + /** The Hazelcast topic name used for messaging between cluster nodes */ + private String hazelcastTopicName; + + /** The Hazelcast Topic resolved during Persister init */ + private ITopic clusterTopic = null; + + /** Registry of cluster message types to implementation beans */ + private Map clusterBeans = null; + + /** Node identifier - to ensure multicast messages aren't processed by the sender */ + private static final String clusterNodeId = GUID.generate(); + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Setters and Spring properties + + /** + * @param hazelcastInstance The HazelcastInstance cluster bean + */ + public void setHazelcastInstance(HazelcastInstance hazelcastInstance) + { + this.hazelcastInstance = hazelcastInstance; + } + + /** + * @param hazelcastTopicName The topic name used for messaging between cluster nodes + */ + public void setHazelcastTopicName(String hazelcastTopicName) + { + this.hazelcastTopicName = hazelcastTopicName; + } + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Spring Init + + private ApplicationContext applicationContext = null; + + /** + * Set ApplicationContext + * + * @param applicationContext The Spring ApplicationContext + */ + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.applicationContext = applicationContext; + } + + /** + * Bean init method to perform one time setup of the Hazelcast cluster node. + */ + public void init() + { + // validate bean setup + if (this.hazelcastInstance == null) + { + throw new IllegalArgumentException("The 'hazelcastInstance' property (HazelcastInstance) is mandatory."); + } + if (this.hazelcastTopicName == null || this.hazelcastTopicName.length() == 0) + { + throw new IllegalArgumentException("The 'hazelcastTopicName' property (String) is mandatory."); + } + + // cluster topic initialisation + ITopic topic = this.hazelcastInstance.getTopic(this.hazelcastTopicName); + if (topic == null) + { + throw new IllegalArgumentException( + "Did not find Hazelcast topic with name: '" + this.hazelcastTopicName + "' - cannot init."); + } + + // find the beans that are interested in cluster messages and register them with the service + Map beans = this.applicationContext.getBeansOfType(ClusterMessageAware.class); + this.clusterBeans = new HashMap<>(); + for (final String id: beans.keySet()) + { + final ClusterMessageAware bean = beans.get(id); + final String messageType = bean.getClusterMessageType(); + // beans that do not specify a message type can still post messages via the service or just keep a reference + // but they are not registered in the list of handler beans that can accept cluster messages + if (messageType != null) + { + if (this.clusterBeans.containsKey(messageType)) + { + throw new IllegalStateException("ClusterMessageAware bean with id '" + id + + "' attempted to register with existing Message Type: " + messageType); + } + this.clusterBeans.put(messageType, bean); + } + bean.setClusterService(this); + } + if (logger.isDebugEnabled()) + { + logger.debug("Registered beans for cluster messages:"); + for (final String id: beans.keySet()) + { + logger.debug(id + " [" + beans.get(id).getClusterMessageType() + "]"); + } + } + + // start listening for cluster messages + this.clusterTopic = topic; + this.clusterTopic.addMessageListener(this); + + logger.info("Init complete for Hazelcast cluster - listening on topic: " + hazelcastTopicName); + } + + + ///////////////////////////////////////////////////////////////// + // Hazelcast Cluster message send and receive + + /** + * Push message out to the cluster - multicast or direct TCP depending on Hazelcast config. + */ + @Override + public void publishClusterMessage(String messageType, Map payload) + { + // construct the message object from the payload + final ClusterMessage msg = new ClusterMessageImpl(messageType, payload); + + // serialise it to plain text for transmission + final String serialised = msg.toString(); + if (logger.isDebugEnabled()) + logger.debug("Pushing message:\r\n" + serialised); + + // push the message out to the Hazelcast topic cluster + this.clusterTopic.publish(serialised); + } + + /** + * Hazelcast MessageListener implementation - called when a message is received from a cluster node + * + * @param message Cluster message JSON string + */ + @Override + public void onMessage(final Message message) + { + final boolean debug = logger.isDebugEnabled(); + + // process message objects and extract the payload + final String msg = message.getMessageObject(); + final MessageProcessor proc = new MessageProcessor(msg); + if (!proc.isSender()) + { + if (debug) logger.debug("Received message of type:" + proc.getMessageType() + "\r\n" + msg); + + // call an implementation of a message handler bean + final ClusterMessageAware bean = this.clusterBeans.get(proc.getMessageType()); + if (bean != null) + { + bean.onClusterMessage(proc.getMessagePayload()); + } + else + { + logger.warn("Received message of unknown type - no handler bean found: " + proc.getMessageType()); + } + } + } + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Inner classes and messaging contract interfaces + + /** + * Contract for a cluster message. + */ + interface ClusterMessage + { + static final String JSON_SENDER = "sender"; + static final String JSON_MESSAGE = "message"; + static final String JSON_TYPE = "type"; + static final String JSON_PAYLOAD = "payload"; + + /** + * @return the globally unique sender ID + */ + String getSender(); + + /** + * @return the message type, will only be processed if understood by the receiver + */ + String getType(); + + /** + * @return the arbitrary payload data bundle + */ + Map getPayload(); + } + + /** + * Abstract base class for cluster messages. + *

+ * Wraps an object payload and the type of the message and handles the marshling + * of the payload to JSON string message format. + */ + static class ClusterMessageImpl implements ClusterMessage + { + /** message type */ + final private String type; + + /** payload object */ + final Map payload; + + /** + * Constructor + * + * @param type Type of this message + * @param payload Payload object for this message + */ + ClusterMessageImpl(String type, Map payload) + { + this.type = type; + this.payload = payload; + } + + /** + * @return the payload map for the message + */ + public Map getPayload() + { + return this.payload; + } + + /** + * @return the unique ID for the cluster node in the message + */ + public String getSender() + { + return clusterNodeId; + } + + /** + * @return the message type + */ + public String getType() + { + return this.type; + } + + @Override + public String toString() + { + // serialise message to JSON and return final message string data + try + { + final StringBuilderWriter buffer = new StringBuilderWriter(512); + final JSONWriter writer = new JSONWriter(buffer); + writer.startObject(); + writer.writeValue(ClusterMessage.JSON_SENDER, getSender()); + writer.startValue(ClusterMessage.JSON_MESSAGE); + writer.startObject(); + writer.writeValue(ClusterMessage.JSON_TYPE, getType()); + writer.startValue(ClusterMessage.JSON_PAYLOAD); + serialiseMessageObjects(writer, null, (Serializable)this.payload); + writer.endValue(); + writer.endObject(); + writer.endValue(); + writer.endObject(); + return buffer.toString(); + } + catch (IOException e) + { + throw new IllegalStateException("Failed to serialise cluster message: " + e.getMessage(), e); + } + } + + /** + * Recursively serialise objects to a JSONWriter. + *

+ * Handles basic Java type suitable for the current messaging implementation. + * + * @param writer JSONWriter for output + * @param name Name of the current value, can be null for array item + * @param obj Object representing the value to serialise + */ + static void serialiseMessageObjects(final JSONWriter writer, final String name, final Serializable obj) + throws IOException + { + if (obj instanceof Map) + { + // recursively serialise the map entries + if (name != null) + { + writer.startValue(name); + } + writer.startObject(); + Map map = (Map)obj; + for (final String key: map.keySet()) + { + serialiseMessageObjects(writer, key, map.get(key)); + } + writer.endObject(); + if (name != null) + { + writer.endValue(); + } + } + else if (obj instanceof List) + { + // recursively serialise the list items + if (name != null) + { + writer.startValue(name); + } + writer.startArray(); + for (final Object item: (List)obj) + { + serialiseMessageObjects(writer, null, (Serializable)item); + } + writer.endArray(); + if (name != null) + { + writer.endValue(); + } + } + else if (obj instanceof Integer) + { + if (name != null) + { + writer.writeValue(name, (Integer)obj); + } + else + { + writer.writeValue((Integer)obj); + } + } + else if (obj instanceof Boolean) + { + if (name != null) + { + writer.writeValue(name, (Boolean)obj); + } + else + { + writer.writeValue((Boolean)obj); + } + } + else if (obj instanceof Date) + { + if (name != null) + { + writer.writeValue(name, ISO8601DateFormat.format((Date)obj)); + } + else + { + writer.writeValue(ISO8601DateFormat.format((Date)obj)); + } + } + else if (obj == null) + { + if (name != null) + { + writer.writeNullValue(name); + } + else + { + writer.writeNullValue(); + } + } + else + { + if (name != null) + { + writer.writeValue(name, obj.toString()); + } + else + { + writer.writeValue(obj.toString()); + } + } + } + } + + /** + * This class is responsible for deserialising a message string into objects. + *

+ * The sender, message type and object payload can then be retrieved for further processing. + */ + static class MessageProcessor + { + private final String sender; + private final String type; + private final Map payload; + + MessageProcessor(String msg) + { + // deserialise the message to retrieve the sender, type and payload objects + try + { + Map json = (Map)new JSONParser().parse(msg, new ContainerFactory() + { + public Map createObjectContainer() + { + return new HashMap(); + } + + public List creatArrayContainer() + { + return new ArrayList(); + } + }); + this.sender = (String)json.get(ClusterMessage.JSON_SENDER); + Map message = (Map)json.get(ClusterMessage.JSON_MESSAGE); + this.type = (String)message.get(ClusterMessage.JSON_TYPE); + this.payload = (Map)message.get(ClusterMessage.JSON_PAYLOAD); + } + catch (Throwable e) + { + throw new IllegalArgumentException("Unable to parse cluster JSON message: " + e.getMessage() + "\r\n" + msg); + } + } + + boolean isSender() + { + return clusterNodeId.equals(this.sender); + } + + String getMessageType() + { + return this.type; + } + + Map getMessagePayload() + { + return this.payload; + } + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/DocsEdition.java b/share/src/main/java/org/alfresco/web/site/DocsEdition.java new file mode 100644 index 0000000000..de3b0c7a8a --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/DocsEdition.java @@ -0,0 +1,88 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.io.Serializable; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Encapsulates the documentation editions and their relationships to + * the Alfresco editions and versions. + * + * @author Ahmed Owian + */ +public class DocsEdition implements Serializable +{ + private static final long serialVersionUID = -6180536415511757664L; + + public static final String COMMUNITY = "community"; + public static final String CLOUD = "cloud"; + + private final String value; + + /** + * Value will be "community" + */ + public DocsEdition() + { + this(null, null, false); + } + + /** + * If isInCloud is true, then value will be "cloud" + */ + public DocsEdition(boolean isInCloud) + { + this(null, null, isInCloud); + } + + /** + * If not in cloud and the edition is "ENTERPRISE" and the specificationVersion is of the form major.minor, + * then the value will be the enterprise version (major.minor) + */ + public DocsEdition(String edition, String specificationVersion, boolean isInCloud) + { + String value = COMMUNITY; + if (isInCloud) + { + value = CLOUD; + } + else if (EditionInfo.ENTERPRISE_EDITION.equals(edition) && specificationVersion != null) + { + Matcher matcher = Pattern.compile("^(\\d+\\.\\d+)").matcher(specificationVersion); + if (matcher.find()) + { + value = matcher.group(); + } + } + this.value = value; + } + + /** + * Returns the appropriate edition used for documentation URLs. + * @return "community", the enterprise version (major.minor), or "cloud" + */ + public String getValue() + { + return this.value; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/EditionInfo.java b/share/src/main/java/org/alfresco/web/site/EditionInfo.java new file mode 100644 index 0000000000..70ea4745ae --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/EditionInfo.java @@ -0,0 +1,127 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.io.Serializable; + +import org.json.JSONException; +import org.json.JSONObject; + + +/** + * Simple structure class wrapping the edition and license restriction information + * + * @author Kevin Roast + * @author Erik Winlof + */ +public class EditionInfo implements Serializable +{ + public static final String ENTERPRISE_EDITION = "ENTERPRISE"; + public static final String TEAM_EDITION = "TEAM"; + public static final String UNKNOWN_EDITION = "UNKNOWN"; + public static final String UNKNOWN_HOLDER = "UNKNOWN"; + + protected final long users; + protected final long documents; + protected final String edition; + protected final String holder; + protected final boolean response; + + public EditionInfo() + { + this.users = -1L; + this.documents = -1L; + this.edition = UNKNOWN_EDITION; + this.holder = UNKNOWN_HOLDER; + this.response = false; + } + + public EditionInfo(String response) throws JSONException + { + JSONObject json = new JSONObject(response); + if (json.has("data")) + { + String edition = UNKNOWN_HOLDER; + JSONObject data = json.getJSONObject("data"); + if (data != null) + { + // only set the edition if it's enterprise + if (ENTERPRISE_EDITION.equalsIgnoreCase(data.getString("edition"))) + { + edition = ENTERPRISE_EDITION; + } + } + + this.users = -1L; + this.documents = -1L; + this.holder = UNKNOWN_HOLDER; + this.edition = edition; + + // we don't have all the information we need so set this + // flag to false to indicate a re-attempt is required + this.response = false; + } + else + { + this.users = json.optLong("users", -1L); + this.documents = json.optLong("documents", -1L); + this.edition = json.getString("licenseMode"); + this.holder = json.getString("licenseHolder"); + this.response = true; + } + } + + public long getUsers() + { + return this.users; + } + + public long getDocuments() + { + return this.documents; + } + + public String getEdition() + { + return this.edition; + } + + public String getHolder() + { + return this.holder; + } + + /** + * @return true if the Edition info object was constuctor from a server response, + * false if this is a default construction - used until the server responds. + */ + public boolean getValidResponse() + { + return this.response; + } + + @Override + public String toString() + { + return "Users: " + this.users + " Documents: " + this.documents + + " Edition: " + this.edition + " Holder: " + this.holder + " Built from server response: " + this.response; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/EditionInterceptor.java b/share/src/main/java/org/alfresco/web/site/EditionInterceptor.java new file mode 100644 index 0000000000..595b515a21 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/EditionInterceptor.java @@ -0,0 +1,245 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import javax.servlet.http.HttpSession; + +import org.alfresco.web.scripts.ShareManifest; +import org.alfresco.web.site.servlet.MTAuthenticationFilter; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.extensions.config.ConfigBootstrap; +import org.springframework.extensions.config.ConfigService; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.exception.WebFrameworkServiceException; +import org.springframework.extensions.surf.mvc.AbstractWebFrameworkInterceptor; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorContext; +import org.springframework.extensions.webscripts.connector.Response; +import org.springframework.ui.ModelMap; +import org.springframework.web.context.request.WebRequest; + +/** + * Framework interceptor responsible for checking repository license edition + * and applying appropriate config overrides. + * + * @author Kevin Roast + */ +public class EditionInterceptor extends AbstractWebFrameworkInterceptor +{ + /** public name of the value in the RequestContext */ + public static final String EDITION_INFO = "editionInfo"; + public static final String KEY_DOCS_EDITION = "docsEdition"; + public static final String URL_UTIL = "urlUtil"; + + public static final String ENTERPRISE_EDITION = EditionInfo.ENTERPRISE_EDITION; + public static final String TEAM_EDITION = EditionInfo.TEAM_EDITION; + public static final String UNKNOWN_EDITION = EditionInfo.UNKNOWN_EDITION; + public static final String UNKNOWN_HOLDER = EditionInfo.UNKNOWN_HOLDER; + + private static Log logger = LogFactory.getLog(EditionInterceptor.class); + + /* + * These are maintained as static variables so that they don't have to be recreated + * upon each thread's call to the preHandle method. + */ + private static EditionInfo EDITIONINFO = null; + private static DocsEdition docsEdition = null; + private static UrlUtil urlUtil = new UrlUtil(); + + private static volatile boolean outputInfo = false; + private static volatile boolean outputEditionInfo = false; + private static final ReadWriteLock editionLock = new ReentrantReadWriteLock(); + + private ShareManifest shareManifest; + + public void setShareManifest(ShareManifest shareManifest) + { + this.shareManifest = shareManifest; + } + + /* (non-Javadoc) + * @see org.springframework.web.context.request.WebRequestInterceptor#preHandle(org.springframework.web.context.request.WebRequest) + */ + @Override + public void preHandle(WebRequest request) throws Exception + { + editionLock.readLock().lock(); + try + { + if (EDITIONINFO == null) + { + editionLock.readLock().unlock(); + editionLock.writeLock().lock(); + try + { + // check again, as more than one thread could have been waiting on the Write lock + if (EDITIONINFO == null) + { + // initiate a call to retrieve the edition and restrictions from the repository + RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco"); + ConnectorContext ctx = new ConnectorContext(); + ctx.setExceptionOnError(false); + Response response = conn.call("/api/admin/restrictions?guest=true"); + if (response.getStatus().getCode() == Status.STATUS_UNAUTHORIZED) + { + // if this occurs we may be running a multi-tenant repository or guest auth is disabled + if (MTAuthenticationFilter.getCurrentServletRequest() != null) + { + HttpSession session = MTAuthenticationFilter.getCurrentServletRequest().getSession(false); + if (session != null && session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID) != null) + { + // we try now that a Session is acquired and we have an authenticated user + // this is the only time that we can successfully retrieve the license information + // when the repo is in multi-tenant mode - as guest auth is not supported otherwise + conn = rc.getServiceRegistry().getConnectorService().getConnector( + "alfresco", (String)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID), session); + response = conn.call("/api/admin/restrictions"); + } + else + { + // as a last resort try retrieving the server version so that + // we can at least determine what the edition is + response = conn.call("/api/server"); + } + } + } + if (response.getStatus().getCode() == Status.STATUS_OK) + { + EditionInfo editionInfo = new EditionInfo(response.getResponse()); + docsEdition = new DocsEdition(editionInfo.getEdition(), shareManifest.getSpecificationVersion(), false); + if (editionInfo.getValidResponse()) + { + logger.info("Successfully retrieved license information from Alfresco."); + EDITIONINFO = editionInfo; + } + else + { + if (!outputEditionInfo) + { + logger.info("Successfully retrieved edition information from Alfresco."); + outputEditionInfo = true; + } + + // set edition info for current thread + ThreadLocalRequestContext.getRequestContext().setValue(EDITION_INFO, editionInfo); + ThreadLocalRequestContext.getRequestContext().setValue(KEY_DOCS_EDITION, docsEdition); + ThreadLocalRequestContext.getRequestContext().setValue(URL_UTIL, urlUtil); + + // NOTE: We do NOT assign to the EDITIONINFO so that we re-evaluate next time. + } + + // apply runtime config overrides based on the repository edition + String runtimeConfig = null; + if (TEAM_EDITION.equals(editionInfo.getEdition())) + { + runtimeConfig = "classpath:alfresco/team-config.xml"; + } + else if (ENTERPRISE_EDITION.equals(editionInfo.getEdition())) + { + runtimeConfig = "classpath:alfresco/enterprise-config.xml"; + } + if (runtimeConfig != null) + { + // manually instantiate a ConfigBootstrap object that will + // register our override config with the main config source + List configs = new ArrayList(1); + configs.add(runtimeConfig); + + ConfigService configservice = rc.getServiceRegistry().getConfigService(); + ConfigBootstrap cb = new ConfigBootstrap(); + cb.setBeanName("share-edition-config"); + cb.setConfigService(configservice); + cb.setConfigs(configs); + cb.register(); + configservice.reset(); + } + if (logger.isDebugEnabled()) + logger.debug("Current EditionInfo: " + editionInfo); + } + else + { + // only output the warning once + if (!outputInfo) + { + logger.info("Unable to retrieve License information from Alfresco: " + response.getStatus().getCode()); + outputInfo = true; + } + // set a value so scripts have something to work with - the interceptor will retry later + EditionInfo info = new EditionInfo(); + ThreadLocalRequestContext.getRequestContext().setValue(EDITION_INFO, info); + DocsEdition tempDocsEdition = new DocsEdition(); + ThreadLocalRequestContext.getRequestContext().setValue(KEY_DOCS_EDITION, tempDocsEdition); + if (logger.isDebugEnabled()) + logger.debug("Current EditionInfo: " + info); + } + } + } + catch (JSONException err) + { + throw new WebFrameworkServiceException("Unable to process response: " + err.getMessage(), err); + } + finally + { + editionLock.readLock().lock(); + editionLock.writeLock().unlock(); + } + } + if (EDITIONINFO != null) + { + ThreadLocalRequestContext.getRequestContext().setValue(EDITION_INFO, EDITIONINFO); + ThreadLocalRequestContext.getRequestContext().setValue(KEY_DOCS_EDITION, docsEdition); + ThreadLocalRequestContext.getRequestContext().setValue(URL_UTIL, urlUtil); + } + } + finally + { + editionLock.readLock().unlock(); + } + } + + /* (non-Javadoc) + * @see org.springframework.web.context.request.WebRequestInterceptor#postHandle(org.springframework.web.context.request.WebRequest, org.springframework.ui.ModelMap) + */ + @Override + public void postHandle(WebRequest request, ModelMap model) throws Exception + { + } + + /* (non-Javadoc) + * @see org.springframework.web.context.request.WebRequestInterceptor#afterCompletion(org.springframework.web.context.request.WebRequest, java.lang.Exception) + */ + @Override + public void afterCompletion(WebRequest request, Exception ex) throws Exception + { + } + +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/SlingshotPageView.java b/share/src/main/java/org/alfresco/web/site/SlingshotPageView.java new file mode 100644 index 0000000000..13f9d219df --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/SlingshotPageView.java @@ -0,0 +1,229 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.springframework.extensions.config.RemoteConfigElement; +import org.springframework.extensions.config.WebFrameworkConfigElement; +import org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor; +import org.springframework.extensions.surf.ModelObjectService; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.TemplatesContainer; +import org.springframework.extensions.surf.exception.CredentialVaultProviderException; +import org.springframework.extensions.surf.exception.PlatformRuntimeException; +import org.springframework.extensions.surf.mvc.PageView; +import org.springframework.extensions.surf.render.RenderService; +import org.springframework.extensions.surf.resource.ResourceService; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.AlfrescoUserFactory; +import org.springframework.extensions.surf.types.Page; +import org.springframework.extensions.surf.types.Theme; +import org.springframework.extensions.webscripts.connector.User; + +/** + * Slingshot implementation of PageView object. + *

+ * Adds a override to the initial setup of the request context, this is used to identify + * page objects with a theme override - allowing a theme per site or even a theme per + * page. Currently the UI only provides a mechanism to set the theme on a per application + * and per site basis. + * + * @author Kevin Roast + */ +public class SlingshotPageView extends PageView +{ + // Redirect session parameters + public static final String REDIRECT_URI = "_redirectURI"; + public static final String REDIRECT_QUERY = "_redirectQueryString"; + + private RemoteConfigElement config; + + /** + * Construction + * + * @param webFrameworkConfiguration + * @param modelObjectService + * @param resourceService + * @param renderService + * @param templatesContainer + */ + public SlingshotPageView(WebFrameworkConfigElement webFrameworkConfiguration, + ModelObjectService modelObjectService, ResourceService resourceService, RenderService renderService, + TemplatesContainer templatesContainer) + { + super(webFrameworkConfiguration, modelObjectService, resourceService, renderService, templatesContainer); + } + + @Override + protected void prepareResponse(HttpServletRequest request, HttpServletResponse response) + { + response.setHeader("Cache-Control", "no-cache"); + } + + /* (non-Javadoc) + * @see org.springframework.extensions.surf.mvc.AbstractWebFrameworkView#validateRequestContext(org.springframework.extensions.surf.RequestContext, javax.servlet.http.HttpServletRequest) + */ + @Override + protected void validateRequestContext(RequestContext rc, HttpServletRequest req) + throws Exception + { + super.validateRequestContext(rc, req); + + String themeId = null; + + // test to see if this is a site page + String siteId = rc.getUriTokens().get("site"); + if (siteId != null) + { + // find the site dashboard page - and look for a theme override + Page dashboard = getObjectService().getPage("site/" + siteId + "/dashboard"); + if (dashboard != null) + { + themeId = dashboard.getProperty("theme"); + } + } + else + { + // examine current page directly for custom properties with a theme override + // this allows a different theme per page + themeId = rc.getPage().getProperty("theme"); + } + + // if themeId different to current theme then look it up + if (themeId != null && themeId.length() != 0 && !rc.getThemeId().equals(themeId)) + { + Theme theme = getObjectService().getTheme(themeId); + if (theme != null) + { + // found a valid theme - set it current ready for page rendering + rc.setTheme(theme); + } + } + } + + @Override + protected boolean loginRequiredForPage(RequestContext context, HttpServletRequest request, Page page) + { + boolean externalAuth = false; + EndpointDescriptor descriptor = getRemoteConfig(context).getEndpointDescriptor(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID); + if (descriptor != null) + { + externalAuth = descriptor.getExternalAuth(); + } + + boolean login = false; + User user = context.getUser(); + switch (page.getAuthentication()) + { + case guest: + { + login = (user == null); + break; + } + + // Enhanced test over the super class implementation - to check that the user has credentials to + // use the default "alfresco" endpoint - ensures that say a user ID is in the session from + // access to an RSS feed endpoint, they are not given permission to proceed until after a full login + case user: + { + try + { + login = (user == null || AuthenticationUtil.isGuest(user.getId())) || + (!context.getServiceRegistry().getConnectorService().getCredentialVault( + request.getSession(), user.getId()).hasCredentials(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID) && + externalAuth == false); + } + catch (CredentialVaultProviderException err) + { + throw new PlatformRuntimeException("Unable to retrieve credentials for current user.", err); + } + break; + } + + case admin: + { + try + { + login = (user == null || !user.isAdmin()) || + (!context.getServiceRegistry().getConnectorService().getCredentialVault( + request.getSession(), user.getId()).hasCredentials(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID) && + externalAuth == false); + } + catch (CredentialVaultProviderException err) + { + throw new PlatformRuntimeException("Unable to retrieve credentials for current user.", err); + } + if (login) + { + if (!user.isGuest()) + { + // If the user is not a guest user, and the flag is true, + // that means a non admin, non guest user is logged in already. + // This means that a normal user tries to access a page that requires admin privilege. + // This normal user should not even know that such a page exits. + // By throwing an exception here, we force the error500.jsp page to be displayed. + throw new PlatformRuntimeException("Non-admin user tries to access a page that requires admin privilege."); + } + + // special case for admin - need to clear user context before + // we can login again to "upgrade" our user authentication level + AuthenticationUtil.clearUserContext(request); + } + break; + } + } + return login; + } + + @Override + protected String buildLoginRedirectURL(HttpServletRequest request) + { + HttpSession session = request.getSession(false); + if (session != null && session.getAttribute(REDIRECT_URI) != null) + { + String redirectUrl = session.getAttribute(REDIRECT_URI) + + (session.getAttribute(REDIRECT_QUERY) != null ? ("?" + session.getAttribute(REDIRECT_QUERY)) : ""); + session.removeAttribute(REDIRECT_URI); + session.removeAttribute(REDIRECT_QUERY); + return redirectUrl; + } + return super.buildLoginRedirectURL(request); + } + + /** + * Gets the remote config. + * + * @return the remote config + */ + private RemoteConfigElement getRemoteConfig(RequestContext context) + { + if (this.config == null) + { + // retrieve the remote configuration + this.config = (RemoteConfigElement)context.getServiceRegistry().getConfigService().getConfig("Remote").getConfigElement("remote"); + } + + return this.config; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/SlingshotPageViewResolver.java b/share/src/main/java/org/alfresco/web/site/SlingshotPageViewResolver.java new file mode 100644 index 0000000000..4752786caa --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/SlingshotPageViewResolver.java @@ -0,0 +1,133 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +import org.alfresco.web.site.servlet.MTAuthenticationFilter; +import org.springframework.extensions.surf.RequestContextUtil; +import org.springframework.extensions.surf.exception.PlatformRuntimeException; +import org.springframework.extensions.surf.exception.RequestContextException; +import org.springframework.extensions.surf.mvc.PageView; +import org.springframework.extensions.surf.mvc.PageViewResolver; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.types.Page; +import org.springframework.web.servlet.view.AbstractUrlBasedView; + +/** + * Slingshot specific implementation of Page View resolver. + *

+ * Support for MT in a non-portlet environment is provided via a servlet filter + * {@link MTAuthenticationFilter} this view resolver makes use of the object provided + * by the filter to allow authenticated access to the remote store earlier in the + * Spring MVC lifecycle than would normally occur. This mechanism can only be used in a + * non-portlet environment. + * + * @author Kevin Roast + */ +public class SlingshotPageViewResolver extends PageViewResolver +{ + protected static final String URI_SITE = "site"; + protected static final String URI_PAGEID = "pageid"; + protected static final Pattern REGEX_PATTERN_SITE_ROOT = Pattern.compile("site\\/((\\w|-)+)\\/?$"); + protected static final String PAGE_ID_SITE_ROOT = "site-redirect"; + + @Override + protected Page lookupPage(String pageId) + { + if (ThreadLocalRequestContext.getRequestContext().getUser() == null) + { + HttpServletRequest req = MTAuthenticationFilter.getCurrentServletRequest(); + if (req != null) + { + try + { + // init the request user context if the thread local is found containing the + // servlet request information - this ensures an authenticated Connector is + // used when makes a remote call to resolve the Page from the view name + RequestContextUtil.initRequestContext(getApplicationContext(), req); + } + catch (RequestContextException e) + { + throw new PlatformRuntimeException("Failed to init Request Context: " + e.getMessage(), e); + } + } + } + // see if a page has been set-up already - @see UserDashboardInterceptor + Page page = ThreadLocalRequestContext.getRequestContext().getPage(); + if (page != null) + { + return page; + } + return super.lookupPage(pageId); + } + + /** + * Constructs a new PageView object using and sets it's URL to the current view name + * providing that a Page object is stored on the current RequestContext + * object. + * + * @param viewName The name of the view to build. + */ + @Override + protected AbstractUrlBasedView buildView(String viewName) + { + PageView view = null; + Page page = ThreadLocalRequestContext.getRequestContext().getPage(); + if (page != null) + { + view = new SlingshotPageView(getWebframeworkConfigElement(), + getModelObjectService(), + getWebFrameworkResourceService(), + getWebFrameworkRenderService(), + getTemplatesContainer()); + view.setUrl(viewName); + view.setPage(page); + view.setUriTokens(ThreadLocalRequestContext.getRequestContext().getUriTokens()); + view.setUrlHelperFactory(getUrlHelperFactory()); + } + + return view; + } + + /** + * Override to check for the specific pattern of a site root, i.e. + * site/somesite or site/somesite/ + */ + @Override + protected Map getTokens(String viewName) + { + Matcher matcher = REGEX_PATTERN_SITE_ROOT.matcher(viewName); + if (matcher.matches()) + { + Map tokens = new HashMap(4); + tokens.put(URI_SITE, matcher.group(1)); + tokens.put(URI_PAGEID, PAGE_ID_SITE_ROOT); + return tokens; + } + return super.getTokens(viewName); + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/SlingshotUser.java b/share/src/main/java/org/alfresco/web/site/SlingshotUser.java new file mode 100644 index 0000000000..db83b75949 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/SlingshotUser.java @@ -0,0 +1,64 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.util.Map; + +import org.springframework.extensions.surf.FrameworkUtil; +import org.springframework.extensions.surf.exception.PlatformRuntimeException; +import org.springframework.extensions.surf.exception.UserFactoryException; +import org.springframework.extensions.surf.site.AlfrescoUser; + +/** + * User object extended to provide persistence back to an Alfresco repo. + * + * @author Kevin Roast + */ +public class SlingshotUser extends AlfrescoUser +{ + /** + * Instantiates a new user. + * + * @param id The user id + * @param capabilities Map of string keyed capabilities given to the user + * @param immutability Optional map of property qnames to immutability + */ + public SlingshotUser(String id, Map capabilities, Map immutability) + { + super(id, capabilities, immutability); + } + + /** + * @see org.springframework.extensions.webscripts.connector.User#save() + */ + @Override + public void save() + { + try + { + ((SlingshotUserFactory)FrameworkUtil.getServiceRegistry().getUserFactory()).saveUser(this); + } + catch (UserFactoryException err) + { + throw new PlatformRuntimeException("Unable to save user details: " + err.getMessage(), err); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/SlingshotUserFactory.java b/share/src/main/java/org/alfresco/web/site/SlingshotUserFactory.java new file mode 100644 index 0000000000..d53b7b697e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/SlingshotUserFactory.java @@ -0,0 +1,264 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Date; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.alfresco.web.site.servlet.SlingshotLoginController; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.extensions.surf.FrameworkUtil; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.exception.UserFactoryException; +import org.springframework.extensions.surf.site.AlfrescoUser; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.AlfrescoUserFactory; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.util.StringBuilderWriter; +import org.springframework.extensions.surf.util.URLEncoder; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorContext; +import org.springframework.extensions.webscripts.connector.CredentialVault; +import org.springframework.extensions.webscripts.connector.Credentials; +import org.springframework.extensions.webscripts.connector.HttpMethod; +import org.springframework.extensions.webscripts.connector.Response; +import org.springframework.extensions.webscripts.connector.User; +import org.springframework.extensions.webscripts.json.JSONWriter; + +/** + * Slingshot User Factory makes use of the slingshot REST API to persist + * modified user details back to the repo. + * + * @author kevinr + */ +public class SlingshotUserFactory extends AlfrescoUserFactory +{ + public static final String ALF_USER_LOADED = "alfUserLoaded"; + public static final String ALF_USER_GROUPS = "alfUserGroups"; + + // Alfresco 3.4 user status properties + public static final String CM_USERSTATUS = "{http://www.alfresco.org/model/content/1.0}userStatus"; + public static final String CM_USERSTATUSTIME = "{http://www.alfresco.org/model/content/1.0}userStatusTime"; + public static final String CM_USERHOME = "{http://www.alfresco.org/model/content/1.0}homeFolder"; + public static final String PROP_USERSTATUS = "userStatus"; + public static final String PROP_USERSTATUSTIME = "userStatusTime"; + public static final String PROP_USERHOME = "userHome"; + + public static final String CM_PREFERENCEVALUES = "{http://www.alfresco.org/model/content/1.0}preferenceValues"; + public static final String PROP_USERHOMEPAGE = "userHomePage"; + public static final String PREFERENCE_USERHOMEPAGE = "org.alfresco.share.user.homePage"; + + public static final String ACTIVITI_ADMIN_ENDPOINT_ID = "activiti-admin"; + + /** + * @see org.springframework.extensions.surf.UserFactory#authenticate(javax.servlet.http.HttpServletRequest, String, String) + */ + @Override + public boolean authenticate(HttpServletRequest request, String username, String password) + { + // special case to disallow Guest user authentication in Share + // TODO: add basic Guest user support + boolean authenticated = false; + if (!AuthenticationUtil.isGuest(username)) + { + authenticated = super.authenticate(request, username, password); + + if (authenticated) + { + // Add activiti-admin credentials to the vault as well. + CredentialVault vault = frameworkUtils.getCredentialVault(request.getSession(), username); + Credentials credentials = vault.newCredentials(ACTIVITI_ADMIN_ENDPOINT_ID); + credentials.setProperty(Credentials.CREDENTIAL_USERNAME, username); + credentials.setProperty(Credentials.CREDENTIAL_PASSWORD, password); + } + } + return authenticated; + } + + @Override + protected AlfrescoUser constructUser(JSONObject properties, Map capabilities, + Map immutability) throws JSONException + { + AlfrescoUser user = new SlingshotUser(properties.getString(CM_USERNAME), capabilities, immutability); + user.setProperty(PROP_USERSTATUS, properties.has(CM_USERSTATUS) ? properties.getString(CM_USERSTATUS) : null); + user.setProperty(PROP_USERSTATUSTIME, properties.has(CM_USERSTATUSTIME) ? properties.getString(CM_USERSTATUSTIME) : null); + user.setProperty(PROP_USERHOME, properties.has(CM_USERHOME) ? properties.getString(CM_USERHOME) : null); + + if (properties.has(CM_PREFERENCEVALUES)) + { + String preferenceValues = properties.getString(CM_PREFERENCEVALUES); + if (preferenceValues.trim().length() != 0) + { + try + { + JSONObject preferences = new JSONObject(preferenceValues); + String defaultPage = preferences.getString(PREFERENCE_USERHOMEPAGE); + if (defaultPage != null && !defaultPage.trim().equals("")) + { + user.setProperty(PROP_USERHOMEPAGE, defaultPage); + } + } + catch (JSONException e) + { + // No default page set, that's fine + } + } + } + + return user; + } + + @Override + public User loadUser(RequestContext context, String userId, String endpointId) throws UserFactoryException + { + User user = super.loadUser(context, userId, endpointId); + + // set a value indicating time the user was constructed + user.setProperty(ALF_USER_LOADED, new Date().getTime()); + + // When a user logs in the SlingshotLoginController will store the groups that they are a member of as a comma delimited string + // This string needs to be retrieved from the HttpSession and set as a property on the User object. + // The property can then be easily used in WebScripts using user.properties["alfUserGroups"].split(,) to get an array of the groups + // that the user is a member of... + HttpSession session = ServletUtil.getSession(false); + if (session != null) + { + String groups = (String) session.getAttribute(SlingshotLoginController.SESSION_ATTRIBUTE_KEY_USER_GROUPS); + if (groups != null) + { + user.setProperty(ALF_USER_GROUPS, groups); + } + } + + return user; + } + + /** + * Gets the home page for the given user, for example: + * /page/site/swsdp/documentlibrary + *

+ * The default value if none has been set is the user's dashboard: + * /page/user/{username}/dashboard + * + * @param context + * @param userId + * @return the user's home page + * @throws UserFactoryException + */ + public String getUserHomePage(RequestContext context, String userId) throws UserFactoryException + { + String homePage = "/page/user/" + URLEncoder.encode(userId) + "/dashboard"; + User user = context.getUser(); + if (user != null) + { + String userHomePage = (String) user.getProperty(PROP_USERHOMEPAGE); + if (userHomePage != null && !userHomePage.trim().equals("")) + { + homePage = userHomePage; + } + } + return homePage; + } + + /** + * Persist the user back to the Alfresco repository + * + * @param user to persist + * + * @throws UserFactoryException + */ + public void saveUser(AlfrescoUser user) throws UserFactoryException + { + RequestContext context = (RequestContext)ThreadLocalRequestContext.getRequestContext(); + if (!context.getUserId().equals(user.getId())) + { + throw new UserFactoryException("Unable to persist user with different Id that current Id."); + } + + StringBuilderWriter buf = new StringBuilderWriter(512); + JSONWriter writer = new JSONWriter(buf); + + try + { + writer.startObject(); + + writer.writeValue("username", user.getId()); + + writer.startValue("properties"); + writer.startObject(); + writer.writeValue(CM_FIRSTNAME, user.getFirstName()); + writer.writeValue(CM_LASTNAME, user.getLastName()); + writer.writeValue(CM_JOBTITLE, user.getJobTitle()); + writer.writeValue(CM_ORGANIZATION, user.getOrganization()); + writer.writeValue(CM_LOCATION, user.getLocation()); + writer.writeValue(CM_EMAIL, user.getEmail()); + writer.writeValue(CM_TELEPHONE, user.getTelephone()); + writer.writeValue(CM_MOBILE, user.getMobilePhone()); + writer.writeValue(CM_SKYPE, user.getSkype()); + writer.writeValue(CM_INSTANTMSG, user.getInstantMsg()); + writer.writeValue(CM_GOOGLEUSERNAME, user.getGoogleUsername()); + writer.writeValue(CM_COMPANYADDRESS1, user.getCompanyAddress1()); + writer.writeValue(CM_COMPANYADDRESS2, user.getCompanyAddress2()); + writer.writeValue(CM_COMPANYADDRESS3, user.getCompanyAddress3()); + writer.writeValue(CM_COMPANYPOSTCODE, user.getCompanyPostcode()); + writer.writeValue(CM_COMPANYFAX, user.getCompanyFax()); + writer.writeValue(CM_COMPANYEMAIL, user.getCompanyEmail()); + writer.writeValue(CM_COMPANYTELEPHONE, user.getCompanyTelephone()); + writer.endObject(); + writer.endValue(); + + writer.startValue("content"); + writer.startObject(); + writer.writeValue(CM_PERSONDESCRIPTION, user.getBiography()); + writer.endObject(); + writer.endValue(); + + writer.endObject(); + + Connector conn = FrameworkUtil.getConnector(context, ALFRESCO_ENDPOINT_ID); + ConnectorContext c = new ConnectorContext(HttpMethod.POST); + c.setContentType("application/json"); + Response res = conn.call("/slingshot/profile/userprofile", c, + new ByteArrayInputStream(buf.toString().getBytes())); + if (Status.STATUS_OK != res.getStatus().getCode()) + { + throw new UserFactoryException("Remote error during User save: " + res.getStatus().getMessage()); + } + } + catch (IOException ioErr) + { + throw new UserFactoryException("IO error during User save: " + ioErr.getMessage(), ioErr); + } + catch (ConnectorServiceException cse) + { + throw new UserFactoryException("Configuration error during User save: " + cse.getMessage(), cse); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/TaskUtils.java b/share/src/main/java/org/alfresco/web/site/TaskUtils.java new file mode 100644 index 0000000000..395ac8a139 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/TaskUtils.java @@ -0,0 +1,39 @@ +package org.alfresco.web.site; + +import org.apache.commons.logging.Log; + +public class TaskUtils { + + public static void retry(int maxRetries, Task task) throws E { + retry(maxRetries, 0, null, task); + } + + public static void retry(int maxRetries, long waitTimeMs, Log logger, Task task) throws E { + while (maxRetries > 0) { + maxRetries--; + try { + task.run(); + } catch (Exception e) { + if (maxRetries == 0) { + try { + throw e; + } catch (Exception ignored) { // can't happen but just in case we wrap it in + throw new RuntimeException(e); + } + } + + if (logger != null) + logger.info("Attempt " + maxRetries + " failed", e); + try { + Thread.sleep(waitTimeMs); + } catch (InterruptedException ignored) { + logger.error(ignored.getMessage()); + } + } + } + } + + public interface Task { + void run() throws E; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/UrlUtil.java b/share/src/main/java/org/alfresco/web/site/UrlUtil.java new file mode 100644 index 0000000000..ee7f6f6ebb --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/UrlUtil.java @@ -0,0 +1,89 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import com.google.common.base.Strings; + +import java.io.Serializable; + +/** + * A simple structure that supplies the path to Alfresco Share and Alfresco Repository from JVM system properties. + * + * @author Alexandru Epure + */ +public class UrlUtil implements Serializable +{ + public static String alfrescoContext; + public static String alfrescoPort; + public static String alfrescoProtocol; + public static String alfrescoHost; + public static String alfrescoProxy; + public static String shareContext; + public static String sharePort; + public static String shareProtocol; + public static String shareHost; + public static String shareProxy; + + private final String repoURL; + private final String shareURL; + + public UrlUtil() + { + alfrescoContext = System.getProperty("alfresco.context"); + alfrescoPort = System.getProperty("alfresco.port"); + alfrescoProtocol = System.getProperty("alfresco.protocol"); + alfrescoHost = System.getProperty("alfresco.host"); + alfrescoProxy = System.getProperty("alfresco.proxy"); + shareContext = System.getProperty("share.context"); + sharePort = System.getProperty("share.port"); + shareProtocol = System.getProperty("share.protocol"); + shareHost = System.getProperty("share.host"); + shareProxy = System.getProperty("share.proxy"); + this.repoURL = getRepoURL(); + this.shareURL = getShareURL(); + } + + public String getRepoURL() + { + if (!Strings.isNullOrEmpty(alfrescoProxy)) + { + return alfrescoProxy; + } + if (!Strings.isNullOrEmpty(alfrescoProtocol) && !Strings.isNullOrEmpty(alfrescoHost) && !Strings.isNullOrEmpty(alfrescoPort)) + { + return alfrescoProtocol + "://" + alfrescoHost + ":" + alfrescoPort; + } + return ""; + } + + public String getShareURL() + { + if (!Strings.isNullOrEmpty(shareProxy)) + { + return shareProxy; + } + if (!Strings.isNullOrEmpty(shareProtocol) && !Strings.isNullOrEmpty(shareHost) && !Strings.isNullOrEmpty(sharePort)) + { + return shareProtocol + "://" + shareHost + ":" + sharePort; + } + return ""; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/UserDashboardInterceptor.java b/share/src/main/java/org/alfresco/web/site/UserDashboardInterceptor.java new file mode 100644 index 0000000000..85baf172ee --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/UserDashboardInterceptor.java @@ -0,0 +1,135 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +import org.alfresco.web.site.servlet.MTAuthenticationFilter; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.RequestContextUtil; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.WebFrameworkServiceRegistry; +import org.springframework.extensions.surf.exception.UserFactoryException; +import org.springframework.extensions.surf.mvc.AbstractWebFrameworkInterceptor; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.surf.util.URLDecoder; +import org.springframework.ui.ModelMap; +import org.springframework.web.context.request.WebRequest; + +/** + * Framework interceptor responsible for constructing user dashboards if one has not already + * been initialised and persisted for the current user. + * + * @author Kevin Roast + */ +public class UserDashboardInterceptor extends AbstractWebFrameworkInterceptor +{ + private static final Pattern PATTERN_DASHBOARD_PATH = Pattern.compile(".*/user/([^/]*)/dashboard"); + + /* (non-Javadoc) + * @see org.springframework.web.context.request.WebRequestInterceptor#preHandle(org.springframework.web.context.request.WebRequest) + */ + @Override + public void preHandle(WebRequest request) throws Exception + { + final RequestContext rc = ThreadLocalRequestContext.getRequestContext(); + final String pathInfo = rc.getUri(); + Matcher matcher; + if (pathInfo != null && (matcher = PATTERN_DASHBOARD_PATH.matcher(pathInfo)).matches()) + { + HttpServletRequest req = MTAuthenticationFilter.getCurrentServletRequest(); + if (req != null) + { + try + { + // init the user object so we can test the current user ID against the page uri + ServletUtil.setRequest(req); + RequestContextUtil.populateRequestContext(rc, req); + final String userid = rc.getUserId(); + + // test user dashboard page exists? + String usernameFromURL = URLDecoder.decode(matcher.group(1)); + if (isUserIDMatchingUsernameFromURL(userid, usernameFromURL)) + { + WebFrameworkServiceRegistry serviceRegistry = rc.getServiceRegistry(); + if (serviceRegistry.getModelObjectService().getPage("user/" + userid + "/dashboard") == null) + { + // no dashboard found! create initial dashboard for this user... + Map tokens = new HashMap(2); + tokens.put("userid", userid); + serviceRegistry.getPresetsManager().constructPreset("user-dashboard", tokens); + } + } + else + { + // reset the user context to ensure Guest or similar is not applied - this will avoid + // issues with SSO filters or similar that expect empty user after interceptor execution + rc.setUser(null); + rc.setPage(ThreadLocalRequestContext.getRequestContext().getRootPage()); + } + } + catch (UserFactoryException uerr) + { + // unable to generate the user dashboard - the user can still do this by visiting the index page + } + } + } + } + + private boolean isUserIDMatchingUsernameFromURL(final String userid, String usernameFromURL) + { + if (userid == null || usernameFromURL == null) + { + return false; + } + return shouldUseCaseSensitiveUsernameCompare() ? userid.equals(usernameFromURL) : userid.equalsIgnoreCase(usernameFromURL); + } + + private boolean shouldUseCaseSensitiveUsernameCompare() + { + // TODO we should probably make a request to the backend and + // ask for the value of "user.name.caseSensitive" property + // all though FileFolderServiceImpl.resolveNamePath and the simpleSearch method it uses + // does not seem to take into consideration the case of the user name + return false; + } + + /* (non-Javadoc) + * @see org.springframework.web.context.request.WebRequestInterceptor#postHandle(org.springframework.web.context.request.WebRequest, org.springframework.ui.ModelMap) + */ + @Override + public void postHandle(WebRequest request, ModelMap model) throws Exception + { + } + + /* (non-Javadoc) + * @see org.springframework.web.context.request.WebRequestInterceptor#afterCompletion(org.springframework.web.context.request.WebRequest, java.lang.Exception) + */ + @Override + public void afterCompletion(WebRequest request, Exception ex) throws Exception + { + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/AIMSFilter.java b/share/src/main/java/org/alfresco/web/site/servlet/AIMSFilter.java new file mode 100644 index 0000000000..cc51cd25d8 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/AIMSFilter.java @@ -0,0 +1,695 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.web.site.servlet.config.AIMSConfig; +import org.alfresco.web.site.servlet.config.CustomAuthorizationRequestResolver; +import org.alfresco.web.site.servlet.config.SecurityUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.context.ApplicationContext; +import org.springframework.extensions.surf.FrameworkUtil; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.exception.RequestContextException; +import org.springframework.extensions.surf.exception.UserFactoryException; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.support.AlfrescoUserFactory; +import org.springframework.extensions.surf.support.ServletRequestContextFactory; +import org.springframework.extensions.surf.support.ThreadLocalRequestContext; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.*; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.AuthenticationDetailsSource; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.client.ClientAuthorizationRequiredException; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationToken; +import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; +import org.springframework.security.oauth2.client.endpoint.DefaultRefreshTokenTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2RefreshTokenGrantRequest; +import org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserService; +import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; +import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2AuthorizationException; +import org.springframework.security.oauth2.core.OAuth2Error; +import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationExchange; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponse; +import org.springframework.security.oauth2.core.oidc.OidcIdToken; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.jwt.JwtDecoderFactory; +import org.springframework.security.oauth2.jwt.JwtException; +import org.springframework.security.web.DefaultRedirectStrategy; +import org.springframework.security.web.RedirectStrategy; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.security.web.savedrequest.HttpSessionRequestCache; +import org.springframework.security.web.savedrequest.RequestCache; +import org.springframework.security.web.savedrequest.SavedRequest; +import org.springframework.security.web.util.ThrowableAnalyzer; +import org.springframework.security.web.util.UrlUtils; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.context.request.ServletWebRequest; +import org.springframework.web.context.support.WebApplicationContextUtils; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.Collection; +import java.util.Base64; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.Objects; +import static org.alfresco.web.site.servlet.config.SecurityUtils.toMultiMap; +import static org.alfresco.web.site.servlet.config.SecurityUtils.isAuthorizationResponse; +import static org.alfresco.web.site.servlet.config.SecurityUtils.convert; + +public class AIMSFilter implements Filter +{ + private static final Log logger = LogFactory.getLog(AIMSFilter.class); + + private ApplicationContext context; + private ConnectorService connectorService; + private SlingshotLoginController loginController; + + private boolean enabled = false; + + public static final String ALFRESCO_ENDPOINT_ID = "alfresco"; + public static final String ALFRESCO_API_ENDPOINT_ID = "alfresco-api"; + + public static final String SHARE_PAGE = "/share/page"; + public static final String SHARE_AIMS_LOGOUT = "/share/page/aims/logout"; + + public static final String DEFAULT_AUTHORIZATION_REQUEST_BASE_URI = "/oauth2/authorization"; + private ClientRegistrationRepository clientRegistrationRepository; + private OAuth2AuthorizedClientService oauth2ClientService; + private final RedirectStrategy authorizationRedirectStrategy; + private OAuth2AuthorizationRequestResolver authorizationRequestResolver; + private RequestCache requestCache; + private AuthorizationRequestRepository authorizationRequestRepository; + private final AuthenticationDetailsSource authenticationDetailsSource = new WebAuthenticationDetailsSource(); + private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); + private final OAuth2AccessTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); + private final DefaultRefreshTokenTokenResponseClient refreshTokenResponseClient = new DefaultRefreshTokenTokenResponseClient(); + private ThrowableAnalyzer throwableAnalyzer; + private final JwtDecoderFactory jwtDecoderFactory = new OidcIdTokenDecoderFactory(); + private final GrantedAuthoritiesMapper authoritiesMapper = (authorities) -> { + return authorities; + }; + private final OAuth2UserService userService = new OidcUserService(); + private String clientId; + + public AIMSFilter() { + this.authorizationRedirectStrategy = new DefaultRedirectStrategy(); + } + /** + * Initialize the filter + * + * @param filterConfig + * @throws ServletException + */ + public void init(FilterConfig filterConfig) throws ServletException + { + // Info + if (logger.isInfoEnabled()) + { + logger.info("Initializing the AIMS filter."); + } + + this.context = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext()); + + AIMSConfig config = (AIMSConfig) this.context.getBean("aims.config"); + this.enabled = config.isEnabled(); + if(this.enabled) { + this.clientId=config.getResource(); + // OIDC Specific Setup + clientRegistrationRepository = context.getBean(ClientRegistrationRepository.class); + oauth2ClientService = context.getBean(OAuth2AuthorizedClientService.class); + this.requestCache = new HttpSessionRequestCache(); + this.authorizationRequestResolver = new CustomAuthorizationRequestResolver(clientRegistrationRepository, DEFAULT_AUTHORIZATION_REQUEST_BASE_URI); + this.authorizationRequestRepository = new HttpSessionOAuth2AuthorizationRequestRepository(); + this.throwableAnalyzer = new SecurityUtils.DefaultThrowableAnalyzer(); + } + this.connectorService = (ConnectorService) context.getBean("connector.service"); + this.loginController = (SlingshotLoginController) context.getBean("loginController"); + + // Info + if (logger.isInfoEnabled()) + { + logger.info("AIMS filter initialized."); + } + } + + /** + * @param sreq Servlet Request + * @param sres Servlet Response + * @param chain Filter Chain + * @throws IOException + * @throws ServletException + */ + public void doFilter(ServletRequest sreq, ServletResponse sres, + FilterChain chain) throws IOException, ServletException + { + HttpServletRequest request = (HttpServletRequest) sreq; + HttpServletResponse response = (HttpServletResponse) sres; + HttpSession session = request.getSession(); + boolean isAuthenticated = false; + /** + * check if authentication is done. + */ + if (null != session && + this.enabled) { + SecurityContext attribute = (SecurityContext) session.getAttribute( + HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); + if(null != attribute) { + isAuthenticated = attribute.getAuthentication().isAuthenticated(); + + /** + * Check if token existing token is valid or expired. + */ + if(isAuthenticated) { + try { + refreshToken(attribute, session); + } catch(Exception e) { + logger.error("Resulted in Error while doing refresh token " + e.getMessage()); + session.invalidate(); + if (!request.getRequestURI().contains(SHARE_AIMS_LOGOUT)) { + isAuthenticated = false; + } + } + } + } + } + + if (!isAuthenticated && + this.enabled && + (request.getRequestURI().contains(SHARE_PAGE) + || request.getRequestURI().contains(SHARE_AIMS_LOGOUT))) + { + /** + // Match the request that came from Idp (redirect uri) + */ + if (this.matchesAuthorizationResponse(request)) { + this.processAuthorizationResponse(request, response, session); + } else { + try { + this.requestCache.saveRequest(request, response); + OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestResolver + .resolve(request, this.clientId); + if (authorizationRequest != null) { + this.sendRedirectForAuthorization(request, response, authorizationRequest); + return; + } + } catch (Exception var11) { + this.unsuccessfulRedirectForAuthorization(response); + return; + } + + try { + chain.doFilter(request,response); + } catch (IOException var9) { + throw var9; + } catch (Exception var10) { + Throwable[] causeChain = this.throwableAnalyzer.determineCauseChain(var10); + ClientAuthorizationRequiredException authzEx = (ClientAuthorizationRequiredException) this.throwableAnalyzer.getFirstThrowableOfType(ClientAuthorizationRequiredException.class, causeChain); + if (authzEx != null) { + try { + OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestResolver.resolve(request, authzEx.getClientRegistrationId()); + if (authorizationRequest == null) { + throw authzEx; + } + + this.sendRedirectForAuthorization(request, response, authorizationRequest); + this.requestCache.saveRequest(request, response); + } catch (Exception var8) { + this.unsuccessfulRedirectForAuthorization(response); + } + + } else if (var10 instanceof ServletException) { + throw (ServletException) var10; + } else if (var10 instanceof RuntimeException) { + throw (RuntimeException) var10; + } else { + throw new RuntimeException(var10); + } + } + } + } + else + { + chain.doFilter(sreq, sres); + } + } + + /** + * + * @param request HTTP Servlet Request + * @param response HTTP Servlet Response + * @param session HTTP Session + * @param authenticationResult OAuth2LoginAuthenticationToken + */ + private void onSuccess(HttpServletRequest request, HttpServletResponse response, HttpSession session, + OAuth2LoginAuthenticationToken authenticationResult) + { + // Info + if (logger.isInfoEnabled()) + { + logger.info("Completing the AIMS authentication."); + } + + String username = authenticationResult.getPrincipal().getAttribute("preferred_username"); + String accessToken = authenticationResult.getAccessToken().getTokenValue(); + synchronized (this) + { + try + { + // Init request context for further use on getting user + this.initRequestContext(request, response); + + // Get the alfTicket from repo, using the JWT token from Idp + String alfTicket = this.getAlfTicket(session, username, accessToken); + if (alfTicket != null) + { + // Ensure User ID is in session so the web-framework knows we have logged in + session.setAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID, username); + session.setAttribute(UserFactory.SESSION_ATTRIBUTE_EXTERNAL_AUTH_AIMS, true); + + // Set the alfTicket into connector's session for further use on repo calls (will be set on the RemoteClient) + Connector connector = this.connectorService.getConnector(ALFRESCO_ENDPOINT_ID, username, session); + connector.getConnectorSession().setParameter(AlfrescoAuthenticator.CS_PARAM_ALF_TICKET, alfTicket); + + // Set credential username for further use on repo + // if there is no pass, as in our case, there will be a "X-Alfresco-Remote-User" header set using this value + CredentialVault vault = FrameworkUtil.getCredentialVault(session, username); + Credentials credentials = vault.newCredentials(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID); + credentials.setProperty(Credentials.CREDENTIAL_USERNAME, username); + vault.store(credentials); + + // Inform the Slingshot login controller of a successful login attempt as further processing may be required ? + this.loginController.beforeSuccess(request, response); + + // Initialise the user metadata object used by some web scripts + this.initUser(request); + + } + else + { + logger.error("Could not get an alfTicket from Repository."); + } + } + catch (Exception e) + { + throw new AlfrescoRuntimeException("Failed to complete AIMS authentication process.", e); + } + } + } + + /** + * Initialise the request context and request attributes for further use by some web scripts + * that require authentication + * + * @param request + * @throws RequestContextException + */ + private void initRequestContext(HttpServletRequest request, HttpServletResponse response) throws RequestContextException + { + RequestContext context = ThreadLocalRequestContext.getRequestContext(); + if (context == null) + { + ServletRequestContextFactory factory = + (ServletRequestContextFactory) this.context.getBean("webframework.factory.requestcontext.servlet"); + context = factory.newInstance(new ServletWebRequest(request)); + request.setAttribute(RequestContext.ATTR_REQUEST_CONTEXT, context); + } + + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request, response)); + ServletUtil.setRequest(request); + } + + /** + * Initialise the user meta data object and set it into the session and request context (_alf_USER_OBJECT) + * The user meta data object is used by web scripts that require authentication + * + * This is present in the filter for avoiding Basic Authentication prompt for those web scripts, + * when user access them and is logged out (see https://issues.alfresco.com/jira/browse/APPS-117) + * + * @param request + * @throws UserFactoryException + */ + private void initUser(HttpServletRequest request) throws UserFactoryException + { + RequestContext context = ThreadLocalRequestContext.getRequestContext(); + if (context != null && context.getUser() == null) + { + String userEndpointId = (String) context.getAttribute(RequestContext.USER_ENDPOINT); + UserFactory userFactory = context.getServiceRegistry().getUserFactory(); + User user = userFactory.initialiseUser(context, request, userEndpointId); + context.setUser(user); + } + } + + /** + * Get an alfTicket using the JWT token from Identity Service + * + * @param session HTTP Session + * @param username username + * @param accessToken access token + * @return The alfTicket + * @throws ConnectorServiceException + */ + private String getAlfTicket(HttpSession session, String username, String accessToken) throws ConnectorServiceException + { + // Info + if (logger.isInfoEnabled()) + { + logger.info("Retrieving the Alfresco Ticket from Repository."); + } + + String alfTicket = null; + Connector connector = this.connectorService.getConnector(ALFRESCO_API_ENDPOINT_ID, username, session); + ConnectorContext c = new ConnectorContext(HttpMethod.GET, null, Collections.singletonMap("Authorization", "Bearer " + accessToken)); + c.setContentType("application/json"); + Response r = connector.call("/-default-/public/authentication/versions/1/tickets/-me-?noCache=" + UUID.randomUUID().toString(), c); + + if (Status.STATUS_OK != r.getStatus().getCode()) + { + if (logger.isErrorEnabled()) + { + logger.error("Failed to retrieve Alfresco Ticket from Repository."); + } + } + else + { + // Parse the alfTicket + JSONObject json = new JSONObject(r.getText()); + try + { + alfTicket = json.getJSONObject("entry").getString("id"); + } + catch (JSONException e) + { + if (logger.isErrorEnabled()) + { + logger.error("Failed to parse Alfresco Ticket from Repository response."); + } + } + } + + return alfTicket; + } + + private boolean matchesAuthorizationResponse(HttpServletRequest request) { + MultiValueMap params = toMultiMap(request.getParameterMap()); + if (!isAuthorizationResponse(params)) { + return false; + } else { + OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestRepository + .loadAuthorizationRequest(request); + if (authorizationRequest == null) { + return false; + } else { + UriComponents requestUri = UriComponentsBuilder.fromUriString(UrlUtils.buildFullRequestUrl(request)).build(); + UriComponents redirectUri = UriComponentsBuilder.fromUriString(authorizationRequest.getRedirectUri()).build(); + Set>> requestUriParameters = new LinkedHashSet(requestUri.getQueryParams().entrySet()); + Set>> redirectUriParameters = new LinkedHashSet(redirectUri.getQueryParams().entrySet()); + requestUriParameters.retainAll(redirectUriParameters); + return Objects.equals(requestUri.getScheme(), redirectUri.getScheme()) && + Objects.equals(requestUri.getUserInfo(), redirectUri.getUserInfo()) && + Objects.equals(requestUri.getHost(), redirectUri.getHost()) && + Objects.equals(requestUri.getPort(), redirectUri.getPort()) && + Objects.equals(requestUri.getPath(), redirectUri.getPath()) && + Objects.equals(requestUriParameters.toString(), redirectUriParameters.toString()); + } + } + } + + private synchronized void processAuthorizationResponse(HttpServletRequest request, HttpServletResponse response, HttpSession session) + throws IOException { + /** + * Construct Authorization Request & Response + */ + OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestRepository + .removeAuthorizationRequest(request, response); + MultiValueMap params = toMultiMap(request.getParameterMap()); + String redirectUri = UrlUtils.buildFullRequestUrl(request); + OAuth2AuthorizationResponse authorizationResponse = convert(params, redirectUri); + + ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId(this.clientId); + + /** + * Prepare Authentication Request to get Authentication Result + */ + OAuth2LoginAuthenticationToken authenticationRequest = new OAuth2LoginAuthenticationToken(clientRegistration, + new OAuth2AuthorizationExchange(authorizationRequest,authorizationResponse)); + authenticationRequest.setDetails(this.authenticationDetailsSource.buildDetails(request)); + OAuth2LoginAuthenticationToken authenticationResult; + try { + authenticationResult = (OAuth2LoginAuthenticationToken)this.authenticate(authenticationRequest); + } catch (OAuth2AuthorizationException var16) { + OAuth2Error error = var16.getError(); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(authorizationRequest + .getRedirectUri()).queryParam("error", new Object[]{error.getErrorCode()}); + if (!StringUtils.isEmpty(error.getDescription())) { + uriBuilder.queryParam("error_description", new Object[]{error.getDescription()}); + } + if (!StringUtils.isEmpty(error.getUri())) { + uriBuilder.queryParam("error_uri", new Object[]{error.getUri()}); + } + this.redirectStrategy.sendRedirect(request, response, uriBuilder.build().encode().toString()); + return; + } + + /** + * Add Authentication Result in Security Context and save the User + */ + SecurityContextHolder.clearContext(); + SecurityContextHolder.getContext().setAuthentication(authenticationResult); + Authentication currentAuthentication = SecurityContextHolder.getContext().getAuthentication(); + String principalName = currentAuthentication != null ? currentAuthentication.getPrincipal().toString() : "anonymousUser"; + + OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(authenticationResult.getClientRegistration(), + principalName, authenticationResult.getAccessToken(), authenticationResult.getRefreshToken()); + this.oauth2ClientService.saveAuthorizedClient(authorizedClient, currentAuthentication); + + /** + * Save the Security Context in Session + */ + String redirectUrl = authorizationRequest.getRedirectUri(); + + /** + * Retrieve the Cached Page Request before authentication and now after Authentication redirect to the Page. + */ + SavedRequest savedRequest = this.requestCache.getRequest(request, response); + + /** + * Retrieve the Cached Page Request before authentication and now after Authentication redirect to the Page. + */ + session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, + SecurityContextHolder.getContext()); + + if (SecurityContextHolder.getContext() != null && !AuthenticationUtil.isAuthenticated(request)) + { + this.onSuccess(request, response, session, authenticationResult); + } + + if (savedRequest != null) { + redirectUrl = savedRequest.getRedirectUrl(); + this.requestCache.removeRequest(request, response); + } + this.redirectStrategy.sendRedirect(request, response, redirectUrl); + } + + /** + * Performs the Authentication based on Authentication Request + */ + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + OAuth2LoginAuthenticationToken authorizationCodeAuthentication = (OAuth2LoginAuthenticationToken)authentication; + if (!authorizationCodeAuthentication.getAuthorizationExchange().getAuthorizationRequest().getScopes().contains("openid")) { + return null; + } else { + OAuth2AuthorizationRequest authorizationRequest = authorizationCodeAuthentication.getAuthorizationExchange().getAuthorizationRequest(); + OAuth2AuthorizationResponse authorizationResponse = authorizationCodeAuthentication.getAuthorizationExchange().getAuthorizationResponse(); + if (authorizationResponse.statusError()) { + throw new OAuth2AuthenticationException(authorizationResponse.getError(), authorizationResponse.getError().toString()); + } else if (!authorizationResponse.getState().equals(authorizationRequest.getState())) { + OAuth2Error oauth2Error = new OAuth2Error("invalid_state_parameter"); + throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString()); + } else { + OAuth2AccessTokenResponse accessTokenResponse; + try { + accessTokenResponse = this.accessTokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(authorizationCodeAuthentication.getClientRegistration(), authorizationCodeAuthentication.getAuthorizationExchange())); + } catch (OAuth2AuthorizationException var14) { + OAuth2Error oauth2Error = var14.getError(); + throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString()); + } + + ClientRegistration clientRegistration = authorizationCodeAuthentication.getClientRegistration(); + Map additionalParameters = accessTokenResponse.getAdditionalParameters(); + if (!additionalParameters.containsKey("id_token")) { + OAuth2Error invalidIdTokenError = new OAuth2Error("invalid_id_token", "Missing (required) ID Token in Token Response for Client Registration: " + clientRegistration.getRegistrationId(), (String)null); + throw new OAuth2AuthenticationException(invalidIdTokenError, invalidIdTokenError.toString()); + } else { + OidcIdToken idToken = this.createOidcToken(clientRegistration, accessTokenResponse); + String requestNonce = authorizationRequest.getAttribute("nonce"); + if (requestNonce != null) { + String nonceHash; + OAuth2Error oauth2Error; + try { + nonceHash = createHash(requestNonce); + } catch (NoSuchAlgorithmException var13) { + oauth2Error = new OAuth2Error("invalid_nonce"); + throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString()); + } + + String nonceHashClaim = idToken.getNonce(); + if (nonceHashClaim == null || !nonceHashClaim.equals(nonceHash)) { + oauth2Error = new OAuth2Error("invalid_nonce"); + throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString()); + } + } + + OidcUser oidcUser = this.userService.loadUser(new OidcUserRequest(clientRegistration, accessTokenResponse.getAccessToken(), idToken, additionalParameters)); + Collection mappedAuthorities = this.authoritiesMapper.mapAuthorities(oidcUser.getAuthorities()); + OAuth2LoginAuthenticationToken authenticationResult = new OAuth2LoginAuthenticationToken(authorizationCodeAuthentication.getClientRegistration(), authorizationCodeAuthentication.getAuthorizationExchange(), oidcUser, mappedAuthorities, accessTokenResponse.getAccessToken(), accessTokenResponse.getRefreshToken()); + authenticationResult.setDetails(authorizationCodeAuthentication.getDetails()); + return authenticationResult; + } + } + } + } + + private OidcIdToken createOidcToken(ClientRegistration clientRegistration, OAuth2AccessTokenResponse accessTokenResponse) { + JwtDecoder jwtDecoder = this.jwtDecoderFactory.createDecoder(clientRegistration); + + Jwt jwt; + try { + jwt = jwtDecoder.decode((String)accessTokenResponse.getAdditionalParameters().get("id_token")); + } catch (JwtException var7) { + OAuth2Error invalidIdTokenError = new OAuth2Error("invalid_id_token", var7.getMessage(), (String)null); + throw new OAuth2AuthenticationException(invalidIdTokenError, invalidIdTokenError.toString(), var7); + } + + OidcIdToken idToken = new OidcIdToken(jwt.getTokenValue(), jwt.getIssuedAt(), jwt.getExpiresAt(), jwt.getClaims()); + return idToken; + } + + static String createHash(String nonce) throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(nonce.getBytes(StandardCharsets.US_ASCII)); + return Base64.getUrlEncoder().withoutPadding().encodeToString(digest); + } + + private void sendRedirectForAuthorization(HttpServletRequest request, HttpServletResponse response, OAuth2AuthorizationRequest authorizationRequest) throws IOException { + if (AuthorizationGrantType.AUTHORIZATION_CODE.equals(authorizationRequest.getGrantType())) { + this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request, response); + } + this.authorizationRedirectStrategy.sendRedirect(request, response, authorizationRequest.getAuthorizationRequestUri()); + } + + private void unsuccessfulRedirectForAuthorization(HttpServletResponse response) throws IOException { + response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()); + } + + private synchronized void refreshToken(SecurityContext attribute, HttpSession session) { + OAuth2LoginAuthenticationToken oAuth2LoginAuthenticationToken = (OAuth2LoginAuthenticationToken)attribute.getAuthentication(); + /** + * do something to get new access token + */ + ClientRegistration clientRegistration = oAuth2LoginAuthenticationToken.getClientRegistration(); + /** + * Call Auth server token endpoint to refresh token. + */ + OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest( + clientRegistration, oAuth2LoginAuthenticationToken.getAccessToken(), oAuth2LoginAuthenticationToken.getRefreshToken()); + OAuth2AccessTokenResponse accessTokenResponse = this.refreshTokenResponseClient + .getTokenResponse(refreshTokenGrantRequest); + /** + * Convert id_token to OidcToken. + */ + OidcIdToken idToken = createOidcToken(clientRegistration, accessTokenResponse); + /** + * Since I have already implemented a custom OidcUserService, reuse existing + * code to get new user. + */ + OidcUser oidcUser = this.userService.loadUser(new OidcUserRequest(clientRegistration, + accessTokenResponse.getAccessToken(), idToken, accessTokenResponse.getAdditionalParameters())); + + /** + * Create new authentication(OAuth2LoginAuthenticationToken). + */ + Collection mappedAuthorities = this.authoritiesMapper.mapAuthorities(oidcUser.getAuthorities()); + OAuth2LoginAuthenticationToken authenticationResult = new OAuth2LoginAuthenticationToken(clientRegistration, oAuth2LoginAuthenticationToken.getAuthorizationExchange(), + oidcUser, mappedAuthorities, accessTokenResponse.getAccessToken(), accessTokenResponse.getRefreshToken()); + authenticationResult.setDetails(oAuth2LoginAuthenticationToken.getDetails()); + /** + * Update access_token and refresh_token by saving new authorized client. + */ + OAuth2AuthorizedClient updatedAuthorizedClient = new OAuth2AuthorizedClient(clientRegistration, + oAuth2LoginAuthenticationToken.getName(), accessTokenResponse.getAccessToken(), + accessTokenResponse.getRefreshToken()); + this.oauth2ClientService.saveAuthorizedClient(updatedAuthorizedClient, authenticationResult); + /** + * Set new authentication in SecurityContextHolder. + */ + attribute.setAuthentication(authenticationResult); + session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, + attribute); + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/AIMSLogoutController.java b/share/src/main/java/org/alfresco/web/site/servlet/AIMSLogoutController.java new file mode 100644 index 0000000000..bf6345dcc5 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/AIMSLogoutController.java @@ -0,0 +1,111 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import org.alfresco.web.site.servlet.config.AIMSConfig; +import org.springframework.context.ApplicationContext; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.mvc.LogoutController; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.web.context.support.WebApplicationContextUtils; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.AbstractController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +public class AIMSLogoutController extends AbstractController +{ + protected AIMSConfig config; + protected LogoutController logoutController; + private ApplicationContext applicationContext; + private AIMSLogoutHandler aimsLogoutHandler; + /** + * + * @param config + */ + public void setConfig(AIMSConfig config) { this.config = config; } + + /** + * + * @param logoutController + */ + public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; } + + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) + throws Exception + { + if (config.isEnabled()) + { + // Handle callback from Identity Service + if (request.getParameter("success") != null) + { + // Do the Share logout + logoutController.handleRequestInternal(request, response); + + doRedirect(response, request.getContextPath()); + } + else + { + this.applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(super.getServletContext()); + this.aimsLogoutHandler = this.applicationContext.getBean(AIMSLogoutHandler.class); + // Redirect the user to Identity Service logout endpoint + HttpSession session = request.getSession(false); + if (session != null) + { + String userId = (String) session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID); + if (userId != null) + { + SecurityContext account = (SecurityContext) session + .getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); + + // Build the url for Identity Service Front-Channel logout + if (account != null) + try { + aimsLogoutHandler + .handle(request, response, account.getAuthentication()); + } catch (IOException | ServletException e) { + throw new RuntimeException(e); + } + } + } + } + } + return null; + } + + /** + * + * @param response + * @param location + */ + protected void doRedirect(HttpServletResponse response, String location) + { + response.setStatus(301); + response.setHeader("Location", location); + response.setHeader("Cache-Control", "max-age=0"); + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/AIMSLogoutHandler.java b/share/src/main/java/org/alfresco/web/site/servlet/AIMSLogoutHandler.java new file mode 100644 index 0000000000..f1f899e807 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/AIMSLogoutHandler.java @@ -0,0 +1,111 @@ +package org.alfresco.web.site.servlet; + +import org.alfresco.web.site.servlet.config.AIMSConfig; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.security.web.DefaultRedirectStrategy; +import org.springframework.security.web.RedirectStrategy; +import org.springframework.security.web.util.UrlUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.Collections; + +@Component("aimslogouthandler") +public class AIMSLogoutHandler { + + private static final Log logger = LogFactory.getLog(AIMSLogoutHandler.class); + private String clientId; + @Autowired(required = false) + private ClientRegistrationRepository clientRegistrationRepository; + @Autowired + private AIMSConfig aimsConfig; + private String postLogoutRedirectUri; + private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); + + protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + String targetUrl = null; + ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId(aimsConfig.getResource()); + URI endSessionEndpoint = this.endSessionEndpoint(clientRegistration); + if (endSessionEndpoint != null) { + String idToken = this.idToken(authentication); + URI postLogoutRedirectUri = this.postLogoutRedirectUri(request,clientRegistration); + targetUrl = this.endpointUri(endSessionEndpoint, idToken, postLogoutRedirectUri); + } + return targetUrl; + } + + private URI endSessionEndpoint(ClientRegistration clientRegistration) { + URI result = null; + if (clientRegistration != null) { + Object endSessionEndpoint = clientRegistration.getProviderDetails().getConfigurationMetadata().get("end_session_endpoint"); + if (endSessionEndpoint != null) { + result = URI.create(endSessionEndpoint.toString()); + } + } + return result; + } + + private String idToken(Authentication authentication) { + return ((OidcUser)authentication.getPrincipal()).getIdToken().getTokenValue(); + } + + private URI postLogoutRedirectUri(HttpServletRequest request,ClientRegistration clientRegistration) { + if (clientRegistration != null) { + String postLogoutEndpoint = (String)clientRegistration.getProviderDetails().getConfigurationMetadata().get("post_redirect_uri"); + UriComponents uriComponents = UriComponentsBuilder + .fromHttpUrl(UrlUtils.buildFullRequestUrl(request)).replacePath(request.getContextPath()).replaceQuery(null).fragment(null).build(); + if (postLogoutEndpoint == null) { + return UriComponentsBuilder.fromUriString(request.getRequestURL() + "?success").buildAndExpand(Collections.singletonMap("baseUrl", uriComponents.toUriString())).toUri(); + } else { + return UriComponentsBuilder.fromUriString(postLogoutEndpoint).buildAndExpand(Collections.singletonMap("baseUrl", uriComponents.toUriString())).toUri(); + } + } + return null; + } + + private String endpointUri(URI endSessionEndpoint, String idToken, URI postLogoutRedirectUri) { + UriComponentsBuilder builder = UriComponentsBuilder.fromUri(endSessionEndpoint); + builder.queryParam("id_token_hint", new Object[]{idToken}); + if (postLogoutRedirectUri != null) { + builder.queryParam("post_logout_redirect_uri", new Object[]{postLogoutRedirectUri}); + } + + return builder.encode(StandardCharsets.UTF_8).build().toUriString(); + } + + /** @deprecated */ + @Deprecated + public void setPostLogoutRedirectUri(URI postLogoutRedirectUri) { + Assert.notNull(postLogoutRedirectUri, "postLogoutRedirectUri cannot be null"); + this.postLogoutRedirectUri = postLogoutRedirectUri.toASCIIString(); + } + + public void setPostLogoutRedirectUri(String postLogoutRedirectUri) { + Assert.notNull(postLogoutRedirectUri, "postLogoutRedirectUri cannot be null"); + this.postLogoutRedirectUri = postLogoutRedirectUri; + } + + public void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + String targetUrl = this.determineTargetUrl(request, response, authentication); + logger.debug("Value of targetUrl is: " + targetUrl); + if (response.isCommitted()) { + logger.error("Can't perform the redirect for the targetUrl: " + targetUrl); + } else { + this.redirectStrategy.sendRedirect(request, response, targetUrl); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/KerberosSessionSetupPrivilegedAction.java b/share/src/main/java/org/alfresco/web/site/servlet/KerberosSessionSetupPrivilegedAction.java new file mode 100644 index 0000000000..7c6f1fb376 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/KerberosSessionSetupPrivilegedAction.java @@ -0,0 +1,140 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import java.security.PrivilegedAction; + +import org.alfresco.jlan.server.auth.kerberos.KerberosDetails; +import org.alfresco.jlan.server.auth.spnego.OID; +import org.alfresco.util.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.ietf.jgss.GSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; +import org.springframework.extensions.surf.util.Base64; + +/** + * Session Setup Privileged Action Class. Handle the processing of a received SPNEGO packet in the context of the Web + * tier. Prepares a SPNEGO packet for delegate authentication with the Repository tier. Contributed by Sylvain Chambon + * and based on the work of gkspencer. + * + * @author gkspencer + * @author Sylvain Chambon + */ +public class KerberosSessionSetupPrivilegedAction implements PrivilegedAction> { + + private static final Log logger = LogFactory.getLog(KerberosSessionSetupPrivilegedAction.class); + + // Received security blob details + + private byte[] m_secBlob; + private int m_secOffset; + private int m_secLen; + + // (this) server account name + + private String m_accountName; + + // service principal to use on the backend + + private String endpointSPN; + + /** + * Class constructor + * + * @param accountName String + * @param secBlob byte[] + */ + public KerberosSessionSetupPrivilegedAction(String accountName, byte[] secBlob, String endpointSPN) { + + m_accountName = accountName; + + m_secBlob = secBlob; + m_secOffset = 0; + m_secLen = secBlob.length; + this.endpointSPN = endpointSPN; + } + + /** + * Run the privileged action + */ + public Pair run() { + + KerberosDetails krbDetails = null; + + try { + GSSManager gssManager = GSSManager.getInstance(); + GSSName serverGSSName = gssManager.createName(m_accountName, GSSName.NT_USER_NAME); + GSSCredential serverGSSCreds = gssManager.createCredential(serverGSSName, GSSCredential.INDEFINITE_LIFETIME, OID.KERBEROS5, + GSSCredential.ACCEPT_ONLY); + + GSSContext serverGSSContext = gssManager.createContext(serverGSSCreds); + + // Accept the incoming security blob and generate the response blob + + byte[] respBlob = serverGSSContext.acceptSecContext(m_secBlob, m_secOffset, m_secLen); + + // Create the Kerberos response details + + krbDetails = new KerberosDetails(serverGSSContext.getSrcName(), serverGSSContext.getTargName(), respBlob); + + + byte[] tokenForEndpoint = new byte[0]; + + + //check if the credentials can be delegated + + if (!serverGSSContext.getCredDelegState()) { + logger.warn("credentials can not be delegated!"); + return null; + } + + //get the delegated credentials from the calling peer... + GSSCredential clientCred = serverGSSContext.getDelegCred(); + + //now create the spnego token to send to the endpoint: + GSSName gssServerName = gssManager.createName(endpointSPN, GSSName.NT_USER_NAME); + + // ALF-6284 fix, IBM J9 VM doesn't allow initiate SPNEGO context using KERBEROS5 credential, + // so we should initiate KERBEROS5 context + Oid kerberosMechOid = OID.KERBEROS5; + //...and create a new context pretending to be the caller + GSSContext clientContext = gssManager.createContext(gssServerName.canonicalize(kerberosMechOid), kerberosMechOid, clientCred, GSSContext.DEFAULT_LIFETIME); + + // could be necessary + clientContext.requestCredDeleg(true); + // create a SPNEGO token for the target server + tokenForEndpoint = clientContext.initSecContext(tokenForEndpoint, 0, tokenForEndpoint.length); + + return new Pair(krbDetails, Base64.encodeBytes(tokenForEndpoint, Base64.DONT_BREAK_LINES)); + } + catch (GSSException ex) { + logger.warn("Caught GSS Error", ex); + } + + // Return the Kerberos response + return null; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/MTAuthenticationFilter.java b/share/src/main/java/org/alfresco/web/site/servlet/MTAuthenticationFilter.java new file mode 100644 index 0000000000..35f96d3ff8 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/MTAuthenticationFilter.java @@ -0,0 +1,103 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import java.io.IOException; +import java.util.Enumeration; +import java.util.Locale; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.alfresco.web.site.SlingshotPageViewResolver; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.webscripts.ui.common.StringUtils; + +/** + * Filter providing access to the servlet request for the {@link SlingshotPageViewResolver} + * downstream. This enables the user context to be bound to the RequestContext earlier in the + * SpringSurf lifecycle than would normally be available. This is essential for MT authentication + * as resolving the view name from the page url requires a remote call, which for MT must be + * authenticated (even for authentication=none webscripts) to resolve the correct Tenant. + * + * @author Kevin Roast + */ +public class MTAuthenticationFilter implements Filter +{ + /** Thread local holder of the HttpServletRequest */ + private static ThreadLocal requestHolder = new ThreadLocal(); + + private static final String ACCEPT_LANGUAGE_HEADER = "Accept-Language"; + + /* (non-Javadoc) + * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) + */ + public void init(FilterConfig config) throws ServletException + { + } + + /* (non-Javadoc) + * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) + */ + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException + { + if (req instanceof HttpServletRequest) + { + requestHolder.set((HttpServletRequest)req); + + if (((HttpServletRequest) req).getHeader(ACCEPT_LANGUAGE_HEADER) == null) + { + req = new SlingshotServletRequestWrapper((HttpServletRequest) req); + ((SlingshotServletRequestWrapper) req).addHeader(ACCEPT_LANGUAGE_HEADER, "en_US"); + } + } + try + { + chain.doFilter(req, res); + } + finally + { + requestHolder.remove(); + } + } + + /** + * @return HttpServletRequest for the current thread + */ + public static HttpServletRequest getCurrentServletRequest() + { + return requestHolder.get(); + } + + /* (non-Javadoc) + * @see javax.servlet.Filter#destroy() + */ + public void destroy() + { + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SSOAuthenticationFilter.java b/share/src/main/java/org/alfresco/web/site/servlet/SSOAuthenticationFilter.java new file mode 100644 index 0000000000..44c2c9d9d9 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SSOAuthenticationFilter.java @@ -0,0 +1,1530 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.jlan.server.auth.kerberos.KerberosDetails; +import org.alfresco.jlan.server.auth.ntlm.*; +import org.alfresco.jlan.server.auth.spnego.NegTokenInit; +import org.alfresco.jlan.server.auth.spnego.NegTokenTarg; +import org.alfresco.jlan.server.auth.spnego.OID; +import org.alfresco.jlan.server.auth.spnego.SPNEGO; +import org.alfresco.util.Pair; +import org.alfresco.util.log.NDC; +import org.alfresco.web.site.servlet.config.AIMSConfig; +import org.alfresco.web.site.servlet.config.KerberosConfigElement; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.config.ConfigService; +import org.springframework.extensions.config.RemoteConfigElement; +import org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor; +import org.springframework.extensions.surf.RequestContext; +import org.springframework.extensions.surf.RequestContextUtil; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.exception.PlatformRuntimeException; +import org.springframework.extensions.surf.mvc.PageViewResolver; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.surf.types.Page; +import org.springframework.extensions.surf.util.Base64; +import org.springframework.extensions.webscripts.Description.RequiredAuthentication; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorContext; +import org.springframework.extensions.webscripts.connector.ConnectorService; +import org.springframework.extensions.webscripts.connector.Response; +import org.springframework.extensions.webscripts.servlet.DependencyInjectedFilter; +import org.springframework.web.util.WebUtils; + +import javax.security.auth.Subject; +import javax.security.auth.callback.*; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; +import javax.security.sasl.RealmCallback; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.alfresco.web.site.SlingshotPageView.REDIRECT_QUERY; +import static org.alfresco.web.site.SlingshotPageView.REDIRECT_URI; + +/** + * SSO Authentication Filter Class for web-tier, supporting NTLM and Kerberos challenges from the repository tier. + * Thanks to Sylvain Chambon for contributing the Kerberos delegation code. + * + * @author Kevin Roast + * @author gkspencer + * @author Sylvain Chambon + * @author dward + */ +public class SSOAuthenticationFilter implements DependencyInjectedFilter, CallbackHandler, ApplicationContextAware +{ + private static Log logger = LogFactory.getLog(SSOAuthenticationFilter.class); + + // Authentication request/response headers + private static final String AUTH_NTLM = "NTLM"; + private static final String AUTH_SPNEGO = "Negotiate"; + private static final String HEADER_WWWAUTHENTICATE = "WWW-Authenticate"; + private static final String HEADER_AUTHORIZATION = "Authorization"; + private static final String HEADER_ACCEPT_LANGUAGE = "Accept-Language"; + + // NTLM authentication session object names + private static final String NTLM_AUTH_DETAILS = "_alfwfNTLMDetails"; + + // Kerberos authentication session object flag (Firefox and Chrome hack for MNT-15561) + private static final String AUTH_BY_KERBEROS = "_alfAuthByKerberos"; + + private static final String MIME_HTML_TEXT = "text/html"; + + private static final String PAGE_SERVLET_PATH = "/page"; + private static final String LOGIN_PATH_INFORMATION = "/dologin"; + private static final String LOGIN_PARAMETER = "login"; + private static final String ERROR_PARAMETER = "error"; + private static final String UNAUTHENTICATED_ACCESS_PROXY = "/proxy/alfresco-noauth"; + private static final String PAGE_VIEW_RESOLVER = "pageViewResolver"; + + private ApplicationContext context; + + private ConnectorService connectorService; + private String endpoint; + private String userHeader; + private Pattern userIdPattern; + private SlingshotLoginController loginController; + + // Kerberos settings + // + // Account name and password for server ticket + // + // The account name *must* be built from the HTTP server name, in the format : + // + // HTTP/@ + // + // (NB this is because the web browser requests an ST for the + // HTTP/ principal in the current realm, so if we're to decode + // that ST, it has to match.) + + private String krbAccountName; + private String krbPassword; + + // Kerberos realm and KDC address + + private String krbRealm; + + // Service Principal Name to use on the endpoint + // This must be like: HTTP/host.name@REALM + + private String krbEndpointSPN; + + // Login configuration entry name + private String jaasLoginEntryName; + + // Server login context + private LoginContext jaasLoginContext; + + // A Boolean which when true strips the @domain sufix from Kerberos authenticated usernames. Default is true. + private boolean stripUserNameSuffix; + + /** + * Initialize the filter + */ + public void init() + { + if (logger.isDebugEnabled()) + logger.debug("Initializing the SSOAuthenticationFilter."); + + this.loginController = (SlingshotLoginController) context.getBean("loginController"); + + // retrieve the connector service + this.connectorService = (ConnectorService) context.getBean("connector.service"); + + ConfigService configService = (ConfigService) context.getBean("web.config"); + + // Retrieve the remote configuration + RemoteConfigElement remoteConfig = (RemoteConfigElement) configService.getConfig("Remote").getConfigElement("remote"); + if (remoteConfig == null) + { + logger.error("There is no Remote configuration element. This is required to use SSOAuthenticationFilter."); + return; + } + + // get the endpoint id to use + if (this.endpoint == null) + { + logger.error("There is no 'endpoint' property in the SSOAuthenticationFilter bean parameters. Cannot initialise filter."); + return; + } + + // Get the endpoint descriptor and check if external auth is enabled + EndpointDescriptor endpointDescriptor = remoteConfig.getEndpointDescriptor(endpoint); + if (endpointDescriptor == null || !endpointDescriptor.getExternalAuth()) + { + if (logger.isDebugEnabled()) + logger.debug("No External Auth endpoint configured for " + endpoint); + + // endpoint is set via bean config - so if no config is using the filter we disable it now + this.endpoint = null; + + return; + } + + try + { + Connector conn = this.connectorService.getConnector(endpoint); + + if (logger.isDebugEnabled()) + logger.debug("Endpoint is " + endpoint); + + // Obtain the userHeader (if configured) from the alfresco connector + this.userHeader = conn.getConnectorSession().getParameter(SlingshotAlfrescoConnector.CS_PARAM_USER_HEADER); + String userIdPattern = conn.getConnectorSession().getParameter(SlingshotAlfrescoConnector.CS_PARAM_USER_ID_PATTERN); + if (userIdPattern != null) + { + this.userIdPattern = Pattern.compile(userIdPattern); + } + if (logger.isDebugEnabled()) + { + logger.debug("userHeader is " + userHeader); + logger.debug("userIdPattern is " + userIdPattern); + } + } + catch (ConnectorServiceException e) + { + logger.error("Unable to find connector " + endpointDescriptor.getConnectorId() + " for the endpoint " + endpoint, e); + } + + // Retrieve the optional kerberos configuration + this.initKerberos(configService); + + if (logger.isInfoEnabled()) + logger.info("SSOAuthenticationFilter initialised."); + } + + /** + * + * @param configService + */ + private void initKerberos(ConfigService configService) { + KerberosConfigElement config = (KerberosConfigElement) configService.getConfig("Kerberos").getConfigElement("kerberos"); + if (config != null) + { + if (logger.isDebugEnabled()) + logger.debug("Found configuration for Kerberos authentication."); + // Get the Kerberos realm + String krbRealm = config.getRealm(); + if ( krbRealm != null && krbRealm.length() > 0) + { + if (logger.isDebugEnabled()) + logger.debug("Found Kerberos realm: " + krbRealm); + // Set the Kerberos realm + this.krbRealm = krbRealm; + } + else + throw new AlfrescoRuntimeException("Kerberos realm not specified"); + + // Get the HTTP service account password + String srvPassword = config.getPassword(); + if ( srvPassword != null && srvPassword.length() > 0) + { + // Set the HTTP service account password + this.krbPassword = srvPassword; + } + else + throw new AlfrescoRuntimeException("HTTP service account password not specified"); + + + String krbEndpointSPN = config.getEndpointSPN(); + if ( krbEndpointSPN != null && krbEndpointSPN.length() > 0) + { + // Set the Service Principal Name to use on the endpoint + if (logger.isDebugEnabled()) + logger.debug("The Service Principal Name to use on the endpoint: " + krbEndpointSPN); + this.krbEndpointSPN = krbEndpointSPN; + } + else + throw new AlfrescoRuntimeException("endpoint service principal name not specified"); + + // Get the login configuration entry name + String loginEntry = config.getLoginEntryName(); + + if (loginEntry != null) + { + if ( loginEntry.length() > 0) + { + // Set the login configuration entry name to use + if (logger.isDebugEnabled()) + logger.debug("The login configuration entry name to use: " + loginEntry); + jaasLoginEntryName = loginEntry; + } + else + throw new AlfrescoRuntimeException("Invalid login entry specified"); + } + + // Get the login stripUserNameSuffix property + boolean stripUserNameSuffix = config.getStripUserNameSuffix(); + + // Set the login configuration entry name to use + if (logger.isDebugEnabled()) + logger.debug("The stripUserNameSuffix property is set to: " + stripUserNameSuffix); + this.stripUserNameSuffix = stripUserNameSuffix; + + // Create a login context for the HTTP server service + try + { + // Login the HTTP server service + jaasLoginContext = new LoginContext( jaasLoginEntryName, this); + jaasLoginContext.login(); + + // DEBUG + if ( logger.isDebugEnabled()) + logger.debug( "HTTP Kerberos login successful"); + } + catch ( LoginException ex) + { + // DEBUG + if ( logger.isErrorEnabled()) + logger.error("HTTP Kerberos web filter error", ex); + + throw new AlfrescoRuntimeException("Failed to login HTTP server service"); + } + + // Get the HTTP service account name from the subject + Subject subj = jaasLoginContext.getSubject(); + Principal princ = subj.getPrincipals().iterator().next(); + + krbAccountName = princ.getName(); + + // DEBUG + if ( logger.isDebugEnabled()) + logger.debug("Logged on using principal " + krbAccountName); + } + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) + { + this.context = applicationContext; + } + + public void setEndpoint(String endpoint) + { + this.endpoint = endpoint; + } + + /** + * Wraps an {@link HttpServletRequest} if an HTTP header has been configured for + * use by an external SSO system to provide the name of an authenticated user. + * The wrapper's {@link #getRemoteUser} returns the value of the header but will + * defaults to the wrapped method's value if the header is not set. + * @param sreq original {@code ServletRequest} + * @return either the original {@code sreq} or a wrapped {@code HttpServletRequest} + */ + protected ServletRequest wrapHeaderAuthenticatedRequest(ServletRequest sreq) + { + if (userHeader != null && sreq instanceof HttpServletRequest) + { + final HttpServletRequest req = (HttpServletRequest) sreq; + sreq = new HttpServletRequestWrapper(req) + { + @Override + public String getRemoteUser() + { + // MNT-11041 Share SSOAuthenticationFilter and non-ascii username strings + String remoteUser = req.getHeader(userHeader); + if (remoteUser != null) + { + if (!org.apache.commons.codec.binary.Base64.isBase64(remoteUser)) + { + try + { + remoteUser = new String(remoteUser.getBytes("ISO-8859-1"), "UTF-8"); + } + catch (UnsupportedEncodingException e) + { + // TODO + } + } + remoteUser = extractUserFromProxyHeader(remoteUser); + } + else + { + remoteUser = super.getRemoteUser(); + } + return remoteUser; + } + + /** + * Extracts a user ID from the proxy header. If a user ID pattern has been configured returns the contents of the + * first matching regular expression group or null. Otherwise returns the trimmed header contents or + * null. + */ + private String extractUserFromProxyHeader(String userId) + { + if (userIdPattern == null) + { + userId = userId.trim(); + } + else + { + Matcher matcher = userIdPattern.matcher(userId); + if (matcher.matches()) + { + userId = matcher.group(1).trim(); + } + else + { + return null; + } + } + return userId.length() == 0 ? null : userId; + } + }; + } + return sreq; + } + + @Override + public void doFilter(ServletContext context, ServletRequest request, + ServletResponse response, FilterChain chain) throws IOException, + ServletException + { + doFilter(request, response, chain); + } + + + /** + * Run the filter + * + * @param sreq ServletRequest + * @param sresp ServletResponse + * @param chain FilterChain + * + * @exception IOException + * @exception ServletException + */ + public void doFilter(ServletRequest sreq, ServletResponse sresp, FilterChain chain) + throws IOException, ServletException + { + // Skip this filter, if AIMS is enabled + boolean skip = false; + try + { + AIMSConfig aimsConfig = (AIMSConfig) this.context.getBean("aims.config"); + if (aimsConfig.isEnabled()) + { + skip = true; + } + } + catch (BeansException e) + { + if (logger.isErrorEnabled()) + { + logger.error(e); + } + } + + // If AIMS filter is enabled, skip this filter + if (skip == true) + { + chain.doFilter(sreq, sresp); + return; + } + + NDC.remove(); + NDC.push(Thread.currentThread().getName()); + final boolean debug = logger.isDebugEnabled(); + + // Wrap externally authenticated requests that provide the user in an HTTP header + // with one that returns the correct name from getRemoteUser(). For use in our own + // calls to this method and any chained filters. + sreq = wrapHeaderAuthenticatedRequest(sreq); + + // Bypass the filter if we don't have an endpoint with external auth enabled + if (this.endpoint == null) + { + if (debug) + logger.debug("There is no endpoint with external auth enabled."); + chain.doFilter(sreq, sresp); + return; + } + + // Get the HTTP request/response/session + HttpServletRequest req = (HttpServletRequest)sreq; + HttpServletResponse res = (HttpServletResponse)sresp; + HttpSession session = req.getSession(); + + if (req.getServletPath() != null && req.getServletPath().startsWith(UNAUTHENTICATED_ACCESS_PROXY)) + { + if (debug) + logger.debug("SSO is by-passed for unauthenticated access endpoint."); + chain.doFilter(sreq, sresp); + return; + } + + if (debug) logger.debug("Processing request " + req.getRequestURI() + " SID:" + session.getId()); + + // Login page or login submission + String pathInfo = req.getPathInfo(); + if (PAGE_SERVLET_PATH.equals(req.getServletPath()) + && (LOGIN_PATH_INFORMATION.equals(pathInfo) || pathInfo == null + && LOGIN_PARAMETER.equals(req.getParameter("pt")))) + { + if (debug) + logger.debug("Login page requested, chaining ..."); + + // Chain to the next filter + chain.doFilter(sreq, sresp); + return; + } + + // initialize a new request context + RequestContext context = null; + try + { + // perform a "silent" init - i.e. no user creation or remote connections + context = RequestContextUtil.initRequestContext(this.context, req, true); + } + catch (Exception ex) + { + logger.error("Error calling initRequestContext", ex); + throw new ServletException(ex); + } + + // get the page from the model if any - it may not require authentication + Page page = context.getPage(); + if (page == null && pathInfo != null) + { + // we didn't find a page - this may be a top-level URL call - so attempt to manually resolve the page + PageViewResolver pageViewResolver = (PageViewResolver)this.context.getBean(PAGE_VIEW_RESOLVER); + if (pageViewResolver != null) + { + try + { + // as a side-effect of resolving the view ID into an View object + // the Page context will be updated on the request context for us + if (pageViewResolver.resolveViewName(pathInfo, null) != null) + { + page = context.getPage(); + } + } + catch (Exception e) + { + // OK to fall back to null page reference if this happens + } + } + } + if (page != null && page.getAuthentication() == RequiredAuthentication.none) + { + if (logger.isDebugEnabled()) + logger.debug("Unauthenticated page requested - skipping auth filter..."); + chain.doFilter(sreq, sresp); + return; + } + + // If userHeader (X-Alfresco-Remote-User or similar) external auth - does not require a challenge/response + if (this.userHeader != null) + { + String userId = AuthenticationUtil.getUserId(req); + if (userId != null && req.getRemoteUser() != null) + { + if (logger.isDebugEnabled()) + logger.debug("userHeader external auth - skipping auth filter..."); + setExternalAuthSession(session); + onSuccess(req, res, session, req.getRemoteUser()); + chain.doFilter(sreq, sresp); + return; + } + else + { + // initial external user login requires a ping check to authenticate remote Session + challengeOrPassThrough(chain, req, res, session); + return; + } + } + + // Check if there is an authorization header with a challenge response + String authHdr = req.getHeader(HEADER_AUTHORIZATION); + + // We are not passing on a challenge response and we have sufficient client session information + if (authHdr == null && AuthenticationUtil.isAuthenticated(req)) + { + if (debug) + logger.debug("Touching the repo to ensure we still have an authenticated session."); + challengeOrPassThrough(chain, req, res, session); + return; + } + + // Check the authorization header + if (authHdr == null) + { + if (debug) logger.debug("New auth request from " + req.getRemoteHost() + " (" + + req.getRemoteAddr() + ":" + req.getRemotePort() + ")"); + challengeOrPassThrough(chain, req, res, session); + return; + } + // SPNEGO / Kerberos authentication + else if (authHdr.startsWith(AUTH_SPNEGO) && this.krbRealm != null) + { + if (debug) + logger.debug("Processing SPNEGO / Kerberos authentication."); + // Decode the received SPNEGO blob and validate + + final byte[] spnegoByts = Base64.decode( authHdr.substring(10).getBytes()); + + // Check if the client sent an NTLMSSP blob + + if ( isNTLMSSPBlob( spnegoByts, 0)) + { + if ( logger.isDebugEnabled()) + logger.debug( "Client sent an NTLMSSP security blob"); + + // Restart the authentication + restartAuthProcess(session, req, res, AUTH_SPNEGO); + return; + } + + // Check the received SPNEGO token type + + int tokType = -1; + + try + { + tokType = SPNEGO.checkTokenType( spnegoByts, 0, spnegoByts.length); + } + catch ( IOException ex) + { + } + + // Check for a NegTokenInit blob + + if ( tokType == SPNEGO.NegTokenInit) + { + if (debug) + logger.debug("Parsing the SPNEGO security blob to get the Kerberos ticket."); + + NegTokenInit negToken = new NegTokenInit(); + + try + { + // Decode the security blob + + negToken.decode( spnegoByts, 0, spnegoByts.length); + + // Determine the authentication mechanism the client is using and logon + + String oidStr = null; + if ( negToken.numberOfOids() > 0) + oidStr = negToken.getOidAt( 0).toString(); + + if ( oidStr != null && (oidStr.equals( OID.ID_MSKERBEROS5) || oidStr.equals(OID.ID_KERBEROS5))) + { + if (debug) + logger.debug("Kerberos logon."); + // Kerberos logon + + if ( doKerberosLogon( negToken, req, res, session) != null) + { + // Allow the user to access the requested page + + chain.doFilter( req, res); + if ( logger.isDebugEnabled()) + logger.debug("Request processing ended"); + } + else + { + // Send back a request for SPNEGO authentication + + restartAuthProcess(session, req, res, AUTH_SPNEGO); + } + } + else + { + // Unsupported mechanism, e.g. NegoEx + + if ( logger.isDebugEnabled()) + logger.debug( "Unsupported SPNEGO mechanism " + oidStr); + + // Try again! + + restartAuthProcess(session, req, res, AUTH_SPNEGO); + } + } + catch ( IOException ex) + { + // Log the error + + if ( logger.isDebugEnabled()) + logger.debug(ex); + } + } + else + { + // Unknown SPNEGO token type + + if ( logger.isDebugEnabled()) + logger.debug( "Unknown SPNEGO token type"); + + // Send back a request for SPNEGO authentication + + restartAuthProcess(session, req, res, AUTH_SPNEGO); + } + } + // NTLM authentication + else if (authHdr.startsWith(AUTH_NTLM)) + { + if (debug) + logger.debug("Processing NTLM authentication."); + // Decode the received NTLM blob and validate + final byte[] authHdrByts = authHdr.substring(5).getBytes(); + final byte[] ntlmByts = Base64.decode(authHdrByts); + int ntlmTyp = NTLMMessage.isNTLMType(ntlmByts); + Object sessionMutex = WebUtils.getSessionMutex(session); + + if (ntlmTyp == NTLM.Type1) + { + if (debug) + logger.debug("Process the type 1 NTLM message."); + Type1NTLMMessage type1Msg = new Type1NTLMMessage(ntlmByts); + synchronized (sessionMutex) + { + processType1(type1Msg, req, res, session); + } + } + else if (ntlmTyp == NTLM.Type3) + { + if (debug) + logger.debug("Process the type 3 NTLM message."); + Type3NTLMMessage type3Msg = new Type3NTLMMessage(ntlmByts); + synchronized (sessionMutex) + { + processType3(type3Msg, req, res, session, chain); + } + } + else + { + if (debug) logger.debug("NTLM not handled, redirecting to login page"); + + redirectToLoginPage(req, res); + } + } + // Possibly basic auth - allow through + else + { + if (debug) + logger.debug("Processing Basic Authentication."); + // ACE-3257 fix, it looks like basic auth header was sent. + // However lets check for presence of remote_user CGI variable in AJP. + // If remote user is not null then it most likely that apache proxy with mod_auth_basic module is used + if (AuthenticationUtil.isAuthenticated(req) || req.getRemoteUser() != null) + { + if (debug) + logger.debug("Ensuring the session is still valid."); + challengeOrPassThrough(chain, req, res, session); + } + else + { + if (debug) + logger.debug("Establish a new session or bring up the login page."); + chain.doFilter(req, res); + } + } + } + + /** + * Removes all attributes stored in session + * + * @param session Session + */ + @SuppressWarnings("unchecked") + private void clearSession(HttpSession session) + { + if (logger.isDebugEnabled()) + logger.debug("Clearing the session."); + Enumeration names = (Enumeration) session.getAttributeNames(); + while (names.hasMoreElements()) + { + session.removeAttribute(names.nextElement()); + } + } + + /** + * JAAS callback handler + * + * @param callbacks Callback[] + * @exception IOException + * @exception UnsupportedCallbackException + */ + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException + { + if (logger.isDebugEnabled()) + logger.debug("Processing the JAAS callback list of " + callbacks.length + " items."); + for (int i = 0; i < callbacks.length; i++) + { + // Request for user name + + if (callbacks[i] instanceof NameCallback) + { + if (logger.isDebugEnabled()) + logger.debug("Request for user name."); + NameCallback cb = (NameCallback) callbacks[i]; + cb.setName(krbAccountName); + } + + // Request for password + else if (callbacks[i] instanceof PasswordCallback) + { + if (logger.isDebugEnabled()) + logger.debug("Request for password."); + PasswordCallback cb = (PasswordCallback) callbacks[i]; + cb.setPassword(krbPassword.toCharArray()); + } + + // Request for realm + + else if (callbacks[i] instanceof RealmCallback) + { + if (logger.isDebugEnabled()) + logger.debug("Request for realm."); + RealmCallback cb = (RealmCallback) callbacks[i]; + cb.setText(krbRealm); + } + else + { + throw new UnsupportedCallbackException(callbacks[i]); + } + } + } + + private void challengeOrPassThrough(FilterChain chain, HttpServletRequest req, HttpServletResponse res, HttpSession session) throws IOException, ServletException + { + try + { + // In this mode we can only use vaulted credentials. Do not proxy any request headers. + String userId = AuthenticationUtil.getUserId(req); + + if (userId == null) + { + // If we are as yet unauthenticated but have external authentication, do a ping check as the external user. + // This will either establish the session or throw us out to log in as someone else! + userId = req.getRemoteUser(); + // Set the external auth flag so the UI knows we are using SSO etc. + session.setAttribute(UserFactory.SESSION_ATTRIBUTE_EXTERNAL_AUTH, Boolean.TRUE); + if (userId != null && logger.isDebugEnabled()) + { + logger.debug("Initial login from externally authenticated user " + userId); + } + + if (userId == null && this.krbRealm == null) + { + // MNT-18402 : redirect to login page, when using SSO bypass link + redirectToLoginPage(req, res); + } + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Validating repository session for " + userId); + } + + if (userId != null && !userId.equalsIgnoreCase(req.getRemoteUser()) && session.getAttribute(NTLM_AUTH_DETAILS) == null + && session.getAttribute(AUTH_BY_KERBEROS) == null) // Firefox & Chrome hack for MNT-15561 + { + session.removeAttribute(UserFactory.SESSION_ATTRIBUTE_EXTERNAL_AUTH); + } + + Connector conn = connectorService.getConnector(this.endpoint, userId, session); + + // ALF-10785: We must pass through the language header to set up the session in the correct locale + ConnectorContext ctx; + if (req.getHeader(HEADER_ACCEPT_LANGUAGE) != null) + { + if (logger.isDebugEnabled()) + logger.debug("Accept-Language header present: " + req.getHeader(HEADER_ACCEPT_LANGUAGE)); + ctx = new ConnectorContext(null, Collections.singletonMap(HEADER_ACCEPT_LANGUAGE, req.getHeader(HEADER_ACCEPT_LANGUAGE))); + } + else + { + ctx = new ConnectorContext(); + } + + Response remoteRes = conn.call("/touch", ctx); + if (Status.STATUS_UNAUTHORIZED == remoteRes.getStatus().getCode()) + { + if (logger.isDebugEnabled()) + { + logger.debug("Repository session timed out - restarting auth process..."); + } + + String authHdr = remoteRes.getStatus().getHeaders().get(HEADER_WWWAUTHENTICATE); + if (authHdr != null) + { + // restart SSO login as the repo has timed us out + restartAuthProcess(session, req, res, authHdr); + } + else + { + // Don't invalidate the session if we've already got external authentication - it may result in us + // having to reauthenticate externally too! + if (req.getRemoteUser() == null) + { + try + { + session.invalidate(); + } + catch (IllegalStateException e) + { + // may already been invalidated elsewhere + } + } + // restart manual login + redirectToLoginPage(req, res); + } + return; + } + else + { + onSuccess(req, res, session, userId); + + // we have local auth in the session and the repo session is also valid + // this means we do not need to perform any further auth handshake + if (logger.isDebugEnabled()) + { + logger.debug("Authentication not required, chaining ..."); + } + + chain.doFilter(req, res); + return; + } + } + catch (ConnectorServiceException cse) + { + throw new PlatformRuntimeException("Incorrectly configured endpoint ID: " + this.endpoint); + } + } + + /* (non-Javadoc) + * @see javax.servlet.Filter#destroy() + */ + public void destroy() + { + } + + /** + * Return the non-proxied headers for an NTLM /touch request + * + * @param conn Connector + * + * @return the headers required for the request - if any + */ + private Map getConnectionHeaders(Connector conn) + { + Map headers = new HashMap(4); + headers.put("user-agent", ""); + if (conn.getConnectorSession().getCookie("JSESSIONID") == null) + { + // Ensure we do not proxy over the Session ID from the browser request: + // If Alfresco and SURF app are deployed into the same app-server and user is + // user same browser instance to access both apps then we could get wrong session ID! + headers.put("Cookie", null); + } + + // ALF-12278: Prevent the copying over of headers specific to a POST request on to the touch GET request + headers.put("Content-Type", null); + headers.put("Content-Length", null); + return headers; + } + + /** + * Restart the authentication process for NTLM or Kerberos - clear current security details + */ + private void restartAuthProcess(HttpSession session, HttpServletRequest req, HttpServletResponse res, String authHdr) throws IOException + { + if (logger.isDebugEnabled()) + logger.debug("Restarting " + authHdr + " authentication."); + + // Clear any cached logon details from the sessiom + clearSession(session); + setRedirectUrl(req); + + // restart the authentication process for NTLM + res.setHeader(HEADER_WWWAUTHENTICATE, authHdr); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + res.setContentType(MIME_HTML_TEXT); + + final PrintWriter out = res.getWriter(); + out.println(""); + out.println(""); + out.println("

Please log in.

"); + out.println(""); + out.close(); + + res.flushBuffer(); + } + + /** + * Process a type 1 NTLM message + * + * @param type1Msg Type1NTLMMessage + * @param req HttpServletRequest + * @param res HttpServletResponse + * @param session HttpSession + * + * @exception IOException + */ + private void processType1(Type1NTLMMessage type1Msg, HttpServletRequest req, HttpServletResponse res, + HttpSession session) throws IOException + { + if (logger.isDebugEnabled()) + logger.debug("Received type1 " + type1Msg); + + // Get the existing NTLM details + NTLMLogonDetails ntlmDetails = (NTLMLogonDetails)session.getAttribute(NTLM_AUTH_DETAILS); + + // Check if cached logon details are available + if (ntlmDetails != null && ntlmDetails.hasType2Message()) + { + // Get the authentication server type2 response + Type2NTLMMessage cachedType2 = ntlmDetails.getType2Message(); + + byte[] type2Bytes = cachedType2.getBytes(); + String ntlmBlob = "NTLM " + new String(Base64.encodeBytes(type2Bytes, Base64.DONT_BREAK_LINES)); + + if (logger.isDebugEnabled()) + logger.debug("Sending cached NTLM type2 to client - " + cachedType2); + + // Send back a request for NTLM authentication + res.setHeader(HEADER_WWWAUTHENTICATE, ntlmBlob); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + res.flushBuffer(); + } + else + { + // Clear any cached logon details + session.removeAttribute(NTLM_AUTH_DETAILS); + + try + { + Connector conn = this.connectorService.getConnector(this.endpoint, session); + ConnectorContext ctx = new ConnectorContext(null, getConnectionHeaders(conn)); + Response remoteRes = conn.call("/touch", ctx, req, null); + if (Status.STATUS_UNAUTHORIZED == remoteRes.getStatus().getCode()) + { + String authHdr = remoteRes.getStatus().getHeaders().get(HEADER_WWWAUTHENTICATE); + if (authHdr.startsWith(AUTH_NTLM) && authHdr.length() > 4) + { + // Decode the received NTLM blob and validate + final byte[] authHdrByts = authHdr.substring(5).getBytes(); + final byte[] ntlmByts = Base64.decode(authHdrByts); + int ntlmType = NTLMMessage.isNTLMType(ntlmByts); + if (ntlmType == NTLM.Type2) + { + // Retrieve the type2 NTLM message + Type2NTLMMessage type2Msg = new Type2NTLMMessage(ntlmByts); + + // Store the NTLM logon details, cache the type2 message, and token if using passthru + ntlmDetails = new NTLMLogonDetails(); + ntlmDetails.setType2Message(type2Msg); + session.setAttribute(NTLM_AUTH_DETAILS, ntlmDetails); + + if (logger.isDebugEnabled()) + logger.debug("Sending NTLM type2 to client - " + type2Msg); + + // Send back a request for NTLM authentication + byte[] type2Bytes = type2Msg.getBytes(); + String ntlmBlob = "NTLM " + new String(Base64.encodeBytes(type2Bytes, Base64.DONT_BREAK_LINES)); + + res.setHeader(HEADER_WWWAUTHENTICATE, ntlmBlob); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + res.flushBuffer(); + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected NTLM message type from repository: NTLMType" + ntlmType); + redirectToLoginPage(req, res); + } + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected response from repository: WWW-Authenticate:" + authHdr); + redirectToLoginPage(req, res); + } + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected response from repository: " + remoteRes.getStatus().getMessage()); + redirectToLoginPage(req, res); + } + } + catch (ConnectorServiceException cse) + { + throw new PlatformRuntimeException("Incorrectly configured endpoint ID: " + this.endpoint); + } + } + } + + /** + * Process a type 3 NTLM message + * + * @param type3Msg Type3NTLMMessage + * @param req HttpServletRequest + * @param res HttpServletResponse + * @param session HttpSession + * @param chain FilterChain + * @exception IOException + * @exception ServletException + */ + private void processType3(Type3NTLMMessage type3Msg, HttpServletRequest req, HttpServletResponse res, + HttpSession session, FilterChain chain) throws IOException, ServletException + { + if (logger.isDebugEnabled()) + logger.debug("Received type3 " + type3Msg); + + // Get the existing NTLM details + NTLMLogonDetails ntlmDetails = (NTLMLogonDetails) session.getAttribute(NTLM_AUTH_DETAILS); + String userId = AuthenticationUtil.getUserId(req); + + // Get the NTLM logon details + String userName = type3Msg.getUserName(); + String workstation = type3Msg.getWorkstation(); + String domain = type3Msg.getDomain(); + + boolean authenticated = false; + + // Check if we are using cached details for the authentication + if (userId != null && ntlmDetails != null && ntlmDetails.hasNTLMHashedPassword()) + { + // Check if the received NTLM hashed password matches the cached password + byte[] ntlmPwd = type3Msg.getNTLMHash(); + byte[] cachedPwd = ntlmDetails.getNTLMHashedPassword(); + + if (ntlmPwd != null) + { + if (ntlmPwd.length == cachedPwd.length) + { + authenticated = true; + for (int i = 0; i < ntlmPwd.length; i++) + { + if (ntlmPwd[i] != cachedPwd[i]) + { + authenticated = false; + break; + } + } + } + } + + if (logger.isDebugEnabled()) + logger.debug("Using cached NTLM hash, authenticated = " + authenticated); + + if (!authenticated) + { + restartAuthProcess(session, req, res, AUTH_NTLM); + } + else + { + // Allow the user to access the requested page + chain.doFilter(req, res); + } + } + else + { + try + { + Connector conn = this.connectorService.getConnector(this.endpoint, session); + ConnectorContext ctx = new ConnectorContext(null, getConnectionHeaders(conn)); + Response remoteRes = conn.call("/touch", ctx, req, null); + if (Status.STATUS_UNAUTHORIZED == remoteRes.getStatus().getCode()) + { + String authHdr = remoteRes.getStatus().getHeaders().get(HEADER_WWWAUTHENTICATE); + if (authHdr.equals(AUTH_NTLM)) + { + // authentication failed on repo side - being login process again + // check for "chrome" since Chrome user-agent contains a Safari version + String userAgent = req.getHeader("user-agent"); + if (userAgent != null && userAgent.indexOf("Safari") != -1 && userAgent.indexOf("Chrome") == -1) + { + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + final PrintWriter out = res.getWriter(); + out.println(""); + out.println("

Login authentication failed. Please close and re-open Safari to try again.

"); + out.println(""); + out.close(); + } + else + { + restartAuthProcess(session, req, res, authHdr); + } + res.flushBuffer(); + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected response from repository: WWW-Authenticate:" + authHdr); + redirectToLoginPage(req, res); + } + } + else if (Status.STATUS_OK == remoteRes.getStatus().getCode() || + Status.STATUS_TEMPORARY_REDIRECT == remoteRes.getStatus().getCode()) + { + // + // NTLM login successful - Update the NTLM logon details in the session + // + if (ntlmDetails == null) + { + // No cached NTLM details + ntlmDetails = new NTLMLogonDetails(userName, workstation, domain, false, null); + ntlmDetails.setNTLMHashedPassword(type3Msg.getNTLMHash()); + session.setAttribute(NTLM_AUTH_DETAILS, ntlmDetails); + + if (logger.isDebugEnabled()) + logger.debug("No cached NTLM details, created"); + } + else + { + // Update the cached NTLM details + ntlmDetails.setDetails(userName, workstation, domain, false, null); + ntlmDetails.setNTLMHashedPassword(type3Msg.getNTLMHash()); + + if (logger.isDebugEnabled()) + logger.debug("Updated cached NTLM details"); + } + + if (logger.isDebugEnabled()) + logger.debug("User logged on via NTLM, " + ntlmDetails); + + setExternalAuthSession(session); + onSuccess(req, res, session, userName); + + // Allow the user to access the requested page + chain.doFilter(req, res); + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected response from repository: " + remoteRes.getStatus().getMessage()); + redirectToLoginPage(req, res); + } + } + catch (ConnectorServiceException cse) + { + throw new PlatformRuntimeException("Incorrectly configured endpoint: " + this.endpoint); + } + } + } + + /** + * Redirect to the root of the website - ignore further SSO auth requests + */ + private void redirectToLoginPage(HttpServletRequest req, HttpServletResponse res) throws IOException + { + if (logger.isDebugEnabled()) + logger.debug("Redirecting to the login page."); + + if (PAGE_SERVLET_PATH.equals(req.getServletPath())) + { + // redirect via full page redirect + setRedirectUrl(req); + + String error = req.getParameter(ERROR_PARAMETER); + res.sendRedirect(req.getContextPath() + "/page?pt=login" + (error == null ? "" : "&" + ERROR_PARAMETER + "=" + error)); + } + else + { + // redirect via 401 response code handled by XHR processing on the client + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + res.flushBuffer(); + } + } + + /** + * Check if a security blob starts with the NTLMSSP signature + * + * @param byts byte[] + * @param offset int + * @return boolean + */ + private boolean isNTLMSSPBlob( byte[] byts, int offset) + { + // Check if the blob has the NTLMSSP signature + + boolean isNTLMSSP = false; + + if (( byts.length - offset) >= NTLM.Signature.length) { + + if (logger.isDebugEnabled()) + logger.debug("Checking if the blob has the NTLMSSP signature."); + // Check for the NTLMSSP signature + + int idx = 0; + while ( idx < NTLM.Signature.length && byts[offset + idx] == NTLM.Signature[ idx]) + idx++; + + if ( idx == NTLM.Signature.length) + isNTLMSSP = true; + } + + return isNTLMSSP; + } + + /** + * Perform a Kerberos login and return an SPNEGO response + * + * @param negToken NegTokenInit + * @param req HttpServletRequest + * @param resp HttpServletResponse + * @param httpSess HttpSession + * @return NegTokenTarg + */ + @SuppressWarnings("unchecked") + private NegTokenTarg doKerberosLogon( NegTokenInit negToken, HttpServletRequest req, HttpServletResponse resp, HttpSession httpSess) + { + // Authenticate the user + + KerberosDetails krbDetails = null; + NegTokenTarg negTokenTarg = null; + + try + { + // Run the session setup as a privileged action + + KerberosSessionSetupPrivilegedAction sessSetupAction = new KerberosSessionSetupPrivilegedAction( + krbAccountName, negToken.getMechtoken(), krbEndpointSPN); + + Object result = Subject.doAs( jaasLoginContext.getSubject(), sessSetupAction); + + if ( result != null) + { + // Access the Kerberos response + Pair resultPair = (Pair)result; + + krbDetails = resultPair.getFirst(); + String tokenForEndpoint = resultPair.getSecond(); + + // Create the NegTokenTarg response blob + + negTokenTarg = new NegTokenTarg( SPNEGO.AcceptCompleted, OID.KERBEROS5, krbDetails.getResponseToken()); + + // Check if the user has been authenticated, if so then setup the user environment + + if ( negTokenTarg != null) + { + String userName = stripUserNameSuffix ? krbDetails.getUserName() : krbDetails.getSourceName(); + + // Debug + if ( logger.isDebugEnabled()) + logger.debug("User " + userName + " logged on via Kerberos; attempting to log on to Alfresco then"); + + boolean authenticated = doKerberosDelegateLogin(req, resp, httpSess, userName, tokenForEndpoint); + if (!authenticated) { + return null; + } + else + { + // Firefox and Chrome hack (MNT-15561): + // These browsers only send the authorization header (SPNEGO - Kerberos) once + // (when redirecting to /share/page/user//dashboard only Internet Explorer will send the header again). + // Therefore we need to have some way of knowing that the previous authentication was done using Kerberos, + // otherwise we'll end-up having problems like MNT-15561 ('Logout' button is still present in spite of SSO being set). + httpSess.setAttribute(AUTH_BY_KERBEROS, true); + } + } + } + else + { + // Debug + + if ( logger.isDebugEnabled()) + logger.debug( "No SPNEGO response, Kerberos logon failed"); + } + } + catch (Exception ex) + { + // Log the error + + if ( logger.isDebugEnabled()) + logger.debug("Kerberos logon error", ex); + } + + // Return the response SPNEGO blob + + return negTokenTarg; + } + + private boolean doKerberosDelegateLogin(HttpServletRequest req, HttpServletResponse res, HttpSession session, String userName, String tokenForEndpoint) throws IOException { + + try + { + Connector conn = connectorService.getConnector(this.endpoint, session); + ConnectorContext ctx; + + // ALF-10785: We must pass through the language header to set up the session in the correct locale + if (req.getHeader(HEADER_ACCEPT_LANGUAGE) != null) + { + if (logger.isDebugEnabled()) + logger.debug("Accept-Language header present: " + req.getHeader(HEADER_ACCEPT_LANGUAGE)); + Map headers = new HashMap(7); + headers.put(HEADER_ACCEPT_LANGUAGE, req.getHeader(HEADER_ACCEPT_LANGUAGE)); + + ctx = new ConnectorContext(null, headers); + } + else + { + ctx = new ConnectorContext(); + } + + Response remoteRes = conn.call("/touch", ctx); + if (Status.STATUS_UNAUTHORIZED == remoteRes.getStatus().getCode()) + { + String authHdr = remoteRes.getStatus().getHeaders().get(HEADER_WWWAUTHENTICATE); + if (authHdr.equals(AUTH_SPNEGO)) + { + Map headers = new HashMap(7); + headers.put(HEADER_AUTHORIZATION, AUTH_SPNEGO + ' ' + tokenForEndpoint); + + if (req.getHeader(HEADER_ACCEPT_LANGUAGE) != null) + { + headers.put(HEADER_ACCEPT_LANGUAGE, req.getHeader(HEADER_ACCEPT_LANGUAGE)); + } + + ctx = new ConnectorContext(null, headers); + remoteRes = conn.call("/touch", ctx); + + if (Status.STATUS_OK == remoteRes.getStatus().getCode() || + Status.STATUS_TEMPORARY_REDIRECT == remoteRes.getStatus().getCode()) + { + if (logger.isDebugEnabled()) + logger.debug("Authentication succeeded on the repo side."); + + setExternalAuthSession(session); + onSuccess(req, res, session, userName); + } + else if (Status.STATUS_UNAUTHORIZED == remoteRes.getStatus().getCode()) + { + if (logger.isDebugEnabled()) + logger.debug("Authentication failed on repo side - beging login process again."); + res.setHeader(HEADER_WWWAUTHENTICATE, authHdr); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + + res.flushBuffer(); + } + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected response from repository: WWW-Authenticate:" + authHdr); + return false; + } + } + else if (Status.STATUS_OK == remoteRes.getStatus().getCode() || + Status.STATUS_TEMPORARY_REDIRECT == remoteRes.getStatus().getCode()) + { + if (logger.isDebugEnabled()) + logger.debug("Authentication succeeded on the repo side."); + + setExternalAuthSession(session); + onSuccess(req, res, session, userName); + } + else + { + if (logger.isDebugEnabled()) + logger.debug("Unexpected response from repository: " + remoteRes.getStatus().getMessage()); + return false; + } + } + catch (ConnectorServiceException cse) + { + throw new AlfrescoRuntimeException("Incorrectly configured endpoint: " + this.endpoint); + } + + return true; + } + + /** + * Set the {@link org.alfresco.web.site.SlingshotPageView#REDIRECT_URI} + *
and {@link org.alfresco.web.site.SlingshotPageView#REDIRECT_QUERY} + *
parameters to the session. + * + * @param req + */ + private void setRedirectUrl(HttpServletRequest req) + { + HttpSession session = req.getSession(); + session.setAttribute(REDIRECT_URI, req.getRequestURI()); + if (req.getQueryString() != null) + { + session.setAttribute(REDIRECT_QUERY, req.getQueryString()); + } + } + + /** + * Set the external auth Session flag so the UI knows we are using SSO. + * A number of elements in an application may depend on this state e.g. Logout button shown etc. + * + * @param session + */ + private void setExternalAuthSession(HttpSession session) + { + session.setAttribute(UserFactory.SESSION_ATTRIBUTE_EXTERNAL_AUTH, Boolean.TRUE); + } + + /** + * Success login method handler. + * + * @param req current http request + * @param res current http response + * @param session current session + * @param username logged in user name + */ + private void onSuccess(HttpServletRequest req, HttpServletResponse res, HttpSession session, String username) + { + // Ensure User ID is in session so the web-framework knows we have logged in + session.setAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID, username); + + try + { + // Inform the Slingshot login controller of a successful login attempt as further processing may be required + this.loginController.beforeSuccess(req, res); + } + catch (Exception e) + { + throw new AlfrescoRuntimeException("Error during loginController.onSuccess()", e); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotAlfrescoConnector.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotAlfrescoConnector.java new file mode 100644 index 0000000000..682e49eb70 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotAlfrescoConnector.java @@ -0,0 +1,235 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.extensions.config.RemoteConfigElement.ConnectorDescriptor; +import org.springframework.extensions.surf.ServletUtil; +import org.springframework.extensions.webscripts.RequestCachingConnector; +import org.springframework.extensions.webscripts.connector.AlfrescoConnector; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorContext; +import org.springframework.extensions.webscripts.connector.ConnectorService; +import org.springframework.extensions.webscripts.connector.ConnectorSession; +import org.springframework.extensions.webscripts.connector.RemoteClient; + +/** + * Extends the {@link AlfrescoConnector} to allow the connection from Share + * to the Alfresco Repository to use a configurable HTTP header for the + * authenticated user name. Allows both Share and Repository to use the same + * HTTP header, when an external SSO is unable to provide the user name in the + * default Alfresco Repository header {@code "X-Alfresco-Remote-User"}. + *

+ * The user name from the header is also used by {@link SSOAuthenticationFilter} + * for incoming request to Share to return the user name from + * {@link HttpServletRequest#getRemoteUser}. + *

+ * The name of the header to be used is defined in the userHeader element of the + * Alfresco Connector definition (see share-config-custom.xml.sample). Also note + * the class element specifies this class. For example: + *

+ * <connector>
+ *   <id>alfrescoCookie</id>
+ *   <name>Alfresco Connector</name>
+ *   <description>Connects to an Alfresco instance using cookie-based authentication</description>
+ *   <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
+ *   <userHeader>SsoUserHeader</userHeader>
+ *   <userIdPattern></userIdPattern>
+ * </connector>
+ * 
+ * The Alfresco global property {@code external.authentication.proxyHeader} still needs to + * be configured on the Repository side to define which header will be used. For example: + *
+ * authentication.chain=MySso:external,alfrescoNtlm1:alfrescoNtlm
+ * external.authentication.proxyUserName=
+ * external.authentication.proxyHeader=SsoUserHeader
+ * 
+ * The {@code userIdPattern} element should mirror the value set on the Repository if used: + *
+ * external.authentication.userIdPattern=
+ * 
+ * + * When using the default Alfresco Repository header (X-Alfresco-Remote-User") Share and the + * Alfresco Repository must be protected against direct access from other clients. The same is + * true when using a configurable header. The reason is that Share and Alfresco just accept the + * header value as valid. Without this protection, it would be possible to log in as any user + * simply by setting the header. + * + * @author adavis + * @author kroast + */ +public class SlingshotAlfrescoConnector extends RequestCachingConnector +{ + /** + * The name of the element in the {@link ConnectorDescriptor} + * ({@code ......}) that + * contains the name of the HTTP header used by an external SSO + * to provide the authenticated user name. + */ + private static final String CD_USER_HEADER = "userHeader"; + + /** + * The name of the element in the {@link ConnectorDescriptor} + * ({@code ......}) that + * contains the optional regex used by the external SSO to pattern match authenticated + * user names. This value must match that used by Alfresco External Auth settings. + */ + private static final String CD_USER_ID_PATTERN = "userIdPattern"; + + /** + * The name of the property in the {@link ConnectorSession} that + * contains the name of the HTTP header used by an external SSO + * to provide the authenticated user name. + */ + public static final String CS_PARAM_USER_HEADER = "userHeader"; + + /** + * The name of the property in the {@link ConnectorSession} that + * contains the optional regex used by the external SSO to pattern match authenticated + * user names. + */ + public static final String CS_PARAM_USER_ID_PATTERN = "userIdPattern"; + + + public SlingshotAlfrescoConnector(ConnectorDescriptor descriptor, String endpoint) + { + super(descriptor, endpoint); + } + + private String getUserHeader() + { + String userHeader = descriptor.getStringProperty(CD_USER_HEADER); + if (userHeader != null && userHeader.trim().length() == 0) + { + userHeader = null; + } + return userHeader; + } + + private String getUserIdPattern() + { + String userIdPattern = descriptor.getStringProperty(CD_USER_ID_PATTERN); + if (userIdPattern != null && userIdPattern.trim().length() == 0) + { + userIdPattern = null; + } + return userIdPattern; + } + + /** + * Overrides super method to set the CS_PARAM_USER_HEADER. This method is + * always called at the end of {@link ConnectorService#getConnector} when + * it constructs a {@link Connector}. + */ + @Override + public void setConnectorSession(ConnectorSession connectorSession) + { + super.setConnectorSession(connectorSession); + connectorSession.setParameter(CS_PARAM_USER_HEADER, getUserHeader()); + connectorSession.setParameter(CS_PARAM_USER_ID_PATTERN, getUserIdPattern()); + } + + /** + * Overrides the super method to add the HTTP header used by an external SSO + * to provide the authenticated user name when calling alfresco from share. + */ + @Override + protected void applyRequestHeaders(RemoteClient remoteClient, ConnectorContext context) + { + // Need to override the headers set on the remoteClient to include the 'userHeader' + // The following duplicates much of the code in the super method. Creating a new + // context with the userHeader is even more complex. + + // copy in cookies that have been stored back as part of the connector session + ConnectorSession connectorSession = getConnectorSession(); + if (connectorSession != null) + { + Map cookies = new HashMap(8); + for (String cookieName : connectorSession.getCookieNames()) + { + cookies.put(cookieName, connectorSession.getCookie(cookieName)); + } + remoteClient.setCookies(cookies); + } + + Map headers = new HashMap(8); + if (context != null) + { + headers.putAll(context.getHeaders()); + } + + // Proxy the authenticated user name if we have password-less credentials (indicates SSO auth over a secure connection) + if (getCredentials() != null) + { + String userHeader = getUserHeader(); + if (userHeader != null) + { + // TODO: This is not ideal - for scenarios where the request has come through a Spring Dispatcher servlet + // the request will be available in the ServletUtil helper, else if it has come through another route + // it will be available on the MTAuthenticationFilter - this should be resolved. + HttpServletRequest req = ServletUtil.getRequest(); + if (req == null) + { + req = MTAuthenticationFilter.getCurrentServletRequest(); + } + // MNT-15866: In some cases req can be null so we need to check it before getHeader from it + String user = null; + if (req != null) + { + user = req.getHeader(userHeader); + if (user == null) + { + // MNT-15795 + user = req.getRemoteUser(); + } + } + if (user != null) + { + // MNT-11041 Share SSOAuthenticationFilter and non-ascii username strings + if (!org.apache.commons.codec.binary.Base64.isBase64(user)) + { + try + { + user = org.apache.commons.codec.binary.Base64.encodeBase64String((new String(user.getBytes("ISO-8859-1"), "UTF-8")).getBytes("UTF-8")); + } + catch (UnsupportedEncodingException e) + { + //TODO + } + headers.put("Remote-User-Encode", Boolean.TRUE.toString()); + } + headers.put(userHeader, user); + } + } + } + + // stamp all headers onto the remote client + if (headers.size() != 0) + { + remoteClient.setRequestProperties(headers); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotBasicHttpAuthenticatorFactory.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotBasicHttpAuthenticatorFactory.java new file mode 100644 index 0000000000..ba0b275e25 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotBasicHttpAuthenticatorFactory.java @@ -0,0 +1,134 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import javax.servlet.http.HttpSession; + +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.site.AuthenticationUtil; +import org.springframework.extensions.webscripts.Authenticator; +import org.springframework.extensions.webscripts.BasicHttpAuthenticatorFactory; +import org.springframework.extensions.webscripts.Description.RequiredAuthentication; +import org.springframework.extensions.webscripts.connector.User; +import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; +import org.springframework.extensions.webscripts.servlet.WebScriptServletResponse; + +/** + * Slingshot override of the BasicHttpAuthenticatorFactory to provide user and guest WebScript auth + * through the standard Share authentication stack i.e. a validated User object in the HttpSession. + *

+ * For Admin auth level WebScripts, if the current user is not an admin, then authentication is still + * routed through the standard WebScript Basic Http authentication pattern. + * + * @author Kevin Roast + */ +public class SlingshotBasicHttpAuthenticatorFactory extends BasicHttpAuthenticatorFactory +{ + @Override + public Authenticator create(WebScriptServletRequest req, WebScriptServletResponse res) + { + Authenticator auth = null; + switch (req.getServiceMatch().getWebScript().getDescription().getRequiredAuthentication()) + { + case admin: + { + HttpSession session = req.getHttpServletRequest().getSession(false); + if (session != null) + { + final User user = (User)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_OBJECT); + if (user != null && user.isAdmin()) + { + auth = new Authenticator() + { + @Override + public boolean emptyCredentials() + { + return false; + } + + @Override + public boolean authenticate(RequiredAuthentication required, boolean isGuest) + { + return true; + } + }; + } + else + { + auth = super.create(req, res); + } + } + else + { + auth = super.create(req, res); + } + break; + } + case user: + { + final HttpSession session = req.getHttpServletRequest().getSession(false); + if (session != null) + { + auth = new Authenticator() + { + @Override + public boolean emptyCredentials() + { + return false; + } + + @Override + public boolean authenticate(RequiredAuthentication required, boolean isGuest) + { + User user = (User)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_OBJECT); + return (user != null && !AuthenticationUtil.isGuest(user.getId())); + } + }; + } + break; + } + case guest: + { + final HttpSession session = req.getHttpServletRequest().getSession(false); + if (session != null) + { + auth = new Authenticator() + { + @Override + public boolean emptyCredentials() + { + return false; + } + + @Override + public boolean authenticate(RequiredAuthentication required, boolean isGuest) + { + User user = (User)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_OBJECT); + return (user != null && AuthenticationUtil.isGuest(user.getId())); + } + }; + break; + } + } + } + return auth; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotFeedController.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotFeedController.java new file mode 100644 index 0000000000..a591fc6f97 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotFeedController.java @@ -0,0 +1,107 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.springframework.extensions.config.ConfigService; +import org.springframework.extensions.config.RemoteConfigElement; +import org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor; +import org.springframework.extensions.surf.mvc.FeedController; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * Slingshot override of the SpringSurf FeedController class. This implementation allows for + * a single configuration switch to allow SSO configuration for authentication to be used in + * preference to the "Basic Auth" pattern provided by the base feed controller if external-auth + * is set to true. If external-auth is false then the default basic auth from FeedController + * will be used + *

+ * Users of SSO may wish feed client apps to use whatever auth stack is already for the rest + * of Share. If that is the case they should copy the settings from the "alfresco" connector + * to the "alfresco-feed" instance and specify true + * + * @author Kevin Roast + */ +public class SlingshotFeedController extends FeedController +{ + public static final String ENDPOINT_ALFRESCO_FEED = "alfresco-feed"; + + private RemoteConfigElement config; + + private ConfigService configService; + + public void setConfigService(ConfigService configService) + { + this.configService = configService; + } + + /** + * @see org.springframework.extensions.surf.mvc.FeedController#handleRequestInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse res) + { + // retrieve Alfresco endpoint descriptor and query for Basic Auth configuration + EndpointDescriptor descriptor = getRemoteConfig().getEndpointDescriptor(ENDPOINT_ALFRESCO_FEED); + if (!descriptor.getExternalAuth()) + { + return super.handleRequestInternal(req, res); + } + else + { + // get the URI (after the controller) + String uri = (String) req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + uri = uri + (req.getQueryString() != null ? ("?" + req.getQueryString()) : ""); + + try + { + // forward to the authenticated webscript controller for the service + // this ensures the usual "alfresco" auth pattern will be used rather than basic auth + req.getRequestDispatcher("/page/" + uri).forward(req, res); + } + catch (Throwable e) + { + throw new AlfrescoRuntimeException(e.getMessage(), e); + } + + return null; + } + } + + /** + * Gets the remote config. + * + * @return the remote config + */ + private RemoteConfigElement getRemoteConfig() + { + if (this.config == null) + { + // retrieve the remote configuration + this.config = (RemoteConfigElement)this.configService.getConfig("Remote").getConfigElement("remote"); + } + + return this.config; + } +} \ No newline at end of file diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotLoginController.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotLoginController.java new file mode 100644 index 0000000000..0e3ff31681 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotLoginController.java @@ -0,0 +1,145 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.alfresco.web.site.SlingshotUser; +import org.alfresco.web.site.SlingshotUserFactory; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.springframework.extensions.surf.FrameworkUtil; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.exception.ConnectorServiceException; +import org.springframework.extensions.surf.mvc.LoginController; +import org.springframework.extensions.surf.support.AlfrescoUserFactory; +import org.springframework.extensions.surf.util.URLEncoder; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.connector.Connector; +import org.springframework.extensions.webscripts.connector.ConnectorContext; +import org.springframework.extensions.webscripts.connector.HttpMethod; +import org.springframework.extensions.webscripts.connector.Response; + +/** + * This extends the standard {@link LoginController} to store the authenticated user's group membership information + * as an {@link HttpSession} attribute so that it can be retrieved by the {@link SlingshotUserFactory} when creating + * {@link SlingshotUser} instances. + * + * @author david + * @author kevinr + */ +public class SlingshotLoginController extends LoginController +{ + public static String SESSION_ATTRIBUTE_KEY_USER_GROUPS = "_alf_USER_GROUPS"; + + /** + * Overrides the inherited method to retrieve the groups that the authenticated user is a member + * of and stores them as a comma delimited {@link String} in the {@link HttpSession}. This {@link String} + * is then retrieved when loading a user in the {@link SlingshotUserFactory} and stored as a user + * property. + * + * @param request The {@link HttpServletRequest} + * @param response The {@link HttpServletResponse} + * @throws Exception + */ + @SuppressWarnings("deprecation") + @Override + protected void onSuccess(HttpServletRequest request, HttpServletResponse response) throws Exception + { + this.beforeSuccess(request, response); + super.onSuccess(request, response); + } + + protected void beforeSuccess(HttpServletRequest request, HttpServletResponse response) throws Exception + { + try + { + final HttpSession session = request.getSession(); + + // Get the authenticated user name and use it to retrieve all of the groups that the user is a member of... + String username = (String)request.getParameter(PARAM_USERNAME); + if (username == null) + { + username = (String)session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID); + } + + if (username != null && session.getAttribute(SESSION_ATTRIBUTE_KEY_USER_GROUPS) == null) + { + Connector conn = FrameworkUtil.getConnector(session, username, AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID); + ConnectorContext c = new ConnectorContext(HttpMethod.GET); + c.setContentType("application/json"); + Response res = conn.call("/api/people/" + URLEncoder.encode(username) + "?groups=true", c); + if (Status.STATUS_OK == res.getStatus().getCode()) + { + // Assuming we get a successful response then we need to parse the response as JSON and then + // retrieve the group data from it... + // + // Step 1: Get a String of the response... + String resStr = res.getResponse(); + + // Step 2: Parse the JSON... + JSONParser jp = new JSONParser(); + Object userData = jp.parse(resStr.toString()); + + // Step 3: Iterate through the JSON object getting all the groups that the user is a member of... + StringBuilder groups = new StringBuilder(512); + if (userData instanceof JSONObject) + { + Object groupsArray = ((JSONObject) userData).get("groups"); + if (groupsArray instanceof org.json.simple.JSONArray) + { + for (Object groupData: (org.json.simple.JSONArray)groupsArray) + { + if (groupData instanceof JSONObject) + { + Object groupName = ((JSONObject) groupData).get("itemName"); + if (groupName != null) + { + groups.append(groupName.toString()).append(','); + } + } + } + } + } + + // Step 4: Trim off any trailing commas... + if (groups.length() != 0) + { + groups.delete(groups.length() - 1, groups.length()); + } + + // Step 5: Store the groups on the session... + session.setAttribute(SESSION_ATTRIBUTE_KEY_USER_GROUPS, groups.toString()); + } + else + { + session.setAttribute(SESSION_ATTRIBUTE_KEY_USER_GROUPS, ""); + } + } + } + catch (ConnectorServiceException e1) + { + throw new Exception("Error creating remote connector to request user group data."); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotLogoutController.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotLogoutController.java new file mode 100644 index 0000000000..0d19416f60 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotLogoutController.java @@ -0,0 +1,95 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.surf.UserFactory; +import org.springframework.extensions.surf.mvc.LogoutController; +import org.springframework.extensions.surf.support.AlfrescoUserFactory; +import org.springframework.extensions.webscripts.connector.*; +import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +/** + * Share specific override of the SpringSurf dologout controller. + *

+ * The implementation ensures Alfresco tickets are removed if appropriate and + * then delegates to the SpringSurf implementation for framework cleanup. + * + * @author Kevin Roast + */ +public class SlingshotLogoutController extends LogoutController +{ + private static final Log logger = LogFactory.getLog(SlingshotLogoutController.class); + protected ConnectorService connectorService; + + + /** + * @param connectorService the ConnectorService to set + */ + public void setConnectorService(ConnectorService connectorService) + { + this.connectorService = connectorService; + } + + + @Override + public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + // Expire the Alfresco ticket + HttpSession session = request.getSession(false); + if (session != null) + { + // retrieve the current user ID from the session + String userId = (String) session.getAttribute(UserFactory.SESSION_ATTRIBUTE_KEY_USER_ID); + + if (userId != null) + { + // get the ticket from the Alfresco connector + Connector connector = connectorService.getConnector(AlfrescoUserFactory.ALFRESCO_ENDPOINT_ID, userId, session); + String ticket = connector.getConnectorSession().getParameter(AlfrescoAuthenticator.CS_PARAM_ALF_TICKET); + + if (ticket != null) + { + // if we found a ticket, then expire it via REST API - not all auth will have a ticket i.e. SSO + Response res = connector.call("/api/login/ticket/" + ticket, new ConnectorContext(HttpMethod.DELETE)); + + if (logger.isDebugEnabled()) + { + logger.debug("Expired ticket: " + ticket + " user: " + userId + " - status: " + res.getStatus().getCode()); + } + } + } + } + } + finally + { + // Clear the session + return super.handleRequestInternal(request, response); + } + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotProxyControllerInterceptor.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotProxyControllerInterceptor.java new file mode 100644 index 0000000000..d3868e3632 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotProxyControllerInterceptor.java @@ -0,0 +1,51 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor; +import org.springframework.extensions.webscripts.servlet.mvc.ProxyControllerInterceptor; + +/** + * ProxyControllerInterceptor to allow Http Basic Authentication passthrough for + * content node URLs. + * + * @author Kevin Roast + */ +public class SlingshotProxyControllerInterceptor implements ProxyControllerInterceptor +{ + /** + * @see org.springframework.extensions.webscripts.servlet.mvc.ProxyControllerInterceptor#allowHttpBasicAuthentication(org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor, java.lang.String) + */ + @Override + public boolean allowHttpBasicAuthentication(EndpointDescriptor endpoint, String uri) + { + return uri.contains("/api/node/content") || uri.contains("/cmis/") && uri.contains("/content"); + } + + /** + * @see org.springframework.extensions.webscripts.servlet.mvc.ProxyControllerInterceptor#exceptionOnError(org.springframework.extensions.config.RemoteConfigElement.EndpointDescriptor, String) + */ + @Override + public boolean exceptionOnError(EndpointDescriptor endpoint, String uri) + { + return allowHttpBasicAuthentication(endpoint, uri); + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/SlingshotServletRequestWrapper.java b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotServletRequestWrapper.java new file mode 100755 index 0000000000..ff9a43c415 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/SlingshotServletRequestWrapper.java @@ -0,0 +1,120 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +/** + * Request wrapper used an Accept-Langauge header was not present in original + * request. + * + * @author Eugene Zheleznyakov + */ +public class SlingshotServletRequestWrapper extends HttpServletRequestWrapper +{ + private Map headerMap; + + public SlingshotServletRequestWrapper(HttpServletRequest request) + { + super(request); + headerMap = new HashMap(8); + } + + /** + * Adds a header to the request + * + * @param name The name of header + * @param value The value of header + */ + public void addHeader(String name, String value) + { + headerMap.put(name, value); + } + + /** + * @see javax.servlet.http.HttpServletRequestWrapper#getHeader(java.lang.String) + */ + @Override + public String getHeader(String name) + { + String value = headerMap.get(name); + if (value != null) + { + return value; + } + else + { + return ((HttpServletRequest) getRequest()).getHeader(name); + } + } + + /** + * @see javax.servlet.http.HttpServletRequestWrapper#getHeaders(java.lang.String) + */ + @SuppressWarnings("unchecked") + @Override + public Enumeration getHeaders(String name) + { + String value = headerMap.get(name); + if (value != null) + { + List values = new ArrayList(8); + values.add(value); + return Collections.enumeration(values); + } + else + { + return super.getHeaders(name); + } + } + + /** + * @see javax.servlet.http.HttpServletRequestWrapper#getHeaderNames() + */ + @Override + public Enumeration getHeaderNames() + { + HttpServletRequest request = (HttpServletRequest) getRequest(); + + List list = new ArrayList(16); + + Enumeration e = (Enumeration) request.getHeaderNames(); + while (e.hasMoreElements()) + { + list.add(e.nextElement().toString()); + } + + for (String key : headerMap.keySet()) + { + list.add(key); + } + + return Collections.enumeration(list); + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/AIMSConfig.java b/share/src/main/java/org/alfresco/web/site/servlet/config/AIMSConfig.java new file mode 100644 index 0000000000..d8c90397b5 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/AIMSConfig.java @@ -0,0 +1,115 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet.config; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.config.Config; +import org.springframework.extensions.config.ConfigService; + +public class AIMSConfig +{ + private static final Log logger = LogFactory.getLog(AIMSConfig.class); + + private boolean enabled; + private String realm; + private String resource; + private String secret; + private String authServerUrl; + private String sslRequired; + private String principalAttribute; + private ConfigService configService; + /** + * + */ + public void init() + { + Config config = this.configService.getConfig("AIMS"); + this.setEnabled(Boolean.parseBoolean(config.getConfigElement("enabled").getValue())); + this.setRealm(config.getConfigElementValue("realm")); + this.setResource(config.getConfigElementValue("resource")); + this.setAuthServerUrl(config.getConfigElementValue("authServerUrl")); + this.setSslRequired(config.getConfigElementValue("sslRequired")); + + if(!StringUtils.isEmpty(config.getConfigElementValue("secret"))) + this.setSecret(config.getConfigElementValue("secret")); + else + this.setSecret(config.getConfigElementValue("resource")); + + if(!StringUtils.isEmpty(config.getConfigElementValue("principalAttribute"))) + this.setPrincipalAttribute(config.getConfigElementValue("principalAttribute")); + else + this.setPrincipalAttribute("sub"); + + } + + /** + * + * @param configService ConfigService + */ + public void setConfigService(ConfigService configService) + { + this.configService = configService; + } + + /** + * + * @param enabled boolean + */ + private void setEnabled(boolean enabled) + { + this.enabled = enabled; + } + + /** + * + * @return boolean + */ + public boolean isEnabled() + { + return this.enabled; + } + + public String getRealm() { return realm; } + + public void setRealm(String realm) { this.realm = realm; } + + public String getResource() { return resource; } + + public void setResource(String resource) { this.resource = resource; } + + public String getAuthServerUrl() { return authServerUrl; } + + public void setAuthServerUrl(String authServerUrl) { this.authServerUrl = authServerUrl; } + + public String getSslRequired() { return sslRequired; } + + public void setSslRequired(String sslRequired) { this.sslRequired = sslRequired; } + + public String getSecret() { return secret; } + + public void setSecret(String secret) { this.secret = secret; } + + public String getPrincipalAttribute() { return principalAttribute; } + + public void setPrincipalAttribute(String principalAttribute) { this.principalAttribute = principalAttribute; } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/AlfrescoEncryptionElementConvert.java b/share/src/main/java/org/alfresco/web/site/servlet/config/AlfrescoEncryptionElementConvert.java new file mode 100644 index 0000000000..d25f3d70e4 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/AlfrescoEncryptionElementConvert.java @@ -0,0 +1,94 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet.config; + +import java.util.Iterator; + +import org.alfresco.encryptor.PublicPrivateKeyShareStringEncryptor; +import org.dom4j.Attribute; +import org.dom4j.Element; +import org.jasypt.properties.PropertyValueEncryptionUtils; + +public class AlfrescoEncryptionElementConvert { + + private final PublicPrivateKeyShareStringEncryptor stringEncryptor; + + public AlfrescoEncryptionElementConvert() { + stringEncryptor = new PublicPrivateKeyShareStringEncryptor(); + stringEncryptor.init(); + } + + public AlfrescoEncryptionElementConvert(PublicPrivateKeyShareStringEncryptor stringEncryptor) { + this.stringEncryptor = stringEncryptor; + } + + public void parse(Element element) { + if (element != null) { + convertElement(element); + // process any children there may be + processChildren(element); + } + } + + protected void processChildren(Element element) { + // get the list of children for the given element + Iterator children = element.elementIterator(); + while (children.hasNext()) { + Element child = children.next(); + convertElement(child); + // recurse down the children + processChildren(child); + } + } + + protected void convertElement(Element element) { + if ((element.hasContent()) && (element.hasMixedContent() == false)) { + String value = element.getTextTrim(); + if (value != null && value.length() > 0) { + value = convertElementValue(value); + element.setText(value); + } + } + + Iterator attrs = element.attributeIterator(); + while (attrs.hasNext()) { + Attribute attr = attrs.next(); + String attrName = attr.getName(); + String attrValue = attr.getValue(); + attrValue = convertElementValue(attrValue); + + element.addAttribute(attrName, attrValue); + } + + } + + protected String convertElementValue(final String originalValue) { + if (!PropertyValueEncryptionUtils.isEncryptedValue(originalValue)) { + return originalValue; + } + if (this.stringEncryptor != null) { + return PropertyValueEncryptionUtils.decrypt(originalValue, this.stringEncryptor); + + } + return null; + } + +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/AppConfig.java b/share/src/main/java/org/alfresco/web/site/servlet/config/AppConfig.java new file mode 100644 index 0000000000..bd86d657ba --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/AppConfig.java @@ -0,0 +1,138 @@ +package org.alfresco.web.site.servlet.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import org.alfresco.web.site.TaskUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager; +import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.registration.ClientRegistrations; +import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.ClientAuthenticationMethod; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +@Configuration +public class AppConfig { + private static final Log logger = LogFactory.getLog(AppConfig.class); + private final String realm; + private final String clientId; + private final String clientSecret; + private final String authUrl; + private final String principalAttribute; + private final AIMSConfig aimsConfig; + @Autowired + public AppConfig(AIMSConfig aimsConfig) { + this.aimsConfig = aimsConfig; + this.realm = aimsConfig.getRealm(); + this.clientId = aimsConfig.getResource(); + this.clientSecret = aimsConfig.getSecret(); + this.authUrl = aimsConfig.getAuthServerUrl(); + this.principalAttribute = aimsConfig.getPrincipalAttribute(); + } + + @Bean + public OAuth2AuthorizedClientRepository authorizedClientRepository( + @Autowired(required = false) OAuth2AuthorizedClientService authorizedClientService) { + if (null != authorizedClientService) + return new + AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService); + else + return null; + } + + @Bean + public OAuth2AuthorizedClientService authorizedClientService( + @Autowired(required = false) ClientRegistrationRepository clientRegistrationRepository) { + if (null != clientRegistrationRepository) + return new + InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository); + else + return null; + } + + @Bean + public ClientRegistrationRepository clientRegistrationRepository() { + ClientRegistration clientRegistration = this.clientRegistration(); + if (null != clientRegistration) + return new + InMemoryClientRegistrationRepository(this.clientRegistration()); + else + return null; + } + + @Bean + public AuthorizedClientServiceOAuth2AuthorizedClientManager authorizedClientServiceAndManager ( + @Autowired(required = false) ClientRegistrationRepository clientRegistrationRepository, + @Autowired(required = false) OAuth2AuthorizedClientService authorizedClientService) { + if(null != clientRegistrationRepository && null != authorizedClientService) { + OAuth2AuthorizedClientProvider authorizedClientProvider = + OAuth2AuthorizedClientProviderBuilder.builder() + .authorizationCode() + .build(); + + AuthorizedClientServiceOAuth2AuthorizedClientManager authorizedClientManager = + new AuthorizedClientServiceOAuth2AuthorizedClientManager( + clientRegistrationRepository, authorizedClientService); + authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider); + + return authorizedClientManager; + } else + return null; + } + + private ClientRegistration clientRegistration() { + if(aimsConfig.isEnabled()) { + String realm_url = authUrl + "/realms/" + realm; + /** + * This implementation is primarily getting all the endpoints on the fly during startup + */ + AtomicReference builder = new AtomicReference<>(); + TaskUtils.retry(10, 1000, logger, + () -> builder.set(ClientRegistrations.fromOidcIssuerLocation(realm_url))); + + return + builder.get() + .registrationId(clientId) + .clientId(clientId) + .clientSecret(clientSecret) + .scope("openid") + .redirectUri("*") + .userNameAttributeName(principalAttribute) + .clientAuthenticationMethod(ClientAuthenticationMethod.POST) + .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) + .clientName(clientId) + .build(); + } else { + return null; + } + } + + @Bean + public MappingJackson2HttpMessageConverter jsonConverter() { + List supportedMediaTypes = new ArrayList<>(); + supportedMediaTypes.add(MediaType.APPLICATION_JSON); + + Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + builder.serializationInclusion(JsonInclude.Include.NON_NULL); + + MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(builder.build()); + jsonConverter.setSupportedMediaTypes(supportedMediaTypes); + return jsonConverter; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/CustomAuthorizationRequestResolver.java b/share/src/main/java/org/alfresco/web/site/servlet/config/CustomAuthorizationRequestResolver.java new file mode 100644 index 0000000000..0eab7ca6e8 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/CustomAuthorizationRequestResolver.java @@ -0,0 +1,42 @@ +package org.alfresco.web.site.servlet.config; + +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; +import javax.servlet.http.HttpServletRequest; + +public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver { + + private OAuth2AuthorizationRequestResolver defaultResolver; + + public CustomAuthorizationRequestResolver(ClientRegistrationRepository repo, String authorizationRequestBaseUri){ + defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(repo, authorizationRequestBaseUri); + } + + + @Override + public OAuth2AuthorizationRequest resolve(HttpServletRequest httpServletRequest) { + OAuth2AuthorizationRequest oAuth2AuthorizationRequest = defaultResolver.resolve(httpServletRequest); + if(oAuth2AuthorizationRequest != null) { + oAuth2AuthorizationRequest = customizeAuthorizationRequest(oAuth2AuthorizationRequest, httpServletRequest); + } + return oAuth2AuthorizationRequest; + } + + @Override + public OAuth2AuthorizationRequest resolve(HttpServletRequest httpServletRequest, String clientRegistrationId) { + OAuth2AuthorizationRequest oAuth2AuthorizationRequest = defaultResolver.resolve(httpServletRequest, clientRegistrationId); + if(oAuth2AuthorizationRequest != null){ + oAuth2AuthorizationRequest = customizeAuthorizationRequest(oAuth2AuthorizationRequest, httpServletRequest); + } + return oAuth2AuthorizationRequest; + } + + private OAuth2AuthorizationRequest customizeAuthorizationRequest(OAuth2AuthorizationRequest req, HttpServletRequest request) { + return OAuth2AuthorizationRequest + .from(req) + .redirectUri(String.valueOf(request.getRequestURL())) + .build(); + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/KerberosConfigElement.java b/share/src/main/java/org/alfresco/web/site/servlet/config/KerberosConfigElement.java new file mode 100644 index 0000000000..c431b0678b --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/KerberosConfigElement.java @@ -0,0 +1,176 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet.config; + +import org.dom4j.Element; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.element.ConfigElementAdapter; + +/** + * Describes the kerberos authentication properties stored within the block of the current configuration. + * + * @author dward + */ +public class KerberosConfigElement extends ConfigElementAdapter +{ + private static final long serialVersionUID = 4178518406841891833L; + + /** The password. */ + private String password; + + /** The realm. */ + private String realm; + + /** The Service Principal Name to use on the endpoint. This must be like: HTTP/host.name@REALM */ + private String endpointSPN; + + /** JAAS login configuration entry name. */ + private String loginEntryName; + + /** A Boolean which when true strips the @domain sufix from Kerberos authenticated usernames. Default is true. */ + private boolean stripUserNameSuffix = true; + + /** + * Constructs a new Kerberos Config Element. + */ + public KerberosConfigElement() + { + super("kerberos"); + } + + /* + * (non-Javadoc) + * @see + * org.springframework.extensions.surf.config.element.ConfigElementAdapter#combine(org.springframework.extensions + * .surf.config.ConfigElement) + */ + public ConfigElement combine(ConfigElement element) + { + KerberosConfigElement configElement = (KerberosConfigElement) element; + + // new combined element + KerberosConfigElement combinedElement = new KerberosConfigElement(); + + combinedElement.password = configElement.password == null ? this.password : configElement.password; + combinedElement.realm = configElement.realm == null ? this.realm : configElement.realm; + combinedElement.endpointSPN = configElement.endpointSPN == null ? this.endpointSPN : configElement.endpointSPN; + combinedElement.loginEntryName = configElement.loginEntryName == null ? this.loginEntryName + : configElement.loginEntryName; + combinedElement.stripUserNameSuffix = configElement.stripUserNameSuffix; + + // return the combined element + return combinedElement; + } + + /** + * Gets the password. + * + * @return the password + */ + public String getPassword() + { + return password; + } + + /** + * Gets the realm. + * + * @return the realm + */ + public String getRealm() + { + return realm; + } + + /** + * Gets the Service Principal Name to use on the endpoint. This must be like: HTTP/host.name@REALM. + * + * @return the endpoint SPN + */ + public String getEndpointSPN() + { + return endpointSPN; + } + + /** + * Gets the JAAS login configuration entry name. + * + * @return the login entry name + */ + public String getLoginEntryName() + { + return loginEntryName == null ? "ShareHTTP" : loginEntryName; + } + + /** + * Gets the stripUserNameSuffix boolean property. + * + * @return the stripUserNameSuffix boolean + */ + public boolean getStripUserNameSuffix() + { + return stripUserNameSuffix; + } + + /** + * Constructs a new instance from an XML Element. + * + * @param elem + * the XML element + * @return the Kerberos configuration element + */ + protected static KerberosConfigElement newInstance(Element elem) + { + KerberosConfigElement configElement = new KerberosConfigElement(); + + String password = elem.elementTextTrim("password"); + if (password != null && password.length() > 0) + { + configElement.password = password; + } + + String realm = elem.elementTextTrim("realm"); + if (realm != null && realm.length() > 0) + { + configElement.realm = realm; + } + + String endpointSPN = elem.elementTextTrim("endpoint-spn"); + if (endpointSPN != null && endpointSPN.length() > 0) + { + configElement.endpointSPN = endpointSPN; + } + + String loginEntryName = elem.elementTextTrim("config-entry"); + if (loginEntryName != null && loginEntryName.length() > 0) + { + configElement.loginEntryName = loginEntryName; + } + + String stripUserNameSuffix = elem.elementTextTrim("stripUserNameSuffix"); + if (stripUserNameSuffix != null && stripUserNameSuffix.length() > 0) + { + configElement.stripUserNameSuffix = Boolean.parseBoolean(stripUserNameSuffix); + } + + return configElement; + } +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/KerberosConfigElementReader.java b/share/src/main/java/org/alfresco/web/site/servlet/config/KerberosConfigElementReader.java new file mode 100644 index 0000000000..73d89af409 --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/KerberosConfigElementReader.java @@ -0,0 +1,45 @@ +/* + * Copyright 2005 - 2020 Alfresco Software Limited. + * + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of the paid license agreement will prevail. + * Otherwise, the software is provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.site.servlet.config; + +import org.dom4j.Element; +import org.springframework.extensions.config.ConfigElement; +import org.springframework.extensions.config.xml.elementreader.ConfigElementReader; + +/** + * Responsible for loading Kerberos configuration settings from the + * share-config*.xml files that are loaded via the configuration service. + * + * @author dward + */ +public class KerberosConfigElementReader implements ConfigElementReader { + private AlfrescoEncryptionElementConvert elemConverter = new AlfrescoEncryptionElementConvert(); + + public ConfigElement parse(Element elem) { + ConfigElement configElement = null; + if (elem != null) { + elemConverter.parse(elem); + configElement = KerberosConfigElement.newInstance(elem); + } + return configElement; + } + +} diff --git a/share/src/main/java/org/alfresco/web/site/servlet/config/SecurityUtils.java b/share/src/main/java/org/alfresco/web/site/servlet/config/SecurityUtils.java new file mode 100644 index 0000000000..006429cd7e --- /dev/null +++ b/share/src/main/java/org/alfresco/web/site/servlet/config/SecurityUtils.java @@ -0,0 +1,68 @@ +package org.alfresco.web.site.servlet.config; + +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponse; +import org.springframework.security.web.util.ThrowableAnalyzer; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import javax.servlet.ServletException; +import java.util.Map; + +public class SecurityUtils { + + public static boolean isAuthorizationResponse(MultiValueMap request) { + return isAuthorizationResponseSuccess(request) || isAuthorizationResponseError(request); + } + + static boolean isAuthorizationResponseSuccess(MultiValueMap request) { + return StringUtils.hasText(request.getFirst("code")) && StringUtils.hasText(request.getFirst("state")); + } + + static boolean isAuthorizationResponseError(MultiValueMap request) { + return StringUtils.hasText(request.getFirst("error")) && StringUtils.hasText(request.getFirst("state")); + } + + + public static MultiValueMap toMultiMap(Map map) { + MultiValueMap params = new LinkedMultiValueMap(map.size()); + map.forEach((key, values) -> { + if (values.length > 0) { + String[] var3 = values; + int var4 = values.length; + + for(int var5 = 0; var5 < var4; ++var5) { + String value = var3[var5]; + params.add(key, value); + } + } + + }); + return params; + } + + public static OAuth2AuthorizationResponse convert(MultiValueMap request, String redirectUri) { + String code = request.getFirst("code"); + String errorCode = request.getFirst("error"); + String state = request.getFirst("state"); + if (StringUtils.hasText(code)) { + return OAuth2AuthorizationResponse.success(code).redirectUri(redirectUri).state(state).build(); + } else { + String errorDescription = request.getFirst("error_description"); + String errorUri = request.getFirst("error_uri"); + return OAuth2AuthorizationResponse.error(errorCode).redirectUri(redirectUri).errorDescription(errorDescription).errorUri(errorUri).state(state).build(); + } + } + + public static final class DefaultThrowableAnalyzer extends ThrowableAnalyzer { + public DefaultThrowableAnalyzer() { + } + + protected void initExtractorMap() { + super.initExtractorMap(); + this.registerExtractor(ServletException.class, (throwable) -> { + ThrowableAnalyzer.verifyThrowableHierarchy(throwable, ServletException.class); + return ((ServletException)throwable).getRootCause(); + }); + } + } +} diff --git a/share/src/main/resources/alfresco/enterprise-config.xml b/share/src/main/resources/alfresco/enterprise-config.xml new file mode 100644 index 0000000000..1bb28481d9 --- /dev/null +++ b/share/src/main/resources/alfresco/enterprise-config.xml @@ -0,0 +1,24 @@ + + + +

+ alfresco-logo.svg + Alfresco Share + footer-ent + +
+ + logo-ent + + + logo-ent + + + + + + true + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/messages/cmm.properties b/share/src/main/resources/alfresco/messages/cmm.properties new file mode 100644 index 0000000000..440d8559b6 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Model Manager +tool.custom-model-manager.description=Model Manager diff --git a/share/src/main/resources/alfresco/messages/cmm_de.properties b/share/src/main/resources/alfresco/messages/cmm_de.properties new file mode 100644 index 0000000000..7c167ee3dc --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_de.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Modell-Manager +tool.custom-model-manager.description=Modell-Manager diff --git a/share/src/main/resources/alfresco/messages/cmm_es.properties b/share/src/main/resources/alfresco/messages/cmm_es.properties new file mode 100644 index 0000000000..846912188a --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_es.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Gestor de modelos +tool.custom-model-manager.description=Gestor de modelos diff --git a/share/src/main/resources/alfresco/messages/cmm_fr.properties b/share/src/main/resources/alfresco/messages/cmm_fr.properties new file mode 100644 index 0000000000..a4604a0b48 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_fr.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Gestionnaire de mod\u00e8les +tool.custom-model-manager.description=Gestionnaire de mod\u00e8les diff --git a/share/src/main/resources/alfresco/messages/cmm_it.properties b/share/src/main/resources/alfresco/messages/cmm_it.properties new file mode 100644 index 0000000000..c9f6d49f38 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_it.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Gestione modelli +tool.custom-model-manager.description=Gestione modelli diff --git a/share/src/main/resources/alfresco/messages/cmm_ja.properties b/share/src/main/resources/alfresco/messages/cmm_ja.properties new file mode 100644 index 0000000000..c872048fd3 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_ja.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=\u30e2\u30c7\u30eb\u30de\u30cd\u30fc\u30b8\u30e3 +tool.custom-model-manager.description=\u30e2\u30c7\u30eb\u30de\u30cd\u30fc\u30b8\u30e3 diff --git a/share/src/main/resources/alfresco/messages/cmm_nb.properties b/share/src/main/resources/alfresco/messages/cmm_nb.properties new file mode 100644 index 0000000000..53bf90d5ce --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_nb.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Modellansvarlig +tool.custom-model-manager.description=Modellansvarlig diff --git a/share/src/main/resources/alfresco/messages/cmm_nl.properties b/share/src/main/resources/alfresco/messages/cmm_nl.properties new file mode 100644 index 0000000000..7fc5c64c40 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_nl.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Modelbeheer +tool.custom-model-manager.description=Modelbeheer diff --git a/share/src/main/resources/alfresco/messages/cmm_pt_BR.properties b/share/src/main/resources/alfresco/messages/cmm_pt_BR.properties new file mode 100644 index 0000000000..c137865208 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_pt_BR.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=Gerente de Modelos +tool.custom-model-manager.description=Gerente de Modelos diff --git a/share/src/main/resources/alfresco/messages/cmm_ru.properties b/share/src/main/resources/alfresco/messages/cmm_ru.properties new file mode 100644 index 0000000000..ba9f981966 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_ru.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 +tool.custom-model-manager.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 diff --git a/share/src/main/resources/alfresco/messages/cmm_zh_CN.properties b/share/src/main/resources/alfresco/messages/cmm_zh_CN.properties new file mode 100644 index 0000000000..7558231ec6 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/cmm_zh_CN.properties @@ -0,0 +1,2 @@ +tool.custom-model-manager.label=\u6a21\u578b\u7ba1\u7406\u5668 +tool.custom-model-manager.description=\u6a21\u578b\u7ba1\u7406\u5668 diff --git a/share/src/main/resources/alfresco/messages/slingshot.properties b/share/src/main/resources/alfresco/messages/slingshot.properties new file mode 100644 index 0000000000..8598c2f9ad --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Enter search terms... +# header menu items +header.advanced-search.label=Advanced Search... +header.advanced-search.description=Advanced Search... +header.application.label=Application +header.application.description=Application +header.change-password.label=Change Password +header.change-password.description=Change Password +header.groups.label=Groups +header.groups.description=Groups +header.tag-management.label=Tag Manager +header.tag-management.description=Tag Manager +header.help.label=Help +header.help.description=Help +header.logout.label=Logout +header.logout.description=Logout +header.more.label=More... +header.more.description=More... +header.my.label=My... +header.my.description=My... +header.my-content.label=My Content +header.my-content.description=My Content +header.my-dashboard.label=My Dashboard +header.my-dashboard.description=My Dashboard +header.my-profile.label=My Profile +header.my-profile.description=My Profile +header.my-sites.label=My Sites +header.my-sites.description=My Sites +header.my-tasks.label=My Tasks +header.my-tasks.description=My Tasks +header.my-workflows.label=Workflows I've Started +header.my-workflows.description=Workflows I've Started +header.people.label=People +header.people.description=People +header.replication-jobs.label=Replication Jobs +header.replication-jobs.description=Replication Jobs +header.repository.label=Repository +header.repository.description=Repository +header.trashcan.label=Trashcan +header.trashcan.description=File recovery and deletion Tools +header.saved-searches.label=Saved Searches +header.saved-searches.description=Saved Searches +header.search.description=Search Options... +header.sites.label=Sites +header.sites.description=Sites +header.submit-status.label=Share +header.submit-status.description=Share +header.tools.label=Admin Tools... +header.tools.description=Administrative Tools... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Users +header.users.description=Users + +## Buttons +button.browse=Browse +button.edit=Edit +button.save=Save +button.savechanges=Save Changes +button.saveandclose=Save and Close +button.upload=Upload +button.login=Sign In +button.delete=Delete +button.take-ownership=OK +button.download=Download +button.clear=Clear +button.reset=Reset +button.search=Search +button.update=Update +button.goback=Go Back +button.done=Done +button.undo=Undo +button.new=New +button.create=Create +button.rename=Rename +button.refreshPage=Refresh Page +button.createanother=Create and Create Another +button.view.simple=Simple View +button.view.detailed=Detailed View +button.view.gallery=Gallery View +button.view.filmstrip=Filmstrip View +button.view.table=Table View +button.view.media-table=Media View +button.view.email=Email View +button.view.audio=Audio View +button.view.dublinCore=Dublin Core View +button.view.effectivity=Effectivity View + +button.follow=Follow +button.unfollow=Unfollow +button.unsync=Remove sync + +## Messages +message.failure=Failure +message.failure.workflow=User {0} does not have permission to access this task. +message.loginfailure=Failed to Login +message.loginautherror=Your authentication details haven't been recognized or Alfresco Content Services may not be available at this time. +message.passwordchangeauthfailed=Incorrect authentication details or not authorised to change password. +message.login-portal=Please login via your portal. +message.unsavedChanges.blog=Your blog post has unsaved changes. +message.unsavedChanges.comment=Your comment has not been saved yet. +message.unsavedChanges.discussion=Your discussion topic has unsaved changes. +message.unsavedChanges.reply=Your topic reply has unsaved changes. +message.unsavedChanges.wiki=Your wiki article has unsaved changes. +message.searching=Searching... +message.searchingFor=Searching for "{0}"... +message.minimum-length=Enter at least {0} character(s) +message.folders-trimmed=List has been limited to {0} entries +message.item-missing=Requested item cannot be displayed as it is no longer available. +message.save.success=Your changes have been saved. +message.save.failure=Your changes could not be saved. +message.cookiesfailure=Cookies are disabled +message.cookieserror=Cookies must be enabled in your browser. +message.siteRedirect.noPages.manager=A site manager has switched off all the features of this site.
Click the Settings icon   and select Customize Site to add one or more site features. +message.siteRedirect.noPages.user=A site manager has switched off all the features of this site.
Look at the Site Members to find a site manager who can add features to the site. +message.logged-out=You are now logged out. +message.timeout=Server timeout. Request took too long to complete, please try again later. +message.loading=Loading... +message.viewInCloud.failure=Unable to retrieve URL. Check sync status. +message.logged-out=You are now logged out. + +## Common Text labels and CM model metadata +label.tags=Tags +label.none=(None) +label.empty=(Empty) +label.about=About +label.username=User Name +label.password=Password +label.copyright=© 2005-2023 Alfresco Software Inc. All rights reserved. +label.name=Name +label.id=ID +label.title=Title +label.description=Description +label.version=Version +label.firstname=First Name +label.lastname=Last Name +label.jobtitle=Job Title +label.location=Location +label.bio=Summary +label.photo=Photo +label.contactinfo=Contact Information +label.skype=Skype +label.im=IM +label.googleusername=Google Username +label.company=Company +label.companyinfo=Company Details +label.companyname=Name +label.companyaddress=Address +label.companytelephone=Telephone +label.companyfax=Fax +label.companyemail=Email +label.companypostcode=Post Code +label.email=Email +label.telephone=Telephone +label.mobile=Mobile +label.fax=Fax +label.address=Address +label.postcode=Post Code +label.groups=Groups +label.yes=Yes +label.no=No +label.ok=OK +label.loading=Loading... +label.validating=Validating... +label.validationError=Unable to validate credentials. +label.site=Site +label.path=Path +label.type=Type +label.creator=Creator +label.created=Created +label.modifier=Modifier +label.modified=Modified +label.author=Author +label.priority={0} Priority +label.size=Size +label.mimetype=Mimetype +label.mimetype.unknown=Unknown +label.popularity=Popularity +label.avatar=Avatar +label.editType=Edit: {0} +label.moreInfo=More Info > +label.actions.column.header=Actions +# Dictionary Model +label.modelActive=Is Active +label.modelName=Model Name +label.modelDescription=Model Description +# Transfer Targets +label.trx_enabled=Is Enabled +label.trx_endpointhost=Transfer To Host +label.trx_endpointport=Port +label.you=you +label.licensedTo=Licensed To: + +## Location +location.tooltip.path=Path: {0} +location.tooltip.site=Site: {0} +location.path.repository=Repository +location.path.documents=Documents +location.path.userHome=My User Home +location.path.myfiles=My Files +location.path.shared=Shared Files +location.label.none=(None) +location.label.local={0} +location.label.site={0} in {1} +location.label.repository={0} + +## EXIF +label.exif.width=Width +label.exif.height=Height + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} of {totalRecords} +pagination.template.page-report.more=Showing items {startRecord} - {endRecord} of {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} of {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Light Theme +theme.default=Blue Theme +theme.greenTheme=Green Theme +theme.hcBlack=High Contrast Theme +theme.yellowTheme=Yellow Theme +theme.gdocs=Google Docs Theme + +## Admin console tools +tool.users.label=Users +tool.users.description=User Management +tool.groups.label=Groups +tool.groups.description=Group Management +tool.application.label=Application +tool.application.description=Application Settings and Management +tool.replication-jobs.label=Replication Jobs +tool.replication-jobs.description=Replication Jobs Management +tool.repository.label=Repository Tools +tool.repository.description=Repository Tools +tool.tag-management.label=Tag Manager +tool.tag-management.description=Tag Manager +tool.workflow.label=Workflow +tool.workflow.description=Workflow Tools +tool.trashcan.label=Trashcan +tool.trashcan.description=File recovery and deletion Tools +tool.email-inbound.label=Email (Inbound) +tool.email-inbound.description=Email (Inbound) +tool.email-outbound.label=Email (Outbound) +tool.email-outbound.description=Email (Outbound) +tool.email-imap.label=Email (IMAP) +tool.email-imap.description=Email (IMAP) +tool.runtime.label=Runtime +tool.runtime.description=Runtime +tool.repository-server.label=Repository Descriptor (Current) +tool.repository-server.description=Repository Descriptor (Current) +tool.repository-installed.label=Repository Descriptor (Originally Installed) +tool.repository-installed.description=Repository Descriptor (Originally Installed) +tool.authority.label=Authority +tool.authority.description=Authority +tool.license.label=License Descriptor +tool.license.description=License Descriptor +tool.license.link=Manage My Subscription +tool.license.usageinfo.label=License Usage Information +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=OpenOffice System +tool.openoffice-subsystem.description=OpenOffice System +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Transformer pdf2swf +tool.transformer-pdf2swf.description=Transformer pdf2swf +tool.transformer-imagemagick.label=Transformer ImageMagick +tool.transformer-imagemagick.description=Transformer ImageMagick +tool.fileservers.label=Fileservers +tool.fileservers.description=Fileservers +tool.subscriptions.label=Subscriptions +tool.subscriptions.description=Subscriptions +tool.sysadmin.label=Sysadmin +tool.sysadmin.description=Sysadmin +tool.activities.label=Activities Feed +tool.activities.description=Activities Feed +tool.workflow.label=Workflow +tool.workflow.description=Workflow +tool.manage-sites.label=Sites Manager +tool.manage-sites.description=Sites Manager +tool.cloud-sync-management.label=Cloud Sync Manager +tool.cloud-sync-management.description=Cloud Sync Manager +tool.search-manager.label=Search Manager +tool.search-manager.description=Search Manager + +## Admin console tool groups +tool.group.usersgroups=Users and Groups +tool.group.email=Email +tool.group.transformations=Transformations +tool.group.filemanagement=File Management +tool.group.subscriptions=Subscriptions +tool.group.repository=Repository +tool.group.search=Search +tool.group.site=Sites + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Accept Invitation +page.acceptInvite.description=Accept invite page. Loading the page will trigger the site invitation to be accepted and enables the account of the user if still disabled +page.addGroups.title=Add Groups +page.addGroups.description=Add Groups +page.add-users.title=Add Users +page.add-users.description=Add Users to a site +page.adminConsole.title=Admin Tools +page.adminConsole.description=Administration and Management Console +page.advsearch.title=Advanced Search +page.advsearch.description=Advanced Search view +page.blogCreateEdit.title=Blog: create or edit blog post +page.blogCreateEdit.description=Displays a form to create or edit a post +page.blogPostList.title=Blog +page.blogPostList.description=Displays the blog posts +page.blogPostView.title=Blog: display post detail view +page.blogPostView.description=Displays the post detail view +page.calendar.title=Calendar +page.calendar.description=Site Calendar Component +page.changePassword.title=Change User Password +page.changePassword.description=Change Password section on Profile page for a User +page.contentViewer.title=Content Viewer +page.contentViewer.description=Page for viewing the content of a node ref +page.createContent.title=Create Content +page.createContent.description=Create text-based content +page.createEditReplicationJob.title=Replication Job +page.createEditReplicationJob.description=Create new or Edit existing Replication Job +page.customiseSite.title=Customize Site +page.customiseSite.description=Add and remove pages from a site +page.customiseSiteDashboard.title=Customize Site Dashboard +page.customiseSiteDashboard.description=Customize dashboard layout and dashlets for a site dashboard +page.customiseUserDashboard.title=Customize User Dashboard +page.customiseUserDashboard.description=Customize dashboard layout and dashlets for a user dashboard +page.data-lists.title=Data Lists +page.data-lists.description=Data lists page +page.discussionsCreateTopic.title=Discussions: view create topic page +page.discussionsCreateTopic.description=Displays the form to create a topic +page.discussionsTopicList.title=Discussions +page.discussionsTopicList.description=Displays the forum topics +page.discussionsTopicView.title=Discussions: display topic detail view +page.discussionsTopicView.description=Displays the topic detail view +page.documentDetails.title=Document Details +page.documentDetails.description=Document details +page.documentLibrary.title=Document Library +page.documentLibrary.description=Document library with Tree view +page.editMetadata.title=Edit Properties +page.editMetadata.description=Edit properties of a node +page.folderDetails.title=Folder Details +page.folderDetails.description=Folder details +page.folderRules.title=Folder Rules +page.folderRules.description=Folder rules +page.geographicMap.title=Google Maps View +page.geographicMap.description=View photo location in Google Maps +page.inlineEdit.title=Edit in Alfresco Share +page.inlineEdit.description=Edit text files in Alfresco Share +page.invite.title=Invite +page.invite.description=Invite +page.links.title=Links +page.links.description=Links +page.linkCreateEdit.title=Links: create or edit link +page.linkCreateEdit.description=Displays a form to create or edit link +page.linksView.title=Links: display links detail view +page.linksView.description=Displays the links detail view +page.login.title=Login +page.logout.title=Logout +page.managePermissions.title=Manage Permissions +page.managePermissions.description=Manage permissions +page.myFiles.title=My Files +page.myFiles.description=Browse my files +page.myDocumentLibraries.title=My Document Libraries +page.myDocumentLibraries.description=My Document libraries launch page +page.myTasks.title=My Tasks +page.myTasks.description=List of Active and Completed tasks. +page.myWorkflows.title=Workflows I've Started +page.myWorkflows.description=Workflows I've Started page +page.pendingInvites.title=Pending +page.pendingInvites.description=Pending Invites and Join Requests +page.peopleFinder.title=People Finder +page.peopleFinder.description=People finder page +page.profile.title=User Profile Page +page.profile.description=Profile page for a User +page.rejectInvite.title=Reject invitation +page.rejectInvite.description=Reject invite page. Rejects an invite request +page.repository.title=Repository Browser +page.repository.description=Browse content across the whole Repository +page.ruleEdit.title=Folder Rules +page.ruleEdit.description=Create or Edit a rule for a folder. +page.search.title=Search +page.search.description=Search view +page.sharedFiles.title=Shared Files +page.sharedFiles.description=Browse shared files +page.siteConsole.title=Sites Manager +page.siteConsole.description=Sites Manager page - site administration tools +page.siteFinder.title=Site Finder +page.siteFinder.description=Site finder page +page.siteIndex.title=Welcome +page.siteIndex.description=Landing page for users - will create user site dashboard as required and forward to it +page.siteGroups.title=Site Groups +page.siteGroups.description=Site Groups +page.siteMembers.title=Site Members +page.siteMembers.description=Site Members +page.startWorkflow.title=Start Workflow +page.startWorkflow.description=Start a new workflow +page.taskDetails.title=Task Details +page.taskDetails.description=Page displaying detailed task information +page.taskEdit.title=Edit Task +page.taskEdit.description=Page for editing task details +page.userContent.title=User Edited Content +page.userContent.description=Lists content that a user has last edited +page.userFollowers.title=Followers +page.userFollowers.description=Lists people that follow the user +page.userFollowing.title=Following +page.userFollowing.description=Lists people that the user follows +page.userNotifications.title=User Notification Settings +page.userNotifications.description=Change Notification Settings section on Profile page for a User +page.userCloudAuth.title=User Cloud Auth +page.userCloudAuth.description=Change Cloud Authentication Details +page.userSites.title=User Sites List +page.userSites.description=Lists sites that a user belongs to +page.userTrashcan.title=User Trashcan +page.userTrashcan.description=List of deleted documents and folders for the current user +page.wiki.title=Wiki +page.wiki.description=The landing page for the wiki +page.wikiCreate.title=Wiki Create Form +page.wikiCreate.description=Displays a form to create a new wiki page +page.wikiPage.title=Wiki +page.wikiPage.description=Displays a wiki page +page.workspace.title=Document Workspace Dashboard +page.workspace.description=Document Workspace dashboard page +page.workflowDetails.title=Workflow Details +page.workflowDetails.description=Workflow Details page + +## Dashboard page titles and descriptions +page.siteDashboard.title=Site Dashboard +page.siteDashboard.description=Collaboration site's dashboard page +page.userDashboard.title=User Dashboard +page.userDashboard.description=Users dashboard page +page.meeting_workspace.title=Meeting Workspace Dashboard +page.meeting_workspace.description=Meeting Workspace dashboard page + +page.error.500.title=Alfresco Share » System Error +page.error.500.header=Something's wrong with this page... +page.error.500.detail=

We may have hit an error or something might have been removed or deleted, so check that the URL is correct.

Alternatively you might not have permission to view the page (it could be on a private site) or there could have been an internal error. Try checking with your IT team.

If you're trying to get to your home page and it's no longer available you should change it by clicking your name on the toolbar.

+page.error.500.nav.dashboard=Back to My Dashboard +page.error.500.footer=Alfresco Software Inc. © 2005-2023 All rights reserved. + +## Title bar component titles for pages that use the simple-title component +title.repository=Repository +title.browser=Browser +title.siteFinder=Site Finder +title.peopleFinder=People Finder +title.myTasks=My Tasks + +## Site Visibility +site.visibility.label.PUBLIC=Public +site.visibility.label.MODERATED=Moderated +site.visibility.label.PRIVATE=Private +site.visibility.description.PUBLIC=Everyone in your organization can access this site. +site.visibility.description.MODERATED=Everyone in your organization can find this site and request access. Access is granted by Site Managers. +site.visibility.description.PRIVATE=Only people added by a Site Manager can find and use this site. + +## Roles +role.SiteManager=Manager +role.SiteManager.description=has full rights to all site content - what they have created themselves and what other site members have created. +role.Collaborator=Collaborator +role.Collaborator.description=has full rights to the content that they own; they have rights to edit but not delete content created by others. +role.SiteCollaborator=Collaborator +role.SiteCollaborator.description=has full rights to the site content that they own; they have rights to edit but not delete content created by other site members. +role.Contributor=Contributor +role.Contributor.description=has full rights to the content that they own; they cannot edit or delete content created by others. +role.SiteContributor=Contributor +role.SiteContributor.description=has full rights to the site content that they own; they cannot edit or delete content created by other site members. +role.Consumer=Consumer +role.Consumer.description=has view-only rights; they cannot create their own content. +role.SiteConsumer=Consumer +role.SiteConsumer.description=has view-only rights in a site; they cannot create their own content. +role.Coordinator=Coordinator +role.Coordinator.description=has full rights to all content - what they have created themselves and what others have created. +role.Editor=Editor +role.Editor.description=has rights to edit file properties and check files in and out; they cannot create their own content. + +roles.readassociations=Consumer + +roles-tooltip.header=About Roles +roles-tooltip.docs-url-label=See more +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Tags +taglibrary.populartagslink=Choose from popular tags in this site +taglibrary.msg.failedLoadTags=Cannot load tags from the server (connection down?) +taglibrary.msg.unableLoadTags=Unable to load tags: {0} +taglibrary.tip.removeTag=Remove tag +taglibrary.tip.help=Separate tags with spaces. Join two or more words using "double quotes" + +## YUI Editor keys +yuieditor.toolbar.group.font=Font Style +yuieditor.toolbar.group.lists=Lists +yuieditor.toolbar.group.link=Link +yuieditor.toolbar.item.createorderedlist=Create ordered list +yuieditor.toolbar.item.createunorderedlist=Create unordered list +yuieditor.toolbar.item.fontcolor=Font color +yuieditor.toolbar.item.backgroundcolor=Background color +yuieditor.toolbar.item.bold=Bold CTRL + SHIFT + B +yuieditor.toolbar.item.italic=Italic CTRL + SHIFT + I +yuieditor.toolbar.item.underline=Underline CTRL + SHIFT + U +yuieditor.toolbar.item.link=HTML Link CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=Select +menu.select.all=All +menu.select.none=None +menu.select.invert=Invert Selection +menu.select.folders=Folders +menu.select.documents=Documents + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Create document from template +menu.create-content.by-template-folder=Create folder from template +menu.selected-items=Selected Items... +menu.selected-items.copy=Copy to... +menu.selected-items.move=Move to... +menu.selected-items.delete=Delete +menu.selected-items.download=Download as Zip +menu.selected-items.assign-workflow=Start Workflow... +menu.selected-items.manage-permissions=Manage Permissions... +menu.selected-items.deselect-all=Deselect All +menu.selected-items.cloudSync=Sync to cloud +menu.selected-items.cloudUnsync=Unsync from cloud +menu.selected-items.cloudRequestSync=Request Sync + +## Document Library Actions +actions.document.assign-workflow=Start Workflow +actions.document.cancel-editing=Cancel Editing +actions.document.cancel-editing-unlock=Unlock document +actions.document.change-type=Change Type +actions.document.copy-to=Copy to... +actions.document.delete=Delete Document +actions.document.download=Download +actions.document.download-again=Download +actions.document.download-original=Download Original +actions.document.edit-metadata=Edit Properties +actions.document.edit-offline=Edit Offline +actions.document.edit-online=Edit in Microsoft Office\u2122 +message.edit-online.supported_office_version_required=You're using a Microsoft Office version that isn't supported. Try updating Microsoft Office. Office 2007 and 2008 don't work with Google Chrome. +actions.document.extract-metadata=Extract Metadata +actions.document.execute-script=Execute Script +actions.document.inline-edit=Edit in Alfresco Share +actions.document.increment-counter=Increment Counter +actions.document.locate=Locate File +actions.document.manage-aspects=Manage Aspects +actions.document.manage-permissions=Manage Permissions +actions.document.take-ownership=Become Owner +actions.document.move-to=Move to... +actions.document.simple-approve=Approve +actions.document.simple-reject=Reject +actions.document.upload-new-version=Upload New Version +actions.document.view=View In Browser +actions.document.view-google-map=View on Google Maps +actions.document.view-original=View Original Document +actions.document.view-source-repository=View in Source Repository +actions.document.view-working-copy=View Working Copy +actions.document.publish=Publish +actions.document.transform=Transform +actions.document.transform-image=Transform to Image +actions.document.publish-content=Publish Content +actions.document.cloud-sync=Sync to Cloud +actions.document.cloud-unsync=Unsync from Cloud +actions.document.view-in-cloud=View in Cloud +actions.document.request-sync=Request Sync +actions.document.unzip-to=Unzip to... +actions.folder.download=Download as Zip +actions.folder.change-type=Change Type +actions.folder.copy-to=Copy to... +actions.folder.delete=Delete Folder +actions.folder.edit-metadata=Edit Properties +actions.folder.locate=Locate Folder +actions.folder.manage-aspects=Manage Aspects +actions.folder.manage-permissions=Manage Permissions +actions.folder.take-ownership=Become Owner +actions.folder.move-to=Move to... +actions.folder.rules=Manage Rules +actions.folder.simple-approve=Approve +actions.folder.simple-reject=Reject +actions.folder.view-details=View Details +actions.folder.view-source-repository=View in Source Repository +actions.folder.cloud-sync=Sync to Cloud +actions.folder.cloud-unsync=Unsync from Cloud +actions.folder.view-in-cloud=View in Cloud +actions.link.delete=Delete Link +actions.link.locate=Locate Linked Item +actions.editOnline.failure=The file ''{0}'' could not be opened for online editing. One of the following plugins required to be installed in your browser. \n For Windows: Microsoft Office 2010 \n For Mac OS X: SharePoint Browser Plug-in +actions.editOnline.invalid=The file ''{0}'' could not be edited online because its path contains characters that are not permitted by SPP protocol.\nInvalid characters include the following: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' is synced and this deletion will remove the document locally and from the cloud. +actions.synced.folder.delete=
''{0}'' is synced and this deletion will remove this folder any content under it locally and from the cloud. +actions.synced.remove-sync=
If the object must stay in the cloud at once execute ''Remove sync'' action. +actions.synced.cloud.document.delete=
''{0}'' is synced and this deletion will only remove the document locally. +actions.synced.cloud.folder.delete=
''{0}'' is synced and this deletion will only remove this folder any content under it locally. +actions.synced.cloud.document.delete.on.prem=
''{0}'' is synced and this deletion will remove the document on premise as well as locally. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' is synced and this deletion will remove this folder any content under it on premise as well as locally. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=Cannot locate Linked Item: target was deleted. +message.change-type.success=Type of document ''{0}'' was successfully changed +message.change-type.failure=Unable to change type of document ''{0}'' +message.confirm.delete=Are you sure you want to delete ''{0}''? +message.delete.success=''{0}'' was deleted +message.delete.failure=Could not delete ''{0}'' +message.multiple-delete.please-wait=Please wait. Files being deleted... +message.confirm.take-ownership.title=Become Owner? +message.confirm.take-ownership=You''ll become the owner of ''{0}'' and the previous owner may have their permissions restricted. +message.take-ownership.success=You are now the owner of ''{0}'' +message.take-ownership.failure=Could not take ownership of ''{0}'' +message.details.success=Details updated successfully +message.details.failure=Could not update details +message.details.failure.name=Could not rename item. Another item may exist with the same name. +message.details.failure.more.max.length=One of the properties has size more than max value. +message.sync.success=Sync was created +message.sync.failure=Could not create sync +message.sync.unavailable=Unable to connect to the sync server. +message.unsync.confirm=Are you sure you want to unsync ''{0}''? +message.unsync.success=Sync has been removed +message.unsync.failure=Could not remove sync +message.request.sync.success=Successfully requested sync +message.request.sync.failure=Could not request sync +message.error=Could not access the Document Library +message.empty=No items +message.empty.subfolders=No items. Click "{0}" to see {1} subfolder(s) here. +message.empty.subfolders.link=Show Folders +message.edit-offline.failure=You cannot edit ''{0}''. +message.edit-offline.success=''{0}'' can now be edited +message.edit-offline.success.ie7=Download the document using the button below. +message.edit-online.office.failure=Could not start MS Office. +message.edit-online.office.path.failure=Edit online is not available as the URL is longer than 260 characters. Use a shallower path to reduce the length. +message.edit-online-aos.no_supported_environment=This feature is only available on Windows or Mac OS X. +message.edit-online-aos.starting_office_failed=Microsoft Office couldn't be opened. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office Blocked +message.edit-online-aos.plugin_blocked.body.firefox=Click the Firefox toolbar to continue. +message.edit-online-aos.plugin_blocked.body.chrome=Click the blocked indicator in the Chrome address bar to continue. +message.edit-online-aos.plugin_blocked.body.safari=Click Trust to continue. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=You're using a Microsoft Office version that isn't supported. Try updating Microsoft Office. +message.edit-online-aos.edit_offline_locked.title={0} is editing this file +message.edit-online-aos.edit_offline_locked.message=Any changes you make might be lost. +message.edit-online-aos.edit_offline_locked.confirm=Continue +message.edit-online-aos.edit_offline_locked.cancel=Cancel +message.edit-online-aos.edit_locked.title={0} is editing this file +message.edit-online-aos.edit_locked.message=The document is currently locked. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=Could not unlock ''{0}''. +message.edit-cancel.failure=Could not cancel editing ''{0}''. +message.edit-cancel.success=Editing ''{0}'' has been cancelled. +message.unlock-document.success=Editing of ''{0}'' has been canceled and the file is now unlocked. +message.file-dnd-move.failure=It was not possible to move the document. +message.increment-counter.success=Counter incremented +message.increment-counter.failure=Counter could not be incremented. +message.extract-metadata.success=Metadata was successfully extracted. +message.extract-metadata.failure=Could not extract metadata. +message.execute-script.success=Script was successfully executed +message.execute-script.failure=Could not execute script +message.insitu-edit.name.failure=Could not rename file. Another file may exist with the same name. +message.loading=Loading the Document Library... +message.simple-workflow.failure=Workflow action could not be completed. +message.simple-workflow.approved=Item marked as approved +message.simple-workflow.rejected=Item marked as rejected +message.simple-workflow.failed=Workflow action could not be completed. +message.transform.success=Document ''{0}'' was successfully transformed +message.transform.failure=Could not transform document +message.transform-image.success=Image ''{0}'' was successfully transformed +message.transform-image.failure=Could not transform document +message.new-version-upload.success=File upload successful. The preview may not yet show the latest version of the document - you can refresh the page later to update it. + +message.insitu-edit.tag.failure=Could not edit tag + +## Drag and Drop +message.dnd.allColumnsAreFull=Cannot add element since all columns are full + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Complianceable +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Effectivity +aspect.cm_emailed=Emailed +aspect.cm_generalclassifiable=Classifiable +aspect.cm_summarizable=Summarizable +aspect.cm_taggable=Taggable +aspect.cm_templatable=Templatable +aspect.cm_versionable=Versionable +aspect.emailserver_aliasable=Email Alias +aspect.app_inlineeditable=Inline Editable +aspect.cm_geographic=Geographic +aspect.exif_exif=EXIF +aspect.exif_resolution=Resolution +aspect.exif_camera=Camera Details +aspect.audio_audio=Audio +aspect.cm_indexControl=Index Control +aspect.dp_restrictable=Restrictable +aspect.cm_attachable=Attachments + +# Groups +group.everyone=EVERYONE + +# Types +type.cm_content=Content Base Type +type.cm_folder=Folder Base Type +type.trx_transferTarget=Transfer Target +type.trx_fileTransferTarget=File Transfer Target + +# Generic Form labels +form.set.general=General +form.set.operations=Operations + +# Runtime +runtime.field.FreeMemory=Free Memory +runtime.field.MaxMemory=Maximum Memory +runtime.field.TotalMemory=Total Memory + +# Repository Server +repository-server.set.version=Version Information +repository-server.field.Name=Name +repository-server.field.Id=Id +repository-server.field.Edition=Edition +repository-server.field.Schema=Schema +repository-server.field.Version=Version +repository-server.field.VersionLabel=Label +repository-server.field.VersionMinor=Minor +repository-server.field.VersionMajor=Major +repository-server.field.VersionRevision=Revision +repository-server.field.VersionBuild=Build +repository-server.field.VersionNumber=Number + +# Repository Installed +repository-installed.set.version=Version Information +repository-installed.field.Name=Name +repository-installed.field.Id=Id +repository-installed.field.Edition=Edition +repository-installed.field.Schema=Schema +repository-installed.field.Version=Version +repository-installed.field.VersionLabel=Label +repository-installed.field.VersionMinor=Minor +repository-installed.field.VersionMajor=Major +repository-installed.field.VersionRevision=Revision +repository-installed.field.VersionBuild=Build +repository-installed.field.VersionNumber=Number + +# Authority +authority.field.NumberOfGroups=Number of Groups +authority.field.NumberOfUsers=Number of Users + +# License +header.license= +license.field.Subject=License Subject +license.field.Days=Days +license.field.Holder=Holder +license.field.ValidUntil=Valid Until +license.field.RemainingDays=Remaining Days +license.field.Issued=Issued +license.field.Issuer=Issuer +license.field.HeartBeatDisabled=Heart Beat Disabled +license.field.LicenseMode=License Mode +license.field.CloudSyncKeyAvailable=Cloud Sync Key Available +license.field.MaxDocs=Max Content Objects +license.field.MaxUsers=Max Users +license.field.Users=Users +license.field.Documents=Content Objects +license.field.Info=This value may show as zero if your license has no restriction on the number of users. + +# Pdf2Swf +pdf2swf.field.Available=Available +pdf2swf.field.VersionString=Version + +# Open Office +openoffice.field.available=Available +openoffice.field.ooName=Name +openoffice.field.ooOpenSourceContext=Open Source Context +openoffice.field.ooSetupExtension=Extension +openoffice.field.ooSetupVersion=Version +openoffice.field.ooSetupVersionAboutBox=About +openoffice.field.ooXMLFileFormatName=XML File Format +openoffice.field.ooXMLFileFormatVersion=XML File Format Version +openoffice.error=Cannot display OpenOffice information +openoffice.error.404=Information about OpenOffice could not be found (Perhaps the "ooo.enabled" property is set to "false"?) + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Enabled +openoffice-subsystem.field.ooo.exe=Exe +openoffice-subsystem.field.ooo.port=Port + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Enabled +ooojodconverter.field.jodconverter.maxTasksPerProcess=Max. Tasks per Process +ooojodconverter.field.jodconverter.officeHome=Office Home +ooojodconverter.field.jodconverter.portNumbers=Port Numbers +ooojodconverter.field.jodconverter.taskExecutionTimeout=Task Execution Timeout +ooojodconverter.field.jodconverter.taskQueueTimeout=Task Queue Timeout + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Available +transformer-imagemagick.field.VersionString=Version Information + +# File servers +fileservers.set.filesystem=Filesystem +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Default Access Level +fileservers.field.filesystem.acl.global.domainAccessControls=Domain Access Controls +fileservers.field.filesystem.acl.global.protocolAccessControls=Protocol Access Controls +fileservers.field.filesystem.acl.global.userAccessControls=User Access Controls +fileservers.field.filesystem.domainMappings=Domain Mappings +fileservers.field.filesystem.name=Filesystem Name +fileservers.field.filesystem.name.description=The name used for the filesystems when accessed via CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=WINS Auto Detect Enabled +fileservers.field.cifs.WINS.primary=WINS Primary +fileservers.field.cifs.WINS.secondary=WINS Secondary +fileservers.field.cifs.bindto=Bind To +fileservers.field.cifs.broadcast=Broadcast +fileservers.field.cifs.disableNIO=Disable NIO +fileservers.field.cifs.disableNativeCode=Disable Native Code +fileservers.field.cifs.domain=Domain +fileservers.field.cifs.enabled=CIFS Enabled +fileservers.field.cifs.hostannounce=Host Announce +fileservers.field.cifs.ipv6.enabled=IPV6 Enabled +fileservers.field.cifs.netBIOSSMB.datagramPort=NetBIOS SMB Datagram Port +fileservers.field.cifs.netBIOSSMB.namePort=NetBIOS SMB Name Port +fileservers.field.cifs.netBIOSSMB.sessionPort=NetBIOS SMB Session Port +fileservers.field.cifs.serverName=Server Name +fileservers.field.cifs.sessionDebug=Session Debug +fileservers.field.cifs.sessionTimeout=Session Timeout +fileservers.field.cifs.tcpipSMB.port=TCP/IP SMB Port +fileservers.field.ftp.dataPortFrom=Dataport From +fileservers.field.ftp.dataPortTo=Dataport To +fileservers.field.ftp.enabled=FTP Enabled +fileservers.field.ftp.keyStore=Keystore +fileservers.field.ftp.passphrase=Passphrase +fileservers.field.ftp.port=Port +fileservers.field.ftp.requireSecureSession=Require Secure Session +fileservers.field.ftp.sessionDebug=Session Debug +fileservers.field.ftp.sslEngineDebug=SSL Engine Debug +fileservers.field.ftp.trustStore=Trust Store + +# Sysadmin +sysadmin.field.alfresco.context=Repository Context +sysadmin.field.alfresco.host=Repository Host +sysadmin.field.alfresco.port=Repository Port +sysadmin.field.alfresco.protocol=Repository Protocol +sysadmin.field.server.allowedusers=Allowed Users +sysadmin.field.server.maxusers=Max Users +sysadmin.field.server.transaction.allow-writes=Allow Writes +sysadmin.field.share.context=Share Context +sysadmin.field.share.host=Share Host +sysadmin.field.share.port=Share Port +sysadmin.field.share.protocol=Share Protocol + +# Email (Inbound) +email-inbound.set.service=Inbound email service +email-inbound.field.email.inbound.enabled=Service Enabled +email-inbound.field.email.inbound.unknownUser=Unknown User +email-inbound.set.server=Inbound email server +email-inbound.field.email.server.allowed.senders=Allowed Senders +email-inbound.field.email.server.blocked.senders=Blocked Senders +email-inbound.field.email.server.enabled=Server Enabled +email-inbound.field.email.server.domain=Domain +email-inbound.field.email.server.port=Port +email-inbound.field.email.server.connections.max=Maximum number of connections +email-inbound.set.tls=Transport Layer Security +email-inbound.field.email.server.requireTLS=Require Transport Layer Security (TLS) +email-inbound.field.email.server.hideTLS=Transport Layer Security(TLS) is not returned by EHELO +email-inbound.field.email.server.enableTLS=Accept Transport Layer Security (TLS) + +# Email (Outbound) +email-outbound.set.auth=Authentication +email-outbound.set.test-message=Test Message +email-outbound.field.mail.host=Host +email-outbound.field.mail.port=Port +email-outbound.field.mail.protocol=Protocol +email-outbound.field.mail.encoding=Encoding +email-outbound.field.mail.from.default=Default Sender Address +email-outbound.field.mail.from.enabled=From Enabled +email-outbound.field.mail.smtp.auth=SMTP Authentication required +email-outbound.field.mail.smtps.auth=SMTPS Authentication required +email-outbound.field.mail.username=Username +email-outbound.field.mail.password=Password +email-outbound.field.mail.testmessage.send=Send test message at startup +email-outbound.field.mail.testmessage.to=To +email-outbound.field.mail.testmessage.subject=Subject +email-outbound.field.mail.testmessage.text=Message + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Home Folder Path +imap.field.imap.config.home.rootPath=Home Root Path +imap.field.imap.config.home.store=Home Store +imap.field.imap.server.attachments.extraction.enabled=Extraction Enabled +imap.field.imap.config.ignore.extraction=Ignore Extraction +imap.field.imap.config.server.mountPoints=Mount Points +imap.field.imap.mail.from.default=Mail from Default +imap.field.imap.mail.to.default=Mail to Default +imap.field.imap.server.enabled=Enabled +imap.field.imap.server.host=Host +imap.field.imap.server.port=Port + +# Activities Feed +activities.set.activities=Activities Feed +activities.field.feed.notifier.enabled=Feed Notifier Enabled +activities.field.feed.notifier.repeatIntervalMins=Repeat Interval (mins) +activities.field.feed.max.ageMins=Maximum Age (mins) +activities.field.feed.max.size=Maximum Size + +# Subscriptions +subscriptions.field.subscriptions.enabled=Enabled + +# Workflow +workflow.field.message=Message +workflow.field.comment=Comment +workflow.field.assign_to=Assign To +workflow.field.review_group=Review Group +workflow.field.reviewer=Reviewer +workflow.field.reviewers=Reviewers +workflow.field.due=Due +workflow.field.priority=Priority +workflow.field.outcome=Outcome +workflow.field.enabled.activiti=Enabled +workflow.field.enabled.jbpm=Enabled +workflow.field.definitions.visible=Definitions Visible +workflow.field.number.tasks=Number Of Tasks +workflow.field.number.definitions=Number Of Definitions +workflow.field.number.workflows=Number Of Workflows +workflow.field.requiredApprovePercent=Required Approval Percentage +workflow.set.general=General +workflow.set.assignee=Assignee +workflow.set.assignees=Assignees +workflow.set.information=Information +workflow.set.items=Items +workflow.set.outcome=Outcome +workflow.set.other=Other Options +workflow.set.task.info=Info +workflow.set.workflow.more_info=More Info +workflow.set.task.progress=Progress +workflow.set.response=Response +workflow.set.engine.activiti=Activiti Engine +workflow.set.engine.jbpm=JBPM Engine +workflow.task.error=Failed to load task. +workflow.task.error.404=Task does not exist or is cancelled. +workflow.task.invite.title={0} Site +workflow.task.invite.subtitle=You have been invited to join the {0} Site. +workflow.task.invite.role=Your role will be {0}. +workflow.task.invite.accepted={0} {1} has accepted your invitation to join the {2} Site. +workflow.task.invite.rejected={0} {1} has rejected your invitation to join the {2} Site. +workflow.task.request.invite.title=User {0} has requested to join the {1} Site. +workflow.cancel.title=Cancel workflow +workflow.cancel.label=Are you sure you want to cancel the workflow? +workflow.cancel.feedback=Cancelling workflow... +workflow.cancel.success=Workflow was successfully cancelled +workflow.cancel.failure=Failed to cancel workflow +workflow.delete.title=Delete workflow +workflow.delete.label=Are you sure you want to delete the workflow? +workflow.delete.feedback=Deleting workflow... +workflow.delete.success=Workflow was successfully deleted +workflow.delete.failure=Failed to delete workflow +workflow.no_message=(No Message) +tool.workflow.activiti.tools=Activiti Tools +tool.workflow.activiti.admin.link=Activiti Workflow Console + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Search Manager +tool.searchmanager.description=Search Manager + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Enabled +lucene.field.dir.indexes=Index Directory +lucene.field.index.recovery.mode=Index Recovery Mode +lucene.field.lucene.indexer.contentIndexingEnabled=Content Indexing Enabled +lucene.field.index.tracking.disableInTransactionIndexing=Disable in Transaction Indexing + +lucene.set.backup=Backup +lucene.backup.field.dir.indexes.backup=Index Backup Directory +lucene.backup.field.index.backup.cronExpression=Backup Cron Expression + +lucene.set.advanced=Advanced +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Content Indexing Enabled +lucene.advanced.field.fts.indexer.batchSize=Indexing Batch Size +lucene.advanced.field.lucene.maxAtomicTransformationTime=Max. Atomic Transformation Time +lucene.advanced.field.index.reindexMissingContent.cronExpression=Missing Content Cron Expression +lucene.advanced.field.indexer.maxFieldLength=Max number of indexed tokens per document +lucene.field.indexer.mergerMaxMergeDocs=Max Merge Documents +lucene.field.indexer.mergerMergeFactor=Max Merge Factor + +# Transform action form +transform.field.mime-type=Required Format +transform.field.destination-folder=Destination + +# Transform Image action form +transform-image.field.mime-type=Required Format +transform-image.field.convert-command=Options +transform-image.field.destination-folder=Destination + +publish-content.field.publish-channel-id=Publishing Channel +publish-content.field.unpublish=Unpublish +publish-content.field.status-update=Status Update +publish-content.field.status-update-channel-id=Status Update Channels + +# Execute Script action form +script.field.script-ref=Script + +# Solr +solr.set.spacesstore=Main Store Properties +solr.set.archivestore=Archive Store Properties +solr.field.search.solrTrackingSupport.enabled=Tracking Enabled +solr.help.search.solrTrackingSupport.enabled=Enable to allow Solr to connect to this server, track and index updates +solr.field.solr.host=Solr Hostname +solr.help.field.solr.host=Hostname where you Solr server is running. Use localhost if running on the same machine. +solr.field.solr.port=Solr Port (Non-SSL) +solr.help.field.solr.port=The (non-secure) http port of the application server on which Solr is running. Only used if Solr is configured to run without secure communications. +solr.field.solr.port.ssl=Solr SSL Port +solr.help.field.solr.port.ssl=The https port of the application server on which Solr is running. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indexing in Progress +solr.field.tracker.alfresco.lag=Index Lag (Seconds) +solr.field.tracker.alfresco.last.indexed.txn=Last Indexed Transaction +solr.field.tracker.alfresco.approx.txns.remaining=Approx Transactions to Index +solr.field.tracker.alfresco.approx.indexing.time.remaining=Approx Index Time Remaining +solr.help.field.tracker.alfresco.lag=Solr indexes are updated in the background. This is the time (in seconds) this Solr fulltext index is currently behind the repository updates. +solr.field.tracker.archive.active=Indexing in Progress +solr.field.tracker.archive.lag=Index Lag (Seconds) +solr.field.tracker.archive.last.indexed.txn=Last Indexed Transaction +solr.field.tracker.archive.approx.txns.remaining=Approx Transactions to Index +solr.field.tracker.archive.approx.indexing.time.remaining=Approx Index Time Remaining + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Backup Cron Expression +solr.field.solr.backup.alfresco.remoteBackupLocation=Backup Location +solr.field.solr.backup.alfresco.numberToKeep=Backups To Keep +solr.help.solr.backup.alfresco.remoteBackupLocation=Full path to location on the Solr server filesystem to store the index backup +solr.help.solr.backup.alfresco.numberToKeep=The number of backups to keep (including the latest backup) +solr.field.solr.backup.archive.cronExpression=Backup Cron Expression +solr.field.solr.backup.archive.remoteBackupLocation=Backup Location +solr.field.solr.backup.archive.numberToKeep=Backups To Keep +solr.help.solr.backup.archive.remoteBackupLocation=Full path to location on the Solr server filesystem to store the index backup +solr.help.solr.backup.archive.numberToKeep=The number of backups to keep (including the latest backup) + +# searchmanager +searchmanager.field.sourceBeanName=Search Service + +## Tooltips +tooltip.path=Path: {0} +tooltip.site=Site: {0} + +## Create content +create-content.text=Plain Text... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Folder + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Choose Month +calendar.widget_control_config.label_year=Enter Year +calendar.widget_control_config.label_invalid_year=Please enter a valid year + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Link to: {0} +details.created-by=Created {0} by {1} +details.created-in-site=Created {0} in {1} +details.editing-started-by=Editing started {0} by {1} +details.editing-started-in-site=Editing started {0} in {1} +details.modified-by=Modified {0} by {1} +details.modified-in-site=Modified {0} in {1} +details.description.none=No Description +details.tags.none=No Tags +details.categories.none=No Categories +details.user.deleted=''{0}'' (Deleted User) + +## Social Interactions +# Favourite +favourite.document.add.tip=Add document to favorites +favourite.document.add.label=Favorite +favourite.document.remove.tip=Remove document from favorites +favourite.folder.add.tip=Add folder to favorites +favourite.folder.add.label=Favorite +favourite.folder.remove.tip=Remove folder from favorites +favourite.imap-site.add.tip=Add site to IMAP favorites +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Remove site from IMAP favorites +favourite.site.add.tip=Add site to favorites +favourite.site.add.label=Favorite +favourite.site.remove.tip=Remove site from favorites +favourite.message.failure=Failed to save favorite +# Like +like.document.add.tip=Like this document +like.document.add.label=Like +like.document.remove.tip=Unlike +like.folder.add.tip=Like this folder +like.folder.add.label=Like +like.folder.remove.tip=Unlike +like.site.add.tip=Like this site +like.site.add.label=Like +like.site.remove.tip=Unlike +like.message.failure=Failed to save like +# Quickshare +quickshare.link.label=Public Link +quickshare.link.tooltip=Press ctrl-c to copy +quickshare.link.tooltip.mac=Press cmd-c to copy +quickshare.view.label=View +quickshare.unshare.label=Unshare +quickshare.document.shared.label=Shared +quickshare.document.shared.tip=This document is shared (click for more options) +quickshare.document.share.label=Share +quickshare.document.share.tip=Share document +quickshare.document.share.failure=Document could not be shared +quickshare.document.unshared.label=Share +quickshare.document.unshared.tip=Share document +quickshare.document.unshare.success=Document is not shared anymore +quickshare.document.unshare.failure=Document could not be unshared +quickshare.document.unshare.user.failure=You do not have the appropriate permissions to perform the Unshare action. +quickshare.linkshare.label=Share with +# LinkShare +linkshare.action.email.label=Share by Email +linkshare.action.email.subject=File Shared from Alfresco Content Services +linkshare.action.email.body=File {1} shared from Alfresco Content Services, look at it here: {0} +linkshare.action.facebook.label=Share using Facebook +linkshare.action.facebook.message=File {1} shared from Alfresco Content Services +linkshare.action.twitter.label=Share using Twitter +linkshare.action.twitter.message=File {1} shared from Alfresco Content Services +linkshare.action.google-plus.label=Share using Google+ + + +# Comment +comment.document.tip=Comment on this document +comment.document.label=Comment +comment.folder.tip=Comment on this folder +comment.folder.label=Comment + +#Dashlets +dashlet.help.tooltip=Display help for this dashlet +dashlet.rss.tooltip=Subscribe to the RSS feed for this dashlet +dashlet.edit.tooltip=Configure this dashlet + +#Module Package Admin page +tool.module-package.label=Module Browser +tool.module-package.description=Module Browser + +# Category Manager Admin Console +tool.category-manager.label=Category Manager +tool.category-manager.description=Category Manager +tool.category-manager.edit-category=Edit Category +tool.category-manager.edit-category.failure=Unable to edit name. +tool.category-manager.add-category=Add Category +tool.category-manager.add-category.failure=Category could not be added. +tool.category-manager.label.category-name=Category name: +tool.category-manager.delete-category=Delete Category +tool.category-manager.delete-category.failure=Category could not be deleted. +tool.category-manager.message.confirm.delete.title=Delete Category +tool.category-manager.message.confirm.delete=Are you sure you want to delete: {0}? + +# Node browser +tool.node-browser.label=Node Browser +tool.node-browser.description=Node Browser + +# Label +label.folder=Folder +label.document=Document +label.blogpost=Blog Post +label.forumpost=Forum Topic +label.calendarevent=Calendar Event +label.wikipage=Wiki Page +label.link=Link +label.datalist=Data List +label.datalistitem=Data List Item +label.unknown=Unknown +label.download=Download +label.viewinbrowser=View In Browser +label.viewdetails=View Details +label.selectAll=Select All +label.selectInvert=Invert Selection +label.selectNone=None +label.selectedItems=Selected Items +label.select=Select +label.restricted-settings=Alfresco Identity Service is enabled, some settings are restricted. + +# Path +message.infolderpath=In folder + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Sync Pending +sync.status.synced=Synced {0}, by {1} +sync.status.last-attempt=Last successful sync {0}, by {1} +sync.status.failed=Sync attempted {0}, by {1} +sync.status.last-failed=Last sync failed +sync.status.transient-error=Temporary sync error +sync.status.transient-error.default-details=Syncing will resume once Alfresco Content Services is able to communicate with the cloud again. +sync.status.copy.pending=Sync Pending on {2} +sync.status.copy.synced={2} synced {0}, by {1} +sync.status.copy.last-attempt={2} last successfully sync {0}, by {1} +sync.status.copy.failed=sync attempted on {2} {0}, by {1} +sync.status.copy.last-failed=Last sync of {2} failed +sync.status.show-details=Show Details +sync.status.hide-details=Hide Details +sync.status.title=Sync Info +sync.status.action.more=More info +sync.original-document=Original document + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=Unable to display Sync status +sync.unable.get.details=Unable to get node details + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Remove ''{0}'' from the cloud. +sync.remove.folder.from.cloud=Remove ''{0}'' and any content under it from the cloud. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Content with the same name already exists in the target folder. +sync.folder.not_found=Cannot find folder. +sync.node.already_synced=Cannot create content: it has already been synchronized from another location. +sync.node.other_sync_set=This content has already been synchronized from another location. +sync.node.no_longer_exists=This content no longer exists on Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=This content no longer exists on Alfresco Content Services in the Cloud. Click Request Sync to try again. +sync.node.unknown=We hit a problem, please try again. +sync.node.unknown.description=An unexpected error occurred. Cause: {0}. +sync.node.access_denied=Cannot synchronize the content: you don't have permission to access the target file. +sync.node.access_denied_source=Cannot synchronize the content: you don't have permission to access the source file. +sync.node.content_limit_violation=This file exceeds the content limit. The file is too large to perform the action. +sync.node.quota_limit_violation=You have exceeded the content quota. There isn't enough free space to perform the action. +sync.node.authentication_error=Cannot synchronize the content to the cloud: the authentication details are not valid. +sync.node.authentication_error.description=Cannot synchronize the content to the cloud: the authentication details for the user {0} are not valid. +sync.node.owner_not_found=We can't synchronize the content because the owner has been removed or deleted. +sync.node.owner_not_found.description=The user who owns this sync, {0}, no longer exists. Please click Unsync. + +sync.communications.error=Unable to communicate with remote system +sync.communications.error.description=Unable to communicate with remote system. Sync will automatically work once communications work + +# Cloud Sync no network available for sync +sync.message.no.active.network=No network is enabled for sync + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=New Folder +sync.new-folder.in-the-cloud.header=New Folder Details +sync.new-folder.creation.success=Folder successfully created +sync.new-folder.creation.failure=Unable to create folder + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=Sync ID +hybridsync.ssd-failed-reason-header-label=Sync Failure Type +hybridsync.path-desc-header-label=Original Item Location +hybridsync.sync-creator-header-label=Sync Creator +hybridsync.cloud-user-header-label=Cloud User +hybridsync.remote-tenant-id-header-label=Cloud Network +hybridsync.target-folder-node-ref-header-label=Cloud Destination +hybridsync.actions-header-label=Actions + +#Hybrid workflow +hybridworkflow.destination-select.title=Select destination for documents on Cloud +hybridworkflow.set.destination=Destination and Assignee +hybridworkflow.authority.single=Assignee +hybridworkflow.authority.multiple=Reviewers +hybridworkflow.review.approved=Approved +hybridworkflow.review.rejected=Rejected +hybridworkflow.destination-select.folderPrefix=Documents +hybridworkflow.destination.network=Network +hybridworkflow.destination.site=Site +hybridworkflow.destination.folder=Folder +hybridworkflow.destination.button=Select + +# Security +security.insecuremimetype=The mimetype for the requested content is considered a security risk and will not be displayed. + +# Lightbox +lightbox.close=close +lightbox.loading=loading diff --git a/share/src/main/resources/alfresco/messages/slingshot_de.properties b/share/src/main/resources/alfresco/messages/slingshot_de.properties new file mode 100755 index 0000000000..f7228f6d14 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_de.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Suchbegriffe eingeben... +# header menu items +header.advanced-search.label=Erweiterte Suche... +header.advanced-search.description=Erweiterte Suche... +header.application.label=Anwendung +header.application.description=Anwendung +header.change-password.label=Passwort \u00e4ndern +header.change-password.description=Passwort \u00e4ndern +header.groups.label=Gruppen +header.groups.description=Gruppen +header.tag-management.label=Tag-Manager +header.tag-management.description=Tag-Manager +header.help.label=Hilfe +header.help.description=Hilfe +header.logout.label=Abmelden +header.logout.description=Abmelden +header.more.label=Mehr... +header.more.description=Mehr... +header.my.label=Mein... +header.my.description=Mein... +header.my-content.label=Mein Inhalt +header.my-content.description=Mein Inhalt +header.my-dashboard.label=Mein Dashboard +header.my-dashboard.description=Mein Dashboard +header.my-profile.label=Mein Profil +header.my-profile.description=Mein Profil +header.my-sites.label=Meine Sites +header.my-sites.description=Meine Sites +header.my-tasks.label=Meine Aufgaben +header.my-tasks.description=Meine Aufgaben +header.my-workflows.label=Begonnene Workflows +header.my-workflows.description=Begonnene Workflows +header.people.label=Mitarbeiter +header.people.description=Mitarbeiter +header.replication-jobs.label=Replikationsjobs +header.replication-jobs.description=Replikationsjobs +header.repository.label=Repository +header.repository.description=Repository +header.trashcan.label=Papierkorb +header.trashcan.description=Tools zum Wiederherstellen und L\u00f6schen von Dateien +header.saved-searches.label=Gespeicherte Suchen +header.saved-searches.description=Gespeicherte Suchen +header.search.description=Suchoptionen... +header.sites.label=Sites +header.sites.description=Sites +header.submit-status.label=Freigeben +header.submit-status.description=Freigeben +header.tools.label=Administratoren-Tools... +header.tools.description=Administratoren-Tools... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Benutzer +header.users.description=Benutzer + +## Buttons +button.browse=Durchsuchen +button.edit=Bearbeiten +button.save=Speichern +button.savechanges=\u00c4nderungen speichern +button.saveandclose=Speichern und Schlie\u00dfen +button.upload=Hochladen +button.login=Anmelden +button.delete=L\u00f6schen +button.take-ownership=OK +button.download=Herunterladen +button.clear=L\u00f6schen +button.reset=Zur\u00fccksetzen +button.search=Suche +button.update=Aktualisieren +button.goback=Zur\u00fcck +button.done=Fertig +button.undo=R\u00fcckg\u00e4ngig machen +button.new=Neu +button.create=Erstellen +button.rename=Umbenennen +button.refreshPage=Seite neu laden +button.createanother=Erstellen und eine weitere erstellen +button.view.simple=Einfache Ansicht +button.view.detailed=Detaillierte Ansicht +button.view.gallery=Galerieansicht +button.view.filmstrip=Filmstreifen-Ansicht +button.view.table=Tabellenansicht +button.view.media-table=Medienansicht +button.view.email=E-Mail-Ansicht +button.view.audio=Audio-Ansicht +button.view.dublinCore=Dublin Core-Ansicht +button.view.effectivity=Effektivit\u00e4tsansicht + +button.follow=Folgen +button.unfollow=Nicht mehr folgen +button.unsync=Synchronisation entfernen + +## Messages +message.failure=Fehler +message.failure.workflow=Benutzer {0} ist nicht zum Zugriff auf diese Aufgabe berechtigt. +message.loginfailure=Anmeldung fehlgeschlagen +message.loginautherror=Ihre Authentifizierungsdaten wurden nicht erkannt oder Alfresco Content Services ist zurzeit nicht verf\u00fcgbar. +message.passwordchangeauthfailed=Falsche Authentifizierungsdaten, oder Sie d\u00fcrfen das Passwort nicht \u00e4ndern. +message.login-portal=Bitte melden Sie sich \u00fcber Ihr Portal an. +message.unsavedChanges.blog=Ihr Blog-Post hat ungespeicherte \u00c4nderungen. +message.unsavedChanges.comment=Ihr Kommentar wurde noch nicht gespeichert. +message.unsavedChanges.discussion=Ihr Diskussionsbeitrag hat ungespeicherte \u00c4nderungen. +message.unsavedChanges.reply=Ihre Antwort auf das Thema hat ungespeicherte \u00c4nderungen. +message.unsavedChanges.wiki=Ihr Wiki-Artikel hat ungespeicherte \u00c4nderungen. +message.searching=Suche... +message.searchingFor=Suche nach ''{0}''... +message.minimum-length=Geben Sie mindestens {0} Buchstaben ein +message.folders-trimmed=Liste wurde auf {0} Eintr\u00e4ge beschr\u00e4nkt +message.item-missing=Angefordertes Element kann nicht angezeigt werden, da es nicht mehr verf\u00fcgbar ist. +message.save.success=Ihre \u00c4nderungen wurden gespeichert. +message.save.failure=Ihre \u00c4nderungen konnten nicht gespeichert werden. +message.cookiesfailure=Cookies sind deaktiviert +message.cookieserror=Cookies m\u00fcssen in Ihrem Browser aktiviert sein. +message.siteRedirect.noPages.manager=Ein Site-Manager hat alle Funktionen dieser Site deaktiviert.
Klicken Sie auf das Symbol f\u00fcr die Einstellungen   und w\u00e4hlen Sie die Option 'Site anpassen', um bestimmte Site-Funktionen wieder hinzuzuf\u00fcgen. +message.siteRedirect.noPages.user=Ein Site-Manager hat alle Funktionen dieser Site deaktiviert.
Sehen Sie sich die Liste der Site-Mitglieder an, um einen Site-Manager zu finden, der Funktionen zur Site hinzuf\u00fcgen kann. +message.logged-out=Sie sind jetzt abgemeldet. +message.timeout=Server-Zeit\u00fcberschreitung. Bearbeitung der Anfrage hat zu lange gedauert. Bitte versuchen Sie es sp\u00e4ter noch einmal. +message.loading=Laden... +message.viewInCloud.failure=URL konnte nicht abgerufen werden. \u00dcberpr\u00fcfen Sie den Synchronisationsstatus. +message.logged-out=Sie sind jetzt abgemeldet. + +## Common Text labels and CM model metadata +label.tags=Tags +label.none=(Kein) +label.empty=(Leer) +label.about=\u00dcber +label.username=Benutzername +label.password=Passwort +label.copyright=© 2005-2023 Alfresco Software Inc. Alle Rechte vorbehalten. +label.name=Name +label.id=ID +label.title=Titel +label.description=Beschreibung +label.version=Version +label.firstname=Vorname +label.lastname=Nachname +label.jobtitle=Jobtitel +label.location=Speicherort +label.bio=Zusammenfassung +label.photo=Foto +label.contactinfo=Kontaktinformationen +label.skype=Skype +label.im=Chat +label.googleusername=Google-Benutzername +label.company=Unternehmen +label.companyinfo=Unternehmensdetails +label.companyname=Name +label.companyaddress=Anschrift +label.companytelephone=Telefon +label.companyfax=Fax +label.companyemail=E-Mail +label.companypostcode=Postleitzahl +label.email=E-Mail +label.telephone=Telefon +label.mobile=Mobil +label.fax=Fax +label.address=Anschrift +label.postcode=Postleitzahl +label.groups=Gruppen +label.yes=Ja +label.no=Nein +label.ok=OK +label.loading=Laden... +label.validating=\u00dcberpr\u00fcfung... +label.validationError=Anmeldedaten konnten nicht \u00fcberpr\u00fcft werden. +label.site=Site +label.path=Pfad +label.type=Typ +label.creator=Ersteller +label.created=Erstellt +label.modifier=Bearbeiter +label.modified=Ge\u00e4ndert +label.author=Autor +label.priority={0} Priorit\u00e4t +label.size=Gr\u00f6\u00dfe +label.mimetype=MIME-Type +label.mimetype.unknown=Unbekannt +label.popularity=Popularit\u00e4t +label.avatar=Avatar +label.editType=Bearbeiten: {0} +label.moreInfo=Mehr Info > +label.actions.column.header=Aktionen +# Dictionary Model +label.modelActive=Aktiv +label.modelName=Modellname +label.modelDescription=Beschreibung des Modells +# Transfer Targets +label.trx_enabled=Aktiviert +label.trx_endpointhost=\u00dcbertragung zum Host +label.trx_endpointport=Port +label.you=Ihnen +label.licensedTo=Lizenziert f\u00fcr: + +## Location +location.tooltip.path=Pfad: {0} +location.tooltip.site=Seite: {0} +location.path.repository=Repository +location.path.documents=Dokumente +location.path.userHome=Meine Benutzer - Home +location.path.myfiles=Meine Dateien +location.path.shared=Freigegebene Dateien +location.label.none=(Kein) +location.label.local={0} +location.label.site={0} in {1} +location.label.repository={0} + +## EXIF +label.exif.width=Breite +label.exif.height=H\u00f6he + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} von {totalRecords} +pagination.template.page-report.more=Zeige Elemente {startRecord} - {endRecord} von {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} von {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Helles Farbschema +theme.default=Blaues Farbschema +theme.greenTheme=Gr\u00fcnes Farbschema +theme.hcBlack=Hoch-Kontrast-Farbschema +theme.yellowTheme=Gelbes Farbschema +theme.gdocs=Google Docs-Farbschema + +## Admin console tools +tool.users.label=Benutzer +tool.users.description=Benutzerverwaltung +tool.groups.label=Gruppen +tool.groups.description=Gruppenverwaltung +tool.application.label=Anwendung +tool.application.description=Anwendungseinstellungen und -verwaltung +tool.replication-jobs.label=Replikationsjobs +tool.replication-jobs.description=Verwaltung von Replikationsjobs +tool.repository.label=Repository-Tools +tool.repository.description=Repository-Tools +tool.tag-management.label=Tag-Manager +tool.tag-management.description=Tag-Manager +tool.workflow.label=Workflow +tool.workflow.description=Workflow-Tools +tool.trashcan.label=Papierkorb +tool.trashcan.description=Tools zum Wiederherstellen und L\u00f6schen von Dateien +tool.email-inbound.label=E-Mail (eingehend) +tool.email-inbound.description=E-Mail (eingehend) +tool.email-outbound.label=E-Mail (ausgehend) +tool.email-outbound.description=E-Mail (ausgehend) +tool.email-imap.label=E-Mail (IMAP) +tool.email-imap.description=E-Mail (IMAP) +tool.runtime.label=Laufzeit +tool.runtime.description=Laufzeit +tool.repository-server.label=Repository-Deskriptor (aktuell) +tool.repository-server.description=Repository-Deskriptor (aktuell) +tool.repository-installed.label=Repository-Deskriptor (urspr\u00fcnglich installiert) +tool.repository-installed.description=Repository-Deskriptor (urspr\u00fcnglich installiert) +tool.authority.label=Authority +tool.authority.description=Authority +tool.license.label=Lizenz-Deskriptor +tool.license.description=Lizenz-Deskriptor +tool.license.link=Mein Abonnement verwalten +tool.license.usageinfo.label=Information zur Lizenzverwaltung +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=OpenOffice-System +tool.openoffice-subsystem.description=OpenOffice-System +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Transformator pdf2swf +tool.transformer-pdf2swf.description=Transformator pdf2swf +tool.transformer-imagemagick.label=Transformator ImageMagick +tool.transformer-imagemagick.description=Transformator ImageMagick +tool.fileservers.label=Dateiserver +tool.fileservers.description=Dateiserver +tool.subscriptions.label=Abonnements +tool.subscriptions.description=Abonnements +tool.sysadmin.label=SysAdmin +tool.sysadmin.description=SysAdmin +tool.activities.label=Aktivit\u00e4ten-Feed +tool.activities.description=Aktivit\u00e4ten-Feed +tool.workflow.label=Workflow +tool.workflow.description=Workflow +tool.manage-sites.label=Sites-Manager +tool.manage-sites.description=Sites-Manager +tool.cloud-sync-management.label=Cloud-Synchronisations-Manager +tool.cloud-sync-management.description=Cloud-Synchronisations-Manager +tool.search-manager.label=Suchmanager +tool.search-manager.description=Suchmanager + +## Admin console tool groups +tool.group.usersgroups=Benutzer und Gruppen +tool.group.email=E-Mail +tool.group.transformations=Umwandlungen +tool.group.filemanagement=Dateiverwaltung +tool.group.subscriptions=Abonnements +tool.group.repository=Repository +tool.group.search=Suche +tool.group.site=Sites + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Einladung annehmen +page.acceptInvite.description=Seite 'Einladung annehmen'. Durch das Laden dieser Seite wird die Annahme der Einladung ausgel\u00f6st und das Benutzerkonto wird freigeschaltet, sofern das noch nicht geschehen ist +page.addGroups.title=Gruppen hinzuf\u00fcgen +page.addGroups.description=Gruppen hinzuf\u00fcgen +page.add-users.title=Benutzer hinzuf\u00fcgen +page.add-users.description=Benutzer zu einer Site hinzuf\u00fcgen +page.adminConsole.title=Administratoren-Tools +page.adminConsole.description=Administrations- und Management-Konsole +page.advsearch.title=Erweiterte Suche +page.advsearch.description=Ansicht 'Erweiterte Suche' +page.blogCreateEdit.title=Blog: Blog-Post erstellen oder bearbeiten +page.blogCreateEdit.description=Zeigt ein Formular an, um einen Blog-Post zu erstellen oder zu \u00e4ndern +page.blogPostList.title=Blog +page.blogPostList.description=Zeigt Blog-Posts an +page.blogPostView.title=Blog: Ansicht der Details eines Posts +page.blogPostView.description=Zeigt die Details eines Posts an +page.calendar.title=Kalender +page.calendar.description=Site 'Kalender-Komponente' +page.changePassword.title=Benutzerpasswort \u00e4ndern +page.changePassword.description=Passwortbereich auf Profilseite eines Benutzers \u00e4ndern +page.contentViewer.title=Inhalts-Betrachter +page.contentViewer.description=Seite, um den Inhalt einer Node-Ref anzuzeigen +page.createContent.title=Inhalt erstellen +page.createContent.description=Textbasierten Inhalt erstellen +page.createEditReplicationJob.title=Replikationsjob +page.createEditReplicationJob.description=Neuen Replikationsjob anlegen oder bestehenden bearbeiten +page.customiseSite.title=Site anpassen +page.customiseSite.description=Seiten zu einer Site hinzuf\u00fcgen und entfernen +page.customiseSiteDashboard.title=Site-Dashboard anpassen +page.customiseSiteDashboard.description=Dashboard-Layout und Dashlets f\u00fcr eine Site anpassen +page.customiseUserDashboard.title=Benutzer-Dashboard anpassen +page.customiseUserDashboard.description=Dashboard-Layout und Dashlets f\u00fcr einen Benutzer anpassen +page.data-lists.title=Datenlisten +page.data-lists.description=Seite der Datenlisten +page.discussionsCreateTopic.title=Diskussionen: Seite 'Thema erstellen' anzeigen +page.discussionsCreateTopic.description=Zeigt das Formular zum Erstellen eines Themas an +page.discussionsTopicList.title=Diskussionen +page.discussionsTopicList.description=Zeigt Themen des Forums an +page.discussionsTopicView.title=Diskussionen: Ansicht der Details eines Themas +page.discussionsTopicView.description=Zeigt die Ansicht der Details eines Themas an +page.documentDetails.title=Dokumentendetails +page.documentDetails.description=Dokumentendetails +page.documentLibrary.title=Dokumentenbibliothek +page.documentLibrary.description=Dokumentenbibliothek mit Baumstruktur-Ansicht +page.editMetadata.title=Eigenschaften bearbeiten +page.editMetadata.description=Eigenschaften eines Nodes bearbeiten +page.folderDetails.title=Ordnerdetails +page.folderDetails.description=Ordnerdetails +page.folderRules.title=Ordnerregeln +page.folderRules.description=Ordnerregeln +page.geographicMap.title=Google Maps Ansicht +page.geographicMap.description=Zeige den Ort des Fotos in Google Maps +page.inlineEdit.title=In Alfresco Share bearbeiten +page.inlineEdit.description=Textdateien in Alfresco Share bearbeiten +page.invite.title=Einladen +page.invite.description=Einladen +page.links.title=Links +page.links.description=Links +page.linkCreateEdit.title=Links: Link erstellen oder bearbeiten +page.linkCreateEdit.description=Zeigt das Formular zum Erstellen oder Bearbeiten eines Links an +page.linksView.title=Links: Details eines Links anzeigen +page.linksView.description=Zeigt die Ansicht der Details eines Links an +page.login.title=Anmelden +page.logout.title=Abmelden +page.managePermissions.title=Berechtigungen verwalten +page.managePermissions.description=Berechtigungen verwalten +page.myFiles.title=Meine Dateien +page.myFiles.description=Meine Dateien durchsuchen +page.myDocumentLibraries.title=Meine Dokumentenbibliotheken +page.myDocumentLibraries.description=Startseite meiner Dokumentenbibliotheken +page.myTasks.title=Meine Aufgaben +page.myTasks.description=Liste aktiver und abgeschlossener Aufgaben. +page.myWorkflows.title=Begonnene Workflows +page.myWorkflows.description=Seite 'Begonnene Workflows' +page.pendingInvites.title=Ausstehend +page.pendingInvites.description=Ausstehende Einladungen und Beitrittsanfragen +page.peopleFinder.title=Mitarbeiter-Finder +page.peopleFinder.description=Seite 'Mitarbeiter-Finder' +page.profile.title=Benutzerprofilseite +page.profile.description=Profilseite eines Benutzers +page.rejectInvite.title=Einladung ablehnen +page.rejectInvite.description=Seite 'Einladung ablehnen'. Lehnt eine Einladung ab +page.repository.title=Repository-Browser +page.repository.description=Das gesamte Repository durchsuchen +page.ruleEdit.title=Ordnerregeln +page.ruleEdit.description=Erstellt oder bearbeitet die Regel f\u00fcr einen Ordner. +page.search.title=Suche +page.search.description=Suchansicht +page.sharedFiles.title=Freigegebene Dateien +page.sharedFiles.description=Freigegebene Dateien durchsuchen +page.siteConsole.title=Sites-Manager +page.siteConsole.description=Sites-Manager-Seite - Site-Administratortools +page.siteFinder.title=Site-Finder +page.siteFinder.description=Seite 'Site-Finder' +page.siteIndex.title=Willkommen +page.siteIndex.description=Einstiegsseite f\u00fcr Benutzer - erstellt das geforderte Dashboard f\u00fcr den Benutzer und leitet ihn dort hin weiter +page.siteGroups.title=Site-Gruppen +page.siteGroups.description=Site-Gruppen +page.siteMembers.title=Site-Mitglieder +page.siteMembers.description=Site-Mitglieder +page.startWorkflow.title=Workflow starten +page.startWorkflow.description=Einen neuen Workflow starten +page.taskDetails.title=Aufgabendetails +page.taskDetails.description=Seite mit genauen Informationen zur Aufgabe +page.taskEdit.title=Aufgabe bearbeiten +page.taskEdit.description=Seite zur Bearbeitung der Aufgabendetails +page.userContent.title=Vom Benutzer ge\u00e4nderte Inhalte +page.userContent.description=Liste der vom Benutzer zuletzt ge\u00e4nderten Inhalte +page.userFollowers.title=Anh\u00e4nger +page.userFollowers.description=Listet Personen auf, die diesem Benutzer folgen +page.userFollowing.title=Folgen +page.userFollowing.description=Listet Personen, denen dieser Benutzer folgt +page.userNotifications.title=Benachrichtigungseinstellungen des Benutzers +page.userNotifications.description=Benachrichtigungseinstellungsbereich auf Profilseite eines Benutzers \u00e4ndern +page.userCloudAuth.title=Cloud-Benutzerauthentifizierung +page.userCloudAuth.description=Cloud-Authentifizierungsdaten \u00e4ndern +page.userSites.title=Liste der Sites des Benutzers +page.userSites.description=Liste der Sites, in denen ein Benutzer Mitglied ist +page.userTrashcan.title=Benutzer-Papierkorb +page.userTrashcan.description=Liste gel\u00f6schter Dokumente und Ordner f\u00fcr den aktuellen Benutzer +page.wiki.title=Wiki +page.wiki.description=Die Einstiegsseite f\u00fcr Wiki +page.wikiCreate.title=Formular zum Erstellen einer Wiki-Seite +page.wikiCreate.description=Zeigt das Formular zum Erstellen einer neuen Wiki-Seite an +page.wikiPage.title=Wiki +page.wikiPage.description=Zeigt eine Wiki-Seite an +page.workspace.title=Dokumenten-Arbeitsbereich Dashboard +page.workspace.description=Seite 'Dokumenten-Arbeitsbereich Dashboard' +page.workflowDetails.title=Workflow-Details +page.workflowDetails.description=Seite 'Workflow-Details' + +## Dashboard page titles and descriptions +page.siteDashboard.title=Site-Dashboard +page.siteDashboard.description=Collaboration Site-Dashboard-Seite +page.userDashboard.title=Benutzer-Dashboard +page.userDashboard.description=Seite 'Benutzer-Dashboard' +page.meeting_workspace.title=Sitzungs-Arbeitsbereich Dashboard +page.meeting_workspace.description=Seite 'Sitzungs-Arbeitsbereich Dashboard' + +page.error.500.title=Alfresco Share » Systemfehler +page.error.500.header=Mit dieser Seite stimmt etwas nicht... +page.error.500.detail=

Unter Umst\u00e4nden ist ein Fehler aufgetreten oder wir haben etwas verschoben oder gel\u00f6scht. \u00dcberpr\u00fcfen Sie bitte, ob die URL stimmt.

Es kann auch sein, dass Sie nicht \u00fcber die n\u00f6tigen Berechtigungen zum Anzeigen dieser Seite verf\u00fcgen (es k\u00f6nnte sich um eine private Site handeln) oder dass ein interner Fehler aufgetreten ist. Wenden Sie sich am besten an Ihr IT-Team.

Wenn Sie nach Ihrer Startseite suchen und diese nicht mehr verf\u00fcgbar ist, \u00e4ndern Sie sie, indem Sie in der Symbolleiste auf Ihren Namen klicken.

+page.error.500.nav.dashboard=Zur\u00fcck zu meinem Dashboard +page.error.500.footer=Alfresco Software Inc. © 2005\u20132021. Alle Rechte vorbehalten. + +## Title bar component titles for pages that use the simple-title component +title.repository=Repository +title.browser=Browser +title.siteFinder=Site-Finder +title.peopleFinder=Mitarbeiter-Finder +title.myTasks=Meine Aufgaben + +## Site Visibility +site.visibility.label.PUBLIC=\u00d6ffentlich +site.visibility.label.MODERATED=Moderiert +site.visibility.label.PRIVATE=Privat +site.visibility.description.PUBLIC=Jeder in Ihrer Organisation hat Zugriff auf diese Site. +site.visibility.description.MODERATED=Jeder in Ihrer Organisation kann diese Site finden und Zugriff darauf anfordern. Der Zugriff wird von Site-Managern erteilt. +site.visibility.description.PRIVATE=Nur von einem Site-Manager hinzugef\u00fcgte Benutzer k\u00f6nnen diese Site finden. + +## Roles +role.SiteManager=Manager +role.SiteManager.description=hat volle Rechte auf alle Inhalte der Site (sowohl selbst erstellte Inhalte als auch von anderen Site-Mitgliedern erstellte Inhalte). +role.Collaborator=Mitarbeiter +role.Collaborator.description=hat volle Rechte auf eigene Inhalte. Von anderen erstellte Inhalte k\u00f6nnen bearbeitet, aber nicht gel\u00f6scht werden. +role.SiteCollaborator=Mitarbeiter +role.SiteCollaborator.description=hat volle Rechte auf eigene Site-Inhalte. Von anderen Site-Mitgliedern erstellte Inhalte k\u00f6nnen bearbeitet, aber nicht gel\u00f6scht werden. +role.Contributor=Beitragender +role.Contributor.description=hat volle Rechte auf eigene Inhalte. Von anderen erstellte Inhalte k\u00f6nnen weder bearbeitet noch gel\u00f6scht werden. +role.SiteContributor=Beitragender +role.SiteContributor.description=hat volle Rechte auf eigene Site-Inhalte. Von anderen Site-Mitgliedern erstellte Inhalte k\u00f6nnen weder bearbeitet noch gel\u00f6scht werden. +role.Consumer=Verbraucher +role.Consumer.description=hat nur Leserechte, kann aber keine eigenen Inhalte erstellen. +role.SiteConsumer=Verbraucher +role.SiteConsumer.description=hat nur Leserechte f\u00fcr eine Site, kann aber keine eigenen Inhalte erstellen. +role.Coordinator=Koordinator +role.Coordinator.description=hat volle Rechte auf alle Inhalte (sowohl selbst erstellte Inhalte als auch von anderen Site-Mitgliedern erstellte Inhalte). +role.Editor=Editor +role.Editor.description=hat Rechte zum \u00c4ndern der Dateieigenschaften und zum Ein- und Auschecken von Dateien, kann aber keine eigenen Inhalte erstellen. + +roles.readassociations=Verbraucher + +roles-tooltip.header=Info \u00fcber Rollen +roles-tooltip.docs-url-label=Mehr dazu +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Tags +taglibrary.populartagslink=Aus beliebten Tags dieser Site ausw\u00e4hlen +taglibrary.msg.failedLoadTags=Laden der Tags vom Server nicht m\u00f6glich (Verbindung unterbrochen?) +taglibrary.msg.unableLoadTags=Laden der Tags nicht m\u00f6glich: {0} +taglibrary.tip.removeTag=Tag entfernen +taglibrary.tip.help=Trennen Sie die einzelnen Tags mit einer Leerstelle. Verbinden Sie zwei oder mehrere W\u00f6rter mit doppelten Anf\u00fchrungszeichen + +## YUI Editor keys +yuieditor.toolbar.group.font=Schrifttyp +yuieditor.toolbar.group.lists=Listen +yuieditor.toolbar.group.link=Link +yuieditor.toolbar.item.createorderedlist=Geordnete Liste erstellen +yuieditor.toolbar.item.createunorderedlist=Ungeordnete Liste erstellen +yuieditor.toolbar.item.fontcolor=Schriftfarbe +yuieditor.toolbar.item.backgroundcolor=Hintergrundfarbe +yuieditor.toolbar.item.bold=Fett STRG + UMSCHALT + B +yuieditor.toolbar.item.italic=Kursiv STRG + UMSCHALT + I +yuieditor.toolbar.item.underline=Unterstrichen STRG + UMSCHALT + U +yuieditor.toolbar.item.link=HTML-Link STRG + UMSCHALT + L + +## Document Library Drop-down Menus +menu.select=Ausw\u00e4hlen +menu.select.all=Alle +menu.select.none=Keine +menu.select.invert=Auswahl umkehren +menu.select.folders=Ordner +menu.select.documents=Dokumente + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Dokument aus Mustervorlage erstellen +menu.create-content.by-template-folder=Ordner aus Mustervorlage erstellen +menu.selected-items=Ausgew\u00e4hlte Elemente... +menu.selected-items.copy=Kopieren nach... +menu.selected-items.move=Verschieben nach... +menu.selected-items.delete=L\u00f6schen +menu.selected-items.download=Als ZIP herunterladen +menu.selected-items.assign-workflow=Workflow starten... +menu.selected-items.manage-permissions=Berechtigungen verwalten... +menu.selected-items.deselect-all=Auswahl aufheben +menu.selected-items.cloudSync=Synchronisation mit Cloud +menu.selected-items.cloudUnsync=Synchronisation mit Cloud aufheben +menu.selected-items.cloudRequestSync=Synchronisation anfordern + +## Document Library Actions +actions.document.assign-workflow=Workflow starten +actions.document.cancel-editing=Bearbeitung abbrechen +actions.document.cancel-editing-unlock=Dokument freigeben +actions.document.change-type=Typ \u00e4ndern +actions.document.copy-to=Kopieren nach... +actions.document.delete=Dokument l\u00f6schen +actions.document.download=Herunterladen +actions.document.download-again=Herunterladen +actions.document.download-original=Original herunterladen +actions.document.edit-metadata=Eigenschaften bearbeiten +actions.document.edit-offline=Offline bearbeiten +actions.document.edit-online=In Microsoft Office\u2122 bearbeiten +message.edit-online.supported_office_version_required=Sie verwenden eine Version von Microsoft Office, die nicht unterst\u00fctzt wird. Versuchen Sie, ein Update auf eine neuere Version von Microsoft Office durchzuf\u00fchren. Office 2007 und 2008 funktionieren nicht mit Google Chrome. +actions.document.extract-metadata=Metadaten extrahieren +actions.document.execute-script=Skript ausf\u00fchren +actions.document.inline-edit=In Alfresco Share bearbeiten +actions.document.increment-counter=Z\u00e4hler hochsetzen +actions.document.locate=Datei lokalisieren +actions.document.manage-aspects=Aspekte verwalten +actions.document.manage-permissions=Berechtigungen verwalten +actions.document.take-ownership=Eigent\u00fcmer werden +actions.document.move-to=Verschieben nach... +actions.document.simple-approve=Genehmigen +actions.document.simple-reject=Ablehnen +actions.document.upload-new-version=Neue Version hochladen +actions.document.view=Im Browser anzeigen +actions.document.view-google-map=In Google Maps anzeigen +actions.document.view-original=Originaldokument anzeigen +actions.document.view-source-repository=In Quell-Repository anzeigen +actions.document.view-working-copy=Arbeitskopie anzeigen +actions.document.publish=Ver\u00f6ffentlichen +actions.document.transform=Umwandeln +actions.document.transform-image=In Bild umwandeln +actions.document.publish-content=Inhalt ver\u00f6ffentlichen +actions.document.cloud-sync=Synchronisation mit Cloud +actions.document.cloud-unsync=Synchronisation mit Cloud aufheben +actions.document.view-in-cloud=In Cloud anzeigen +actions.document.request-sync=Synchronisation anfordern +actions.document.unzip-to=Entzippen nach... +actions.folder.download=Als ZIP herunterladen +actions.folder.change-type=Typ \u00e4ndern +actions.folder.copy-to=Kopieren nach... +actions.folder.delete=Ordner l\u00f6schen +actions.folder.edit-metadata=Eigenschaften bearbeiten +actions.folder.locate=Ordner lokalisieren +actions.folder.manage-aspects=Aspekte verwalten +actions.folder.manage-permissions=Berechtigungen verwalten +actions.folder.take-ownership=Eigent\u00fcmer werden +actions.folder.move-to=Verschieben nach... +actions.folder.rules=Regeln verwalten +actions.folder.simple-approve=Genehmigen +actions.folder.simple-reject=Ablehnen +actions.folder.view-details=Details anzeigen +actions.folder.view-source-repository=In Quell-Repository anzeigen +actions.folder.cloud-sync=Synchronisation mit Cloud +actions.folder.cloud-unsync=Synchronisation mit Cloud aufheben +actions.folder.view-in-cloud=In Cloud anzeigen +actions.link.delete=Link l\u00f6schen +actions.link.locate=Verlinktes Element lokalisieren +actions.editOnline.failure=Die Datei ''{0}'' kann nicht zur Online-Bearbeitung ge\u00f6ffnet werden. Eines der folgenden Plug-ins wird von Ihrem Browser daf\u00fcr ben\u00f6tigt. \n F\u00fcr Windows: Microsoft Office 2010 \n F\u00fcr Mac OS X: SharePoint Browser Plug-in +actions.editOnline.invalid=Die Datei ''{0}'' konnte nicht online bearbeitet werden, da ihr Pfad Zeichen enth\u00e4lt, die nach SPP-Protokoll unzul\u00e4ssig sind.\nZu den ung\u00fcltigen Zeichen geh\u00f6ren u. a.: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' ist synchronisiert und bei diesem L\u00f6schvorgang wird das Dokument lokal und aus der Cloud entfernt. +actions.synced.folder.delete=
''{0}'' ist synchronisiert und bei diesem L\u00f6schvorgang werden dieser Ordner und sein Inhalt lokal und aus der Cloud entfernt. +actions.synced.remove-sync=
Wenn das Objekt in der Cloud bleiben soll, f\u00fchren Sie die Aktion ''Synchronisation entfernen'' aus. +actions.synced.cloud.document.delete=
''{0}'' ist synchronisiert und bei diesem L\u00f6schvorgang wird das Dokument nur lokal entfernt. +actions.synced.cloud.folder.delete=
''{0}'' ist synchronisiert und bei diesem L\u00f6schvorgang werden dieser Ordner und sein Inhalt nur lokal entfernt. +actions.synced.cloud.document.delete.on.prem=
''{0}'' ist synchronisiert. Durch diesen L\u00f6schvorgang wird das Dokument sowohl auf der Plattform als auch lokal gel\u00f6scht. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' ist synchronisiert. Durch diesen L\u00f6schvorgang wird dieser Ordner sowie sein gesamter Inhalt sowohl auf der Plattform als auch lokal gel\u00f6scht. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=Verlinktes Element nicht gefunden: Ziel wurde gel\u00f6scht. +message.change-type.success=Dokumenttyp ''{0}'' wurde erfolgreich ge\u00e4ndert +message.change-type.failure=Dokumenttyp ''{0}'' kann nicht ge\u00e4ndert werden +message.confirm.delete=M\u00f6chten Sie ''{0}'' wirklich l\u00f6schen? +message.delete.success=''{0}'' wurde gel\u00f6scht +message.delete.failure=''{0}'' konnte nicht gel\u00f6scht werden +message.multiple-delete.please-wait=Bitte warten. Dateien werden gel\u00f6scht... +message.confirm.take-ownership.title=Eigent\u00fcmer werden? +message.confirm.take-ownership=Sie werden Eigent\u00fcmer von ''{0}''. Die Benutzerrechte des vorherigen Eigent\u00fcmers werden dadurch unter Umst\u00e4nden eingeschr\u00e4nkt. +message.take-ownership.success=Sie sind jetzt Eigent\u00fcmer von ''{0}'' +message.take-ownership.failure=Eigentum an ''{0}'' konnte nicht \u00fcbertragen werden +message.details.success=Details wurden erfolgreich aktualisiert +message.details.failure=Details konnten nicht aktualisiert werden +message.details.failure.name=Element konnte nicht umbenannt werden. M\u00f6glicherweise ist ein anderes Element mit diesem Namen vorhanden. +message.details.failure.more.max.length=Eine der Eigenschaften ist gr\u00f6\u00dfer als der H\u00f6chstwert. +message.sync.success=Synchronisation wurde erstellt +message.sync.failure=Synchronisation konnte nicht erstellt werden +message.sync.unavailable=Verbindung zum Synchronisationsserver konnte nicht hergestellt werden. +message.unsync.confirm=M\u00f6chten Sie die Synchronisation von ''{0}'' wirklich aufheben? +message.unsync.success=Synchronisation wurde entfernt +message.unsync.failure=Synchronisation konnte nicht entfernt werden +message.request.sync.success=Synchronisation wurde erfolgreich angefordert +message.request.sync.failure=Synchronisation konnte nicht angefordert werden +message.error=Kann nicht auf die Dokumentenbibliothek zugreifen +message.empty=Keine Elemente +message.empty.subfolders=Keine Elemente. Klicken Sie auf ''{0}'', um hier {1} Unterordner anzuzeigen. +message.empty.subfolders.link=Ordner anzeigen +message.edit-offline.failure=Sie k\u00f6nnen ''{0}'' nicht bearbeiten. +message.edit-offline.success=''{0}'' kann jetzt bearbeitet werden +message.edit-offline.success.ie7=Dokument \u00fcber nachstehende Schaltfl\u00e4che herunterladen. +message.edit-online.office.failure=MS Office konnte nicht gestartet werden. +message.edit-online.office.path.failure=Online-Bearbeitung ist nicht verf\u00fcgbar, da die URL l\u00e4nger ist als 260 Zeichen. Verwenden Sie einen Pfad mit weniger Ebenen, um die L\u00e4nge zu reduzieren. +message.edit-online-aos.no_supported_environment=Diese Funktion ist nur unter Windows oder Mac OS X verf\u00fcgbar. +message.edit-online-aos.starting_office_failed=Microsoft Office konnte nicht ge\u00f6ffnet werden. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office gesperrt +message.edit-online-aos.plugin_blocked.body.firefox=Klicken Sie auf die Firefox-Symbolleiste, um fortzufahren. +message.edit-online-aos.plugin_blocked.body.chrome=Klicken Sie auf das Sperrsymbol in der Chrome-Adressleiste, um fortzufahren. +message.edit-online-aos.plugin_blocked.body.safari=Klicken Sie auf 'Vertrauen', um fortzufahren. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=Sie verwenden eine Version von Microsoft Office, die nicht unterst\u00fctzt wird. Versuchen Sie, ein Update auf eine neuere Version von Microsoft Office durchzuf\u00fchren. +message.edit-online-aos.edit_offline_locked.title=Diese Datei wird von {0} bearbeitet +message.edit-online-aos.edit_offline_locked.message=Von Ihnen vorgenommene \u00c4nderungen gehen m\u00f6glicherweise verloren. +message.edit-online-aos.edit_offline_locked.confirm=Weiter +message.edit-online-aos.edit_offline_locked.cancel=Abbrechen +message.edit-online-aos.edit_locked.title=Diese Datei wird von {0} bearbeitet +message.edit-online-aos.edit_locked.message=Das Dokument ist derzeit gesperrt. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=''{0}'' konnte nicht freigegeben werden. +message.edit-cancel.failure=Bearbeitung von ''{0}'' konnte nicht abgebrochen werden. +message.edit-cancel.success=Bearbeitung ''{0}'' wurde abgebrochen. +message.unlock-document.success=Bearbeitung von ''{0}'' wurde freigegeben. +message.file-dnd-move.failure=Das Dokument konnte nicht verschoben werden. +message.increment-counter.success=Z\u00e4hler hochgesetzt +message.increment-counter.failure=Z\u00e4hler konnte nicht hochgesetzt werden. +message.extract-metadata.success=Metadaten wurden erfolgreich extrahiert. +message.extract-metadata.failure=Metadaten konnten nicht extrahiert werden. +message.execute-script.success=Skript wurde erfolgreich ausgef\u00fchrt +message.execute-script.failure=Skript konnte nicht ausgef\u00fchrt werden +message.insitu-edit.name.failure=Die Datei konnte nicht umbenannt werden. M\u00f6glicherweise ist eine andere Datei mit diesem Namen vorhanden. +message.loading=Dokumentenbibliothek wird geladen... +message.simple-workflow.failure=Die Workflow-Aktion konnte nicht abgeschlossen werden. +message.simple-workflow.approved=Element ist als genehmigt markiert +message.simple-workflow.rejected=Element ist als abgelehnt markiert +message.simple-workflow.failed=Die Workflow-Aktion konnte nicht abgeschlossen werden. +message.transform.success=Dokument ''{0}'' wurde erfolgreich umgewandelt +message.transform.failure=Dokument konnte nicht umgewandelt werden +message.transform-image.success=Bild ''{0}'' wurde erfolgreich umgewandelt +message.transform-image.failure=Dokument konnte nicht umgewandelt werden +message.new-version-upload.success=Datei erfolgreich hochgeladen. Die Vorschau zeigt unter Umst\u00e4nden noch nicht die aktuelle Version des Dokuments an. Sie k\u00f6nnen die Seite sp\u00e4ter aktualisieren, um die aktuelle Version anzuzeigen. + +message.insitu-edit.tag.failure=Tag konnte nicht bearbeitet werden + +## Drag and Drop +message.dnd.allColumnsAreFull=Das Element kann nicht hinzugef\u00fcgt werden, da alle Spalten voll sind + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Einhaltbar +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Effektivit\u00e4t +aspect.cm_emailed=Per E-Mail versandt +aspect.cm_generalclassifiable=Klassifizierbar +aspect.cm_summarizable=Zusammenfassbar +aspect.cm_taggable=Tag-f\u00e4hig +aspect.cm_templatable=Vorlagenf\u00e4hig +aspect.cm_versionable=Versionsf\u00e4hig +aspect.emailserver_aliasable=E-Mail-Alias +aspect.app_inlineeditable=Inline editierbar +aspect.cm_geographic=Geografisch +aspect.exif_exif=EXIF +aspect.exif_resolution=Aufl\u00f6sung +aspect.exif_camera=Kameraangaben +aspect.audio_audio=Audio +aspect.cm_indexControl=Indexkontrolle +aspect.dp_restrictable=Beschr\u00e4nkbar +aspect.cm_attachable=Anh\u00e4nge + +# Groups +group.everyone=JEDER + +# Types +type.cm_content=Inhalt-Basistyp +type.cm_folder=Ordner-Basistyp +type.trx_transferTarget=\u00dcbertragungsziel +type.trx_fileTransferTarget=Ziel des Dateitransfers + +# Generic Form labels +form.set.general=Allgemein +form.set.operations=Vorg\u00e4nge + +# Runtime +runtime.field.FreeMemory=Freier Speicher +runtime.field.MaxMemory=Maximaler Speicher +runtime.field.TotalMemory=Gesamtspeicher + +# Repository Server +repository-server.set.version=Angaben zur Version +repository-server.field.Name=Name +repository-server.field.Id=ID +repository-server.field.Edition=Edition +repository-server.field.Schema=Schema +repository-server.field.Version=Version +repository-server.field.VersionLabel=Beschriftung +repository-server.field.VersionMinor=Unter +repository-server.field.VersionMajor=Haupt +repository-server.field.VersionRevision=Revision +repository-server.field.VersionBuild=Build +repository-server.field.VersionNumber=Nummer + +# Repository Installed +repository-installed.set.version=Angaben zur Version +repository-installed.field.Name=Name +repository-installed.field.Id=ID +repository-installed.field.Edition=Edition +repository-installed.field.Schema=Schema +repository-installed.field.Version=Version +repository-installed.field.VersionLabel=Beschriftung +repository-installed.field.VersionMinor=Unter +repository-installed.field.VersionMajor=Haupt +repository-installed.field.VersionRevision=Revision +repository-installed.field.VersionBuild=Build +repository-installed.field.VersionNumber=Nummer + +# Authority +authority.field.NumberOfGroups=Anzahl Gruppen +authority.field.NumberOfUsers=Anzahl Benutzer + +# License +header.license= +license.field.Subject=Lizenzgegenstand +license.field.Days=Tage +license.field.Holder=Inhaber +license.field.ValidUntil=G\u00fcltig bis +license.field.RemainingDays=Verbleibende Tage +license.field.Issued=Ausgegeben am +license.field.Issuer=Erteilt von +license.field.HeartBeatDisabled=Heartbeat deaktiviert +license.field.LicenseMode=Lizenzmodus +license.field.CloudSyncKeyAvailable=Schl\u00fcssel f\u00fcr Cloud-Synchronisation verf\u00fcgbar +license.field.MaxDocs=Max. Anzahl an Inhaltsobjekten +license.field.MaxUsers=Maximale Anzahl Benutzer +license.field.Users=Benutzer +license.field.Documents=Inhaltsobjekte +license.field.Info=Dieser Wert kann 0 sein, wenn Ihre Lizenz die Anzahl der Benutzer nicht einschr\u00e4nkt. + +# Pdf2Swf +pdf2swf.field.Available=Verf\u00fcgbar +pdf2swf.field.VersionString=Version + +# Open Office +openoffice.field.available=Verf\u00fcgbar +openoffice.field.ooName=Name +openoffice.field.ooOpenSourceContext=Open Source-Kontext +openoffice.field.ooSetupExtension=Erweiterung +openoffice.field.ooSetupVersion=Version +openoffice.field.ooSetupVersionAboutBox=\u00dcber +openoffice.field.ooXMLFileFormatName=XML-Dateiformat +openoffice.field.ooXMLFileFormatVersion=XML-Dateiformatversion +openoffice.error=OpenOffice-Angaben k\u00f6nnen nicht angezeigt werden +openoffice.error.404=Angaben \u00fcber OpenOffice nicht gefunden. (M\u00f6glicherweise ist die Eigenschaft 'ooo.enabled' auf 'false' gesetzt?) + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Aktiviert +openoffice-subsystem.field.ooo.exe=EXE +openoffice-subsystem.field.ooo.port=Port + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Aktiviert +ooojodconverter.field.jodconverter.maxTasksPerProcess=Max. Aufgaben pro Prozess +ooojodconverter.field.jodconverter.officeHome=Office-Home +ooojodconverter.field.jodconverter.portNumbers=Portnummern +ooojodconverter.field.jodconverter.taskExecutionTimeout=Zeit\u00fcberschreitung der Aufgabenausf\u00fchrung +ooojodconverter.field.jodconverter.taskQueueTimeout=Zeit\u00fcberschreitung der Aufgabenwarteschlange + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Verf\u00fcgbar +transformer-imagemagick.field.VersionString=Angaben zur Version + +# File servers +fileservers.set.filesystem=Dateisystem +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Standardzugriffsebene +fileservers.field.filesystem.acl.global.domainAccessControls=Domain-Zugriffssteuerungen +fileservers.field.filesystem.acl.global.protocolAccessControls=Protokoll-Zugriffssteuerungen +fileservers.field.filesystem.acl.global.userAccessControls=Benutzer-Zugriffssteuerungen +fileservers.field.filesystem.domainMappings=Domain-Zuordnung +fileservers.field.filesystem.name=Name des Dateisystems +fileservers.field.filesystem.name.description=Der verwendete Name f\u00fcr die Dateisysteme beim Zugriff \u00fcber CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=WINS Auto Detect aktiviert +fileservers.field.cifs.WINS.primary=Prim\u00e4rer WINS-Server +fileservers.field.cifs.WINS.secondary=Sekund\u00e4rer WINS-Server +fileservers.field.cifs.bindto=Binden an +fileservers.field.cifs.broadcast=Senden +fileservers.field.cifs.disableNIO=NIO deaktivieren +fileservers.field.cifs.disableNativeCode=Nativen Code deaktivieren +fileservers.field.cifs.domain=Dom\u00e4ne +fileservers.field.cifs.enabled=CIFS aktiviert +fileservers.field.cifs.hostannounce=Host ank\u00fcndigen +fileservers.field.cifs.ipv6.enabled=IPV6 aktiviert +fileservers.field.cifs.netBIOSSMB.datagramPort=NetBIOS SMB-Datagrammport +fileservers.field.cifs.netBIOSSMB.namePort=NetBIOS SMB-Namensport +fileservers.field.cifs.netBIOSSMB.sessionPort=NetBIOS SMB-Sitzungsport +fileservers.field.cifs.serverName=Servername +fileservers.field.cifs.sessionDebug=Sitzungs-Debug +fileservers.field.cifs.sessionTimeout=Sitzung abgelaufen +fileservers.field.cifs.tcpipSMB.port=TCP/IP-SMB-Port +fileservers.field.ftp.dataPortFrom=Datenport von +fileservers.field.ftp.dataPortTo=Datenport bis +fileservers.field.ftp.enabled=FTP aktiviert +fileservers.field.ftp.keyStore=Hauptspeicher +fileservers.field.ftp.passphrase=Passphrase +fileservers.field.ftp.port=Port +fileservers.field.ftp.requireSecureSession=Sichere Sitzung anfordern +fileservers.field.ftp.sessionDebug=Sitzungs-Debug +fileservers.field.ftp.sslEngineDebug=SSL-Engine-Debug +fileservers.field.ftp.trustStore=Truststore + +# Sysadmin +sysadmin.field.alfresco.context=Repository-Kontext +sysadmin.field.alfresco.host=Repository-Host +sysadmin.field.alfresco.port=Repository-Port +sysadmin.field.alfresco.protocol=Repository-Protokoll +sysadmin.field.server.allowedusers=Zugelassene Benutzer +sysadmin.field.server.maxusers=Maximale Anzahl Benutzer +sysadmin.field.server.transaction.allow-writes=Schreibzugriff zulassen +sysadmin.field.share.context=Share-Kontext +sysadmin.field.share.host=Share-Host +sysadmin.field.share.port=Share-Port +sysadmin.field.share.protocol=Share-Protokoll + +# Email (Inbound) +email-inbound.set.service=E-Mail-Eingangsservice +email-inbound.field.email.inbound.enabled=Service aktiviert +email-inbound.field.email.inbound.unknownUser=Unbekannter Benutzer +email-inbound.set.server=E-Mail-Eingangsserver +email-inbound.field.email.server.allowed.senders=Zugelassene Absender +email-inbound.field.email.server.blocked.senders=Blockierte Absender +email-inbound.field.email.server.enabled=Server aktiviert +email-inbound.field.email.server.domain=Dom\u00e4ne +email-inbound.field.email.server.port=Port +email-inbound.field.email.server.connections.max=Maximale Anzahl an Verbindungen +email-inbound.set.tls=Transport Layer Security +email-inbound.field.email.server.requireTLS=Transport Layer Security (TLS) anfordern +email-inbound.field.email.server.hideTLS=Transport Layer Security (TLS) wird nicht zur\u00fcckgegeben von EHLO +email-inbound.field.email.server.enableTLS=Transport Layer Security (TLS) annehmen + +# Email (Outbound) +email-outbound.set.auth=Authentifizierung +email-outbound.set.test-message=Testnachricht +email-outbound.field.mail.host=Host +email-outbound.field.mail.port=Port +email-outbound.field.mail.protocol=Protokoll +email-outbound.field.mail.encoding=Zeichencodierung +email-outbound.field.mail.from.default=Standard-Absenderadresse +email-outbound.field.mail.from.enabled='Von' aktiviert +email-outbound.field.mail.smtp.auth=SMTP-Authentifizierung erforderlich +email-outbound.field.mail.smtps.auth=SMTPS-Authentifizierung erforderlich +email-outbound.field.mail.username=Benutzername +email-outbound.field.mail.password=Passwort +email-outbound.field.mail.testmessage.send=Beim Hochfahren Testnachricht senden +email-outbound.field.mail.testmessage.to=An +email-outbound.field.mail.testmessage.subject=Betreff +email-outbound.field.mail.testmessage.text=Nachricht + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Home-Ordnerpfad +imap.field.imap.config.home.rootPath=Home-Root-Pfad +imap.field.imap.config.home.store=Home-Speicher +imap.field.imap.server.attachments.extraction.enabled=Extrahieren aktiviert +imap.field.imap.config.ignore.extraction=Extrahieren ignorieren +imap.field.imap.config.server.mountPoints=Bereitstellungspunkte +imap.field.imap.mail.from.default=E-Mail von Standard senden +imap.field.imap.mail.to.default=E-Mail an Standard senden +imap.field.imap.server.enabled=Aktiviert +imap.field.imap.server.host=Host +imap.field.imap.server.port=Port + +# Activities Feed +activities.set.activities=Aktivit\u00e4ten-Feed +activities.field.feed.notifier.enabled=Feed-Benachrichtigung aktiviert +activities.field.feed.notifier.repeatIntervalMins=Wiederholungsintervall (Min.) +activities.field.feed.max.ageMins=Maximales Alter (Min.) +activities.field.feed.max.size=Maximale Gr\u00f6\u00dfe + +# Subscriptions +subscriptions.field.subscriptions.enabled=Aktiviert + +# Workflow +workflow.field.message=Nachricht +workflow.field.comment=Kommentar +workflow.field.assign_to=Zuweisen +workflow.field.review_group=Gruppe \u00fcberpr\u00fcfen +workflow.field.reviewer=\u00dcberpr\u00fcfer +workflow.field.reviewers=\u00dcberpr\u00fcfer +workflow.field.due=F\u00e4llig +workflow.field.priority=Priorit\u00e4t +workflow.field.outcome=Ergebnis +workflow.field.enabled.activiti=Aktiviert +workflow.field.enabled.jbpm=Aktiviert +workflow.field.definitions.visible=Definition sichtbar +workflow.field.number.tasks=Anzahl an Aufgaben +workflow.field.number.definitions=Anzahl an Definitionen +workflow.field.number.workflows=Anzahl an Workflows +workflow.field.requiredApprovePercent=Erforderlicher Prozentsatz Genehmigung +workflow.set.general=Allgemein +workflow.set.assignee=Zugewiesene Person +workflow.set.assignees=Zugewiesene Personen +workflow.set.information=Informationen +workflow.set.items=Elemente +workflow.set.outcome=Ergebnis +workflow.set.other=Weitere Optionen +workflow.set.task.info=Info +workflow.set.workflow.more_info=Mehr Info +workflow.set.task.progress=Fortschritt +workflow.set.response=Antwort +workflow.set.engine.activiti=Activiti-Engine +workflow.set.engine.jbpm=JBPM-Engine +workflow.task.error=Aufgabe konnte nicht geladen werden. +workflow.task.error.404=Aufgabe existiert nicht oder Aufgabe wurde abgebrochen. +workflow.task.invite.title={0}-Site +workflow.task.invite.subtitle=Sie wurden eingeladen, der {0}-Site beizutreten. +workflow.task.invite.role=Sie werden folgende Rolle haben: {0}. +workflow.task.invite.accepted={0} {1} hat Ihre Einladung angenommen, der Site {2} beizutreten. +workflow.task.invite.rejected={0} {1} hat Ihre Einladung abgelehnt, der Site {2} beizutreten. +workflow.task.request.invite.title=Der Benutzer {0} hat beantragt, der Site {1} beizutreten. +workflow.cancel.title=Workflow abbrechen +workflow.cancel.label=Sind Sie sicher, dass Sie den Workflow abbrechen m\u00f6chten? +workflow.cancel.feedback=Workflow wird abgebrochen... +workflow.cancel.success=Workflow wurde erfolgreich abgebrochen +workflow.cancel.failure=Abbruch des Workflows fehlgeschlagen +workflow.delete.title=Workflow l\u00f6schen +workflow.delete.label=Sind Sie sicher, dass Sie den Workflow l\u00f6schen m\u00f6chten? +workflow.delete.feedback=Workflow wird gel\u00f6scht... +workflow.delete.success=Workflow wurde erfolgreich gel\u00f6scht +workflow.delete.failure=Workflow konnte nicht gel\u00f6scht werden +workflow.no_message=(Keine Nachricht) +tool.workflow.activiti.tools=Activiti-Tools +tool.workflow.activiti.admin.link=Activiti Workflow-Konsole + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Suchmanager +tool.searchmanager.description=Suchmanager + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Aktiviert +lucene.field.dir.indexes=Indexverzeichnis +lucene.field.index.recovery.mode=Indexwiederherstellungs-Modus +lucene.field.lucene.indexer.contentIndexingEnabled=Aufnahme von Inhalt in Index aktiviert +lucene.field.index.tracking.disableInTransactionIndexing=Aufnahme von Transaktionen in Index deaktivieren + +lucene.set.backup=Backup +lucene.backup.field.dir.indexes.backup=Index-Backup-Verzeichnis +lucene.backup.field.index.backup.cronExpression=Backup f\u00fcr Cron-Ausdruck + +lucene.set.advanced=Erweitert +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Aufnahme von Inhalt in Index aktiviert +lucene.advanced.field.fts.indexer.batchSize=Aufnahme von Batchgr\u00f6\u00dfe in Index +lucene.advanced.field.lucene.maxAtomicTransformationTime=Max. Atomare Umwandlungszeit +lucene.advanced.field.index.reindexMissingContent.cronExpression=Fehlender Inhalt f\u00fcr Cron-Ausdruck +lucene.advanced.field.indexer.maxFieldLength=Max. Anzahl der in den Index aufgenommenen Token pro Dokument +lucene.field.indexer.mergerMaxMergeDocs=Max. zusammengef\u00fchrte Dokumente +lucene.field.indexer.mergerMergeFactor=Max. Zusammenf\u00fchrungswert + +# Transform action form +transform.field.mime-type=Erforderliches Format +transform.field.destination-folder=Ziel + +# Transform Image action form +transform-image.field.mime-type=Erforderliches Format +transform-image.field.convert-command=Optionen +transform-image.field.destination-folder=Ziel + +publish-content.field.publish-channel-id=Ver\u00f6ffentlichungskanal +publish-content.field.unpublish=Ver\u00f6ffentlichung zur\u00fccknehmen +publish-content.field.status-update=Statusaktualisierung +publish-content.field.status-update-channel-id=Statusaktualisierungskanal + +# Execute Script action form +script.field.script-ref=Skript + +# Solr +solr.set.spacesstore=Eigenschaften des Hauptspeichers +solr.set.archivestore=Eigenschaften des Archivspeichers +solr.field.search.solrTrackingSupport.enabled=Verfolgung aktiviert +solr.help.search.solrTrackingSupport.enabled=Solr erlauben, eine Verbindung zu diesem Server herzustellen sowie Aktualisierungen zu verfolgen und zu indizieren +solr.field.solr.host=Solr-Hostname +solr.help.field.solr.host=Hostname, auf dem der Solr-Server ausgef\u00fchrt wird. Lokalen Host verwenden, wenn er auf demselben Ger\u00e4t ausgef\u00fchrt wird. +solr.field.solr.port=Solr-Port (ohne SSL) +solr.help.field.solr.port=Der (nicht sichere) HTTP-Port des Anwendungsservers, auf dem Solr ausgef\u00fchrt wird. Wird nur verwendet, wenn Solr f\u00fcr eine Ausf\u00fchrung ohne sichere Kommunikation konfiguriert ist. +solr.field.solr.port.ssl=Solr SSL-Port +solr.help.field.solr.port.ssl=Der HTTPS-Port des Anwendungsservers, auf dem Solr ausgef\u00fchrt wird. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indizierung l\u00e4uft +solr.field.tracker.alfresco.lag=Indexverz\u00f6gerung (Sekunden) +solr.field.tracker.alfresco.last.indexed.txn=Letzte in den Index aufgenommene Transaktion +solr.field.tracker.alfresco.approx.txns.remaining=Noch in den Index aufzunehmende Transaktionen (ungef\u00e4hr) +solr.field.tracker.alfresco.approx.indexing.time.remaining=Ungef\u00e4hr verbleibende Zeit f\u00fcr Indizierung +solr.help.field.tracker.alfresco.lag=Solr-Indizes werden im Hintergrund aktualisiert. Dies beschreibt die Zeit (in Sekunden), die der Solr-Volltextindex derzeit hinter den Repository-Aktualisierungen liegt. +solr.field.tracker.archive.active=Indizierung l\u00e4uft +solr.field.tracker.archive.lag=Indexverz\u00f6gerung (Sekunden) +solr.field.tracker.archive.last.indexed.txn=Letzte in den Index aufgenommene Transaktion +solr.field.tracker.archive.approx.txns.remaining=Noch in den Index aufzunehmende Transaktionen (ungef\u00e4hr) +solr.field.tracker.archive.approx.indexing.time.remaining=Ungef\u00e4hr verbleibende Zeit f\u00fcr Indizierung + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Backup f\u00fcr Cron-Ausdruck +solr.field.solr.backup.alfresco.remoteBackupLocation=Speicherort f\u00fcr Backup +solr.field.solr.backup.alfresco.numberToKeep=Zu speichernde Backups +solr.help.solr.backup.alfresco.remoteBackupLocation=Vollst\u00e4ndiger Pfad zum Speicherort auf dem Dateisystem des Solr-Servers zur Speicherung des Index-Backups +solr.help.solr.backup.alfresco.numberToKeep=Anzahl der Backups, die gespeichert werden sollen (einschl. letzter Backup) +solr.field.solr.backup.archive.cronExpression=Backup f\u00fcr Cron-Ausdruck +solr.field.solr.backup.archive.remoteBackupLocation=Speicherort f\u00fcr Backup +solr.field.solr.backup.archive.numberToKeep=Zu speichernde Backups +solr.help.solr.backup.archive.remoteBackupLocation=Vollst\u00e4ndiger Pfad zum Speicherort auf dem Dateisystem des Solr-Servers zur Speicherung des Index-Backups +solr.help.solr.backup.archive.numberToKeep=Anzahl der Backups, die gespeichert werden sollen (einschl. letzter Backup) + +# searchmanager +searchmanager.field.sourceBeanName=Suchservice + +## Tooltips +tooltip.path=Pfad: {0} +tooltip.site=Seite: {0} + +## Create content +create-content.text=Nur Text... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Ordner + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Monat ausw\u00e4hlen +calendar.widget_control_config.label_year=Jahr eingeben +calendar.widget_control_config.label_invalid_year=Geben Sie ein zul\u00e4ssiges Jahr an + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Link zu: {0} +details.created-by={0} von {1} erstellt +details.created-in-site={0} in {1} erstellt +details.editing-started-by=Bearbeiten gestartet, {0} von {1} +details.editing-started-in-site=Bearbeiten gestartet, {0} in {1} +details.modified-by=Ge\u00e4ndert {0} von {1} +details.modified-in-site=Ge\u00e4ndert {0} in {1} +details.description.none=Keine Beschreibung +details.tags.none=Keine Tags +details.categories.none=Keine Kategorien +details.user.deleted=''{0}'' (gel\u00f6schter Benutzer) + +## Social Interactions +# Favourite +favourite.document.add.tip=Dokument zu Favoriten hinzuf\u00fcgen +favourite.document.add.label=Favorit +favourite.document.remove.tip=Dokument aus Favoriten entfernen +favourite.folder.add.tip=Ordner zu Favoriten hinzuf\u00fcgen +favourite.folder.add.label=Favorit +favourite.folder.remove.tip=Ordner aus Favoriten entfernen +favourite.imap-site.add.tip=Site zu den IMAP-Favoriten hinzuf\u00fcgen +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Site aus den IMAP-Favoriten entfernen +favourite.site.add.tip=Site zu den Favoriten hinzuf\u00fcgen +favourite.site.add.label=Favorit +favourite.site.remove.tip=Site aus den Favoriten entfernen +favourite.message.failure=Favorit konnte nicht gespeichert werden +# Like +like.document.add.tip=Dieses Dokument gef\u00e4llt mir +like.document.add.label=Gef\u00e4llt mir +like.document.remove.tip=Gef\u00e4llt nicht mehr +like.folder.add.tip=Dieser Ordner gef\u00e4llt mir +like.folder.add.label=Gef\u00e4llt mir +like.folder.remove.tip=Gef\u00e4llt nicht mehr +like.site.add.tip=Diese Site gef\u00e4llt mir +like.site.add.label=Gef\u00e4llt mir +like.site.remove.tip=Gef\u00e4llt nicht mehr +like.message.failure='Gef\u00e4llt mir' konnte nicht gespeichert werden +# Quickshare +quickshare.link.label=\u00d6ffentlicher Link +quickshare.link.tooltip=Zum Kopieren Strg+C dr\u00fccken +quickshare.link.tooltip.mac=Zum Kopieren Cmd+C dr\u00fccken +quickshare.view.label=Anzeigen +quickshare.unshare.label=Freigabe aufheben +quickshare.document.shared.label=Freigegeben +quickshare.document.shared.tip=Dieses Dokument ist freigegeben (f\u00fcr weitere Optionen klicken) +quickshare.document.share.label=Freigeben +quickshare.document.share.tip=Dokument freigeben +quickshare.document.share.failure=Dokument konnte nicht freigegeben werden +quickshare.document.unshared.label=Freigeben +quickshare.document.unshared.tip=Dokument freigeben +quickshare.document.unshare.success=Dokument ist nicht mehr freigegeben +quickshare.document.unshare.failure=Dokumentfreigabe konnte nicht aufgehoben werden +quickshare.document.unshare.user.failure=Sie verf\u00fcgen nicht \u00fcber die erforderlichen Berechtigungen, um die Freigabe aufzuheben. +quickshare.linkshare.label=Freigeben f\u00fcr +# LinkShare +linkshare.action.email.label=Per E-Mail freigeben +linkshare.action.email.subject=Datei von Alfresco Content Services freigegeben +linkshare.action.email.body=Datei {1} von Alfresco Content Services freigegeben. Sie k\u00f6nnen Sie hier sehen: {0} +linkshare.action.facebook.label=\u00dcber Facebook freigeben +linkshare.action.facebook.message=Datei {1} von Alfresco Content Services freigegeben +linkshare.action.twitter.label=\u00dcber Twitter freigeben +linkshare.action.twitter.message=Datei {1} von Alfresco Content Services freigegeben +linkshare.action.google-plus.label=\u00dcber Google+ freigeben + + +# Comment +comment.document.tip=Kommentar zu diesem Dokument +comment.document.label=Kommentar +comment.folder.tip=Kommentar zu diesem Ordner +comment.folder.label=Kommentar + +#Dashlets +dashlet.help.tooltip=Hilfe f\u00fcr dieses Dashlet anzeigen +dashlet.rss.tooltip=RSS-Feed f\u00fcr dieses Dashlet abonnieren +dashlet.edit.tooltip=Dieses Dashlet konfigurieren + +#Module Package Admin page +tool.module-package.label=Modul-Browser +tool.module-package.description=Modul-Browser + +# Category Manager Admin Console +tool.category-manager.label=Kategorie-Manager +tool.category-manager.description=Kategorie-Manager +tool.category-manager.edit-category=Kategorie bearbeiten +tool.category-manager.edit-category.failure=Name konnte nicht bearbeitet werden. +tool.category-manager.add-category=Kategorie hinzuf\u00fcgen +tool.category-manager.add-category.failure=Kategorie konnte nicht hinzugef\u00fcgt werden. +tool.category-manager.label.category-name=Kategoriename: +tool.category-manager.delete-category=Kategorie l\u00f6schen +tool.category-manager.delete-category.failure=Kategorie konnte nicht gel\u00f6scht werden. +tool.category-manager.message.confirm.delete.title=Kategorie l\u00f6schen +tool.category-manager.message.confirm.delete=M\u00f6chten Sie Folgendes wirklich l\u00f6schen: {0}? + +# Node browser +tool.node-browser.label=Node-Browser +tool.node-browser.description=Node-Browser + +# Label +label.folder=Ordner +label.document=Dokument +label.blogpost=Blog-Post +label.forumpost=Foren-Thema +label.calendarevent=Kalenderereignis +label.wikipage=Wiki-Seite +label.link=Link +label.datalist=Datenliste +label.datalistitem=Datenlisten-Element +label.unknown=Unbekannt +label.download=Herunterladen +label.viewinbrowser=Im Browser anzeigen +label.viewdetails=Details anzeigen +label.selectAll=Alles ausw\u00e4hlen +label.selectInvert=Auswahl umkehren +label.selectNone=Keine +label.selectedItems=Ausgew\u00e4hlte Elemente +label.select=Ausw\u00e4hlen +label.restricted-settings=Alfresco Identity Service ist aktiviert, einige Einstellung sind beschr\u00e4nkt. + +# Path +message.infolderpath=In Ordner + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Synchronisation ausstehend +sync.status.synced={0} synchronisiert von {1} +sync.status.last-attempt=Zuletzt {0} erfolgreich synchronisiert von {1} +sync.status.failed=Synchronisation {0} versucht von {1} +sync.status.last-failed=Letzte Synchronisation fehlgeschlagen +sync.status.transient-error=Tempor\u00e4rer Synchronisationsfehler +sync.status.transient-error.default-details=Synchronisation wird fortgesetzt, sobald Alfresco Content Services die Kommunikation mit der Cloud wiederaufnehmen konnte. +sync.status.copy.pending=Synchronisation ausstehend f\u00fcr {2} +sync.status.copy.synced={2} {0} synchronisiert von {1} +sync.status.copy.last-attempt={2} zuletzt {0} erfolgreich synchronisiert von {1} +sync.status.copy.failed=Synchronisation von {2} {0} versucht von {1} +sync.status.copy.last-failed=Letzte Synchronisation von {2} fehlgeschlagen +sync.status.show-details=Details anzeigen +sync.status.hide-details=Details ausblenden +sync.status.title=Synchronisationsangaben +sync.status.action.more=Mehr Info +sync.original-document=Originaldokument + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=Synchronisationsstatus kann nicht angezeigt werden +sync.unable.get.details=Node-Angaben konnten nicht abgerufen werden + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=''{0}'' aus Cloud entfernen. +sync.remove.folder.from.cloud=''{0}'' und alle Inhalte aus Cloud entfernen. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Inhalt mit diesem Namen gibt es bereits im Zielordner. +sync.folder.not_found=Ordner nicht gefunden. +sync.node.already_synced=Inhalt kann nicht erstellt werden: Er wurde bereits von einem anderen Speicherort aus synchronisiert. +sync.node.other_sync_set=Dieser Inhalt wurde bereits von einem anderen Speicherort aus synchronisiert. +sync.node.no_longer_exists=Dieser Inhalt ist in Alfresco Content Services in the Cloud nicht mehr vorhanden. +sync.node.no_longer_exists.description=Dieser Inhalt ist Alfresco Content Services in the Cloud nicht mehr vorhanden. Klicken Sie auf 'Synchronisation anfordern', um es erneut zu versuchen. +sync.node.unknown=Es ist ein Problem aufgetreten. Bitte versuchen Sie es noch einmal. +sync.node.unknown.description=Es ist ein unerwarteter Fehler aufgetreten. Ursache: {0}. +sync.node.access_denied=Inhalt kann nicht synchronisiert werden: Sie sind nicht zum Zugriff auf die Zieldatei berechtigt. +sync.node.access_denied_source=Inhalt kann nicht synchronisiert werden: Sie sind nicht zum Zugriff auf die Quelldatei berechtigt. +sync.node.content_limit_violation=Diese Datei \u00fcberschreitet die Inhaltsbegrenzung. Die Datei ist zu gro?f\u00fcr diesen Vorgang. +sync.node.quota_limit_violation=Sie haben das Inhaltskontingent \u00fcberschritten. Es ist nicht gen\u00fcgend freier Speicherplatz f\u00fcr diesen Vorgang vorhanden. +sync.node.authentication_error=Inhalt kann nicht mit der Cloud synchronisiert werden: Die Authentifizierungsdetails sind nicht g\u00fcltig. +sync.node.authentication_error.description=Inhalt kann nicht mit der Cloud synchronisiert werden: Die Authentifizierungsdetails f\u00fcr Benutzer {0} sind nicht g\u00fcltig. +sync.node.owner_not_found=Wir k\u00f6nnen den Inhalt nicht synchronisieren, weil er vom Eigent\u00fcmer entfernt oder gel\u00f6scht wurde. +sync.node.owner_not_found.description=Der Eigent\u00fcmer dieser Synchronisation, {0}, ist nicht mehr vorhanden. Klicken Sie auf ''Synchronisation aufheben''. + +sync.communications.error=Kommunikation mit Remote-System nicht m\u00f6glich +sync.communications.error.description=Kommunikation mit Remote-System nicht m\u00f6glich. Die Synchronisation startet automatisch, sobald die Kommunikation funktioniert + +# Cloud Sync no network available for sync +sync.message.no.active.network=Kein Netzwerk f\u00fcr Synchronisation aktiviert + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Neuer Ordner +sync.new-folder.in-the-cloud.header=Neuer Ordner - Details +sync.new-folder.creation.success=Ordner erfolgreich erstellt +sync.new-folder.creation.failure=Ordner konnte nicht erstellt werden + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=Synchronisations-ID +hybridsync.ssd-failed-reason-header-label=Art des Synchronisationsfehlers +hybridsync.path-desc-header-label=Urspr\u00fcnglicher Speicherort des Elements +hybridsync.sync-creator-header-label=Ersteller der Synchronisation +hybridsync.cloud-user-header-label=Cloud-Benutzer +hybridsync.remote-tenant-id-header-label=Cloud-Netzwerk +hybridsync.target-folder-node-ref-header-label=Cloud-Ziel +hybridsync.actions-header-label=Aktionen + +#Hybrid workflow +hybridworkflow.destination-select.title=Ziel f\u00fcr Dokumente in der Cloud ausw\u00e4hlen +hybridworkflow.set.destination=Ziel und zugewiesene Person +hybridworkflow.authority.single=Zugewiesene Person +hybridworkflow.authority.multiple=\u00dcberpr\u00fcfer +hybridworkflow.review.approved=Genehmigt +hybridworkflow.review.rejected=Abgelehnt +hybridworkflow.destination-select.folderPrefix=Dokumente +hybridworkflow.destination.network=Netzwerk +hybridworkflow.destination.site=Site +hybridworkflow.destination.folder=Ordner +hybridworkflow.destination.button=Ausw\u00e4hlen + +# Security +security.insecuremimetype=Der MIME-Type f\u00fcr den angeforderten Inhalt gilt als Sicherheitsrisiko und wird daher nicht angezeigt. + +# Lightbox +lightbox.close=Schlie\u00dfen +lightbox.loading=Laden diff --git a/share/src/main/resources/alfresco/messages/slingshot_es.properties b/share/src/main/resources/alfresco/messages/slingshot_es.properties new file mode 100755 index 0000000000..3911d1ad03 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_es.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Introduzca los t\u00e9rminos de b\u00fasqueda... +# header menu items +header.advanced-search.label=B\u00fasqueda avanzada... +header.advanced-search.description=B\u00fasqueda avanzada... +header.application.label=Aplicaci\u00f3n +header.application.description=Aplicaci\u00f3n +header.change-password.label=Cambiar contrase\u00f1a +header.change-password.description=Cambiar contrase\u00f1a +header.groups.label=Grupos +header.groups.description=Grupos +header.tag-management.label=Administrador de etiquetas +header.tag-management.description=Administrador de etiquetas +header.help.label=Ayuda +header.help.description=Ayuda +header.logout.label=Cerrar sesi\u00f3n +header.logout.description=Cerrar sesi\u00f3n +header.more.label=M\u00e1s... +header.more.description=M\u00e1s... +header.my.label=Mis... +header.my.description=Mis... +header.my-content.label=Mi Contenido +header.my-content.description=Mi Contenido +header.my-dashboard.label=Mi Panel de Inicio +header.my-dashboard.description=Mi Panel de Inicio +header.my-profile.label=Mi Perfil +header.my-profile.description=Mi Perfil +header.my-sites.label=Mis Sitios +header.my-sites.description=Mis Sitios +header.my-tasks.label=Mis Tareas +header.my-tasks.description=Mis Tareas +header.my-workflows.label=Flujos de trabajo que he iniciado +header.my-workflows.description=Flujos de trabajo que he iniciado +header.people.label=Personas +header.people.description=Personas +header.replication-jobs.label=Trabajos de replicaci\u00f3n +header.replication-jobs.description=Trabajos de replicaci\u00f3n +header.repository.label=Repositorio +header.repository.description=Repositorio +header.trashcan.label=Papelera +header.trashcan.description=Herramientas de recuperaci\u00f3n y eliminaci\u00f3n de ficheros +header.saved-searches.label=B\u00fasquedas guardadas +header.saved-searches.description=B\u00fasquedas guardadas +header.search.description=Opciones de b\u00fasqueda... +header.sites.label=Sitios +header.sites.description=Sitios +header.submit-status.label=Compartir +header.submit-status.description=Compartir +header.tools.label=Herramientas de administraci\u00f3n... +header.tools.description=Herramientas administrativas... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Usuarios +header.users.description=Usuarios + +## Buttons +button.browse=Examinar +button.edit=Editar +button.save=Guardar +button.savechanges=Guardar los cambios +button.saveandclose=Guardar y cerrar +button.upload=Cargar +button.login=Iniciar sesi\u00f3n +button.delete=Eliminar +button.take-ownership=Aceptar +button.download=Descargar +button.clear=Borrar +button.reset=Reiniciar +button.search=Buscar +button.update=Actualizar +button.goback=Volver +button.done=Hecho +button.undo=Deshacer +button.new=Nuevo +button.create=Crear +button.rename=Cambiar nombre +button.refreshPage=Actualizar p\u00e1gina +button.createanother=Crear y crear otra +button.view.simple=Vista sencilla +button.view.detailed=Vista detallada +button.view.gallery=Vista de galer\u00eda +button.view.filmstrip=Vista de tira de im\u00e1genes +button.view.table=Vista de tabla +button.view.media-table=Vista de elementos multimedia +button.view.email=Vista de correo electr\u00f3nico +button.view.audio=Vista de audio +button.view.dublinCore=Vista de Dublin Core +button.view.effectivity=Vista de efectividad + +button.follow=Seguir +button.unfollow=Dejar de seguir +button.unsync=Eliminar sincronizaci\u00f3n + +## Messages +message.failure=Error +message.failure.workflow=El usuario {0} no tiene permiso para acceder a esta tarea. +message.loginfailure=No se pudo iniciar la sesi\u00f3n +message.loginautherror=No se han reconocido sus datos de autenticaci\u00f3n o puede que Alfresco Content Services no est\u00e9 disponible en este momento. +message.passwordchangeauthfailed=Datos de autenticaci\u00f3n incorrectos o no autorizados para cambiar la contrase\u00f1a. +message.login-portal=Inicie una sesi\u00f3n a trav\u00e9s de su portal. +message.unsavedChanges.blog=Su entrada en el blog tiene cambios sin guardar. +message.unsavedChanges.comment=Su comentario no se ha guardado todav\u00eda. +message.unsavedChanges.discussion=Su tema de foro tiene cambios sin guardar. +message.unsavedChanges.reply=Su respuesta al tema tiene cambios sin guardar. +message.unsavedChanges.wiki=Su art\u00edculo wiki tiene cambios sin guardar. +message.searching=Buscando... +message.searchingFor=Buscando ''{0}''... +message.minimum-length=Introduzca al menos {0} caracter(es) +message.folders-trimmed=La lista se ha limitado a {0} entradas +message.item-missing=El elemento solicitado no se puede mostrar porque ya no est\u00e1 disponible. +message.save.success=Se han guardado los cambios. +message.save.failure=No se pudieron guardar los cambios. +message.cookiesfailure=Las cookies est\u00e1n desactivadas +message.cookieserror=Las cookies deben estar activadas en su navegador. +message.siteRedirect.noPages.manager=Un administrador del sitio ha deshabilitado todas las caracter\u00edsticas de este sitio.
Haga clic en el icono Ajustes   y seleccione Personalizar sitio para a\u00f1adir una o m\u00e1s caracter\u00edsticas del sitio. +message.siteRedirect.noPages.user=Un administrador del sitio ha deshabilitado todas las caracter\u00edsticas de este sitio.
Busque en los miembros del sitio a un administrador del sitio que pueda a\u00f1adir caracter\u00edsticas al sitio. +message.logged-out=Ha cerrado la sesi\u00f3n. +message.timeout=Se sobrepas\u00f3 el tiempo de espera del servidor. La solicitud tard\u00f3 demasiado tiempo en completarse. Vuelva a intentarlo m\u00e1s tarde. +message.loading=Cargando... +message.viewInCloud.failure=No se ha podido recuperar la URL. Comprobar estado de la sincronizaci\u00f3n. +message.logged-out=Ha cerrado la sesi\u00f3n. + +## Common Text labels and CM model metadata +label.tags=Etiquetas +label.none=(Ninguno) +label.empty=(Vac\u00edo) +label.about=Acerca de +label.username=Nombre de usuario +label.password=Contrase\u00f1a +label.copyright=© 2005-2023 Alfresco Software Inc. Todos los derechos reservados. +label.name=Nombre +label.id=ID +label.title=T\u00edtulo +label.description=Descripci\u00f3n +label.version=Versi\u00f3n +label.firstname=Nombre +label.lastname=Apellidos +label.jobtitle=Cargo +label.location=Ubicaci\u00f3n +label.bio=Resumen +label.photo=Foto +label.contactinfo=Informaci\u00f3n de contacto +label.skype=Skype +label.im=Mensajer\u00eda instant\u00e1nea +label.googleusername=Nombre de usuario de Google +label.company=Empresa +label.companyinfo=Detalles de la empresa +label.companyname=Nombre +label.companyaddress=Direcci\u00f3n +label.companytelephone=Tel\u00e9fono +label.companyfax=Fax +label.companyemail=Correo electr\u00f3nico +label.companypostcode=C\u00f3digo postal +label.email=Correo electr\u00f3nico +label.telephone=Tel\u00e9fono +label.mobile=M\u00f3vil +label.fax=Fax +label.address=Direcci\u00f3n +label.postcode=C\u00f3digo postal +label.groups=Grupos +label.yes=S\u00ed +label.no=No +label.ok=Aceptar +label.loading=Cargando... +label.validating=Validando... +label.validationError=No se han podido validar las credenciales. +label.site=Sitio +label.path=Ruta +label.type=Tipo +label.creator=Creador +label.created=Creado +label.modifier=Modificador +label.modified=Modificado +label.author=Autor +label.priority=Prioridad {0} +label.size=Tama\u00f1o +label.mimetype=Tipo MIME +label.mimetype.unknown=Desconocido +label.popularity=Popularidad +label.avatar=Avatar +label.editType=Editar: {0} +label.moreInfo=M\u00e1s informaci\u00f3n > +label.actions.column.header=Acciones +# Dictionary Model +label.modelActive=Est\u00e1 activo +label.modelName=Nombre del modelo +label.modelDescription=Descripci\u00f3n del modelo +# Transfer Targets +label.trx_enabled=est\u00e1 activado +label.trx_endpointhost=Transferencia al servidor de destino +label.trx_endpointport=Puerto +label.you=usted +label.licensedTo=Licencia concedida a: + +## Location +location.tooltip.path=Ruta: {0} +location.tooltip.site=Sitio: {0} +location.path.repository=Repositorio +location.path.documents=Documentos +location.path.userHome=Mi Espacio de usuario +location.path.myfiles=Mis ficheros +location.path.shared=Ficheros compartidos +location.label.none=(Ninguno) +location.label.local={0} +location.label.site={0} en {1} +location.label.repository={0} + +## EXIF +label.exif.width=Ancho +label.exif.height=Alto + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} de {totalRecords} +pagination.template.page-report.more=Mostrando los elementos {startRecord} - {endRecord} de {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} de {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Tema claro +theme.default=Tema azul +theme.greenTheme=Tema verde +theme.hcBlack=Tema con fuerte contraste +theme.yellowTheme=Tema amarillo +theme.gdocs=Tema Google Docs + +## Admin console tools +tool.users.label=Usuarios +tool.users.description=Administraci\u00f3n de usuarios +tool.groups.label=Grupos +tool.groups.description=Administraci\u00f3n de grupos +tool.application.label=Aplicaci\u00f3n +tool.application.description=Configuraci\u00f3n y gesti\u00f3n de la aplicaci\u00f3n +tool.replication-jobs.label=Trabajos de replicaci\u00f3n +tool.replication-jobs.description=Gesti\u00f3n de trabajos de replicaci\u00f3n +tool.repository.label=Herramientas de repositorio +tool.repository.description=Herramientas de repositorio +tool.tag-management.label=Administrador de etiquetas +tool.tag-management.description=Administrador de etiquetas +tool.workflow.label=Flujo de trabajo +tool.workflow.description=Herramientas para flujo de trabajo +tool.trashcan.label=Papelera +tool.trashcan.description=Herramientas de recuperaci\u00f3n y eliminaci\u00f3n de ficheros +tool.email-inbound.label=Correo (entrante) +tool.email-inbound.description=Correo (entrante) +tool.email-outbound.label=Correo (saliente) +tool.email-outbound.description=Correo (saliente) +tool.email-imap.label=Correo (IMAP) +tool.email-imap.description=Correo (IMAP) +tool.runtime.label=Tiempo de ejecuci\u00f3n +tool.runtime.description=Tiempo de ejecuci\u00f3n +tool.repository-server.label=Descriptor de repositorio (actual) +tool.repository-server.description=Descriptor de repositorio (actual) +tool.repository-installed.label=Descriptor de repositorio (instalado originalmente) +tool.repository-installed.description=Descriptor de repositorio (instalado originalmente) +tool.authority.label=Autoridad +tool.authority.description=Autoridad +tool.license.label=Descriptor de licencia +tool.license.description=Descriptor de licencia +tool.license.link=Administrar mi suscripci\u00f3n +tool.license.usageinfo.label=Informaci\u00f3n de uso de licencias +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=Sistema OpenOffice +tool.openoffice-subsystem.description=Sistema OpenOffice +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Conversor pdf2swf +tool.transformer-pdf2swf.description=Conversor pdf2swf +tool.transformer-imagemagick.label=Conversor ImageMagick +tool.transformer-imagemagick.description=Conversor ImageMagick +tool.fileservers.label=Servidores de ficheros +tool.fileservers.description=Servidores de ficheros +tool.subscriptions.label=Suscripciones +tool.subscriptions.description=Suscripciones +tool.sysadmin.label=Administrador del sistema +tool.sysadmin.description=Administrador del sistema +tool.activities.label=Canal de actividades +tool.activities.description=Canal de actividades +tool.workflow.label=Flujo de trabajo +tool.workflow.description=Flujo de trabajo +tool.manage-sites.label=Administrador de sitios +tool.manage-sites.description=Administrador de sitios +tool.cloud-sync-management.label=Administrador de sincronizaci\u00f3n en la nube +tool.cloud-sync-management.description=Administrador de sincronizaci\u00f3n en la nube +tool.search-manager.label=Gestor de b\u00fasquedas +tool.search-manager.description=Gestor de b\u00fasquedas + +## Admin console tool groups +tool.group.usersgroups=Usuarios y grupos +tool.group.email=Correo electr\u00f3nico +tool.group.transformations=Transformaciones +tool.group.filemanagement=Administraci\u00f3n de ficheros +tool.group.subscriptions=Suscripciones +tool.group.repository=Repositorio +tool.group.search=Buscar +tool.group.site=Sitios + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Aceptar invitaci\u00f3n +page.acceptInvite.description=P\u00e1gina Aceptar invitaci\u00f3n. Al cargar la p\u00e1gina se desencadenar\u00e1 el tr\u00e1mite de confirmaci\u00f3n de invitaci\u00f3n al sitio, habilit\u00e1ndose la cuenta del usuario si no lo est\u00e1 a\u00fan +page.addGroups.title=A\u00f1adir grupos +page.addGroups.description=A\u00f1adir grupos +page.add-users.title=A\u00f1adir usuarios +page.add-users.description=A\u00f1adir usuarios a un sitio +page.adminConsole.title=Herramientas de administraci\u00f3n +page.adminConsole.description=Consola de administraci\u00f3n y gesti\u00f3n +page.advsearch.title=B\u00fasqueda avanzada +page.advsearch.description=B\u00fasqueda avanzada +page.blogCreateEdit.title=Blog: crear o editar una entrada en el blog +page.blogCreateEdit.description=Muestra un formulario para crear o editar una entrada +page.blogPostList.title=Blog +page.blogPostList.description=Muestra las entradas del blog +page.blogPostView.title=Blog: mostrar la vista detallada de las entradas +page.blogPostView.description=Muestra la vista detallada de las entradas +page.calendar.title=Calendario +page.calendar.description=Componente del calendario del sitio +page.changePassword.title=Cambiar contrase\u00f1a de usuario +page.changePassword.description=Cambiar la secci\u00f3n de contrase\u00f1a en la p\u00e1gina de perfil de un usuario +page.contentViewer.title=Visor de contenidos +page.contentViewer.description=P\u00e1gina para ver los contenidos de una ref. de nodo +page.createContent.title=Crear contenido +page.createContent.description=Crear contenidos basados en texto +page.createEditReplicationJob.title=Trabajo de replicaci\u00f3n +page.createEditReplicationJob.description=Crear un nuevo trabajo de replicaci\u00f3n o editar uno existente +page.customiseSite.title=Configurar el sitio +page.customiseSite.description=A\u00f1adir y eliminar p\u00e1ginas de un sitio +page.customiseSiteDashboard.title=Personalizar el panel de inicio del Sitio +page.customiseSiteDashboard.description=Personalizar el esquema y los dashlets del panel de inicio de un sitio +page.customiseUserDashboard.title=Personalizar el panel de inicio de un usuario +page.customiseUserDashboard.description=Personalizar el esquema y los dashlets del panel de inicio de un usuario +page.data-lists.title=Listas de datos +page.data-lists.description=P\u00e1gina de listas de datos +page.discussionsCreateTopic.title=Foros: ver p\u00e1gina de creaci\u00f3n de tema +page.discussionsCreateTopic.description=Muestra un formulario para crear un tema +page.discussionsTopicList.title=Foros +page.discussionsTopicList.description=Muestra los temas del foro +page.discussionsTopicView.title=Foros: mostrar la vista detallada de los temas +page.discussionsTopicView.description=Muestra la vista detallada de los temas +page.documentDetails.title=Detalles del documento +page.documentDetails.description=Detalles del documento +page.documentLibrary.title=Biblioteca de documentos +page.documentLibrary.description=Biblioteca de documentos con vista en \u00e1rbol +page.editMetadata.title=Editar propiedades +page.editMetadata.description=Editar las propiedades de un nodo +page.folderDetails.title=Detalles de carpeta +page.folderDetails.description=Detalles de carpeta +page.folderRules.title=Reglas de carpeta +page.folderRules.description=Reglas de carpeta +page.geographicMap.title=Vista de Google Maps +page.geographicMap.description=Ver ubicaci\u00f3n de fotograf\u00eda en Google Maps +page.inlineEdit.title=Editar en Alfresco Share +page.inlineEdit.description=Editar ficheros de texto en Alfresco Share +page.invite.title=Invitar +page.invite.description=Invitar +page.links.title=Enlaces +page.links.description=Enlaces +page.linkCreateEdit.title=Enlaces: crear o editar enlace +page.linkCreateEdit.description=Muestra un formulario para crear o editar un enlace +page.linksView.title=Enlaces: mostrar vista detallada de enlaces +page.linksView.description=Muestra la vista detallada de los enlaces +page.login.title=Iniciar sesi\u00f3n +page.logout.title=Cerrar sesi\u00f3n +page.managePermissions.title=Gestionar permisos +page.managePermissions.description=Gestionar permisos +page.myFiles.title=Mis ficheros +page.myFiles.description=Buscar mis ficheros +page.myDocumentLibraries.title=Mis Bibliotecas de documentos +page.myDocumentLibraries.description=P\u00e1gina de lanzamiento de Mis Bibliotecas de documentos +page.myTasks.title=Mis Tareas +page.myTasks.description=Lista de tareas activas y completas. +page.myWorkflows.title=Flujos de trabajo que he iniciado +page.myWorkflows.description=P\u00e1gina Flujos de trabajo que he iniciado +page.pendingInvites.title=Pendiente +page.pendingInvites.description=Invitaciones y solicitudes de uni\u00f3n en espera +page.peopleFinder.title=Buscador de personas +page.peopleFinder.description=P\u00e1gina de buscador de personas +page.profile.title=P\u00e1gina de perfil de usuario +page.profile.description=P\u00e1gina de perfil de un usuario +page.rejectInvite.title=Rechazar invitaci\u00f3n +page.rejectInvite.description=P\u00e1gina Rechazar invitaci\u00f3n. Rechaza una solicitud de invitaci\u00f3n +page.repository.title=Navegador de repositorio +page.repository.description=Examina los contenidos de todo el repositorio +page.ruleEdit.title=Reglas de carpeta +page.ruleEdit.description=Crea o edita una regla de una carpeta. +page.search.title=Buscar +page.search.description=Vista de b\u00fasqueda +page.sharedFiles.title=Ficheros compartidos +page.sharedFiles.description=Buscar ficheros compartidos +page.siteConsole.title=Administrador de sitios +page.siteConsole.description=P\u00e1gina de Administrador de sitios - herramientas de administraci\u00f3n de sitio +page.siteFinder.title=Buscador de sitios +page.siteFinder.description=P\u00e1gina de buscador de sitios +page.siteIndex.title=Bienvenida +page.siteIndex.description=P\u00e1gina de aterrizaje para los usuarios - crear\u00e1 el panel de inicio requerido adonde reenviar\u00e1 al usuario del sitio +page.siteGroups.title=Grupos del sitio +page.siteGroups.description=Grupos del sitio +page.siteMembers.title=Miembros del sitio +page.siteMembers.description=Miembros del sitio +page.startWorkflow.title=Iniciar flujo de trabajo +page.startWorkflow.description=Inicia un nuevo flujo de trabajo +page.taskDetails.title=Detalles de la tarea +page.taskDetails.description=P\u00e1gina con informaci\u00f3n detallada de tareas +page.taskEdit.title=Editar tarea +page.taskEdit.description=P\u00e1gina para editar detalles de tareas +page.userContent.title=Contenido editado por usuario +page.userContent.description=Listas de contenidos reci\u00e9n editados por un usuario +page.userFollowers.title=Seguidores +page.userFollowers.description=Lista las personas que siguen al usuario +page.userFollowing.title=Siguiendo +page.userFollowing.description=Lista de las personas a las que sigue el usuario +page.userNotifications.title=Configuraci\u00f3n de notificaci\u00f3n de usuario +page.userNotifications.description=Cambiar la secci\u00f3n de configuraci\u00f3n de notificaci\u00f3n en la p\u00e1gina de perfil de un usuario +page.userCloudAuth.title=Autenticaci\u00f3n del usuario de la nube +page.userCloudAuth.description=Cambiar los datos de autenticaci\u00f3n de la nube +page.userSites.title=Lista de sitios de usuario +page.userSites.description=Lista de sitios a los que pertenece un usuario +page.userTrashcan.title=Papelera del usuario +page.userTrashcan.description=Lista de los documentos y carpetas eliminados del usuario actual +page.wiki.title=Wiki +page.wiki.description=La p\u00e1gina de aterrizaje para wiki +page.wikiCreate.title=Crear formulario wiki +page.wikiCreate.description=Muestra un formulario para crear una nueva p\u00e1gina wiki +page.wikiPage.title=Wiki +page.wikiPage.description=Muestra una p\u00e1gina wiki +page.workspace.title=Panel de inicio del espacio de documentos +page.workspace.description=P\u00e1gina de panel de inicio del espacio de documentos +page.workflowDetails.title=Detalles de flujo de trabajo +page.workflowDetails.description=P\u00e1gina de detalles de flujo de trabajo + +## Dashboard page titles and descriptions +page.siteDashboard.title=Panel de inicio del sitio +page.siteDashboard.description=P\u00e1gina de panel de inicio de sitio colaborativo +page.userDashboard.title=Panel de inicio de usuario +page.userDashboard.description=P\u00e1gina de panel de inicio de usuarios +page.meeting_workspace.title=Panel de inicio del espacio de reuni\u00f3n +page.meeting_workspace.description=P\u00e1gina de panel de inicio del espacio de reuni\u00f3n + +page.error.500.title=Alfresco Share » Error del sistema +page.error.500.header=Esta p\u00e1gina tiene alg\u00fan error... +page.error.500.detail=

Se ha podido producir un error o alg\u00fan elemento se ha borrado o eliminado; compruebe que la URL es correcta.

Tambi\u00e9n puede ocurrir que no tenga permiso para ver la p\u00e1gina (podr\u00eda pertenecer a un sitio privado) o que se haya producido un error interno. Consulte con su equipo de TI para comprobarlo.

Si est\u00e1 tratando de acceder a su p\u00e1gina de inicio y ya no est\u00e1 disponible, deber\u00e1 cambiarla. Para ello, haga clic en su nombre en la barra de herramientas.

+page.error.500.nav.dashboard=Volver a Mi Panel de inicio +page.error.500.footer=Alfresco Software Inc. © 2005-2023 Todos los derechos reservados. + +## Title bar component titles for pages that use the simple-title component +title.repository=Repositorio +title.browser=Navegador +title.siteFinder=Buscador de sitios +title.peopleFinder=Buscador de personas +title.myTasks=Mis Tareas + +## Site Visibility +site.visibility.label.PUBLIC=P\u00fablico +site.visibility.label.MODERATED=Moderado +site.visibility.label.PRIVATE=Lista privada +site.visibility.description.PUBLIC=Todas las personas de su organizaci\u00f3n pueden acceder a este sitio. +site.visibility.description.MODERATED=Todas las personas de su organizaci\u00f3n pueden encontrar este sitio y solicitar acceso. El acceso lo conceden los administradores del sitio. +site.visibility.description.PRIVATE=Solo las personas que haya a\u00f1adido el administrador del sitio pueden encontrar y usar este sitio. + +## Roles +role.SiteManager=Administrador +role.SiteManager.description=tiene derechos plenos sobre todo el contenido del sitio; sobre lo que ha creado \u00e9l mismo y lo que han creado otros miembros del sitio. +role.Collaborator=Colaborador +role.Collaborator.description=tiene derechos plenos sobre el contenido de su propiedad; tiene derechos para editar el contenido creado por otros, pero no para eliminarlo. +role.SiteCollaborator=Colaborador +role.SiteCollaborator.description=tiene derechos plenos sobre el contenido del sitio de su propiedad; tiene derechos para editar el contenido creado por otros miembros del sitio, pero no para eliminarlo. +role.Contributor=Contribuidor +role.Contributor.description=tiene derechos plenos sobre el contenido de su propiedad; no puede editar ni eliminar el contenido creado por otros. +role.SiteContributor=Contribuidor +role.SiteContributor.description=tiene derechos plenos sobre el contenido del sitio de su propiedad; no puede editar ni eliminar el contenido creado por otros miembros del sitio. +role.Consumer=Consumidor +role.Consumer.description=solo tiene derechos para ver contenido; no puede crear su propio contenido. +role.SiteConsumer=Consumidor +role.SiteConsumer.description=solo tiene derechos para ver contenido en un sitio; no puede crear su propio contenido. +role.Coordinator=Coordinador +role.Coordinator.description=tiene derechos plenos sobre todo el contenido; sobre lo que ha creado \u00e9l mismo y lo que han creado otros. +role.Editor=Editor +role.Editor.description=tiene derechos para editar las propiedades de los ficheros y bloquear y desbloquear ficheros; no puede crear su propio contenido. + +roles.readassociations=Consumidor + +roles-tooltip.header=Acerca de las funciones +roles-tooltip.docs-url-label=M\u00e1s informaci\u00f3n +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Etiquetas +taglibrary.populartagslink=Elegir entre las etiquetas m\u00e1s frecuentes del sitio +taglibrary.msg.failedLoadTags=No se pueden cargar las etiquetas desde el servidor (\u00bfconexi\u00f3n perdida?) +taglibrary.msg.unableLoadTags=No se pudieron cargar las etiquetas: {0} +taglibrary.tip.removeTag=Quitar etiqueta +taglibrary.tip.help=Separar las etiquetas con espacios. Unir dos o m\u00e1s palabras con "double quotes" + +## YUI Editor keys +yuieditor.toolbar.group.font=Estilo de fuente +yuieditor.toolbar.group.lists=Listas +yuieditor.toolbar.group.link=Enlazar +yuieditor.toolbar.item.createorderedlist=Lista numerada +yuieditor.toolbar.item.createunorderedlist=Lista con vi\u00f1etas +yuieditor.toolbar.item.fontcolor=Color de fuente +yuieditor.toolbar.item.backgroundcolor=Color de fondo +yuieditor.toolbar.item.bold=Negrita CTRL + SHIFT + B +yuieditor.toolbar.item.italic=It\u00e1lica CTRL + SHIFT + I +yuieditor.toolbar.item.underline=Subrayado CTRL + SHIFT + U +yuieditor.toolbar.item.link=Enlace HTML CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=Seleccionar +menu.select.all=Todos +menu.select.none=Ninguno +menu.select.invert=Invertir la selecci\u00f3n +menu.select.folders=Carpetas +menu.select.documents=Documentos + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Crear documento a partir de plantilla +menu.create-content.by-template-folder=Crear carpeta a partir de plantilla +menu.selected-items=Elementos seleccionados... +menu.selected-items.copy=Copiar a... +menu.selected-items.move=Mover a... +menu.selected-items.delete=Eliminar +menu.selected-items.download=Descargar como zip +menu.selected-items.assign-workflow=Iniciar un flujo de trabajo... +menu.selected-items.manage-permissions=Gestionar los permisos... +menu.selected-items.deselect-all=Deseleccionar todo +menu.selected-items.cloudSync=Sincronizar con la nube +menu.selected-items.cloudUnsync=Desincronizar de la nube +menu.selected-items.cloudRequestSync=Solicitar sincronizaci\u00f3n + +## Document Library Actions +actions.document.assign-workflow=Iniciar flujo de trabajo +actions.document.cancel-editing=Cancelar edici\u00f3n +actions.document.cancel-editing-unlock=Desbloquear documento +actions.document.change-type=Cambiar tipo +actions.document.copy-to=Copiar a... +actions.document.delete=Eliminar documento +actions.document.download=Descargar +actions.document.download-again=Descargar +actions.document.download-original=Descargar original +actions.document.edit-metadata=Editar propiedades +actions.document.edit-offline=Editar fuera de l\u00ednea +actions.document.edit-online=Editar en Microsoft Office\u2122 +message.edit-online.supported_office_version_required=Est\u00e1 usando una versi\u00f3n de Microsoft Office que no es compatible. Intente actualizar Microsoft Office. Office 2007 y 2008 no funcionan con Google Chrome. +actions.document.extract-metadata=Extraer metadatos +actions.document.execute-script=Ejecutar script +actions.document.inline-edit=Editar en Alfresco Share +actions.document.increment-counter=Incrementar el contador +actions.document.locate=Localizar un fichero +actions.document.manage-aspects=Gestionar los aspectos +actions.document.manage-permissions=Gestionar permisos +actions.document.take-ownership=Convertirse en propietario +actions.document.move-to=Mover a... +actions.document.simple-approve=Aprobar +actions.document.simple-reject=Rechazar +actions.document.upload-new-version=Cargar nueva versi\u00f3n +actions.document.view=Ver en el navegador +actions.document.view-google-map=Ver en Google Maps +actions.document.view-original=Ver documento original +actions.document.view-source-repository=Ver en repositorio de origen +actions.document.view-working-copy=Ver copia de trabajo +actions.document.publish=Publicar +actions.document.transform=Transformar +actions.document.transform-image=Transformar en imagen +actions.document.publish-content=Publicar contenido +actions.document.cloud-sync=Sincronizar con la nube +actions.document.cloud-unsync=Desincronizar de la nube +actions.document.view-in-cloud=Ver en la nube +actions.document.request-sync=Solicitar sincronizaci\u00f3n +actions.document.unzip-to=Descomprimir en... +actions.folder.download=Descargar como zip +actions.folder.change-type=Cambiar tipo +actions.folder.copy-to=Copiar a... +actions.folder.delete=Eliminar la carpeta +actions.folder.edit-metadata=Editar propiedades +actions.folder.locate=Localizar carpeta +actions.folder.manage-aspects=Gestionar los aspectos +actions.folder.manage-permissions=Gestionar permisos +actions.folder.take-ownership=Convertirse en propietario +actions.folder.move-to=Mover a... +actions.folder.rules=Gestionar reglas +actions.folder.simple-approve=Aprobar +actions.folder.simple-reject=Rechazar +actions.folder.view-details=Ver los detalles +actions.folder.view-source-repository=Ver en repositorio de origen +actions.folder.cloud-sync=Sincronizar con la nube +actions.folder.cloud-unsync=Desincronizar de la nube +actions.folder.view-in-cloud=Ver en la nube +actions.link.delete=Eliminar enlace +actions.link.locate=Localizar elemento enlazado +actions.editOnline.failure=No se puede abrir el fichero ''{0}'' para ser editado en l\u00ednea. Necesita instalar uno de los siguientes plug-ins en su navegador. \n Para Windows: Microsoft Office 2010 \n Para Mac OS X: Plug-in SharePoint Browser +actions.editOnline.invalid=El fichero ''{0}'' no pudo editarse en l\u00ednea porque su ruta contiene caracteres que no est\u00e1n permitidas por el protocolo SPP.\nLos caracteres no v\u00e1lidos incluyen los siguientes: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' est\u00e1 sincronizado y esta eliminaci\u00f3n quitar\u00e1 el documento a nivel local y en la nube. +actions.synced.folder.delete=
''{0}'' est\u00e1 sincronizado y esta eliminaci\u00f3n quitar\u00e1 esta carpeta y su contenido a nivel local y en la nube. +actions.synced.remove-sync=
Si el objeto debe permanecer en la nube inmediatamente, ejecute la acci\u00f3n "Eliminar sincronizaci\u00f3n". +actions.synced.cloud.document.delete=
''{0}'' est\u00e1 sincronizado y esta eliminaci\u00f3n quitar\u00e1 el documento solo a nivel local. +actions.synced.cloud.folder.delete=
''{0}'' est\u00e1 sincronizado y esta eliminaci\u00f3n quitar\u00e1 esta carpeta y su contenido solo a nivel local. +actions.synced.cloud.document.delete.on.prem=
''{0}'' est\u00e1 sincronizado y esta eliminaci\u00f3n borrar\u00e1 el documento a nivel local y en la nube. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' est\u00e1 sincronizado y esta eliminaci\u00f3n borrar\u00e1 esta carpeta y todo el contenido en ella a nivel local y en la nube. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=No se puede encontrar el elemento enlazado: se ha eliminado el objetivo. +message.change-type.success=Se cambi\u00f3 con \u00e9xito el tipo de documento ''{0}'' +message.change-type.failure=No se pudo cambiar el tipo de documento ''{0}'' +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar ''{0}''? +message.delete.success=Se ha eliminado ''{0}'' +message.delete.failure=No se ha podido eliminar ''{0}'' +message.multiple-delete.please-wait=Espere. Se est\u00e1n borrando los ficheros... +message.confirm.take-ownership.title=\u00bfConvertirse en propietario? +message.confirm.take-ownership=Se convertir\u00e1 en el propietario de ''{0}'' y el propietario anterior puede sufrir restricciones de sus permisos. +message.take-ownership.success=Ahora es el propietario de ''{0}'' +message.take-ownership.failure=No se ha podido tomar la propiedad de ''{0}'' +message.details.success=Detalles actualizados correctamente +message.details.failure=No se pueden actualizar los detalles +message.details.failure.name=No se pudo cambiar el nombre del elemento. Es posible que ya exista otro elemento con el mismo nombre. +message.details.failure.more.max.length=Una de las propiedades supera el tama\u00f1o del valor m\u00e1ximo. +message.sync.success=Se ha creado la sincronizaci\u00f3n +message.sync.failure=No se ha podido crear la sincronizaci\u00f3n +message.sync.unavailable=No se ha podido conectar con el servidor de sincronizaci\u00f3n. +message.unsync.confirm=\u00bfEst\u00e1 seguro de que desea desincronizar ''{0}''? +message.unsync.success=Se ha eliminado la sincronizaci\u00f3n +message.unsync.failure=No se ha podido eliminar la sincronizaci\u00f3n +message.request.sync.success=Sincronizaci\u00f3n solicitada con \u00e9xito +message.request.sync.failure=No se ha podido solicitar la sincronizaci\u00f3n +message.error=No se puede acceder a la biblioteca de documentos +message.empty=No hay elementos +message.empty.subfolders=No hay elementos. Pulse ''{0}'' para ver {1} subcarpeta(s) aqu\u00ed. +message.empty.subfolders.link=Mostrar carpetas +message.edit-offline.failure=No puede editar ''{0}''. +message.edit-offline.success=''{0}'' ya se puede editar +message.edit-offline.success.ie7=Descargar el documento usando el bot\u00f3n de abajo. +message.edit-online.office.failure=No se pudo iniciar MS Office. +message.edit-online.office.path.failure=La edici\u00f3n en l\u00ednea no est\u00e1 disponible porque la URL tiene m\u00e1s de 260 caracteres. Use una ruta menos profunda para reducir la longitud. +message.edit-online-aos.no_supported_environment=Esta funci\u00f3n solo est\u00e1 disponible en Windows o Mac OS X. +message.edit-online-aos.starting_office_failed=Microsoft Office no se ha podido abrir. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office bloqueado +message.edit-online-aos.plugin_blocked.body.firefox=Haga clic en la barra de herramientas de Firefox para continuar. +message.edit-online-aos.plugin_blocked.body.chrome=Haga clic en el indicador bloqueado de la barra de direcciones de Chrome para continuar. +message.edit-online-aos.plugin_blocked.body.safari=Haga clic en De confianza para continuar. +message.edit-online-aos.plugin_blocked.button_dismiss=Aceptar +message.edit-online-aos.supported_office_version_required=Est\u00e1 usando una versi\u00f3n de Microsoft Office que no es compatible. Intente actualizar Microsoft Office. +message.edit-online-aos.edit_offline_locked.title={0} est\u00e1 editando este fichero +message.edit-online-aos.edit_offline_locked.message=Cualquier cambio que haga se perder\u00e1. +message.edit-online-aos.edit_offline_locked.confirm=Continuar +message.edit-online-aos.edit_offline_locked.cancel=Cancelar +message.edit-online-aos.edit_locked.title={0} est\u00e1 editando este fichero +message.edit-online-aos.edit_locked.message=El documento est\u00e1 bloqueado. +message.edit-online-aos.edit_locked.button_dismiss=Aceptar +message.unlock-document.failure=No se ha podido desbloquear ''{0}''. +message.edit-cancel.failure=No se ha podido cancelar la edici\u00f3n de ''{0}''. +message.edit-cancel.success=La edici\u00f3n de ''{0}'' se ha cancelado. +message.unlock-document.success=La edici\u00f3n de ''{0}'' se ha desbloqueado. +message.file-dnd-move.failure=No se pudo mover el documento. +message.increment-counter.success=Contador incrementado +message.increment-counter.failure=No se pudo incrementar el contador. +message.extract-metadata.success=Los metadatos se han extra\u00eddo correctamente. +message.extract-metadata.failure=No se pudo extraer los metadatos. +message.execute-script.success=El script se ha ejecutado correctamente +message.execute-script.failure=No se pudo ejecutar el script +message.insitu-edit.name.failure=No se pudo cambiar el nombre del fichero. Es posible que ya exista otro fichero con el mismo nombre. +message.loading=Cargando biblioteca de documentos... +message.simple-workflow.failure=La acci\u00f3n del flujo de trabajo no se puede completar. +message.simple-workflow.approved=Elemento marcado como aprobado +message.simple-workflow.rejected=Elemento marcado como rechazado +message.simple-workflow.failed=La acci\u00f3n del flujo de trabajo no se puede completar. +message.transform.success=El documento ''{0}'' se ha transformado correctamente +message.transform.failure=No se pudo transformar el documento +message.transform-image.success=La imagen ''{0}'' se ha transformado correctamente +message.transform-image.failure=No se pudo transformar el documento +message.new-version-upload.success=Fichero cargado correctamente. La vista previa puede no mostrar todav\u00eda la \u00faltima versi\u00f3n del documento. Puede actualizar la p\u00e1gina m\u00e1s tarde para actualizarla. + +message.insitu-edit.tag.failure=No se pudo editar la etiqueta + +## Drag and Drop +message.dnd.allColumnsAreFull=No se pueden a\u00f1adir elementos ya que todas las columnas est\u00e1n llenas + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Armonizable +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Efectividad +aspect.cm_emailed=Enviado por correo electr\u00f3nico +aspect.cm_generalclassifiable=Clasificable +aspect.cm_summarizable=Resumible +aspect.cm_taggable=Etiquetable +aspect.cm_templatable=Hacer plantilla +aspect.cm_versionable=Versionable +aspect.emailserver_aliasable=Alias de correo electr\u00f3nico +aspect.app_inlineeditable=Editable en l\u00ednea +aspect.cm_geographic=Geogr\u00e1fico +aspect.exif_exif=EXIF +aspect.exif_resolution=Resoluci\u00f3n +aspect.exif_camera=Detalles de la c\u00e1mara +aspect.audio_audio=Audio +aspect.cm_indexControl=Control de \u00edndices +aspect.dp_restrictable=Restringible +aspect.cm_attachable=Adjuntos + +# Groups +group.everyone=TODOS + +# Types +type.cm_content=Tipo b\u00e1sico de contenido +type.cm_folder=Tipo b\u00e1sico de carpeta +type.trx_transferTarget=Destino de la transferencia +type.trx_fileTransferTarget=Destino de transferencia de fichero + +# Generic Form labels +form.set.general=General +form.set.operations=Operaciones + +# Runtime +runtime.field.FreeMemory=Memoria libre +runtime.field.MaxMemory=Memoria m\u00e1xima +runtime.field.TotalMemory=Memoria total + +# Repository Server +repository-server.set.version=Informaci\u00f3n de la versi\u00f3n +repository-server.field.Name=Nombre +repository-server.field.Id=ID +repository-server.field.Edition=Edici\u00f3n +repository-server.field.Schema=Esquema +repository-server.field.Version=Versi\u00f3n +repository-server.field.VersionLabel=Etiqueta +repository-server.field.VersionMinor=Menor +repository-server.field.VersionMajor=Mayor +repository-server.field.VersionRevision=Revisi\u00f3n +repository-server.field.VersionBuild=Compilaci\u00f3n +repository-server.field.VersionNumber=N\u00famero + +# Repository Installed +repository-installed.set.version=Informaci\u00f3n de la versi\u00f3n +repository-installed.field.Name=Nombre +repository-installed.field.Id=ID +repository-installed.field.Edition=Edici\u00f3n +repository-installed.field.Schema=Esquema +repository-installed.field.Version=Versi\u00f3n +repository-installed.field.VersionLabel=Etiqueta +repository-installed.field.VersionMinor=Menor +repository-installed.field.VersionMajor=Mayor +repository-installed.field.VersionRevision=Revisi\u00f3n +repository-installed.field.VersionBuild=Compilaci\u00f3n +repository-installed.field.VersionNumber=N\u00famero + +# Authority +authority.field.NumberOfGroups=N\u00famero de grupos +authority.field.NumberOfUsers=N\u00famero de usuarios + +# License +header.license= +license.field.Subject=Firmante de la licencia +license.field.Days=D\u00edas +license.field.Holder=Titular +license.field.ValidUntil=V\u00e1lida hasta +license.field.RemainingDays=D\u00edas restantes +license.field.Issued=Emitida +license.field.Issuer=Emisor +license.field.HeartBeatDisabled=Comprobaci\u00f3n de presencia desactivada +license.field.LicenseMode=Modo de licencia +license.field.CloudSyncKeyAvailable=Clave de sincr. de nube disponible +license.field.MaxDocs=M\u00e1ximo de objetos de contenido +license.field.MaxUsers=N\u00ba m\u00e1x. de usuarios +license.field.Users=Usuarios +license.field.Documents=Objetos de contenido +license.field.Info=Este valor puede mostrarse como cero si su licencia no tiene restricci\u00f3n sobre el n\u00famero de usuarios. + +# Pdf2Swf +pdf2swf.field.Available=Disponible +pdf2swf.field.VersionString=Versi\u00f3n + +# Open Office +openoffice.field.available=Disponible +openoffice.field.ooName=Nombre +openoffice.field.ooOpenSourceContext=Contexto de c\u00f3digo abierto +openoffice.field.ooSetupExtension=Extensi\u00f3n +openoffice.field.ooSetupVersion=Versi\u00f3n +openoffice.field.ooSetupVersionAboutBox=Acerca de +openoffice.field.ooXMLFileFormatName=Formato de fichero XML +openoffice.field.ooXMLFileFormatVersion=Versi\u00f3n del formato de fichero XML +openoffice.error=No se puede mostrar la informaci\u00f3n de OpenOffice +openoffice.error.404=No se encontr\u00f3 la informaci\u00f3n de OpenOffice (quiz\u00e1s la propiedad "ooo.enabled" est\u00e1 configurada como "false") + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Activado +openoffice-subsystem.field.ooo.exe=Ejecuci\u00f3n +openoffice-subsystem.field.ooo.port=Puerto + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Activado +ooojodconverter.field.jodconverter.maxTasksPerProcess=M\u00e1x. Tareas por proceso +ooojodconverter.field.jodconverter.officeHome=Espacio de oficina +ooojodconverter.field.jodconverter.portNumbers=N\u00fameros de puerto +ooojodconverter.field.jodconverter.taskExecutionTimeout=Tiempo de espera para ejecuci\u00f3n de tarea +ooojodconverter.field.jodconverter.taskQueueTimeout=Tiempo de espera en cola de la tarea + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Disponible +transformer-imagemagick.field.VersionString=Informaci\u00f3n de la versi\u00f3n + +# File servers +fileservers.set.filesystem=Sistema de ficheros +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Nivel de acceso predeterminado +fileservers.field.filesystem.acl.global.domainAccessControls=Controles de acceso del dominio +fileservers.field.filesystem.acl.global.protocolAccessControls=Controles de acceso con protocolo +fileservers.field.filesystem.acl.global.userAccessControls=Controles de acceso de usuarios +fileservers.field.filesystem.domainMappings=Asignaciones de dominios +fileservers.field.filesystem.name=Nombre de sistema de ficheros +fileservers.field.filesystem.name.description=El nombre de los sistemas de ficheros cuando se accede a trav\u00e9s de CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=Detecci\u00f3n autom\u00e1tica de WINS activada +fileservers.field.cifs.WINS.primary=WINS primario +fileservers.field.cifs.WINS.secondary=WINS secundario +fileservers.field.cifs.bindto=Enlazar a +fileservers.field.cifs.broadcast=Difundir +fileservers.field.cifs.disableNIO=Desactivar NIO +fileservers.field.cifs.disableNativeCode=Desactivar c\u00f3digo nativo +fileservers.field.cifs.domain=Dominio +fileservers.field.cifs.enabled=CIFS activado +fileservers.field.cifs.hostannounce=Anuncio del host +fileservers.field.cifs.ipv6.enabled=IPV6 activado +fileservers.field.cifs.netBIOSSMB.datagramPort=Puerto de SMB de datagramas de NetBIOS +fileservers.field.cifs.netBIOSSMB.namePort=Puerto de SMB de nombres de NetBIOS +fileservers.field.cifs.netBIOSSMB.sessionPort=Puerto de SMB de sesiones de NetBIOS +fileservers.field.cifs.serverName=Nombre del servidor +fileservers.field.cifs.sessionDebug=Depuraci\u00f3n de sesi\u00f3n +fileservers.field.cifs.sessionTimeout=La sesi\u00f3n ha caducado +fileservers.field.cifs.tcpipSMB.port=Puerto de SMB de TCP/IP +fileservers.field.ftp.dataPortFrom=Puerto de datos de origen +fileservers.field.ftp.dataPortTo=Puerto de datos de destino +fileservers.field.ftp.enabled=FTP activado +fileservers.field.ftp.keyStore=Almac\u00e9n de claves +fileservers.field.ftp.passphrase=Frase de contrase\u00f1a +fileservers.field.ftp.port=Puerto +fileservers.field.ftp.requireSecureSession=Requerir sesi\u00f3n segura +fileservers.field.ftp.sessionDebug=Depuraci\u00f3n de sesi\u00f3n +fileservers.field.ftp.sslEngineDebug=Depuraci\u00f3n de motor SSL +fileservers.field.ftp.trustStore=Almac\u00e9n de confianza + +# Sysadmin +sysadmin.field.alfresco.context=Contexto de repositorio +sysadmin.field.alfresco.host=Host de repositorio +sysadmin.field.alfresco.port=Puerto de repositorio +sysadmin.field.alfresco.protocol=Protocolo de repositorio +sysadmin.field.server.allowedusers=Usuarios permitidos +sysadmin.field.server.maxusers=N\u00ba m\u00e1x. de usuarios +sysadmin.field.server.transaction.allow-writes=Permite escritura +sysadmin.field.share.context=Contexto de Share +sysadmin.field.share.host=Host de Share +sysadmin.field.share.port=Puerto de Share +sysadmin.field.share.protocol=Protocolo de Share + +# Email (Inbound) +email-inbound.set.service=Servicio de correo electr\u00f3nico entrante +email-inbound.field.email.inbound.enabled=Servicio activado +email-inbound.field.email.inbound.unknownUser=Usuario desconocido +email-inbound.set.server=Servidor de correo electr\u00f3nico entrante +email-inbound.field.email.server.allowed.senders=Remitentes permitidos +email-inbound.field.email.server.blocked.senders=Remitentes bloqueados +email-inbound.field.email.server.enabled=Servidor activado +email-inbound.field.email.server.domain=Dominio +email-inbound.field.email.server.port=Puerto +email-inbound.field.email.server.connections.max=N\u00famero m\u00e1ximo de conexiones +email-inbound.set.tls=Seguridad de la capa de transporte +email-inbound.field.email.server.requireTLS=Requerir seguridad de la capa de transporte (TLS) +email-inbound.field.email.server.hideTLS=EHLO no devuelve la seguridad de la capa de transporte (TLS) +email-inbound.field.email.server.enableTLS=Aceptar seguridad de la capa de transporte (TLS) + +# Email (Outbound) +email-outbound.set.auth=Autenticaci\u00f3n +email-outbound.set.test-message=Mensaje de prueba +email-outbound.field.mail.host=Host +email-outbound.field.mail.port=Puerto +email-outbound.field.mail.protocol=Protocolo +email-outbound.field.mail.encoding=Codificaci\u00f3n +email-outbound.field.mail.from.default=Direcci\u00f3n de remitente predeterminada +email-outbound.field.mail.from.enabled=De activado +email-outbound.field.mail.smtp.auth=Autenticaci\u00f3n de SMTP requerida +email-outbound.field.mail.smtps.auth=Autenticaci\u00f3n de SMTPS requerida +email-outbound.field.mail.username=Nombre de usuario +email-outbound.field.mail.password=Contrase\u00f1a +email-outbound.field.mail.testmessage.send=Enviar mensaje de prueba al iniciar +email-outbound.field.mail.testmessage.to=Para +email-outbound.field.mail.testmessage.subject=Asunto +email-outbound.field.mail.testmessage.text=Mensaje + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Ruta de la carpeta de inicio +imap.field.imap.config.home.rootPath=Ruta de la ra\u00edz del inicio +imap.field.imap.config.home.store=Almac\u00e9n del inicio +imap.field.imap.server.attachments.extraction.enabled=Extracci\u00f3n activada +imap.field.imap.config.ignore.extraction=Ignorar extracci\u00f3n +imap.field.imap.config.server.mountPoints=Puntos de montaje +imap.field.imap.mail.from.default=Opci\u00f3n predeterminada para remisi\u00f3n de mensajes +imap.field.imap.mail.to.default=Opci\u00f3n predeterminada para env\u00edo de mensajes +imap.field.imap.server.enabled=Activado +imap.field.imap.server.host=Host +imap.field.imap.server.port=Puerto + +# Activities Feed +activities.set.activities=Canal de actividades +activities.field.feed.notifier.enabled=Notificaci\u00f3n de canal activada +activities.field.feed.notifier.repeatIntervalMins=Intervalo de repetici\u00f3n (minutos) +activities.field.feed.max.ageMins=Antig\u00fcedad m\u00e1xima (minutos) +activities.field.feed.max.size=Tama\u00f1o m\u00e1ximo + +# Subscriptions +subscriptions.field.subscriptions.enabled=Activado + +# Workflow +workflow.field.message=Mensaje +workflow.field.comment=Comentario +workflow.field.assign_to=Asignar a +workflow.field.review_group=Revisar un grupo +workflow.field.reviewer=Revisor +workflow.field.reviewers=Revisores +workflow.field.due=Vencimiento +workflow.field.priority=Prioridad +workflow.field.outcome=Resultado +workflow.field.enabled.activiti=Activado +workflow.field.enabled.jbpm=Activado +workflow.field.definitions.visible=Definiciones visibles +workflow.field.number.tasks=N\u00famero de tareas +workflow.field.number.definitions=N\u00famero de definiciones +workflow.field.number.workflows=N\u00famero de flujos de trabajo +workflow.field.requiredApprovePercent=Porcentaje de aprobaci\u00f3n requerido +workflow.set.general=General +workflow.set.assignee=Asignado a +workflow.set.assignees=Usuarios a asignar la tarea +workflow.set.information=Informaci\u00f3n +workflow.set.items=Elementos +workflow.set.outcome=Resultado +workflow.set.other=Otras opciones +workflow.set.task.info=Informaci\u00f3n +workflow.set.workflow.more_info=M\u00e1s informaci\u00f3n +workflow.set.task.progress=En curso +workflow.set.response=Respuesta +workflow.set.engine.activiti=Motor de Activiti +workflow.set.engine.jbpm=Motor de JBPM +workflow.task.error=No se ha podido cargar la tarea. +workflow.task.error.404=La tarea no existe o se ha cancelado. +workflow.task.invite.title=Sitio {0} +workflow.task.invite.subtitle=Se le ha invitado a unirse al sitio {0}. +workflow.task.invite.role=Su rol ser\u00e1 {0}. +workflow.task.invite.accepted={0} {1} ha aceptado su invitaci\u00f3n a unirse al sitio {2}. +workflow.task.invite.rejected={0} {1} ha rechazado su invitaci\u00f3n a unirse al sitio {2}. +workflow.task.request.invite.title=El usuario {0} ha solicitado unirse al sitio {1}. +workflow.cancel.title=Cancelar flujo de trabajo +workflow.cancel.label=\u00bfEst\u00e1 seguro de que quiere cancelar el flujo de trabajo? +workflow.cancel.feedback=Cancelando el flujo de trabajo... +workflow.cancel.success=Flujo de trabajo cancelado con \u00e9xito +workflow.cancel.failure=No se pudo cancelar el flujo de trabajo +workflow.delete.title=Eliminar flujo de trabajo +workflow.delete.label=\u00bfEst\u00e1 seguro de que quiere eliminar el flujo de trabajo? +workflow.delete.feedback=Eliminando flujo de trabajo... +workflow.delete.success=El flujo de trabajo se ha eliminado correctamente +workflow.delete.failure=No se ha podido eliminar el flujo de trabajo +workflow.no_message=(No hay mensajes) +tool.workflow.activiti.tools=Herramientas de Activiti +tool.workflow.activiti.admin.link=Consola de flujo de trabajo de Activiti + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Gestor de b\u00fasquedas +tool.searchmanager.description=Gestor de b\u00fasquedas + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Activado +lucene.field.dir.indexes=Indexar directorio +lucene.field.index.recovery.mode=Indexar modo de recuperaci\u00f3n +lucene.field.lucene.indexer.contentIndexingEnabled=Indexaci\u00f3n de contenido activada +lucene.field.index.tracking.disableInTransactionIndexing=Desactivar en indexaci\u00f3n de transacci\u00f3n + +lucene.set.backup=Copia de seguridad +lucene.backup.field.dir.indexes.backup=Indizar directorio de copia de seguridad +lucene.backup.field.index.backup.cronExpression=Copia de seguridad de expresi\u00f3n Cron + +lucene.set.advanced=Avanzada +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Indexaci\u00f3n de contenido activada +lucene.advanced.field.fts.indexer.batchSize=Indizando tama\u00f1o de lote +lucene.advanced.field.lucene.maxAtomicTransformationTime=M\u00e1x. tiempo at\u00f3mico de transformaci\u00f3n +lucene.advanced.field.index.reindexMissingContent.cronExpression=Contenido carente de expresi\u00f3n Cron +lucene.advanced.field.indexer.maxFieldLength=N\u00famero m\u00e1ximo de s\u00edmbolos indexados por documento +lucene.field.indexer.mergerMaxMergeDocs=M\u00e1ximo de documentos unidos +lucene.field.indexer.mergerMergeFactor=Factor de uni\u00f3n m\u00e1ximo + +# Transform action form +transform.field.mime-type=Formato requerido +transform.field.destination-folder=Destino + +# Transform Image action form +transform-image.field.mime-type=Formato requerido +transform-image.field.convert-command=Opciones +transform-image.field.destination-folder=Destino + +publish-content.field.publish-channel-id=Canal de publicaci\u00f3n +publish-content.field.unpublish=No publicar +publish-content.field.status-update=Actualizaci\u00f3n de estado +publish-content.field.status-update-channel-id=Canales de actualizaci\u00f3n de estado + +# Execute Script action form +script.field.script-ref=Script + +# Solr +solr.set.spacesstore=Propiedades del almac\u00e9n principal +solr.set.archivestore=Propiedades del almac\u00e9n de archivos eliminados temporalmente +solr.field.search.solrTrackingSupport.enabled=Seguimiento activo +solr.help.search.solrTrackingSupport.enabled=Activar para permitir que Solr se conecte a este servidor, realice seguimientos y actualice \u00edndices +solr.field.solr.host=Nombre de host de Solr +solr.help.field.solr.host=Nombre del host donde se ejecuta su servidor Solr. Utilizar el host local si se ejecuta en el mismo equipo. +solr.field.solr.port=Puerto Solr (no SSL) +solr.help.field.solr.port=El puerto http (no seguro) del servidor de aplicaciones en el que se est\u00e1 ejecutando Solr. Solo se utiliza si Solr se ha configurado para ejecutarse sin comunicaciones seguras. +solr.field.solr.port.ssl=Puerto SSL de Solr +solr.help.field.solr.port.ssl=El puerto https del servidor de aplicaciones en el que se est\u00e1 ejecutando Solr. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indexaci\u00f3n en curso +solr.field.tracker.alfresco.lag=Intervalos de indexaci\u00f3n (segundos) +solr.field.tracker.alfresco.last.indexed.txn=\u00daltima transacci\u00f3n indexada +solr.field.tracker.alfresco.approx.txns.remaining=Transacciones aprox. a indexar +solr.field.tracker.alfresco.approx.indexing.time.remaining=Tiempo de indexaci\u00f3n restante aprox +solr.help.field.tracker.alfresco.lag=Los \u00edndices de Solr est\u00e1n actualizados en segundo plano. En este momento (en segundos), este \u00edndice de Solr se oculta tras las actualizaciones del repositorio. +solr.field.tracker.archive.active=Indexaci\u00f3n en curso +solr.field.tracker.archive.lag=Intervalos de indexaci\u00f3n (segundos) +solr.field.tracker.archive.last.indexed.txn=\u00daltima transacci\u00f3n indexada +solr.field.tracker.archive.approx.txns.remaining=Transacciones aprox. a indexar +solr.field.tracker.archive.approx.indexing.time.remaining=Tiempo de indexaci\u00f3n restante aprox + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Copia de seguridad de expresi\u00f3n Cron +solr.field.solr.backup.alfresco.remoteBackupLocation=Ubicaci\u00f3n de copia de seguridad +solr.field.solr.backup.alfresco.numberToKeep=Copias de seguridad a guardar +solr.help.solr.backup.alfresco.remoteBackupLocation=Ruta completa a la ubicaci\u00f3n en el sistema de ficheros de servidor Solr para almacenar la copia de seguridad del \u00edndice +solr.help.solr.backup.alfresco.numberToKeep=El n\u00famero de copias de seguridad a guardar (incluida la \u00faltima copia de seguridad) +solr.field.solr.backup.archive.cronExpression=Copia de seguridad de expresi\u00f3n Cron +solr.field.solr.backup.archive.remoteBackupLocation=Ubicaci\u00f3n de copia de seguridad +solr.field.solr.backup.archive.numberToKeep=Copias de seguridad a guardar +solr.help.solr.backup.archive.remoteBackupLocation=Ruta completa a la ubicaci\u00f3n en el sistema de ficheros de servidor Solr para almacenar la copia de seguridad del \u00edndice +solr.help.solr.backup.archive.numberToKeep=El n\u00famero de copias de seguridad a guardar (incluida la \u00faltima copia de seguridad) + +# searchmanager +searchmanager.field.sourceBeanName=Servicio de b\u00fasqueda + +## Tooltips +tooltip.path=Ruta: {0} +tooltip.site=Sitio: {0} + +## Create content +create-content.text=Texto plano... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Carpeta + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Elegir mes +calendar.widget_control_config.label_year=Introducir a\u00f1o +calendar.widget_control_config.label_invalid_year=Introduzca un a\u00f1o v\u00e1lido + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Enlace a: {0} +details.created-by=Creado {0} por {1} +details.created-in-site=Creado {0} en {1} +details.editing-started-by=Edici\u00f3n iniciada {0} por {1} +details.editing-started-in-site=Edici\u00f3n iniciada {0} en {1} +details.modified-by=Modificado {0} por {1} +details.modified-in-site=Modificado {0} en {1} +details.description.none=Sin descripci\u00f3n +details.tags.none=Sin etiquetas +details.categories.none=Sin categor\u00edas +details.user.deleted=''{0}'' (usuario eliminado) + +## Social Interactions +# Favourite +favourite.document.add.tip=A\u00f1adir documento a favoritos +favourite.document.add.label=Favorito +favourite.document.remove.tip=Eliminar documento de favoritos +favourite.folder.add.tip=A\u00f1adir carpeta a favoritos +favourite.folder.add.label=Favorito +favourite.folder.remove.tip=Quitar de la carpeta de favoritos +favourite.imap-site.add.tip=A\u00f1adir sitio a favoritos de IMAP +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Eliminar sitio de favoritos de IMAP +favourite.site.add.tip=A\u00f1adir sitio a favoritos +favourite.site.add.label=Favorito +favourite.site.remove.tip=Eliminar sitio de favoritos +favourite.message.failure=No se pudo guardar como favorito +# Like +like.document.add.tip=Me gusta este documento +like.document.add.label=Me gusta +like.document.remove.tip=Ya no me gusta +like.folder.add.tip=Me gusta esta carpeta +like.folder.add.label=Me gusta +like.folder.remove.tip=Ya no me gusta +like.site.add.tip=Me gusta este sitio +like.site.add.label=Me gusta +like.site.remove.tip=Ya no me gusta +like.message.failure=No se pudo guardar la preferencia +# Quickshare +quickshare.link.label=Enlace p\u00fablico +quickshare.link.tooltip=Pulse ctrl-c para copiar +quickshare.link.tooltip.mac=Pulse cmd-c para copiar +quickshare.view.label=Ver +quickshare.unshare.label=No compartir +quickshare.document.shared.label=Compartido +quickshare.document.shared.tip=Este documento es compartido (haga clic para ver m\u00e1s opciones) +quickshare.document.share.label=Compartir +quickshare.document.share.tip=Compartir documento +quickshare.document.share.failure=No se pudo compartir el documento +quickshare.document.unshared.label=Compartir +quickshare.document.unshared.tip=Compartir documento +quickshare.document.unshare.success=El documento ya no es compartido +quickshare.document.unshare.failure=No se pudo dejar de compartir el documento +quickshare.document.unshare.user.failure=No tiene los permisos adecuados para realizar la acci\u00f3n Dejar de compartir. +quickshare.linkshare.label=Compartir con +# LinkShare +linkshare.action.email.label=Compartir por correo electr\u00f3nico +linkshare.action.email.subject=Fichero compartido de Alfresco Content Services +linkshare.action.email.body=Fichero {1} compartido de Alfresco Content Services, v\u00e9alo aqu\u00ed: {0} +linkshare.action.facebook.label=Compartir usando Facebook +linkshare.action.facebook.message=Fichero {1} compartido de Alfresco Content Services +linkshare.action.twitter.label=Compartir usando Twitter +linkshare.action.twitter.message=Fichero {1} compartido de Alfresco Content Services +linkshare.action.google-plus.label=Compartir usando Google+ + + +# Comment +comment.document.tip=Comentario sobre este documento +comment.document.label=Comentario +comment.folder.tip=Comentario sobre esta carpeta +comment.folder.label=Comentario + +#Dashlets +dashlet.help.tooltip=Mostrar la ayuda de este dashlet +dashlet.rss.tooltip=Suscribirse al canal RSS de este dashlet +dashlet.edit.tooltip=Configurar este dashlet + +#Module Package Admin page +tool.module-package.label=Navegador de m\u00f3dulos +tool.module-package.description=Navegador de m\u00f3dulos + +# Category Manager Admin Console +tool.category-manager.label=Administrador de categor\u00edas +tool.category-manager.description=Administrador de categor\u00edas +tool.category-manager.edit-category=Editar categor\u00eda +tool.category-manager.edit-category.failure=No se puede editar el nombre. +tool.category-manager.add-category=A\u00f1adir categor\u00eda +tool.category-manager.add-category.failure=No se pudo a\u00f1adir la categor\u00eda. +tool.category-manager.label.category-name=Nombre de categor\u00eda: +tool.category-manager.delete-category=Eliminar categor\u00eda +tool.category-manager.delete-category.failure=No se pudo eliminar la categor\u00eda. +tool.category-manager.message.confirm.delete.title=Eliminar categor\u00eda +tool.category-manager.message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar: {0}? + +# Node browser +tool.node-browser.label=Navegador de nodos +tool.node-browser.description=Navegador de nodos + +# Label +label.folder=Carpeta +label.document=Documento +label.blogpost=Entrada del blog +label.forumpost=Tema del foro +label.calendarevent=Evento de calendario +label.wikipage=P\u00e1gina wiki +label.link=Enlazar +label.datalist=Lista de datos +label.datalistitem=Elemento de lista de datos +label.unknown=Desconocido +label.download=Descargar +label.viewinbrowser=Ver en el navegador +label.viewdetails=Ver los detalles +label.selectAll=Seleccionar todo +label.selectInvert=Invertir la selecci\u00f3n +label.selectNone=Ninguno +label.selectedItems=Elementos seleccionados +label.select=Seleccionar +label.restricted-settings=Alfresco Identity Service est\u00e1 activado, por lo tanto algunas de las configuraciones est\u00e1n restringidas. + +# Path +message.infolderpath=En carpeta + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Sincronizaci\u00f3n pendiente +sync.status.synced=Sincronizado {0}, por {1} +sync.status.last-attempt=\u00daltima sincronizaci\u00f3n correcta {0}, por {1} +sync.status.failed=Intento de sincronizaci\u00f3n {0}, por {1} +sync.status.last-failed=Error en la \u00faltima sincronizaci\u00f3n +sync.status.transient-error=Error de sincronizaci\u00f3n temporal +sync.status.transient-error.default-details=La sincronizaci\u00f3n continuar\u00e1 una vez que Alfresco Content Services pueda comunicarse de nuevo con la nube. +sync.status.copy.pending=Sincronizaci\u00f3n pendiente en {2} +sync.status.copy.synced={2} sincronizado {0}, por {1} +sync.status.copy.last-attempt={2} \u00faltima sincronizaci\u00f3n correcta {0}, por {1} +sync.status.copy.failed=intento de sincronizaci\u00f3n el {2} {0}, por {1} +sync.status.copy.last-failed=La \u00faltima sincronizaci\u00f3n de {2} ha fallado +sync.status.show-details=Ver detalles +sync.status.hide-details=Ocultar detalles +sync.status.title=Informaci\u00f3n de sincronizaci\u00f3n +sync.status.action.more=M\u00e1s informaci\u00f3n +sync.original-document=Documento original + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=No se puede mostrar el estado de la sincronizaci\u00f3n +sync.unable.get.details=No se pueden obtener los datos del nodo + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Quitar ''{0}'' de la nube. +sync.remove.folder.from.cloud=Quitar ''{0}'' y su contenido de la nube. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Ya existe contenido con el mismo nombre en la carpeta de destino. +sync.folder.not_found=No se puede encontrar la carpeta. +sync.node.already_synced=No se puede crear contenido: ya se ha sincronizado desde otra ubicaci\u00f3n. +sync.node.other_sync_set=Este contenido ya se ha sincronizado desde otra ubicaci\u00f3n. +sync.node.no_longer_exists=Este contenido ya no existe en Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=Este contenido ya no existe en Alfresco Content Services in the Cloud. Haga clic en Solicitar sincronizaci\u00f3n para volver a intentarlo. +sync.node.unknown=Se ha producido un error inesperado; vuelva a intentarlo. +sync.node.unknown.description=Se ha producido un error inesperado. Causa: {0}. +sync.node.access_denied=No se puede sincronizar contenido: no tiene permiso para acceder al fichero de destino. +sync.node.access_denied_source=No se puede sincronizar contenido: no tiene permiso para acceder al fichero de origen. +sync.node.content_limit_violation=Este fichero excede el l\u00edmite de contenido. El fichero es demasiado grande para que se realice la acci\u00f3n. +sync.node.quota_limit_violation=Ha excedido la cuota de contenido. No hay espacio libre suficiente para realizar la acci\u00f3n. +sync.node.authentication_error=No se puede sincronizar el contenido seleccionado con la nube: los detalles de autenticaci\u00f3n no son v\u00e1lidos. +sync.node.authentication_error.description=No se puede sincronizar el contenido seleccionado con la nube: los datos de autenticaci\u00f3n para el usuario {0} no son v\u00e1lidos. +sync.node.owner_not_found=No se pudo sincronizar el contenido porque el propietario ha sido borrado o eliminado. +sync.node.owner_not_found.description=El propietario de esta sincronizaci\u00f3n, {0}, ya no existe. Haga clic en Desincronizar. + +sync.communications.error=No se ha podido establecer la comunicaci\u00f3n con el sistema remoto +sync.communications.error.description=No se ha podido establecer la comunicaci\u00f3n con el sistema remoto. La sincronizaci\u00f3n funcionar\u00e1 autom\u00e1ticamente cuando funcionen las comunicaciones + +# Cloud Sync no network available for sync +sync.message.no.active.network=No existe ninguna red habilitada para la sincronizaci\u00f3n + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Nueva carpeta +sync.new-folder.in-the-cloud.header=Detalles de nueva carpeta +sync.new-folder.creation.success=Se ha creado la carpeta correctamente +sync.new-folder.creation.failure=No se ha podido crear la carpeta + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=ID de sincronizaci\u00f3n +hybridsync.ssd-failed-reason-header-label=Tipo de error de sincronizaci\u00f3n +hybridsync.path-desc-header-label=Ubicaci\u00f3n del elemento original +hybridsync.sync-creator-header-label=Creador de sincronizaci\u00f3n +hybridsync.cloud-user-header-label=Usuario de la nube +hybridsync.remote-tenant-id-header-label=Red de la nube +hybridsync.target-folder-node-ref-header-label=Destino de la nube +hybridsync.actions-header-label=Acciones + +#Hybrid workflow +hybridworkflow.destination-select.title=Seleccionar destino para documentos en la nube +hybridworkflow.set.destination=Destino y asignado +hybridworkflow.authority.single=Asignado a +hybridworkflow.authority.multiple=Revisores +hybridworkflow.review.approved=Aprobados +hybridworkflow.review.rejected=Rechazados +hybridworkflow.destination-select.folderPrefix=Documentos +hybridworkflow.destination.network=Red +hybridworkflow.destination.site=Sitio +hybridworkflow.destination.folder=Carpeta +hybridworkflow.destination.button=Seleccionar + +# Security +security.insecuremimetype=El tipo MIME para el contenido solicitado se considera un riesgo de seguridad y no se mostrar\u00e1. + +# Lightbox +lightbox.close=cerrar +lightbox.loading=cargando diff --git a/share/src/main/resources/alfresco/messages/slingshot_fr.properties b/share/src/main/resources/alfresco/messages/slingshot_fr.properties new file mode 100755 index 0000000000..7a321052d3 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_fr.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Saisir des termes de recherche... +# header menu items +header.advanced-search.label=Recherche avanc\u00e9e... +header.advanced-search.description=Recherche avanc\u00e9e... +header.application.label=Application +header.application.description=Application +header.change-password.label=Changer le mot de passe +header.change-password.description=Changer le mot de passe +header.groups.label=Groupes +header.groups.description=Groupes +header.tag-management.label=Gestionnaire de tags +header.tag-management.description=Gestionnaire de tags +header.help.label=Aide +header.help.description=Aide +header.logout.label=D\u00e9connexion +header.logout.description=D\u00e9connexion +header.more.label=Plus... +header.more.description=Plus... +header.my.label=Mon... +header.my.description=Mon... +header.my-content.label=Mon contenu +header.my-content.description=Mon contenu +header.my-dashboard.label=Mon tableau de bord +header.my-dashboard.description=Mon tableau de bord +header.my-profile.label=Mon profil +header.my-profile.description=Mon profil +header.my-sites.label=Mes sites +header.my-sites.description=Mes sites +header.my-tasks.label=Mes t\u00e2ches +header.my-tasks.description=Mes t\u00e2ches +header.my-workflows.label=Workflows que j'ai initi\u00e9s +header.my-workflows.description=Workflows que j'ai initi\u00e9s +header.people.label=Personnes +header.people.description=Personnes +header.replication-jobs.label=T\u00e2ches de r\u00e9plication +header.replication-jobs.description=T\u00e2ches de r\u00e9plication +header.repository.label=Entrep\u00f4t +header.repository.description=Entrep\u00f4t +header.trashcan.label=Corbeille +header.trashcan.description=Outils de suppression et de r\u00e9cup\u00e9ration de fichiers +header.saved-searches.label=Recherches enregistr\u00e9es +header.saved-searches.description=Recherches enregistr\u00e9es +header.search.description=Options de recherche... +header.sites.label=Sites +header.sites.description=Sites +header.submit-status.label=Partager +header.submit-status.description=Partager +header.tools.label=Outils admin... +header.tools.description=Outils administratifs... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Utilisateurs +header.users.description=Utilisateurs + +## Buttons +button.browse=Parcourir +button.edit=Modifier +button.save=Enregistrer +button.savechanges=Enregistrer les modifications +button.saveandclose=Enregistrer et fermer +button.upload=Importer +button.login=Connexion +button.delete=Supprimer +button.take-ownership=OK +button.download=T\u00e9l\u00e9charger +button.clear=Supprimer +button.reset=R\u00e9initialiser +button.search=Rechercher +button.update=Mettre \u00e0 jour +button.goback=Retour +button.done=Termin\u00e9 +button.undo=Annuler les modifications +button.new=Nouveau +button.create=Cr\u00e9er +button.rename=Renommer +button.refreshPage=Rafra\u00eechir la page +button.createanother=Cr\u00e9er, puis en cr\u00e9er une autre +button.view.simple=Vue simplifi\u00e9e +button.view.detailed=Vue d\u00e9taill\u00e9e +button.view.gallery=Affichage Galerie +button.view.filmstrip=Affichage Pellicule +button.view.table=Affichage Table +button.view.media-table=Affichage Media +button.view.email=Affichage e-mail +button.view.audio=Affichage Audio +button.view.dublinCore=Affichage Dublin Core +button.view.effectivity=Affichage Validit\u00e9 + +button.follow=Suivre +button.unfollow=Ne pas suivre +button.unsync=Supprimer la synchronisation + +## Messages +message.failure=Echec +message.failure.workflow=L''utilisateur {0} ne dispose pas des autorisations n\u00e9cessaires pour acc\u00e9der \u00e0 cette t\u00e2che. +message.loginfailure=Echec de la connexion +message.loginautherror=Vos informations d'authentification n'ont pas \u00e9t\u00e9 reconnues ou Alfresco Content Services n'est peut-\u00eatre pas disponible actuellement. +message.passwordchangeauthfailed=Informations incorrectes ou modification du mot de passe non autoris\u00e9e. +message.login-portal=Veuillez vous connecter via votre portail. +message.unsavedChanges.blog=Votre article comporte des modifications non enregistr\u00e9es. +message.unsavedChanges.comment=Votre commentaire n'est pas encore enregistr\u00e9. +message.unsavedChanges.discussion=Ce sujet de discussion comporte des modifications non enregistr\u00e9es. +message.unsavedChanges.reply=Votre r\u00e9ponse comporte des modifications non enregistr\u00e9es. +message.unsavedChanges.wiki=Cette page de wiki comporte des modifications non enregistr\u00e9es. +message.searching=Recherche... +message.searchingFor=Recherche de ''{0}''... +message.minimum-length=Saisir au moins {0} caract\u00e8re(s) +message.folders-trimmed=La liste a \u00e9t\u00e9 limit\u00e9e \u00e0 {0} entr\u00e9es +message.item-missing=L'\u00e9l\u00e9ment requis ne peut pas \u00eatre affich\u00e9 car il n'est plus disponible. +message.save.success=Vos modifications ont \u00e9t\u00e9 enregistr\u00e9es. +message.save.failure=Vos modifications n'ont pas pu \u00eatre enregistr\u00e9es. +message.cookiesfailure=Les cookies sont d\u00e9sactiv\u00e9s +message.cookieserror=Les cookies doivent \u00eatre activ\u00e9s dans votre navigateur. +message.siteRedirect.noPages.manager=Un gestionnaire de site a d\u00e9sactiv\u00e9 toutes les fonctionnalit\u00e9s de ce site.
Cliquez sur l'ic\u00f4ne Param\u00e8tres   et s\u00e9lectionnez Personnaliser le site pour ajouter une ou plusieurs fonctionnalit\u00e9s au site. +message.siteRedirect.noPages.user=Un gestionnaire de site a d\u00e9sactiv\u00e9 toutes les fonctionnalit\u00e9s de ce site.
Trouvez parmi les membres du site un gestionnaire de site qui peut ajouter des fonctionnalit\u00e9s au site. +message.logged-out=Vous \u00eates d\u00e9connect\u00e9. +message.timeout=Expiration du d\u00e9lai de connexion au serveur. Traitement de la demande trop long. Veuillez r\u00e9essayer ult\u00e9rieurement. +message.loading=Chargement... +message.viewInCloud.failure=Impossible de r\u00e9cup\u00e9rer l'URL. V\u00e9rification du statut de la synchronisation. +message.logged-out=Vous \u00eates d\u00e9connect\u00e9. + +## Common Text labels and CM model metadata +label.tags=Tags +label.none=(Aucun) +label.empty=(Vide) +label.about=\u00c0 propos +label.username=Nom d'utilisateur +label.password=Mot de passe +label.copyright=© 2005-2023 Alfresco Software Inc. Tous droits r\u00e9serv\u00e9s. +label.name=Nom +label.id=ID +label.title=Titre +label.description=Description +label.version=Version +label.firstname=Pr\u00e9nom +label.lastname=Nom +label.jobtitle=Intitul\u00e9 du poste +label.location=Emplacement +label.bio=R\u00e9sum\u00e9 +label.photo=Photo +label.contactinfo=Informations de contact +label.skype=Skype +label.im=Messagerie instantan\u00e9e +label.googleusername=Nom d'utilisateur Google +label.company=Soci\u00e9t\u00e9 +label.companyinfo=D\u00e9tails de la soci\u00e9t\u00e9 +label.companyname=Nom +label.companyaddress=Adresse +label.companytelephone=T\u00e9l\u00e9phone +label.companyfax=T\u00e9l\u00e9copie +label.companyemail=E-mail +label.companypostcode=Code postal +label.email=E-mail +label.telephone=T\u00e9l\u00e9phone +label.mobile=T\u00e9l\u00e9phone mobile +label.fax=T\u00e9l\u00e9copie +label.address=Adresse +label.postcode=Code postal +label.groups=Groupes +label.yes=Oui +label.no=Non +label.ok=OK +label.loading=Chargement... +label.validating=Validation... +label.validationError=Impossible de valider les identifiants. +label.site=Site +label.path=Chemin +label.type=Type +label.creator=Cr\u00e9ateur +label.created=Cr\u00e9\u00e9 +label.modifier=Modificateur +label.modified=Modifi\u00e9 +label.author=Auteur +label.priority=Priorit\u00e9 {0} +label.size=Taille +label.mimetype=Type MIME +label.mimetype.unknown=Inconnu +label.popularity=Popularit\u00e9 +label.avatar=Avatar +label.editType=Modifier\u00a0: {0} +label.moreInfo=Plus d'infos > +label.actions.column.header=Actions +# Dictionary Model +label.modelActive=est actif +label.modelName=Nom du mod\u00e8le +label.modelDescription=Description du mod\u00e8le +# Transfer Targets +label.trx_enabled=est activ\u00e9 +label.trx_endpointhost=Transfert \u00e0 l'h\u00f4te de destination +label.trx_endpointport=Port +label.you=vous +label.licensedTo=Licence de\u00a0: + +## Location +location.tooltip.path=Chemin\u00a0: {0} +location.tooltip.site=Site\u00a0: {0} +location.path.repository=Entrep\u00f4t +location.path.documents=Documents +location.path.userHome=Mon espace de travail +location.path.myfiles=Mes fichiers +location.path.shared=Fichiers partag\u00e9s +location.label.none=(Aucun) +location.label.local={0} +location.label.site={0} dans {1} +location.label.repository={0} + +## EXIF +label.exif.width=Largeur +label.exif.height=Hauteur + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} sur {totalRecords} +pagination.template.page-report.more=Affichage des \u00e9l\u00e9ments {startRecord} - {endRecord} sur {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} sur {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Th\u00e8me clair +theme.default=Th\u00e8me Bleu +theme.greenTheme=Th\u00e8me Vert +theme.hcBlack=Th\u00e8me Contraste \u00e9lev\u00e9 +theme.yellowTheme=Th\u00e8me Jaune +theme.gdocs=Th\u00e8me Google Docs + +## Admin console tools +tool.users.label=Utilisateurs +tool.users.description=Gestion des utilisateurs +tool.groups.label=Groupes +tool.groups.description=Gestion des groupes +tool.application.label=Application +tool.application.description=Configurations et Gestion de l'application +tool.replication-jobs.label=T\u00e2ches de r\u00e9plication +tool.replication-jobs.description=Gestion des t\u00e2ches de r\u00e9plication +tool.repository.label=Outils d'entrep\u00f4t +tool.repository.description=Outils d'entrep\u00f4t +tool.tag-management.label=Gestionnaire de tags +tool.tag-management.description=Gestionnaire de tags +tool.workflow.label=Workflow +tool.workflow.description=Outils de workflow +tool.trashcan.label=Corbeille +tool.trashcan.description=Outils de suppression et de r\u00e9cup\u00e9ration de fichiers +tool.email-inbound.label=E-mail (entrant) +tool.email-inbound.description=E-mail (entrant) +tool.email-outbound.label=E-mail (sortant) +tool.email-outbound.description=E-mail (sortant) +tool.email-imap.label=E-mail (IMAP) +tool.email-imap.description=E-mail (IMAP) +tool.runtime.label=Java Runtime +tool.runtime.description=Java Runtime +tool.repository-server.label=Descripteur d'entrep\u00f4t (actuel) +tool.repository-server.description=Descripteur d'entrep\u00f4t (actuel) +tool.repository-installed.label=Descripteur d'entrep\u00f4t (initialement install\u00e9) +tool.repository-installed.description=Descripteur d'entrep\u00f4t (initialement install\u00e9) +tool.authority.label=Autorit\u00e9s +tool.authority.description=Autorit\u00e9s +tool.license.label=Descripteur de licence +tool.license.description=Descripteur de licence +tool.license.link=G\u00e9rer Mon abonnement +tool.license.usageinfo.label=Informations d'utilisation de licence +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=Syst\u00e8me OpenOffice +tool.openoffice-subsystem.description=Syst\u00e8me OpenOffice +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Convertisseur pdf2swf +tool.transformer-pdf2swf.description=Convertisseur pdf2swf +tool.transformer-imagemagick.label=Convertisseur ImageMagick +tool.transformer-imagemagick.description=Convertisseur ImageMagick +tool.fileservers.label=Serveurs de fichiers +tool.fileservers.description=Serveurs de fichiers +tool.subscriptions.label=Abonnements +tool.subscriptions.description=Abonnements +tool.sysadmin.label=Administration syst\u00e8me +tool.sysadmin.description=Administration syst\u00e8me +tool.activities.label=Flux d'activit\u00e9s +tool.activities.description=Flux d'activit\u00e9s +tool.workflow.label=Workflow +tool.workflow.description=Workflow +tool.manage-sites.label=Gestionnaire de sites +tool.manage-sites.description=Gestionnaire de sites +tool.cloud-sync-management.label=Gestionnaire de synchronisation cloud +tool.cloud-sync-management.description=Gestionnaire de synchronisation cloud +tool.search-manager.label=Gestionnaire de recherche +tool.search-manager.description=Gestionnaire de recherche + +## Admin console tool groups +tool.group.usersgroups=Utilisateurs et groupes +tool.group.email=E-mail +tool.group.transformations=Transformations +tool.group.filemanagement=Gestion de fichier +tool.group.subscriptions=Abonnements +tool.group.repository=Entrep\u00f4t +tool.group.search=Rechercher +tool.group.site=Sites + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Accepter l'invitation +page.acceptInvite.description=Page d'acceptation de l'invitation. Acc\u00e9der \u00e0 cette page va lancer le processus d'acceptation de l'invitation et activer le compte d'utilisateur +page.addGroups.title=Ajouter les groupes +page.addGroups.description=Ajouter les groupes +page.add-users.title=Ajouter des utilisateurs +page.add-users.description=Ajouter des utilisateurs \u00e0 un site +page.adminConsole.title=Outils admin +page.adminConsole.description=Console de gestion et d'administration +page.advsearch.title=Recherche avanc\u00e9e +page.advsearch.description=Ecran de recherche avanc\u00e9e +page.blogCreateEdit.title=Blog\u00a0: cr\u00e9er ou modifier un article +page.blogCreateEdit.description=Affiche un formulaire pour cr\u00e9er ou modifier un article +page.blogPostList.title=Blog +page.blogPostList.description=Affiche les articles du blog +page.blogPostView.title=Blog\u00a0: afficher les d\u00e9tails de l'article +page.blogPostView.description=Affiche la vue d\u00e9taill\u00e9e de l'article +page.calendar.title=Calendrier +page.calendar.description=Composant calendrier du site +page.changePassword.title=Changer le mot de passe utilisateur +page.changePassword.description=Section Changer le mot de passe sur la page de profil utilisateur +page.contentViewer.title=Visualisation du contenu +page.contentViewer.description=Page de visualisation du contenu pour une r\u00e9f\u00e9rence de n\u0153ud +page.createContent.title=Cr\u00e9er un contenu +page.createContent.description=Cr\u00e9er un contenu texte +page.createEditReplicationJob.title=T\u00e2che de r\u00e9plication +page.createEditReplicationJob.description=Cr\u00e9er ou modifier une t\u00e2che de r\u00e9plication existante +page.customiseSite.title=Personnaliser le site +page.customiseSite.description=Ajouter et supprimer les pages d'un site +page.customiseSiteDashboard.title=Personnaliser le tableau de bord du site +page.customiseSiteDashboard.description=Personnaliser la disposition et les dashlets d'un tableau de bord de site +page.customiseUserDashboard.title=Configurer le tableau de bord utilisateur +page.customiseUserDashboard.description=Personnaliser la disposition et les dashlets d'un tableau de bord utilisateur +page.data-lists.title=Listes de donn\u00e9es +page.data-lists.description=Page des listes de donn\u00e9es +page.discussionsCreateTopic.title=Discussions\u00a0: afficher la page de cr\u00e9ation d'une discussion +page.discussionsCreateTopic.description=Affiche le formulaire de cr\u00e9ation d'une discussion +page.discussionsTopicList.title=Discussions +page.discussionsTopicList.description=Affiche les sujets du forum +page.discussionsTopicView.title=Discussions\u00a0: afficher les d\u00e9tails d'un sujet +page.discussionsTopicView.description=Affiche les d\u00e9tails d'une discussion +page.documentDetails.title=D\u00e9tails du document +page.documentDetails.description=D\u00e9tails du document +page.documentLibrary.title=Espace documentaire +page.documentLibrary.description=Espace documentaire avec arbre de navigation +page.editMetadata.title=Editer les propri\u00e9t\u00e9s +page.editMetadata.description=Modifier les propri\u00e9t\u00e9s d'un n\u0153ud +page.folderDetails.title=D\u00e9tails du dossier +page.folderDetails.description=D\u00e9tails du dossier +page.folderRules.title=R\u00e8gles de dossier +page.folderRules.description=R\u00e8gles de dossier +page.geographicMap.title=Affichage Google Maps +page.geographicMap.description=Afficher la photo d'un emplacement g\u00e9ographique dans Google Maps +page.inlineEdit.title=Modifier dans Alfresco Share +page.inlineEdit.description=Modifier des fichiers texte dans Alfresco Share +page.invite.title=Inviter +page.invite.description=Inviter +page.links.title=Liens +page.links.description=Liens +page.linkCreateEdit.title=Liens\u00a0: cr\u00e9er ou modifier un lien +page.linkCreateEdit.description=Affiche un formulaire de cr\u00e9ation ou de modification d'un lien +page.linksView.title=Liens\u00a0: afficher les d\u00e9tails d'un lien +page.linksView.description=Affiche la vue d\u00e9taill\u00e9e d'un lien +page.login.title=Connexion +page.logout.title=D\u00e9connexion +page.managePermissions.title=G\u00e9rer les autorisations +page.managePermissions.description=G\u00e9rer les autorisations +page.myFiles.title=Mes fichiers +page.myFiles.description=Parcourir mes fichiers +page.myDocumentLibraries.title=Mes biblioth\u00e8ques de documents +page.myDocumentLibraries.description=Page de lancement Mes biblioth\u00e8ques de documents +page.myTasks.title=Mes t\u00e2ches +page.myTasks.description=Liste des t\u00e2ches actives et achev\u00e9es. +page.myWorkflows.title=Workflows que j'ai initi\u00e9s +page.myWorkflows.description=Page Workflows que j'ai initi\u00e9s +page.pendingInvites.title=En attente +page.pendingInvites.description=Invitations en attente et demandes pour rejoindre un site +page.peopleFinder.title=Recherche de personnes +page.peopleFinder.description=Page de recherche de personnes +page.profile.title=Page Profil de l'utilisateur +page.profile.description=Page de profil utilisateur +page.rejectInvite.title=Rejeter l'invitation +page.rejectInvite.description=Page de rejet de l'invitation. Rejette une invitation +page.repository.title=Navigateur d'entrep\u00f4t +page.repository.description=Naviguer dans l'ensemble de l'entrep\u00f4t +page.ruleEdit.title=R\u00e8gles de dossier +page.ruleEdit.description=Cr\u00e9er ou Modifier une r\u00e8gle pour un dossier. +page.search.title=Rechercher +page.search.description=Vue de recherche +page.sharedFiles.title=Fichiers partag\u00e9s +page.sharedFiles.description=Parcourir les fichiers partag\u00e9s +page.siteConsole.title=Gestionnaire de sites +page.siteConsole.description=Page Gestionnaire de sites - outils d'administration de sites +page.siteFinder.title=Recherche de sites +page.siteFinder.description=Page de recherche de sites +page.siteIndex.title=Bienvenue +page.siteIndex.description=Page de d\u00e9marrage pour les utilisateurs - Va cr\u00e9er le tableau de bord du site utilisateur et l'y rediriger +page.siteGroups.title=Groupes du site +page.siteGroups.description=Groupes du site +page.siteMembers.title=Membres du site +page.siteMembers.description=Membres du site +page.startWorkflow.title=D\u00e9marrer un workflow +page.startWorkflow.description=D\u00e9marrer un nouveau workflow +page.taskDetails.title=D\u00e9tails de la t\u00e2che +page.taskDetails.description=Page d'affichage des informations d\u00e9taill\u00e9es sur la t\u00e2che +page.taskEdit.title=Modifier la t\u00e2che +page.taskEdit.description=Page de modification des d\u00e9tails de la t\u00e2che +page.userContent.title=Contenu modifi\u00e9 par l'utilisateur +page.userContent.description=Liste le contenu derni\u00e8rement modifi\u00e9 par un utilisateur +page.userFollowers.title=Suiveurs +page.userFollowers.description=Liste les personnes qui suivent l'utilisateur +page.userFollowing.title=Suit +page.userFollowing.description=Liste les personnes suivies par l'utilisateur +page.userNotifications.title=Param\u00e8tres de notification de l'utilisateur +page.userNotifications.description=Section de modification des param\u00e8tres de notification de la page de profil utilisateur +page.userCloudAuth.title=Authentification de l'utilisateur cloud +page.userCloudAuth.description=Modifier les informations d'authentification au cloud +page.userSites.title=Listes des sites de l'utilisateur +page.userSites.description=Liste les sites dont l'utilisateur est membre +page.userTrashcan.title=Corbeille de l'utilisateur +page.userTrashcan.description=Liste des documents et des dossiers supprim\u00e9s de l'utilisateur actuel +page.wiki.title=Wiki +page.wiki.description=Page de d\u00e9marrage du wiki +page.wikiCreate.title=Formulaire de cr\u00e9ation de wiki +page.wikiCreate.description=Affiche un formulaire de cr\u00e9ation d'une nouvelle page de wiki +page.wikiPage.title=Wiki +page.wikiPage.description=Affiche une page de wiki +page.workspace.title=Tableau de bord d'un espace de travail documentaire +page.workspace.description=Page de tableau de bord d'un espace de travail documentaire +page.workflowDetails.title=D\u00e9tails du workflow +page.workflowDetails.description=Page D\u00e9tails du workflow + +## Dashboard page titles and descriptions +page.siteDashboard.title=Tableau de bord du site +page.siteDashboard.description=Page du tableau de bord de site collaboratif +page.userDashboard.title=Tableau de bord utilisateur +page.userDashboard.description=Page de tableau de bord utilisateur +page.meeting_workspace.title=Tableau de bord d'un espace de travail de r\u00e9union +page.meeting_workspace.description=Page du tableau de bord d'un espace de travail de r\u00e9union + +page.error.500.title=Erreur syst\u00e8me Alfresco Share +page.error.500.header=Un probl\u00e8me est survenu sur cette page... +page.error.500.detail=

Une erreur est survenue ou un \u00e9l\u00e9ment a \u00e9t\u00e9 supprim\u00e9\u00a0; v\u00e9rifiez que l'URL est correcte.

Il se peut \u00e9galement que vous n'ayez pas les autorisations pour afficher la page (elle peut faire partie d'un site priv\u00e9) ou qu'une erreur interne soit survenue. V\u00e9rifiez aupr\u00e8s de votre service informatique.

Si vous tentez d'acc\u00e9der \u00e0 votre page d'accueil et qu'elle n'est plus accessible, modifiez-la en cliquant sur votre nom dans la barre d'outils.

+page.error.500.nav.dashboard=Retour \u00e0 mon tableau de bord +page.error.500.footer=Alfresco Software Inc. © 2005-2023 Tous droits r\u00e9serv\u00e9s. + +## Title bar component titles for pages that use the simple-title component +title.repository=Entrep\u00f4t +title.browser=Navigateur +title.siteFinder=Recherche de sites +title.peopleFinder=Recherche de personnes +title.myTasks=Mes t\u00e2ches + +## Site Visibility +site.visibility.label.PUBLIC=Public +site.visibility.label.MODERATED=Mod\u00e9r\u00e9 +site.visibility.label.PRIVATE=Priv\u00e9 +site.visibility.description.PUBLIC=Tous les collaborateurs de votre entreprise peuvent acc\u00e9der \u00e0 ce site. +site.visibility.description.MODERATED=Tous les collaborateurs de votre entreprise peuvent trouver ce site et demander \u00e0 y acc\u00e9der. L'acc\u00e8s est accord\u00e9 par les gestionnaires de site. +site.visibility.description.PRIVATE=Seules les personnes ajout\u00e9es par un coordinateur de site peuvent trouver et utiliser ce site. + +## Roles +role.SiteManager=Gestionnaire +role.SiteManager.description=dispose des droits d'acc\u00e8s \u00e0 l'ensemble du contenu du site, qu'il a lui-m\u00eame cr\u00e9\u00e9 ou cr\u00e9\u00e9 par d'autres membres du site. +role.Collaborator=Collaborateur +role.Collaborator.description=dispose des droits d'acc\u00e8s au contenu dont il est propri\u00e9taire\u00a0; il peut modifier mais pas supprimer le contenu cr\u00e9\u00e9 par d'autres membres. +role.SiteCollaborator=Collaborateur +role.SiteCollaborator.description=dispose des droits d'acc\u00e8s au contenu du site dont il est propri\u00e9taire\u00a0; il peut modifier mais pas supprimer le contenu cr\u00e9\u00e9 par d'autres membres du site. +role.Contributor=Contributeur +role.Contributor.description=dispose des droits d'acc\u00e8s au contenu dont il est propri\u00e9taire\u00a0; il ne peut ni modifier ni supprimer le contenu cr\u00e9\u00e9 par d'autres membres. +role.SiteContributor=Contributeur +role.SiteContributor.description=dispose des droits d'acc\u00e8s au contenu du site dont il est propri\u00e9taire\u00a0; il ne peut ni modifier ni supprimer le contenu cr\u00e9\u00e9 par d'autres membres du site. +role.Consumer=Lecteur +role.Consumer.description=dispose de droits d'acc\u00e8s en lecture uniquement\u00a0; il ne peut pas cr\u00e9er son propre contenu. +role.SiteConsumer=Lecteur +role.SiteConsumer.description=dispose de droits d'acc\u00e8s \u00e0 un site en lecture uniquement\u00a0; il ne peut pas cr\u00e9er son propre contenu. +role.Coordinator=Coordinateur +role.Coordinator.description=dispose des droits d'acc\u00e8s \u00e0 l'ensemble du contenu, qu'il a lui-m\u00eame cr\u00e9\u00e9 ou cr\u00e9\u00e9 par d'autres membres. +role.Editor=Editeur +role.Editor.description=peut modifier les propri\u00e9t\u00e9s des fichiers et r\u00e9server\u00a0/ lib\u00e9rer des fichiers\u00a0; il ne peut pas cr\u00e9er son propre contenu. + +roles.readassociations=Lecteur + +roles-tooltip.header=A propos des r\u00f4les +roles-tooltip.docs-url-label=En savoir plus +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Tags +taglibrary.populartagslink=Choisir parmi les tags populaires de ce site +taglibrary.msg.failedLoadTags=Echec du chargement des tags depuis le serveur (connexion coup\u00e9e ?) +taglibrary.msg.unableLoadTags=Echec du chargement des tags\u00a0: {0} +taglibrary.tip.removeTag=Supprimer le tag +taglibrary.tip.help=S\u00e9parer chaque tag avec un espace. Joindre deux mots ou plus \u00e0 l'aide de "guillemets" + +## YUI Editor keys +yuieditor.toolbar.group.font=Style de caract\u00e8re +yuieditor.toolbar.group.lists=Listes +yuieditor.toolbar.group.link=Lien +yuieditor.toolbar.item.createorderedlist=Cr\u00e9er une liste ordonn\u00e9e +yuieditor.toolbar.item.createunorderedlist=Cr\u00e9er une liste non-ordonn\u00e9e +yuieditor.toolbar.item.fontcolor=Couleur du texte +yuieditor.toolbar.item.backgroundcolor=Couleur de fond +yuieditor.toolbar.item.bold=Gras CTRL + SHIFT + B +yuieditor.toolbar.item.italic=Italique CTRL + SHIFT + I +yuieditor.toolbar.item.underline=Soulign\u00e9 CTRL + SHIFT + U +yuieditor.toolbar.item.link=Lien HTML CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=S\u00e9lectionner +menu.select.all=Tout +menu.select.none=Aucun +menu.select.invert=Inverser la s\u00e9lection +menu.select.folders=Dossiers +menu.select.documents=Documents + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Cr\u00e9er un document \u00e0 partir d'un mod\u00e8le +menu.create-content.by-template-folder=Cr\u00e9er un dossier \u00e0 partir d'un mod\u00e8le +menu.selected-items=El\u00e9ments s\u00e9lectionn\u00e9s... +menu.selected-items.copy=Copier vers... +menu.selected-items.move=D\u00e9placer vers... +menu.selected-items.delete=Supprimer +menu.selected-items.download=T\u00e9l\u00e9charger sous forme de zip +menu.selected-items.assign-workflow=D\u00e9marrer un workflow... +menu.selected-items.manage-permissions=G\u00e9rer les autorisations... +menu.selected-items.deselect-all=D\u00e9s\u00e9lectionner tout +menu.selected-items.cloudSync=Synchronisation avec le cloud +menu.selected-items.cloudUnsync=D\u00e9synchronisation du cloud +menu.selected-items.cloudRequestSync=Demander la synchronisation + +## Document Library Actions +actions.document.assign-workflow=D\u00e9marrer un workflow +actions.document.cancel-editing=Annuler l'\u00e9dition +actions.document.cancel-editing-unlock=D\u00e9verrouiller le document +actions.document.change-type=Changer le type +actions.document.copy-to=Copier vers... +actions.document.delete=Supprimer le document +actions.document.download=T\u00e9l\u00e9charger +actions.document.download-again=T\u00e9l\u00e9charger +actions.document.download-original=T\u00e9l\u00e9charger l'original +actions.document.edit-metadata=Editer les propri\u00e9t\u00e9s +actions.document.edit-offline=Editer hors-ligne +actions.document.edit-online=Modifier dans Microsoft Office\u2122 +message.edit-online.supported_office_version_required=Vous utilisez une version de Microsoft Office qui n'est pas prise en charge. Essayez de mettre \u00e0 jour Microsoft Office. Office\u00a02007 et\u00a02008 ne fonctionnent pas avec Google Chrome. +actions.document.extract-metadata=Extraire les m\u00e9tadonn\u00e9es +actions.document.execute-script=Ex\u00e9cuter le script +actions.document.inline-edit=Modifier dans Alfresco Share +actions.document.increment-counter=Incr\u00e9menter le compteur +actions.document.locate=Situer le fichier +actions.document.manage-aspects=G\u00e9rer les aspects +actions.document.manage-permissions=G\u00e9rer les autorisations +actions.document.take-ownership=Devenir propri\u00e9taire +actions.document.move-to=D\u00e9placer vers... +actions.document.simple-approve=Approuver +actions.document.simple-reject=Rejeter +actions.document.upload-new-version=Importer une nouvelle version +actions.document.view=Voir dans le navigateur +actions.document.view-google-map=Voir dans Google Maps +actions.document.view-original=Voir le document original +actions.document.view-source-repository=Voir dans l'entrep\u00f4t d'origine +actions.document.view-working-copy=Voir la copie de travail +actions.document.publish=Publier +actions.document.transform=Transformer +actions.document.transform-image=Transformer en image +actions.document.publish-content=Publier le contenu +actions.document.cloud-sync=Synchronisation avec le cloud +actions.document.cloud-unsync=Se d\u00e9synchroniser du cloud +actions.document.view-in-cloud=Afficher dans le cloud +actions.document.request-sync=Demander la synchronisation +actions.document.unzip-to=D\u00e9compresser dans... +actions.folder.download=T\u00e9l\u00e9charger sous forme de zip +actions.folder.change-type=Changer le type +actions.folder.copy-to=Copier vers... +actions.folder.delete=Supprimer le Dossier +actions.folder.edit-metadata=Editer les propri\u00e9t\u00e9s +actions.folder.locate=Situer le dossier +actions.folder.manage-aspects=G\u00e9rer les aspects +actions.folder.manage-permissions=G\u00e9rer les autorisations +actions.folder.take-ownership=Devenir propri\u00e9taire +actions.folder.move-to=D\u00e9placer vers... +actions.folder.rules=G\u00e9rer les r\u00e8gles +actions.folder.simple-approve=Approuver +actions.folder.simple-reject=Rejeter +actions.folder.view-details=Afficher les d\u00e9tails +actions.folder.view-source-repository=Voir dans l'entrep\u00f4t d'origine +actions.folder.cloud-sync=Synchronisation avec le cloud +actions.folder.cloud-unsync=Se d\u00e9synchroniser du cloud +actions.folder.view-in-cloud=Afficher dans le cloud +actions.link.delete=Supprimer le lien +actions.link.locate=Situer l'\u00e9l\u00e9ment li\u00e9 +actions.editOnline.failure=Le fichier ''{0}'' ne peut \u00eatre ouvert pour l''\u00e9dition en ligne. Un des plugins suivants doit \u00eatre install\u00e9 dans votre navigateur. \n Pour Windows\u00a0: Microsoft Office 2010 \n Pour Mac OS X\u00a0: Plug-in du navigateur dans SharePoint +actions.editOnline.invalid=Impossible de modifier le fichier ''{0}'' en ligne car son chemin d''acc\u00e8s contient des caract\u00e8res qui ne sont pas autoris\u00e9s par le protocole SPP.\nLes caract\u00e8res non valides sont les suivants\u00a0: ~ '' # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' est synchronis\u00e9\u00a0; cette suppression entra\u00eene le retrait du document de son emplacement local et du cloud. +actions.synced.folder.delete=
''{0}'' est synchronis\u00e9\u00a0; cette suppression a pour effet d''\u00e9liminer ce dossier et son contenu de son emplacement local et du cloud. +actions.synced.remove-sync=
Si l'objet doit rester dans le cloud, ex\u00e9cutez l'action ''Supprimer la synchronisation''. +actions.synced.cloud.document.delete=
''{0}'' est synchronis\u00e9, cette suppression a pour effet d''\u00e9liminer le document de son emplacement local uniquement. +actions.synced.cloud.folder.delete=
''{0}'' est synchronis\u00e9, cette suppression a pour effet d''\u00e9liminer ce dossier et son contenu de son emplacement local uniquement. +actions.synced.cloud.document.delete.on.prem=
''{0}'' est synchronis\u00e9, cette suppression a pour effet d''\u00e9liminer le document de son emplacement local et sur site. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' est synchronis\u00e9, cette suppression a pour effet d''\u00e9liminer le dossier et son contenu de son emplacement local et sur site. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=Impossible de situer l'\u00e9l\u00e9ment li\u00e9\u00a0: la cible a \u00e9t\u00e9 supprim\u00e9e. +message.change-type.success=Le type de document ''{0}'' a \u00e9t\u00e9 modifi\u00e9 avec succ\u00e8s +message.change-type.failure=Impossible de modifier le type de document ''{0}'' +message.confirm.delete=Etes-vous s\u00fbr de vouloir supprimer ''{0}'' ? +message.delete.success=''{0}'' a \u00e9t\u00e9 supprim\u00e9 +message.delete.failure=Impossible de supprimer ''{0}'' +message.multiple-delete.please-wait=Veuillez patienter. Suppression des fichiers en cours... +message.confirm.take-ownership.title=Devenir propri\u00e9taire\u00a0 ? +message.confirm.take-ownership=Vous deviendrez propri\u00e9taire de ''{0}'' et les autorisations du propri\u00e9taire pr\u00e9c\u00e9dent sont susceptibles d''\u00eatre restreintes. +message.take-ownership.success=Vous \u00eates d\u00e9sormais propri\u00e9taire de ''{0}'' +message.take-ownership.failure=Vous ne pouvez pas vous approprier ''{0}'' +message.details.success=Succ\u00e8s de la mise \u00e0 jour des d\u00e9tails +message.details.failure=Echec de la mise \u00e0 jour des d\u00e9tails +message.details.failure.name=Impossible de renommer l'\u00e9l\u00e9ment. Un autre \u00e9l\u00e9ment portant ce nom existe d\u00e9j\u00e0. +message.details.failure.more.max.length=La taille de l'une des propri\u00e9t\u00e9s est sup\u00e9rieure \u00e0 la valeur max. +message.sync.success=La synchronisation a \u00e9t\u00e9 effectu\u00e9e +message.sync.failure=Impossible d'effectuer la synchronisation +message.sync.unavailable=Impossible de se connecter au serveur de synchronisation. +message.unsync.confirm=Etes-vous s\u00fbr de vouloir d\u00e9synchroniser ''{0}''\u00a0? +message.unsync.success=La synchronisation a \u00e9t\u00e9 supprim\u00e9e +message.unsync.failure=Impossible de supprimer la synchronisation +message.request.sync.success=Succ\u00e8s de la demande de synchronisation +message.request.sync.failure=Demande de synchronisation impossible +message.error=Echec de l'acc\u00e8s \u00e0 l'espace documentaire +message.empty=Aucun \u00e9l\u00e9ment +message.empty.subfolders=Aucun \u00e9l\u00e9ment. Cliquer sur ''{0}'' pour voir {1} sous-dossier(s) ici. +message.empty.subfolders.link=Afficher les dossiers +message.edit-offline.failure=Vous ne pouvez pas modifier ''{0}''. +message.edit-offline.success=''{0}'' peut maintenant \u00eatre modifi\u00e9 +message.edit-offline.success.ie7=T\u00e9l\u00e9charger le document en cliquant sur le bouton ci-dessous. +message.edit-online.office.failure=Impossible de d\u00e9marrer MS Office. +message.edit-online.office.path.failure=Modifier en ligne n'est pas disponible car l'URL comporte plus de 260 caract\u00e8res. Utiliser un chemin peu profond pour r\u00e9duire la longueur. +message.edit-online-aos.no_supported_environment=Cette fonctionnalit\u00e9 est disponible uniquement sous Windows ou Mac OS X. +message.edit-online-aos.starting_office_failed=Impossible d'ouvrir Microsoft Office. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office bloqu\u00e9 +message.edit-online-aos.plugin_blocked.body.firefox=Cliquez sur la barre d'outils de Firefox pour continuer. +message.edit-online-aos.plugin_blocked.body.chrome=Cliquez sur l'indicateur bloqu\u00e9 dans la barre d'adresses de Chrome pour continuer. +message.edit-online-aos.plugin_blocked.body.safari=Cliquez sur Faire confiance pour continuer. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=Vous utilisez une version de Microsoft Office qui n'est pas prise en charge. Essayez de mettre \u00e0 jour Microsoft Office. +message.edit-online-aos.edit_offline_locked.title={0} modifie actuellement ce fichier +message.edit-online-aos.edit_offline_locked.message=Toutes vos modifications \u00e9ventuelles risquent d'\u00eatre perdues. +message.edit-online-aos.edit_offline_locked.confirm=Continuer +message.edit-online-aos.edit_offline_locked.cancel=Annuler +message.edit-online-aos.edit_locked.title={0} modifie actuellement ce fichier +message.edit-online-aos.edit_locked.message=Le document est actuellement verrouill\u00e9. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=Impossible de d\u00e9verrouiller ''{0}''. +message.edit-cancel.failure=Impossible d''annuler la modification de ''{0}''. +message.edit-cancel.success=La modification de ''{0}'' a \u00e9t\u00e9 annul\u00e9e. +message.unlock-document.success=La modification de ''{0}'' a \u00e9t\u00e9 d\u00e9verrouill\u00e9e. +message.file-dnd-move.failure=Impossible de d\u00e9placer le document. +message.increment-counter.success=Compteur incr\u00e9ment\u00e9 +message.increment-counter.failure=Impossible d'incr\u00e9menter le compteur. +message.extract-metadata.success=Succ\u00e8s de l'extraction des m\u00e9tadonn\u00e9es. +message.extract-metadata.failure=Impossible d'extraire les m\u00e9tadonn\u00e9es. +message.execute-script.success=Succ\u00e8s de l'ex\u00e9cution du script +message.execute-script.failure=Impossible d'ex\u00e9cuter le script +message.insitu-edit.name.failure=Impossible de renommer le fichier. Il se peut qu'un autre fichier portant ce nom existe d\u00e9j\u00e0. +message.loading=Chargement de l'espace documentaire... +message.simple-workflow.failure=Echec de l'action du workflow. +message.simple-workflow.approved=\u00c9l\u00e9ment marqu\u00e9 comme approuv\u00e9 +message.simple-workflow.rejected=El\u00e9ment marqu\u00e9 comme rejet\u00e9 +message.simple-workflow.failed=Echec de l'action du workflow. +message.transform.success=Succ\u00e8s de la transformation du document ''{0}'' +message.transform.failure=Impossible de transformer le document +message.transform-image.success=Succ\u00e8s de la transformation de l''image ''{0}'' +message.transform-image.failure=Impossible de transformer le document +message.new-version-upload.success=Importation du fichier r\u00e9ussie. Il se peut que la version la plus r\u00e9cente du document ne soit pas encore accessible dans l'aper\u00e7u. Rafra\u00eechissez la page ult\u00e9rieurement. + +message.insitu-edit.tag.failure=Impossible de modifier le tag + +## Drag and Drop +message.dnd.allColumnsAreFull=Impossible d'ajouter un \u00e9l\u00e9ment car toutes les colonnes sont pleines + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Possibilit\u00e9 de mise en conformit\u00e9 +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Validit\u00e9 +aspect.cm_emailed=Envoy\u00e9 par e-mail +aspect.cm_generalclassifiable=Cat\u00e9gorisable +aspect.cm_summarizable=Peut \u00eatre r\u00e9sum\u00e9 +aspect.cm_taggable=Peut \u00eatre tagg\u00e9 +aspect.cm_templatable=Peut \u00eatre transform\u00e9 en mod\u00e8le +aspect.cm_versionable=Versionnable +aspect.emailserver_aliasable=Alias e-mail +aspect.app_inlineeditable=Supporte l'\u00e9dition en ligne +aspect.cm_geographic=Positionnement g\u00e9ographique +aspect.exif_exif=EXIF +aspect.exif_resolution=R\u00e9solution +aspect.exif_camera=D\u00e9tails de l'appareil photo +aspect.audio_audio=Audio +aspect.cm_indexControl=Contr\u00f4le d'indexation +aspect.dp_restrictable=Limit\u00e9 +aspect.cm_attachable=El\u00e9ments attach\u00e9s + +# Groups +group.everyone=TOUT LE MONDE + +# Types +type.cm_content=Type applicable aux contenus +type.cm_folder=Type applicable aux dossiers +type.trx_transferTarget=Cible de transfert +type.trx_fileTransferTarget=Cible de transfert de fichier + +# Generic Form labels +form.set.general=G\u00e9n\u00e9ral +form.set.operations=Op\u00e9rations + +# Runtime +runtime.field.FreeMemory=M\u00e9moire libre +runtime.field.MaxMemory=M\u00e9moire maximum +runtime.field.TotalMemory=M\u00e9moire totale + +# Repository Server +repository-server.set.version=Informations de version +repository-server.field.Name=Nom +repository-server.field.Id=ID +repository-server.field.Edition=\u00c9dition +repository-server.field.Schema=Sch\u00e9ma +repository-server.field.Version=Version +repository-server.field.VersionLabel=Etiquette +repository-server.field.VersionMinor=Mineure +repository-server.field.VersionMajor=Majeure +repository-server.field.VersionRevision=R\u00e9vision +repository-server.field.VersionBuild=Version +repository-server.field.VersionNumber=Num\u00e9ro + +# Repository Installed +repository-installed.set.version=Informations de version +repository-installed.field.Name=Nom +repository-installed.field.Id=ID +repository-installed.field.Edition=\u00c9dition +repository-installed.field.Schema=Sch\u00e9ma +repository-installed.field.Version=Version +repository-installed.field.VersionLabel=Etiquette +repository-installed.field.VersionMinor=Mineure +repository-installed.field.VersionMajor=Majeure +repository-installed.field.VersionRevision=R\u00e9vision +repository-installed.field.VersionBuild=Version +repository-installed.field.VersionNumber=Num\u00e9ro + +# Authority +authority.field.NumberOfGroups=Nombre de groupes +authority.field.NumberOfUsers=Nombre d'utilisateurs + +# License +header.license= +license.field.Subject=Objet de licence +license.field.Days=Jours +license.field.Holder=Titulaire +license.field.ValidUntil=Valide jusqu'\u00e0 +license.field.RemainingDays=Jours restants +license.field.Issued=Publi\u00e9 +license.field.Issuer=Auteur +license.field.HeartBeatDisabled=Heartbeat d\u00e9sactiv\u00e9 +license.field.LicenseMode=Mode de licence +license.field.CloudSyncKeyAvailable=Cl\u00e9 de synchronisation du Cloud disponible +license.field.MaxDocs=Nombre maximum d'objets de contenu +license.field.MaxUsers=Nombre d'utilisateurs max +license.field.Users=Utilisateurs +license.field.Documents=Objets de contenu +license.field.Info=La valeur peut \u00eatre z\u00e9ro si votre licence ne restreint pas le nombre d'utilisateurs. + +# Pdf2Swf +pdf2swf.field.Available=Disponible +pdf2swf.field.VersionString=Version + +# Open Office +openoffice.field.available=Disponible +openoffice.field.ooName=Nom +openoffice.field.ooOpenSourceContext=Contexte Open Source +openoffice.field.ooSetupExtension=Extension +openoffice.field.ooSetupVersion=Version +openoffice.field.ooSetupVersionAboutBox=\u00c0 propos +openoffice.field.ooXMLFileFormatName=Format de fichier XML +openoffice.field.ooXMLFileFormatVersion=Version de format de fichier XML +openoffice.error=Impossible d'afficher les informations OpenOffice +openoffice.error.404=Informations concernant OpenOffice introuvables (la propri\u00e9t\u00e9 "ooo.enabled" est peut-\u00eatre d\u00e9finie sur "false") + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Activ\u00e9 +openoffice-subsystem.field.ooo.exe=Ex\u00e9cutable +openoffice-subsystem.field.ooo.port=Port + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Activ\u00e9 +ooojodconverter.field.jodconverter.maxTasksPerProcess=Max. T\u00e2ches par processus +ooojodconverter.field.jodconverter.officeHome=Office Famille +ooojodconverter.field.jodconverter.portNumbers=Num\u00e9ros de port +ooojodconverter.field.jodconverter.taskExecutionTimeout=Expiration du d\u00e9lai d'ex\u00e9cution de la t\u00e2che +ooojodconverter.field.jodconverter.taskQueueTimeout=Expiration du d\u00e9lai de mise en attente de la t\u00e2che + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Disponible +transformer-imagemagick.field.VersionString=Informations de version + +# File servers +fileservers.set.filesystem=Syst\u00e8me de fichiers +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Niveau d'acc\u00e8s par d\u00e9faut +fileservers.field.filesystem.acl.global.domainAccessControls=Contr\u00f4les d'acc\u00e8s au domaine +fileservers.field.filesystem.acl.global.protocolAccessControls=Contr\u00f4les d'acc\u00e8s de protocole +fileservers.field.filesystem.acl.global.userAccessControls=Contr\u00f4les d'acc\u00e8s utilisateur +fileservers.field.filesystem.domainMappings=Mappages de domaine +fileservers.field.filesystem.name=Nom du syst\u00e8me de fichiers +fileservers.field.filesystem.name.description=Le nom utilis\u00e9 pour les syst\u00e8mes de fichiers lors de l'acc\u00e8s via CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=Auto-d\u00e9tection WINS activ\u00e9e +fileservers.field.cifs.WINS.primary=WINS Primaire +fileservers.field.cifs.WINS.secondary=WINS Secondaire +fileservers.field.cifs.bindto=Lier \u00e0 +fileservers.field.cifs.broadcast=Diffusion +fileservers.field.cifs.disableNIO=D\u00e9sactiver NIO +fileservers.field.cifs.disableNativeCode=D\u00e9sactiver code natif +fileservers.field.cifs.domain=Domaine +fileservers.field.cifs.enabled=CIFS activ\u00e9 +fileservers.field.cifs.hostannounce=Annonce h\u00f4te +fileservers.field.cifs.ipv6.enabled=IPV6 activ\u00e9 +fileservers.field.cifs.netBIOSSMB.datagramPort=Port du datagramme NetBIOS SMB +fileservers.field.cifs.netBIOSSMB.namePort=Port du nom NetBIOS SMB +fileservers.field.cifs.netBIOSSMB.sessionPort=Port de la session NetBIOS SMB +fileservers.field.cifs.serverName=Nom du serveur +fileservers.field.cifs.sessionDebug=D\u00e9bogage de la session +fileservers.field.cifs.sessionTimeout=Expiration de la session (timeout) +fileservers.field.cifs.tcpipSMB.port=Port TCP/IP SMB +fileservers.field.ftp.dataPortFrom=D\u00e9but de la plage de ports de donn\u00e9es +fileservers.field.ftp.dataPortTo=Fin de la plage de ports de donn\u00e9es +fileservers.field.ftp.enabled=FTP activ\u00e9 +fileservers.field.ftp.keyStore=Keystore +fileservers.field.ftp.passphrase=Phrase passe +fileservers.field.ftp.port=Port +fileservers.field.ftp.requireSecureSession=Session s\u00e9curis\u00e9e requise +fileservers.field.ftp.sessionDebug=D\u00e9bogage de la session +fileservers.field.ftp.sslEngineDebug=D\u00e9bogage du moteur SSL +fileservers.field.ftp.trustStore=Magasin de confiance + +# Sysadmin +sysadmin.field.alfresco.context=Contexte d'entrep\u00f4t +sysadmin.field.alfresco.host=H\u00f4te d'entrep\u00f4t +sysadmin.field.alfresco.port=Port d'entrep\u00f4t +sysadmin.field.alfresco.protocol=Protocole d'entrep\u00f4t +sysadmin.field.server.allowedusers=Utilisateurs autoris\u00e9s +sysadmin.field.server.maxusers=Nombre d'utilisateurs max +sysadmin.field.server.transaction.allow-writes=Autoriser les \u00e9critures +sysadmin.field.share.context=Contexte de Share +sysadmin.field.share.host=H\u00f4te de Share +sysadmin.field.share.port=Port de Share +sysadmin.field.share.protocol=Protocole de Share + +# Email (Inbound) +email-inbound.set.service=Service d'e-mails entrants +email-inbound.field.email.inbound.enabled=Service activ\u00e9 +email-inbound.field.email.inbound.unknownUser=Utilisateur inconnu +email-inbound.set.server=Serveur d'e-mails entrants +email-inbound.field.email.server.allowed.senders=Exp\u00e9diteurs autoris\u00e9s +email-inbound.field.email.server.blocked.senders=Exp\u00e9diteurs bloqu\u00e9s +email-inbound.field.email.server.enabled=Serveur activ\u00e9 +email-inbound.field.email.server.domain=Domaine +email-inbound.field.email.server.port=Port +email-inbound.field.email.server.connections.max=Nombre maximum de connexions +email-inbound.set.tls=Protocole Transport Layer Security +email-inbound.field.email.server.requireTLS=Protocole Transport Layer Security (TLS) requis +email-inbound.field.email.server.hideTLS=Transport Layer Security(TLS) non renvoy\u00e9 par EHELO +email-inbound.field.email.server.enableTLS=Accepter Transport Layer Security (TLS) + +# Email (Outbound) +email-outbound.set.auth=Authentification +email-outbound.set.test-message=Message test +email-outbound.field.mail.host=H\u00f4te +email-outbound.field.mail.port=Port +email-outbound.field.mail.protocol=Protocole +email-outbound.field.mail.encoding=Encodage +email-outbound.field.mail.from.default=Adresse de l'exp\u00e9diteur par d\u00e9faut +email-outbound.field.mail.from.enabled=Champ De activ\u00e9 +email-outbound.field.mail.smtp.auth=Authentification SMTP requise +email-outbound.field.mail.smtps.auth=Authentification SMTPS requise +email-outbound.field.mail.username=Nom d'utilisateur +email-outbound.field.mail.password=Mot de passe +email-outbound.field.mail.testmessage.send=Envoyer le message test au d\u00e9marrage +email-outbound.field.mail.testmessage.to=\u00c0 +email-outbound.field.mail.testmessage.subject=Sujet +email-outbound.field.mail.testmessage.text=Message + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Dossier expos\u00e9 +imap.field.imap.config.home.rootPath=Dossier racine du store +imap.field.imap.config.home.store=Store expos\u00e9 +imap.field.imap.server.attachments.extraction.enabled=Extraction activ\u00e9e +imap.field.imap.config.ignore.extraction=Ignorer l'extraction +imap.field.imap.config.server.mountPoints=Points de montage +imap.field.imap.mail.from.default=Exp\u00e9diteur par d\u00e9faut +imap.field.imap.mail.to.default=Destinataire par d\u00e9faut +imap.field.imap.server.enabled=Activ\u00e9 +imap.field.imap.server.host=H\u00f4te +imap.field.imap.server.port=Port + +# Activities Feed +activities.set.activities=Flux d'activit\u00e9s +activities.field.feed.notifier.enabled=Notificateur de flux activ\u00e9 +activities.field.feed.notifier.repeatIntervalMins=Intervalle de d\u00e9clenchement (mins) +activities.field.feed.max.ageMins=Age maximal (mins) +activities.field.feed.max.size=Taille maximale + +# Subscriptions +subscriptions.field.subscriptions.enabled=Activ\u00e9 + +# Workflow +workflow.field.message=Message +workflow.field.comment=Commentaire +workflow.field.assign_to=Assigner \u00e0 +workflow.field.review_group=Groupe de r\u00e9vision +workflow.field.reviewer=Relecteur +workflow.field.reviewers=Relecteurs +workflow.field.due=\u00c9ch\u00e9ance +workflow.field.priority=Priorit\u00e9 +workflow.field.outcome=R\u00e9sultat +workflow.field.enabled.activiti=Activ\u00e9 +workflow.field.enabled.jbpm=Activ\u00e9 +workflow.field.definitions.visible=D\u00e9finitions visibles +workflow.field.number.tasks=Nombre de t\u00e2ches +workflow.field.number.definitions=Nombre de d\u00e9finitions +workflow.field.number.workflows=Nombre de workflows +workflow.field.requiredApprovePercent=Pourcentage d'approbation requis +workflow.set.general=G\u00e9n\u00e9ral +workflow.set.assignee=Personne assign\u00e9e +workflow.set.assignees=Personnes assign\u00e9es +workflow.set.information=Information +workflow.set.items=\u00c9l\u00e9ments +workflow.set.outcome=R\u00e9sultat +workflow.set.other=Autres options +workflow.set.task.info=Informations +workflow.set.workflow.more_info=Plus d'informations +workflow.set.task.progress=Progression +workflow.set.response=R\u00e9ponse +workflow.set.engine.activiti=Moteur Activiti +workflow.set.engine.jbpm=Moteur JBPM +workflow.task.error=Echec du chargement de la t\u00e2che. +workflow.task.error.404=La t\u00e2che n'existe pas ou a \u00e9t\u00e9 annul\u00e9e. +workflow.task.invite.title=Site {0} +workflow.task.invite.subtitle=Vous avez \u00e9t\u00e9 invit\u00e9 \u00e0 rejoindre le site {0}. +workflow.task.invite.role=Votre r\u00f4le sera le suivant : {0}. +workflow.task.invite.accepted={0} {1} a accept\u00e9 votre invitation \u00e0 rejoindre le site {2}. +workflow.task.invite.rejected={0} {1} a rejet\u00e9 votre invitation \u00e0 rejoindre le site {2}. +workflow.task.request.invite.title=L''utilisateur {0} a demand\u00e9 de rejoindre le site {1}. +workflow.cancel.title=Annuler le workflow +workflow.cancel.label=\u00cates-vous s\u00fbr de vouloir annuler le workflow ? +workflow.cancel.feedback=Annulation du workflow... +workflow.cancel.success=Le workflow a \u00e9t\u00e9 annul\u00e9 +workflow.cancel.failure=Echec de l'annulation du workflow +workflow.delete.title=Supprimer le workflow +workflow.delete.label=Supprimer le workflow\u00a0? +workflow.delete.feedback=Suppression du workflow en cours... +workflow.delete.success=Le workflow a \u00e9t\u00e9 supprim\u00e9 +workflow.delete.failure=Echec de la suppression du workflow +workflow.no_message=(Aucun message) +tool.workflow.activiti.tools=Outils Activiti +tool.workflow.activiti.admin.link=Console du workflow Activiti + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Gestionnaire de recherche +tool.searchmanager.description=Gestionnaire de recherche + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Activ\u00e9 +lucene.field.dir.indexes=R\u00e9pertoire d'index +lucene.field.index.recovery.mode=Mode de restauration d'index +lucene.field.lucene.indexer.contentIndexingEnabled=Indexation de contenu activ\u00e9e +lucene.field.index.tracking.disableInTransactionIndexing=D\u00e9sactiver l'indexation dans la transaction + +lucene.set.backup=Sauvegarde +lucene.backup.field.dir.indexes.backup=R\u00e9pertoire de sauvegarde d'index +lucene.backup.field.index.backup.cronExpression=Expression Cron pour la sauvegarde + +lucene.set.advanced=Avanc\u00e9 +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Indexation de contenu activ\u00e9e +lucene.advanced.field.fts.indexer.batchSize=Taille de lot d'indexation +lucene.advanced.field.lucene.maxAtomicTransformationTime=Temps max. pour transformation atomique (ms) +lucene.advanced.field.index.reindexMissingContent.cronExpression=Contenu manquant : expression Cron +lucene.advanced.field.indexer.maxFieldLength=Nombre max. d'unit\u00e9s lexicales index\u00e9es par document +lucene.field.indexer.mergerMaxMergeDocs=Nombre max. de documents fusionn\u00e9s +lucene.field.indexer.mergerMergeFactor=Nombre max. de facteurs de fusion + +# Transform action form +transform.field.mime-type=Format requis +transform.field.destination-folder=Destination + +# Transform Image action form +transform-image.field.mime-type=Format requis +transform-image.field.convert-command=Options +transform-image.field.destination-folder=Destination + +publish-content.field.publish-channel-id=Canal de publication +publish-content.field.unpublish=Supprimer de la publication +publish-content.field.status-update=Mise \u00e0 jour du statut +publish-content.field.status-update-channel-id=Canaux de mise \u00e0 jour du statut + +# Execute Script action form +script.field.script-ref=Script + +# Solr +solr.set.spacesstore=Propri\u00e9t\u00e9s du stockage principal +solr.set.archivestore=Propri\u00e9t\u00e9s du stockage d'archivage +solr.field.search.solrTrackingSupport.enabled=Suivi activ\u00e9 +solr.help.search.solrTrackingSupport.enabled=Activer pour autoriser Solr \u00e0 se connecter \u00e0 ce serveur, \u00e0 effectuer un suivi et \u00e0 indexer les mises \u00e0 jour +solr.field.solr.host=Nom d'h\u00f4te Solr +solr.help.field.solr.host=Nom de l'h\u00f4te ex\u00e9cutant le serveur Solr. Utilisez localhost s'il s'ex\u00e9cute sur la m\u00eame machine. +solr.field.solr.port=Port Solr (non SSL) +solr.help.field.solr.port=Port http (non s\u00e9curis\u00e9) du serveur d'applications sur lequel Solr s'ex\u00e9cute. Uniquement utilis\u00e9 si Solr est configur\u00e9 pour s'ex\u00e9cuter sans communication s\u00e9curis\u00e9e. +solr.field.solr.port.ssl=Port SSL Solr +solr.help.field.solr.port.ssl=Port https du serveur d'applications sur lequel Solr s'ex\u00e9cute. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indexation en cours +solr.field.tracker.alfresco.lag=D\u00e9calage d'indexation (secondes) +solr.field.tracker.alfresco.last.indexed.txn=Derni\u00e8re transaction index\u00e9e +solr.field.tracker.alfresco.approx.txns.remaining=Nombre approximatif de transactions \u00e0 indexer +solr.field.tracker.alfresco.approx.indexing.time.remaining=Temps d'indexation restant approximatif +solr.help.field.tracker.alfresco.lag=Les index Solr sont mis \u00e0 jour en t\u00e2che de fond. Cette valeur correspond au temps (en secondes) de d\u00e9calage de cet index de texte int\u00e9gral Solr par rapport aux mises \u00e0 jour de l'entrep\u00f4t. +solr.field.tracker.archive.active=Indexation en cours +solr.field.tracker.archive.lag=D\u00e9calage d'indexation (secondes) +solr.field.tracker.archive.last.indexed.txn=Derni\u00e8re transaction index\u00e9e +solr.field.tracker.archive.approx.txns.remaining=Nombre approximatif de transactions \u00e0 indexer +solr.field.tracker.archive.approx.indexing.time.remaining=Temps d'indexation restant approximatif + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Expression Cron pour la sauvegarde +solr.field.solr.backup.alfresco.remoteBackupLocation=Emplacement de sauvegarde +solr.field.solr.backup.alfresco.numberToKeep=Sauvegardes \u00e0 conserver +solr.help.solr.backup.alfresco.remoteBackupLocation=Chemin complet de l'emplacement d'enregistrement de la sauvegarde de l'index dans le syst\u00e8me de fichiers du serveur Solr +solr.help.solr.backup.alfresco.numberToKeep=Nombre de sauvegardes \u00e0 conserver (y compris la toute derni\u00e8re) +solr.field.solr.backup.archive.cronExpression=Expression Cron pour la sauvegarde +solr.field.solr.backup.archive.remoteBackupLocation=Emplacement de sauvegarde +solr.field.solr.backup.archive.numberToKeep=Sauvegardes \u00e0 conserver +solr.help.solr.backup.archive.remoteBackupLocation=Chemin complet de l'emplacement d'enregistrement de la sauvegarde de l'index dans le syst\u00e8me de fichiers du serveur Solr +solr.help.solr.backup.archive.numberToKeep=Nombre de sauvegardes \u00e0 conserver (y compris la toute derni\u00e8re) + +# searchmanager +searchmanager.field.sourceBeanName=Service de recherche + +## Tooltips +tooltip.path=Chemin\u00a0: {0} +tooltip.site=Site\u00a0: {0} + +## Create content +create-content.text=Plein texte... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Dossier + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Choisir le mois +calendar.widget_control_config.label_year=Saisir l'ann\u00e9e +calendar.widget_control_config.label_invalid_year=Veuillez saisir une ann\u00e9e valide + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Lien vers : {0} +details.created-by=Cr\u00e9\u00e9 {0} par {1} +details.created-in-site=Cr\u00e9\u00e9 {0} dans {1} +details.editing-started-by=Edition initi\u00e9e {0} par {1} +details.editing-started-in-site=Edition initi\u00e9e {0} dans {1} +details.modified-by=Modifi\u00e9 {0} par {1} +details.modified-in-site=Modifi\u00e9 {0} dans {1} +details.description.none=Aucune description +details.tags.none=Aucun tag +details.categories.none=Aucune cat\u00e9gorie +details.user.deleted=''{0}'' (Utilisateur supprim\u00e9) + +## Social Interactions +# Favourite +favourite.document.add.tip=Ajouter le document aux favoris +favourite.document.add.label=Favori +favourite.document.remove.tip=Supprimer le document des favoris +favourite.folder.add.tip=Ajouter le dossier aux favoris +favourite.folder.add.label=Favori +favourite.folder.remove.tip=Supprimer le dossier des favoris +favourite.imap-site.add.tip=Ajouter le site aux favoris IMAP +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Supprimer le site des favoris IMAP +favourite.site.add.tip=Ajouter le site aux favoris +favourite.site.add.label=Favori +favourite.site.remove.tip=Supprimer le site des favoris +favourite.message.failure=Echec de l'enregistrement du favori +# Like +like.document.add.tip=Aimer ce document +like.document.add.label=Aimer +like.document.remove.tip=Ne plus aimer +like.folder.add.tip=Aimer ce dossier +like.folder.add.label=Aimer +like.folder.remove.tip=Ne plus aimer +like.site.add.tip=Aimer ce site +like.site.add.label=Aimer +like.site.remove.tip=Ne plus aimer +like.message.failure=Echec de l'enregistrement sous Aimer +# Quickshare +quickshare.link.label=Lien public +quickshare.link.tooltip=Appuyer sur la combinaison de touches Ctrl+c pour copier +quickshare.link.tooltip.mac=Appuyer sur la combinaison de touches Cmd+c pour copier +quickshare.view.label=Afficher +quickshare.unshare.label=Ne pas partager +quickshare.document.shared.label=Partag\u00e9 +quickshare.document.shared.tip=Ce document est partag\u00e9 (cliquez pour plus d'options) +quickshare.document.share.label=Partager +quickshare.document.share.tip=Partager un document +quickshare.document.share.failure=Impossible de partager le document +quickshare.document.unshared.label=Partager +quickshare.document.unshared.tip=Partager un document +quickshare.document.unshare.success=Le document n'est plus partag\u00e9 +quickshare.document.unshare.failure=Impossible de ne pas partager le document +quickshare.document.unshare.user.failure=Vous n'avez pas les autorisations n\u00e9cessaires pour Annuler le partage. +quickshare.linkshare.label=Partager avec +# LinkShare +linkshare.action.email.label=Partager par e-mail +linkshare.action.email.subject=Fichier partag\u00e9 via Alfresco Content Services +linkshare.action.email.body=Fichier {1} partag\u00e9 via Alfresco Content Services, consultez-le ici\u00a0: {0} +linkshare.action.facebook.label=Partager via Facebook +linkshare.action.facebook.message=Fichier {1} partag\u00e9 via Alfresco Content Services +linkshare.action.twitter.label=Partager via Twitter +linkshare.action.twitter.message=Fichier {1} partag\u00e9 via Alfresco Content Services +linkshare.action.google-plus.label=Partager via Google+ + + +# Comment +comment.document.tip=Commenter sur ce document +comment.document.label=Commentaire +comment.folder.tip=Commenter sur ce dossier +comment.folder.label=Commentaire + +#Dashlets +dashlet.help.tooltip=Afficher l'aide pour ce dashlet +dashlet.rss.tooltip=S'inscrire au flux RSS de ce dashlet +dashlet.edit.tooltip=Configurer ce dashlet + +#Module Package Admin page +tool.module-package.label=Navigateur de modules +tool.module-package.description=Navigateur de modules + +# Category Manager Admin Console +tool.category-manager.label=Gestionnaire de cat\u00e9gories +tool.category-manager.description=Gestionnaire de cat\u00e9gories +tool.category-manager.edit-category=Editer une cat\u00e9gorie +tool.category-manager.edit-category.failure=Impossible de modifier le nom. +tool.category-manager.add-category=Ajouter une cat\u00e9gorie +tool.category-manager.add-category.failure=Echec de l'ajout de la cat\u00e9gorie. +tool.category-manager.label.category-name=Nom de la cat\u00e9gorie\u00a0: +tool.category-manager.delete-category=Supprimer la cat\u00e9gorie +tool.category-manager.delete-category.failure=Impossible de supprimer la cat\u00e9gorie. +tool.category-manager.message.confirm.delete.title=Supprimer la cat\u00e9gorie +tool.category-manager.message.confirm.delete=Etes-vous s\u00fbr de vouloir supprimer\u00a0: {0}\u00a0? + +# Node browser +tool.node-browser.label=Navigateur de n\u0153uds +tool.node-browser.description=Navigateur de n\u0153uds + +# Label +label.folder=Dossier +label.document=Document +label.blogpost=Article de blog +label.forumpost=Sujet de forum +label.calendarevent=\u00c9v\u00e9nement de calendrier +label.wikipage=Page de wiki +label.link=Lien +label.datalist=Liste de donn\u00e9es +label.datalistitem=El\u00e9ment de liste de donn\u00e9es +label.unknown=Inconnu +label.download=T\u00e9l\u00e9charger +label.viewinbrowser=Voir dans le navigateur +label.viewdetails=Afficher les d\u00e9tails +label.selectAll=Tout s\u00e9lectionner +label.selectInvert=Inverser la s\u00e9lection +label.selectNone=Aucun +label.selectedItems=El\u00e9ments s\u00e9lectionn\u00e9s +label.select=S\u00e9lectionner +label.restricted-settings=Alfresco Identity Service est activ\u00e9, certains param\u00e8tres sont soumis \u00e0 des restrictions. + +# Path +message.infolderpath=Dans le dossier + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Synchronisation en attente +sync.status.synced={0} synchronis\u00e9, par {1} +sync.status.last-attempt=Derni\u00e8re synchronisation r\u00e9ussie {0}, par {1} +sync.status.failed=Tentative de synchronisation {0}, par {1} +sync.status.last-failed=Echec de la derni\u00e8re synchronisation +sync.status.transient-error=Erreur de synchronisation temporaire +sync.status.transient-error.default-details=La synchronisation reprendra une fois qu'Alfresco Content Services pourra communiquer de nouveau avec le cloud. +sync.status.copy.pending=Synchronisation en attente sur {2} +sync.status.copy.synced={2} synchronis\u00e9 {0}, par {1} +sync.status.copy.last-attempt={2} derni\u00e8re synchronisation r\u00e9ussie {0}, par {1} +sync.status.copy.failed=synchronisation tent\u00e9e sur {2} {0}, par {1} +sync.status.copy.last-failed=Echec de la derni\u00e8re synchronisation de {2} +sync.status.show-details=Montrer les D\u00e9tails +sync.status.hide-details=Cacher les D\u00e9tails +sync.status.title=Informations de synchronisation +sync.status.action.more=Plus d'informations +sync.original-document=Document original + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=Impossible d'afficher le statut de la synchronisation +sync.unable.get.details=Impossible d'obtenir des d\u00e9tails sur le n\u0153ud + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Supprimer ''{0}'' du cloud. +sync.remove.folder.from.cloud=Supprimer ''{0}'' et tout contenu sous-jacent du cloud. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Un contenu avec le m\u00eame nom existe d\u00e9j\u00e0 dans le dossier cible. +sync.folder.not_found=Aucun dossier n'a \u00e9t\u00e9 trouv\u00e9. +sync.node.already_synced=Impossible de cr\u00e9er le contenu\u00a0: il a d\u00e9j\u00e0 \u00e9t\u00e9 synchronis\u00e9 depuis un autre emplacement. +sync.node.other_sync_set=Ce contenu a d\u00e9j\u00e0 \u00e9t\u00e9 synchronis\u00e9 depuis un autre emplacement. +sync.node.no_longer_exists=Ce contenu n'existe plus dans Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=Ce contenu n'existe plus dans Alfresco Content Services in the Cloud. Cliquez sur Demander la synchronisation pour r\u00e9essayer. +sync.node.unknown=Un probl\u00e8me est survenu, veuillez r\u00e9essayer. +sync.node.unknown.description=Une erreur inattendue s''est produite. Cause\u00a0: {0}. +sync.node.access_denied=Impossible de synchroniser le contenu\u00a0: vous ne disposez pas des autorisations pour acc\u00e9der au fichier cible. +sync.node.access_denied_source=Impossible de synchroniser le contenu\u00a0: vous ne disposez pas des autorisations pour acc\u00e9der au fichier source. +sync.node.content_limit_violation=Ce fichier d\u00e9passe le nombre maximum de contenus autoris\u00e9s. Le fichier est trop volumineux pour effectuer l'action. +sync.node.quota_limit_violation=Vous avez d\u00e9pass\u00e9 le quota autoris\u00e9 pour le contenu. L'espace libre est insuffisant pour effectuer l'action. +sync.node.authentication_error=Impossible de synchroniser le contenu sur le cloud\u00a0: les informations d'authentification ne sont pas valides. +sync.node.authentication_error.description=Impossible de synchroniser le contenu sur le cloud\u00a0: les informations d''authentification pour l''utilisateur {0} ne sont pas valides. +sync.node.owner_not_found=Impossible de synchroniser le contenu car l'utilisateur a \u00e9t\u00e9 supprim\u00e9. +sync.node.owner_not_found.description=L''utilisateur propri\u00e9taire de cette synchronisation, {0}, n''existe plus. Cliquez sur Se d\u00e9synchroniser. + +sync.communications.error=Impossible de communiquer avec le syst\u00e8me distant +sync.communications.error.description=Impossible de communiquer avec le syst\u00e8me distant. La synchronisation fonctionnera automatiquement une fois les communications \u00e9tablies + +# Cloud Sync no network available for sync +sync.message.no.active.network=Aucun r\u00e9seau activ\u00e9 pour la synchronisation + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Nouveau dossier +sync.new-folder.in-the-cloud.header=D\u00e9tails du nouveau dossier +sync.new-folder.creation.success=Cr\u00e9ation du dossier r\u00e9ussie +sync.new-folder.creation.failure=Impossible de cr\u00e9er le dossier + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=ID de synchronisation +hybridsync.ssd-failed-reason-header-label=Type d'erreur de synchronisation +hybridsync.path-desc-header-label=Emplacement d'origine de l'\u00e9l\u00e9ment +hybridsync.sync-creator-header-label=Cr\u00e9ateur de synchronisation +hybridsync.cloud-user-header-label=Utilisateur cloud +hybridsync.remote-tenant-id-header-label=R\u00e9seau cloud +hybridsync.target-folder-node-ref-header-label=Destination cloud +hybridsync.actions-header-label=Actions + +#Hybrid workflow +hybridworkflow.destination-select.title=S\u00e9lectionner la destination pour les documents sur le Cloud +hybridworkflow.set.destination=Destination et personne assign\u00e9e +hybridworkflow.authority.single=Personne assign\u00e9e +hybridworkflow.authority.multiple=Relecteurs +hybridworkflow.review.approved=Approuv\u00e9 +hybridworkflow.review.rejected=Rejet\u00e9 +hybridworkflow.destination-select.folderPrefix=Documents +hybridworkflow.destination.network=R\u00e9seau +hybridworkflow.destination.site=Site +hybridworkflow.destination.folder=Dossier +hybridworkflow.destination.button=S\u00e9lectionner + +# Security +security.insecuremimetype=Le type MIME pour le contenu demand\u00e9 pose un risque de s\u00e9curit\u00e9 et ne sera pas affich\u00e9. + +# Lightbox +lightbox.close=fermer +lightbox.loading=chargement diff --git a/share/src/main/resources/alfresco/messages/slingshot_it.properties b/share/src/main/resources/alfresco/messages/slingshot_it.properties new file mode 100755 index 0000000000..172845e4e5 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_it.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Immettere i termini di ricerca... +# header menu items +header.advanced-search.label=Ricerca avanzata... +header.advanced-search.description=Ricerca avanzata... +header.application.label=Applicazione +header.application.description=Applicazione +header.change-password.label=Cambia password +header.change-password.description=Cambia password +header.groups.label=Gruppi +header.groups.description=Gruppi +header.tag-management.label=Gestione tag +header.tag-management.description=Gestione tag +header.help.label=Aiuto +header.help.description=Aiuto +header.logout.label=Logout +header.logout.description=Logout +header.more.label=Segue... +header.more.description=Segue... +header.my.label=I miei... +header.my.description=I miei... +header.my-content.label=Il mio contenuto +header.my-content.description=Il mio contenuto +header.my-dashboard.label=Il mio pannello di controllo +header.my-dashboard.description=Il mio pannello di controllo +header.my-profile.label=Il mio profilo +header.my-profile.description=Il mio profilo +header.my-sites.label=I miei siti +header.my-sites.description=I miei siti +header.my-tasks.label=I miei compiti +header.my-tasks.description=I miei compiti +header.my-workflows.label=Workflow avviati da me +header.my-workflows.description=Workflow avviati da me +header.people.label=Persone +header.people.description=Persone +header.replication-jobs.label=Job di replica +header.replication-jobs.description=Job di replica +header.repository.label=Repository +header.repository.description=Repository +header.trashcan.label=Cestino +header.trashcan.description=Strumenti di eliminazione e recupero file +header.saved-searches.label=Ricerche salvate +header.saved-searches.description=Ricerche salvate +header.search.description=Opzioni di ricerca... +header.sites.label=Siti +header.sites.description=Siti +header.submit-status.label=Condividere +header.submit-status.description=Condividere +header.tools.label=Strumenti di amministrazione... +header.tools.description=Strumenti di amministrazione... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Utenti +header.users.description=Utenti + +## Buttons +button.browse=Sfoglia +button.edit=Modifica +button.save=Salva +button.savechanges=Salva modifiche +button.saveandclose=Salva e chiudi +button.upload=Carica +button.login=Accedi +button.delete=Elimina +button.take-ownership=OK +button.download=Scarica +button.clear=Cancella +button.reset=Ripristina +button.search=Cerca +button.update=Aggiorna +button.goback=Indietro +button.done=Fatto +button.undo=Annulla +button.new=Nuovo +button.create=Crea +button.rename=Rinomina +button.refreshPage=Aggiorna pagina +button.createanother=Crea una, poi un\u2019altra +button.view.simple=Vista semplice +button.view.detailed=Vista dettagliata +button.view.gallery=Vista raccolta +button.view.filmstrip=Vista sequenza +button.view.table=Vista tabella +button.view.media-table=Vista file multimediali +button.view.email=Vista e-mail +button.view.audio=Vista audio +button.view.dublinCore=Vista Dublin Core +button.view.effectivity=Vista validit\u00e0 + +button.follow=Segui +button.unfollow=Smetti di seguire +button.unsync=Rimuovi sincronizzazione + +## Messages +message.failure=Operazione non riuscita +message.failure.workflow=L''utente {0} non dispone delle autorizzazioni per accedere a questo compito. +message.loginfailure=Impossibile eseguire il login +message.loginautherror=I dettagli di autenticazione non sono stati riconosciuti oppure Alfresco Content Services potrebbe non essere disponibile in questo momento. +message.passwordchangeauthfailed=I dati di autenticazione non sono corretti oppure l'utente non \u00e8 autorizzato a cambiare la password. +message.login-portal=Eseguire il login tramite il portale. +message.unsavedChanges.blog=Il post del blog contiene modifiche non salvate. +message.unsavedChanges.comment=Il commento non \u00e8 ancora stato salvato. +message.unsavedChanges.discussion=L'argomento di discussione contiene modifiche non salvate. +message.unsavedChanges.reply=La risposta all'argomento contiene modifiche non salvate. +message.unsavedChanges.wiki=L'articolo wiki contiene modifiche non salvate. +message.searching=Ricerca in corso... +message.searchingFor=Ricerca di ''{0}''... +message.minimum-length=Immettere almeno {0} caratteri +message.folders-trimmed=L''elenco \u00e8 stato limitato a {0} voci +message.item-missing=L'elemento richiesto non pu\u00f2 essere visualizzato perch\u00e9 non \u00e8 pi\u00f9 disponibile. +message.save.success=Le modifiche sono state salvate. +message.save.failure=Impossibile salvare le modifiche. +message.cookiesfailure=Cookie disabilitati +message.cookieserror=I cookie devono essere disabilitati nel browser. +message.siteRedirect.noPages.manager=Tutte le funzioni del sito sono state disattivate da un manager del sito.
Fare clic sull'icona Impostazioni   e selezionare Personalizza sito per aggiungere una o pi\u00f9 funzioni. +message.siteRedirect.noPages.user=Tutte le funzioni del sito sono state disattivate da un manager del sito.
Visualizzare i membri del sito per individuare un manager del sito che possa aggiungere funzioni al sito. +message.logged-out=Logout riuscito. +message.timeout=Timeout del server. \u00c8 stato impiegato troppo tempo per completare la richiesta, riprovare pi\u00f9 tardi. +message.loading=Caricamento in corso... +message.viewInCloud.failure=Impossibile recuperare l'URL. Verificare lo stato di sincronizzazione. +message.logged-out=Logout riuscito. + +## Common Text labels and CM model metadata +label.tags=Tag +label.none=(Nessuno) +label.empty=(Vuoto) +label.about=Informazioni +label.username=Nome utente +label.password=Password +label.copyright=© 2005-2023 Alfresco Software Inc. Tutti i diritti riservati. +label.name=Nome +label.id=ID +label.title=Titolo +label.description=Descrizione +label.version=Versione +label.firstname=Nome +label.lastname=Cognome +label.jobtitle=Qualifica +label.location=Localit\u00e0 +label.bio=Riepilogo +label.photo=Foto +label.contactinfo=Contatti +label.skype=Skype +label.im=Messaggistica immediata +label.googleusername=Nome utente Google +label.company=Azienda +label.companyinfo=Dettagli azienda +label.companyname=Nome +label.companyaddress=Indirizzo +label.companytelephone=Telefono +label.companyfax=Fax +label.companyemail=E-mail +label.companypostcode=Codice postale +label.email=E-mail +label.telephone=Telefono +label.mobile=Cellulare +label.fax=Fax +label.address=Indirizzo +label.postcode=Codice postale +label.groups=Gruppi +label.yes=S\u00ec +label.no=No +label.ok=OK +label.loading=Caricamento in corso... +label.validating=Convalida in corso... +label.validationError=Impossibile convalidare le credenziali. +label.site=Sito +label.path=Percorso +label.type=Tipo +label.creator=Creatore +label.created=Creato +label.modifier=Modificatore +label.modified=Modificato +label.author=Autore +label.priority=Priorit\u00e0 {0} +label.size=Dimensioni +label.mimetype=Tipo MIME +label.mimetype.unknown=Sconosciuto +label.popularity=Popolarit\u00e0 +label.avatar=Avatar +label.editType=Modifica: {0} +label.moreInfo=Altre info > +label.actions.column.header=Azioni +# Dictionary Model +label.modelActive=\u00c8 attivo +label.modelName=Nome del modello +label.modelDescription=Descrizione del modello +# Transfer Targets +label.trx_enabled=\u00c8 abilitato +label.trx_endpointhost=Trasferimento all'host +label.trx_endpointport=Porta +label.you=Utente +label.licensedTo=Concesso in licenza a: + +## Location +location.tooltip.path=Percorso: {0} +location.tooltip.site=Sito: {0} +location.path.repository=Repository +location.path.documents=Documenti +location.path.userHome=La mia home page +location.path.myfiles=I miei file +location.path.shared=File condivisi +location.label.none=(Nessuno) +location.label.local={0} +location.label.site={0} in {1} +location.label.repository={0} + +## EXIF +label.exif.width=Larghezza +label.exif.height=Altezza + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} di {totalRecords} +pagination.template.page-report.more=Elementi mostrati: {startRecord} - {endRecord} di {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} di {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Tema chiaro +theme.default=Tema blu +theme.greenTheme=Tema verde +theme.hcBlack=Tema contrasto elevato +theme.yellowTheme=Tema giallo +theme.gdocs=Tema Google Docs + +## Admin console tools +tool.users.label=Utenti +tool.users.description=Gestione utenti +tool.groups.label=Gruppi +tool.groups.description=Gestione gruppi +tool.application.label=Applicazione +tool.application.description=Impostazioni e gestione applicazione +tool.replication-jobs.label=Job di replica +tool.replication-jobs.description=Gestione job di replica +tool.repository.label=Strumenti repository +tool.repository.description=Strumenti repository +tool.tag-management.label=Gestione tag +tool.tag-management.description=Gestione tag +tool.workflow.label=Workflow +tool.workflow.description=Strumenti di workflow +tool.trashcan.label=Cestino +tool.trashcan.description=Strumenti di eliminazione e recupero file +tool.email-inbound.label=E-mail (in ingresso) +tool.email-inbound.description=E-mail (in ingresso) +tool.email-outbound.label=E-mail (in uscita) +tool.email-outbound.description=E-mail (in uscita) +tool.email-imap.label=E-mail (IMAP) +tool.email-imap.description=E-mail (IMAP) +tool.runtime.label=Runtime +tool.runtime.description=Runtime +tool.repository-server.label=Descrittore repository (attuale) +tool.repository-server.description=Descrittore repository (attuale) +tool.repository-installed.label=Descrittore repository (installato originariamente) +tool.repository-installed.description=Descrittore repository (installato originariamente) +tool.authority.label=Autorit\u00e0 +tool.authority.description=Autorit\u00e0 +tool.license.label=Descrittore licenza +tool.license.description=Descrittore licenza +tool.license.link=Gestisci sottoscrizione +tool.license.usageinfo.label=Informazioni sull'uso della licenza +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=Sistema OpenOffice +tool.openoffice-subsystem.description=Sistema OpenOffice +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Convertitore pdf2swf +tool.transformer-pdf2swf.description=Convertitore pdf2swf +tool.transformer-imagemagick.label=Convertitore ImageMagick +tool.transformer-imagemagick.description=Convertitore ImageMagick +tool.fileservers.label=File server +tool.fileservers.description=File server +tool.subscriptions.label=Sottoscrizioni +tool.subscriptions.description=Sottoscrizioni +tool.sysadmin.label=Amministratore di sistema +tool.sysadmin.description=Amministratore di sistema +tool.activities.label=Feed attivit\u00e0 +tool.activities.description=Feed attivit\u00e0 +tool.workflow.label=Workflow +tool.workflow.description=Workflow +tool.manage-sites.label=Manager siti +tool.manage-sites.description=Manager siti +tool.cloud-sync-management.label=Gestione sincronizzazione cloud +tool.cloud-sync-management.description=Gestione sincronizzazione cloud +tool.search-manager.label=Gestione ricerca +tool.search-manager.description=Gestione ricerca + +## Admin console tool groups +tool.group.usersgroups=Utenti e gruppi +tool.group.email=E-mail +tool.group.transformations=Trasformazioni +tool.group.filemanagement=Gestione file +tool.group.subscriptions=Sottoscrizioni +tool.group.repository=Repository +tool.group.search=Cerca +tool.group.site=Siti + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Accetta invito +page.acceptInvite.description=Pagina Accetta invito. Il caricamento della pagina comporta l'accettazione dell'invito a partecipare al sito e abilita l'account dell'utente (se \u00e8 disabilitato) +page.addGroups.title=Aggiungi gruppi +page.addGroups.description=Aggiungi gruppi +page.add-users.title=Aggiungi utenti +page.add-users.description=Aggiungi utenti a un sito +page.adminConsole.title=Strumenti di amministrazione +page.adminConsole.description=Console di amministrazione e gestione +page.advsearch.title=Ricerca avanzata +page.advsearch.description=Finestra di ricerca avanzata +page.blogCreateEdit.title=Blog: crea o modifica post del blog +page.blogCreateEdit.description=Visualizza un modulo per la creazione o la modifica di un post +page.blogPostList.title=Blog +page.blogPostList.description=Visualizza i post del blog +page.blogPostView.title=Blog: visualizza vista dettagliata post +page.blogPostView.description=Visualizza la vista dettagliata dei post +page.calendar.title=Calendario +page.calendar.description=Componente Calendario del sito +page.changePassword.title=Cambia password utente +page.changePassword.description=Sezione Cambia password nella pagina Profilo dell'utente +page.contentViewer.title=Visualizzatore contenuto +page.contentViewer.description=Pagina per la visualizzazione del contenuto di un riferimento a un nodo +page.createContent.title=Crea contenuto +page.createContent.description=Consente di creare contenuto basato su testo +page.createEditReplicationJob.title=Job di replica +page.createEditReplicationJob.description=Consente di creare un nuovo job di replica o modificarne uno esistente +page.customiseSite.title=Personalizza sito +page.customiseSite.description=Consente di aggiungere e rimuovere pagine in un sito +page.customiseSiteDashboard.title=Personalizza pannello di controllo del sito +page.customiseSiteDashboard.description=Consente di personalizzare il layout e i dashlet del pannello di controllo di un sito +page.customiseUserDashboard.title=Personalizza pannello di controllo dell'utente +page.customiseUserDashboard.description=Consente di personalizzare il layout e i dashlet del pannello di controllo dell'utente +page.data-lists.title=Elenchi dati +page.data-lists.description=Pagina Elenchi dati +page.discussionsCreateTopic.title=Discussioni: visualizza pagina creazione argomento +page.discussionsCreateTopic.description=Visualizza il modulo per la creazione di un argomento +page.discussionsTopicList.title=Discussioni +page.discussionsTopicList.description=Visualizza gli argomenti del forum +page.discussionsTopicView.title=Discussioni: visualizza vista dettagliata argomenti +page.discussionsTopicView.description=Visualizza la vista dettagliata degli argomenti +page.documentDetails.title=Dettagli documento +page.documentDetails.description=Dettagli documento +page.documentLibrary.title=Libreria documenti +page.documentLibrary.description=Libreria documenti con vista ad albero +page.editMetadata.title=Modifica propriet\u00e0 +page.editMetadata.description=Consente di modificare le propriet\u00e0 di un nodo +page.folderDetails.title=Dettagli cartella +page.folderDetails.description=Dettagli cartella +page.folderRules.title=Regole cartella +page.folderRules.description=Regole cartella +page.geographicMap.title=Visualizzazione Google Maps +page.geographicMap.description=Visualizza posizione della foto in Google Maps +page.inlineEdit.title=Modifica in Alfresco Share +page.inlineEdit.description=Modifica i file di testo in Alfresco Share +page.invite.title=Invita +page.invite.description=Invita +page.links.title=Link +page.links.description=Link +page.linkCreateEdit.title=Link: crea o modifica link +page.linkCreateEdit.description=Visualizza un modulo per la creazione o la modifica di un link +page.linksView.title=Link: visualizza vista dettagliata link +page.linksView.description=Visualizza la vista dettagliata dei link +page.login.title=Login +page.logout.title=Logout +page.managePermissions.title=Gestisci autorizzazioni +page.managePermissions.description=Gestisci autorizzazioni +page.myFiles.title=I miei file +page.myFiles.description=Consente di sfogliare i file personali +page.myDocumentLibraries.title=Le mie raccolte documenti +page.myDocumentLibraries.description=Pagina di avvio Le mie raccolte documenti +page.myTasks.title=I miei compiti +page.myTasks.description=Elenco dei compiti attivi e completati. +page.myWorkflows.title=Workflow avviati da me +page.myWorkflows.description=Pagina Workflow avviati da me +page.pendingInvites.title=In attesa +page.pendingInvites.description=Inviti in attesa e Aderisci alle richieste +page.peopleFinder.title=Ricerca persone +page.peopleFinder.description=Pagina Ricerca persone +page.profile.title=Pagina profilo utente +page.profile.description=Pagina Profilo dell'utente +page.rejectInvite.title=Respingi invito +page.rejectInvite.description=Pagina Respingi invito. Consente di respingere una richiesta di invito +page.repository.title=Browser repository +page.repository.description=Consente di esplorare il contenuto dell'intero repository +page.ruleEdit.title=Regole cartella +page.ruleEdit.description=Consente di creare o modificare una regola di una cartella. +page.search.title=Ricerca +page.search.description=Finestra di ricerca +page.sharedFiles.title=File condivisi +page.sharedFiles.description=Consente di sfogliare i file condivisi +page.siteConsole.title=Manager siti +page.siteConsole.description=Pagina Manager siti - strumenti di amministrazione sito +page.siteFinder.title=Ricerca sito +page.siteFinder.description=Pagina Ricerca sito +page.siteIndex.title=Benvenuto +page.siteIndex.description=Pagina di destinazione per gli utenti: verr\u00e0 creato il pannello di controllo del sito dell'utente a cui l'utente verr\u00e0 reindirizzato +page.siteGroups.title=Gruppi del sito +page.siteGroups.description=Gruppi del sito +page.siteMembers.title=Membri del sito +page.siteMembers.description=Membri del sito +page.startWorkflow.title=Avvia workflow +page.startWorkflow.description=Avvia un nuovo workflow +page.taskDetails.title=Dettagli compito +page.taskDetails.description=Pagina che visualizza le informazioni dettagliate del compito +page.taskEdit.title=Modifica compito +page.taskEdit.description=Pagina per la modifica dei dettagli del compito +page.userContent.title=Contenuti modificati dall'utente +page.userContent.description=Elenca i contenuti modificati di recente dall'utente +page.userFollowers.title=Seguaci +page.userFollowers.description=Elenca le persone che seguono l'utente +page.userFollowing.title=Sta seguendo +page.userFollowing.description=Elenca le persone seguite dall'utente +page.userNotifications.title=Impostazioni di notifica utente +page.userNotifications.description=Sezione Cambia impostazioni di notifica nella pagina Profilo dell'utente +page.userCloudAuth.title=Autenticazione cloud utente +page.userCloudAuth.description=Modifica dettagli di autenticazione del cloud +page.userSites.title=Elenco siti utente +page.userSites.description=Elenca i siti a cui appartiene l'utente +page.userTrashcan.title=Cestino utente +page.userTrashcan.description=Elenco di documenti e cartelle eliminate dell'utente attuale +page.wiki.title=Wiki +page.wiki.description=Pagina di destinazione del wiki +page.wikiCreate.title=Modulo creazione wiki +page.wikiCreate.description=Visualizza un modulo per la creazione di una nuova pagina wiki +page.wikiPage.title=Wiki +page.wikiPage.description=Visualizza una pagina wiki +page.workspace.title=Pannello di controllo degli spazi di lavoro per documenti +page.workspace.description=Pagina del pannello di controllo degli spazi di lavoro per documenti +page.workflowDetails.title=Dettagli workflow +page.workflowDetails.description=Pagina Dettagli workflow + +## Dashboard page titles and descriptions +page.siteDashboard.title=Pannello di controllo del sito +page.siteDashboard.description=Pagina del pannello di controllo del sito di collaborazione +page.userDashboard.title=Pannello di controllo dell'utente +page.userDashboard.description=Pagina del pannello di controllo dell'utente +page.meeting_workspace.title=Pannello di controllo degli spazi di lavoro per riunioni +page.meeting_workspace.description=Pagina del pannello di controllo degli spazi di lavoro per riunioni + +page.error.500.title=Alfresco Share » - errore di sistema +page.error.500.header=Errore relativo alla pagina... +page.error.500.detail=

Potrebbe essersi verificato un errore o un elemento potrebbe essere stato rimosso o eliminato, verificare che l'URL sia corretto.

In alternativa, l'utente potrebbe non disporre delle autorizzazioni necessarie per visualizzare la pagina (potrebbe trovarsi in un sito privato) o potrebbe essersi verificato un errore interno. Provare a contattare il reparto IT.

Se si sta provando ad accedere alla propria pagina iniziale che non \u00e8 pi\u00f9 disponibile, \u00e8 necessario cambiarla facendo clic sul proprio nome sulla barra degli strumenti.

+page.error.500.nav.dashboard=Torna al pannello di controllo personale +page.error.500.footer=Alfresco Software Inc. © 2005-2023 Tutti i diritti riservati. + +## Title bar component titles for pages that use the simple-title component +title.repository=Repository +title.browser=Browser +title.siteFinder=Ricerca sito +title.peopleFinder=Ricerca persone +title.myTasks=I miei compiti + +## Site Visibility +site.visibility.label.PUBLIC=Pubblico +site.visibility.label.MODERATED=Moderato +site.visibility.label.PRIVATE=Privato +site.visibility.description.PUBLIC=Tutte le persone dell'organizzazione possono accedere a questo sito. +site.visibility.description.MODERATED=Tutte le persone dell'organizzazione possono trovare questo sito e richiedere accesso al sito. L'accesso viene concesso dai manager del sito. +site.visibility.description.PRIVATE=Solo le persone aggiunte da un manager del sito possono trovare e utilizzare questo sito. + +## Roles +role.SiteManager=Manager +role.SiteManager.description=ha diritti completi su tutti i contenuti del sito, sia quelli creati personalmente sia quelli creati da altri membri del sito. +role.Collaborator=Collaboratore +role.Collaborator.description=ha diritti completi sui contenuti di cui \u00e8 proprietario e ha il diritto di modificare ma non di eliminare i contenuti creati da altri. +role.SiteCollaborator=Collaboratore +role.SiteCollaborator.description=ha diritti completi sui contenuti di cui \u00e8 proprietario e ha il diritto di modificare ma non di eliminare i contenuti creati da altri membri del sito. +role.Contributor=Contributore +role.Contributor.description=ha diritti completi sui contenuti di cui \u00e8 proprietario e non pu\u00f2 modificare n\u00e9 eliminare i contenuti creati da altri. +role.SiteContributor=Contributore +role.SiteContributor.description=ha diritti completi sui contenuti di cui \u00e8 proprietario e non pu\u00f2 modificare n\u00e9 eliminare i contenuti creati da altri membri del sito. +role.Consumer=Consumatore +role.Consumer.description=ha diritti di sola lettura e non pu\u00f2 creare contenuti personali. +role.SiteConsumer=Consumatore +role.SiteConsumer.description=ha diritti di sola lettura su un sito e non pu\u00f2 creare contenuti personali. +role.Coordinator=Coordinatore +role.Coordinator.description=ha diritti completi su tutti i contenuti, sia quelli creati personalmente sia quelli creati da altri. +role.Editor=Redattore +role.Editor.description=ha il diritto di modificare le propriet\u00e0 dei file e di eseguire il Check In e il Check Out dei file, ma non pu\u00f2 creare contenuti personali. + +roles.readassociations=Consumatore + +roles-tooltip.header=Informazioni sui ruoli +roles-tooltip.docs-url-label=Visualizza altre info +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Tag +taglibrary.populartagslink=Scegliere tra i tag pi\u00f9 comuni in questo sito +taglibrary.msg.failedLoadTags=Impossibile caricare i tag dal server (connessione non disponibile?) +taglibrary.msg.unableLoadTags=Impossibile caricare i tag: {0} +taglibrary.tip.removeTag=Rimuovi tag +taglibrary.tip.help=Separare i tag con spazi. Per unire due o pi\u00f9 parole, utilizzare le "virgolette quotes" + +## YUI Editor keys +yuieditor.toolbar.group.font=Stile font +yuieditor.toolbar.group.lists=Elenchi +yuieditor.toolbar.group.link=Collega +yuieditor.toolbar.item.createorderedlist=Elenco ordinato +yuieditor.toolbar.item.createunorderedlist=Elenco non ordinato +yuieditor.toolbar.item.fontcolor=Colore font +yuieditor.toolbar.item.backgroundcolor=Colore di sfondo +yuieditor.toolbar.item.bold=Grassetto CTRL + MAIUSC + B +yuieditor.toolbar.item.italic=Corsivo CTRL + MAIUSC + I +yuieditor.toolbar.item.underline=Sottolineato CTRL + MAIUSC + U +yuieditor.toolbar.item.link=Link HTML CTRL + MAIUSC + L + +## Document Library Drop-down Menus +menu.select=Seleziona +menu.select.all=Tutto +menu.select.none=Nessuno +menu.select.invert=Inverti selezione +menu.select.folders=Cartelle +menu.select.documents=Documenti + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Crea documento da modello +menu.create-content.by-template-folder=Crea cartella da modello +menu.selected-items=Elementi selezionati... +menu.selected-items.copy=Copia in... +menu.selected-items.move=Sposta in... +menu.selected-items.delete=Elimina +menu.selected-items.download=Scarica come file zip +menu.selected-items.assign-workflow=Avvia workflow... +menu.selected-items.manage-permissions=Gestisci autorizzazioni... +menu.selected-items.deselect-all=Deseleziona tutto +menu.selected-items.cloudSync=Sincronizza con cloud +menu.selected-items.cloudUnsync=Desincronizza da cloud +menu.selected-items.cloudRequestSync=Richiedi sincronizzazione + +## Document Library Actions +actions.document.assign-workflow=Avvia workflow +actions.document.cancel-editing=Annulla modifica +actions.document.cancel-editing-unlock=Sblocca documento +actions.document.change-type=Cambia tipo +actions.document.copy-to=Copia in... +actions.document.delete=Elimina documento +actions.document.download=Scarica +actions.document.download-again=Scarica +actions.document.download-original=Scarica originale +actions.document.edit-metadata=Modifica propriet\u00e0 +actions.document.edit-offline=Modifica offline +actions.document.edit-online=Modifica in Microsoft Office\u2122 +message.edit-online.supported_office_version_required=La versione di Microsoft Office utilizzata non \u00e8 supportata. Provare ad aggiornare Microsoft Office. Si noti che Chrome non funziona pi\u00f9 con Office 2007 e Office 2008. +actions.document.extract-metadata=Estrai metadati +actions.document.execute-script=Esegui script +actions.document.inline-edit=Modifica in Alfresco Share +actions.document.increment-counter=Incrementa contatore +actions.document.locate=Individua file +actions.document.manage-aspects=Gestisci aspetti +actions.document.manage-permissions=Gestisci autorizzazioni +actions.document.take-ownership=Diventa proprietario +actions.document.move-to=Sposta in... +actions.document.simple-approve=Approva +actions.document.simple-reject=Respingi +actions.document.upload-new-version=Carica nuova versione +actions.document.view=Visualizza nel browser +actions.document.view-google-map=Visualizza in Google Maps +actions.document.view-original=Visualizza documento originale +actions.document.view-source-repository=Visualizza nel repository fonte +actions.document.view-working-copy=Visualizza copia di lavoro +actions.document.publish=Pubblica +actions.document.transform=Trasforma +actions.document.transform-image=Trasforma in immagine +actions.document.publish-content=Pubblica contenuti +actions.document.cloud-sync=Sincronizza con cloud +actions.document.cloud-unsync=Desincronizza da cloud +actions.document.view-in-cloud=Visualizza nel cloud +actions.document.request-sync=Richiedi sincronizzazione +actions.document.unzip-to=Decomprimi in... +actions.folder.download=Scarica come file zip +actions.folder.change-type=Cambia tipo +actions.folder.copy-to=Copia in... +actions.folder.delete=Elimina cartella +actions.folder.edit-metadata=Modifica propriet\u00e0 +actions.folder.locate=Individua cartella +actions.folder.manage-aspects=Gestisci aspetti +actions.folder.manage-permissions=Gestisci autorizzazioni +actions.folder.take-ownership=Diventa proprietario +actions.folder.move-to=Sposta in... +actions.folder.rules=Gestisci regole +actions.folder.simple-approve=Approva +actions.folder.simple-reject=Respingi +actions.folder.view-details=Visualizza dettagli +actions.folder.view-source-repository=Visualizza nel repository fonte +actions.folder.cloud-sync=Sincronizza con cloud +actions.folder.cloud-unsync=Desincronizza da cloud +actions.folder.view-in-cloud=Visualizza nel cloud +actions.link.delete=Elimina link +actions.link.locate=Individua elemento collegato +actions.editOnline.failure=Il file ''{0}'' non pu\u00f2 essere aperto per le modifiche in linea. Uno dei seguenti plugin deve essere installato nel tuo browser. \n Per Windows: Microsoft Office 2010 \n Per Mac OS X: Plug-in del browser SharePoint +actions.editOnline.invalid=Il file ''{0}'' non pu\u00f2 essere modificato in linea perch\u00e9 il suo percorso contiene caratteri non consentiti dal protocollo SPP.\nI caratteri non validi sono i seguenti: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' \u00e8 sincronizzato e attraverso questa eliminazione il documento sar\u00e0 rimosso localmente e dal cloud. +actions.synced.folder.delete=
''{0}'' \u00e8 sincronizzato e attraverso questa eliminazione il contenuto di questa cartella sar\u00e0 rimosso localmente e dal cloud. +actions.synced.remove-sync=
Se l'oggetto deve rimanere nel cloud, eseguire immediatamente l'azione ''Rimuovi sincronizzazione''. +actions.synced.cloud.document.delete=
''{0}'' \u00e8 sincronizzato e attraverso questa eliminazione il documento sar\u00e0 rimosso solo localmente. +actions.synced.cloud.folder.delete=
''{0}'' \u00e8 sincronizzato e attraverso questa eliminazione il contenuto di questa cartella sar\u00e0 rimosso solo localmente. +actions.synced.cloud.document.delete.on.prem=
''{0}'' \u00e8 sincronizzato e questa operazione di eliminazione rimuove il documento on premise e localmente. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' \u00e8 sincronizzato e questa operazione di eliminazione rimuove la cartella e ogni suo contenuto on premise e localmente. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=Impossibile trovare l'elemento collegato: la destinazione \u00e8 stata cancellata. +message.change-type.success=Il tipo di documento ''{0}'' \u00e8 stato cambiato con successo +message.change-type.failure=Non \u00e8 stato possibile cambiare il tipo di documento ''{0}'' +message.confirm.delete=Eliminare ''{0}''? +message.delete.success=''{0}'' \u00e8 stato eliminato +message.delete.failure=Impossibile eliminare ''{0}'' +message.multiple-delete.please-wait=Attendere. Eliminazione dei file in corso... +message.confirm.take-ownership.title=Confermare l''operazione ''Diventa proprietario''? +message.confirm.take-ownership=L''utente diventer\u00e0 proprietario di ''{0}'' e le autorizzazioni del proprietario precedente potrebbero essere soggette a restrizioni. +message.take-ownership.success=L''utente \u00e8 ora proprietario di ''{0}'' +message.take-ownership.failure=Impossibile assumere la propriet\u00e0 di ''{0}'' +message.details.success=Dettagli aggiornati +message.details.failure=Impossibile aggiornare i dettagli +message.details.failure.name=Impossibile rinominare l'elemento. Potrebbe esistere un altro elemento con lo stesso nome. +message.details.failure.more.max.length=Una delle propriet\u00e0 ha dimensione superiore al valore massimo. +message.sync.success=Sincronizzazione creata +message.sync.failure=Impossibile creare sincronizzazione +message.sync.unavailable=Impossibile connettersi al server di sincronizzazione. +message.unsync.confirm=Desincronizzare ''{0}''? +message.unsync.success=Sincronizzazione rimossa +message.unsync.failure=Impossibile rimuovere sincronizzazione +message.request.sync.success=Sincronizzazione richiesta +message.request.sync.failure=Impossibile richiedere sincronizzazione +message.error=Impossibile accedere alla libreria documenti +message.empty=Nessun elemento +message.empty.subfolders=Nessun elemento. Scegliere ''{0}'' per vedere {1} sottocartelle qui. +message.empty.subfolders.link=Mostra cartelle +message.edit-offline.failure=Impossibile modificare ''{0}''. +message.edit-offline.success=\u00c8 ora possibile modificare ''{0}'' +message.edit-offline.success.ie7=Scaricare il documento utilizzando il pulsante qui sotto. +message.edit-online.office.failure=Impossibile avviare MS Office. +message.edit-online.office.path.failure=La funzione di modifica in linea non \u00e8 disponibile perch\u00e9 l'URL ha una lunghezza superiore a 260 caratteri. Utilizzare un percorso pi\u00f9 superficiale per ridurre la lunghezza. +message.edit-online-aos.no_supported_environment=Questa funzione \u00e8 disponibile solo in Windows o Mac OS X. +message.edit-online-aos.starting_office_failed=Impossibile aprire Microsoft Office. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office bloccato +message.edit-online-aos.plugin_blocked.body.firefox=Fare clic sulla barra degli strumenti di Firefox per continuare. +message.edit-online-aos.plugin_blocked.body.chrome=Fare clic sull'indicatore bloccato nella barra degli indirizzi di Chrome per continuare. +message.edit-online-aos.plugin_blocked.body.safari=Fare clic su Considera attendibile per continuare. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=La versione di Microsoft Office utilizzata non \u00e8 supportata. Provare ad aggiornare Microsoft Office. +message.edit-online-aos.edit_offline_locked.title={0} sta modificando questo file +message.edit-online-aos.edit_offline_locked.message=Tutte le modifiche apportate potrebbero andare perse. +message.edit-online-aos.edit_offline_locked.confirm=Continua +message.edit-online-aos.edit_offline_locked.cancel=Annulla +message.edit-online-aos.edit_locked.title={0} sta modificando questo file +message.edit-online-aos.edit_locked.message=Il documento \u00e8 attualmente bloccato. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=Impossibile sbloccare ''{0}''. +message.edit-cancel.failure=Impossibile annullare la modifica di ''{0}''. +message.edit-cancel.success=La modifica di ''{0}'' \u00e8 stata annullata. +message.unlock-document.success=La modifica di ''{0}'' \u00e8 stata sbloccata. +message.file-dnd-move.failure=Non \u00e8 stato possibile spostare il documento. +message.increment-counter.success=Contatore incrementato +message.increment-counter.failure=Impossibile incrementare il contatore. +message.extract-metadata.success=Estrazione metadati riuscita. +message.extract-metadata.failure=Impossibile estrarre i metadati. +message.execute-script.success=Esecuzione script riuscita +message.execute-script.failure=Impossibile eseguire lo script +message.insitu-edit.name.failure=Impossibile rinominare il file. Potrebbe esistere un altro file con lo stesso nome. +message.loading=Caricamento della libreria documenti in corso... +message.simple-workflow.failure=Impossibile completare l'azione del workflow. +message.simple-workflow.approved=Elemento contrassegnato come approvato +message.simple-workflow.rejected=Elemento contrassegnato come respinto +message.simple-workflow.failed=Impossibile completare l'azione del workflow. +message.transform.success=Trasformazione documento ''{0}'' riuscita +message.transform.failure=Impossibile trasformare il documento +message.transform-image.success=Trasformazione immagine ''{0}'' riuscita +message.transform-image.failure=Impossibile trasformare il documento +message.new-version-upload.success=Caricamento file completato con successo. L'anteprima potrebbe non mostrare la versione pi\u00f9 recente del documento. Ricaricare la pagina successivamente per aggiornarla. + +message.insitu-edit.tag.failure=Impossibile modificare il tag + +## Drag and Drop +message.dnd.allColumnsAreFull=Impossibile aggiungere l'elemento perch\u00e9 tutte le colonne sono piene + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Conformabile +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Validit\u00e0 +aspect.cm_emailed=Inviato via e-mail +aspect.cm_generalclassifiable=Classificabile +aspect.cm_summarizable=Riepilogabile +aspect.cm_taggable=Taggabile +aspect.cm_templatable=Modellabile +aspect.cm_versionable=Gestibile con versioni +aspect.emailserver_aliasable=Alias e-mail +aspect.app_inlineeditable=Modificabile in editor +aspect.cm_geographic=Geografico +aspect.exif_exif=EXIF +aspect.exif_resolution=Risoluzione +aspect.exif_camera=Dettagli della fotocamera +aspect.audio_audio=Audio +aspect.cm_indexControl=Controllo indice +aspect.dp_restrictable=Con possibilit\u00e0 di restrizioni +aspect.cm_attachable=Allegati + +# Groups +group.everyone=TUTTI + +# Types +type.cm_content=Tipo di contenuto di base +type.cm_folder=Tipo di cartella di base +type.trx_transferTarget=Destinazione trasferimento +type.trx_fileTransferTarget=Destinazione del trasferimento file + +# Generic Form labels +form.set.general=Generale +form.set.operations=Operazioni + +# Runtime +runtime.field.FreeMemory=Memoria disponibile +runtime.field.MaxMemory=Memoria massima +runtime.field.TotalMemory=Memoria totale + +# Repository Server +repository-server.set.version=Informazioni sulla versione +repository-server.field.Name=Nome +repository-server.field.Id=ID +repository-server.field.Edition=Edizione +repository-server.field.Schema=Schema +repository-server.field.Version=Versione +repository-server.field.VersionLabel=Etichetta +repository-server.field.VersionMinor=Minore +repository-server.field.VersionMajor=Maggiore +repository-server.field.VersionRevision=Revisione +repository-server.field.VersionBuild=Build +repository-server.field.VersionNumber=Numero + +# Repository Installed +repository-installed.set.version=Informazioni sulla versione +repository-installed.field.Name=Nome +repository-installed.field.Id=ID +repository-installed.field.Edition=Edizione +repository-installed.field.Schema=Schema +repository-installed.field.Version=Versione +repository-installed.field.VersionLabel=Etichetta +repository-installed.field.VersionMinor=Minore +repository-installed.field.VersionMajor=Maggiore +repository-installed.field.VersionRevision=Revisione +repository-installed.field.VersionBuild=Build +repository-installed.field.VersionNumber=Numero + +# Authority +authority.field.NumberOfGroups=Numero gruppi +authority.field.NumberOfUsers=Numero utenti + +# License +header.license= +license.field.Subject=Oggetto licenza +license.field.Days=Giorni +license.field.Holder=Titolare +license.field.ValidUntil=Valida fino al +license.field.RemainingDays=Giorni residui +license.field.Issued=Data di rilascio +license.field.Issuer=Autorit\u00e0 di rilascio +license.field.HeartBeatDisabled=Heartbeat disabilitato +license.field.LicenseMode=Modalit\u00e0 licenza +license.field.CloudSyncKeyAvailable=Chiave di sincronizzazione cloud disponibile +license.field.MaxDocs=Numero massimo oggetti contenuto +license.field.MaxUsers=Numero massimo utenti +license.field.Users=Utenti +license.field.Documents=Oggetti contenuto +license.field.Info=Il valore visualizzato potrebbe essere zero se la licenza non impone limiti al numero di utenti. + +# Pdf2Swf +pdf2swf.field.Available=Disponibile +pdf2swf.field.VersionString=Versione + +# Open Office +openoffice.field.available=Disponibile +openoffice.field.ooName=Nome +openoffice.field.ooOpenSourceContext=Contesto open source +openoffice.field.ooSetupExtension=Estensione +openoffice.field.ooSetupVersion=Versione +openoffice.field.ooSetupVersionAboutBox=Informazioni +openoffice.field.ooXMLFileFormatName=Formato file XML +openoffice.field.ooXMLFileFormatVersion=Versione formato file XML +openoffice.error=Impossibile visualizzare le informazioni su OpenOffice +openoffice.error.404=Impossibile trovare le informazioni su OpenOffice. Forse la propriet\u00e0 "ooo.enabled" \u00e8 impostata su "false" + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Abilitato +openoffice-subsystem.field.ooo.exe=Exe +openoffice-subsystem.field.ooo.port=Porta + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Abilitato +ooojodconverter.field.jodconverter.maxTasksPerProcess=Numero massimo compiti per processo +ooojodconverter.field.jodconverter.officeHome=Home page ufficio +ooojodconverter.field.jodconverter.portNumbers=Numeri porta +ooojodconverter.field.jodconverter.taskExecutionTimeout=Timeout esecuzione compiti +ooojodconverter.field.jodconverter.taskQueueTimeout=Timeout coda compiti + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Disponibile +transformer-imagemagick.field.VersionString=Informazioni sulla versione + +# File servers +fileservers.set.filesystem=File system +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Livello di accesso predefinito +fileservers.field.filesystem.acl.global.domainAccessControls=Controlli accesso dominio +fileservers.field.filesystem.acl.global.protocolAccessControls=Controlli accesso protocollo +fileservers.field.filesystem.acl.global.userAccessControls=Controlli accesso utente +fileservers.field.filesystem.domainMappings=Mappature dominio +fileservers.field.filesystem.name=Nome file system +fileservers.field.filesystem.name.description=Il nome utilizzato per i filesystem quando si accede tramite CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=Rilevamento automatico WINS abilitato +fileservers.field.cifs.WINS.primary=WINS principale +fileservers.field.cifs.WINS.secondary=WINS secondario +fileservers.field.cifs.bindto=Associa a +fileservers.field.cifs.broadcast=Trasmissione +fileservers.field.cifs.disableNIO=Disabilita NIO +fileservers.field.cifs.disableNativeCode=Disabilita codice nativo +fileservers.field.cifs.domain=Dominio +fileservers.field.cifs.enabled=CIFS abilitato +fileservers.field.cifs.hostannounce=Annuncio host +fileservers.field.cifs.ipv6.enabled=IPV6 abilitato +fileservers.field.cifs.netBIOSSMB.datagramPort=Porta datagramma SMB NetBIOS +fileservers.field.cifs.netBIOSSMB.namePort=Porta nome SMB NetBIOS +fileservers.field.cifs.netBIOSSMB.sessionPort=Porta sessione SMB NetBIOS +fileservers.field.cifs.serverName=Nome server +fileservers.field.cifs.sessionDebug=Debug sessione +fileservers.field.cifs.sessionTimeout=Timeout sessione +fileservers.field.cifs.tcpipSMB.port=Porta SMB TCP/IP +fileservers.field.ftp.dataPortFrom=Dataport di inizio +fileservers.field.ftp.dataPortTo=Dataport di fine +fileservers.field.ftp.enabled=FTP abilitato +fileservers.field.ftp.keyStore=Archivio chiavi +fileservers.field.ftp.passphrase=Passphrase +fileservers.field.ftp.port=Porta +fileservers.field.ftp.requireSecureSession=Richiedi sessione sicura +fileservers.field.ftp.sessionDebug=Debug sessione +fileservers.field.ftp.sslEngineDebug=Debug motore SSL +fileservers.field.ftp.trustStore=Deposito di attendibilit\u00e0 + +# Sysadmin +sysadmin.field.alfresco.context=Contesto repository +sysadmin.field.alfresco.host=Host repository +sysadmin.field.alfresco.port=Porta repository +sysadmin.field.alfresco.protocol=Protocollo repository +sysadmin.field.server.allowedusers=Utenti consentiti +sysadmin.field.server.maxusers=Numero massimo utenti +sysadmin.field.server.transaction.allow-writes=Consenti scritture +sysadmin.field.share.context=Contesto Share +sysadmin.field.share.host=Host Share +sysadmin.field.share.port=Porta Share +sysadmin.field.share.protocol=Protocollo Share + +# Email (Inbound) +email-inbound.set.service=Servizio e-mail in ingresso +email-inbound.field.email.inbound.enabled=Servizio abilitato +email-inbound.field.email.inbound.unknownUser=Utente sconosciuto +email-inbound.set.server=Server e-mail in ingresso +email-inbound.field.email.server.allowed.senders=Mittenti consentiti +email-inbound.field.email.server.blocked.senders=Mittenti bloccati +email-inbound.field.email.server.enabled=Server abilitato +email-inbound.field.email.server.domain=Dominio +email-inbound.field.email.server.port=Porta +email-inbound.field.email.server.connections.max=Numero massimo connessioni +email-inbound.set.tls=Transport Layer Security +email-inbound.field.email.server.requireTLS=Richiedi TLS (Transport Layer Security) +email-inbound.field.email.server.hideTLS=TLS (Transport Layer Security) non restituito da EHELO +email-inbound.field.email.server.enableTLS=Accetta TLS (Transport Layer Security) + +# Email (Outbound) +email-outbound.set.auth=Autenticazione +email-outbound.set.test-message=Messaggio di test +email-outbound.field.mail.host=Host +email-outbound.field.mail.port=Porta +email-outbound.field.mail.protocol=Protocollo +email-outbound.field.mail.encoding=Codifica +email-outbound.field.mail.from.default=Indirizzo mittente predefinito +email-outbound.field.mail.from.enabled=Campo Da abilitato +email-outbound.field.mail.smtp.auth=Autenticazione SMTP obbligatoria +email-outbound.field.mail.smtps.auth=Autenticazione SMTPS obbligatoria +email-outbound.field.mail.username=Nome utente +email-outbound.field.mail.password=Password +email-outbound.field.mail.testmessage.send=Invia messaggio di test all'avvio +email-outbound.field.mail.testmessage.to=A +email-outbound.field.mail.testmessage.subject=Oggetto +email-outbound.field.mail.testmessage.text=Messaggio + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Percorso cartella home page +imap.field.imap.config.home.rootPath=Percorso radice home page +imap.field.imap.config.home.store=Deposito home page +imap.field.imap.server.attachments.extraction.enabled=Estrazione abilitata +imap.field.imap.config.ignore.extraction=Ignora estrazione +imap.field.imap.config.server.mountPoints=Punti di montaggio +imap.field.imap.mail.from.default=Invia e-mail da indirizzo predefinito +imap.field.imap.mail.to.default=Ricevi e-mail a indirizzo predefinito +imap.field.imap.server.enabled=Abilitato +imap.field.imap.server.host=Host +imap.field.imap.server.port=Porta + +# Activities Feed +activities.set.activities=Feed attivit\u00e0 +activities.field.feed.notifier.enabled=Notifiche feed abilitate +activities.field.feed.notifier.repeatIntervalMins=Intervallo di ripetizione (min) +activities.field.feed.max.ageMins=Durata massima (min) +activities.field.feed.max.size=Dimensioni massime + +# Subscriptions +subscriptions.field.subscriptions.enabled=Abilitato + +# Workflow +workflow.field.message=Messaggio +workflow.field.comment=Commento +workflow.field.assign_to=Assegna a +workflow.field.review_group=Gruppo di esame +workflow.field.reviewer=Esaminatore +workflow.field.reviewers=Esaminatori +workflow.field.due=In scadenza +workflow.field.priority=Priorit\u00e0 +workflow.field.outcome=Risultato +workflow.field.enabled.activiti=Abilitato +workflow.field.enabled.jbpm=Abilitato +workflow.field.definitions.visible=Definizioni visibili +workflow.field.number.tasks=Numero di compiti +workflow.field.number.definitions=Numero di definizioni +workflow.field.number.workflows=Numero di workflow +workflow.field.requiredApprovePercent=Percentuale di approvazioni richiesta +workflow.set.general=Generale +workflow.set.assignee=Assegnatario +workflow.set.assignees=Assegnatari +workflow.set.information=Informazioni +workflow.set.items=Elementi +workflow.set.outcome=Risultato +workflow.set.other=Altre opzioni +workflow.set.task.info=Informazioni +workflow.set.workflow.more_info=Altre info +workflow.set.task.progress=Avanzamento +workflow.set.response=Risposta +workflow.set.engine.activiti=Motore Activiti +workflow.set.engine.jbpm=Motore JBPM +workflow.task.error=Caricamento del compito non riuscito. +workflow.task.error.404=Compito inesistente o annullato. +workflow.task.invite.title=Sito {0} +workflow.task.invite.subtitle=\u00c8 stato ricevuto un invito a partecipare al sito {0}. +workflow.task.invite.role=Il ruolo sar\u00e0 {0}. +workflow.task.invite.accepted={0} {1} ha accettato l''invito a partecipare al sito {2}. +workflow.task.invite.rejected={0} {1} ha respinto l''invito a partecipare al sito {2}. +workflow.task.request.invite.title=L''utente {0} ha richiesto di partecipare al sito {1}. +workflow.cancel.title=Annulla workflow +workflow.cancel.label=Annullare il workflow? +workflow.cancel.feedback=Annullamento del workflow in corso... +workflow.cancel.success=Il workflow \u00e8 stato annullato +workflow.cancel.failure=Impossibile annullare il workflow +workflow.delete.title=Elimina workflow +workflow.delete.label=Eliminare il workflow? +workflow.delete.feedback=Eliminazione del workflow in corso... +workflow.delete.success=Il workflow \u00e8 stato eliminato +workflow.delete.failure=Impossibile eliminare il workflow +workflow.no_message=(Nessun messaggio) +tool.workflow.activiti.tools=Strumenti di Activiti +tool.workflow.activiti.admin.link=Console dei workflow di Activiti + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Gestione ricerca +tool.searchmanager.description=Gestione ricerca + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Abilitato +lucene.field.dir.indexes=Directory indici +lucene.field.index.recovery.mode=Modalit\u00e0 recupero indici +lucene.field.lucene.indexer.contentIndexingEnabled=Indicizzazione contenuto abilitata +lucene.field.index.tracking.disableInTransactionIndexing=Disabilita indicizzazione in transazione + +lucene.set.backup=Backup +lucene.backup.field.dir.indexes.backup=Directory di backup indice +lucene.backup.field.index.backup.cronExpression=Espressione Cron di backup + +lucene.set.advanced=Avanzate +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Indicizzazione contenuto abilitata +lucene.advanced.field.fts.indexer.batchSize=Dimensioni batch indicizzazione +lucene.advanced.field.lucene.maxAtomicTransformationTime=Tempo di trasformazione atomica massimo +lucene.advanced.field.index.reindexMissingContent.cronExpression=Contenuto mancante in espressione Cron +lucene.advanced.field.indexer.maxFieldLength=Numero massimo token indicizzati per documento +lucene.field.indexer.mergerMaxMergeDocs=Numero massimo documenti di unione +lucene.field.indexer.mergerMergeFactor=Fattore di unione massimo + +# Transform action form +transform.field.mime-type=Formato richiesto +transform.field.destination-folder=Destinazione + +# Transform Image action form +transform-image.field.mime-type=Formato richiesto +transform-image.field.convert-command=Opzioni +transform-image.field.destination-folder=Destinazione + +publish-content.field.publish-channel-id=Pubblicazione canali +publish-content.field.unpublish=Non pubblicare +publish-content.field.status-update=Aggiornamento di stato +publish-content.field.status-update-channel-id=Aggiornamento di stato canali + +# Execute Script action form +script.field.script-ref=Script + +# Solr +solr.set.spacesstore=Propriet\u00e0 deposito principale +solr.set.archivestore=Archivia propriet\u00e0 deposito +solr.field.search.solrTrackingSupport.enabled=Tracciamento abilitato +solr.help.search.solrTrackingSupport.enabled=Abilitare l'opzione per consentire a Solr di connettersi a questo server e di tenere traccia e indicizzare gli aggiornamenti +solr.field.solr.host=Nome host Solr +solr.help.field.solr.host=Nome host sul quale \u00e8 in esecuzione il server Solr. Se il server \u00e8 in esecuzione sulla stessa macchina, utilizzare un host locale. +solr.field.solr.port=Porta Solr (senza SSL) +solr.help.field.solr.port=La porta http (non protetta) del server di applicazioni su cui Solr \u00e8 in esecuzione. Utilizzata solo se Solr \u00e8 configurato per l'esecuzione senza comunicazioni protette. +solr.field.solr.port.ssl=Porta SSL Solr +solr.help.field.solr.port.ssl=La porta https del server di applicazioni su cui Solr \u00e8 in esecuzione. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indicizzazione in corso +solr.field.tracker.alfresco.lag=Ritardo indice (secondi) +solr.field.tracker.alfresco.last.indexed.txn=Ultima transazione indicizzata +solr.field.tracker.alfresco.approx.txns.remaining=Numero approssimativo di transazioni da indicizzare +solr.field.tracker.alfresco.approx.indexing.time.remaining=Tempo di indicizzazione approssimativo residuo +solr.help.field.tracker.alfresco.lag=Gli indici Solr vengono aggiornati in background. Questa opzione specifica il tempo (in secondi) in cui l'indice full-text di Solr \u00e8 in ritardo rispetto agli aggiornamenti del repository. +solr.field.tracker.archive.active=Indicizzazione in corso +solr.field.tracker.archive.lag=Ritardo indice (secondi) +solr.field.tracker.archive.last.indexed.txn=Ultima transazione indicizzata +solr.field.tracker.archive.approx.txns.remaining=Numero approssimativo di transazioni da indicizzare +solr.field.tracker.archive.approx.indexing.time.remaining=Tempo di indicizzazione approssimativo residuo + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Espressione Cron di backup +solr.field.solr.backup.alfresco.remoteBackupLocation=Posizione di backup +solr.field.solr.backup.alfresco.numberToKeep=Backup da salvare +solr.help.solr.backup.alfresco.remoteBackupLocation=Percorso completo della posizione del filesystem del server Solr in cui \u00e8 stato archiviato il backup dell'indice +solr.help.solr.backup.alfresco.numberToKeep=Il numero di backup da salvare (incluso l'ultimo backup) +solr.field.solr.backup.archive.cronExpression=Espressione Cron di backup +solr.field.solr.backup.archive.remoteBackupLocation=Posizione di backup +solr.field.solr.backup.archive.numberToKeep=Backup da salvare +solr.help.solr.backup.archive.remoteBackupLocation=Percorso completo della posizione del filesystem del server Solr in cui \u00e8 stato archiviato il backup dell'indice +solr.help.solr.backup.archive.numberToKeep=Il numero di backup da salvare (incluso l'ultimo backup) + +# searchmanager +searchmanager.field.sourceBeanName=Servizio di ricerca + +## Tooltips +tooltip.path=Percorso: {0} +tooltip.site=Sito: {0} + +## Create content +create-content.text=Testo normale... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Cartella + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Selezionare il mese +calendar.widget_control_config.label_year=Immettere l'anno +calendar.widget_control_config.label_invalid_year=Immettere un anno valido + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Collega a: {0} +details.created-by={0} creato da {1} +details.created-in-site={0} creato in {1} +details.editing-started-by=Modifica di {0} avviata da {1} +details.editing-started-in-site=Modifica di {0} avviata in {1} +details.modified-by={0} modificato da {1} +details.modified-in-site={0} modificato in {1} +details.description.none=Nessuna descrizione +details.tags.none=Nessun tag +details.categories.none=Nessuna categoria +details.user.deleted=''{0}'' (utente eliminato) + +## Social Interactions +# Favourite +favourite.document.add.tip=Aggiungi documento ai preferiti +favourite.document.add.label=Preferito +favourite.document.remove.tip=Rimuovi documento dai preferiti +favourite.folder.add.tip=Aggiungi cartella ai preferiti +favourite.folder.add.label=Preferito +favourite.folder.remove.tip=Rimuovi cartella dai preferiti +favourite.imap-site.add.tip=Aggiungi sito ai preferiti IMAP +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Rimuovi sito dai preferiti IMAP +favourite.site.add.tip=Aggiungi sito ai preferiti +favourite.site.add.label=Preferito +favourite.site.remove.tip=Rimuovi sito dai preferiti +favourite.message.failure=Impossibile salvare il preferito +# Like +like.document.add.tip=Aggiungi Mi piace al documento +like.document.add.label=Mi piace +like.document.remove.tip=Non mi piace +like.folder.add.tip=Aggiungi Mi piace alla cartella +like.folder.add.label=Mi piace +like.folder.remove.tip=Non mi piace +like.site.add.tip=Aggiungi Mi piace al sito +like.site.add.label=Mi piace +like.site.remove.tip=Non mi piace +like.message.failure=Impossibile salvare la preferenza +# Quickshare +quickshare.link.label=Link pubblico +quickshare.link.tooltip=Premere ctrl-c per copiare +quickshare.link.tooltip.mac=Premere cmd-c per copiare +quickshare.view.label=Visualizza +quickshare.unshare.label=Rimuovi condivisione +quickshare.document.shared.label=Condiviso +quickshare.document.shared.tip=Questo documento \u00e8 condiviso (fare clic per altre opzioni) +quickshare.document.share.label=Condividere +quickshare.document.share.tip=Condividi documento +quickshare.document.share.failure=Impossibile condividere il documento +quickshare.document.unshared.label=Condividere +quickshare.document.unshared.tip=Condividi documento +quickshare.document.unshare.success=Il documento non \u00e8 pi\u00f9 condiviso +quickshare.document.unshare.failure=Impossibile rimuovere la condivisione del documento +quickshare.document.unshare.user.failure=Non si dispone delle autorizzazioni appropriate per eseguire l'azione Rimuovi condivisione. +quickshare.linkshare.label=Condividi con +# LinkShare +linkshare.action.email.label=Condividi tramite e-mail +linkshare.action.email.subject=File condiviso da Alfresco Content Services +linkshare.action.email.body=File {1} condiviso da Alfresco Content Services, disponibile qui: {0} +linkshare.action.facebook.label=Condividi tramite Facebook +linkshare.action.facebook.message=File {1} condiviso da Alfresco Content Services +linkshare.action.twitter.label=Condividi tramite Twitter +linkshare.action.twitter.message=File {1} condiviso da Alfresco Content Services +linkshare.action.google-plus.label=Condividi tramite Google+ + + +# Comment +comment.document.tip=Aggiungi commento al documento +comment.document.label=Commento +comment.folder.tip=Aggiungi commento alla cartella +comment.folder.label=Commento + +#Dashlets +dashlet.help.tooltip=Mostra aiuto per questo dashlet +dashlet.rss.tooltip=Sottoscrivi il feed RSS per questo dashlet +dashlet.edit.tooltip=Configura questo dashlet + +#Module Package Admin page +tool.module-package.label=Browser moduli +tool.module-package.description=Browser moduli + +# Category Manager Admin Console +tool.category-manager.label=Gestione categoria +tool.category-manager.description=Gestione categoria +tool.category-manager.edit-category=Modifica categoria +tool.category-manager.edit-category.failure=Impossibile modificare il nome. +tool.category-manager.add-category=Aggiungi categoria +tool.category-manager.add-category.failure=Impossibile aggiungere la categoria. +tool.category-manager.label.category-name=Nome categoria: +tool.category-manager.delete-category=Elimina categoria +tool.category-manager.delete-category.failure=Impossibile eliminare la categoria. +tool.category-manager.message.confirm.delete.title=Elimina categoria +tool.category-manager.message.confirm.delete=Eliminare: {0}? + +# Node browser +tool.node-browser.label=Browser nodi +tool.node-browser.description=Browser nodi + +# Label +label.folder=Cartella +label.document=Documento +label.blogpost=Post del blog +label.forumpost=Argomento del forum +label.calendarevent=Evento del calendario +label.wikipage=Pagina wiki +label.link=Collega +label.datalist=Elenco dati +label.datalistitem=Elemento elenco dati +label.unknown=Sconosciuto +label.download=Scarica +label.viewinbrowser=Visualizza nel browser +label.viewdetails=Visualizza dettagli +label.selectAll=Seleziona tutto +label.selectInvert=Inverti selezione +label.selectNone=Nessuno +label.selectedItems=Elementi selezionati +label.select=Seleziona +label.restricted-settings=Alfresco Identity Service \u00e8 abilitato. Alcune impostazioni sono dotate di restrizioni. + +# Path +message.infolderpath=Nella cartella + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Sincronizzazione in attesa +sync.status.synced={0} sincronizzato da {1} +sync.status.last-attempt=Ultima sincronizzazione di {0} riuscita, eseguita da {1} +sync.status.failed=Tentativo di sincronizzazione di {0}, eseguito da {1} +sync.status.last-failed=Ultima sincronizzazione non riuscita +sync.status.transient-error=Errore temporaneo di sincronizzazione +sync.status.transient-error.default-details=La sincronizzazione verr\u00e0 ripresa quando Alfresco Content Services sar\u00e0 in grado di comunicare di nuovo con il cloud. +sync.status.copy.pending=Sincronizzazione in attesa su {2} +sync.status.copy.synced={2}: {0} sincronizzato da {1} +sync.status.copy.last-attempt={2}: ultima sincronizzazione di {0} riuscita, eseguita da {1} +sync.status.copy.failed=Tentativo di sincronizzazione su {2} di {0}, eseguito da {1} +sync.status.copy.last-failed=Ultima sincronizzazione di {2} non riuscita +sync.status.show-details=Mostra dettagli +sync.status.hide-details=Nascondi dettagli +sync.status.title=Informazioni sulla sincronizzazione +sync.status.action.more=Altre info +sync.original-document=Documento originale + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=Impossibile visualizzare lo stato di sincronizzazione +sync.unable.get.details=Impossibile visualizzare i dettagli sul nodo + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Rimuovere ''{0}'' dal cloud. +sync.remove.folder.from.cloud=Rimuovere ''{0}''e il relativo contenuto dal cloud. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Nella cartella di destinazione esiste gi\u00e0 del contenuto con lo stesso nome. +sync.folder.not_found=Impossibile trovare la cartella. +sync.node.already_synced=Impossibile creare il contenuto: \u00e8 gi\u00e0 stato sincronizzato da un'altra posizione. +sync.node.other_sync_set=Questo contenuto \u00e8 gi\u00e0 stato sincronizzato da un'altra posizione. +sync.node.no_longer_exists=Questo contenuto non esiste pi\u00f9 su Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=Questo contenuto non esiste pi\u00f9 su Alfresco Content Services in the Cloud. Fare clic su Richiedi sincronizzazione per riprovare. +sync.node.unknown=Si \u00e8 verificato un problema. Riprovare. +sync.node.unknown.description=Si \u00e8 verificato un errore imprevisto. Causa: {0}. +sync.node.access_denied=Impossibile sincronizzare il contenuto: non si \u00e8 autorizzati ad accedere al file di destinazione. +sync.node.access_denied_source=Impossibile sincronizzare il contenuto: non si \u00e8 autorizzati ad accedere al file di origine. +sync.node.content_limit_violation=Questo file supera il limite di contenuti consentito. La dimensione del file \u00e8 troppo grande per questa operazione. +sync.node.quota_limit_violation=\u00c8 stata superata la quota di contenuti consentita. Non \u00e8 disponibile spazio sufficiente per eseguire l'operazione. +sync.node.authentication_error=Impossibile sincronizzare il contenuto nel cloud: i dettagli di autenticazione non sono validi. +sync.node.authentication_error.description=Impossibile sincronizzare il contenuto nel cloud: i dettagli di autenticazione dell''utente {0} non sono validi. +sync.node.owner_not_found=Impossibile sincronizzare il contenuto perch\u00e9 il proprietario \u00e8 stato rimosso o eliminato. +sync.node.owner_not_found.description=L''utente proprietario di questa sincronizzazione, {0}, non esiste pi\u00f9. Fare clic su Desincronizza. + +sync.communications.error=Impossibile comunicare con il sistema remoto +sync.communications.error.description=Impossibile comunicare con il sistema remoto. La sincronizzazione verr\u00e0 avviata automaticamente non appena si stabilisce la comunicazione + +# Cloud Sync no network available for sync +sync.message.no.active.network=Nessuna rete abilitata per la sincronizzazione + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Nuova cartella +sync.new-folder.in-the-cloud.header=Dettagli nuova cartella +sync.new-folder.creation.success=Cartella creata correttamente +sync.new-folder.creation.failure=Impossibile creare la cartella + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=ID sincronizzazione +hybridsync.ssd-failed-reason-header-label=Tipo di errore di sincronizzazione +hybridsync.path-desc-header-label=Posizione originale elemento +hybridsync.sync-creator-header-label=Creatore sincronizzazione +hybridsync.cloud-user-header-label=Utente cloud +hybridsync.remote-tenant-id-header-label=Rete cloud +hybridsync.target-folder-node-ref-header-label=Destinazione cloud +hybridsync.actions-header-label=Azioni + +#Hybrid workflow +hybridworkflow.destination-select.title=Selezionare la destinazione dei documenti nel cloud +hybridworkflow.set.destination=Destinazione e assegnatario +hybridworkflow.authority.single=Assegnatario +hybridworkflow.authority.multiple=Esaminatori +hybridworkflow.review.approved=Approvato +hybridworkflow.review.rejected=Respinto +hybridworkflow.destination-select.folderPrefix=Documenti +hybridworkflow.destination.network=Rete +hybridworkflow.destination.site=Sito +hybridworkflow.destination.folder=Cartella +hybridworkflow.destination.button=Seleziona + +# Security +security.insecuremimetype=Il tipo MIME del contenuto richiesto \u00e8 considerato un rischio per la sicurezza e non sar\u00e0 visualizzato. + +# Lightbox +lightbox.close=chiudi +lightbox.loading=caricamento diff --git a/share/src/main/resources/alfresco/messages/slingshot_ja.properties b/share/src/main/resources/alfresco/messages/slingshot_ja.properties new file mode 100755 index 0000000000..631a4bad5d --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_ja.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u306e\u5165\u529b... +# header menu items +header.advanced-search.label=\u8a73\u7d30\u691c\u7d22... +header.advanced-search.description=\u8a73\u7d30\u691c\u7d22... +header.application.label=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 +header.application.description=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 +header.change-password.label=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5909\u66f4 +header.change-password.description=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5909\u66f4 +header.groups.label=\u30b0\u30eb\u30fc\u30d7 +header.groups.description=\u30b0\u30eb\u30fc\u30d7 +header.tag-management.label=\u30bf\u30b0\u30de\u30cd\u30fc\u30b8\u30e3 +header.tag-management.description=\u30bf\u30b0\u30de\u30cd\u30fc\u30b8\u30e3 +header.help.label=\u30d8\u30eb\u30d7 +header.help.description=\u30d8\u30eb\u30d7 +header.logout.label=\u30ed\u30b0\u30a2\u30a6\u30c8 +header.logout.description=\u30ed\u30b0\u30a2\u30a6\u30c8 +header.more.label=\u305d\u306e\u4ed6... +header.more.description=\u305d\u306e\u4ed6... +header.my.label=\u3042\u306a\u305f\u306e... +header.my.description=\u3042\u306a\u305f\u306e... +header.my-content.label=\u3042\u306a\u305f\u306e\u30b3\u30f3\u30c6\u30f3\u30c4 +header.my-content.description=\u3042\u306a\u305f\u306e\u30b3\u30f3\u30c6\u30f3\u30c4 +header.my-dashboard.label=\u3042\u306a\u305f\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +header.my-dashboard.description=\u3042\u306a\u305f\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +header.my-profile.label=\u3042\u306a\u305f\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb +header.my-profile.description=\u3042\u306a\u305f\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb +header.my-sites.label=\u3042\u306a\u305f\u306e\u30b5\u30a4\u30c8 +header.my-sites.description=\u3042\u306a\u305f\u306e\u30b5\u30a4\u30c8 +header.my-tasks.label=\u3042\u306a\u305f\u306e\u30bf\u30b9\u30af +header.my-tasks.description=\u3042\u306a\u305f\u306e\u30bf\u30b9\u30af +header.my-workflows.label=\u3042\u306a\u305f\u304c\u958b\u59cb\u3057\u305f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc +header.my-workflows.description=\u3042\u306a\u305f\u304c\u958b\u59cb\u3057\u305f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc +header.people.label=\u30e6\u30fc\u30b6\u30fc +header.people.description=\u30e6\u30fc\u30b6\u30fc +header.replication-jobs.label=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6 +header.replication-jobs.description=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6 +header.repository.label=\u30ea\u30dd\u30b8\u30c8\u30ea +header.repository.description=\u30ea\u30dd\u30b8\u30c8\u30ea +header.trashcan.label=\u3054\u307f\u7bb1 +header.trashcan.description=\u30d5\u30a1\u30a4\u30eb\u306e\u5fa9\u5143/\u524a\u9664\u30c4\u30fc\u30eb +header.saved-searches.label=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6 +header.saved-searches.description=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6 +header.search.description=\u691c\u7d22\u30aa\u30d7\u30b7\u30e7\u30f3... +header.sites.label=\u30b5\u30a4\u30c8 +header.sites.description=\u30b5\u30a4\u30c8 +header.submit-status.label=\u5171\u6709 +header.submit-status.description=\u5171\u6709 +header.tools.label=\u7ba1\u7406\u8005\u30c4\u30fc\u30eb... +header.tools.description=\u7ba1\u7406\u7528\u30c4\u30fc\u30eb... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=\u30e6\u30fc\u30b6\u30fc +header.users.description=\u30e6\u30fc\u30b6\u30fc + +## Buttons +button.browse=\u95b2\u89a7 +button.edit=\u7de8\u96c6 +button.save=\u4fdd\u5b58 +button.savechanges=\u5909\u66f4\u3092\u4fdd\u5b58 +button.saveandclose=\u4fdd\u5b58\u3057\u3066\u9589\u3058\u308b +button.upload=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +button.login=\u30b5\u30a4\u30f3\u30a4\u30f3 +button.delete=\u524a\u9664 +button.take-ownership=OK +button.download=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +button.clear=\u6d88\u53bb +button.reset=\u30ea\u30bb\u30c3\u30c8 +button.search=\u691c\u7d22 +button.update=\u66f4\u65b0 +button.goback=\u623b\u308b +button.done=\u5b8c\u4e86 +button.undo=\u5143\u306b\u623b\u3059 +button.new=\u65b0\u898f +button.create=\u4f5c\u6210 +button.rename=\u540d\u524d\u306e\u5909\u66f4 +button.refreshPage=\u30da\u30fc\u30b8\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3059\u308b +button.createanother=\u9023\u7d9a\u4f5c\u6210 +button.view.simple=\u30b7\u30f3\u30d7\u30eb\u8868\u793a +button.view.detailed=\u8a73\u7d30\u8868\u793a +button.view.gallery=\u30ae\u30e3\u30e9\u30ea\u30fc\u306e\u8868\u793a +button.view.filmstrip=\u30b9\u30e9\u30a4\u30c9\u306e\u8868\u793a +button.view.table=\u8868\u306e\u8868\u793a +button.view.media-table=\u30e1\u30c7\u30a3\u30a2\u306e\u8868\u793a +button.view.email=E\u30e1\u30fc\u30eb\u306e\u8868\u793a +button.view.audio=\u30aa\u30fc\u30c7\u30a3\u30aa\u306e\u8868\u793a +button.view.dublinCore=\u30c0\u30d6\u30ea\u30f3\u30b3\u30a2\u306e\u8868\u793a +button.view.effectivity=\u6709\u52b9\u6027\u306e\u8868\u793a + +button.follow=\u30d5\u30a9\u30ed\u30fc\u3059\u308b +button.unfollow=\u30d5\u30a9\u30ed\u30fc\u3092\u89e3\u9664 +button.unsync=\u540c\u671f\u3092\u524a\u9664 + +## Messages +message.failure=\u5931\u6557 +message.failure.workflow=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u306f\u3001\u3053\u306e\u30bf\u30b9\u30af\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +message.loginfailure=\u30ed\u30b0\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.loginautherror=\u8a8d\u8a3c\u60c5\u5831\u304c\u8a8d\u8b58\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u3001\u73fe\u5728 Alfresco Content Services \u304c\u4f7f\u7528\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 +message.passwordchangeauthfailed=\u8a8d\u8a3c\u60c5\u5831\u304c\u6b63\u3057\u304f\u306a\u3044\u304b\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +message.login-portal=\u30dd\u30fc\u30bf\u30eb\u3092\u4ecb\u3057\u3066\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.unsavedChanges.blog=\u30d6\u30ed\u30b0\u6295\u7a3f\u306b\u672a\u4fdd\u5b58\u306e\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u3002 +message.unsavedChanges.comment=\u30b3\u30e1\u30f3\u30c8\u304c\u307e\u3060\u4fdd\u5b58\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +message.unsavedChanges.discussion=\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3\u306e\u30c6\u30fc\u30de\u306b\u672a\u4fdd\u5b58\u306e\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u3002 +message.unsavedChanges.reply=\u30c6\u30fc\u30de\u306e\u56de\u7b54\u306b\u672a\u4fdd\u5b58\u306e\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u3002 +message.unsavedChanges.wiki=Wiki \u8a18\u4e8b\u306b\u672a\u4fdd\u5b58\u306e\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u3002 +message.searching=\u691c\u7d22\u3057\u3066\u3044\u307e\u3059... +message.searchingFor=''{0}'' \u3092\u691c\u7d22\u3057\u3066\u3044\u307e\u3059... +message.minimum-length={0} \u6587\u5b57\u4ee5\u4e0a\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 +message.folders-trimmed=\u4e00\u89a7\u306b\u306f {0} \u4ef6\u307e\u3067\u3057\u304b\u8868\u793a\u3055\u308c\u307e\u305b\u3093 +message.item-missing=\u30ea\u30af\u30a8\u30b9\u30c8\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306f\u4f7f\u7528\u3067\u304d\u306a\u304f\u306a\u3063\u305f\u305f\u3081\u3001\u8868\u793a\u3067\u304d\u307e\u305b\u3093\u3002 +message.save.success=\u5909\u66f4\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002 +message.save.failure=\u5909\u66f4\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.cookiesfailure=Cookie\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059 +message.cookieserror=\u30d6\u30e9\u30a6\u30b6\u3067 Cookie \u3092\u6709\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.siteRedirect.noPages.manager=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u304c\u3053\u306e\u30b5\u30a4\u30c8\u306e\u3059\u3079\u3066\u306e\u6a5f\u80fd\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f\u3002
\uff3b\u8a2d\u5b9a\uff3d\u30a2\u30a4\u30b3\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3001\uff3b\u30b5\u30a4\u30c8\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\uff3d\u3092\u9078\u629e\u3057\u3066 1 \u3064\u307e\u305f\u306f\u8907\u6570\u306e\u30b5\u30a4\u30c8\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.siteRedirect.noPages.user=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u304c\u3053\u306e\u30b5\u30a4\u30c8\u306e\u3059\u3079\u3066\u306e\u6a5f\u80fd\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f\u3002
\uff3b\u30b5\u30a4\u30c8\u30e1\u30f3\u30d0\u30fc\uff3d\u3067\u3001\u3053\u306e\u30b5\u30a4\u30c8\u306b\u6a5f\u80fd\u3092\u8ffd\u52a0\u3067\u304d\u308b\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.logged-out=\u30ed\u30b0\u30a2\u30a6\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 +message.timeout=\u30b5\u30fc\u30d0\u30fc\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306b\u306a\u308a\u307e\u3057\u305f\u3002 \u30ea\u30af\u30a8\u30b9\u30c8\u306e\u51e6\u7406\u306b\u6642\u9593\u304c\u304b\u304b\u308a\u3059\u304e\u305f\u305f\u3081\u3001\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u5f8c\u3067\u64cd\u4f5c\u3092\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.loading=\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.viewInCloud.failure=URL \u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002 \u540c\u671f\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.logged-out=\u30ed\u30b0\u30a2\u30a6\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 + +## Common Text labels and CM model metadata +label.tags=\u30bf\u30b0 +label.none=(\u306a\u3057) +label.empty=\uff08\u7a7a\uff09 +label.about=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +label.username=\u30e6\u30fc\u30b6\u30fc\u540d +label.password=\u30d1\u30b9\u30ef\u30fc\u30c9 +label.copyright=© 2005-2023 Alfresco Software Inc. All rights reserved\u3002 +label.name=\u540d\u524d +label.id=ID +label.title=\u30bf\u30a4\u30c8\u30eb +label.description=\u8aac\u660e +label.version=\u30d0\u30fc\u30b8\u30e7\u30f3 +label.firstname=\u540d +label.lastname=\u59d3 +label.jobtitle=\u5f79\u8077\u540d +label.location=\u5834\u6240 +label.bio=\u6982\u8981 +label.photo=\u5199\u771f +label.contactinfo=\u9023\u7d61\u5148 +label.skype=Skype +label.im=IM +label.googleusername=Google \u30e6\u30fc\u30b6\u30fc\u540d +label.company=\u4f1a\u793e\u540d +label.companyinfo=\u4f1a\u793e\u60c5\u5831 +label.companyname=\u540d\u524d +label.companyaddress=\u4f4f\u6240 +label.companytelephone=\u96fb\u8a71 +label.companyfax=\u30d5\u30a1\u30c3\u30af\u30b9 +label.companyemail=E \u30e1\u30fc\u30eb +label.companypostcode=\u90f5\u4fbf\u756a\u53f7 +label.email=E \u30e1\u30fc\u30eb +label.telephone=\u96fb\u8a71 +label.mobile=\u643a\u5e2f +label.fax=\u30d5\u30a1\u30c3\u30af\u30b9 +label.address=\u4f4f\u6240 +label.postcode=\u90f5\u4fbf\u756a\u53f7 +label.groups=\u30b0\u30eb\u30fc\u30d7 +label.yes=\u306f\u3044 +label.no=\u3044\u3044\u3048 +label.ok=OK +label.loading=\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +label.validating=\u691c\u8a3c\u3057\u3066\u3044\u307e\u3059... +label.validationError=\u8cc7\u683c\u60c5\u5831\u3092\u691c\u8a3c\u3067\u304d\u307e\u305b\u3093\u3002 +label.site=\u30b5\u30a4\u30c8 +label.path=\u30d1\u30b9 +label.type=\u30bf\u30a4\u30d7 +label.creator=\u4f5c\u6210\u8005 +label.created=\u4f5c\u6210\u65e5\u6642 +label.modifier=\u5909\u66f4\u8005 +label.modified=\u5909\u66f4\u65e5\u6642 +label.author=\u4f5c\u6210\u8005 +label.priority=\u512a\u5148\u5ea6 {0} +label.size=\u30b5\u30a4\u30ba +label.mimetype=MIME \u30bf\u30a4\u30d7 +label.mimetype.unknown=\u4e0d\u660e +label.popularity=\u8a55\u4fa1 +label.avatar=\u30a2\u30d0\u30bf\u30fc +label.editType=\u7de8\u96c6\uff1a {0} +label.moreInfo=\u8a73\u7d30 > +label.actions.column.header=\u51e6\u7406 +# Dictionary Model +label.modelActive=\u30a2\u30af\u30c6\u30a3\u30d6 +label.modelName=\u30e2\u30c7\u30eb\u540d +label.modelDescription=\u30e2\u30c7\u30eb\u306e\u8aac\u660e +# Transfer Targets +label.trx_enabled=\u6709\u52b9 +label.trx_endpointhost=\u30db\u30b9\u30c8\u306b\u8ee2\u9001 +label.trx_endpointport=\u30dd\u30fc\u30c8 +label.you=\u3042\u306a\u305f +label.licensedTo=\u30e9\u30a4\u30bb\u30f3\u30b9\u5148\uff1a: + +## Location +location.tooltip.path=\u30d1\u30b9\uff1a {0} +location.tooltip.site=\u30b5\u30a4\u30c8\uff1a {0} +location.path.repository=\u30ea\u30dd\u30b8\u30c8\u30ea +location.path.documents=\u6587\u66f8 +location.path.userHome=\u3042\u306a\u305f\u306e\u30e6\u30fc\u30b6\u30fc\u30db\u30fc\u30e0 +location.path.myfiles=\u3042\u306a\u305f\u306e\u30d5\u30a1\u30a4\u30eb +location.path.shared=\u5171\u6709\u30d5\u30a1\u30a4\u30eb +location.label.none=(\u306a\u3057) +location.label.local={0} +location.label.site={0} / {1} +location.label.repository={0} + +## EXIF +label.exif.width=\u5e45 +label.exif.height=\u9ad8\u3055 + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} / {totalRecords} +pagination.template.page-report.more=\u8868\u793a\u4e2d\u306e\u30a2\u30a4\u30c6\u30e0{startRecord} - {endRecord} of {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=\uff08{currentPage} / {totalPages}\uff09 +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=\u660e\u308b\u3044\u8272\u306e\u30c6\u30fc\u30de +theme.default=\u9752\u8272\u306e\u30c6\u30fc\u30de +theme.greenTheme=\u7dd1\u8272\u306e\u30c6\u30fc\u30de +theme.hcBlack=\u30cf\u30a4\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u306e\u30c6\u30fc\u30de +theme.yellowTheme=\u9ec4\u8272\u306e\u30c6\u30fc\u30de +theme.gdocs=Google \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30c6\u30fc\u30de + +## Admin console tools +tool.users.label=\u30e6\u30fc\u30b6\u30fc +tool.users.description=\u30e6\u30fc\u30b6\u30fc\u306e\u7ba1\u7406 +tool.groups.label=\u30b0\u30eb\u30fc\u30d7 +tool.groups.description=\u30b0\u30eb\u30fc\u30d7\u306e\u7ba1\u7406 +tool.application.label=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 +tool.application.description=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\u3068\u7ba1\u7406 +tool.replication-jobs.label=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6 +tool.replication-jobs.description=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u306e\u7ba1\u7406 +tool.repository.label=\u30ea\u30dd\u30b8\u30c8\u30ea\u30c4\u30fc\u30eb +tool.repository.description=\u30ea\u30dd\u30b8\u30c8\u30ea\u30c4\u30fc\u30eb +tool.tag-management.label=\u30bf\u30b0\u30de\u30cd\u30fc\u30b8\u30e3 +tool.tag-management.description=\u30bf\u30b0\u30de\u30cd\u30fc\u30b8\u30e3 +tool.workflow.label=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc +tool.workflow.description=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30c4\u30fc\u30eb +tool.trashcan.label=\u3054\u307f\u7bb1 +tool.trashcan.description=\u30d5\u30a1\u30a4\u30eb\u306e\u5fa9\u5143/\u524a\u9664\u30c4\u30fc\u30eb +tool.email-inbound.label=E\u30e1\u30fc\u30eb\uff08\u7740\u4fe1\uff09 +tool.email-inbound.description=E\u30e1\u30fc\u30eb\uff08\u7740\u4fe1\uff09 +tool.email-outbound.label=E\u30e1\u30fc\u30eb\uff08\u9001\u4fe1\uff09 +tool.email-outbound.description=E\u30e1\u30fc\u30eb\uff08\u9001\u4fe1\uff09 +tool.email-imap.label=E\u30e1\u30fc\u30eb\uff08IMAP\uff09 +tool.email-imap.description=E\u30e1\u30fc\u30eb\uff08IMAP\uff09 +tool.runtime.label=\u30e9\u30f3\u30bf\u30a4\u30e0 +tool.runtime.description=\u30e9\u30f3\u30bf\u30a4\u30e0 +tool.repository-server.label=\u30ea\u30dd\u30b8\u30c8\u30ea\u8a18\u8ff0\u5b50\uff08\u73fe\u5728\uff09 +tool.repository-server.description=\u30ea\u30dd\u30b8\u30c8\u30ea\u8a18\u8ff0\u5b50\uff08\u73fe\u5728\uff09 +tool.repository-installed.label=\u30ea\u30dd\u30b8\u30c8\u30ea\u8a18\u8ff0\u5b50\uff08\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6642\uff09 +tool.repository-installed.description=\u30ea\u30dd\u30b8\u30c8\u30ea\u8a18\u8ff0\u5b50\uff08\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6642\uff09 +tool.authority.label=\u627f\u8a8d\u8005 +tool.authority.description=\u627f\u8a8d\u8005 +tool.license.label=\u30e9\u30a4\u30bb\u30f3\u30b9\u8a18\u8ff0\u5b50 +tool.license.description=\u30e9\u30a4\u30bb\u30f3\u30b9\u8a18\u8ff0\u5b50 +tool.license.link=\u3042\u306a\u305f\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u306e\u7ba1\u7406 +tool.license.usageinfo.label=\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1 +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=OpenOffice \u30b7\u30b9\u30c6\u30e0 +tool.openoffice-subsystem.description=OpenOffice \u30b7\u30b9\u30c6\u30e0 +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=\u5909\u63db\u30c4\u30fc\u30eb pdf2swf +tool.transformer-pdf2swf.description=\u5909\u63db\u30c4\u30fc\u30eb pdf2swf +tool.transformer-imagemagick.label=\u5909\u63db\u30c4\u30fc\u30eb ImageMagick +tool.transformer-imagemagick.description=\u5909\u63db\u30c4\u30fc\u30eb ImageMagick +tool.fileservers.label=\u30d5\u30a1\u30a4\u30eb\u30b5\u30fc\u30d0\u30fc +tool.fileservers.description=\u30d5\u30a1\u30a4\u30eb\u30b5\u30fc\u30d0\u30fc +tool.subscriptions.label=\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3 +tool.subscriptions.description=\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3 +tool.sysadmin.label=\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005 +tool.sysadmin.description=\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005 +tool.activities.label=\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30d5\u30a3\u30fc\u30c9 +tool.activities.description=\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30d5\u30a3\u30fc\u30c9 +tool.workflow.label=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc +tool.workflow.description=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc +tool.manage-sites.label=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3 +tool.manage-sites.description=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3 +tool.cloud-sync-management.label=\u30af\u30e9\u30a6\u30c9\u540c\u671f\u30de\u30cd\u30fc\u30b8\u30e3\u30fc +tool.cloud-sync-management.description=\u30af\u30e9\u30a6\u30c9\u540c\u671f\u30de\u30cd\u30fc\u30b8\u30e3\u30fc +tool.search-manager.label=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3 +tool.search-manager.description=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3 + +## Admin console tool groups +tool.group.usersgroups=\u30e6\u30fc\u30b6\u30fc\u3068\u30b0\u30eb\u30fc\u30d7 +tool.group.email=E \u30e1\u30fc\u30eb +tool.group.transformations=\u5909\u63db +tool.group.filemanagement=\u30d5\u30a1\u30a4\u30eb\u306e\u7ba1\u7406 +tool.group.subscriptions=\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3 +tool.group.repository=\u30ea\u30dd\u30b8\u30c8\u30ea +tool.group.search=\u691c\u7d22 +tool.group.site=\u30b5\u30a4\u30c8 + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=\u62db\u5f85\u306e\u627f\u8afe +page.acceptInvite.description=\u62db\u5f85\u3092\u627f\u8afe\u3059\u308b\u30da\u30fc\u30b8\u3067\u3059\u3002 \u3053\u306e\u30da\u30fc\u30b8\u3092\u8aad\u307f\u8fbc\u3080\u3068\u3001\u30b5\u30a4\u30c8\u3078\u306e\u62db\u5f85\u3092\u627f\u8afe\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u3001\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u305f\u30e6\u30fc\u30b6\u30fc\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u6709\u52b9\u306b\u306a\u308a\u307e\u3059 +page.addGroups.title=\u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 +page.addGroups.description=\u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 +page.add-users.title=\u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0 +page.add-users.description=\u30b5\u30a4\u30c8\u306b\u30e6\u30fc\u30b6\u30fc\u3092\u8ffd\u52a0\u3067\u304d\u307e\u3059 +page.adminConsole.title=\u7ba1\u7406\u30c4\u30fc\u30eb +page.adminConsole.description=\u7ba1\u7406\u7528\u30b3\u30f3\u30bd\u30fc\u30eb +page.advsearch.title=\u8a73\u7d30\u691c\u7d22 +page.advsearch.description=\u8a73\u7d30\u691c\u7d22\u30d3\u30e5\u30fc +page.blogCreateEdit.title=\u30d6\u30ed\u30b0\uff1a \u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u306e\u4f5c\u6210/\u7de8\u96c6 +page.blogCreateEdit.description=\u6295\u7a3f\u3092\u4f5c\u6210\u3001\u7de8\u96c6\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.blogPostList.title=\u30d6\u30ed\u30b0 +page.blogPostList.description=\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.blogPostView.title=\u30d6\u30ed\u30b0\uff1a \u6295\u7a3f\u306e\u8a73\u7d30\u30d3\u30e5\u30fc\u306e\u8868\u793a +page.blogPostView.description=\u6295\u7a3f\u306e\u8a73\u7d30\u30d3\u30e5\u30fc\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.calendar.title=\u30ab\u30ec\u30f3\u30c0\u30fc +page.calendar.description=\u30b5\u30a4\u30c8\u306e\u30ab\u30ec\u30f3\u30c0\u30fc\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8 +page.changePassword.title=\u30e6\u30fc\u30b6\u30fc\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5909\u66f4 +page.changePassword.description=\u30e6\u30fc\u30b6\u30fc\u306e [\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb] \u30da\u30fc\u30b8\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3067\u304d\u307e\u3059 +page.contentViewer.title=\u30b3\u30f3\u30c6\u30f3\u30c4\u30d3\u30e5\u30fc\u30a2 +page.contentViewer.description=\u53c2\u7167\u3057\u3066\u3044\u308b\u30ce\u30fc\u30c9\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u8868\u793a\u3055\u308c\u308b\u30da\u30fc\u30b8 +page.createContent.title=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u4f5c\u6210 +page.createContent.description=\u30c6\u30ad\u30b9\u30c8\u30d9\u30fc\u30b9\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059 +page.createEditReplicationJob.title=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6 +page.createEditReplicationJob.description=\u65b0\u3057\u3044\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u3092\u4f5c\u6210\u3057\u305f\u308a\u3001\u65e2\u5b58\u306e\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u3092\u7de8\u96c6\u3067\u304d\u307e\u3059 +page.customiseSite.title=\u30b5\u30a4\u30c8\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba +page.customiseSite.description=\u30b5\u30a4\u30c8\u306b\u30da\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u305f\u308a\u3001\u30b5\u30a4\u30c8\u304b\u3089\u30da\u30fc\u30b8\u3092\u524a\u9664\u3067\u304d\u307e\u3059 +page.customiseSiteDashboard.title=\u30b5\u30a4\u30c8\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba +page.customiseSiteDashboard.description=\u30b5\u30a4\u30c8\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u3084\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3067\u304d\u307e\u3059 +page.customiseUserDashboard.title=\u30e6\u30fc\u30b6\u30fc\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba +page.customiseUserDashboard.description=\u30e6\u30fc\u30b6\u30fc\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u3084\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3067\u304d\u307e\u3059 +page.data-lists.title=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8 +page.data-lists.description=\u30c7\u30fc\u30bf\u304c\u4e00\u89a7\u8868\u793a\u3055\u308c\u308b\u30da\u30fc\u30b8 +page.discussionsCreateTopic.title=\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3\uff1a \u30c8\u30d4\u30c3\u30af\u306e\u4f5c\u6210\u30da\u30fc\u30b8\u306e\u8868\u793a +page.discussionsCreateTopic.description=\u30c8\u30d4\u30c3\u30af\u3092\u4f5c\u6210\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.discussionsTopicList.title=\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3 +page.discussionsTopicList.description=\u30d5\u30a9\u30fc\u30e9\u30e0\u306e\u30c8\u30d4\u30c3\u30af\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.discussionsTopicView.title=\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3\uff1a \u30c8\u30d4\u30c3\u30af\u306e\u8a73\u7d30\u30d3\u30e5\u30fc\u306e\u8868\u793a +page.discussionsTopicView.description=\u30c8\u30d4\u30c3\u30af\u306e\u8a73\u7d30\u30d3\u30e5\u30fc\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.documentDetails.title=\u6587\u66f8\u306e\u8a73\u7d30 +page.documentDetails.description=\u6587\u66f8\u306e\u8a73\u7d30 +page.documentLibrary.title=\u6587\u66f8\u30e9\u30a4\u30d6\u30e9\u30ea +page.documentLibrary.description=\u30c4\u30ea\u30fc\u30d3\u30e5\u30fc\u4ed8\u304d\u306e\u6587\u66f8\u30e9\u30a4\u30d6\u30e9\u30ea +page.editMetadata.title=\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u7de8\u96c6 +page.editMetadata.description=\u30ce\u30fc\u30c9\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u7de8\u96c6\u3067\u304d\u307e\u3059 +page.folderDetails.title=\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30 +page.folderDetails.description=\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30 +page.folderRules.title=\u30d5\u30a9\u30eb\u30c0\u30eb\u30fc\u30eb +page.folderRules.description=\u30d5\u30a9\u30eb\u30c0\u30eb\u30fc\u30eb +page.geographicMap.title=Google \u30de\u30c3\u30d7\u3067\u8868\u793a +page.geographicMap.description=\u64ae\u5f71\u5834\u6240\u3092 Google \u30de\u30c3\u30d7\u3067\u8868\u3067\u304d\u307e\u3059 +page.inlineEdit.title=Alfresco Share \u3067\u7de8\u96c6 +page.inlineEdit.description=\u30c6\u30ad\u30b9\u30c8\u3092 Alfresco Share \u3067\u7de8\u96c6\u3067\u304d\u307e\u3059 +page.invite.title=\u62db\u5f85 +page.invite.description=\u62db\u5f85 +page.links.title=\u30ea\u30f3\u30af +page.links.description=\u30ea\u30f3\u30af +page.linkCreateEdit.title=\u30ea\u30f3\u30af\uff1a \u30ea\u30f3\u30af\u306e\u4f5c\u6210/\u7de8\u96c6 +page.linkCreateEdit.description=\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3001\u7de8\u96c6\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.linksView.title=\u30ea\u30f3\u30af\uff1a \u30ea\u30f3\u30af\u306e\u8a73\u7d30\u30d3\u30e5\u30fc\u306e\u8868\u793a +page.linksView.description=\u30ea\u30f3\u30af\u306e\u8a73\u7d30\u30d3\u30e5\u30fc\u304c\u8868\u793a\u3055\u308c\u307e\u3059 +page.login.title=\u30ed\u30b0\u30a4\u30f3 +page.logout.title=\u30ed\u30b0\u30a2\u30a6\u30c8 +page.managePermissions.title=\u6a29\u9650\u306e\u7ba1\u7406 +page.managePermissions.description=\u6a29\u9650\u306e\u7ba1\u7406 +page.myFiles.title=\u3042\u306a\u305f\u306e\u30d5\u30a1\u30a4\u30eb +page.myFiles.description=\u3042\u306a\u305f\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u95b2\u89a7\u3067\u304d\u307e\u3059 +page.myDocumentLibraries.title=\u3042\u306a\u305f\u306e\u6587\u66f8\u30e9\u30a4\u30d6\u30e9\u30ea +page.myDocumentLibraries.description=\u3042\u306a\u305f\u306e\u6587\u66f8\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u8d77\u52d5\u30da\u30fc\u30b8 +page.myTasks.title=\u3042\u306a\u305f\u306e\u30bf\u30b9\u30af +page.myTasks.description=\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u30bf\u30b9\u30af\u3068\u5b8c\u4e86\u6e08\u307f\u30bf\u30b9\u30af\u306e\u4e00\u89a7\u3002 +page.myWorkflows.title=\u3042\u306a\u305f\u304c\u958b\u59cb\u3057\u305f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc +page.myWorkflows.description=\u3042\u306a\u305f\u304c\u958b\u59cb\u3057\u305f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u30da\u30fc\u30b8 +page.pendingInvites.title=\u4fdd\u7559 +page.pendingInvites.description=\u4fdd\u7559\u4e2d\u306e\u62db\u5f85\u3068\u53c2\u52a0\u30ea\u30af\u30a8\u30b9\u30c8 +page.peopleFinder.title=\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22 +page.peopleFinder.description=\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22\u30da\u30fc\u30b8 +page.profile.title=\u30e6\u30fc\u30b6\u30fc\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u30da\u30fc\u30b8 +page.profile.description=\u30e6\u30fc\u30b6\u30fc\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u30da\u30fc\u30b8 +page.rejectInvite.title=\u62db\u5f85\u306e\u5374\u4e0b +page.rejectInvite.description=\u62db\u5f85\u3092\u5374\u4e0b\u3059\u308b\u30da\u30fc\u30b8\u3002 \u62db\u5f85\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u5374\u4e0b\u3067\u304d\u307e\u3059 +page.repository.title=\u30ea\u30dd\u30b8\u30c8\u30ea\u30d6\u30e9\u30a6\u30b6 +page.repository.description=\u30ea\u30dd\u30b8\u30c8\u30ea\u306b\u3042\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u95b2\u89a7\u3067\u304d\u307e\u3059 +page.ruleEdit.title=\u30d5\u30a9\u30eb\u30c0\u30eb\u30fc\u30eb +page.ruleEdit.description=\u30d5\u30a9\u30eb\u30c0\u7528\u306e\u30eb\u30fc\u30eb\u3092\u4f5c\u6210\u307e\u305f\u306f\u7de8\u96c6\u3067\u304d\u307e\u3059\u3002 +page.search.title=\u691c\u7d22 +page.search.description=\u691c\u7d22\u30d3\u30e5\u30fc +page.sharedFiles.title=\u5171\u6709\u30d5\u30a1\u30a4\u30eb +page.sharedFiles.description=\u5171\u6709\u30d5\u30a1\u30a4\u30eb\u3092\u95b2\u89a7\u3067\u304d\u307e\u3059 +page.siteConsole.title=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3 +page.siteConsole.description=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u7528\u306e\u30da\u30fc\u30b8\u3002 \u30b5\u30a4\u30c8\u306e\u7ba1\u7406\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059 +page.siteFinder.title=\u30b5\u30a4\u30c8\u306e\u691c\u7d22 +page.siteFinder.description=\u30b5\u30a4\u30c8\u306e\u691c\u7d22\u30da\u30fc\u30b8 +page.siteIndex.title=\u3088\u3046\u3053\u305d +page.siteIndex.description=\u30e6\u30fc\u30b6\u30fc\u7528\u306e\u30e9\u30f3\u30c7\u30a3\u30f3\u30b0\u30da\u30fc\u30b8\u3002\u30e6\u30fc\u30b6\u30fc\u306e\u30b5\u30a4\u30c8\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3092\u4f5c\u6210\u3057\u3066\u3001\u3053\u306e\u30da\u30fc\u30b8\u306b\u30ea\u30f3\u30af\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059 +page.siteGroups.title=\u30b5\u30a4\u30c8\u30b0\u30eb\u30fc\u30d7 +page.siteGroups.description=\u30b5\u30a4\u30c8\u30b0\u30eb\u30fc\u30d7 +page.siteMembers.title=\u30b5\u30a4\u30c8\u30e1\u30f3\u30d0\u30fc +page.siteMembers.description=\u30b5\u30a4\u30c8\u30e1\u30f3\u30d0\u30fc +page.startWorkflow.title=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u958b\u59cb +page.startWorkflow.description=\u65b0\u3057\u3044\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u958b\u59cb\u3067\u304d\u307e\u3059 +page.taskDetails.title=\u30bf\u30b9\u30af\u306e\u8a73\u7d30 +page.taskDetails.description=\u30bf\u30b9\u30af\u306e\u8a73\u7d30\u3092\u8868\u793a\u3059\u308b\u30da\u30fc\u30b8 +page.taskEdit.title=\u30bf\u30b9\u30af\u306e\u7de8\u96c6 +page.taskEdit.description=\u30bf\u30b9\u30af\u306e\u8a73\u7d30\u3092\u7de8\u96c6\u3059\u308b\u30da\u30fc\u30b8 +page.userContent.title=\u30e6\u30fc\u30b6\u30fc\u304c\u7de8\u96c6\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4 +page.userContent.description=\u30e6\u30fc\u30b6\u30fc\u304c\u524d\u56de\u7de8\u96c6\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059 +page.userFollowers.title=\u30d5\u30a9\u30ed\u30ef\u30fc +page.userFollowers.description=\u30e6\u30fc\u30b6\u30fc\u3092\u30d5\u30a9\u30ed\u30fc\u3057\u3066\u3044\u308b\u4eba\u3005\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059 +page.userFollowing.title=\u30d5\u30a9\u30ed\u30fc +page.userFollowing.description=\u30e6\u30fc\u30b6\u30fc\u304c\u30d5\u30a9\u30ed\u30fc\u3057\u3066\u3044\u308b\u4eba\u3005\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059 +page.userNotifications.title=\u30e6\u30fc\u30b6\u30fc\u306e\u901a\u77e5\u8a2d\u5b9a +page.userNotifications.description=\u30e6\u30fc\u30b6\u30fc\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u30da\u30fc\u30b8\u3067\u901a\u77e5\u8a2d\u5b9a\u3092\u5909\u66f4\u3067\u304d\u307e\u3059 +page.userCloudAuth.title=\u30af\u30e9\u30a6\u30c9\u306e\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c +page.userCloudAuth.description=\u30af\u30e9\u30a6\u30c9\u306e\u8a8d\u8a3c\u60c5\u5831\u3092\u5909\u66f4\u3067\u304d\u307e\u3059 +page.userSites.title=\u30e6\u30fc\u30b6\u30fc\u306e\u30b5\u30a4\u30c8\u30ea\u30b9\u30c8 +page.userSites.description=\u30e6\u30fc\u30b6\u30fc\u304c\u5c5e\u3059\u308b\u30b5\u30a4\u30c8\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059 +page.userTrashcan.title=\u30e6\u30fc\u30b6\u30fc\u306e\u3054\u307f\u7bb1 +page.userTrashcan.description=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u524a\u9664\u3057\u305f\u6587\u66f8\u3068\u30d5\u30a9\u30eb\u30c0\u306e\u4e00\u89a7 +page.wiki.title=Wiki +page.wiki.description=Wiki\u306e\u30e9\u30f3\u30c7\u30a3\u30f3\u30b0\u30da\u30fc\u30b8 +page.wikiCreate.title=Wiki\u4f5c\u6210\u30d5\u30a9\u30fc\u30e0 +page.wikiCreate.description=\u65b0\u3057\u3044Wiki\u30da\u30fc\u30b8\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u30d5\u30a9\u30fc\u30e0\u3092\u8868\u793a\u3057\u307e\u3059 +page.wikiPage.title=Wiki +page.wikiPage.description=Wiki\u30da\u30fc\u30b8\u3092\u8868\u793a\u3057\u307e\u3059 +page.workspace.title=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +page.workspace.description=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30da\u30fc\u30b8 +page.workflowDetails.title=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u8a73\u7d30 +page.workflowDetails.description=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u8a73\u7d30\u30da\u30fc\u30b8 + +## Dashboard page titles and descriptions +page.siteDashboard.title=\u30b5\u30a4\u30c8\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +page.siteDashboard.description=\u30b3\u30e9\u30dc\u30ec\u30fc\u30b7\u30e7\u30f3\u30b5\u30a4\u30c8\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30da\u30fc\u30b8 +page.userDashboard.title=\u30e6\u30fc\u30b6\u30fc\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +page.userDashboard.description=\u30e6\u30fc\u30b6\u30fc\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u30da\u30fc\u30b8 +page.meeting_workspace.title=\u4f1a\u8b70\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 +page.meeting_workspace.description=\u4f1a\u8b70\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30da\u30fc\u30b8 + +page.error.500.title=Alfresco Share » \u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc +page.error.500.header=\u3053\u306e\u30da\u30fc\u30b8\u306b\u306f\u554f\u984c\u304c\u3042\u308a\u307e\u3059... +page.error.500.detail=

\u554f\u984c\u304c\u767a\u751f\u3057\u3066\u3044\u308b\u304b\u3001\u4f55\u304b\u304c\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059\u3002URL \u304c\u6b63\u3057\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002

\u307e\u305f\u306f\u3001\u3053\u306e\u30da\u30fc\u30b8\u3092\u8868\u793a\u3059\u308b\u6a29\u9650\u304c\u306a\u3044\u304b (\u975e\u516c\u958b\u306e\u30b5\u30a4\u30c8\u306e\u305f\u3081)\u3001\u5185\u90e8\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002IT \u62c5\u5f53\u8005\u306b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002

\u3042\u306a\u305f\u306e\u30db\u30fc\u30e0\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3088\u3046\u3068\u3057\u3066\u3001\u305d\u306e\u30da\u30fc\u30b8\u304c\u4f7f\u7528\u3067\u304d\u306a\u304f\u306a\u3063\u3066\u3044\u308b\u5834\u5408\u306f\u3001\u30c4\u30fc\u30eb\u30d0\u30fc\u3067\u3042\u306a\u305f\u306e\u540d\u524d\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30db\u30fc\u30e0\u30da\u30fc\u30b8\u3092\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002

+page.error.500.nav.dashboard=\u3042\u306a\u305f\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306b\u623b\u308b +page.error.500.footer=Alfresco Software Inc. © 2005-2023 All rights reserved\u3002 + +## Title bar component titles for pages that use the simple-title component +title.repository=\u30ea\u30dd\u30b8\u30c8\u30ea +title.browser=\u30d6\u30e9\u30a6\u30b6 +title.siteFinder=\u30b5\u30a4\u30c8\u306e\u691c\u7d22 +title.peopleFinder=\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22 +title.myTasks=\u3042\u306a\u305f\u306e\u30bf\u30b9\u30af + +## Site Visibility +site.visibility.label.PUBLIC=\u516c\u958b +site.visibility.label.MODERATED=\u6761\u4ef6\u4ed8\u304d\u516c\u958b +site.visibility.label.PRIVATE=\u975e\u516c\u958b +site.visibility.description.PUBLIC=\u3042\u306a\u305f\u306e\u7d44\u7e54\u306e\u3059\u3079\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u3053\u306e\u30b5\u30a4\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002 +site.visibility.description.MODERATED=\u3042\u306a\u305f\u306e\u7d44\u7e54\u306e\u3059\u3079\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u3053\u306e\u30b5\u30a4\u30c8\u3092\u691c\u7d22\u3057\u3001\u30a2\u30af\u30bb\u30b9\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u304d\u307e\u3059\u3002 \u30a2\u30af\u30bb\u30b9\u6a29\u306f\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u306b\u3088\u3063\u3066\u4ed8\u4e0e\u3055\u308c\u307e\u3059\u3002 +site.visibility.description.PRIVATE=\u30b5\u30a4\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u306b\u3088\u3063\u3066\u8ffd\u52a0\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u306e\u307f\u304c\u3053\u306e\u30b5\u30a4\u30c8\u3092\u691c\u7d22\u3001\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002 + +## Roles +role.SiteManager=\u30de\u30cd\u30fc\u30b8\u30e3 +role.SiteManager.description=\u30b5\u30a4\u30c8\u306e\u3059\u3079\u3066\u306e\u30b3\u30f3\u30c6\u30f3\u30c4 (\u672c\u4eba\u3068\u30b5\u30a4\u30c8\u306e\u4ed6\u306e\u30e1\u30f3\u30d0\u30fc\u304c\u4f5c\u6210\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\uff09\u306e\u5168\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002 +role.Collaborator=\u5171\u540c\u4f5c\u696d\u8005 +role.Collaborator.description=\u672c\u4eba\u304c\u6240\u6709\u3057\u3066\u3044\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u3059\u3079\u3066\u306e\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u4f5c\u6210\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u7de8\u96c6\u6a29\u9650\u306e\u307f\u3067\u3001\u524a\u9664\u6a29\u9650\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +role.SiteCollaborator=\u5171\u540c\u4f5c\u696d\u8005 +role.SiteCollaborator.description=\u672c\u4eba\u304c\u6240\u6709\u3057\u3066\u3044\u308b\u30b5\u30a4\u30c8\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u3059\u3079\u3066\u306e\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u4ed6\u306e\u30b5\u30a4\u30c8\u30e1\u30f3\u30d0\u30fc\u304c\u4f5c\u6210\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u7de8\u96c6\u6a29\u9650\u306e\u307f\u3067\u3001\u524a\u9664\u6a29\u9650\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +role.Contributor=\u6295\u7a3f\u8005 +role.Contributor.description=\u672c\u4eba\u304c\u6240\u6709\u3057\u3066\u3044\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u3059\u3079\u3066\u306e\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u4f5c\u6210\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u7de8\u96c6\u3082\u524a\u9664\u3082\u3067\u304d\u307e\u305b\u3093\u3002 +role.SiteContributor=\u6295\u7a3f\u8005 +role.SiteContributor.description=\u672c\u4eba\u304c\u6240\u6709\u3057\u3066\u3044\u308b\u30b5\u30a4\u30c8\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u3059\u3079\u3066\u306e\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u4ed6\u306e\u30b5\u30a4\u30c8\u30e1\u30f3\u30d0\u30fc\u304c\u4f5c\u6210\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u3064\u3044\u3066\u306f\u7de8\u96c6\u3082\u524a\u9664\u3082\u3067\u304d\u307e\u305b\u3093\u3002 +role.Consumer=\u5229\u7528\u8005 +role.Consumer.description=\u8868\u793a\u6a29\u9650\u3060\u3051\u3092\u6301\u3061\u3001\u81ea\u5206\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 +role.SiteConsumer=\u5229\u7528\u8005 +role.SiteConsumer.description=\u30b5\u30a4\u30c8\u5185\u3067\u306e\u8868\u793a\u6a29\u9650\u3060\u3051\u3092\u6301\u3061\u3001\u81ea\u5206\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 +role.Coordinator=\u8abf\u6574\u8005 +role.Coordinator.description=\u3059\u3079\u3066\u306e\u30b3\u30f3\u30c6\u30f3\u30c4 (\u672c\u4eba\u3068\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u4f5c\u6210\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\uff09\u306e\u5168\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002 +role.Editor=\u7de8\u96c6\u8005 +role.Editor.description=\u30d5\u30a1\u30a4\u30eb\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u7de8\u96c6\u6a29\u9650\u3068\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u30c1\u30a7\u30c3\u30af\u30a4\u30f3\u304a\u3088\u3073\u30c1\u30a7\u30c3\u30af\u30a2\u30a6\u30c8\u6a29\u9650\u3092\u6301\u3061\u307e\u3059\u304c\u3001\u81ea\u5206\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 + +roles.readassociations=\u5229\u7528\u8005 + +roles-tooltip.header=\u5f79\u5272\u306b\u3064\u3044\u3066 +roles-tooltip.docs-url-label=\u8a73\u7d30\u3092\u898b\u308b +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=\u30bf\u30b0 +taglibrary.populartagslink=\u3053\u306e\u30b5\u30a4\u30c8\u3067\u4eba\u6c17\u304c\u3042\u308b\u30bf\u30b0\u304b\u3089\u9078\u629e\u3059\u308b +taglibrary.msg.failedLoadTags=\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u30bf\u30b0\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093 \uff08\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u63a5\u7d9a\u304c\u5207\u65ad\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\uff09 +taglibrary.msg.unableLoadTags=\u30bf\u30b0\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\uff1a {0} +taglibrary.tip.removeTag=\u30bf\u30b0\u306e\u524a\u9664 +taglibrary.tip.help=\u7a7a\u767d\u3067\u30bf\u30b0\u3092\u533a\u5207\u308a\u307e\u3059\u3002 2 \u3064\u4ee5\u4e0a\u306e\u5358\u8a9e\u3092\u7d50\u5408\u3059\u308b\u5834\u5408\u306f\u3001"\u4e8c\u91cd\u5f15\u7528\u7b26" \u3092\u4f7f\u7528\u3057\u307e\u3059 + +## YUI Editor keys +yuieditor.toolbar.group.font=\u30d5\u30a9\u30f3\u30c8\u30b9\u30bf\u30a4\u30eb +yuieditor.toolbar.group.lists=\u30ea\u30b9\u30c8 +yuieditor.toolbar.group.link=\u30ea\u30f3\u30af +yuieditor.toolbar.item.createorderedlist=\u9806\u5e8f\u4ed8\u304d\u30ea\u30b9\u30c8\u306e\u4f5c\u6210 +yuieditor.toolbar.item.createunorderedlist=\u9806\u5e8f\u306a\u3057\u30ea\u30b9\u30c8\u306e\u4f5c\u6210 +yuieditor.toolbar.item.fontcolor=\u30d5\u30a9\u30f3\u30c8\u306e\u8272 +yuieditor.toolbar.item.backgroundcolor=\u80cc\u666f\u8272 +yuieditor.toolbar.item.bold=\u592a\u5b57 CTRL + SHIFT + B +yuieditor.toolbar.item.italic=\u659c\u4f53 CTRL + SHIFT + I +yuieditor.toolbar.item.underline=\u4e0b\u7dda CTRL + SHIFT + U +yuieditor.toolbar.item.link=HTML \u30ea\u30f3\u30af CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=\u9078\u629e +menu.select.all=\u3059\u3079\u3066 +menu.select.none=\u306a\u3057 +menu.select.invert=\u9078\u629e\u306e\u5207\u308a\u66ff\u3048 +menu.select.folders=\u30d5\u30a9\u30eb\u30c0 +menu.select.documents=\u6587\u66f8 + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304b\u3089\u6587\u66f8\u3092\u4f5c\u6210\u3059\u308b +menu.create-content.by-template-folder=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304b\u3089\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3059\u308b +menu.selected-items=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0... +menu.selected-items.copy=\u30b3\u30d4\u30fc\u5148... +menu.selected-items.move=\u79fb\u52d5\u5148... +menu.selected-items.delete=\u524a\u9664 +menu.selected-items.download=Zip \u5f62\u5f0f\u3067\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +menu.selected-items.assign-workflow=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u958b\u59cb... +menu.selected-items.manage-permissions=\u6a29\u9650\u306e\u7ba1\u7406... +menu.selected-items.deselect-all=\u3059\u3079\u3066\u306e\u9078\u629e\u3092\u89e3\u9664 +menu.selected-items.cloudSync=\u30af\u30e9\u30a6\u30c9\u3068\u540c\u671f +menu.selected-items.cloudUnsync=\u30af\u30e9\u30a6\u30c9\u3068\u306e\u540c\u671f\u3092\u89e3\u9664 +menu.selected-items.cloudRequestSync=\u540c\u671f\u3092\u30ea\u30af\u30a8\u30b9\u30c8 + +## Document Library Actions +actions.document.assign-workflow=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u958b\u59cb +actions.document.cancel-editing=\u7de8\u96c6\u306e\u30ad\u30e3\u30f3\u30bb\u30eb +actions.document.cancel-editing-unlock=\u6587\u66f8\u306e\u30ed\u30c3\u30af\u3092\u89e3\u9664 +actions.document.change-type=\u30bf\u30a4\u30d7\u306e\u5909\u66f4 +actions.document.copy-to=\u30b3\u30d4\u30fc\u5148... +actions.document.delete=\u6587\u66f8\u306e\u524a\u9664 +actions.document.download=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +actions.document.download-again=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +actions.document.download-original=\u5143\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +actions.document.edit-metadata=\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u7de8\u96c6 +actions.document.edit-offline=\u30aa\u30d5\u30e9\u30a4\u30f3\u7de8\u96c6 +actions.document.edit-online=Microsoft Office\u2122 \u3067\u7de8\u96c6 +message.edit-online.supported_office_version_required=\u304a\u4f7f\u3044\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Microsoft Office \u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u307e\u305b\u3093\u3002Microsoft Office \u3092\u66f4\u65b0\u3057\u3066\u304f\u3060\u3055\u3044\u3002Office 2007 \u3068 Office 2008 \u306f\u3001Google Chrome \u3067\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002 +actions.document.extract-metadata=\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u62bd\u51fa +actions.document.execute-script=\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u5b9f\u884c +actions.document.inline-edit=Alfresco Share \u3067\u7de8\u96c6 +actions.document.increment-counter=\u30ab\u30a6\u30f3\u30bf\u3092\u5897\u5206\u3059\u308b +actions.document.locate=\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240 +actions.document.manage-aspects=\u30a2\u30b9\u30da\u30af\u30c8\u306e\u7ba1\u7406 +actions.document.manage-permissions=\u6a29\u9650\u306e\u7ba1\u7406 +actions.document.take-ownership=\u6240\u6709\u8005\u306b\u306a\u308b +actions.document.move-to=\u79fb\u52d5\u5148... +actions.document.simple-approve=\u627f\u8a8d +actions.document.simple-reject=\u5374\u4e0b +actions.document.upload-new-version=\u65b0\u898f\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +actions.document.view=\u30d6\u30e9\u30a6\u30b6\u3067\u8868\u793a +actions.document.view-google-map=Google \u30de\u30c3\u30d7\u3067\u8868\u793a +actions.document.view-original=\u5143\u306e\u6587\u66f8\u3092\u8868\u793a +actions.document.view-source-repository=\u30bd\u30fc\u30b9\u30ea\u30dd\u30b8\u30c8\u30ea\u3067\u8868\u793a +actions.document.view-working-copy=\u4f5c\u696d\u7528\u30b3\u30d4\u30fc\u3092\u8868\u793a +actions.document.publish=\u516c\u958b +actions.document.transform=\u5909\u63db +actions.document.transform-image=\u753b\u50cf\u306b\u5909\u63db +actions.document.publish-content=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u516c\u958b +actions.document.cloud-sync=\u30af\u30e9\u30a6\u30c9\u3068\u540c\u671f +actions.document.cloud-unsync=\u30af\u30e9\u30a6\u30c9\u3068\u306e\u540c\u671f\u3092\u89e3\u9664 +actions.document.view-in-cloud=\u30af\u30e9\u30a6\u30c9\u3067\u8868\u793a +actions.document.request-sync=\u540c\u671f\u3092\u30ea\u30af\u30a8\u30b9\u30c8 +actions.document.unzip-to=\u89e3\u51cd\u5148... +actions.folder.download=Zip \u5f62\u5f0f\u3067\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +actions.folder.change-type=\u30bf\u30a4\u30d7\u306e\u5909\u66f4 +actions.folder.copy-to=\u30b3\u30d4\u30fc\u5148... +actions.folder.delete=\u30d5\u30a9\u30eb\u30c0\u306e\u524a\u9664 +actions.folder.edit-metadata=\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u7de8\u96c6 +actions.folder.locate=\u30d5\u30a9\u30eb\u30c0\u306e\u5834\u6240 +actions.folder.manage-aspects=\u30a2\u30b9\u30da\u30af\u30c8\u306e\u7ba1\u7406 +actions.folder.manage-permissions=\u6a29\u9650\u306e\u7ba1\u7406 +actions.folder.take-ownership=\u6240\u6709\u8005\u306b\u306a\u308b +actions.folder.move-to=\u79fb\u52d5\u5148... +actions.folder.rules=\u30eb\u30fc\u30eb\u306e\u7ba1\u7406 +actions.folder.simple-approve=\u627f\u8a8d +actions.folder.simple-reject=\u5374\u4e0b +actions.folder.view-details=\u8a73\u7d30\u306e\u8868\u793a +actions.folder.view-source-repository=\u30bd\u30fc\u30b9\u30ea\u30dd\u30b8\u30c8\u30ea\u3067\u8868\u793a +actions.folder.cloud-sync=\u30af\u30e9\u30a6\u30c9\u3068\u540c\u671f +actions.folder.cloud-unsync=\u30af\u30e9\u30a6\u30c9\u3068\u306e\u540c\u671f\u3092\u89e3\u9664 +actions.folder.view-in-cloud=\u30af\u30e9\u30a6\u30c9\u3067\u8868\u793a +actions.link.delete=\u30ea\u30f3\u30af\u306e\u524a\u9664 +actions.link.locate=\u30ea\u30f3\u30af\u3055\u308c\u3066\u3044\u308b\u30a2\u30a4\u30c6\u30e0\u306e\u8868\u793a +actions.editOnline.failure=\u30d5\u30a1\u30a4\u30eb ''{0}'' \u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u7de8\u96c6\u7528\u306b\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30d6\u30e9\u30a6\u30b6\u306b\u6b21\u306e\u3044\u305a\u308c\u304b\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 \nWindows\u306e\u5834\u5408\uff1a Microsoft Office 2010\nMac OS X\u306e\u5834\u5408\uff1a SharePoint\u30d6\u30e9\u30a6\u30b6\u30d7\u30e9\u30b0\u30a4\u30f3 +actions.editOnline.invalid=\u30d1\u30b9\u306b SPP \u30d7\u30ed\u30c8\u30b3\u30eb\u3067\u8a31\u53ef\u3055\u308c\u3066\u3044\u306a\u3044\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u30d5\u30a1\u30a4\u30eb ''{0}'' \u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u7de8\u96c6\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n\u6b21\u306e\u6587\u5b57\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\uff1a ~ " # % & * : < > ? / \\ { | }\u3002 +actions.synced.document.delete=
''{0}'' \u306f\u540c\u671f\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u524a\u9664\u3059\u308b\u3068\u3001\u30ed\u30fc\u30ab\u30eb\u3068\u30af\u30e9\u30a6\u30c9\u306e\u4e21\u65b9\u304b\u3089\u3053\u306e\u6587\u66f8\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +actions.synced.folder.delete=
''{0}'' \u306f\u540c\u671f\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u524a\u9664\u3059\u308b\u3068\u3001\u30ed\u30fc\u30ab\u30eb\u3068\u30af\u30e9\u30a6\u30c9\u306e\u4e21\u65b9\u304b\u3089\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u3068\u305d\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +actions.synced.remove-sync=
\u3053\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u30af\u30e9\u30a6\u30c9\u306b\u6b8b\u3059\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001[\u540c\u671f\u3092\u524a\u9664] \u51e6\u7406\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +actions.synced.cloud.document.delete=
''{0}'' \u306f\u540c\u671f\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u524a\u9664\u3059\u308b\u3068\u3001\u30ed\u30fc\u30ab\u30eb\u306b\u3042\u308b\u3053\u306e\u6587\u66f8\u3060\u3051\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +actions.synced.cloud.folder.delete=
''{0}'' \u306f\u540c\u671f\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u524a\u9664\u3059\u308b\u3068\u3001\u30ed\u30fc\u30ab\u30eb\u306b\u3042\u308b\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u3068\u305d\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3060\u3051\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +actions.synced.cloud.document.delete.on.prem=
''{0}'' \u306f\u540c\u671f\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u524a\u9664\u3059\u308b\u3068\u3001\u30aa\u30f3\u30d7\u30ec\u30df\u30b9\u3068\u30ed\u30fc\u30ab\u30eb\u306e\u4e21\u65b9\u304b\u3089\u3053\u306e\u6587\u66f8\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +actions.synced.cloud.folder.delete.on.prem=
''{0}'' \u306f\u540c\u671f\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u524a\u9664\u3059\u308b\u3068\u3001\u30aa\u30f3\u30d7\u30ec\u30df\u30b9\u3068\u30ed\u30fc\u30ab\u30eb\u306e\u4e21\u65b9\u304b\u3089\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u3068\u305d\u306e\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 + + + +## Document Library Pop-up Messages +message.actions.failure.locate=\u30ea\u30f3\u30af\u3055\u308c\u3066\u3044\u308b\u30a2\u30a4\u30c6\u30e0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\u30bf\u30fc\u30b2\u30c3\u30c8\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.change-type.success=\u6587\u66f8 ''{0}'' \u306e\u30bf\u30a4\u30d7\u304c\u6b63\u5e38\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f +message.change-type.failure=\u6587\u66f8 ''{0}'' \u306e\u30bf\u30a4\u30d7\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093 +message.confirm.delete=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.delete.success=''{0}'' \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.multiple-delete.please-wait=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002 \u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... +message.confirm.take-ownership.title=\u6240\u6709\u8005\u306b\u306a\u308a\u307e\u3059\u304b? +message.confirm.take-ownership=\u3042\u306a\u305f\u306f ''{0}'' \u306e\u6240\u6709\u8005\u306b\u306a\u308a\u307e\u3059\u3002\u524d\u306e\u6240\u6709\u8005\u3082\u5236\u9650\u4ed8\u304d\u306e\u6a29\u9650\u3092\u6301\u3064\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 +message.take-ownership.success=\u3042\u306a\u305f\u306f ''{0}'' \u306e\u6240\u6709\u8005\u306b\u306a\u308a\u307e\u3057\u305f +message.take-ownership.failure=''{0}'' \u306e\u6240\u6709\u8005\u306b\u306a\u308c\u307e\u305b\u3093\u3067\u3057\u305f +message.details.success=\u8a73\u7d30\u304c\u6b63\u5e38\u306b\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.details.failure=\u8a73\u7d30\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.details.failure.name=\u30a2\u30a4\u30c6\u30e0\u306e\u540d\u524d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u540c\u3058\u540d\u524d\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u3059\u3067\u306b\u5b58\u5728\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 +message.details.failure.more.max.length=\u3044\u305a\u308c\u304b\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u30b5\u30a4\u30ba\u304c\u6700\u5927\u5024\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\u3002 +message.sync.success=\u540c\u671f\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.sync.failure=\u540c\u671f\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.sync.unavailable=\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3002 +message.unsync.confirm=''{0}'' \u306e\u540c\u671f\u3092\u89e3\u9664\u3057\u307e\u3059\u304b? +message.unsync.success=\u540c\u671f\u304c\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059 +message.unsync.failure=\u540c\u671f\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.request.sync.success=\u540c\u671f\u304c\u6b63\u5e38\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u307e\u3057\u305f +message.request.sync.failure=\u540c\u671f\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.error=\u6587\u66f8\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.empty=\u30a2\u30a4\u30c6\u30e0\u306a\u3057 +message.empty.subfolders=\u30a2\u30a4\u30c6\u30e0\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u3053\u3053\u3067 {1} \u500b\u306e\u30b5\u30d6\u30d5\u30a9\u30eb\u30c0\u3092\u8868\u793a\u3059\u308b\u306b\u306f\u3001"{0}" \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002 +message.empty.subfolders.link=\u30d5\u30a9\u30eb\u30c0\u3092\u8868\u793a +message.edit-offline.failure=''{0}'' \u3092\u7de8\u96c6\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 +message.edit-offline.success=''{0}'' \u304c\u7de8\u96c6\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f +message.edit-offline.success.ie7=\u4e0b\u306e\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u6587\u66f8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-online.office.failure=MS Office \u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.edit-online.office.path.failure=URL \u304c 260 \u6587\u5b57\u3088\u308a\u9577\u3044\u305f\u3081\u3001\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u7de8\u96c6\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 \u3088\u308a\u77ed\u3044\u30d1\u30b9\u306b\u3057\u3066\u3001\u6587\u5b57\u6570\u3092\u6e1b\u3089\u3057\u3066\u304f\u3060\u3055\u3044. +message.edit-online-aos.no_supported_environment=\u3053\u306e\u6a5f\u80fd\u306f\u3001Windows \u307e\u305f\u306f Mac OS X \u3067\u306e\u307f\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002 +message.edit-online-aos.starting_office_failed=Microsoft Office \u3092\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.edit-online-aos.plugin_blocked.caption=Microsoft Office \u304c\u30d6\u30ed\u30c3\u30af\u3055\u308c\u307e\u3057\u305f +message.edit-online-aos.plugin_blocked.body.firefox=\u64cd\u4f5c\u3092\u7d9a\u3051\u308b\u306b\u306f\u3001Firefox \u306e\u30c4\u30fc\u30eb\u30d0\u30fc\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-online-aos.plugin_blocked.body.chrome=\u64cd\u4f5c\u3092\u7d9a\u3051\u308b\u306b\u306f\u3001Chrome \u306e\u30a2\u30c9\u30ec\u30b9\u30d0\u30fc\u306e\u30d6\u30ed\u30c3\u30af\u3055\u308c\u305f\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-online-aos.plugin_blocked.body.safari=\u64cd\u4f5c\u3092\u7d9a\u3051\u308b\u306b\u306f\u3001[\u4fe1\u983c] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=\u304a\u4f7f\u3044\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Microsoft Office \u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u307e\u305b\u3093\u3002Microsoft Office \u3092\u66f4\u65b0\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +message.edit-online-aos.edit_offline_locked.title={0} \u304c\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3057\u3066\u3044\u307e\u3059 +message.edit-online-aos.edit_offline_locked.message=\u3042\u306a\u305f\u304c\u52a0\u3048\u305f\u5909\u66f4\u306f\u3059\u3079\u3066\u5931\u308f\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 +message.edit-online-aos.edit_offline_locked.confirm=\u7d9a\u884c +message.edit-online-aos.edit_offline_locked.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +message.edit-online-aos.edit_locked.title={0} \u304c\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3057\u3066\u3044\u307e\u3059 +message.edit-online-aos.edit_locked.message=\u6587\u66f8\u306f\u3001\u73fe\u5728\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=''{0}'' \u306e\u30ed\u30c3\u30af\u3092\u89e3\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.edit-cancel.failure=''{0}'' \u306e\u7de8\u96c6\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.edit-cancel.success=''{0}'' \u306e\u7de8\u96c6\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 +message.unlock-document.success=''{0}'' \u306e\u7de8\u96c6\u306e\u30ed\u30c3\u30af\u304c\u89e3\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.file-dnd-move.failure=\u6587\u66f8\u3092\u79fb\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.increment-counter.success=\u30ab\u30a6\u30f3\u30bf\u304c\u5897\u5206\u3055\u308c\u307e\u3057\u305f +message.increment-counter.failure=\u30ab\u30a6\u30f3\u30bf\u3092\u5897\u5206\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.extract-metadata.success=\u30e1\u30bf\u30c7\u30fc\u30bf\u304c\u6b63\u5e38\u306b\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 +message.extract-metadata.failure=\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.execute-script.success=\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u6b63\u5e38\u306b\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f +message.execute-script.failure=\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.insitu-edit.name.failure=\u30d5\u30a1\u30a4\u30eb\u306e\u540d\u524d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u540c\u3058\u540d\u524d\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u3059\u3067\u306b\u5b58\u5728\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 +message.loading=\u6587\u66f8\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.simple-workflow.failure=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u51e6\u7406\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.simple-workflow.approved=\u30a2\u30a4\u30c6\u30e0\u306f\u627f\u8a8d\u6e08\u307f\u3068\u3057\u3066\u30de\u30fc\u30af\u3055\u308c\u307e\u3057\u305f +message.simple-workflow.rejected=\u30a2\u30a4\u30c6\u30e0\u306f\u5374\u4e0b\u6e08\u307f\u3068\u3057\u3066\u30de\u30fc\u30af\u3055\u308c\u307e\u3057\u305f +message.simple-workflow.failed=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u51e6\u7406\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.transform.success=\u6587\u66f8 ''{0}'' \u304c\u6b63\u5e38\u306b\u5909\u63db\u3055\u308c\u307e\u3057\u305f +message.transform.failure=\u6587\u66f8\u3092\u5909\u63db\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.transform-image.success=\u753b\u50cf ''{0}'' \u304c\u6b63\u5e38\u306b\u5909\u63db\u3055\u308c\u307e\u3057\u305f +message.transform-image.failure=\u6587\u66f8\u3092\u5909\u63db\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.new-version-upload.success=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 \u30d7\u30ec\u30d3\u30e5\u30fc\u306b\u6587\u66f8\u306e\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u307e\u3060\u8868\u793a\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u3001\u5f8c\u3067\u30da\u30fc\u30b8\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3059\u308b\u3068\u30d7\u30ec\u30d3\u30e5\u30fc\u304c\u66f4\u65b0\u3055\u308c\u307e\u3059\u3002 + +message.insitu-edit.tag.failure=\u30bf\u30b0\u3092\u7de8\u96c6\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f + +## Drag and Drop +message.dnd.allColumnsAreFull=\u3059\u3079\u3066\u306e\u5217\u304c\u3075\u3055\u304c\u3063\u3066\u3044\u308b\u305f\u3081\u8981\u7d20\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093 + +## Data Dictionary +# Aspects +aspect.cm_complianceable=\u6cd5\u4ee4\u9075\u5b88\u53ef\u80fd +aspect.cm_dublincore=\u30c0\u30d6\u30ea\u30f3\u30b3\u30a2 +aspect.cm_effectivity=\u6709\u52b9\u6027 +aspect.cm_emailed=E \u30e1\u30fc\u30eb\u60c5\u5831 +aspect.cm_generalclassifiable=\u5206\u985e\u53ef\u80fd +aspect.cm_summarizable=\u8981\u7d04\u53ef\u80fd +aspect.cm_taggable=\u30bf\u30b0\u4ed8\u3051\u53ef\u80fd +aspect.cm_templatable=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5316\u53ef\u80fd +aspect.cm_versionable=\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u53ef\u80fd +aspect.emailserver_aliasable=E \u30e1\u30fc\u30eb\u30a8\u30a4\u30ea\u30a2\u30b9 +aspect.app_inlineeditable=\u30a4\u30f3\u30e9\u30a4\u30f3\u7de8\u96c6\u53ef\u80fd +aspect.cm_geographic=\u5730\u7406\u60c5\u5831 +aspect.exif_exif=EXIF +aspect.exif_resolution=\u89e3\u50cf\u5ea6 +aspect.exif_camera=\u30ab\u30e1\u30e9\u306e\u8a73\u7d30 +aspect.audio_audio=\u30aa\u30fc\u30c7\u30a3\u30aa +aspect.cm_indexControl=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb +aspect.dp_restrictable=\u5236\u9650\u53ef\u80fd +aspect.cm_attachable=\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb + +# Groups +group.everyone=\u5168\u54e1 + +# Types +type.cm_content=\u30b3\u30f3\u30c6\u30f3\u30c4\u30d9\u30fc\u30b9\u30bf\u30a4\u30d7 +type.cm_folder=\u30d5\u30a9\u30eb\u30c0\u30d9\u30fc\u30b9\u30bf\u30a4\u30d7 +type.trx_transferTarget=\u8ee2\u9001\u5148 +type.trx_fileTransferTarget=\u30d5\u30a1\u30a4\u30eb\u8ee2\u9001\u5148 + +# Generic Form labels +form.set.general=\u4e00\u822c +form.set.operations=\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3 + +# Runtime +runtime.field.FreeMemory=\u7a7a\u304d\u30e1\u30e2\u30ea +runtime.field.MaxMemory=\u6700\u5927\u30e1\u30e2\u30ea +runtime.field.TotalMemory=\u5408\u8a08\u30e1\u30e2\u30ea + +# Repository Server +repository-server.set.version=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +repository-server.field.Name=\u540d\u524d +repository-server.field.Id=ID +repository-server.field.Edition=\u7248 +repository-server.field.Schema=\u30b9\u30ad\u30fc\u30de +repository-server.field.Version=\u30d0\u30fc\u30b8\u30e7\u30f3 +repository-server.field.VersionLabel=\u30e9\u30d9\u30eb +repository-server.field.VersionMinor=\u30de\u30a4\u30ca\u30fc +repository-server.field.VersionMajor=\u30e1\u30b8\u30e3\u30fc +repository-server.field.VersionRevision=\u6539\u8a02 +repository-server.field.VersionBuild=\u30d3\u30eb\u30c9 +repository-server.field.VersionNumber=\u756a\u53f7 + +# Repository Installed +repository-installed.set.version=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +repository-installed.field.Name=\u540d\u524d +repository-installed.field.Id=ID +repository-installed.field.Edition=\u7248 +repository-installed.field.Schema=\u30b9\u30ad\u30fc\u30de +repository-installed.field.Version=\u30d0\u30fc\u30b8\u30e7\u30f3 +repository-installed.field.VersionLabel=\u30e9\u30d9\u30eb +repository-installed.field.VersionMinor=\u30de\u30a4\u30ca\u30fc +repository-installed.field.VersionMajor=\u30e1\u30b8\u30e3\u30fc +repository-installed.field.VersionRevision=\u6539\u8a02 +repository-installed.field.VersionBuild=\u30d3\u30eb\u30c9 +repository-installed.field.VersionNumber=\u756a\u53f7 + +# Authority +authority.field.NumberOfGroups=\u30b0\u30eb\u30fc\u30d7\u6570 +authority.field.NumberOfUsers=\u30e6\u30fc\u30b6\u30fc\u6570 + +# License +header.license= +license.field.Subject=\u30e9\u30a4\u30bb\u30f3\u30b9\u5bfe\u8c61 +license.field.Days=\u65e5\u6570 +license.field.Holder=\u6240\u6709\u8005 +license.field.ValidUntil=\u6709\u52b9\u671f\u9650 +license.field.RemainingDays=\u6b8b\u308a\u65e5\u6570 +license.field.Issued=\u767a\u884c\u65e5 +license.field.Issuer=\u767a\u884c\u8005 +license.field.HeartBeatDisabled=\u30cf\u30fc\u30c8\u30d3\u30fc\u30c8\u7121\u52b9 +license.field.LicenseMode=\u30e9\u30a4\u30bb\u30f3\u30b9\u30e2\u30fc\u30c9 +license.field.CloudSyncKeyAvailable=\u30af\u30e9\u30a6\u30c9\u540c\u671f\u30ad\u30fc\u4f7f\u7528\u53ef +license.field.MaxDocs=\u30b3\u30f3\u30c6\u30f3\u30c4\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u6700\u5927\u6570 +license.field.MaxUsers=\u6700\u5927\u30e6\u30fc\u30b6\u30fc\u6570 +license.field.Users=\u30e6\u30fc\u30b6\u30fc +license.field.Documents=\u30b3\u30f3\u30c6\u30f3\u30c4\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 +license.field.Info=\u30e6\u30fc\u30b6\u30fc\u6570\u306b\u5236\u9650\u306e\u306a\u3044\u30e9\u30a4\u30bb\u30f3\u30b9\u3092\u304a\u6301\u3061\u306e\u5834\u5408\u306f\u3001\u3053\u3053\u306b 0 \u3068\u8868\u793a\u3055\u308c\u307e\u3059\u3002 + +# Pdf2Swf +pdf2swf.field.Available=\u5229\u7528\u53ef\u80fd +pdf2swf.field.VersionString=\u30d0\u30fc\u30b8\u30e7\u30f3 + +# Open Office +openoffice.field.available=\u5229\u7528\u53ef\u80fd +openoffice.field.ooName=\u540d\u524d +openoffice.field.ooOpenSourceContext=\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8 +openoffice.field.ooSetupExtension=\u62e1\u5f35\u5b50 +openoffice.field.ooSetupVersion=\u30d0\u30fc\u30b8\u30e7\u30f3 +openoffice.field.ooSetupVersionAboutBox=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +openoffice.field.ooXMLFileFormatName=XML \u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f +openoffice.field.ooXMLFileFormatVersion=XML\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 +openoffice.error=OpenOffice \u60c5\u5831\u3092\u8868\u793a\u3067\u304d\u307e\u305b\u3093 +openoffice.error.404=OpenOffice \u306e\u60c5\u5831\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\uff08\u300cooo.enabled\u300d\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u300cfalse\u300d\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\uff09 + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=\u6709\u52b9 +openoffice-subsystem.field.ooo.exe=Exe +openoffice-subsystem.field.ooo.port=\u30dd\u30fc\u30c8 + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=\u6709\u52b9 +ooojodconverter.field.jodconverter.maxTasksPerProcess=\u30d7\u30ed\u30bb\u30b9\u3042\u305f\u308a\u306e\u6700\u5927\u30bf\u30b9\u30af\u6570 +ooojodconverter.field.jodconverter.officeHome=Office \u30db\u30fc\u30e0 +ooojodconverter.field.jodconverter.portNumbers=\u30dd\u30fc\u30c8\u756a\u53f7 +ooojodconverter.field.jodconverter.taskExecutionTimeout=\u30bf\u30b9\u30af\u306e\u5b9f\u884c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 +ooojodconverter.field.jodconverter.taskQueueTimeout=\u30bf\u30b9\u30af\u30ad\u30e5\u30fc\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 + +# Transformer ImageMagick +transformer-imagemagick.field.Available=\u5229\u7528\u53ef\u80fd +transformer-imagemagick.field.VersionString=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 + +# File servers +fileservers.set.filesystem=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0 +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30a2\u30af\u30bb\u30b9\u30ec\u30d9\u30eb +fileservers.field.filesystem.acl.global.domainAccessControls=\u30c9\u30e1\u30a4\u30f3\u30a2\u30af\u30bb\u30b9\u5236\u5fa1 +fileservers.field.filesystem.acl.global.protocolAccessControls=\u30d7\u30ed\u30c8\u30b3\u30eb\u30a2\u30af\u30bb\u30b9\u5236\u5fa1 +fileservers.field.filesystem.acl.global.userAccessControls=\u30e6\u30fc\u30b6\u30fc\u30a2\u30af\u30bb\u30b9\u5236\u5fa1 +fileservers.field.filesystem.domainMappings=\u30c9\u30e1\u30a4\u30f3\u30de\u30c3\u30d4\u30f3\u30b0 +fileservers.field.filesystem.name=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u540d +fileservers.field.filesystem.name.description=CIFS/FTP/WebDAV \u304b\u3089\u30a2\u30af\u30bb\u30b9\u3059\u308b\u969b\u306b\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u540d\u524d +fileservers.field.cifs.WINS.autoDetectEnabled=WINS \u81ea\u52d5\u691c\u51fa\u6709\u52b9 +fileservers.field.cifs.WINS.primary=WINS \u30d7\u30e9\u30a4\u30de\u30ea +fileservers.field.cifs.WINS.secondary=WINS \u30bb\u30ab\u30f3\u30c0\u30ea +fileservers.field.cifs.bindto=\u30d0\u30a4\u30f3\u30c9\u5148 +fileservers.field.cifs.broadcast=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 +fileservers.field.cifs.disableNIO=NIO \u3092\u7121\u52b9\u306b\u3059\u308b +fileservers.field.cifs.disableNativeCode=\u30cd\u30a4\u30c6\u30a3\u30d6\u30b3\u30fc\u30c9\u3092\u7121\u52b9\u306b\u3059\u308b +fileservers.field.cifs.domain=\u30c9\u30e1\u30a4\u30f3 +fileservers.field.cifs.enabled=CIFS \u6709\u52b9 +fileservers.field.cifs.hostannounce=\u30db\u30b9\u30c8\u306e\u30a2\u30ca\u30a6\u30f3\u30b9 +fileservers.field.cifs.ipv6.enabled=IPV6 \u6709\u52b9 +fileservers.field.cifs.netBIOSSMB.datagramPort=NetBIOS SMB \u30c7\u30fc\u30bf\u30b0\u30e9\u30e0\u30dd\u30fc\u30c8 +fileservers.field.cifs.netBIOSSMB.namePort=NetBIOS SMB \u540d\u524d\u89e3\u6c7a\u30dd\u30fc\u30c8 +fileservers.field.cifs.netBIOSSMB.sessionPort=NetBIOS SMB \u30bb\u30c3\u30b7\u30e7\u30f3\u30dd\u30fc\u30c8 +fileservers.field.cifs.serverName=\u30b5\u30fc\u30d0\u30fc\u540d +fileservers.field.cifs.sessionDebug=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30c7\u30d0\u30c3\u30b0 +fileservers.field.cifs.sessionTimeout=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 +fileservers.field.cifs.tcpipSMB.port=TCP/IP SMB \u30dd\u30fc\u30c8 +fileservers.field.ftp.dataPortFrom=\u30c7\u30fc\u30bf\u30dd\u30fc\u30c8\u5143 +fileservers.field.ftp.dataPortTo=\u30c7\u30fc\u30bf\u30dd\u30fc\u30c8\u5148 +fileservers.field.ftp.enabled=FTP \u6709\u52b9 +fileservers.field.ftp.keyStore=\u30ad\u30fc\u30b9\u30c8\u30a2 +fileservers.field.ftp.passphrase=\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba +fileservers.field.ftp.port=\u30dd\u30fc\u30c8 +fileservers.field.ftp.requireSecureSession=\u5b89\u5168\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u5fc5\u8981 +fileservers.field.ftp.sessionDebug=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30c7\u30d0\u30c3\u30b0 +fileservers.field.ftp.sslEngineDebug=SSL \u30a8\u30f3\u30b8\u30f3\u306e\u30c7\u30d0\u30c3\u30b0 +fileservers.field.ftp.trustStore=\u30c8\u30e9\u30b9\u30c8\u30b9\u30c8\u30a2 + +# Sysadmin +sysadmin.field.alfresco.context=\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8 +sysadmin.field.alfresco.host=\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30db\u30b9\u30c8 +sysadmin.field.alfresco.port=\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30dd\u30fc\u30c8 +sysadmin.field.alfresco.protocol=\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30d7\u30ed\u30c8\u30b3\u30eb +sysadmin.field.server.allowedusers=\u8a31\u53ef\u3059\u308b\u30e6\u30fc\u30b6\u30fc +sysadmin.field.server.maxusers=\u6700\u5927\u30e6\u30fc\u30b6\u30fc\u6570 +sysadmin.field.server.transaction.allow-writes=\u66f8\u8fbc\u307f\u3092\u8a31\u53ef +sysadmin.field.share.context=Share \u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8 +sysadmin.field.share.host=\u5171\u6709\u30db\u30b9\u30c8 +sysadmin.field.share.port=\u5171\u6709\u30dd\u30fc\u30c8 +sysadmin.field.share.protocol=\u5171\u6709\u30d7\u30ed\u30c8\u30b3\u30eb + +# Email (Inbound) +email-inbound.set.service=\u7740\u4fe1 E \u30e1\u30fc\u30eb\u30b5\u30fc\u30d3\u30b9 +email-inbound.field.email.inbound.enabled=\u30b5\u30fc\u30d3\u30b9\u6709\u52b9 +email-inbound.field.email.inbound.unknownUser=\u4e0d\u660e\u306a\u30e6\u30fc\u30b6\u30fc +email-inbound.set.server=\u7740\u4fe1 E \u30e1\u30fc\u30eb\u30b5\u30fc\u30d0\u30fc +email-inbound.field.email.server.allowed.senders=\u8a31\u53ef\u3059\u308b\u9001\u4fe1\u8005 +email-inbound.field.email.server.blocked.senders=\u30d6\u30ed\u30c3\u30af\u3059\u308b\u9001\u4fe1\u8005 +email-inbound.field.email.server.enabled=\u30b5\u30fc\u30d0\u30fc\u6709\u52b9 +email-inbound.field.email.server.domain=\u30c9\u30e1\u30a4\u30f3 +email-inbound.field.email.server.port=\u30dd\u30fc\u30c8 +email-inbound.field.email.server.connections.max=\u6700\u5927\u63a5\u7d9a\u6570 +email-inbound.set.tls=\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u5c64\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 +email-inbound.field.email.server.requireTLS=\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u5c64\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \uff08TLS\uff09 \u304c\u5fc5\u8981 +email-inbound.field.email.server.hideTLS=\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u5c64\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \uff08TLS\uff09 \u3092 EHELO \u3067\u8fd4\u3055\u306a\u3044 +email-inbound.field.email.server.enableTLS=\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u5c64\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \uff08TLS\uff09 \u3092\u53d7\u3051\u5165\u308c\u308b + +# Email (Outbound) +email-outbound.set.auth=\u8a8d\u8a3c +email-outbound.set.test-message=\u30c6\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8 +email-outbound.field.mail.host=\u30db\u30b9\u30c8 +email-outbound.field.mail.port=\u30dd\u30fc\u30c8 +email-outbound.field.mail.protocol=\u30d7\u30ed\u30c8\u30b3\u30eb +email-outbound.field.mail.encoding=\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0 +email-outbound.field.mail.from.default=\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u9001\u4fe1\u8005\u30a2\u30c9\u30ec\u30b9 +email-outbound.field.mail.from.enabled=\u30e1\u30fc\u30eb\u306e\u9001\u4fe1\u6709\u52b9 +email-outbound.field.mail.smtp.auth=SMTP \u8a8d\u8a3c\u304c\u5fc5\u8981 +email-outbound.field.mail.smtps.auth=SMTPS \u8a8d\u8a3c\u304c\u5fc5\u8981 +email-outbound.field.mail.username=\u30e6\u30fc\u30b6\u30fc\u540d +email-outbound.field.mail.password=\u30d1\u30b9\u30ef\u30fc\u30c9 +email-outbound.field.mail.testmessage.send=\u30b9\u30bf\u30fc\u30c8\u30a2\u30c3\u30d7\u6642\u306b\u30c6\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3059\u308b +email-outbound.field.mail.testmessage.to=\u5b9b\u5148 +email-outbound.field.mail.testmessage.subject=\u4ef6\u540d +email-outbound.field.mail.testmessage.text=\u30e1\u30c3\u30bb\u30fc\u30b8 + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=\u30db\u30fc\u30e0\u30d5\u30a9\u30eb\u30c0\u306e\u30d1\u30b9 +imap.field.imap.config.home.rootPath=\u30db\u30fc\u30e0\u30eb\u30fc\u30c8\u306e\u30d1\u30b9 +imap.field.imap.config.home.store=\u30db\u30fc\u30e0\u30b9\u30c8\u30a2 +imap.field.imap.server.attachments.extraction.enabled=\u62bd\u51fa\u6709\u52b9 +imap.field.imap.config.ignore.extraction=\u62bd\u51fa\u3092\u7121\u8996\u3059\u308b +imap.field.imap.config.server.mountPoints=\u30de\u30a6\u30f3\u30c8\u30dd\u30a4\u30f3\u30c8 +imap.field.imap.mail.from.default=\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30e1\u30fc\u30eb\u5dee\u51fa\u4eba +imap.field.imap.mail.to.default=\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30e1\u30fc\u30eb\u5b9b\u5148 +imap.field.imap.server.enabled=\u6709\u52b9 +imap.field.imap.server.host=\u30db\u30b9\u30c8 +imap.field.imap.server.port=\u30dd\u30fc\u30c8 + +# Activities Feed +activities.set.activities=\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30d5\u30a3\u30fc\u30c9 +activities.field.feed.notifier.enabled=\u30d5\u30a3\u30fc\u30c9\u901a\u77e5\u6709\u52b9 +activities.field.feed.notifier.repeatIntervalMins=\u7e70\u308a\u8fd4\u3057\u9593\u9694\uff08\u5206\uff09 +activities.field.feed.max.ageMins=\u6700\u5927\u7d4c\u904e\u6642\u9593 (\u5206) +activities.field.feed.max.size=\u6700\u5927\u30b5\u30a4\u30ba + +# Subscriptions +subscriptions.field.subscriptions.enabled=\u6709\u52b9 + +# Workflow +workflow.field.message=\u30e1\u30c3\u30bb\u30fc\u30b8 +workflow.field.comment=\u30b3\u30e1\u30f3\u30c8 +workflow.field.assign_to=\u5272\u308a\u5f53\u3066\u5148 +workflow.field.review_group=\u30ec\u30d3\u30e5\u30fc\u30b0\u30eb\u30fc\u30d7 +workflow.field.reviewer=\u30ec\u30d3\u30e5\u30a2 +workflow.field.reviewers=\u30ec\u30d3\u30e5\u30a2 +workflow.field.due=\u671f\u9650 +workflow.field.priority=\u512a\u5148\u5ea6 +workflow.field.outcome=\u7d50\u679c +workflow.field.enabled.activiti=\u6709\u52b9 +workflow.field.enabled.jbpm=\u6709\u52b9 +workflow.field.definitions.visible=\u8868\u793a\u53ef\u80fd\u306a\u5b9a\u7fa9 +workflow.field.number.tasks=\u30bf\u30b9\u30af\u6570 +workflow.field.number.definitions=\u5b9a\u7fa9\u6570 +workflow.field.number.workflows=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u6570 +workflow.field.requiredApprovePercent=\u5fc5\u8981\u306a\u627f\u8a8d\u6bd4\u7387 +workflow.set.general=\u4e00\u822c +workflow.set.assignee=\u62c5\u5f53\u8005 +workflow.set.assignees=\u62c5\u5f53\u8005 +workflow.set.information=\u60c5\u5831 +workflow.set.items=\u30a2\u30a4\u30c6\u30e0 +workflow.set.outcome=\u7d50\u679c +workflow.set.other=\u305d\u306e\u4ed6\u306e\u30aa\u30d7\u30b7\u30e7\u30f3 +workflow.set.task.info=\u60c5\u5831 +workflow.set.workflow.more_info=\u8a73\u7d30 +workflow.set.task.progress=\u9032\u884c\u72b6\u6cc1 +workflow.set.response=\u5fdc\u7b54 +workflow.set.engine.activiti=Activiti \u30a8\u30f3\u30b8\u30f3 +workflow.set.engine.jbpm=JBPM \u30a8\u30f3\u30b8\u30f3 +workflow.task.error=\u30bf\u30b9\u30af\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +workflow.task.error.404=\u30bf\u30b9\u30af\u304c\u5b58\u5728\u3057\u306a\u3044\u304b\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +workflow.task.invite.title={0} \u30b5\u30a4\u30c8 +workflow.task.invite.subtitle={0} \u30b5\u30a4\u30c8\u306b\u53c2\u52a0\u3059\u308b\u3088\u3046\u62db\u5f85\u3055\u308c\u307e\u3057\u305f\u3002 +workflow.task.invite.role=\u3042\u306a\u305f\u306e\u5f79\u5272\u306f {0} \u3067\u3059\u3002 +workflow.task.invite.accepted={1} {0} \u304c {2} \u30b5\u30a4\u30c8\u3078\u306e\u53c2\u52a0\u306e\u62db\u5f85\u3092\u627f\u8afe\u3057\u307e\u3057\u305f\u3002 +workflow.task.invite.rejected={1} {0} \u304c {2} \u30b5\u30a4\u30c8\u3078\u306e\u53c2\u52a0\u306e\u62db\u5f85\u3092\u5374\u4e0b\u3057\u307e\u3057\u305f\u3002 +workflow.task.request.invite.title=\u30e6\u30fc\u30b6\u30fc {0} \u304c {1} \u30b5\u30a4\u30c8\u3078\u306e\u53c2\u52a0\u3092\u8981\u8acb\u3057\u307e\u3057\u305f\u3002 +workflow.cancel.title=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u30ad\u30e3\u30f3\u30bb\u30eb +workflow.cancel.label=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u304b? +workflow.cancel.feedback=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u3044\u307e\u3059... +workflow.cancel.success=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306f\u6b63\u5e38\u306b\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f +workflow.cancel.failure=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +workflow.delete.title=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u524a\u9664 +workflow.delete.label=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u524a\u9664\u3057\u307e\u3059\u304b? +workflow.delete.feedback=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... +workflow.delete.success=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306f\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f +workflow.delete.failure=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +workflow.no_message=(\u30e1\u30c3\u30bb\u30fc\u30b8\u306a\u3057) +tool.workflow.activiti.tools=Activiti \u30c4\u30fc\u30eb +tool.workflow.activiti.admin.link=Activiti \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30b3\u30f3\u30bd\u30fc\u30eb + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3 +tool.searchmanager.description=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3 + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=\u6709\u52b9 +lucene.field.dir.indexes=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea +lucene.field.index.recovery.mode=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u56de\u5fa9\u30e2\u30fc\u30c9 +lucene.field.lucene.indexer.contentIndexingEnabled=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u6709\u52b9 +lucene.field.index.tracking.disableInTransactionIndexing=\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3067\u306f\u8ffd\u8de1\u3092\u7121\u52b9\u306b\u3059\u308b + +lucene.set.backup=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7 +lucene.backup.field.dir.indexes.backup=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30c7\u30a3\u30ec\u30af\u30c8\u30ea +lucene.backup.field.index.backup.cronExpression=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e Cron \u5f0f + +lucene.set.advanced=\u8a73\u7d30\u8a2d\u5b9a +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u6709\u52b9 +lucene.advanced.field.fts.indexer.batchSize=\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316 +lucene.advanced.field.lucene.maxAtomicTransformationTime=\u6700\u5927\u30a2\u30c8\u30df\u30c3\u30af\u5909\u63db\u6642\u9593 +lucene.advanced.field.index.reindexMissingContent.cronExpression=\u4e0d\u8db3\u30b3\u30f3\u30c6\u30f3\u30c4\u306e Cron \u5f0f +lucene.advanced.field.indexer.maxFieldLength=\u6587\u66f8\u3042\u305f\u308a\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4ed8\u304d\u30c8\u30fc\u30af\u30f3\u306e\u6700\u5927\u6570 +lucene.field.indexer.mergerMaxMergeDocs=\u6700\u5927\u30de\u30fc\u30b8\u6587\u66f8\u6570 +lucene.field.indexer.mergerMergeFactor=\u6700\u5927\u30de\u30fc\u30b8\u30d5\u30a1\u30af\u30bf + +# Transform action form +transform.field.mime-type=\u5fc5\u9808\u30d5\u30a9\u30fc\u30de\u30c3\u30c8 +transform.field.destination-folder=\u5b9b\u5148 + +# Transform Image action form +transform-image.field.mime-type=\u5fc5\u9808\u30d5\u30a9\u30fc\u30de\u30c3\u30c8 +transform-image.field.convert-command=\u30aa\u30d7\u30b7\u30e7\u30f3 +transform-image.field.destination-folder=\u5b9b\u5148 + +publish-content.field.publish-channel-id=\u516c\u958b\u30c1\u30e3\u30cd\u30eb +publish-content.field.unpublish=\u975e\u516c\u958b +publish-content.field.status-update=\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u66f4\u65b0 +publish-content.field.status-update-channel-id=\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u66f4\u65b0\u30c1\u30e3\u30cd\u30eb + +# Execute Script action form +script.field.script-ref=\u30b9\u30af\u30ea\u30d7\u30c8 + +# Solr +solr.set.spacesstore=\u30e1\u30a4\u30f3\u30b9\u30c8\u30a2\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 +solr.set.archivestore=\u30a2\u30fc\u30ab\u30a4\u30d6\u30b9\u30c8\u30a2\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 +solr.field.search.solrTrackingSupport.enabled=\u8ffd\u8de1\u6709\u52b9 +solr.help.search.solrTrackingSupport.enabled=Solr \u3067\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u3066\u3001\u66f4\u65b0\u306e\u8ffd\u8de1\u3068\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059 +solr.field.solr.host=Solr \u30db\u30b9\u30c8\u306e\u540d\u524d +solr.help.field.solr.host=Solr \u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u30db\u30b9\u30c8\u306e\u540d\u524d\u3002 \u540c\u3058\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u4e0a\u3067\u5b9f\u884c\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u3001localhost \u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +solr.field.solr.port=Solr \u306e\u30dd\u30fc\u30c8 (\u975e SSL) +solr.help.field.solr.port=Solr \u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u30fc\u306e \uff08\u7121\u4fdd\u8b77\uff09 http \u30dd\u30fc\u30c8\u3002 Solr \u304c\u4fdd\u8b77\u3055\u308c\u3066\u3044\u308b\u901a\u4fe1\u3092\u4f7f\u308f\u305a\u306b\u5b9f\u884c\u3059\u308b\u3088\u3046\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u306e\u307f\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002 +solr.field.solr.port.ssl=Solr \u306e SSL \u30dd\u30fc\u30c8 +solr.help.field.solr.port.ssl=Solr \u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u30fc\u306e https \u30dd\u30fc\u30c8\u3002 + +# Tracker Properties +solr.field.tracker.alfresco.active=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u304c\u9032\u884c\u4e2d +solr.field.tracker.alfresco.lag=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u9045\u5ef6\uff08\u79d2\uff09 +solr.field.tracker.alfresco.last.indexed.txn=\u524d\u56de\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3 +solr.field.tracker.alfresco.approx.txns.remaining=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3059\u308b\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306e\u6570 +solr.field.tracker.alfresco.approx.indexing.time.remaining=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u6b8b\u308a\u6642\u9593 +solr.help.field.tracker.alfresco.lag=Solr\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306f\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u66f4\u65b0\u3055\u308c\u307e\u3059\u3002 \u3053\u308c\u306f\u3001Solr\u306e\u30d5\u30eb\u30c6\u30ad\u30b9\u30c8\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u73fe\u5728\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u66f4\u65b0\u3088\u308a\u4f55\u79d2\u9045\u308c\u3066\u3044\u308b\u304b\u3092\u793a\u3057\u307e\u3059\u3002 +solr.field.tracker.archive.active=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u304c\u9032\u884c\u4e2d +solr.field.tracker.archive.lag=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u9045\u5ef6\uff08\u79d2\uff09 +solr.field.tracker.archive.last.indexed.txn=\u524d\u56de\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3 +solr.field.tracker.archive.approx.txns.remaining=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3059\u308b\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306e\u6570 +solr.field.tracker.archive.approx.indexing.time.remaining=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u6b8b\u308a\u6642\u9593 + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e Cron \u5f0f +solr.field.solr.backup.alfresco.remoteBackupLocation=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u4fdd\u5b58\u5834\u6240 +solr.field.solr.backup.alfresco.numberToKeep=\u4fdd\u6301\u3059\u308b\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u6570 +solr.help.solr.backup.alfresco.remoteBackupLocation=Solr \u30b5\u30fc\u30d0\u30fc\u306e\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u4e0a\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u4fdd\u5b58\u3059\u308b\u5834\u6240\u306e\u30d5\u30eb\u30d1\u30b9 +solr.help.solr.backup.alfresco.numberToKeep=\u4fdd\u6301\u3059\u308b\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u6570 \uff08\u6700\u65b0\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u542b\u3080\uff09 +solr.field.solr.backup.archive.cronExpression=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e Cron \u5f0f +solr.field.solr.backup.archive.remoteBackupLocation=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u4fdd\u5b58\u5834\u6240 +solr.field.solr.backup.archive.numberToKeep=\u4fdd\u6301\u3059\u308b\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u6570 +solr.help.solr.backup.archive.remoteBackupLocation=Solr \u30b5\u30fc\u30d0\u30fc\u306e\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u4e0a\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u4fdd\u5b58\u3059\u308b\u5834\u6240\u306e\u30d5\u30eb\u30d1\u30b9 +solr.help.solr.backup.archive.numberToKeep=\u4fdd\u6301\u3059\u308b\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u6570 \uff08\u6700\u65b0\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u542b\u3080\uff09 + +# searchmanager +searchmanager.field.sourceBeanName=\u691c\u7d22\u30b5\u30fc\u30d3\u30b9 + +## Tooltips +tooltip.path=\u30d1\u30b9\uff1a {0} +tooltip.site=\u30b5\u30a4\u30c8\uff1a {0} + +## Create content +create-content.text=\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=\u30d5\u30a9\u30eb\u30c0 + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=\u6708\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 +calendar.widget_control_config.label_year=\u5e74\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 +calendar.widget_control_config.label_invalid_year=\u6709\u52b9\u306a\u5e74\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=\u30ea\u30f3\u30af\u5148\uff1a {0} +details.created-by=\u4f5c\u6210\u65e5\uff1a{0}\u3001\u4f5c\u6210\u8005\uff1a{1} +details.created-in-site=\u4f5c\u6210\u65e5\uff1a{0}\u3001\u30b5\u30a4\u30c8\uff1a{1} +details.editing-started-by=\u7de8\u96c6\u958b\u59cb\u65e5\uff1a{0}\u3001\u7de8\u96c6\u8005\uff1a{1} +details.editing-started-in-site=\u7de8\u96c6\u958b\u59cb\u65e5\uff1a{0}\u3001\u30b5\u30a4\u30c8\uff1a{1} +details.modified-by=\u5909\u66f4\u65e5\uff1a{0}\u3001\u5909\u66f4\u8005\uff1a{1} +details.modified-in-site=\u5909\u66f4\u65e5\uff1a{0}\u3001\u30b5\u30a4\u30c8\uff1a{1} +details.description.none=\u8aac\u660e\u306a\u3057 +details.tags.none=\u30bf\u30b0\u306a\u3057 +details.categories.none=\u30ab\u30c6\u30b4\u30ea\u306a\u3057 +details.user.deleted=''{0}'' \uff08\u524a\u9664\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\uff09 + +## Social Interactions +# Favourite +favourite.document.add.tip=\u6587\u66f8\u3092\u304a\u6c17\u306b\u5165\u308a\u306b\u8ffd\u52a0\u3057\u307e\u3059 +favourite.document.add.label=\u304a\u6c17\u306b\u5165\u308a +favourite.document.remove.tip=\u6587\u66f8\u3092\u304a\u6c17\u306b\u5165\u308a\u304b\u3089\u524a\u9664\u3057\u307e\u3059 +favourite.folder.add.tip=\u30d5\u30a9\u30eb\u30c0\u3092\u304a\u6c17\u306b\u5165\u308a\u306b\u8ffd\u52a0\u3057\u307e\u3059 +favourite.folder.add.label=\u304a\u6c17\u306b\u5165\u308a +favourite.folder.remove.tip=\u30d5\u30a9\u30eb\u30c0\u3092\u304a\u6c17\u306b\u5165\u308a\u304b\u3089\u524a\u9664\u3057\u307e\u3059 +favourite.imap-site.add.tip=\u30b5\u30a4\u30c8\u3092 IMAP \u306e\u304a\u6c17\u306b\u5165\u308a\u306b\u8ffd\u52a0\u3057\u307e\u3059 +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=\u30b5\u30a4\u30c8\u3092 IMAP \u306e\u304a\u6c17\u306b\u5165\u308a\u304b\u3089\u524a\u9664\u3057\u307e\u3059 +favourite.site.add.tip=\u30b5\u30a4\u30c8\u3092\u304a\u6c17\u306b\u5165\u308a\u306b\u8ffd\u52a0\u3057\u307e\u3059 +favourite.site.add.label=\u304a\u6c17\u306b\u5165\u308a +favourite.site.remove.tip=\u30b5\u30a4\u30c8\u3092\u304a\u6c17\u306b\u5165\u308a\u304b\u3089\u524a\u9664\u3057\u307e\u3059 +favourite.message.failure=\u304a\u6c17\u306b\u5165\u308a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +# Like +like.document.add.tip=\u3053\u306e\u6587\u66f8\u306b [\u3044\u3044\u306d!] \u3092\u4ed8\u3051\u307e\u3059 +like.document.add.label=\u3044\u3044\u306d +like.document.remove.tip=[\u3044\u3044\u306d!] \u3092\u524a\u9664\u3057\u307e\u3059 +like.folder.add.tip=\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306b [\u3044\u3044\u306d!] \u3092\u4ed8\u3051\u307e\u3059 +like.folder.add.label=\u3044\u3044\u306d +like.folder.remove.tip=[\u3044\u3044\u306d!] \u3092\u524a\u9664\u3057\u307e\u3059 +like.site.add.tip=\u3053\u306e\u30b5\u30a4\u30c8\u306b [\u3044\u3044\u306d!] \u3092\u4ed8\u3051\u307e\u3059 +like.site.add.label=\u3044\u3044\u306d! +like.site.remove.tip=[\u3044\u3044\u306d!] \u3092\u524a\u9664\u3057\u307e\u3059 +like.message.failure=[\u3044\u3044\u306d!] \u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +# Quickshare +quickshare.link.label=\u516c\u958b\u30ea\u30f3\u30af +quickshare.link.tooltip=\u30b3\u30d4\u30fc\u3059\u308b\u306b\u306f Ctrl+C \u30ad\u30fc\u3092\u62bc\u3057\u307e\u3059 +quickshare.link.tooltip.mac=\u30b3\u30d4\u30fc\u3059\u308b\u306b\u306f Cmd+C \u30ad\u30fc\u3092\u62bc\u3057\u307e\u3059 +quickshare.view.label=\u8868\u793a +quickshare.unshare.label=\u5171\u6709\u306e\u89e3\u9664 +quickshare.document.shared.label=\u5171\u6709 +quickshare.document.shared.tip=\u3053\u306e\u6587\u66f8\u306f\u5171\u6709\u3055\u308c\u3066\u3044\u307e\u3059\uff08\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u8868\u793a\u3055\u308c\u307e\u3059\uff09 +quickshare.document.share.label=\u5171\u6709 +quickshare.document.share.tip=\u6587\u66f8\u306e\u5171\u6709 +quickshare.document.share.failure=\u6587\u66f8\u3092\u5171\u6709\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +quickshare.document.unshared.label=\u5171\u6709 +quickshare.document.unshared.tip=\u6587\u66f8\u306e\u5171\u6709 +quickshare.document.unshare.success=\u6587\u66f8\u306f\u5171\u6709\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059 +quickshare.document.unshare.failure=\u6587\u66f8\u306e\u5171\u6709\u3092\u89e3\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +quickshare.document.unshare.user.failure=\u5171\u6709\u306e\u89e3\u9664\u3092\u884c\u3046\u305f\u3081\u306e\u9069\u5207\u306a\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +quickshare.linkshare.label=\u5171\u6709\u8005 +# LinkShare +linkshare.action.email.label=E \u30e1\u30fc\u30eb\u3067\u5171\u6709\u3059\u308b +linkshare.action.email.subject=Alfresco Content Services \u5185\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u5171\u6709\u3055\u308c\u307e\u3057\u305f +linkshare.action.email.body=Alfresco Content Services \u5185\u306e\u30d5\u30a1\u30a4\u30eb ''{1}'' \u304c\u5171\u6709\u3055\u308c\u307e\u3057\u305f\u3002\u8a73\u7d30\uff1a {0} +linkshare.action.facebook.label=Facebook \u3092\u4f7f\u3063\u3066\u5171\u6709\u3059\u308b +linkshare.action.facebook.message=Alfresco Content Services \u5185\u306e\u30d5\u30a1\u30a4\u30eb ''{1}'' \u304c\u5171\u6709\u3055\u308c\u307e\u3057\u305f +linkshare.action.twitter.label=Twitter \u3092\u4f7f\u3063\u3066\u5171\u6709\u3059\u308b +linkshare.action.twitter.message=Alfresco Content Services \u5185\u306e\u30d5\u30a1\u30a4\u30eb ''{1}'' \u304c\u5171\u6709\u3055\u308c\u307e\u3057\u305f +linkshare.action.google-plus.label=Google+ \u3092\u4f7f\u3063\u3066\u5171\u6709\u3059\u308b + + +# Comment +comment.document.tip=\u3053\u306e\u6587\u66f8\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u4ed8\u3051\u307e\u3059 +comment.document.label=\u30b3\u30e1\u30f3\u30c8 +comment.folder.tip=\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u4ed8\u3051\u307e\u3059 +comment.folder.label=\u30b3\u30e1\u30f3\u30c8 + +#Dashlets +dashlet.help.tooltip=\u3053\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306e\u30d8\u30eb\u30d7\u3092\u8868\u793a\u3057\u307e\u3059 +dashlet.rss.tooltip=\u3053\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306e RSS \u30d5\u30a3\u30fc\u30c9\u3092\u8cfc\u8aad\u3057\u307e\u3059 +dashlet.edit.tooltip=\u3053\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3059 + +#Module Package Admin page +tool.module-package.label=\u30e2\u30b8\u30e5\u30fc\u30eb\u30d6\u30e9\u30a6\u30b6 +tool.module-package.description=\u30e2\u30b8\u30e5\u30fc\u30eb\u30d6\u30e9\u30a6\u30b6 + +# Category Manager Admin Console +tool.category-manager.label=\u30ab\u30c6\u30b4\u30ea\u30de\u30cd\u30fc\u30b8\u30e3 +tool.category-manager.description=\u30ab\u30c6\u30b4\u30ea\u30de\u30cd\u30fc\u30b8\u30e3 +tool.category-manager.edit-category=\u30ab\u30c6\u30b4\u30ea\u306e\u7de8\u96c6 +tool.category-manager.edit-category.failure=\u540d\u524d\u3092\u7de8\u96c6\u3067\u304d\u307e\u305b\u3093\u3002 +tool.category-manager.add-category=\u30ab\u30c6\u30b4\u30ea\u306e\u8ffd\u52a0 +tool.category-manager.add-category.failure=\u30ab\u30c6\u30b4\u30ea\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +tool.category-manager.label.category-name=\u30ab\u30c6\u30b4\u30ea\u540d\uff1a: +tool.category-manager.delete-category=\u30ab\u30c6\u30b4\u30ea\u306e\u524a\u9664 +tool.category-manager.delete-category.failure=\u30ab\u30c6\u30b4\u30ea\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +tool.category-manager.message.confirm.delete.title=\u30ab\u30c6\u30b4\u30ea\u306e\u524a\u9664 +tool.category-manager.message.confirm.delete=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? + +# Node browser +tool.node-browser.label=\u30ce\u30fc\u30c9\u30d6\u30e9\u30a6\u30b6 +tool.node-browser.description=\u30ce\u30fc\u30c9\u30d6\u30e9\u30a6\u30b6 + +# Label +label.folder=\u30d5\u30a9\u30eb\u30c0 +label.document=\u6587\u66f8 +label.blogpost=\u30d6\u30ed\u30b0\u6295\u7a3f +label.forumpost=\u30d5\u30a9\u30fc\u30e9\u30e0\u30c8\u30d4\u30c3\u30af +label.calendarevent=\u30ab\u30ec\u30f3\u30c0\u30fc\u30a4\u30d9\u30f3\u30c8 +label.wikipage=Wiki \u30da\u30fc\u30b8 +label.link=\u30ea\u30f3\u30af +label.datalist=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8 +label.datalistitem=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u9805\u76ee +label.unknown=\u4e0d\u660e +label.download=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 +label.viewinbrowser=\u30d6\u30e9\u30a6\u30b6\u3067\u8868\u793a +label.viewdetails=\u8a73\u7d30\u306e\u8868\u793a +label.selectAll=\u3059\u3079\u3066\u9078\u629e +label.selectInvert=\u9078\u629e\u306e\u5207\u308a\u66ff\u3048 +label.selectNone=\u306a\u3057 +label.selectedItems=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0 +label.select=\u9078\u629e +label.restricted-settings=Alfresco Identity Service \u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u304a\u308a\u3001\u4e00\u90e8\u306e\u8a2d\u5b9a\u304c\u5236\u9650\u3055\u308c\u3066\u3044\u307e\u3059\u3002 + +# Path +message.infolderpath=\u683c\u7d0d\u30d5\u30a9\u30eb\u30c0 + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=\u540c\u671f\u4fdd\u7559\u4e2d +sync.status.synced=\u540c\u671f\u65e5\u6642\uff1a{0}\u3001\u6240\u6709\u8005\uff1a{1} +sync.status.last-attempt=\u524d\u56de\u306e\u540c\u671f\u65e5\u6642: {0}\u3001 \u6240\u6709\u8005: {1} +sync.status.failed=\u540c\u671f\u8a66\u884c\u65e5\u6642: {0}\u3001\u6240\u6709\u8005: {1} +sync.status.last-failed=\u524d\u56de\u306e\u540c\u671f\u306f\u5931\u6557\u3057\u3066\u3044\u307e\u3059 +sync.status.transient-error=\u4e00\u6642\u540c\u671f\u30a8\u30e9\u30fc +sync.status.transient-error.default-details=Alfresco Content Services \u304c\u30af\u30e9\u30a6\u30c9\u3068\u518d\u3073\u901a\u4fe1\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u3068\u3001\u540c\u671f\u304c\u518d\u958b\u3055\u308c\u307e\u3059\u3002 +sync.status.copy.pending=\u540c\u671f\u4fdd\u7559\u4e2d: {2} +sync.status.copy.synced={2} \u306e\u540c\u671f\u65e5\u6642: {0}\u3001\u6240\u6709\u8005: {1} +sync.status.copy.last-attempt={2} \u306e\u524d\u56de\u306e\u540c\u671f\u65e5\u6642: {0}\u3001\u6240\u6709\u8005: {1} +sync.status.copy.failed={2} \u306e\u540c\u671f\u8a66\u884c\u65e5\u6642: {0}\u3001\u6240\u6709\u8005: {1} +sync.status.copy.last-failed={2} \u306e\u524d\u56de\u306e\u540c\u671f\u306f\u5931\u6557\u3057\u3066\u3044\u307e\u3059 +sync.status.show-details=\u8a73\u7d30\u3092\u8868\u793a +sync.status.hide-details=\u8a73\u7d30\u3092\u975e\u8868\u793a +sync.status.title=\u540c\u671f\u60c5\u5831 +sync.status.action.more=\u8a73\u7d30 +sync.original-document=\u5143\u306e\u6587\u66f8 + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=\u540c\u671f\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u8868\u793a\u3067\u304d\u307e\u305b\u3093 +sync.unable.get.details=\u30ce\u30fc\u30c9\u306e\u8a73\u7d30\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093 + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=''{0}'' \u3092\u30af\u30e9\u30a6\u30c9\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u3002 +sync.remove.folder.from.cloud=''{0}'' \u3068\u305d\u306e\u4e2d\u306e\u3059\u3079\u3066\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u30af\u30e9\u30a6\u30c9\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u3002 + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=\u540c\u671f\u5148\u306e\u30d5\u30a9\u30eb\u30c0\u306b\u3059\u3067\u306b\u540c\u3058\u540d\u524d\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u5b58\u5728\u3057\u307e\u3059\u3002 +sync.folder.not_found=\u30d5\u30a9\u30eb\u30c0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 +sync.node.already_synced=\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u3059\u3067\u306b\u5225\u306e\u5834\u6240\u304b\u3089\u540c\u671f\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +sync.node.other_sync_set=\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u3059\u3067\u306b\u5225\u306e\u5834\u6240\u304b\u3089\u540c\u671f\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +sync.node.no_longer_exists=\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u3059\u3067\u306b Alfresco Content Services in the Cloud \u304b\u3089\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +sync.node.no_longer_exists.description=\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u3059\u3067\u306b Alfresco Content Services in the Cloud \u304b\u3089\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059\u3002[\u540c\u671f\u3092\u30ea\u30af\u30a8\u30b9\u30c8] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u64cd\u4f5c\u3092\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +sync.node.unknown=\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u64cd\u4f5c\u3092\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +sync.node.unknown.description=\u60f3\u5b9a\u5916\u306e\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u539f\u56e0\uff1a {0}. +sync.node.access_denied=\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u540c\u671f\u3067\u304d\u307e\u305b\u3093\u3002\u540c\u671f\u5148\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +sync.node.access_denied_source=\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u540c\u671f\u3067\u304d\u307e\u305b\u3093\u3002\u540c\u671f\u5143\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093. +sync.node.content_limit_violation=\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u6700\u5927\u30b5\u30a4\u30ba\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\u3002 \u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u5927\u304d\u3059\u304e\u308b\u305f\u3081\u3001\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002 +sync.node.quota_limit_violation=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30af\u30a9\u30fc\u30bf\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\u3002 \u7a7a\u304d\u5bb9\u91cf\u304c\u4e0d\u8db3\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002 +sync.node.authentication_error=\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u30af\u30e9\u30a6\u30c9\u3068\u540c\u671f\u3067\u304d\u307e\u305b\u3093\u3002\u8a8d\u8a3c\u60c5\u5831\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059\u3002 +sync.node.authentication_error.description=\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u30af\u30e9\u30a6\u30c9\u3068\u540c\u671f\u3067\u304d\u307e\u305b\u3093\u3002\u30e6\u30fc\u30b6\u30fc ''{0}'' \u306e\u8a8d\u8a3c\u60c5\u5831\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059\u3002 +sync.node.owner_not_found=\u3053\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u6240\u6709\u8005\u304c\u524a\u9664\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u540c\u671f\u3067\u304d\u307e\u305b\u3093\u3002 +sync.node.owner_not_found.description=\u3053\u306e\u540c\u671f {0} \u3092\u6240\u6709\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306f\u3059\u3067\u306b\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059\u3002 [\u540c\u671f\u3092\u89e3\u9664] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +sync.communications.error=\u30ea\u30e2\u30fc\u30c8\u30b7\u30b9\u30c6\u30e0\u3068\u901a\u4fe1\u3067\u304d\u307e\u305b\u3093 +sync.communications.error.description=\u30ea\u30e2\u30fc\u30c8\u30b7\u30b9\u30c6\u30e0\u3068\u901a\u4fe1\u3067\u304d\u307e\u305b\u3093\u3002 \u901a\u4fe1\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u3068\u3001\u81ea\u52d5\u7684\u306b\u540c\u671f\u304c\u518d\u958b\u3055\u308c\u307e\u3059 + +# Cloud Sync no network available for sync +sync.message.no.active.network=\u540c\u671f\u304c\u6709\u52b9\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304c\u3042\u308a\u307e\u305b\u3093 + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=\u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0 +sync.new-folder.in-the-cloud.header=\u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0\u306e\u8a73\u7d30 +sync.new-folder.creation.success=\u30d5\u30a9\u30eb\u30c0\u304c\u6b63\u5e38\u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +sync.new-folder.creation.failure=\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093 + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=\u540c\u671f ID +hybridsync.ssd-failed-reason-header-label=\u540c\u671f\u30a8\u30e9\u30fc\u306e\u7a2e\u985e +hybridsync.path-desc-header-label=\u5143\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u5834\u6240 +hybridsync.sync-creator-header-label=\u540c\u671f\u306e\u4f5c\u6210\u8005 +hybridsync.cloud-user-header-label=\u30af\u30e9\u30a6\u30c9\u30e6\u30fc\u30b6\u30fc +hybridsync.remote-tenant-id-header-label=\u30af\u30e9\u30a6\u30c9\u30cd\u30c3\u30c8\u30ef\u30fc\u30af +hybridsync.target-folder-node-ref-header-label=\u30af\u30e9\u30a6\u30c9\u306e\u540c\u671f\u5148 +hybridsync.actions-header-label=\u51e6\u7406 + +#Hybrid workflow +hybridworkflow.destination-select.title=\u30af\u30e9\u30a6\u30c9\u3067\u306e\u6587\u66f8\u306e\u4fdd\u5b58\u5834\u6240\u306e\u9078\u629e +hybridworkflow.set.destination=\u4fdd\u5b58\u5834\u6240\u3068\u62c5\u5f53\u8005 +hybridworkflow.authority.single=\u62c5\u5f53\u8005 +hybridworkflow.authority.multiple=\u30ec\u30d3\u30e5\u30a2 +hybridworkflow.review.approved=\u627f\u8a8d\u6e08\u307f +hybridworkflow.review.rejected=\u5374\u4e0b\u6e08\u307f +hybridworkflow.destination-select.folderPrefix=\u6587\u66f8 +hybridworkflow.destination.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af +hybridworkflow.destination.site=\u30b5\u30a4\u30c8 +hybridworkflow.destination.folder=\u30d5\u30a9\u30eb\u30c0 +hybridworkflow.destination.button=\u9078\u629e + +# Security +security.insecuremimetype=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u306e MIME \u30bf\u30a4\u30d7\u306f\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u4fb5\u5bb3\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308b\u305f\u3081\u3001\u8868\u793a\u3055\u308c\u307e\u305b\u3093\u3002 + +# Lightbox +lightbox.close=\u9589\u3058\u308b +lightbox.loading=\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059 diff --git a/share/src/main/resources/alfresco/messages/slingshot_nb.properties b/share/src/main/resources/alfresco/messages/slingshot_nb.properties new file mode 100755 index 0000000000..c054fdb38e --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_nb.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Skriv inn s\u00f8keord... +# header menu items +header.advanced-search.label=Avansert s\u00f8k... +header.advanced-search.description=Avansert s\u00f8k... +header.application.label=Program +header.application.description=Program +header.change-password.label=Endre passord +header.change-password.description=Endre passord +header.groups.label=Grupper +header.groups.description=Grupper +header.tag-management.label=Kodeadministrator +header.tag-management.description=Kodeadministrator +header.help.label=Hjelp +header.help.description=Hjelp +header.logout.label=Logg ut +header.logout.description=Logg ut +header.more.label=Mer... +header.more.description=Mer... +header.my.label=Mine... +header.my.description=Mine... +header.my-content.label=Mitt innhold +header.my-content.description=Mitt innhold +header.my-dashboard.label=Mitt dashbord +header.my-dashboard.description=Mitt dashbord +header.my-profile.label=Min profil +header.my-profile.description=Min profil +header.my-sites.label=Mine omr\u00e5der +header.my-sites.description=Mine omr\u00e5der +header.my-tasks.label=Mine oppgaver +header.my-tasks.description=Mine oppgaver +header.my-workflows.label=Arbeidsflyter som jeg har startet +header.my-workflows.description=Arbeidsflyter som jeg har startet +header.people.label=Personer +header.people.description=Personer +header.replication-jobs.label=Replikeringsjobber +header.replication-jobs.description=Replikeringsjobber +header.repository.label=Database +header.repository.description=Database +header.trashcan.label=Papirkurv +header.trashcan.description=Filgjenopprettelses- og sletteverkt\u00f8y +header.saved-searches.label=Lagrede s\u00f8k +header.saved-searches.description=Lagrede s\u00f8k +header.search.description=S\u00f8kealternativer... +header.sites.label=Omr\u00e5der +header.sites.description=Omr\u00e5der +header.submit-status.label=Del +header.submit-status.description=Del +header.tools.label=Admin.verkt\u00f8y... +header.tools.description=Administrasjonsverkt\u00f8y... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Brukere +header.users.description=Brukere + +## Buttons +button.browse=Bla gjennom +button.edit=Rediger +button.save=Lagre +button.savechanges=Lagre endringer +button.saveandclose=Lagre og lukk +button.upload=Last opp +button.login=Logg inn +button.delete=Slett +button.take-ownership=OK +button.download=Last ned +button.clear=Fjern +button.reset=Tilbakestill +button.search=S\u00f8k +button.update=Oppdater +button.goback=G\u00e5 tilbake +button.done=Fullf\u00f8rt +button.undo=Angre +button.new=Ny +button.create=Opprett +button.rename=Gi nytt navn +button.refreshPage=Oppdater side +button.createanother=Opprett og opprett ny +button.view.simple=Enkel visning +button.view.detailed=Detaljert visning +button.view.gallery=Gallerivisning +button.view.filmstrip=Filmstripevisning +button.view.table=Tabellvisning +button.view.media-table=Mediavisning +button.view.email=E-postvisning +button.view.audio=Lydvisning +button.view.dublinCore=Dublin Core-visning +button.view.effectivity=Effektivitetsvisning + +button.follow=F\u00f8lg +button.unfollow=Ikke f\u00f8lg +button.unsync=Fjern synkronisering + +## Messages +message.failure=Mislykket +message.failure.workflow=Bruker {0} har ikke tillatelse til \u00e5 g\u00e5 til denne oppgaven. +message.loginfailure=Kunne ikke logge inn +message.loginautherror=Godkjenningsdetaljene dine ble ikke gjenkjent, eller Alfresco Content Services er kanskje ikke tilgjengelig for \u00f8yeblikket. +message.passwordchangeauthfailed=Feil godkjenningsdetaljer eller ikke autorisert til \u00e5 endre passord. +message.login-portal=Logg inn via portalen din. +message.unsavedChanges.blog=Blogginnlegget har endringer som ikke er lagret. +message.unsavedChanges.comment=Kommentaren har ikke blitt lagret enn\u00e5. +message.unsavedChanges.discussion=Diskusjonsemnet har endringer som ikke er lagret. +message.unsavedChanges.reply=Emnesvaret har endringer som ikke er lagret. +message.unsavedChanges.wiki=Wiki-artikkelen har endringer som ikke er lagret. +message.searching=S\u00f8ker... +message.searchingFor=S\u00f8ker etter "{0}"... +message.minimum-length=Angi minst {0} tegn +message.folders-trimmed=Listen har blitt begrenset til {0} oppf\u00f8ringer +message.item-missing=Forespurt element kan ikke vises fordi det ikke lenger er tilgjengelig. +message.save.success=Endringene ble lagret. +message.save.failure=Endringene kunne ikke bli lagret. +message.cookiesfailure=Informasjonskapsler er deaktivert +message.cookieserror=Informasjonskapsler m\u00e5 aktiveres i nettleseren. +message.siteRedirect.noPages.manager=En omr\u00e5deadministrator har sl\u00e5tt av alle funksjonene i dette omr\u00e5det.
Klikk p\u00e5 innstillingsikonet , og velg Tilpass omr\u00e5de for \u00e5 legge til \u00e9n eller flere omr\u00e5defunksjoner. +message.siteRedirect.noPages.user=En omr\u00e5deadministrator har sl\u00e5tt av alle funksjonene i dette omr\u00e5det.
Se blant omr\u00e5demedlemmene for \u00e5 finne en omr\u00e5deadministrator som kan legge funksjoner til omr\u00e5det. +message.logged-out=Du er n\u00e5 logget ut. +message.timeout=Servertidsavbrudd. Det tok for lenge \u00e5 fullf\u00f8re foresp\u00f8rsel. Pr\u00f8v p\u00e5 nytt senere. +message.loading=Laster... +message.viewInCloud.failure=Kan ikke hente URL. Kontroller synkroniseringsstatus. +message.logged-out=Du er n\u00e5 logget ut. + +## Common Text labels and CM model metadata +label.tags=Tagger +label.none=(Ingen) +label.empty=(Tom) +label.about=Om +label.username=Brukernavn +label.password=Passord +label.copyright=© 2005-2023 Alfresco Software Inc. Med enerett. +label.name=Navn +label.id=ID +label.title=Tittel +label.description=Beskrivelse +label.version=Versjon +label.firstname=Fornavn +label.lastname=Etternavn +label.jobtitle=Stillingstittel +label.location=Sted +label.bio=Sammendrag +label.photo=Bilde +label.contactinfo=Kontaktinformasjon +label.skype=Skype +label.im=IM +label.googleusername=Google-brukernavn +label.company=Firma +label.companyinfo=Firmainformasjon +label.companyname=Navn +label.companyaddress=Adresse +label.companytelephone=Telefon +label.companyfax=Faks +label.companyemail=E-post +label.companypostcode=Postnummer +label.email=E-post +label.telephone=Telefon +label.mobile=Mobil +label.fax=Faks +label.address=Adresse +label.postcode=Postnummer +label.groups=Grupper +label.yes=Ja +label.no=Nei +label.ok=OK +label.loading=Laster... +label.validating=Validerer... +label.validationError=Kan ikke validere legitimasjon. +label.site=Omr\u00e5de +label.path=Bane +label.type=Type +label.creator=Oppretter +label.created=Opprettet +label.modifier=Modifikator +label.modified=Modifisert +label.author=Forfatter +label.priority={0} Prioritet +label.size=St\u00f8rrelse +label.mimetype=Mimetype +label.mimetype.unknown=Ukjent +label.popularity=Popul\u00e6ritet +label.avatar=Avatar +label.editType=Rediger: {0} +label.moreInfo=Mer informasjon > +label.actions.column.header=Handlinger +# Dictionary Model +label.modelActive=Er aktiv +label.modelName=Modellnavn +label.modelDescription=Modellbeskrivelse +# Transfer Targets +label.trx_enabled=Er aktivert +label.trx_endpointhost=Overf\u00f8r til vert +label.trx_endpointport=Port +label.you=du +label.licensedTo=Lisensiert til: + +## Location +location.tooltip.path=Bane: {0} +location.tooltip.site=Omr\u00e5de: {0} +location.path.repository=Database +location.path.documents=Dokumenter +location.path.userHome=Mitt brukerhjem +location.path.myfiles=Mine filer +location.path.shared=Delte filer +location.label.none=(Ingen) +location.label.local={0} +location.label.site={0} i {1} +location.label.repository={0} + +## EXIF +label.exif.width=Bredde +label.exif.height=H\u00f8yde + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} av {totalRecords} +pagination.template.page-report.more=Viser elementer {startRecord} - {endRecord} av {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} av {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Lyst tema +theme.default=Bl\u00e5tt tema +theme.greenTheme=Gr\u00f8nt tema +theme.hcBlack=Tema med h\u00f8y kontrast +theme.yellowTheme=Gult tema +theme.gdocs=Google Docs-tema + +## Admin console tools +tool.users.label=Brukere +tool.users.description=Brukeradministrasjon +tool.groups.label=Grupper +tool.groups.description=Gruppeadministrasjon +tool.application.label=Program +tool.application.description=Programinnstillinger og -administrasjon +tool.replication-jobs.label=Replikeringsjobber +tool.replication-jobs.description=Administrasjon av replikeringsjobber +tool.repository.label=Databasesverkt\u00f8y +tool.repository.description=Databasesverkt\u00f8y +tool.tag-management.label=Kodeadministrator +tool.tag-management.description=Kodeadministrator +tool.workflow.label=Arbeidsflyt +tool.workflow.description=Verkt\u00f8y for arbeidsflyt +tool.trashcan.label=Papirkurv +tool.trashcan.description=Filgjenopprettelses- og sletteverkt\u00f8y +tool.email-inbound.label=E-post (inng\u00e5ende) +tool.email-inbound.description=E-post (inng\u00e5ende) +tool.email-outbound.label=E-post (utg\u00e5ende) +tool.email-outbound.description=E-post (utg\u00e5ende) +tool.email-imap.label=E-post (IMAP) +tool.email-imap.description=E-post (IMAP) +tool.runtime.label=Kj\u00f8retid +tool.runtime.description=Kj\u00f8retid +tool.repository-server.label=Databasesbeskrivelse (gjeldende) +tool.repository-server.description=Databasesbeskrivelse (gjeldende) +tool.repository-installed.label=Databasesbeskrivelse (opprinnelig installert) +tool.repository-installed.description=Databasesbeskrivelse (opprinnelig installert) +tool.authority.label=Autoritet +tool.authority.description=Autoritet +tool.license.label=Lisensbeskrivelse +tool.license.description=Lisensbeskrivelse +tool.license.link=Administrer mitt abonnement +tool.license.usageinfo.label=Informasjon om lisensbruk +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=OpenOffice-system +tool.openoffice-subsystem.description=OpenOffice-system +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Transformator pdf2swf +tool.transformer-pdf2swf.description=Transformator pdf2swf +tool.transformer-imagemagick.label=Transformator ImageMagick +tool.transformer-imagemagick.description=Transformator ImageMagick +tool.fileservers.label=Filservere +tool.fileservers.description=Filservere +tool.subscriptions.label=Abonnement +tool.subscriptions.description=Abonnement +tool.sysadmin.label=Sysadmin +tool.sysadmin.description=Sysadmin +tool.activities.label=Aktivitetsstr\u00f8m +tool.activities.description=Aktivitetsstr\u00f8m +tool.workflow.label=Arbeidsflyt +tool.workflow.description=Arbeidsflyt +tool.manage-sites.label=Administrator for omr\u00e5dene +tool.manage-sites.description=Administrator for omr\u00e5dene +tool.cloud-sync-management.label=Administrator for skysynkronisering +tool.cloud-sync-management.description=Administrator for skysynkronisering +tool.search-manager.label=S\u00f8keadministrator +tool.search-manager.description=S\u00f8keadministrator + +## Admin console tool groups +tool.group.usersgroups=Brukere og grupper +tool.group.email=E-post +tool.group.transformations=Konverteringer +tool.group.filemanagement=Filbehandling +tool.group.subscriptions=Abonnement +tool.group.repository=Database +tool.group.search=S\u00f8k +tool.group.site=Omr\u00e5der + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Godta invitasjon +page.acceptInvite.description=Godta invitasjon-side. Lasting av siden vil f\u00f8re til at omr\u00e5deinvitasjonen godtas og kontoen til brukeren aktiveres hvis den fremdeles er deaktivert +page.addGroups.title=Legg til grupper +page.addGroups.description=Legg til grupper +page.add-users.title=Legg til brukere +page.add-users.description=Legg brukere til et omr\u00e5de +page.adminConsole.title=Admin.verkt\u00f8y +page.adminConsole.description=Administrasjons- og behandlingskonsoll +page.advsearch.title=Avansert s\u00f8k +page.advsearch.description=Avansert s\u00f8kevisning +page.blogCreateEdit.title=Blogg: opprett eller rediger blogginnlegg +page.blogCreateEdit.description=Viser et skjema for \u00e5 opprette eller redigere et innlegg +page.blogPostList.title=Blogg +page.blogPostList.description=Viser blogginnlegg +page.blogPostView.title=Blogg: vis innleggsinformasjonsvisning +page.blogPostView.description=Viser detaljert visning om innlegg +page.calendar.title=Kalender +page.calendar.description=Kalenderkomponent for omr\u00e5de +page.changePassword.title=Endre brukerpassord +page.changePassword.description=Endre passord-delen p\u00e5 profilsiden for en bruker +page.contentViewer.title=Innholdsvisning +page.contentViewer.description=Side for visning av innholdet til en noderef +page.createContent.title=Opprett innhold +page.createContent.description=Opprett tekstbasert innhold +page.createEditReplicationJob.title=Replikeringsjobb +page.createEditReplicationJob.description=Opprett ny eller rediger eksisterende replikeringsjobb +page.customiseSite.title=Tilpass omr\u00e5de +page.customiseSite.description=Legg til og fjern sider fra et omr\u00e5de +page.customiseSiteDashboard.title=Tilpass omr\u00e5dedashbord +page.customiseSiteDashboard.description=Tilpass dashbordlayout og -dashleter for et omr\u00e5dedashbord +page.customiseUserDashboard.title=Tilpass brukerdashbord +page.customiseUserDashboard.description=Tilpass dashbordlayout og -dashleter for et brukerdashbord +page.data-lists.title=Datalister +page.data-lists.description=Datalisteside +page.discussionsCreateTopic.title=Diskusjoner: vis side for opprett emne +page.discussionsCreateTopic.description=Viser skjemaet for \u00e5 opprette et emne +page.discussionsTopicList.title=Diskusjoner +page.discussionsTopicList.description=Viser forumemner +page.discussionsTopicView.title=Diskusjoner: vis emneinformasjonsvisning +page.discussionsTopicView.description=Viser detaljert visning om emne +page.documentDetails.title=Dokumentdetaljer +page.documentDetails.description=Dokumentdetaljer +page.documentLibrary.title=Dokumentbibliotek +page.documentLibrary.description=Dokumentbibliotek med trevisning +page.editMetadata.title=Rediger egenskaper +page.editMetadata.description=Rediger egenskaper for en node +page.folderDetails.title=Detaljer for mappe +page.folderDetails.description=Detaljer for mappe +page.folderRules.title=Mapperegler +page.folderRules.description=Mapperegler +page.geographicMap.title=Google Maps-visning +page.geographicMap.description=Se bildeplasseringen i Google Maps +page.inlineEdit.title=Rediger i Alfresco Share +page.inlineEdit.description=Rediger tekstfiler i Alfresco Share +page.invite.title=Inviter +page.invite.description=Inviter +page.links.title=Koblinger +page.links.description=Koblinger +page.linkCreateEdit.title=Koblinger: opprett eller rediger kobling +page.linkCreateEdit.description=Viser et skjema for \u00e5 opprette eller redigere kobling +page.linksView.title=Koblinger: vis koblinginformasjonsvisning +page.linksView.description=Viser detaljert visning om koblinger +page.login.title=Logg inn +page.logout.title=Logg ut +page.managePermissions.title=Administrer tillatelser +page.managePermissions.description=Administrer tillatelser +page.myFiles.title=Mine filer +page.myFiles.description=Bla gjennom mine filer +page.myDocumentLibraries.title=Mine dokumentbibliotek +page.myDocumentLibraries.description=Startside for Mine dokumentbiblioteker +page.myTasks.title=Mine oppgaver +page.myTasks.description=Liste over aktive og fullf\u00f8rte oppgaver. +page.myWorkflows.title=Arbeidsflyter som jeg har startet +page.myWorkflows.description=Arbeidsflyter som jeg har startet-side +page.pendingInvites.title=Venter +page.pendingInvites.description=Avventende invitasjoner og foresp\u00f8rsler om \u00e5 bli med +page.peopleFinder.title=Persons\u00f8ker +page.peopleFinder.description=Side for persons\u00f8ker +page.profile.title=Brukerprofilside +page.profile.description=Profilside for en bruker +page.rejectInvite.title=Avvis invitasjon +page.rejectInvite.description=Avvis invtasjonsside. Avviser en invitasjonsforesp\u00f8rsel +page.repository.title=Databasesleser +page.repository.description=Bla gjennom innhold p\u00e5 tvers av hele databasen +page.ruleEdit.title=Mapperegler +page.ruleEdit.description=Opprett eller rediger en regel for en mappe. +page.search.title=S\u00f8k +page.search.description=S\u00f8kevisning +page.sharedFiles.title=Delte filer +page.sharedFiles.description=Bla gjennom delte filer +page.siteConsole.title=Administrator for omr\u00e5dene +page.siteConsole.description=Side til admistratorer for omr\u00e5dene - verkt\u00f8y for \u00e5 adminsitrere omr\u00e5dene +page.siteFinder.title=Omr\u00e5des\u00f8ker +page.siteFinder.description=Side for omr\u00e5des\u00f8ker +page.siteIndex.title=Velkommen +page.siteIndex.description=M\u00e5lside for brukere \u2014 vil opprette brukeomr\u00e5dedashbord etter behov og videresende brukeren til det +page.siteGroups.title=Omr\u00e5degrupper +page.siteGroups.description=Omr\u00e5degrupper +page.siteMembers.title=Omr\u00e5demedlemmer +page.siteMembers.description=Omr\u00e5demedlemmer +page.startWorkflow.title=Start arbeidsflyt +page.startWorkflow.description=Start en ny arbeidsflyt +page.taskDetails.title=Detaljer for oppgave +page.taskDetails.description=Side som viser detaljert oppgaveinformasjon +page.taskEdit.title=Rediger oppgave +page.taskEdit.description=Side for redigering av oppgavedetaljer +page.userContent.title=Brukerredigert innhold +page.userContent.description=Viser innhold som en bruker redigerte sist +page.userFollowers.title=F\u00f8lgere +page.userFollowers.description=Viser personer som f\u00f8lger brukeren +page.userFollowing.title=F\u00f8lger +page.userFollowing.description=Viser personer som brukeren f\u00f8lger +page.userNotifications.title=Innstillinger for brukermeldinger +page.userNotifications.description=Endre meldingsinnstillingsdelen p\u00e5 profilsiden for en bruker +page.userCloudAuth.title=Brukerskygodkj +page.userCloudAuth.description=Endre skygodkjenningsdetaljer +page.userSites.title=Brukeromr\u00e5deliste +page.userSites.description=Viser omr\u00e5der som brukeren tilh\u00f8rer +page.userTrashcan.title=Brukers\u00f8ppelb\u00f8tte +page.userTrashcan.description=Liste med slettede dokumenter og mapper for den gjeldende brukeren +page.wiki.title=Wiki +page.wiki.description=M\u00e5lsiden for Wiki +page.wikiCreate.title=Skjema for Wiki-opprettelse +page.wikiCreate.description=Viser et skjema for \u00e5 opprette en ny Wiki-side +page.wikiPage.title=Wiki +page.wikiPage.description=Viser en Wiki-side +page.workspace.title=Dashbord for dokumentarbeidsomr\u00e5de +page.workspace.description=Dashbordside for dokumentarbeidsomr\u00e5de +page.workflowDetails.title=Detaljer for arbeidsflyt +page.workflowDetails.description=Side med detaljer for arbeidsflyt + +## Dashboard page titles and descriptions +page.siteDashboard.title=Omr\u00e5dedashbord +page.siteDashboard.description=Dashbordside for samarbeidsomr\u00e5de +page.userDashboard.title=Brukerdashbord +page.userDashboard.description=Brukernes dashbordside +page.meeting_workspace.title=Dashbord for m\u00f8tearbeidsomr\u00e5de +page.meeting_workspace.description=Dashbordside for m\u00f8tearbeidsomr\u00e5de + +page.error.500.title=Alfresco Dele » Systemfeil +page.error.500.header=Noe er feil med denne siden... +page.error.500.detail=

Du har muligens truffet p\u00e5 en feil eller at noe er blitt fjernet eller slettet. Derfor m\u00e5 du kontrollere at URL-en er riktig.

Det er ogs\u00e5 mulig at du ikke har tillatelse til \u00e5 g\u00e5 til denne siden (det er muligens et privat nettsted), eller det kan ha oppst\u00e5tt en intern feil. Fors\u00f8k \u00e5 kontakte ditt IT-team.

Dersom du fors\u00f8ker \u00e5 g\u00e5 til hjemmesiden og den ikke lenger er tilgjengelig, skal du endre den ved p\u00e5 klikke p\u00e5 ditt navn p\u00e5 verkt\u00f8ylinjen.

+page.error.500.nav.dashboard=Tilbake til Mitt dashbord +page.error.500.footer=Alfresco Software Inc. © 2005-2023 Med enerett. + +## Title bar component titles for pages that use the simple-title component +title.repository=Database +title.browser=Nettleser +title.siteFinder=Omr\u00e5des\u00f8ker +title.peopleFinder=Persons\u00f8ker +title.myTasks=Mine oppgaver + +## Site Visibility +site.visibility.label.PUBLIC=Offentlig +site.visibility.label.MODERATED=Sensurert +site.visibility.label.PRIVATE=Privat +site.visibility.description.PUBLIC=Alle i din organisasjon kan ha tilgang til dette omr\u00e5det. +site.visibility.description.MODERATED=Alle i din organisajons kan finne dette omr\u00e5det og be om tilgang. Tilgang gis av omr\u00e5deadministratorer. +site.visibility.description.PRIVATE=Kun personer som er lagt til av en omr\u00e5deaministrator kan finne og bruke dette omr\u00e5det. + +## Roles +role.SiteManager=Administrator +role.SiteManager.description=har alle rettigheter til alt innhold i omr\u00e5det - det de har selv opprettet og det som er opprettet av andre omr\u00e5demedlemmer. +role.Collaborator=Medarbeider +role.Collaborator.description=har alle rettigheter til innhold som de selv eier. De har rett til redigere, men ikke slette innhold som er rettet opp av andre. +role.SiteCollaborator=Medarbeider +role.SiteCollaborator.description=har alle rettigheter til innhold i omr\u00e5det, som de selv eier. De har rett til redigere, men ikke slette innhold som er rettet opp av andre. +role.Contributor=Bidragsyter +role.Contributor.description=har alle rettigheter til innhold som de eier. De kan ikke redigere eller slett innhold som er opprettet av andre. +role.SiteContributor=Bidragsyter +role.SiteContributor.description=har alle rettigheter til innhold i omr\u00e5det, som de eier. De kan ikke redigere eller slett innhold som er opprettet av andre. +role.Consumer=Forbruker +role.Consumer.description=har kun rett til \u00e5 se innholdet. De kan ikke opprette eget innhold. +role.SiteConsumer=Forbruker +role.SiteConsumer.description=har kun rett til \u00e5 se innholdet i et omr\u00e5det. De kan ikke opprette eget innhold. +role.Coordinator=Koordinator +role.Coordinator.description=har alle rettigheter til alt innhold - det de har selv opprettet og det andre har opprettet. +role.Editor=Redakt\u00f8r +role.Editor.description=har rett til \u00e5 redigere filegenskaper og kontroller filer inn og ut. De kan ikke opprette eget innhold. + +roles.readassociations=Forbruker + +roles-tooltip.header=Om roller +roles-tooltip.docs-url-label=Se mer +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Tagger +taglibrary.populartagslink=Velg mellom popul\u00e6re tagger p\u00e5 dette omr\u00e5det +taglibrary.msg.failedLoadTags=Kan ikke laste koder fra serveren (forbindelsen brutt?) +taglibrary.msg.unableLoadTags=Kan ikke laste merker: {0} +taglibrary.tip.removeTag=Fjern kode +taglibrary.tip.help=Atskill koder med mellomrom. F\u00f8y sammen to eller flere ord ved bruk av "doble anf\u00f8rselstegn" + +## YUI Editor keys +yuieditor.toolbar.group.font=Skriftstil +yuieditor.toolbar.group.lists=Lister +yuieditor.toolbar.group.link=Kobling +yuieditor.toolbar.item.createorderedlist=Opprett sortert liste +yuieditor.toolbar.item.createunorderedlist=Opprett usortert liste +yuieditor.toolbar.item.fontcolor=Skriftfarge +yuieditor.toolbar.item.backgroundcolor=Bakgrunnsfarge +yuieditor.toolbar.item.bold=Fet CTRL + SKIFT + B +yuieditor.toolbar.item.italic=Kursiv CTRL + SKIFT + I +yuieditor.toolbar.item.underline=Understreking CTRL + SKIFT + U +yuieditor.toolbar.item.link=HTML-kobling CTRL + SKIFT + L + +## Document Library Drop-down Menus +menu.select=Velg +menu.select.all=Alle +menu.select.none=Ingen +menu.select.invert=Inverter merket omr\u00e5de +menu.select.folders=Mapper +menu.select.documents=Dokumenter + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Opprett dokument fra mal +menu.create-content.by-template-folder=Opprett mappe fra mal +menu.selected-items=Valgte elementer... +menu.selected-items.copy=Kopier til... +menu.selected-items.move=Flytt til... +menu.selected-items.delete=Slett +menu.selected-items.download=Last ned som .zip +menu.selected-items.assign-workflow=Start arbeidsflyt... +menu.selected-items.manage-permissions=Administrer tillatelser... +menu.selected-items.deselect-all=Fjern all merking +menu.selected-items.cloudSync=Synkroniser til sky +menu.selected-items.cloudUnsync=Fjern synkronisering fra sky +menu.selected-items.cloudRequestSync=Foresp\u00f8r synkronisering + +## Document Library Actions +actions.document.assign-workflow=Start arbeidsflyt +actions.document.cancel-editing=Avbryt redigering +actions.document.cancel-editing-unlock=L\u00e5s opp dokumentet +actions.document.change-type=Endre type +actions.document.copy-to=Kopier til... +actions.document.delete=Slett dokument +actions.document.download=Last ned +actions.document.download-again=Last ned +actions.document.download-original=Last ned original +actions.document.edit-metadata=Rediger egenskaper +actions.document.edit-offline=Rediger frakoblet +actions.document.edit-online=Rediger i Microsoft Office\u2122 +message.edit-online.supported_office_version_required=Du bruker en versjon av Microsoft Office som ikke st\u00f8ttes. Fors\u00f8k \u00e5 oppdatere Microsoft Office. Office 2007 og 2008 fungerer ikke med Google Chrome. +actions.document.extract-metadata=Pakk ut Metadata +actions.document.execute-script=Kj\u00f8r skript +actions.document.inline-edit=Rediger i Alfresco Share +actions.document.increment-counter=Inkrementteller +actions.document.locate=Finn fil +actions.document.manage-aspects=Administrer aspekter +actions.document.manage-permissions=Administrer tillatelser +actions.document.take-ownership=Bli eier +actions.document.move-to=Flytt til... +actions.document.simple-approve=Godkjenn +actions.document.simple-reject=Avvis +actions.document.upload-new-version=Last opp ny versjon +actions.document.view=Vis i nettleseren +actions.document.view-google-map=Vis p\u00e5 Google-kart +actions.document.view-original=Vis originalt dokument +actions.document.view-source-repository=Vis i kildedatabase +actions.document.view-working-copy=Vis arbeidskopi +actions.document.publish=Publiser +actions.document.transform=Transformer +actions.document.transform-image=Transformer til bilde +actions.document.publish-content=Publiser innhold +actions.document.cloud-sync=Synkroniser til skyen +actions.document.cloud-unsync=Desynkroniser fra skyen +actions.document.view-in-cloud=Vis i skyen +actions.document.request-sync=Foresp\u00f8r synkronisering +actions.document.unzip-to=Pakk ut til... +actions.folder.download=Last ned som .zip +actions.folder.change-type=Endre type +actions.folder.copy-to=Kopier til... +actions.folder.delete=Slett mappe +actions.folder.edit-metadata=Rediger egenskaper +actions.folder.locate=Finn mappe +actions.folder.manage-aspects=Administrer aspekter +actions.folder.manage-permissions=Administrer tillatelser +actions.folder.take-ownership=Bli eier +actions.folder.move-to=Flytt til... +actions.folder.rules=Administrer regler +actions.folder.simple-approve=Godkjenn +actions.folder.simple-reject=Avvis +actions.folder.view-details=Visningsdetaljer +actions.folder.view-source-repository=Vis i kildedatabase +actions.folder.cloud-sync=Synkroniser til skyen +actions.folder.cloud-unsync=Desynkroniser fra skyen +actions.folder.view-in-cloud=Vis i skyen +actions.link.delete=Slett kobling +actions.link.locate=Finn koblet element +actions.editOnline.failure=Filen ''{0}'' kan ikke \u00e5pnes for p\u00e5logget redigering. Et av f\u00f8lgende tilleggsprogrammer m\u00e5 v\u00e6re installert i nettleseren. \n For Windows: Microsoft Office 2010 \n for Mac OS X: SharePoint nettleser-plug-in +actions.editOnline.invalid=Filen ''{0}'' kunne ikke redigeres i p\u00e5logget tilstand fordi stien inneholder tegn som ikke er tillatt av SPP-protokollen.\nUgyldige tegn inkluderer f\u00f8lgende: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' er synkronisert og denne slettingen vil fjerne dokumentet lokalt og fra skyen. +actions.synced.folder.delete=
''{0}'' er synkronisert og denne slettingen vil fjerne denne mappen og dets innhold lokalt og fra skyen. +actions.synced.remove-sync=
Utf\u00f8r handling ''Remove sync'' (Fjern synkronisering) omg\u00e5ende hvis objektet m\u00e5 bli v\u00e6rende i skyen. +actions.synced.cloud.document.delete=
''{0}'' er synkronisert og denne slettingen vil bare fjerne dokumentet lokalt. +actions.synced.cloud.folder.delete=
''{0}'' er synkronisert og denne slettingen vil bare fjerne denne mappen og dets innhold lokalt. +actions.synced.cloud.document.delete.on.prem=
''{0}'' er synkronisert og denne slettingen vil fjerne dokumentet b\u00e5de p\u00e5 stedet samt lokalt. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' er synkronisert og denne slettingen vil fjerne denne mappen og dets innhold p\u00e5 stedet samt lokalt. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=Kan ikke finne koblet element: M\u00e5let er slettet. +message.change-type.success=Typen for dokument ''{0}'' ble endret +message.change-type.failure=Kan ikke endre typen for dokument ''{0}'' +message.confirm.delete=Er du sikker p\u00e5 at du vil slette ''{0}''? +message.delete.success=''{0}'' ble slettet +message.delete.failure=Kan ikke slette ''{0}'' +message.multiple-delete.please-wait=Vent litt. Filer slettes... +message.confirm.take-ownership.title=Bli eier? +message.confirm.take-ownership=Du blir eier av ''{0}'', og det er mulig at tillatelsene til den forrige eieren blir begrenset. +message.take-ownership.success=N\u00e5 eier du ''{0}'' +message.take-ownership.failure=Kunne ikke bli eier av ''{0}'' +message.details.success=Detaljene ble oppdatert +message.details.failure=Kan ikke oppdatere detaljer +message.details.failure.name=Kan ikke gi nytt navn til element. Det kan hende det finnes et annet element med samme navn. +message.details.failure.more.max.length=\u00c9n av egenskapene er st\u00f8rre enn den maksimale verdien. +message.sync.success=Synkronisering ble opprettet +message.sync.failure=Kan ikke opprette synkronisering +message.sync.unavailable=Kan ikke koble til synkroniseringsserveren. +message.unsync.confirm=Er du sikker p\u00e5 at du vil desynkronisere ''{0}''? +message.unsync.success=Synkronisering har blitt fjernet +message.unsync.failure=Kan ikke fjerne synkronisering +message.request.sync.success=Synkronisering ble forespurt +message.request.sync.failure=Kan ikke be om synkronisering +message.error=F\u00e5r ikke tilgang til dokumentbiblioteket +message.empty=Ingen elementer +message.empty.subfolders=Ingen elementer. Klikk "{0}" for \u00e5 se {1} undermappe(r) her. +message.empty.subfolders.link=Vis mapper +message.edit-offline.failure=Du kan ikke redigere ''{0}''. +message.edit-offline.success=''{0}'' kan n\u00e5 redigeres +message.edit-offline.success.ie7=Last ned dokumentet ved bruk av knappen nedenfor. +message.edit-online.office.failure=Kan ikke starte MS Office. +message.edit-online.office.path.failure=Rediger i p\u00e5logget tilstand er ikke tilgjengelig hvis URL-en er lengre enn 260 tegn. Bruk en grunnere sti for \u00e5 redusere lengden. +message.edit-online-aos.no_supported_environment=Denne funksjonen finnes bare i Windows eller Mac OS X. +message.edit-online-aos.starting_office_failed=Microsoft Office kan ikke \u00e5pnes. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office er blokkert +message.edit-online-aos.plugin_blocked.body.firefox=Klikk p\u00e5 Firefox-verkt\u00f8yet for \u00e5 fortsette. +message.edit-online-aos.plugin_blocked.body.chrome=Klikk p\u00e5 den blokkerte indikatoren i Chrome-adresselinjen for \u00e5 fortsette. +message.edit-online-aos.plugin_blocked.body.safari=Klikk p\u00e5 Klarer for \u00e5 fortsette. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=Du bruker en versjon av Microsoft Office som ikke st\u00f8ttes- Fors\u00f8k \u00e5 oppdatere Microsoft Office. +message.edit-online-aos.edit_offline_locked.title={0} redigerer denne filen +message.edit-online-aos.edit_offline_locked.message=Eventuelle endringer som gj\u00f8res, kan g\u00e5 tapt. +message.edit-online-aos.edit_offline_locked.confirm=Fortsett +message.edit-online-aos.edit_offline_locked.cancel=Avbryt +message.edit-online-aos.edit_locked.title={0} redigerer denne filen +message.edit-online-aos.edit_locked.message=Dokumentet er for \u00f8yeblikket l\u00e5st. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=Kan ikke l\u00e5s opp ''{0}''. +message.edit-cancel.failure=Kan ikke avbryte redigering ''{0}''. +message.edit-cancel.success=Redigering ''{0}'' har blitt avbrutt. +message.unlock-document.success=Redigering av ''{0}'' har blitt l\u00e5st opp. +message.file-dnd-move.failure=Det var ikke mulig \u00e5 flytte dokumentet. +message.increment-counter.success=Teller er inkrementert +message.increment-counter.failure=Teller kan ikke inkrementeres. +message.extract-metadata.success=Metadata ble pakket ut. +message.extract-metadata.failure=Kan ikke pakke ut metadata. +message.execute-script.success=Skript ble utf\u00f8rt +message.execute-script.failure=Kan ikke utf\u00f8re skript +message.insitu-edit.name.failure=Kan ikke gi nytt navn til fil. Det kan hende det finnes en annen fil med samme navn. +message.loading=Laster dokumentbiblioteket... +message.simple-workflow.failure=Arbeidsflythandling kan ikke fullf\u00f8res. +message.simple-workflow.approved=Element er merket som godkjent +message.simple-workflow.rejected=Element er merket som avvist +message.simple-workflow.failed=Arbeidsflythandling kan ikke fullf\u00f8res. +message.transform.success=Dokumentet ''{0}'' ble transformert +message.transform.failure=Kan ikke transformere dokument +message.transform-image.success=Bildet ''{0}'' ble transformert +message.transform-image.failure=Kan ikke transformere dokument +message.new-version-upload.success=Filen er n\u00e5 oppdatert: Det er mulig at forh\u00e5ndsvisningen ikke viser den nyeste versjonen av dokumentet enn\u00e5 - siden kan oppdateres senere. + +message.insitu-edit.tag.failure=Kan ikke redigere tagg + +## Drag and Drop +message.dnd.allColumnsAreFull=Kan ikke legge til element fordi alle kolonnene er fulle + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Samsvarbar +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Effektivitet +aspect.cm_emailed=Sendt via e-post +aspect.cm_generalclassifiable=Klassifiserbar +aspect.cm_summarizable=Sammendragbar +aspect.cm_taggable=Koderbar +aspect.cm_templatable=Malbar +aspect.cm_versionable=Versjonbar +aspect.emailserver_aliasable=E-postalias +aspect.app_inlineeditable=Innebygd redigerbar +aspect.cm_geographic=Geografisk +aspect.exif_exif=EXIF +aspect.exif_resolution=Oppl\u00f8sning +aspect.exif_camera=Kameradetaljer +aspect.audio_audio=Lyd +aspect.cm_indexControl=Indekskontroll +aspect.dp_restrictable=Kan begrenses +aspect.cm_attachable=Vedlegg + +# Groups +group.everyone=ALLE + +# Types +type.cm_content=Innholdbasert type +type.cm_folder=Mappebasert type +type.trx_transferTarget=Overf\u00f8ringsm\u00e5l +type.trx_fileTransferTarget=Filoverf\u00f8ringsm\u00e5l + +# Generic Form labels +form.set.general=Generelt +form.set.operations=Operasjoner + +# Runtime +runtime.field.FreeMemory=Ledig minne +runtime.field.MaxMemory=Maksimum minne +runtime.field.TotalMemory=Totalt minne + +# Repository Server +repository-server.set.version=Versjonsinformasjon +repository-server.field.Name=Navn +repository-server.field.Id=ID +repository-server.field.Edition=Utgave +repository-server.field.Schema=Skjema +repository-server.field.Version=Versjon +repository-server.field.VersionLabel=Etikett +repository-server.field.VersionMinor=Mindre +repository-server.field.VersionMajor=Hoved +repository-server.field.VersionRevision=Revidering +repository-server.field.VersionBuild=Bygg +repository-server.field.VersionNumber=Nummer + +# Repository Installed +repository-installed.set.version=Versjonsinformasjon +repository-installed.field.Name=Navn +repository-installed.field.Id=ID +repository-installed.field.Edition=Utgave +repository-installed.field.Schema=Skjema +repository-installed.field.Version=Versjon +repository-installed.field.VersionLabel=Etikett +repository-installed.field.VersionMinor=Mindre +repository-installed.field.VersionMajor=Hoved +repository-installed.field.VersionRevision=Revidering +repository-installed.field.VersionBuild=Bygg +repository-installed.field.VersionNumber=Nummer + +# Authority +authority.field.NumberOfGroups=Antall grupper +authority.field.NumberOfUsers=Antall brukere + +# License +header.license= +license.field.Subject=Lisensemne +license.field.Days=Dager +license.field.Holder=Eier +license.field.ValidUntil=Gyldig inntil +license.field.RemainingDays=Gjenv\u00e6rende dager +license.field.Issued=Utstedt +license.field.Issuer=Utsteder +license.field.HeartBeatDisabled=Livstegn deaktivert +license.field.LicenseMode=Lisensmodus +license.field.CloudSyncKeyAvailable=N\u00f8kkel for skybasert synkronisering er tilgjengelig +license.field.MaxDocs=Maks. innholdsobjekter +license.field.MaxUsers=Maks. brukere +license.field.Users=Brukere +license.field.Documents=Innholdsobjekter +license.field.Info=Denne verdien kan vises som null hvis lisensen ikke har restriksjoner p\u00e5 antall brukere. + +# Pdf2Swf +pdf2swf.field.Available=Tilgjengelig +pdf2swf.field.VersionString=Versjon + +# Open Office +openoffice.field.available=Tilgjengelig +openoffice.field.ooName=Navn +openoffice.field.ooOpenSourceContext=\u00c5pen kildekontekst +openoffice.field.ooSetupExtension=Utvidelse +openoffice.field.ooSetupVersion=Versjon +openoffice.field.ooSetupVersionAboutBox=Om +openoffice.field.ooXMLFileFormatName=XML-filformat +openoffice.field.ooXMLFileFormatVersion=XML-filformatversjon +openoffice.error=Kan ikke vise OpenOffice-informasjon +openoffice.error.404=Finner ikke informasjon om OpenOffice (Kanskje egenskapen "ooo.enabled" er angitt som "usann"?) + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Aktivert +openoffice-subsystem.field.ooo.exe=Ekse +openoffice-subsystem.field.ooo.port=Port + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Aktivert +ooojodconverter.field.jodconverter.maxTasksPerProcess=Maks. Oppgaver per prosess +ooojodconverter.field.jodconverter.officeHome=Kontorhjem +ooojodconverter.field.jodconverter.portNumbers=Portnumre +ooojodconverter.field.jodconverter.taskExecutionTimeout=Tidsavbrudd for oppgaveutf\u00f8relse +ooojodconverter.field.jodconverter.taskQueueTimeout=Tidsavbrudd for oppgavek\u00f8 + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Tilgjengelig +transformer-imagemagick.field.VersionString=Versjonsinformasjon + +# File servers +fileservers.set.filesystem=Filsystem +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Standard tilgangsniv\u00e5 +fileservers.field.filesystem.acl.global.domainAccessControls=Kontroller for domenetilgang +fileservers.field.filesystem.acl.global.protocolAccessControls=Kontroller for protokolltilgang +fileservers.field.filesystem.acl.global.userAccessControls=Kontroller for brukertilgang +fileservers.field.filesystem.domainMappings=Domenekartlegginger +fileservers.field.filesystem.name=Filsystemnavn +fileservers.field.filesystem.name.description=Navnet som brukes for filsystemene n\u00e5r de \u00e5pnes via CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=WINS-autos\u00f8k aktivert +fileservers.field.cifs.WINS.primary=WINS-prim\u00e6r +fileservers.field.cifs.WINS.secondary=WINS-sekund\u00e6r +fileservers.field.cifs.bindto=Bind til +fileservers.field.cifs.broadcast=Kringkast +fileservers.field.cifs.disableNIO=Deaktiver NIO +fileservers.field.cifs.disableNativeCode=Deaktiver integrert kode +fileservers.field.cifs.domain=Domene +fileservers.field.cifs.enabled=CIFS aktivert +fileservers.field.cifs.hostannounce=Vertskunngj\u00f8ring +fileservers.field.cifs.ipv6.enabled=IPV6 aktivert +fileservers.field.cifs.netBIOSSMB.datagramPort=NetBIOS SMB-datagramport +fileservers.field.cifs.netBIOSSMB.namePort=NetBIOS SMB-navnport +fileservers.field.cifs.netBIOSSMB.sessionPort=NetBIOS SMB-\u00f8ktport +fileservers.field.cifs.serverName=Servernavn +fileservers.field.cifs.sessionDebug=Feils\u00f8k \u00f8kt +fileservers.field.cifs.sessionTimeout=Tidsavbrudd for \u00f8kt +fileservers.field.cifs.tcpipSMB.port=TCP/IP SMB-port +fileservers.field.ftp.dataPortFrom=Dataport fra +fileservers.field.ftp.dataPortTo=Dataport til +fileservers.field.ftp.enabled=FTP aktivert +fileservers.field.ftp.keyStore=Keystore +fileservers.field.ftp.passphrase=Passfrase +fileservers.field.ftp.port=Port +fileservers.field.ftp.requireSecureSession=Kreve sikker \u00f8kt +fileservers.field.ftp.sessionDebug=Feils\u00f8k \u00f8kt +fileservers.field.ftp.sslEngineDebug=Feils\u00f8k SSL-motor +fileservers.field.ftp.trustStore=Klareringslager + +# Sysadmin +sysadmin.field.alfresco.context=Databaseinnhold +sysadmin.field.alfresco.host=Databasesvert +sysadmin.field.alfresco.port=Databasesport +sysadmin.field.alfresco.protocol=Databasesprotokoll +sysadmin.field.server.allowedusers=Tillatte brukere +sysadmin.field.server.maxusers=Maks. brukere +sysadmin.field.server.transaction.allow-writes=Tillat skriving +sysadmin.field.share.context=Share kontekst +sysadmin.field.share.host=Share vert +sysadmin.field.share.port=Share port +sysadmin.field.share.protocol=Share protokoll + +# Email (Inbound) +email-inbound.set.service=Innkommende e-posttjeneste +email-inbound.field.email.inbound.enabled=Tjeneste er aktivert +email-inbound.field.email.inbound.unknownUser=Ukjent bruker +email-inbound.set.server=Innkommende e-postserver +email-inbound.field.email.server.allowed.senders=Tillatte avsendere +email-inbound.field.email.server.blocked.senders=Blokkerte avsendere +email-inbound.field.email.server.enabled=Server er aktivert +email-inbound.field.email.server.domain=Domene +email-inbound.field.email.server.port=Port +email-inbound.field.email.server.connections.max=Maksimum antall tilkoblinger +email-inbound.set.tls=Transportlags Sikkerhet +email-inbound.field.email.server.requireTLS=Krev Transport Layer Security (TLS) +email-inbound.field.email.server.hideTLS=Transport Layer Security(TLS) er ikke returnert av EHELO +email-inbound.field.email.server.enableTLS=Godta Transport Layer Security (TLS) + +# Email (Outbound) +email-outbound.set.auth=Godkjenning +email-outbound.set.test-message=Testmelding +email-outbound.field.mail.host=Vert +email-outbound.field.mail.port=Port +email-outbound.field.mail.protocol=Protokoll +email-outbound.field.mail.encoding=Koding +email-outbound.field.mail.from.default=Standard senderadresse +email-outbound.field.mail.from.enabled=Fra er aktivert +email-outbound.field.mail.smtp.auth=Krever SMTP-godkjenning +email-outbound.field.mail.smtps.auth=Krever SMTPS-godkjenning +email-outbound.field.mail.username=Brukernavn +email-outbound.field.mail.password=Passord +email-outbound.field.mail.testmessage.send=Send testmelding ved oppstart +email-outbound.field.mail.testmessage.to=Til +email-outbound.field.mail.testmessage.subject=Emne +email-outbound.field.mail.testmessage.text=Melding + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Hjemmemappebane +imap.field.imap.config.home.rootPath=Hjemmerotbane +imap.field.imap.config.home.store=Hjemmelager +imap.field.imap.server.attachments.extraction.enabled=Utpakking aktivert +imap.field.imap.config.ignore.extraction=Ignorer utpakking +imap.field.imap.config.server.mountPoints=Monteringspunkter +imap.field.imap.mail.from.default=Mail fra standard +imap.field.imap.mail.to.default=Mail til standard +imap.field.imap.server.enabled=Aktivert +imap.field.imap.server.host=Vert +imap.field.imap.server.port=Port + +# Activities Feed +activities.set.activities=Aktivitetsstr\u00f8m +activities.field.feed.notifier.enabled=Feedmelder aktivert +activities.field.feed.notifier.repeatIntervalMins=Gjentakelsesintervall (min) +activities.field.feed.max.ageMins=Maksimumsalder (min) +activities.field.feed.max.size=Maksimumsst\u00f8rrelse + +# Subscriptions +subscriptions.field.subscriptions.enabled=Aktivert + +# Workflow +workflow.field.message=Melding +workflow.field.comment=Kommentar +workflow.field.assign_to=Tilordne til +workflow.field.review_group=Gjennomgangsgruppe +workflow.field.reviewer=Korrekturleser +workflow.field.reviewers=Korrekturlesere +workflow.field.due=Forfaller +workflow.field.priority=Prioritet +workflow.field.outcome=Resultat +workflow.field.enabled.activiti=Aktivert +workflow.field.enabled.jbpm=Aktivert +workflow.field.definitions.visible=Definisjoner er synlige +workflow.field.number.tasks=Antall oppgaver +workflow.field.number.definitions=Antall definisjoner +workflow.field.number.workflows=Antall arbeidsflyter +workflow.field.requiredApprovePercent=Obligatorisk godkjenningsprosent +workflow.set.general=Generelt +workflow.set.assignee=Tilordnet +workflow.set.assignees=De som tilordnes +workflow.set.information=Informasjon +workflow.set.items=Elementer +workflow.set.outcome=Resultat +workflow.set.other=Andre alternativer +workflow.set.task.info=Info +workflow.set.workflow.more_info=Mer informasjon +workflow.set.task.progress=Fremdrift +workflow.set.response=Svar +workflow.set.engine.activiti=Activiti-motor +workflow.set.engine.jbpm=JBPM-motor +workflow.task.error=Oppgaven ble ikke lastet inn. +workflow.task.error.404=Oppgaven finnes ikke eller er kansellert. +workflow.task.invite.title=Omr\u00e5de {0} +workflow.task.invite.subtitle=Du er invitert til \u00e5 bli med p\u00e5 {0}-omr\u00e5det. +workflow.task.invite.role=Din rolle vil v\u00e6re {0}. +workflow.task.invite.accepted={0} {1} har takket ja til invitasjonen om \u00e5 bli med p\u00e5 {2}-omr\u00e5det. +workflow.task.invite.rejected={0} {1} har takket nei til \u00e5 bli med p\u00e5 {2}-omr\u00e5det. +workflow.task.request.invite.title=Brukeren {0} har bedt om \u00e5 f\u00e5 bli med p\u00e5 {1}-omr\u00e5det. +workflow.cancel.title=Avbryt arbeidsflyt +workflow.cancel.label=Er du sikker p\u00e5 at du vil avbryte arbeidsflyten? +workflow.cancel.feedback=Avbryter arbeidsflyten... +workflow.cancel.success=Arbeidsflyten ble avbrutt +workflow.cancel.failure=Kan ikke avbryte arbeidsflyten +workflow.delete.title=Slett arbeidsflyt +workflow.delete.label=Er du sikker p\u00e5 at du vil slette arbeidsflyten? +workflow.delete.feedback=Sletter arbeidsflyt... +workflow.delete.success=Sletting av arbeidsflyten var vellykket +workflow.delete.failure=Kunne ikke slette arbeidsflyt +workflow.no_message=(Ingen melding) +tool.workflow.activiti.tools=Activiti-verkt\u00f8y +tool.workflow.activiti.admin.link=Konsoll for Activiti-arbeidsflyt + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=S\u00f8keadministrator +tool.searchmanager.description=S\u00f8keadministrator + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Aktivert +lucene.field.dir.indexes=Indekser katalog +lucene.field.index.recovery.mode=Indeksgjenopprettelsesmodus +lucene.field.lucene.indexer.contentIndexingEnabled=Innholdsindeksering aktivert +lucene.field.index.tracking.disableInTransactionIndexing=Deaktiver i transaksjonsindeksering + +lucene.set.backup=Sikkerhetskopi +lucene.backup.field.dir.indexes.backup=Indekser sikkerhetskopikatalog +lucene.backup.field.index.backup.cronExpression=Sikkerhetskopier Cron-uttrykk + +lucene.set.advanced=Avansert +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Innholdsindeksering aktivert +lucene.advanced.field.fts.indexer.batchSize=St\u00f8rrelse p\u00e5 indekseringsgruppe +lucene.advanced.field.lucene.maxAtomicTransformationTime=Maks. atomisk konverteringstid +lucene.advanced.field.index.reindexMissingContent.cronExpression=Mangler innholdscron-uttrykk +lucene.advanced.field.indexer.maxFieldLength=Maks. antall indekserte tokener per dokument +lucene.field.indexer.mergerMaxMergeDocs=Maks. flettede dokumenter +lucene.field.indexer.mergerMergeFactor=Maks. flettefaktor + +# Transform action form +transform.field.mime-type=P\u00e5krevd format +transform.field.destination-folder=M\u00e5l + +# Transform Image action form +transform-image.field.mime-type=P\u00e5krevd format +transform-image.field.convert-command=Alternativer +transform-image.field.destination-folder=M\u00e5l + +publish-content.field.publish-channel-id=Publiseringskanal +publish-content.field.unpublish=Stopp publisering +publish-content.field.status-update=Statusoppdatering +publish-content.field.status-update-channel-id=Kanaler for statusoppdatering + +# Execute Script action form +script.field.script-ref=Skript + +# Solr +solr.set.spacesstore=Egenskaper for hovedlager +solr.set.archivestore=Egenskaper for arkiveringslager +solr.field.search.solrTrackingSupport.enabled=Sporing aktivert +solr.help.search.solrTrackingSupport.enabled=Aktiver for \u00e5 tillate at Solr kobles til denne serveren. Spor og indekser oppdateringer +solr.field.solr.host=Solr-vertsnavn +solr.help.field.solr.host=Vertsnavnet der Solr-serveren kj\u00f8rer. Bruk lokalvert hvis den kj\u00f8res p\u00e5 samme maskin. +solr.field.solr.port=Solr-port (ikke-SSL) +solr.help.field.solr.port=Den (ikke sikre) http-porten av programserveren hvor Solr kj\u00f8rer. Bare brukt hvis Solr er konfigurert til \u00e5 kj\u00f8re uten sikker kommunikasjon. +solr.field.solr.port.ssl=Solr SSL-port +solr.help.field.solr.port.ssl=Http-porten av programserveren hvor Solr kj\u00f8rer. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indeksering p\u00e5g\u00e5r +solr.field.tracker.alfresco.lag=Indeksforsinkelse (sekunder) +solr.field.tracker.alfresco.last.indexed.txn=Siste indekserte transaksjon +solr.field.tracker.alfresco.approx.txns.remaining=Omtrentlige transaksjoner som skal indekseres +solr.field.tracker.alfresco.approx.indexing.time.remaining=Omtrentlig gjenv\u00e6rende indekseringstid +solr.help.field.tracker.alfresco.lag=Solr-indekser oppdateres i bakgrunnen. Dette er tiden (i sekunder) som denne Solr-fulltekstindeksen ligger bak databaseoppdateringene. +solr.field.tracker.archive.active=Indeksering p\u00e5g\u00e5r +solr.field.tracker.archive.lag=Indeksforsinkelse (sekunder) +solr.field.tracker.archive.last.indexed.txn=Siste indekserte transaksjon +solr.field.tracker.archive.approx.txns.remaining=Omtrentlige transaksjoner som skal indekseres +solr.field.tracker.archive.approx.indexing.time.remaining=Omtrentlig gjenv\u00e6rende indekseringstid + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Sikkerhetskopier Cron-uttrykk +solr.field.solr.backup.alfresco.remoteBackupLocation=Sikkerhetskopiplassering +solr.field.solr.backup.alfresco.numberToKeep=Sikkerhetskopier som skal bevares +solr.help.solr.backup.alfresco.remoteBackupLocation=Full bane til sted p\u00e5 Solr-serverfilsystemet der indeksikkerhetskopien skal lagres +solr.help.solr.backup.alfresco.numberToKeep=Antall sikkerhetskopier som skal bevares (inkludert den siste sikkerhetskopien) +solr.field.solr.backup.archive.cronExpression=Sikkerhetskopier Cron-uttrykk +solr.field.solr.backup.archive.remoteBackupLocation=Sikkerhetskopiplassering +solr.field.solr.backup.archive.numberToKeep=Sikkerhetskopier som skal bevares +solr.help.solr.backup.archive.remoteBackupLocation=Full bane til sted p\u00e5 Solr-serverfilsystemet der indeksikkerhetskopien skal lagres +solr.help.solr.backup.archive.numberToKeep=Antall sikkerhetskopier som skal bevares (inkludert den siste sikkerhetskopien) + +# searchmanager +searchmanager.field.sourceBeanName=S\u00f8ketjeneste + +## Tooltips +tooltip.path=Bane: {0} +tooltip.site=Omr\u00e5de: {0} + +## Create content +create-content.text=Ren tekst... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Mappe + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Velg m\u00e5ned +calendar.widget_control_config.label_year=Skriv inn \u00e5r +calendar.widget_control_config.label_invalid_year=Skriv inn et gyldig \u00e5r + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Kobling til: {0} +details.created-by=Opprettet den {0} av {1} +details.created-in-site=Opprettet den {0} p\u00e5 {1} +details.editing-started-by=Redigering startet den {0} av {1} +details.editing-started-in-site=Redigering startet den {0} p\u00e5 {1} +details.modified-by=Modifisert {0} av {1} +details.modified-in-site=Modifisert {0} av {1} +details.description.none=Ingen beskrivelse +details.tags.none=Ingen tagger +details.categories.none=Ingen kategorier +details.user.deleted=''{0}'' (slettet bruker) + +## Social Interactions +# Favourite +favourite.document.add.tip=Legg til dokument i favoritter +favourite.document.add.label=Favoritt +favourite.document.remove.tip=Fjern dokument fra favoritter +favourite.folder.add.tip=Legg mappe til favoritter +favourite.folder.add.label=Favoritt +favourite.folder.remove.tip=Fjern mappe fra favoritter +favourite.imap-site.add.tip=Legg omr\u00e5de til IMAP-favoritter +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Fjern omr\u00e5de fra IMAP-favoritter +favourite.site.add.tip=Legg omr\u00e5de til favoritter +favourite.site.add.label=Favoritt +favourite.site.remove.tip=Fjern omr\u00e5de fra favoritter +favourite.message.failure=Kunne ikke lagre favoritt +# Like +like.document.add.tip=Lik dette dokumentet +like.document.add.label=Liker +like.document.remove.tip=Liker ikke +like.folder.add.tip=Liker denne mappen +like.folder.add.label=Liker +like.folder.remove.tip=Liker ikke +like.site.add.tip=Liker dette omr\u00e5det +like.site.add.label=Liker +like.site.remove.tip=Liker ikke +like.message.failure=Kunne ikke lagre liker +# Quickshare +quickshare.link.label=Offentlig kobling +quickshare.link.tooltip=Trykk Ctrl-c for \u00e5 kopiere +quickshare.link.tooltip.mac=Trykk cmd-c for \u00e5 kopiere +quickshare.view.label=Vis +quickshare.unshare.label=Opphev deling +quickshare.document.shared.label=Delt +quickshare.document.shared.tip=Dette dokumentet er delt (klikk for \u00e5 f\u00e5 flere alternativer) +quickshare.document.share.label=Del +quickshare.document.share.tip=Del dokument +quickshare.document.share.failure=Dokumentet kan ikke deles +quickshare.document.unshared.label=Del +quickshare.document.unshared.tip=Del dokument +quickshare.document.unshare.success=Dokumentet er ikke lenger delt +quickshare.document.unshare.failure=Kan ikke oppheve deling av dokument +quickshare.document.unshare.user.failure=Du har ikke de rette tillatelsene til \u00e5 utf\u00f8re en avdeling. +quickshare.linkshare.label=Del med +# LinkShare +linkshare.action.email.label=Del via e-post +linkshare.action.email.subject=Fil delt fra Alfresco Content Services +linkshare.action.email.body=Filen {1} delt fra Alfresco Content Services, se den her: {0} +linkshare.action.facebook.label=Del via Facebook +linkshare.action.facebook.message=Filen {1} delt fra Alfresco Content Services +linkshare.action.twitter.label=Del via Twitter +linkshare.action.twitter.message=Filen {1} delt fra Alfresco Content Services +linkshare.action.google-plus.label=Del via Google+ + + +# Comment +comment.document.tip=Kommenter dette dokumentet +comment.document.label=Kommentar +comment.folder.tip=Kommenter denne mappen +comment.folder.label=Kommentar + +#Dashlets +dashlet.help.tooltip=Vis hjelp for denne dashleten +dashlet.rss.tooltip=Abonner p\u00e5 RSS-feeden for denne dashleten +dashlet.edit.tooltip=Konfigurer denne dashleten + +#Module Package Admin page +tool.module-package.label=Modulleser +tool.module-package.description=Modulleser + +# Category Manager Admin Console +tool.category-manager.label=Kategoriadministrator +tool.category-manager.description=Kategoriadministrator +tool.category-manager.edit-category=Rediger kategori +tool.category-manager.edit-category.failure=Kan ikke redigere navn. +tool.category-manager.add-category=Legg til kategori +tool.category-manager.add-category.failure=Kan ikke legge til denne kategorien. +tool.category-manager.label.category-name=Kategorinavn: +tool.category-manager.delete-category=Slett kategori +tool.category-manager.delete-category.failure=Kan ikke slette denne kategorien. +tool.category-manager.message.confirm.delete.title=Slett kategori +tool.category-manager.message.confirm.delete=Er du sikker p\u00e5 at du vil slette: {0}? + +# Node browser +tool.node-browser.label=Nodeleser +tool.node-browser.description=Nodeleser + +# Label +label.folder=Mappe +label.document=Dokument +label.blogpost=Blogginnlegg +label.forumpost=Forumemne +label.calendarevent=Kalenderhendelse +label.wikipage=Wiki-side +label.link=Kobling +label.datalist=Dataliste +label.datalistitem=Datalisteelement +label.unknown=Ukjent +label.download=Last ned +label.viewinbrowser=Vis i nettleseren +label.viewdetails=Visningsdetaljer +label.selectAll=Velg alle +label.selectInvert=Inverter merket omr\u00e5de +label.selectNone=Ingen +label.selectedItems=Valgte elementer +label.select=Velg +label.restricted-settings=Alfresco Identity Service er aktivert. Noen innstillinger er begrenset. + +# Path +message.infolderpath=I mappe + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Synkronisering venter +sync.status.synced=Synkroniserte {0}, av {1} +sync.status.last-attempt=Siste vellykkede synkronisering {0}, av {1} +sync.status.failed=Synkronisering ble fors\u00f8kt {0}, av {1} +sync.status.last-failed=Siste synkronisering mislyktes +sync.status.transient-error=Midlertidig synkroniseringsfeil +sync.status.transient-error.default-details=Synkronisering vil fortsette n\u00e5r Alfresco Content Services kan kommunisere med skyen igjen. +sync.status.copy.pending=Synkronisering venter p\u00e5 {2} +sync.status.copy.synced={2} synkronisert {0}, av {1} +sync.status.copy.last-attempt={2} siste vellykkede synkronisering {0}, av {1} +sync.status.copy.failed=Synkronisering ble fors\u00f8kt p\u00e5 {2} {0}, av {1} +sync.status.copy.last-failed=Siste synkronisering av {2} mislyktes +sync.status.show-details=Vis detaljer +sync.status.hide-details=Skjul detaljer +sync.status.title=Synkroniseringsinformasjon +sync.status.action.more=Mer informasjon +sync.original-document=Originalt dokument + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=Kan ikke vise synkroniseringsstatus +sync.unable.get.details=Kan ikke f\u00e5 nodedetaljer + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Fjern ''{0}'' fra skyen. +sync.remove.folder.from.cloud=Fjern ''{0}'' og alt innhold under den fra skyen. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Innhold med samme navn finnes allerede i m\u00e5lmappen. +sync.folder.not_found=Finner ikke mappen. +sync.node.already_synced=Kan ikke opprette innhold: det har allerede blitt synkronisert fra en annen plassering. +sync.node.other_sync_set=Innholdet har allerede blitt synkronisert fra et annet sted. +sync.node.no_longer_exists=Innholdet finnes ikke lenger p\u00e5 Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=Innholdet finnes ikke lenger p\u00e5 Alfresco Content Services in the Cloud. Trykk Foresp\u00f8r synkronisering for \u00e5 pr\u00f8ve igjen. +sync.node.unknown=Det oppstod et problem, pr\u00f8ve igjen. +sync.node.unknown.description=Det oppstod en uventet feil. \u00c5rsak: {0}. +sync.node.access_denied=Kan ikke synkronisere innholdet: du har ikke tillatelse til \u00e5 f\u00e5 tilgang til m\u00e5lfilen. +sync.node.access_denied_source=Kan ikke synkronisere innholdet: du har ikke tillatelse til \u00e5 f\u00e5 tilgang til kildefilen. +sync.node.content_limit_violation=Filen overskrider innholdsbegrensningen. Filen er for stor for \u00e5 gjennomf\u00f8re handlingen. +sync.node.quota_limit_violation=Du har overskredet kvoten for innhold. Det finnes ikke nok ledig plass for \u00e5 gjennomf\u00f8re handlingen. +sync.node.authentication_error=Kan ikke synkronisere innholdet til skyen: godkjenningsdetaljene er ikke gyldig. +sync.node.authentication_error.description=Kan ikke synkronisere innholdet til skyen: godkjenningsdetaljene til bruker {0} er ikke gyldig. +sync.node.owner_not_found=Vi kan ikke synkronisere innholdet fordi eieren er blitt fjernet eller slettet. +sync.node.owner_not_found.description=Brukeren som eier denne synkroniseringen, {0}, finnes ikke lenger. Trykk Desynkroniser. + +sync.communications.error=Kan ikke kommunisere med det eksterne systemet +sync.communications.error.description=Kan ikke kommunisere med det eksterne systemet. Synkronisering vil automatisk fungere n\u00e5r kommunikasjon virker igjen + +# Cloud Sync no network available for sync +sync.message.no.active.network=Ingen nettverk er aktivert for synkronisering + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Ny mappe +sync.new-folder.in-the-cloud.header=Detaljer for ny mappe +sync.new-folder.creation.success=Mappen ble opprettet +sync.new-folder.creation.failure=Kan ikke opprette mappe + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=Synkroniserings-ID +hybridsync.ssd-failed-reason-header-label=Type mislykket synkronisering +hybridsync.path-desc-header-label=Opprinnelig elementplassering +hybridsync.sync-creator-header-label=Synkroniseringsoppretter +hybridsync.cloud-user-header-label=Skybruker +hybridsync.remote-tenant-id-header-label=Skynettverk +hybridsync.target-folder-node-ref-header-label=Skym\u00e5l +hybridsync.actions-header-label=Handlinger + +#Hybrid workflow +hybridworkflow.destination-select.title=Velg m\u00e5l for dokumenter i skyen +hybridworkflow.set.destination=M\u00e5l og tilordnede +hybridworkflow.authority.single=Tilordnet +hybridworkflow.authority.multiple=Korrekturlesere +hybridworkflow.review.approved=Godkjent +hybridworkflow.review.rejected=Avvist +hybridworkflow.destination-select.folderPrefix=Dokumenter +hybridworkflow.destination.network=Nettverk +hybridworkflow.destination.site=Omr\u00e5de +hybridworkflow.destination.folder=Mappe +hybridworkflow.destination.button=Velg + +# Security +security.insecuremimetype=Mimetypen for det forespurte innholdet anses som en sikkerhetsrisiko og vil ikke bli vist. + +# Lightbox +lightbox.close=lukk +lightbox.loading=laster diff --git a/share/src/main/resources/alfresco/messages/slingshot_nl.properties b/share/src/main/resources/alfresco/messages/slingshot_nl.properties new file mode 100755 index 0000000000..aecb096ae2 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_nl.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Voer zoektermen in... +# header menu items +header.advanced-search.label=Geavanceerd zoeken... +header.advanced-search.description=Geavanceerd zoeken... +header.application.label=Toepassing +header.application.description=Toepassing +header.change-password.label=Wachtwoord wijzigen +header.change-password.description=Wachtwoord wijzigen +header.groups.label=Groepen +header.groups.description=Groepen +header.tag-management.label=Tagbeheer +header.tag-management.description=Tagbeheer +header.help.label=Help +header.help.description=Help +header.logout.label=Afmelden +header.logout.description=Afmelden +header.more.label=Meer... +header.more.description=Meer... +header.my.label=Mijn... +header.my.description=Mijn... +header.my-content.label=Mijn content +header.my-content.description=Mijn content +header.my-dashboard.label=Mijn dashboard +header.my-dashboard.description=Mijn dashboard +header.my-profile.label=Mijn profiel +header.my-profile.description=Mijn profiel +header.my-sites.label=Mijn sites +header.my-sites.description=Mijn sites +header.my-tasks.label=Mijn taken +header.my-tasks.description=Mijn taken +header.my-workflows.label=Workflows die ik heb gestart +header.my-workflows.description=Workflows die ik heb gestart +header.people.label=Personen +header.people.description=Personen +header.replication-jobs.label=Replicatiejobs +header.replication-jobs.description=Replicatiejobs +header.repository.label=Repository +header.repository.description=Repository +header.trashcan.label=Prullenbak +header.trashcan.description=Tools voor bestanden herstellen en verwijderen +header.saved-searches.label=Opgeslagen zoekopdrachten +header.saved-searches.description=Opgeslagen zoekopdrachten +header.search.description=Zoekopties... +header.sites.label=Sites +header.sites.description=Sites +header.submit-status.label=Delen +header.submit-status.description=Delen +header.tools.label=Beheertools... +header.tools.description=Beheertools... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Gebruikers +header.users.description=Gebruikers + +## Buttons +button.browse=Bladeren +button.edit=Bewerken +button.save=Opslaan +button.savechanges=Wijzigingen opslaan +button.saveandclose=Opslaan en sluiten +button.upload=Uploaden +button.login=Aanmelden +button.delete=Verwijderen +button.take-ownership=OK +button.download=Downloaden +button.clear=Wissen +button.reset=Opnieuw instellen +button.search=Zoeken +button.update=Bijwerken +button.goback=Terug +button.done=Gereed +button.undo=Ongedaan maken +button.new=Nieuw +button.create=Maken +button.rename=Naam wijzigen +button.refreshPage=Pagina vernieuwen +button.createanother=Maken en nog \u00e9\u00e9n maken +button.view.simple=Eenvoudige weergave +button.view.detailed=Gedetailleerde weergave +button.view.gallery=Galerieweergave +button.view.filmstrip=Filmstrip-weergave +button.view.table=Tabelweergave +button.view.media-table=Mediaweergave +button.view.email=E-mailweergave +button.view.audio=Audio-weergave +button.view.dublinCore=Dublin Core-weergave +button.view.effectivity=Effectiviteitweergave + +button.follow=Volgen +button.unfollow=Niet volgen +button.unsync=Synchronisatie verwijderen + +## Messages +message.failure=Mislukt +message.failure.workflow=Gebruiker {0} heeft geen toestemming voor toegang tot deze taak. +message.loginfailure=Aanmelden mislukt +message.loginautherror=Uw verificatiegegevens zijn niet herkend of Alfresco Content Services is momenteel mogelijk niet beschikbaar. +message.passwordchangeauthfailed=Onjuiste verificatiegegevens of geen rechten om wachtwoord te wijzigen. +message.login-portal=Meld u aan via uw portal. +message.unsavedChanges.blog=Het blogbericht bevat niet-opgeslagen wijzigingen. +message.unsavedChanges.comment=Uw opmerking is nog niet opgeslagen. +message.unsavedChanges.discussion=Uw forumonderwerp bevat niet-opgeslagen wijzigingen. +message.unsavedChanges.reply=Uw antwoord bevat niet-opgeslagen wijzigingen. +message.unsavedChanges.wiki=Uw Wiki-artikel bevat niet-opgeslagen wijzigingen. +message.searching=Zoeken... +message.searchingFor=Zoeken naar ''{0}''... +message.minimum-length=Voer ten minste {0} teken(s) in +message.folders-trimmed=Lijst is beperkt tot {0} regels +message.item-missing=Het opgevraagde item kan niet worden weergegeven omdat het niet meer beschikbaar is. +message.save.success=Uw wijzigingen zijn niet opgeslagen. +message.save.failure=Uw wijzigingen kunnen niet worden opgeslagen. +message.cookiesfailure=Cookies zijn uitgeschakeld +message.cookieserror=Cookies moeten zijn ingeschakeld in uw browser. +message.siteRedirect.noPages.manager=Een sitemanager heeft alle functies van deze site uitgeschakeld.
Klik op het pictogram Instellingen   en selecteer Site aanpassen om een of meerdere sitefuncties toe te voegen. +message.siteRedirect.noPages.user=Een sitemanager heeft alle functies van deze site uitgeschakeld.
Ga naar de siteleden en zoek een sitemanager die functies kan toevoegen aan de site. +message.logged-out=U bent nu afgemeld. +message.timeout=Time-out van de server. Het duurt te lang voordat de aanvraag is voltooid, probeer het later opnieuw. +message.loading=Laden... +message.viewInCloud.failure=Kan URL niet ophalen. Controleer synchronisatiestatus. +message.logged-out=U bent nu afgemeld. + +## Common Text labels and CM model metadata +label.tags=Tags +label.none=(Geen) +label.empty=(Leeg) +label.about=Info +label.username=Gebruikersnaam +label.password=Wachtwoord +label.copyright=© 2005-2023 Alfresco Software Inc. Alle rechten voorbehouden. +label.name=Naam +label.id=Id +label.title=Titel +label.description=Beschrijving +label.version=Versie +label.firstname=Voornaam +label.lastname=Achternaam +label.jobtitle=Functie +label.location=Locatie +label.bio=Samenvatting +label.photo=Foto +label.contactinfo=Contactinformatie +label.skype=Skype +label.im=Chatten +label.googleusername=Google-gebruikersnaam +label.company=Bedrijf +label.companyinfo=Bedrijfsgegevens +label.companyname=Naam +label.companyaddress=Adres +label.companytelephone=Telefoon +label.companyfax=Fax +label.companyemail=E-mailadres +label.companypostcode=Postcode +label.email=E-mailadres +label.telephone=Telefoon +label.mobile=Mobiel +label.fax=Fax +label.address=Adres +label.postcode=Postcode +label.groups=Groepen +label.yes=Ja +label.no=Nee +label.ok=OK +label.loading=Laden... +label.validating=Valideren... +label.validationError=Kan referenties niet valideren. +label.site=Site +label.path=Pad +label.type=Type +label.creator=Maker +label.created=Gemaakt +label.modifier=Gewijzigd door +label.modified=Gewijzigd +label.author=Auteur +label.priority={0} prioriteit +label.size=Grootte +label.mimetype=Mimetype +label.mimetype.unknown=Onbekend +label.popularity=Populariteit +label.avatar=Avatar +label.editType=Bewerken: {0} +label.moreInfo=Meer Info > +label.actions.column.header=Acties +# Dictionary Model +label.modelActive=Is Actief +label.modelName=Modelnaam +label.modelDescription=Modelbeschrijving +# Transfer Targets +label.trx_enabled=Is Ingeschakeld +label.trx_endpointhost=Overbrengen naar Host +label.trx_endpointport=Poort +label.you=u +label.licensedTo=Licentiebevoegd voor: + +## Location +location.tooltip.path=Pad: {0} +location.tooltip.site=Site: {0} +location.path.repository=Repository +location.path.documents=Documenten +location.path.userHome=Mijn startpagina +location.path.myfiles=Mijn bestanden +location.path.shared=Gedeelde bestanden +location.label.none=(Geen) +location.label.local={0} +location.label.site={0} in {1} +location.label.repository={0} + +## EXIF +label.exif.width=Breedte +label.exif.height=Hoogte + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} van {totalRecords} +pagination.template.page-report.more=Items {startRecord} - {endRecord} van {totalRecords} worden weergegeven++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} van {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Licht thema +theme.default=Blauw thema +theme.greenTheme=Groen thema +theme.hcBlack=Thema met hoog contrast +theme.yellowTheme=Geel thema +theme.gdocs=Google Docs-thema + +## Admin console tools +tool.users.label=Gebruikers +tool.users.description=Gebruikersbeheer +tool.groups.label=Groepen +tool.groups.description=Groepsbeheer +tool.application.label=Toepassing +tool.application.description=Instellingen en beheer van de toepassing +tool.replication-jobs.label=Replicatiejobs +tool.replication-jobs.description=Beheer van replicatiejobs +tool.repository.label=Repository-tools +tool.repository.description=Repository-tools +tool.tag-management.label=Tagbeheer +tool.tag-management.description=Tagbeheer +tool.workflow.label=Workflow +tool.workflow.description=Workflowtools +tool.trashcan.label=Prullenbak +tool.trashcan.description=Tools voor bestanden herstellen en verwijderen +tool.email-inbound.label=E-mail (inkomend) +tool.email-inbound.description=E-mail (inkomend) +tool.email-outbound.label=E-mail (uitgaand) +tool.email-outbound.description=E-mail (uitgaand) +tool.email-imap.label=E-mail (IMAP) +tool.email-imap.description=E-mail (IMAP) +tool.runtime.label=Runtime +tool.runtime.description=Runtime +tool.repository-server.label=Repositorybeschrijving (huidig) +tool.repository-server.description=Repositorybeschrijving (huidig) +tool.repository-installed.label=Repositorybeschrijving (zoals ge\u00efnstalleerd) +tool.repository-installed.description=Repositorybeschrijving (zoals ge\u00efnstalleerd) +tool.authority.label=Autoriteit +tool.authority.description=Autoriteit +tool.license.label=Licentiebeschrijving +tool.license.description=Licentiebeschrijving +tool.license.link=Mijn abonnement beheren +tool.license.usageinfo.label=Informatie over licentiegebruik +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=OpenOffice-systeem +tool.openoffice-subsystem.description=OpenOffice-systeem +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Transformer pdf2swf +tool.transformer-pdf2swf.description=Transformer pdf2swf +tool.transformer-imagemagick.label=Transformer ImageMagick +tool.transformer-imagemagick.description=Transformer ImageMagick +tool.fileservers.label=Bestandsservers +tool.fileservers.description=Bestandsservers +tool.subscriptions.label=Abonnementen +tool.subscriptions.description=Abonnementen +tool.sysadmin.label=Systeembeheerder +tool.sysadmin.description=Systeembeheerder +tool.activities.label=Activiteitenfeed +tool.activities.description=Activiteitenfeed +tool.workflow.label=Workflow +tool.workflow.description=Workflow +tool.manage-sites.label=Sitesmanager +tool.manage-sites.description=Sitesmanager +tool.cloud-sync-management.label=Cloudsynchronisatiebeheer +tool.cloud-sync-management.description=Cloudsynchronisatiebeheer +tool.search-manager.label=Zoekbeheer +tool.search-manager.description=Zoekbeheer + +## Admin console tool groups +tool.group.usersgroups=Gebruikers en groepen +tool.group.email=E-mailadres +tool.group.transformations=Conversies +tool.group.filemanagement=Bestandsbeheer +tool.group.subscriptions=Abonnementen +tool.group.repository=Repository +tool.group.search=Zoeken +tool.group.site=Sites + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Uitnodiging accepteren +page.acceptInvite.description=Pagina Uitnodiging accepteren. Door de pagina te laden wordt de uitnodiging voor de site geaccepteerd en het account van de gebruiker geactiveerd als dat nog niet het geval is +page.addGroups.title=Groepen toevoegen +page.addGroups.description=Groepen toevoegen +page.add-users.title=Gebruikers toevoegen +page.add-users.description=Gebruikers toevoegen aan een site +page.adminConsole.title=Beheertools +page.adminConsole.description=Administratie- en beheerconsole +page.advsearch.title=Geavanceerd zoeken +page.advsearch.description=Weergave Geavanceerd zoeken +page.blogCreateEdit.title=Blog: blogbericht maken of bewerken +page.blogCreateEdit.description=Toont een formulier om een bericht te maken of te bewerken +page.blogPostList.title=Blog +page.blogPostList.description=Geeft de blogberichten weer +page.blogPostView.title=Blog: berichtdetails weergeven +page.blogPostView.description=Toont de weergave met details van het bericht +page.calendar.title=Agenda +page.calendar.description=Agendaonderdeel van de site +page.changePassword.title=Gebruikerswachtwoord wijzigen +page.changePassword.description=Sectie Wachtwoord wijzigen op de profielpagina van een gebruiker +page.contentViewer.title=Contentviewer +page.contentViewer.description=Pagina om een overzicht te geven van een node +page.createContent.title=Content maken +page.createContent.description=Tekstcontent maken +page.createEditReplicationJob.title=Replicatiejob +page.createEditReplicationJob.description=Replicatiejob maken of bewerken +page.customiseSite.title=Site aanpassen +page.customiseSite.description=Sitepagina's toevoegen of verwijderen +page.customiseSiteDashboard.title=Sitedashboard aanpassen +page.customiseSiteDashboard.description=Lay-out en dashlets voor een sitedashboard aanpassen +page.customiseUserDashboard.title=Gebruikersdashboard aanpassen +page.customiseUserDashboard.description=Lay-out en dashlets voor een gebruikersdashboard aanpassen +page.data-lists.title=Gegevenslijsten +page.data-lists.description=Pagina Gegevenslijsten +page.discussionsCreateTopic.title=Forum: forumpagina maken +page.discussionsCreateTopic.description=Toont het formulier om een onderwerp te maken +page.discussionsTopicList.title=Forum +page.discussionsTopicList.description=Geeft de forumonderwerpen weer +page.discussionsTopicView.title=Forum: details van onderwerp weergeven +page.discussionsTopicView.description=Toont de weergave met details van het onderwerp +page.documentDetails.title=Documentgegevens +page.documentDetails.description=Documentdetails +page.documentLibrary.title=Documentbibliotheek +page.documentLibrary.description=Documentbibliotheek met structuurweergave +page.editMetadata.title=Eigenschappen bewerken +page.editMetadata.description=Eigenschappen van een node bewerken +page.folderDetails.title=Mapdetails +page.folderDetails.description=Mapdetails +page.folderRules.title=Mapregels +page.folderRules.description=Mapregels +page.geographicMap.title=Weergeven in Google Maps +page.geographicMap.description=Geef de fotolocatie weer in Google Maps +page.inlineEdit.title=Bewerken in Alfresco Share +page.inlineEdit.description=Tekstbestanden bewerken in Alfresco Share +page.invite.title=Uitnodigen +page.invite.description=Uitnodigen +page.links.title=Koppelingen +page.links.description=Koppelingen +page.linkCreateEdit.title=Koppelingen: koppeling maken of bewerken +page.linkCreateEdit.description=Toont een formulier om een koppeling te maken of te bewerken +page.linksView.title=Koppelingen: details van koppelingen tonen +page.linksView.description=Toont de weergave met details van de koppelingen +page.login.title=Aanmelden +page.logout.title=Afmelden +page.managePermissions.title=Rechten beheren +page.managePermissions.description=Rechten beheren +page.myFiles.title=Mijn bestanden +page.myFiles.description=Blader door mijn bestanden +page.myDocumentLibraries.title=Mijn documentbibliotheken +page.myDocumentLibraries.description=Startpagina van Mijn documentbibliotheken +page.myTasks.title=Mijn taken +page.myTasks.description=Lijst van actieve en voltooide taken. +page.myWorkflows.title=Workflows die ik heb gestart +page.myWorkflows.description=Pagina Workflows die ik heb gestart +page.pendingInvites.title=Openstaand +page.pendingInvites.description=Openstaande uitnodigingen en aanvragen om lid te worden +page.peopleFinder.title=Mensen zoeken +page.peopleFinder.description=Pagina Mensen zoeken +page.profile.title=Gebruikersprofielpagina +page.profile.description=Profielpagina voor een gebruiker +page.rejectInvite.title=Uitnodiging afwijzen +page.rejectInvite.description=Pagina Uitnodiging afwijzen. Wijst een aanvraag voor uitnodiging af +page.repository.title=Repositorybrowser +page.repository.description=Bladeren naar content in de gehele repository +page.ruleEdit.title=Mapregels +page.ruleEdit.description=Cre\u00eber of bewerk een regel voor een map. +page.search.title=Zoeken +page.search.description=Weergave Zoeken +page.sharedFiles.title=Gedeelde bestanden +page.sharedFiles.description=Door gedeelde bestanden bladeren +page.siteConsole.title=Sitesmanager +page.siteConsole.description=Pagina Sitesmanager - sitebeheertools +page.siteFinder.title=Site zoeken +page.siteFinder.description=Pagina Site zoeken +page.siteIndex.title=Welkom +page.siteIndex.description=Startpagina voor gebruikers. Maakt dashboard voor gebruikerssite, indien nodig, en stuurt gebruiker daar naartoe +page.siteGroups.title=Sitegroepen +page.siteGroups.description=Sitegroepen +page.siteMembers.title=Sitemedewerkers +page.siteMembers.description=Sitemedewerkers +page.startWorkflow.title=Workflow starten +page.startWorkflow.description=Een nieuwe workflow starten +page.taskDetails.title=Taakgegevens +page.taskDetails.description=Pagina waarop gedetailleerde gegevens over taken worden weergegeven +page.taskEdit.title=Taak bewerken +page.taskEdit.description=Pagina voor het bewerken van taakgegevens +page.userContent.title=Door gebruiker bewerkte content +page.userContent.description=Toont de content die de gebruiker het laatst heeft bewerkt +page.userFollowers.title=Volgers +page.userFollowers.description=Toont de personen die de gebruiker volgen +page.userFollowing.title=Volgt +page.userFollowing.description=Toont de personen die door de gebruiker worden gevolgd +page.userNotifications.title=Instellingen voor gebruikersmeldingen +page.userNotifications.description=Sectie Meldingsinstellingen wijzigen op de profielpagina van een gebruiker +page.userCloudAuth.title=Cloudverificatie gebruiker +page.userCloudAuth.description=Cloudverificatiegegevens wijzigen +page.userSites.title=Sites van de gebruiker +page.userSites.description=Lijst met sites waar een gebruiker toe behoort +page.userTrashcan.title=Prullenbak van eindgebruiker +page.userTrashcan.description=Lijst van verwijderde documenten en mappen voor de huidige eindgebruiker +page.wiki.title=Wiki +page.wiki.description=De startpagina voor de Wiki +page.wikiCreate.title=Wiki Formulier maken +page.wikiCreate.description=Toont een formulier om een nieuwe Wiki-pagina te maken +page.wikiPage.title=Wiki +page.wikiPage.description=Toont een Wiki-pagina +page.workspace.title=Dashboard van documentenwerkruimte +page.workspace.description=Dashboardpagina van documentenwerkruimte +page.workflowDetails.title=Workflowgegevens +page.workflowDetails.description=Pagina Workflowgegevens + +## Dashboard page titles and descriptions +page.siteDashboard.title=Sitedashboard +page.siteDashboard.description=Dashboardpagina van samenwerkingssite +page.userDashboard.title=Gebruikersdashboard +page.userDashboard.description=Gebruikersdashboardpagina +page.meeting_workspace.title=Dashboard van vergaderwerkruimte +page.meeting_workspace.description=Dashboardpagina van vergaderwerkruimte + +page.error.500.title=Alfresco Share » Systeemfout +page.error.500.header=Er is een fout in deze pagina opgetreden... +page.error.500.detail=

Mogelijk is er een fout opgetreden of is er iets gewist of verwijderd. Controleer of de URL correct is.

Het kan ook zijn dat u geen rechten hebt om de pagina te bekijken (de pagina bevindt zich misschien op een priv\u00e9site) of het kan om een interne fout gaan. Neem contact met uw IT-team.

Als u probeert bij uw startpagina te komen en deze is niet meer beschikbaar, moet u deze wijzigen door op uw naam te klikken in de werkbalk.

+page.error.500.nav.dashboard=Terug naar mijn dashboard +page.error.500.footer=Alfresco Software Inc. © 2005-2023 Alle rechten voorbehouden. + +## Title bar component titles for pages that use the simple-title component +title.repository=Repository +title.browser=Browser +title.siteFinder=Site zoeken +title.peopleFinder=Mensen zoeken +title.myTasks=Mijn taken + +## Site Visibility +site.visibility.label.PUBLIC=Openbaar +site.visibility.label.MODERATED=Onder toezicht +site.visibility.label.PRIVATE=Priv\u00e9 +site.visibility.description.PUBLIC=Iedereen in uw organisatie heeft toegang tot deze site. +site.visibility.description.MODERATED=Iedereen in uw organisatie kan deze site vinden en vragen om toegang tot de site. Toegang wordt verleend door sitemanagers. +site.visibility.description.PRIVATE=Alleen personen die zijn toegevoegd door een sitemanager, kunnen deze site vinden en gebruiken. + +## Roles +role.SiteManager=Beheerder +role.SiteManager.description=heeft volledige rechten voor alle sitecontent; wat de manager zelf heeft gemaakt en wat andere leden van de site hebben gemaakt. +role.Collaborator=Medewerker +role.Collaborator.description=heeft volledige rechten voor de content waarvan de medewerker eigenaar is; medewerkers kunnen content die door anderen is gemaakt, bewerken maar niet verwijderen. +role.SiteCollaborator=Medewerker +role.SiteCollaborator.description=heeft volledige rechten voor de sitecontent waarvan de medewerker eigenaar is; medewerkers kunnen content die door andere leden van de site is gemaakt, bewerken maar niet verwijderen. +role.Contributor=Bijdrager +role.Contributor.description=heeft volledige rechten voor de content waarvan de bijdrager eigenaar is; bijdragers kunnen content die door anderen is gemaakt, bewerken maar niet verwijderen. +role.SiteContributor=Bijdrager +role.SiteContributor.description=heeft volledige rechten voor de sitecontent waarvan de bijdrager eigenaar is; bijdragers kunnen content die door andere leden van de site is gemaakt, bewerken maar niet verwijderen. +role.Consumer=Consument +role.Consumer.description=heeft alleen rechten voor het bekijken van content; consumenten kunnen niet hun eigen content maken. +role.SiteConsumer=Consument +role.SiteConsumer.description=heeft op een site alleen rechten voor het bekijken van content; consumenten kunnen niet hun eigen content maken. +role.Coordinator=Co\u00f6rdinator +role.Coordinator.description=heeft volledige rechten voor alle content; wat de co\u00f6rdinator zelf heeft gemaakt en wat anderen hebben gemaakt. +role.Editor=Editor +role.Editor.description=heeft rechten om bestandseigenschappen te bewerken en bestanden in en uit te checken; editors kunnen niet hun eigen content maken. + +roles.readassociations=Consument + +roles-tooltip.header=Info over rollen +roles-tooltip.docs-url-label=Lees meer +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Tags +taglibrary.populartagslink=Kies uit populaire tags voor deze site +taglibrary.msg.failedLoadTags=Kan geen tags van de server laden (geen verbinding?) +taglibrary.msg.unableLoadTags=Kan geen tags laden: {0} +taglibrary.tip.removeTag=Tag verwijderen +taglibrary.tip.help=Scheid tags van elkaar met spaties. Voeg twee of meer woorden bij elkaar met "dubbele aanhalingstekens" + +## YUI Editor keys +yuieditor.toolbar.group.font=Lettertype +yuieditor.toolbar.group.lists=Lijsten +yuieditor.toolbar.group.link=Koppeling +yuieditor.toolbar.item.createorderedlist=Geordende lijst maken +yuieditor.toolbar.item.createunorderedlist=Ongeordende lijst maken +yuieditor.toolbar.item.fontcolor=Tekstkleur +yuieditor.toolbar.item.backgroundcolor=Achtergrondkleur +yuieditor.toolbar.item.bold=Vet CTRL + SHIFT + B +yuieditor.toolbar.item.italic=Cursief CTRL + SHIFT + I +yuieditor.toolbar.item.underline=Onderstreept CTRL + SHIFT + U +yuieditor.toolbar.item.link=HTML-koppeling CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=Selecteren +menu.select.all=Alle +menu.select.none=Geen +menu.select.invert=Selectie omkeren +menu.select.folders=Mappen +menu.select.documents=Documenten + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Maak document op basis van sjabloon +menu.create-content.by-template-folder=Maak map op basis van sjabloon +menu.selected-items=Geselecteerde items... +menu.selected-items.copy=Kopi\u00ebren naar... +menu.selected-items.move=Verplaatsen naar... +menu.selected-items.delete=Verwijderen +menu.selected-items.download=Downloaden als .zip-bestand +menu.selected-items.assign-workflow=Workflow starten... +menu.selected-items.manage-permissions=Rechten beheren... +menu.selected-items.deselect-all=Alle selecties opheffen +menu.selected-items.cloudSync=Synchroniseren met cloud +menu.selected-items.cloudUnsync=Synchronisatie met cloud ongedaan maken +menu.selected-items.cloudRequestSync=Synchronisatie aanvragen + +## Document Library Actions +actions.document.assign-workflow=Workflow starten +actions.document.cancel-editing=Bewerken annuleren +actions.document.cancel-editing-unlock=Document ontgrendelen +actions.document.change-type=Type wijzigen +actions.document.copy-to=Kopi\u00ebren naar... +actions.document.delete=Document verwijderen +actions.document.download=Downloaden +actions.document.download-again=Downloaden +actions.document.download-original=Origineel downloaden +actions.document.edit-metadata=Eigenschappen bewerken +actions.document.edit-offline=Offline bewerken +actions.document.edit-online=Bewerken in Microsoft Office\u2122 +message.edit-online.supported_office_version_required=U gebruikt een versie van Microsoft Office die niet wordt ondersteund. Probeer Microsoft Office bij te werken. Office 2007 en 2008 werken niet met Google Chrome. +actions.document.extract-metadata=Metagegevens extraheren +actions.document.execute-script=Script uitvoeren +actions.document.inline-edit=Bewerken in Alfresco Share +actions.document.increment-counter=Stappenteller +actions.document.locate=Bestand zoeken +actions.document.manage-aspects=Aspecten beheren +actions.document.manage-permissions=Rechten beheren +actions.document.take-ownership=Word eigenaar +actions.document.move-to=Verplaatsen naar... +actions.document.simple-approve=Goedkeuren +actions.document.simple-reject=Afwijzen +actions.document.upload-new-version=Nieuwe versie uploaden +actions.document.view=Weergeven in browser +actions.document.view-google-map=Weergeven in Google Maps +actions.document.view-original=Originele document weergeven +actions.document.view-source-repository=Weergeven in bronrepository +actions.document.view-working-copy=Werkkopie weergeven +actions.document.publish=Publiceren +actions.document.transform=Converteren +actions.document.transform-image=Converteren naar afbeelding +actions.document.publish-content=Content publiceren +actions.document.cloud-sync=Synchroniseren met cloud +actions.document.cloud-unsync=Synchronisatie met cloud ongedaan maken +actions.document.view-in-cloud=Weergeven in cloud +actions.document.request-sync=Synchronisatie aanvragen +actions.document.unzip-to=Uitpakken naar... +actions.folder.download=Downloaden als .zip-bestand +actions.folder.change-type=Type wijzigen +actions.folder.copy-to=Kopi\u00ebren naar... +actions.folder.delete=Map verwijderen +actions.folder.edit-metadata=Eigenschappen bewerken +actions.folder.locate=Map zoeken +actions.folder.manage-aspects=Aspecten beheren +actions.folder.manage-permissions=Rechten beheren +actions.folder.take-ownership=Word eigenaar +actions.folder.move-to=Verplaatsen naar... +actions.folder.rules=Regels beheren +actions.folder.simple-approve=Goedkeuren +actions.folder.simple-reject=Afwijzen +actions.folder.view-details=Details weergeven +actions.folder.view-source-repository=Weergeven in bronrepository +actions.folder.cloud-sync=Synchroniseren met cloud +actions.folder.cloud-unsync=Synchronisatie met cloud ongedaan maken +actions.folder.view-in-cloud=Weergeven in cloud +actions.link.delete=Koppeling verwijderen +actions.link.locate=Gekoppeld item zoeken +actions.editOnline.failure=Het bestand ''{0}'' kan niet worden geopend voor online bewerking. U dient een van de volgende invoegtoepassingen te installeren in uw browser. \n voor Windows: Microsoft Office 2010 \n Voor Mac OS X: SharePoint Browser Plug-in +actions.editOnline.invalid=Het bestand ''{0}'' kan niet online worden bewerkt om de naam tekens bevat die niet zijn toegestaan door het protocol SPP.\nOngeldige tekens bestaan uit: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' is gesynchroniseerd en bij deze verwijdering wordt het document lokaal en uit de cloud verwijderd. +actions.synced.folder.delete=
''{0}'' is gesynchroniseerd en bij deze verwijdering worden deze map en de inhoud ervan lokaal en uit de cloud verwijderd. +actions.synced.remove-sync=
Als het object in de cloud moet blijven, voert u direct de actie ''Synchronisatie verwijderen'' uit. +actions.synced.cloud.document.delete=
''{0}'' is gesynchroniseerd en bij deze verwijdering wordt het document alleen lokaal verwijderd. +actions.synced.cloud.folder.delete=
''{0}'' is gesynchroniseerd en bij deze verwijdering worden deze map en de inhoud ervan alleen lokaal verwijderd. +actions.synced.cloud.document.delete.on.prem=
''{0}'' is gesynchroniseerd en bij deze verwijdering wordt het document op het platform en lokaal verwijderd. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' is gesynchroniseerd en bij deze verwijdering worden deze map en de inhoud ervan op het platform en lokaal verwijderd. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=Kan gekoppeld item niet vinden: doel is verwijderd. +message.change-type.success=Type van document ''{0}'' is gewijzigd +message.change-type.failure=Kan type van document ''{0}'' niet wijzigen +message.confirm.delete=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.delete.success=''{0}'' is verwijderd +message.delete.failure=Kan ''{0}'' niet verwijderen +message.multiple-delete.please-wait=Een ogenblik geduld. Bestanden worden verwijderd... +message.confirm.take-ownership.title=Eigenaar worden? +message.confirm.take-ownership=U wordt de eigenaar van ''{0}''; de rechten van de vorige eigenaar worden mogelijk beperkt. +message.take-ownership.success=U bent nu eigenaar van ''{0}'' +message.take-ownership.failure=Kan geen eigenaar worden van ''{0}'' +message.details.success=Details zijn bijgewerkt +message.details.failure=Kan details niet bijwerken +message.details.failure.name=Kan naam van item niet wijzigen. Mogelijk bestaat er al een item met deze naam. +message.details.failure.more.max.length=E\u00e9n van de eigenschappen is groter dan de maximale waarde. +message.sync.success=Synchronisatie is tot stand gebracht +message.sync.failure=Kan geen synchronisatie tot stand brengen +message.sync.unavailable=Kan geen verbinding maken met de synchronisatieserver. +message.unsync.confirm=Weet u zeker dat u de synchronisatie van ''{0}'' ongedaan wilt maken? +message.unsync.success=Synchronisatie is verwijderd +message.unsync.failure=Kan synchronisatie niet verwijderen +message.request.sync.success=Synchronisatie is aangevraagd +message.request.sync.failure=Kan synchronisatie niet aanvragen +message.error=Geen toegang tot de documentbibliotheek +message.empty=Geen items +message.empty.subfolders=Geen items. Klik op ''{0}'' om hier {1} submap(pen) weer te geven. +message.empty.subfolders.link=Mappen weergeven +message.edit-offline.failure=U kunt ''{0}'' niet bewerken. +message.edit-offline.success=''{0}'' kan nu worden bewerkt +message.edit-offline.success.ie7=Download het document met de knop hieronder. +message.edit-online.office.failure=Kan MS Office niet starten. +message.edit-online.office.path.failure=Online bewerken is niet beschikbaar omdat de URL langer dan 260 tekens is. Gebruik een minder diep pad om de lengte in te korten. +message.edit-online-aos.no_supported_environment=Deze functie is alleen beschikbaar onder Windows of Mac OS X. +message.edit-online-aos.starting_office_failed=Microsoft Office kan niet worden geopend. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office geblokkeerd +message.edit-online-aos.plugin_blocked.body.firefox=Klik op de werkbalk van Firefox om door te gaan. +message.edit-online-aos.plugin_blocked.body.chrome=Klik op de blokkeringsindicator in de adresbalk van Chrome om door te gaan. +message.edit-online-aos.plugin_blocked.body.safari=Klik op Vertrouwen om door te gaan. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=U gebruikt een versie van Microsoft Office die niet wordt ondersteund. Probeer Microsoft Office bij te werken. +message.edit-online-aos.edit_offline_locked.title=Dit bestand wordt bewerkt door {0} +message.edit-online-aos.edit_offline_locked.message=Wijzigingen kunnen verloren gaan. +message.edit-online-aos.edit_offline_locked.confirm=Doorgaan +message.edit-online-aos.edit_offline_locked.cancel=Annuleren +message.edit-online-aos.edit_locked.title=Dit bestand wordt bewerkt door {0} +message.edit-online-aos.edit_locked.message=Het document is momenteel vergrendeld. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=Kan ''{0}'' niet ontgrendelen. +message.edit-cancel.failure=Kan bewerken van ''{0}'' niet annuleren. +message.edit-cancel.success=Bewerken van ''{0}'' is geannuleerd. +message.unlock-document.success=Bewerken van ''{0}'' is ontgrendeld. +message.file-dnd-move.failure=Het document kon niet worden verplaatst. +message.increment-counter.success=Teller verhoogd +message.increment-counter.failure=Kan teller niet verhogen. +message.extract-metadata.success=Metagegevens zijn opgehaald. +message.extract-metadata.failure=Kan metagegevens niet ophalen. +message.execute-script.success=Script is uitgevoerd +message.execute-script.failure=Kan script niet uitvoeren +message.insitu-edit.name.failure=Kan bestandsnaam niet wijzigen. Mogelijk bestaat er al een bestand met deze naam. +message.loading=Documentbibliotheek laden... +message.simple-workflow.failure=Workflowactie kan niet worden voltooid. +message.simple-workflow.approved=Item gemarkeerd als goedgekeurd +message.simple-workflow.rejected=Item gemarkeerd als afgewezen +message.simple-workflow.failed=Workflowactie kan niet worden voltooid. +message.transform.success=Document ''{0}'' is geconverteerd +message.transform.failure=Kan document niet converteren +message.transform-image.success=Afbeelding ''{0}'' is geconverteerd +message.transform-image.failure=Kan document niet converteren +message.new-version-upload.success=Uploaden van bestand is voltooid. In de preview wordt mogelijk nog niet de nieuwste versie van het document weergegeven. U kunt de pagina later vernieuwen om deze bij te werken. + +message.insitu-edit.tag.failure=Kan tag niet bewerken + +## Drag and Drop +message.dnd.allColumnsAreFull=Kan element niet toevoegen omdat alle kolommen vol zijn + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Compliance mogelijk +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Effectiviteit +aspect.cm_emailed=Gemaild +aspect.cm_generalclassifiable=Classificatie mogelijk +aspect.cm_summarizable=Overzicht mogelijk +aspect.cm_taggable=Tags mogelijk +aspect.cm_templatable=Sjabloon mogelijk +aspect.cm_versionable=Versies mogelijk +aspect.emailserver_aliasable=E-mailalias +aspect.app_inlineeditable=Inline bewerken mogelijk +aspect.cm_geographic=Geografisch +aspect.exif_exif=EXIF +aspect.exif_resolution=Resolutie +aspect.exif_camera=Cameragegevens +aspect.audio_audio=Audio +aspect.cm_indexControl=Indexeringsbeheer +aspect.dp_restrictable=Beperkbaar +aspect.cm_attachable=Bijlagen + +# Groups +group.everyone=IEDEREEN + +# Types +type.cm_content=Content-basistype +type.cm_folder=Map-basistype +type.trx_transferTarget=Bestemming van overdracht +type.trx_fileTransferTarget=Bestemming bestandsoverdracht + +# Generic Form labels +form.set.general=Algemeen +form.set.operations=Bewerkingen + +# Runtime +runtime.field.FreeMemory=Vrij geheugen +runtime.field.MaxMemory=Maximumgeheugen +runtime.field.TotalMemory=Totaal geheugen + +# Repository Server +repository-server.set.version=Versie-informatie +repository-server.field.Name=Naam +repository-server.field.Id=Id +repository-server.field.Edition=Editie +repository-server.field.Schema=Schema +repository-server.field.Version=Versie +repository-server.field.VersionLabel=Label +repository-server.field.VersionMinor=Secundair +repository-server.field.VersionMajor=Primair +repository-server.field.VersionRevision=Revisie +repository-server.field.VersionBuild=Build +repository-server.field.VersionNumber=Nummer + +# Repository Installed +repository-installed.set.version=Versie-informatie +repository-installed.field.Name=Naam +repository-installed.field.Id=Id +repository-installed.field.Edition=Editie +repository-installed.field.Schema=Schema +repository-installed.field.Version=Versie +repository-installed.field.VersionLabel=Label +repository-installed.field.VersionMinor=Secundair +repository-installed.field.VersionMajor=Primair +repository-installed.field.VersionRevision=Revisie +repository-installed.field.VersionBuild=Build +repository-installed.field.VersionNumber=Nummer + +# Authority +authority.field.NumberOfGroups=Aantal groepen +authority.field.NumberOfUsers=Aantal gebruikers + +# License +header.license= +license.field.Subject=Licentieonderwerp +license.field.Days=Dagen +license.field.Holder=Houder +license.field.ValidUntil=Geldig tot +license.field.RemainingDays=Resterende dagen +license.field.Issued=Verleend +license.field.Issuer=Uitgever +license.field.HeartBeatDisabled=Heartbeat uitgeschakeld +license.field.LicenseMode=Licentiemodus +license.field.CloudSyncKeyAvailable=Cloud Sync Key beschikbaar +license.field.MaxDocs=Max. contentobjecten +license.field.MaxUsers=Max. gebruikers +license.field.Users=Gebruikers +license.field.Documents=Contentobjecten +license.field.Info=Deze waarde wordt mogelijk weergegeven als nul wanneer uw licentie geen beperking heeft voor het aantal gebruikers. + +# Pdf2Swf +pdf2swf.field.Available=Beschikbaar +pdf2swf.field.VersionString=Versie + +# Open Office +openoffice.field.available=Beschikbaar +openoffice.field.ooName=Naam +openoffice.field.ooOpenSourceContext=Open Source-context +openoffice.field.ooSetupExtension=Uitbreiding +openoffice.field.ooSetupVersion=Versie +openoffice.field.ooSetupVersionAboutBox=Info +openoffice.field.ooXMLFileFormatName=XML-bestandsindeling +openoffice.field.ooXMLFileFormatVersion=XML-bestandsversie +openoffice.error=Kan OpenOffice-gegevens niet weergeven +openoffice.error.404=Geen gegevens over OpenOffice gevonden (Mogelijk is de eigenschap "ooo.enabled" ingesteld op "false"?) + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Ingeschakeld +openoffice-subsystem.field.ooo.exe=Exe +openoffice-subsystem.field.ooo.port=Poort + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Ingeschakeld +ooojodconverter.field.jodconverter.maxTasksPerProcess=Max. taken per proces +ooojodconverter.field.jodconverter.officeHome=Office Home +ooojodconverter.field.jodconverter.portNumbers=Poortnummers +ooojodconverter.field.jodconverter.taskExecutionTimeout=Time-out taakuitvoering +ooojodconverter.field.jodconverter.taskQueueTimeout=Time-out taakwachtrij + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Beschikbaar +transformer-imagemagick.field.VersionString=Versie-informatie + +# File servers +fileservers.set.filesystem=Bestandssysteem +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=Standaardtoegangsniveau +fileservers.field.filesystem.acl.global.domainAccessControls=Domeintoegangsopties +fileservers.field.filesystem.acl.global.protocolAccessControls=Protocoltoegangsopties +fileservers.field.filesystem.acl.global.userAccessControls=Gebruikerstoegangsopties +fileservers.field.filesystem.domainMappings=Domeintoewijzingen +fileservers.field.filesystem.name=Bestandssysteemnaam +fileservers.field.filesystem.name.description=De naam die wordt gebruikt voor het bestandssysteem bij toegang via CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=WINS Auto Detect ingeschakeld +fileservers.field.cifs.WINS.primary=WINS primair +fileservers.field.cifs.WINS.secondary=WINS secundair +fileservers.field.cifs.bindto=Binden met +fileservers.field.cifs.broadcast=Uitzenden +fileservers.field.cifs.disableNIO=NIO uitschakelen +fileservers.field.cifs.disableNativeCode=Native code uitschakelen +fileservers.field.cifs.domain=Domein +fileservers.field.cifs.enabled=CIFS ingeschakeld +fileservers.field.cifs.hostannounce=Host aankondigen +fileservers.field.cifs.ipv6.enabled=IPV6 ingeschakeld +fileservers.field.cifs.netBIOSSMB.datagramPort=NetBIOS SMB-datagrampoort +fileservers.field.cifs.netBIOSSMB.namePort=NetBIOS SMB-naampoort +fileservers.field.cifs.netBIOSSMB.sessionPort=NetBIOS SMB-sessiepoort +fileservers.field.cifs.serverName=Servernaam +fileservers.field.cifs.sessionDebug=Fouten in sessie opsporen +fileservers.field.cifs.sessionTimeout=Sessietime-out +fileservers.field.cifs.tcpipSMB.port=TCP/IP SMB-poort +fileservers.field.ftp.dataPortFrom=Gegevenspoort van +fileservers.field.ftp.dataPortTo=Gegevenspoort naar +fileservers.field.ftp.enabled=FTP ingeschakeld +fileservers.field.ftp.keyStore=Keystore +fileservers.field.ftp.passphrase=Wachtwoordzin +fileservers.field.ftp.port=Poort +fileservers.field.ftp.requireSecureSession=Beveiligde sessie vereist +fileservers.field.ftp.sessionDebug=Fouten in sessie opsporen +fileservers.field.ftp.sslEngineDebug=Fout in SSL-engine opsporen +fileservers.field.ftp.trustStore=Vertrouwensarchief + +# Sysadmin +sysadmin.field.alfresco.context=Repository-context +sysadmin.field.alfresco.host=Repository-host +sysadmin.field.alfresco.port=Repository-poort +sysadmin.field.alfresco.protocol=Repository-protocol +sysadmin.field.server.allowedusers=Toegestane gebruikers +sysadmin.field.server.maxusers=Max. gebruikers +sysadmin.field.server.transaction.allow-writes=Schrijfbewerkingen toestaan +sysadmin.field.share.context=Share-context +sysadmin.field.share.host=Share-host +sysadmin.field.share.port=Share-poort +sysadmin.field.share.protocol=Share-protocol + +# Email (Inbound) +email-inbound.set.service=Service voor inkomende e-mail +email-inbound.field.email.inbound.enabled=Service ingeschakeld +email-inbound.field.email.inbound.unknownUser=Onbekende gebruiker +email-inbound.set.server=Server voor inkomende e-mail +email-inbound.field.email.server.allowed.senders=Toegestane verzenders +email-inbound.field.email.server.blocked.senders=Geblokkeerde verzenders +email-inbound.field.email.server.enabled=Server ingeschakeld +email-inbound.field.email.server.domain=Domein +email-inbound.field.email.server.port=Poort +email-inbound.field.email.server.connections.max=Maximumaantal verbindingen +email-inbound.set.tls=Transport Layer Security +email-inbound.field.email.server.requireTLS=Transport Layer Security (TLS) vereist +email-inbound.field.email.server.hideTLS=Transport Layer Security(TLS) is niet geretourneerd door EHELO +email-inbound.field.email.server.enableTLS=Transport Layer Security (TLS) accepteren + +# Email (Outbound) +email-outbound.set.auth=Verificatie +email-outbound.set.test-message=Testbericht +email-outbound.field.mail.host=Host +email-outbound.field.mail.port=Poort +email-outbound.field.mail.protocol=Protocol +email-outbound.field.mail.encoding=Codering +email-outbound.field.mail.from.default=Standaardadres van afzender +email-outbound.field.mail.from.enabled=Van ingeschakeld +email-outbound.field.mail.smtp.auth=SMTP-verificatie vereist +email-outbound.field.mail.smtps.auth=SMTPS-verificatie vereist +email-outbound.field.mail.username=Gebruikersnaam +email-outbound.field.mail.password=Wachtwoord +email-outbound.field.mail.testmessage.send=Testbericht verzenden bij opstarten +email-outbound.field.mail.testmessage.to=Aan +email-outbound.field.mail.testmessage.subject=Onderwerp +email-outbound.field.mail.testmessage.text=Bericht + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Pad naar basismap +imap.field.imap.config.home.rootPath=Pad naar hoofdmap +imap.field.imap.config.home.store=Basisarchief +imap.field.imap.server.attachments.extraction.enabled=Extractie is ingeschakeld +imap.field.imap.config.ignore.extraction=Extractie negeren +imap.field.imap.config.server.mountPoints=Koppelpunten +imap.field.imap.mail.from.default=E-mail vanaf standaard +imap.field.imap.mail.to.default=E-mail naar standaard +imap.field.imap.server.enabled=Ingeschakeld +imap.field.imap.server.host=Host +imap.field.imap.server.port=Poort + +# Activities Feed +activities.set.activities=Activiteitenfeed +activities.field.feed.notifier.enabled=Feedmeldingen ingeschakeld +activities.field.feed.notifier.repeatIntervalMins=Herhaalinterval (min.) +activities.field.feed.max.ageMins=Max. duur (min.) +activities.field.feed.max.size=Maximale grootte + +# Subscriptions +subscriptions.field.subscriptions.enabled=Ingeschakeld + +# Workflow +workflow.field.message=Bericht +workflow.field.comment=Opmerking +workflow.field.assign_to=Toewijzen aan +workflow.field.review_group=Revisorgroep +workflow.field.reviewer=Revisor +workflow.field.reviewers=Revisors +workflow.field.due=Vervaldatum +workflow.field.priority=Prioriteit +workflow.field.outcome=Resultaat +workflow.field.enabled.activiti=Ingeschakeld +workflow.field.enabled.jbpm=Ingeschakeld +workflow.field.definitions.visible=Zichtbare definities +workflow.field.number.tasks=Aantal taken +workflow.field.number.definitions=Aantal definities +workflow.field.number.workflows=Aantal workflows +workflow.field.requiredApprovePercent=Vereist goedkeuringspercentage +workflow.set.general=Algemeen +workflow.set.assignee=Toegewezen persoon +workflow.set.assignees=Toegewezen personen +workflow.set.information=Informatie +workflow.set.items=Objecten +workflow.set.outcome=Resultaat +workflow.set.other=Andere opties +workflow.set.task.info=Info +workflow.set.workflow.more_info=Meer Info +workflow.set.task.progress=Voortgang +workflow.set.response=Antwoord +workflow.set.engine.activiti=Activiti-engine +workflow.set.engine.jbpm=JBPM-engine +workflow.task.error=Kan de taak niet laden. +workflow.task.error.404=De taak bestaat niet of is geannuleerd. +workflow.task.invite.title=Site {0} +workflow.task.invite.subtitle=U bent uitgenodigd voor de site {0}. +workflow.task.invite.role=Uw rol is {0}. +workflow.task.invite.accepted={0} {1} heeft uw uitnodiging voor site {2} geaccepteerd. +workflow.task.invite.rejected={0} {1} heeft uw uitnodiging voor site {2} afgewezen. +workflow.task.request.invite.title=Gebruiker {0} heeft lidmaatschap voor site {1} aangevraagd. +workflow.cancel.title=Workflow annuleren +workflow.cancel.label=Wilt u de workflow annuleren? +workflow.cancel.feedback=Workflow annuleren... +workflow.cancel.success=De workflow is geannuleerd +workflow.cancel.failure=Kan de workflow niet annuleren +workflow.delete.title=Workflow verwijderen +workflow.delete.label=Weet u zeker dat u de workflow wilt verwijderen? +workflow.delete.feedback=Workflow verwijderen... +workflow.delete.success=Workflow is verwijderd +workflow.delete.failure=Kan workflow niet verwijderen +workflow.no_message=(Geen bericht) +tool.workflow.activiti.tools=Activiti-tools +tool.workflow.activiti.admin.link=Activiti-workflowconsole + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Zoekbeheer +tool.searchmanager.description=Zoekbeheer + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Ingeschakeld +lucene.field.dir.indexes=Indexmap +lucene.field.index.recovery.mode=Indexherstelmodus +lucene.field.lucene.indexer.contentIndexingEnabled=Content indexeren ingeschakeld +lucene.field.index.tracking.disableInTransactionIndexing=Transacties indexeren uitgeschakeld + +lucene.set.backup=Back-up +lucene.backup.field.dir.indexes.backup=Back-upmap indexeren +lucene.backup.field.index.backup.cronExpression=Cron-expressie voor back-up + +lucene.set.advanced=Geavanceerd +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Content indexeren ingeschakeld +lucene.advanced.field.fts.indexer.batchSize=Grootte van indexeringsbatch +lucene.advanced.field.lucene.maxAtomicTransformationTime=Max. atomaire conversietijd +lucene.advanced.field.index.reindexMissingContent.cronExpression=Cron-expressie voor ontbrekende content +lucene.advanced.field.indexer.maxFieldLength=Max. aantal ge\u00efndexeerde tokens per document +lucene.field.indexer.mergerMaxMergeDocs=Max. samenvoegingsdocumenten +lucene.field.indexer.mergerMergeFactor=Max. samenvoegingsfactor + +# Transform action form +transform.field.mime-type=Vereiste indeling +transform.field.destination-folder=Bestemming + +# Transform Image action form +transform-image.field.mime-type=Vereiste indeling +transform-image.field.convert-command=Opties +transform-image.field.destination-folder=Bestemming + +publish-content.field.publish-channel-id=Publicatiekanaal +publish-content.field.unpublish=Publicatie ongedaan maken +publish-content.field.status-update=Statusupdate +publish-content.field.status-update-channel-id=Statusupdate kanalen + +# Execute Script action form +script.field.script-ref=Script + +# Solr +solr.set.spacesstore=Eigenschappen van hoofdopslag +solr.set.archivestore=Eigenschappen van archiefopslag +solr.field.search.solrTrackingSupport.enabled=Volgen ingeschakeld +solr.help.search.solrTrackingSupport.enabled=Hiermee kan Solr verbinding maken met deze server en updates volgen en indexeren +solr.field.solr.host=Solr-hostnaam +solr.help.field.solr.host=Hostnaam waar uw Solr-server wordt uitgevoerd. Gebruik localhost bij uitvoering op dezelfde computer. +solr.field.solr.port=Solr-poort (niet-SSL) +solr.help.field.solr.port=De (niet-beveiligde) http-poort van de applicatieserver waarop Solr wordt uitgevoerd. Wordt alleen gebruikt als Solr is geconfigureerd voor uitvoering zonder beveiligde communicatie. +solr.field.solr.port.ssl=Solr SSL-poort +solr.help.field.solr.port.ssl=De https-poort van de applicatieserver waarop Solr wordt uitgevoerd. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indexering bezig +solr.field.tracker.alfresco.lag=Indexvertraging (seconden) +solr.field.tracker.alfresco.last.indexed.txn=Laatste ge\u00efndexeerde transactie +solr.field.tracker.alfresco.approx.txns.remaining=Aantal te indexeren transacties (ong.) +solr.field.tracker.alfresco.approx.indexing.time.remaining=Resterende indexeringstijd (ong.) +solr.help.field.tracker.alfresco.lag=Solr-indexen worden op de achtergrond bijgewerkt. Dit is de tijd (in seconden) die deze Solr fulltext-index achterloop bij de repository-updates. +solr.field.tracker.archive.active=Indexering bezig +solr.field.tracker.archive.lag=Indexvertraging (seconden) +solr.field.tracker.archive.last.indexed.txn=Laatste ge\u00efndexeerde transactie +solr.field.tracker.archive.approx.txns.remaining=Aantal te indexeren transacties (ong.) +solr.field.tracker.archive.approx.indexing.time.remaining=Resterende indexeringstijd (ong.) + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Cron-expressie voor back-up +solr.field.solr.backup.alfresco.remoteBackupLocation=Back-uplocatie +solr.field.solr.backup.alfresco.numberToKeep=Te behouden back-ups +solr.help.solr.backup.alfresco.remoteBackupLocation=Volledig pad naar locatie in het bestandssysteem van de Solr-server waar de indexback-up wordt opgeslagen +solr.help.solr.backup.alfresco.numberToKeep=Het aantal te behouden back-ups (inclusief de laatste back-up) +solr.field.solr.backup.archive.cronExpression=Cron-expressie voor back-up +solr.field.solr.backup.archive.remoteBackupLocation=Back-uplocatie +solr.field.solr.backup.archive.numberToKeep=Te behouden back-ups +solr.help.solr.backup.archive.remoteBackupLocation=Volledig pad naar locatie in het bestandssysteem van de Solr-server waar de indexback-up wordt opgeslagen +solr.help.solr.backup.archive.numberToKeep=Het aantal te behouden back-ups (inclusief de laatste back-up) + +# searchmanager +searchmanager.field.sourceBeanName=Zoekservice + +## Tooltips +tooltip.path=Pad: {0} +tooltip.site=Site: {0} + +## Create content +create-content.text=Platte tekst... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Map + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Maand selecteren +calendar.widget_control_config.label_year=Jaar invoeren +calendar.widget_control_config.label_invalid_year=Voer een geldig jaar in + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Koppeling naar: {0} +details.created-by={0} gemaakt door {1} +details.created-in-site=Gemaakt op {0} in {1} +details.editing-started-by=Bewerking gestart op {0} door {1} +details.editing-started-in-site=Bewerking gestart op {0} in {1} +details.modified-by={0} gewijzigd door {1} +details.modified-in-site=Gewijzigd {0} in {1} +details.description.none=Geen beschrijving +details.tags.none=Geen tags +details.categories.none=Geen categorie\u00ebn +details.user.deleted=''{0}'' (verwijderde gebruiker) + +## Social Interactions +# Favourite +favourite.document.add.tip=Document toevoegen aan favorieten +favourite.document.add.label=Favoriet +favourite.document.remove.tip=Documenten verwijderen uit favorieten +favourite.folder.add.tip=Map toevoegen aan favorieten +favourite.folder.add.label=Favoriet +favourite.folder.remove.tip=Map verwijderen uit favorieten +favourite.imap-site.add.tip=Site toevoegen aan IMAP-favorieten +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Site verwijderen uit IMAP-favorieten +favourite.site.add.tip=Site toevoegen aan favorieten +favourite.site.add.label=Favoriet +favourite.site.remove.tip=Site verwijderen uit favorieten +favourite.message.failure=Kan favoriet niet opslaan +# Like +like.document.add.tip=Ik vind dit document leuk +like.document.add.label=Vind ik leuk +like.document.remove.tip=Vind ik niet leuk +like.folder.add.tip=Ik vind deze map leuk +like.folder.add.label=Vind ik leuk +like.folder.remove.tip=Vind ik niet leuk +like.site.add.tip=Ik vind deze site leuk +like.site.add.label=Vind ik leuk +like.site.remove.tip=Vind ik niet leuk +like.message.failure=Kan ''Vind ik leuk'' niet opslaan +# Quickshare +quickshare.link.label=Openbare koppeling +quickshare.link.tooltip=Druk op Ctrl+c om te kopi\u00ebren +quickshare.link.tooltip.mac=Druk op Cmd+c om te kopi\u00ebren +quickshare.view.label=Weergeven +quickshare.unshare.label=Delen ongedaan maken +quickshare.document.shared.label=Gedeeld +quickshare.document.shared.tip=Dit document is gedeeld (klik voor meer opties) +quickshare.document.share.label=Delen +quickshare.document.share.tip=Document delen +quickshare.document.share.failure=Kan document niet delen +quickshare.document.unshared.label=Delen +quickshare.document.unshared.tip=Document delen +quickshare.document.unshare.success=Document is niet meer gedeeld +quickshare.document.unshare.failure=Kan delen van document niet ongedaan maken +quickshare.document.unshare.user.failure=U beschikt niet over de juiste rechten om de actie Delen ongedaan maken uit te voeren. +quickshare.linkshare.label=Delen met +# LinkShare +linkshare.action.email.label=Delen via e-mail +linkshare.action.email.subject=Bestand gedeeld vanuit Alfresco Content Services +linkshare.action.email.body=Bestand {1} gedeeld vanuit Alfresco Content Services, bekijk het hier: {0} +linkshare.action.facebook.label=Delen via Facebook +linkshare.action.facebook.message=Bestand {1} gedeeld vanuit Alfresco Content Services +linkshare.action.twitter.label=Delen via Twitter +linkshare.action.twitter.message=Bestand {1} gedeeld vanuit Alfresco Content Services +linkshare.action.google-plus.label=Delen via Google+ + + +# Comment +comment.document.tip=Opmerkingen over dit document +comment.document.label=Opmerking +comment.folder.tip=Opmerkingen over deze map +comment.folder.label=Opmerking + +#Dashlets +dashlet.help.tooltip=Help voor deze dashlet weergeven +dashlet.rss.tooltip=Abonneren op de RSS-feed voor deze dashlet +dashlet.edit.tooltip=Deze dashlet configureren + +#Module Package Admin page +tool.module-package.label=Modulebrowser +tool.module-package.description=Modulebrowser + +# Category Manager Admin Console +tool.category-manager.label=Categoriebeheer +tool.category-manager.description=Categoriebeheer +tool.category-manager.edit-category=Categorie bewerken +tool.category-manager.edit-category.failure=Kan naam niet bewerken. +tool.category-manager.add-category=Categorie toevoegen +tool.category-manager.add-category.failure=Categorie kan niet worden toegevoegd. +tool.category-manager.label.category-name=Categorienaam: +tool.category-manager.delete-category=Categorie verwijderen +tool.category-manager.delete-category.failure=Categorie kan niet worden verwijderd. +tool.category-manager.message.confirm.delete.title=Categorie verwijderen +tool.category-manager.message.confirm.delete=Weet u zeker dat u wilt verwijderen: {0}? + +# Node browser +tool.node-browser.label=Nodebrowser +tool.node-browser.description=Nodebrowser + +# Label +label.folder=Map +label.document=Document +label.blogpost=Blogbericht +label.forumpost=Forumonderwerp +label.calendarevent=Kalendergebeurtenis +label.wikipage=Wiki-pagina +label.link=Koppeling +label.datalist=Gegevenslijst +label.datalistitem=Gegevenslijstitem +label.unknown=Onbekend +label.download=Downloaden +label.viewinbrowser=Weergeven in browser +label.viewdetails=Details weergeven +label.selectAll=Alles selecteren +label.selectInvert=Selectie omkeren +label.selectNone=Geen +label.selectedItems=Geselecteerde items +label.select=Selecteren +label.restricted-settings=Alfresco Identity Service is ingeschakeld, sommige instellingen zijn beperkt. + +# Path +message.infolderpath=In map + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Openstaande synchronisatie +sync.status.synced={0} gesynchroniseerd, door {1} +sync.status.last-attempt=Laatste synchronisatie {0}, door {1} +sync.status.failed=Synchronisatiepoging {0}, door {1} +sync.status.last-failed=Laatste synchronisatie is mislukt +sync.status.transient-error=Tijdelijke synchronisatiefout +sync.status.transient-error.default-details=De synchronisatie wordt hervat zodra communicatie tussen Alfresco Content Services en de cloud weer mogelijk is. +sync.status.copy.pending=Openstaande synchronisatie voor {2} +sync.status.copy.synced={2} is {0} gesynchroniseerd, door {1} +sync.status.copy.last-attempt={2} is {0} voor het laatst gesynchroniseerd, door {1} +sync.status.copy.failed=synchronisatiepoging voor {2} vond {0} plaats, door {1} +sync.status.copy.last-failed=Laatste synchronisatie van {2} is mislukt +sync.status.show-details=Details weergeven +sync.status.hide-details=Details verbergen +sync.status.title=Synchronisatiegegevens +sync.status.action.more=Meer info +sync.original-document=Origineel document + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=Kan synchronisatiestatus niet weergeven +sync.unable.get.details=Kan nodegegevens niet ophalen + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Verwijder ''{0}'' uit de cloud. +sync.remove.folder.from.cloud=Verwijder ''{0}'' en de inhoud ervan uit de cloud. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Er bestaat al content met dezelfde naam in de doelmap. +sync.folder.not_found=Kan map niet vinden. +sync.node.already_synced=Kan geen content cre\u00ebren: Het is al gesynchroniseerd vanaf een andere locatie. +sync.node.other_sync_set=Deze content is al gesynchroniseerd vanaf een andere locatie. +sync.node.no_longer_exists=Deze content bestaat niet meer bij Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=Deze content bestaat niet meer bij Alfresco Content Services in the Cloud. Klik op Synchronisatie aanvragen om het opnieuw te proberen. +sync.node.unknown=Er is een probleem opgetreden, probeer het opnieuw. +sync.node.unknown.description=Er is een onverwachte fout opgetreden. Oorzaak: {0}. +sync.node.access_denied=Kan de content niet synchroniseren: u heeft geen bevoegdheid om het doelbestand te openen. +sync.node.access_denied_source=Kan de content niet synchroniseren: u heeft geen bevoegdheid om het bronbestand te openen. +sync.node.content_limit_violation=Dit bestand overschrijdt de content-limiet. Het bestand is te groot om de bewerking uit te voeren. +sync.node.quota_limit_violation=U hebt de content-limiet overschreden. Er is niet genoeg vrije ruimte om de bewerking uit te voeren. +sync.node.authentication_error=Kan de content niet naar de cloud synchroniseren: de verificatiegegevens zijn niet geldig. +sync.node.authentication_error.description=Kan de content niet naar de cloud synchroniseren: De verificatiegegevens voor gebruiker {0} zijn niet geldig. +sync.node.owner_not_found=Kan de content niet synchroniseren omdat de eigenaar is verwijderd of gewist. +sync.node.owner_not_found.description=De eigenaar van deze synchronisatie, {0}, bestaat niet meer. Klik op Synchronisatie opheffen. + +sync.communications.error=Kan niet communiceren met extern systeem +sync.communications.error.description=Kan niet communiceren met extern systeem. De synchronisatie wordt automatisch uitgevoerd wanneer de communicatie is hersteld + +# Cloud Sync no network available for sync +sync.message.no.active.network=Er is geen netwerk ingeschakeld voor synchronisatie + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Nieuwe map +sync.new-folder.in-the-cloud.header=Nieuwe mapgegevens +sync.new-folder.creation.success=Map is gemaakt +sync.new-folder.creation.failure=Kan map niet maken + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=Synchronisatie-id +hybridsync.ssd-failed-reason-header-label=Type synchronisatiefout +hybridsync.path-desc-header-label=Locatie origineel item +hybridsync.sync-creator-header-label=Opdrachtgever synchronisatie +hybridsync.cloud-user-header-label=Cloud-gebruiker +hybridsync.remote-tenant-id-header-label=Cloud-netwerk +hybridsync.target-folder-node-ref-header-label=Cloud-bestemming +hybridsync.actions-header-label=Acties + +#Hybrid workflow +hybridworkflow.destination-select.title=Selecteer bestemming voor documenten op cloud +hybridworkflow.set.destination=Bestemming en toegewezen persoon +hybridworkflow.authority.single=Toegewezen persoon +hybridworkflow.authority.multiple=Revisors +hybridworkflow.review.approved=Goedgekeurd +hybridworkflow.review.rejected=Afgewezen +hybridworkflow.destination-select.folderPrefix=Documenten +hybridworkflow.destination.network=Netwerk +hybridworkflow.destination.site=Site +hybridworkflow.destination.folder=Map +hybridworkflow.destination.button=Selecteren + +# Security +security.insecuremimetype=Het mimetype voor de aangevraagde content wordt beschouwd als een beveiligingsrisico en wordt niet weergegeven. + +# Lightbox +lightbox.close=sluiten +lightbox.loading=laden diff --git a/share/src/main/resources/alfresco/messages/slingshot_pt_BR.properties b/share/src/main/resources/alfresco/messages/slingshot_pt_BR.properties new file mode 100644 index 0000000000..73d22bedb1 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_pt_BR.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=Insira os termos da pesquisa... +# header menu items +header.advanced-search.label=Pesquisa avan\u00e7ada... +header.advanced-search.description=Pesquisa avan\u00e7ada... +header.application.label=Aplicativo +header.application.description=Aplicativo +header.change-password.label=Alterar senha +header.change-password.description=Alterar senha +header.groups.label=Grupos +header.groups.description=Grupos +header.tag-management.label=Gerente de marcas +header.tag-management.description=Gerente de marcas +header.help.label=Ajuda +header.help.description=Ajuda +header.logout.label=Logout +header.logout.description=Logout +header.more.label=Mais... +header.more.description=Mais... +header.my.label=Os meus... +header.my.description=Os meus... +header.my-content.label=Meu conte\u00fado +header.my-content.description=Meu conte\u00fado +header.my-dashboard.label=Meu painel +header.my-dashboard.description=Meu painel +header.my-profile.label=Meu perfil +header.my-profile.description=Meu perfil +header.my-sites.label=Meus sites +header.my-sites.description=Meus sites +header.my-tasks.label=Minhas tarefas +header.my-tasks.description=Minhas tarefas +header.my-workflows.label=Fluxos de trabalho que iniciei +header.my-workflows.description=Fluxos de trabalho que iniciei +header.people.label=Pessoas +header.people.description=Pessoas +header.replication-jobs.label=Tarefas de replica\u00e7\u00e3o +header.replication-jobs.description=Tarefas de replica\u00e7\u00e3o +header.repository.label=Reposit\u00f3rio +header.repository.description=Reposit\u00f3rio +header.trashcan.label=Lixeira +header.trashcan.description=Ferramentas de recupera\u00e7\u00e3o e exclus\u00e3o de arquivos +header.saved-searches.label=Pesquisas salvas +header.saved-searches.description=Pesquisas salvas +header.search.description=Op\u00e7\u00f5es de pesquisa... +header.sites.label=Sites +header.sites.description=Sites +header.submit-status.label=Compartilhar +header.submit-status.description=Compartilhar +header.tools.label=Ferramentas... +header.tools.description=Ferramentas administrativas... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=Usu\u00e1rios +header.users.description=Usu\u00e1rios + +## Buttons +button.browse=Navegar +button.edit=Editar +button.save=Salvar +button.savechanges=Salvar altera\u00e7\u00f5es +button.saveandclose=Salvar e fechar +button.upload=Carregar +button.login=Entrar +button.delete=Excluir +button.take-ownership=OK +button.download=Baixar +button.clear=Limpar +button.reset=Redefinir +button.search=Pesquisar +button.update=Atualizar +button.goback=Voltar +button.done=Conclu\u00eddo +button.undo=Desfazer +button.new=Novo +button.create=Criar +button.rename=Renomear +button.refreshPage=Atualizar p\u00e1gina +button.createanother=Criar e Criar outra +button.view.simple=Modo de exibi\u00e7\u00e3o simples +button.view.detailed=Modo de exibi\u00e7\u00e3o detalhada +button.view.gallery=Modo de exibi\u00e7\u00e3o de galeria +button.view.filmstrip=Modo de exibi\u00e7\u00e3o de pel\u00edcula +button.view.table=Modo de exibi\u00e7\u00e3o de tabela +button.view.media-table=Modo de exibi\u00e7\u00e3o de m\u00eddia +button.view.email=Modo de exibi\u00e7\u00e3o de email +button.view.audio=Modo de exibi\u00e7\u00e3o de \u00e1udio +button.view.dublinCore=Modo de exibi\u00e7\u00e3o de Dublin Core +button.view.effectivity=Modo de exibi\u00e7\u00e3o de efetividade + +button.follow=Seguir +button.unfollow=Deixar de seguir +button.unsync=Remover sincroniza\u00e7\u00e3o + +## Messages +message.failure=Falha +message.failure.workflow=O usu\u00e1rio {0} n\u00e3o tem permiss\u00e3o para acessar esta tarefa. +message.loginfailure=Falha de login +message.loginautherror=Seus detalhes de autentica\u00e7\u00e3o n\u00e3o foram reconhecidos ou o Alfresco Content Services n\u00e3o est\u00e1 dispon\u00edvel no momento. +message.passwordchangeauthfailed=Detalhes de autentica\u00e7\u00e3o incorretos ou n\u00e3o autorizados para altera\u00e7\u00e3o da senha. +message.login-portal=Por favor, fa\u00e7a o login por meio do seu portal. +message.unsavedChanges.blog=Sua postagem de blog possui altera\u00e7\u00f5es n\u00e3o salvas. +message.unsavedChanges.comment=Seu coment\u00e1rio ainda n\u00e3o foi salvo. +message.unsavedChanges.discussion=Seu t\u00f3pico de discuss\u00e3o possui altera\u00e7\u00f5es n\u00e3o salvas. +message.unsavedChanges.reply=Sua resposta de t\u00f3pico possui altera\u00e7\u00f5es n\u00e3o salvas. +message.unsavedChanges.wiki=Seu artigo wiki possui altera\u00e7\u00f5es n\u00e3o salvas. +message.searching=Pesquisando... +message.searchingFor=Pesquisando por ''{0}''... +message.minimum-length=Digite pelo menos {0} caractere(s) +message.folders-trimmed=A lista foi limitada a {0} entradas +message.item-missing=O item solicitado n\u00e3o pode ser exibido porque n\u00e3o est\u00e1 mais dispon\u00edvel. +message.save.success=Suas altera\u00e7\u00f5es foram salvas. +message.save.failure=N\u00e3o foi poss\u00edvel salvar suas altera\u00e7\u00f5es. +message.cookiesfailure=Os cookies est\u00e3o desativados +message.cookieserror=Os cookies devem ser ativados no seu navegador. +message.siteRedirect.noPages.manager=Um gerente do site desativou todos os recursos deste site.
Clique no \u00edcone de Configura\u00e7\u00f5es   e selecione Personalizar site para adicionar um ou mais recursos. +message.siteRedirect.noPages.user=Um gerente do site desativou todos os recursos deste site.
Consulte os Membros do Site para encontrar um gerente que possa adicionar recursos. +message.logged-out=Voc\u00ea est\u00e1 desconectado agora. +message.timeout=Tempo limite de servidor. A solicita\u00e7\u00e3o demorou tempo demais para ser conclu\u00edda. Por favor, tente novamente mais tarde. +message.loading=Carregando... +message.viewInCloud.failure=N\u00e3o \u00e9 poss\u00edvel recuperar a URL. Verificar o status da sincroniza\u00e7\u00e3o. +message.logged-out=Voc\u00ea est\u00e1 desconectado agora. + +## Common Text labels and CM model metadata +label.tags=Marcas +label.none=(Nenhum) +label.empty=(Vazio) +label.about=Sobre +label.username=Nome de usu\u00e1rio +label.password=Senha +label.copyright=\u00a9 2005-2023 Alfresco Software Inc. Todos os direitos reservados. +label.name=Nome +label.id=ID +label.title=T\u00edtulo +label.description=Descri\u00e7\u00e3o +label.version=Vers\u00e3o +label.firstname=Nome +label.lastname=Sobrenome +label.jobtitle=Cargo +label.location=Localiza\u00e7\u00e3o +label.bio=Resumo +label.photo=Foto +label.contactinfo=Informa\u00e7\u00f5es de contato +label.skype=Skype +label.im=MSN +label.googleusername=Nome de usu\u00e1rio do Google +label.company=Empresa +label.companyinfo=Detalhes da empresa +label.companyname=Nome +label.companyaddress=Endere\u00e7o +label.companytelephone=Telefone +label.companyfax=Fax +label.companyemail=E-mail +label.companypostcode=CEP +label.email=E-mail +label.telephone=Telefone +label.mobile=Celular +label.fax=Fax +label.address=Endere\u00e7o +label.postcode=CEP +label.groups=Grupos +label.yes=Sim +label.no=N\u00e3o +label.ok=OK +label.loading=Carregando... +label.validating=Validando... +label.validationError=N\u00e3o \u00e9 poss\u00edvel validar as credenciais. +label.site=Site +label.path=Caminho +label.type=Tipo +label.creator=Criador +label.created=Criado +label.modifier=Modificador +label.modified=Modificado +label.author=Autor +label.priority={0} Prioridade +label.size=Tamanho +label.mimetype=Tipo mime +label.mimetype.unknown=Desconhecido +label.popularity=Popularidade +label.avatar=Avatar +label.editType=Editar: {0} +label.moreInfo=Mais informa\u00e7\u00f5es > +label.actions.column.header=A\u00e7\u00f5es +# Dictionary Model +label.modelActive=Ativo +label.modelName=Nome do modelo +label.modelDescription=Descri\u00e7\u00e3o de modelo +# Transfer Targets +label.trx_enabled=Ativado +label.trx_endpointhost=Transferir para o host +label.trx_endpointport=Porta +label.you=voc\u00ea +label.licensedTo=Licenciado para: + +## Location +location.tooltip.path=Caminho: {0} +location.tooltip.site=Site: {0} +location.path.repository=Reposit\u00f3rio +location.path.documents=Documentos +location.path.userHome=Minha p\u00e1gina inicial de usu\u00e1rio +location.path.myfiles=Meus arquivos +location.path.shared=Arquivos compartilhados +location.label.none=(Nenhum) +location.label.local={0} +location.label.site={0} em {1} +location.label.repository={0} + +## EXIF +label.exif.width=Largura +label.exif.height=Altura + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} de {totalRecords} +pagination.template.page-report.more=Exibindo itens {startRecord} - {endRecord} de {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=( {currentPage} de {totalPages} ) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=Tema claro +theme.default=Tema azul +theme.greenTheme=Tema verde +theme.hcBlack=Tema de alto contraste +theme.yellowTheme=Tema amarelo +theme.gdocs=Tema do Google Docs + +## Admin console tools +tool.users.label=Usu\u00e1rios +tool.users.description=Gerenciamento de usu\u00e1rio +tool.groups.label=Grupos +tool.groups.description=Gerenciamento de grupos +tool.application.label=Aplicativo +tool.application.description=Gerenciamento e configura\u00e7\u00f5es de aplicativo +tool.replication-jobs.label=Tarefas de replica\u00e7\u00e3o +tool.replication-jobs.description=Gerenciamento das tarefas de replica\u00e7\u00e3o +tool.repository.label=Ferramentas do reposit\u00f3rio +tool.repository.description=Ferramentas do reposit\u00f3rio +tool.tag-management.label=Gerente de marcas +tool.tag-management.description=Gerente de marcas +tool.workflow.label=Fluxo de Trabalho +tool.workflow.description=Ferramentas de fluxo de trabalho +tool.trashcan.label=Lixeira +tool.trashcan.description=Ferramentas de recupera\u00e7\u00e3o e exclus\u00e3o de arquivos +tool.email-inbound.label=Email (entrada) +tool.email-inbound.description=Email (entrada) +tool.email-outbound.label=Email (sa\u00edda) +tool.email-outbound.description=Email (sa\u00edda) +tool.email-imap.label=Email (IMAP) +tool.email-imap.description=Email (IMAP) +tool.runtime.label=Tempo de execu\u00e7\u00e3o +tool.runtime.description=Tempo de execu\u00e7\u00e3o +tool.repository-server.label=Descritor do reposit\u00f3rio (atual) +tool.repository-server.description=Descritor do reposit\u00f3rio (atual) +tool.repository-installed.label=Descritor do reposit\u00f3rio (instalado originalmente) +tool.repository-installed.description=Descritor do reposit\u00f3rio (instalado originalmente) +tool.authority.label=Autoridade +tool.authority.description=Autoridade +tool.license.label=Descritor da licen\u00e7a +tool.license.description=Descritor da licen\u00e7a +tool.license.link=Gerenciar a minha assinatura +tool.license.usageinfo.label=Informa\u00e7\u00f5es sobre o uso da licen\u00e7a +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=Sistema OpenOffice +tool.openoffice-subsystem.description=Sistema OpenOffice +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=Transformador pdf2swf +tool.transformer-pdf2swf.description=Transformador pdf2swf +tool.transformer-imagemagick.label=Transformador ImageMagick +tool.transformer-imagemagick.description=Transformador ImageMagick +tool.fileservers.label=Servidores de arquivos +tool.fileservers.description=Servidores de arquivos +tool.subscriptions.label=Assinaturas +tool.subscriptions.description=Assinaturas +tool.sysadmin.label=Sysadmin +tool.sysadmin.description=Sysadmin +tool.activities.label=Feed de atividades +tool.activities.description=Feed de atividades +tool.workflow.label=Fluxo de Trabalho +tool.workflow.description=Fluxo de Trabalho +tool.manage-sites.label=Gerente de sites +tool.manage-sites.description=Gerente de sites +tool.cloud-sync-management.label=Gerente de Sincroniza\u00e7\u00e3o de Nuvens +tool.cloud-sync-management.description=Gerente de Sincroniza\u00e7\u00e3o de Nuvens +tool.search-manager.label=Gerente de pesquisa +tool.search-manager.description=Gerente de pesquisa + +## Admin console tool groups +tool.group.usersgroups=Usu\u00e1rios e grupos +tool.group.email=E-mail +tool.group.transformations=Transforma\u00e7\u00f5es +tool.group.filemanagement=Gerenciamento de arquivos +tool.group.subscriptions=Assinaturas +tool.group.repository=Reposit\u00f3rio +tool.group.search=Pesquisar +tool.group.site=Sites + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=Aceitar convite +page.acceptInvite.description=P\u00e1gina de aceita\u00e7\u00e3o de convite. O carregamento desta p\u00e1gina disparar\u00e1 a aceita\u00e7\u00e3o do convite para o site e ativar\u00e1 a conta do usu\u00e1rio, caso ainda esteja desativada +page.addGroups.title=Adicionar grupos +page.addGroups.description=Adicionar grupos +page.add-users.title=Adicionar usu\u00e1rios +page.add-users.description=Adicionar Usu\u00e1rios \u00e0 um site +page.adminConsole.title=Ferramentas +page.adminConsole.description=Console de administra\u00e7\u00e3o e gerenciamento +page.advsearch.title=Pesquisa avan\u00e7ada +page.advsearch.description=Modo de exibi\u00e7\u00e3o de pesquisa avan\u00e7ada +page.blogCreateEdit.title=Blog: criar ou editar postagem de blog +page.blogCreateEdit.description=Exibe um formul\u00e1rio para criar ou editar uma postagem +page.blogPostList.title=Blog +page.blogPostList.description=Exibe as postagens do blog +page.blogPostView.title=Blog: exibir modo de exibi\u00e7\u00e3o de detalhes da postagem +page.blogPostView.description=Exibe o modo de exibi\u00e7\u00e3o de detalhes da postagem +page.calendar.title=Calend\u00e1rio +page.calendar.description=Componente de calend\u00e1rio do site +page.changePassword.title=Alterar senha de usu\u00e1rio +page.changePassword.description=Se\u00e7\u00e3o de altera\u00e7\u00e3o de senha na p\u00e1gina de perfil do usu\u00e1rio +page.contentViewer.title=Visualizador de conte\u00fado +page.contentViewer.description=P\u00e1gina de visualiza\u00e7\u00e3o do conte\u00fado de uma refer\u00eancia de n\u00f3 +page.createContent.title=Criar conte\u00fado +page.createContent.description=Criar conte\u00fado com base em texto +page.createEditReplicationJob.title=Tarefa de replica\u00e7\u00e3o +page.createEditReplicationJob.description=Criar nova tarefa de replica\u00e7\u00e3o ou editar uma existente +page.customiseSite.title=Personalizar site +page.customiseSite.description=Adicionar e remover p\u00e1ginas de um site +page.customiseSiteDashboard.title=Personalizar painel do site +page.customiseSiteDashboard.description=Personalizar layout do painel e dashlets do painel do site +page.customiseUserDashboard.title=Personalizar painel do usu\u00e1rio +page.customiseUserDashboard.description=Personalizar layout do painel e dashlets do painel do usu\u00e1rio +page.data-lists.title=Listas de dados +page.data-lists.description=P\u00e1gina das listas de dados +page.discussionsCreateTopic.title=Discuss\u00f5es: exibir a p\u00e1gina de cria\u00e7\u00e3o de t\u00f3picos +page.discussionsCreateTopic.description=Exibe o formul\u00e1rio para cria\u00e7\u00e3o de t\u00f3picos +page.discussionsTopicList.title=Discuss\u00f5es +page.discussionsTopicList.description=Exibe os t\u00f3picos do f\u00f3rum +page.discussionsTopicView.title=Discuss\u00f5es: exibir modo de exibi\u00e7\u00e3o de detalhes de t\u00f3picos +page.discussionsTopicView.description=Exibe o modo de exibi\u00e7\u00e3o de detalhes de t\u00f3picos +page.documentDetails.title=Detalhes do documento +page.documentDetails.description=Detalhes do documento +page.documentLibrary.title=Biblioteca de documentos +page.documentLibrary.description=Biblioteca de documentos com modo de exibi\u00e7\u00e3o em \u00e1rvore +page.editMetadata.title=Editar propriedades +page.editMetadata.description=Editar propriedades de um n\u00f3 +page.folderDetails.title=Detalhes de pasta +page.folderDetails.description=Detalhes de pasta +page.folderRules.title=Regras de pasta +page.folderRules.description=Regras de pasta +page.geographicMap.title=Exibi\u00e7\u00e3o do Google Maps +page.geographicMap.description=Exibir localiza\u00e7\u00e3o da foto no Google Maps +page.inlineEdit.title=Editar no Alfresco Share +page.inlineEdit.description=Editar arquivos de texto no Alfresco Share +page.invite.title=Convidar +page.invite.description=Convidar +page.links.title=Links +page.links.description=Links +page.linkCreateEdit.title=Links: criar ou editar link +page.linkCreateEdit.description=Exibe um formul\u00e1rio para criar ou editar um link +page.linksView.title=Links: exibir o modo de exibi\u00e7\u00e3o de detalhes dos links +page.linksView.description=Exibe o modo de exibi\u00e7\u00e3o de detalhes dos links +page.login.title=Login +page.logout.title=Logout +page.managePermissions.title=Gerenciar permiss\u00f5es +page.managePermissions.description=Gerenciar permiss\u00f5es +page.myFiles.title=Meus arquivos +page.myFiles.description=Navegar nos meus arquivos +page.myDocumentLibraries.title=Minhas bibliotecas de documentos +page.myDocumentLibraries.description=P\u00e1gina inicial das minhas bibliotecas de documentos +page.myTasks.title=Minhas tarefas +page.myTasks.description=Lista de tarefas ativas e conclu\u00eddas. +page.myWorkflows.title=Fluxos de trabalho que iniciei +page.myWorkflows.description=P\u00e1gina de fluxos de trabalho que iniciei +page.pendingInvites.title=Pendente +page.pendingInvites.description=Convites e solicita\u00e7\u00f5es para ingressar pendentes +page.peopleFinder.title=Localizador de pessoas +page.peopleFinder.description=P\u00e1gina do localizador de pessoas +page.profile.title=P\u00e1gina de Perfil do usu\u00e1rio +page.profile.description=P\u00e1gina de perfil de um usu\u00e1rio +page.rejectInvite.title=Rejeitar convite +page.rejectInvite.description=P\u00e1gina de Rejei\u00e7\u00e3o convite. Rejeita uma solicita\u00e7\u00e3o de convite +page.repository.title=Navegador do reposit\u00f3rio +page.repository.description=Procurar conte\u00fado em todo o reposit\u00f3rio +page.ruleEdit.title=Regras de pasta +page.ruleEdit.description=Criar ou editar a regra de uma pasta. +page.search.title=Pesquisar +page.search.description=Modo de exibi\u00e7\u00e3o de pesquisa +page.sharedFiles.title=Arquivos compartilhados +page.sharedFiles.description=Procurar arquivos compartilhados +page.siteConsole.title=Gerente de sites +page.siteConsole.description=P\u00e1gina do Gerente de sites - ferramentas de administra\u00e7\u00e3o de site +page.siteFinder.title=Localizador de sites +page.siteFinder.description=P\u00e1gina do localizador de sites +page.siteIndex.title=Bem-vindo +page.siteIndex.description=P\u00e1gina inicial de usu\u00e1rios - criar\u00e1 o painel do site do usu\u00e1rio conforme necess\u00e1rio e os encaminhar\u00e1 para ele +page.siteGroups.title=Grupos do site +page.siteGroups.description=Grupos do site +page.siteMembers.title=Membros do site +page.siteMembers.description=Membros do site +page.startWorkflow.title=Iniciar fluxo de trabalho +page.startWorkflow.description=Iniciar um novo fluxo de trabalho +page.taskDetails.title=Detalhes da tarefa +page.taskDetails.description=P\u00e1gina com informa\u00e7\u00f5es detalhadas da tarefa +page.taskEdit.title=Editar tarefa +page.taskEdit.description=P\u00e1gina de edi\u00e7\u00e3o de detalhes da tarefa +page.userContent.title=Conte\u00fado editado pelo usu\u00e1rio +page.userContent.description=Lista o conte\u00fado das \u00faltimas edi\u00e7\u00f5es do usu\u00e1rio +page.userFollowers.title=Seguidores +page.userFollowers.description=Lista as pessoas que seguem o usu\u00e1rio +page.userFollowing.title=Seguindo +page.userFollowing.description=Lista as pessoas que o usu\u00e1rio segue +page.userNotifications.title=Configura\u00e7\u00f5es de notifica\u00e7\u00f5es do usu\u00e1rio +page.userNotifications.description=Se\u00e7\u00e3o de altera\u00e7\u00e3o das configura\u00e7\u00f5es de notifica\u00e7\u00f5es na p\u00e1gina de perfil do usu\u00e1rio +page.userCloudAuth.title=Autentica\u00e7\u00e3o do usu\u00e1rio na nuvem +page.userCloudAuth.description=Alterar detalhes de autentica\u00e7\u00e3o na nuvem +page.userSites.title=Lista de sites do usu\u00e1rio +page.userSites.description=Lista os sites aos quais o usu\u00e1rio pertence +page.userTrashcan.title=Lixeira do usu\u00e1rio +page.userTrashcan.description=Lista de documentos e pastas exclu\u00eddos pelo usu\u00e1rio atual +page.wiki.title=Wiki +page.wiki.description=P\u00e1gina inicial da wiki +page.wikiCreate.title=Formul\u00e1rio de cria\u00e7\u00e3o de wiki +page.wikiCreate.description=Exibe um formul\u00e1rio para criar uma nova p\u00e1gina wiki +page.wikiPage.title=Wiki +page.wikiPage.description=Exibe uma p\u00e1gina wiki +page.workspace.title=Painel do espa\u00e7o de trabalho de documentos +page.workspace.description=P\u00e1gina do painel do espa\u00e7o de trabalho de documentos +page.workflowDetails.title=Detalhes do fluxo de trabalho +page.workflowDetails.description=P\u00e1gina de detalhes do fluxo de trabalho + +## Dashboard page titles and descriptions +page.siteDashboard.title=Painel do site +page.siteDashboard.description=P\u00e1gina do painel do site de colabora\u00e7\u00e3o +page.userDashboard.title=Painel do usu\u00e1rio +page.userDashboard.description=P\u00e1gina Painel do usu\u00e1rio +page.meeting_workspace.title=Painel do espa\u00e7o de trabalho de reuni\u00f5es +page.meeting_workspace.description=P\u00e1gina do painel do espa\u00e7o de trabalho de reuni\u00f5es + +page.error.500.title=Alfresco Share » Erro de Sistema +page.error.500.header=Algo est\u00e1 errado com esta p\u00e1gina... +page.error.500.detail=

N\u00f3s podemos ter encontrado um erro, ou talvez algo tenha sido removido ou deletado, por isso, confira se a URL est\u00e1 correta.

\u00c9 poss\u00edvel, tamb\u00e9m, que voc\u00ea n\u00e3o tenha permiss\u00e3o para visualizar a p\u00e1gina (ela pode fazer parte de um site privado) ou que tenha ocorrido um erro interno. Entre em contato com sua equipe de TI.

Caso voc\u00ea esteja tentando acessar a p\u00e1gina inicial e ela n\u00e3o esteja mais dispon\u00edvel, altere-a clicando em seu nome na barra de ferramentas.

+page.error.500.nav.dashboard=Voltar a Meu Painel +page.error.500.footer=Alfresco Software Inc. © 2005-2023 Todos os direitos reservados. + +## Title bar component titles for pages that use the simple-title component +title.repository=Reposit\u00f3rio +title.browser=Navegador +title.siteFinder=Localizador de sites +title.peopleFinder=Localizador de pessoas +title.myTasks=Minhas tarefas + +## Site Visibility +site.visibility.label.PUBLIC=P\u00fablico +site.visibility.label.MODERATED=Mediado +site.visibility.label.PRIVATE=Privado +site.visibility.description.PUBLIC=Todos em sua organiza\u00e7\u00e3o podem acessar este site. +site.visibility.description.MODERATED=Todos em sua organiza\u00e7\u00e3o podem encontrar este site e pedir acesso. O acesso \u00e9 concedido Gerentes do Site. +site.visibility.description.PRIVATE=Apenas pessoas adicionadas por um Gerente do Site podem achar e usar este site. + +## Roles +role.SiteManager=Gerente +role.SiteManager.description=tem plenos direitos a todo o conte\u00fado - o que eles criaram e que outros criaram. +role.Collaborator=Colaborador +role.Collaborator.description=tem direitos completos ao conte\u00fado que s\u00e3o deles; eles t\u00eam direitos para editar, mas n\u00e3o excluir conte\u00fado criado por outros. +role.SiteCollaborator=Colaborador +role.SiteCollaborator.description=tem direitos completos ao conte\u00fado que s\u00e3o deles; eles t\u00eam direitos para editar, mas n\u00e3o excluir conte\u00fado criado por outros membros do site. +role.Contributor=Contribuidor +role.Contributor.description=tem direitos completos ao conte\u00fado que s\u00e3o deles; eles n\u00e3o podem editar ou excluir conte\u00fado criado por outros. +role.SiteContributor=Contribuidor +role.SiteContributor.description=tem direitos completos ao conte\u00fado que s\u00e3o deles; eles n\u00e3o podem editar ou excluir conte\u00fado criado por outros membros do site. +role.Consumer=Consumidor +role.Consumer.description=tem direitos exclusivos de visualiza\u00e7\u00e3o; eles n\u00e3o podem criar seu pr\u00f3prio conte\u00fado. +role.SiteConsumer=Consumidor +role.SiteConsumer.description=tem direitos exclusivos de visualiza\u00e7\u00e3o em um site; eles n\u00e3o podem criar seu pr\u00f3prio conte\u00fado. +role.Coordinator=Coordenador +role.Coordinator.description=tem plenos direitos a todo o conte\u00fado - o que eles criaram e que outros criaram. +role.Editor=Editor +role.Editor.description=tem direitos para editar as propriedades do arquivo e tirar e repor arquivos; eles n\u00e3o podem criar seu pr\u00f3prio conte\u00fado. + +roles.readassociations=Consumidor + +roles-tooltip.header=Sobre Pap\u00e9is +roles-tooltip.docs-url-label=Ver mais +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=Marcas +taglibrary.populartagslink=Escolha entre marcas populares neste site +taglibrary.msg.failedLoadTags=N\u00e3o foi poss\u00edvel carregar as marcas do servidor (falha na conex\u00e3o?) +taglibrary.msg.unableLoadTags=N\u00e3o foi poss\u00edvel carregar as marcas: {0} +taglibrary.tip.removeTag=Remover marca +taglibrary.tip.help=Separar marcas com espa\u00e7os. Juntar duas ou mais palavras usando "aspas" + +## YUI Editor keys +yuieditor.toolbar.group.font=Estilo da fonte +yuieditor.toolbar.group.lists=Listas +yuieditor.toolbar.group.link=Vincular +yuieditor.toolbar.item.createorderedlist=Criar lista ordenada +yuieditor.toolbar.item.createunorderedlist=Criar lista n\u00e3o ordenada +yuieditor.toolbar.item.fontcolor=Cor da fonte +yuieditor.toolbar.item.backgroundcolor=Cor de fundo +yuieditor.toolbar.item.bold=Negrito CTRL + SHIFT + N +yuieditor.toolbar.item.italic=It\u00e1lico CTRL + SHIFT + I +yuieditor.toolbar.item.underline=Sublinhado CTRL + SHIFT + S +yuieditor.toolbar.item.link=Link HTML CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=Selecionar +menu.select.all=Tudo +menu.select.none=Nenhum +menu.select.invert=Inverter sele\u00e7\u00e3o +menu.select.folders=Pastas +menu.select.documents=Documentos + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=Criar documento a partir do modelo +menu.create-content.by-template-folder=Criar pasta a partir do modelo +menu.selected-items=Itens selecionados... +menu.selected-items.copy=Copiar para... +menu.selected-items.move=Mover para... +menu.selected-items.delete=Excluir +menu.selected-items.download=Baixar como zip +menu.selected-items.assign-workflow=Iniciar o fluxo de trabalho... +menu.selected-items.manage-permissions=Gerir Permiss\u00f5es... +menu.selected-items.deselect-all=Desmarcar tudo +menu.selected-items.cloudSync=Syncronizar para nuvem +menu.selected-items.cloudUnsync=Dessincronizar da nuvem +menu.selected-items.cloudRequestSync=Solicitar sincroniza\u00e7\u00e3o + +## Document Library Actions +actions.document.assign-workflow=Iniciar fluxo de trabalho +actions.document.cancel-editing=Cancelar a edi\u00e7\u00e3o +actions.document.cancel-editing-unlock=Desbloquear documento +actions.document.change-type=Alterar tipo +actions.document.copy-to=Copiar para... +actions.document.delete=Excluir documento +actions.document.download=Baixar +actions.document.download-again=Baixar +actions.document.download-original=Download do original +actions.document.edit-metadata=Editar propriedades +actions.document.edit-offline=Editar offline +actions.document.edit-online=Editar no Microsoft Office\u2122 +message.edit-online.supported_office_version_required=Voc\u00ea est\u00e1 usando uma vers\u00e3o do Microsoft Office que n\u00e3o \u00e9 compat\u00edvel. Tente atualizar o Microsoft Office. O Office 2007 e o 2008 n\u00e3o funcionam com o Google Chrome. +actions.document.extract-metadata=Extrair metadados +actions.document.execute-script=Executar script +actions.document.inline-edit=Editar no Alfresco Share +actions.document.increment-counter=Incrementar contador +actions.document.locate=Localizar arquivo +actions.document.manage-aspects=Gerenciar aspectos +actions.document.manage-permissions=Gerenciar permiss\u00f5es +actions.document.take-ownership=Tornar-se Propriet\u00e1rio +actions.document.move-to=Mover para... +actions.document.simple-approve=Aprovar +actions.document.simple-reject=Rejeitar +actions.document.upload-new-version=Carregar nova vers\u00e3o +actions.document.view=Exibir no navegador +actions.document.view-google-map=Exibir no Google Maps +actions.document.view-original=Exibir documento original +actions.document.view-source-repository=Exibir no reposit\u00f3rio de origem +actions.document.view-working-copy=Exibir c\u00f3pia de trabalho +actions.document.publish=Publicar +actions.document.transform=Transformar +actions.document.transform-image=Transformar em imagem +actions.document.publish-content=Publicar conte\u00fado +actions.document.cloud-sync=Sincronizar com a nuvem +actions.document.cloud-unsync=Dessincronizar da nuvem +actions.document.view-in-cloud=Exibir na nuvem +actions.document.request-sync=Solicitar sincroniza\u00e7\u00e3o +actions.document.unzip-to=Descompactar para... +actions.folder.download=Baixar como zip +actions.folder.change-type=Alterar tipo +actions.folder.copy-to=Copiar para... +actions.folder.delete=Excluir pasta +actions.folder.edit-metadata=Editar propriedades +actions.folder.locate=Localizar pasta +actions.folder.manage-aspects=Gerenciar aspectos +actions.folder.manage-permissions=Gerenciar permiss\u00f5es +actions.folder.take-ownership=Tornar-se Propriet\u00e1rio +actions.folder.move-to=Mover para... +actions.folder.rules=Gerenciar regras +actions.folder.simple-approve=Aprovar +actions.folder.simple-reject=Rejeitar +actions.folder.view-details=Visualizar detalhes +actions.folder.view-source-repository=Exibir no reposit\u00f3rio de origem +actions.folder.cloud-sync=Sincronizar com a nuvem +actions.folder.cloud-unsync=Dessincronizar da nuvem +actions.folder.view-in-cloud=Exibir na nuvem +actions.link.delete=Excluir link +actions.link.locate=Localizar item relacionado +actions.editOnline.failure=N\u00e3o foi poss\u00edvel abrir o arquivo ''{0}'' para edi\u00e7\u00e3o online. Um dos seguintes plugins precisa ser instalado no seu navegador. \n Para Windows: Microsoft Office 2010 \n Para Mac OS X: Plugin SharePoint Browser +actions.editOnline.invalid=N\u00e3o foi poss\u00edvel editar o arquivo ''{0}'' online porque seu caminho cont\u00e9m caracteres n\u00e3o permitidos pelo protocolo SPP.\nOs caracteres inv\u00e1lidos incluem os seguintes: ~ '' # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' est\u00e1 sincronizado e sua exclus\u00e3o remover\u00e1 o documento localmente e da nuvem. +actions.synced.folder.delete=
''{0}'' est\u00e1 sincronizado e sua exclus\u00e3o remover\u00e1 essa pasta e o todo seu conte\u00fado localmente e na nuvem. +actions.synced.remove-sync=
Se o objeto deve ficar na nuvem ao mesmo tempo execute a a\u00e7\u00e3o ''Remover sincroniza\u00e7\u00e3o''. +actions.synced.cloud.document.delete=
''{0}'' est\u00e1 sincronizado e sua exclus\u00e3o remover\u00e1 o documento apenas localmente. +actions.synced.cloud.folder.delete=
''{0}'' est\u00e1 sincronizado e sua exclus\u00e3o remover\u00e1 essa pasta e o todo seu conte\u00fado apenas localmente. +actions.synced.cloud.document.delete.on.prem=
''{0}'' \u00e9 sincronizado e essa exclus\u00e3o vai retirar o documento em premissa, bem como localmente. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' \u00e9 sincronizado e esta elimina\u00e7\u00e3o ir\u00e1 remover desta pasta qualquer conte\u00fado sob ela em premissa, bem como localmente. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=N\u00e3o \u00e9 poss\u00edvel localizar item do link: destino foi apagado. +message.change-type.success=Tipo do documento ''{0}'' foi alterado com sucesso +message.change-type.failure=N\u00e3o foi poss\u00edvel alterar o tipo do documento ''{0}'' +message.confirm.delete=Tem certeza de que deseja excluir ''{0}''? +message.delete.success=''{0}'' foi exclu\u00eddo +message.delete.failure=N\u00e3o foi poss\u00edvel excluir ''{0}'' +message.multiple-delete.please-wait=Aguarde. Arquivos sendo exclu\u00eddos... +message.confirm.take-ownership.title=Tornar-se Propriet\u00e1rio? +message.confirm.take-ownership=Voc\u00ea vai se tornar o propriet\u00e1rio de ''{0}'' e o propriet\u00e1rio anterior pode ter suas permiss\u00f5es restritas. +message.take-ownership.success=Voc\u00ea agora \u00e9 o propriet\u00e1rio de ''{0}'' +message.take-ownership.failure=N\u00e3o foi poss\u00edvel apropriar-se de ''{0}'' +message.details.success=Detalhes atualizados com sucesso +message.details.failure=N\u00e3o foi poss\u00edvel atualizar os detalhes +message.details.failure.name=N\u00e3o foi poss\u00edvel renomear o item. Talvez exista outro item com o mesmo nome. +message.details.failure.more.max.length=Uma das propriedades tem um tamanho maior do que o valor m\u00e1ximo. +message.sync.success=Sincroniza\u00e7\u00e3o criada +message.sync.failure=N\u00e3o foi poss\u00edvel criar a sincroniza\u00e7\u00e3o +message.sync.unavailable=N\u00e3o foi poss\u00edvel conectar-se ao servidor de sincroniza\u00e7\u00e3o. +message.unsync.confirm=Tem certeza de que deseja dessincronizar ''{0}''? +message.unsync.success=Sincroniza\u00e7\u00e3o removida +message.unsync.failure=N\u00e3o foi poss\u00edvel remover a sincroniza\u00e7\u00e3o +message.request.sync.success=Sincroniza\u00e7\u00e3o solicitada com \u00eaxito +message.request.sync.failure=N\u00e3o foi poss\u00edvel solicitar a sincroniza\u00e7\u00e3o +message.error=N\u00e3o foi poss\u00edvel acessar a biblioteca de documentos +message.empty=Sem itens +message.empty.subfolders=Sem itens Clique em ''{0}'' para visualizar {1} subpasta(s) aqui. +message.empty.subfolders.link=Mostrar pastas +message.edit-offline.failure=N\u00e3o \u00e9 poss\u00edvel editar ''{0}''. +message.edit-offline.success=''{0}'' pode ser editado agora +message.edit-offline.success.ie7=Baixar documento utilizando o bot\u00e3o abaixo. +message.edit-online.office.failure=N\u00e3o foi poss\u00edvel iniciar o MS Office. +message.edit-online.office.path.failure=Edi\u00e7\u00e3o online indispon\u00edvel visto que a URL tem mais de 260 caracteres. Use um caminho menos profundo para reduzir o comprimento. +message.edit-online-aos.no_supported_environment=Esse recurso s\u00f3 est\u00e1 dispon\u00edvel no Windows ou Mac OS X. +message.edit-online-aos.starting_office_failed=O Microsoft Office n\u00e3o pode ser aberto. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office bloqueado +message.edit-online-aos.plugin_blocked.body.firefox=Clique na barra de ferramentas do Firefox para continuar. +message.edit-online-aos.plugin_blocked.body.chrome=Clique no indicador bloqueado na barra de endere\u00e7os do Chrome para continuar. +message.edit-online-aos.plugin_blocked.body.safari=Clique em Confi\u00e1vel para continuar. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=Voc\u00ea est\u00e1 usando uma vers\u00e3o do Microsoft Office que n\u00e3o \u00e9 compat\u00edvel. Tente atualizar o Microsoft Office. +message.edit-online-aos.edit_offline_locked.title={0} est\u00e1 editando este arquivo +message.edit-online-aos.edit_offline_locked.message=Todas as altera\u00e7\u00f5es feitas podem ser perdidas. +message.edit-online-aos.edit_offline_locked.confirm=Continuar +message.edit-online-aos.edit_offline_locked.cancel=Cancelar +message.edit-online-aos.edit_locked.title={0} est\u00e1 editando este arquivo +message.edit-online-aos.edit_locked.message=O documento est\u00e1 bloqueado no momento. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=N\u00e3o foi poss\u00edvel desbloquear ''{0}''. +message.edit-cancel.failure=N\u00e3o foi poss\u00edvel cancelar a edi\u00e7\u00e3o de ''{0}''. +message.edit-cancel.success=A edi\u00e7\u00e3o de ''{0}'' foi cancelada. +message.unlock-document.success=A edi\u00e7\u00e3o de ''{0}'' foi cancelada. +message.file-dnd-move.failure=N\u00e3o foi poss\u00edvel mover o documento. +message.increment-counter.success=Contador incrementado +message.increment-counter.failure=O contador n\u00e3o p\u00f4de ser incrementado. +message.extract-metadata.success=Extra\u00e7\u00e3o de metadados realizada com sucesso. +message.extract-metadata.failure=N\u00e3o foi poss\u00edvel extrair metadados. +message.execute-script.success=Script executado com sucesso +message.execute-script.failure=N\u00e3o foi poss\u00edvel executar o script +message.insitu-edit.name.failure=N\u00e3o foi poss\u00edvel renomear o arquivo. Talvez exista outro arquivo com o mesmo nome. +message.loading=Carregando a biblioteca de documentos... +message.simple-workflow.failure=N\u00e3o foi poss\u00edvel concluir a a\u00e7\u00e3o do fluxo de trabalho. +message.simple-workflow.approved=Item marcado como aprovado +message.simple-workflow.rejected=Item marcado como rejeitado +message.simple-workflow.failed=N\u00e3o foi poss\u00edvel concluir a a\u00e7\u00e3o do fluxo de trabalho. +message.transform.success=O documento ''{0}'' foi transformado com sucesso +message.transform.failure=N\u00e3o foi poss\u00edvel transformar o documento +message.transform-image.success=A imagem ''{0}'' foi transformada com sucesso +message.transform-image.failure=N\u00e3o foi poss\u00edvel transformar o documento +message.new-version-upload.success=Carregamento do arquivo com sucesso. A pr\u00e9-visualiza\u00e7\u00e3o pode ainda n\u00e3o mostrar a vers\u00e3o mais recente do documento - voc\u00ea pode atualizar a p\u00e1gina mais tarde para atualiz\u00e1-la. + +message.insitu-edit.tag.failure=N\u00e3o foi poss\u00edvel editar a marca + +## Drag and Drop +message.dnd.allColumnsAreFull=N\u00e3o \u00e9 poss\u00edvel adicionar elementos uma vez que todas as colunas est\u00e3o cheias + +## Data Dictionary +# Aspects +aspect.cm_complianceable=Conformidade +aspect.cm_dublincore=Dublin Core +aspect.cm_effectivity=Efetividade +aspect.cm_emailed=Enviado por email +aspect.cm_generalclassifiable=Classific\u00e1vel +aspect.cm_summarizable=Resum\u00edvel +aspect.cm_taggable=Marc\u00e1vel +aspect.cm_templatable=Model\u00e1vel +aspect.cm_versionable=Version\u00e1vel +aspect.emailserver_aliasable=Apelido de email +aspect.app_inlineeditable=Edit\u00e1vel embutido +aspect.cm_geographic=Geogr\u00e1fico +aspect.exif_exif=EXIF +aspect.exif_resolution=Resolu\u00e7\u00e3o +aspect.exif_camera=Detalhes da c\u00e2mera +aspect.audio_audio=\u00c1udio +aspect.cm_indexControl=Controle de \u00edndice +aspect.dp_restrictable=Restring\u00edvel +aspect.cm_attachable=Anexos + +# Groups +group.everyone=TODOS + +# Types +type.cm_content=Tipo de base de conte\u00fado +type.cm_folder=Tipo de base da pasta +type.trx_transferTarget=Destino de transfer\u00eancia +type.trx_fileTransferTarget=Destino de transfer\u00eancia de arquivo + +# Generic Form labels +form.set.general=Geral +form.set.operations=Opera\u00e7\u00f5es + +# Runtime +runtime.field.FreeMemory=Mem\u00f3ria livre +runtime.field.MaxMemory=Mem\u00f3ria m\u00e1xima +runtime.field.TotalMemory=Mem\u00f3ria total + +# Repository Server +repository-server.set.version=Informa\u00e7\u00f5es de vers\u00e3o +repository-server.field.Name=Nome +repository-server.field.Id=ID +repository-server.field.Edition=Edi\u00e7\u00e3o +repository-server.field.Schema=Esquema +repository-server.field.Version=Vers\u00e3o +repository-server.field.VersionLabel=R\u00f3tulo +repository-server.field.VersionMinor=Secund\u00e1rio +repository-server.field.VersionMajor=Principal +repository-server.field.VersionRevision=Revis\u00e3o +repository-server.field.VersionBuild=Build +repository-server.field.VersionNumber=N\u00famero + +# Repository Installed +repository-installed.set.version=Informa\u00e7\u00f5es de vers\u00e3o +repository-installed.field.Name=Nome +repository-installed.field.Id=ID +repository-installed.field.Edition=Edi\u00e7\u00e3o +repository-installed.field.Schema=Esquema +repository-installed.field.Version=Vers\u00e3o +repository-installed.field.VersionLabel=R\u00f3tulo +repository-installed.field.VersionMinor=Secund\u00e1rio +repository-installed.field.VersionMajor=Principal +repository-installed.field.VersionRevision=Revis\u00e3o +repository-installed.field.VersionBuild=Build +repository-installed.field.VersionNumber=N\u00famero + +# Authority +authority.field.NumberOfGroups=N\u00famero de grupos +authority.field.NumberOfUsers=N\u00famero de usu\u00e1rios + +# License +header.license= +license.field.Subject=Assunto da licen\u00e7a +license.field.Days=Dias +license.field.Holder=Propriet\u00e1rio +license.field.ValidUntil=V\u00e1lido at\u00e9 +license.field.RemainingDays=Dias restantes +license.field.Issued=Emitido +license.field.Issuer=Emissor +license.field.HeartBeatDisabled=Pulsa\u00e7\u00e3o desativada +license.field.LicenseMode=Modo de licen\u00e7a +license.field.CloudSyncKeyAvailable=Chave de sincroniza\u00e7\u00e3o na nuvem dispon\u00edvel +license.field.MaxDocs=M\u00e1ximo de objetos de conte\u00fado +license.field.MaxUsers=M\u00e1ximo de usu\u00e1rios +license.field.Users=Usu\u00e1rios +license.field.Documents=Objetos de conte\u00fado +license.field.Info=Esse valor pode aparecer como zero se sua licen\u00e7a n\u00e3o tiver restri\u00e7\u00e3o quanto ao n\u00famero de usu\u00e1rios. + +# Pdf2Swf +pdf2swf.field.Available=Dispon\u00edvel +pdf2swf.field.VersionString=Vers\u00e3o + +# Open Office +openoffice.field.available=Dispon\u00edvel +openoffice.field.ooName=Nome +openoffice.field.ooOpenSourceContext=Contexto de c\u00f3digo aberto +openoffice.field.ooSetupExtension=Extens\u00e3o +openoffice.field.ooSetupVersion=Vers\u00e3o +openoffice.field.ooSetupVersionAboutBox=Sobre +openoffice.field.ooXMLFileFormatName=Formato de arquivo XML +openoffice.field.ooXMLFileFormatVersion=Vers\u00e3o de formato de arquivo XML +openoffice.error=N\u00e3o \u00e9 poss\u00edvel exibir informa\u00e7\u00f5es sobre o OpenOffice +openoffice.error.404=N\u00e3o foi poss\u00edvel encontrar informa\u00e7\u00f5es sobre o OpenOffice (talvez a propriedade 'ooo.enabled' esteja definida como 'false'?) + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=Ativado +openoffice-subsystem.field.ooo.exe=Exe +openoffice-subsystem.field.ooo.port=Porta + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=Ativado +ooojodconverter.field.jodconverter.maxTasksPerProcess=M\u00e1x. Tarefas por processo +ooojodconverter.field.jodconverter.officeHome=Office Home +ooojodconverter.field.jodconverter.portNumbers=N\u00famero das portas +ooojodconverter.field.jodconverter.taskExecutionTimeout=Tempo limite da execu\u00e7\u00e3o da tarefa +ooojodconverter.field.jodconverter.taskQueueTimeout=Tempo limite da fila de tarefas + +# Transformer ImageMagick +transformer-imagemagick.field.Available=Dispon\u00edvel +transformer-imagemagick.field.VersionString=Informa\u00e7\u00f5es de vers\u00e3o + +# File servers +fileservers.set.filesystem=Sistema de arquivos +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=N\u00edvel de acesso padr\u00e3o +fileservers.field.filesystem.acl.global.domainAccessControls=Controles de acesso do dom\u00ednio +fileservers.field.filesystem.acl.global.protocolAccessControls=Controles de acesso do protocolo +fileservers.field.filesystem.acl.global.userAccessControls=Controles de acesso do usu\u00e1rio +fileservers.field.filesystem.domainMappings=Mapeamentos de dom\u00ednio +fileservers.field.filesystem.name=Nome do sistema de arquivos +fileservers.field.filesystem.name.description=O nome usado pelos sistemas de arquivos quando acessados via CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=WINS Auto Detect ativado +fileservers.field.cifs.WINS.primary=WINS Prim\u00e1rio +fileservers.field.cifs.WINS.secondary=WINS Secund\u00e1rio +fileservers.field.cifs.bindto=Ligar a +fileservers.field.cifs.broadcast=Difundir +fileservers.field.cifs.disableNIO=Desativar NIO +fileservers.field.cifs.disableNativeCode=Desativar c\u00f3digo nativo +fileservers.field.cifs.domain=Dom\u00ednio +fileservers.field.cifs.enabled=CIFS ativado +fileservers.field.cifs.hostannounce=An\u00fancio do host +fileservers.field.cifs.ipv6.enabled=IPV6 ativado +fileservers.field.cifs.netBIOSSMB.datagramPort=Porta do datagrama NetBIOS SMB +fileservers.field.cifs.netBIOSSMB.namePort=Nome da porta NetBIOS SMB +fileservers.field.cifs.netBIOSSMB.sessionPort=Porta de sess\u00e3o NetBIOS SMB +fileservers.field.cifs.serverName=Nome do servidor +fileservers.field.cifs.sessionDebug=Depura\u00e7\u00e3o da sess\u00e3o +fileservers.field.cifs.sessionTimeout=Tempo limite de sess\u00e3o +fileservers.field.cifs.tcpipSMB.port=Porta TCP/IP SMB +fileservers.field.ftp.dataPortFrom=Dataport de +fileservers.field.ftp.dataPortTo=Dataport para +fileservers.field.ftp.enabled=FTP ativado +fileservers.field.ftp.keyStore=Keystore +fileservers.field.ftp.passphrase=Senha +fileservers.field.ftp.port=Porta +fileservers.field.ftp.requireSecureSession=Exigir sess\u00e3o segura +fileservers.field.ftp.sessionDebug=Depura\u00e7\u00e3o da sess\u00e3o +fileservers.field.ftp.sslEngineDebug=Depura\u00e7\u00e3o do mecanismo SSL +fileservers.field.ftp.trustStore=Armazenamento confi\u00e1vel + +# Sysadmin +sysadmin.field.alfresco.context=Contexto do reposit\u00f3rio +sysadmin.field.alfresco.host=Host do reposit\u00f3rio +sysadmin.field.alfresco.port=Porta do reposit\u00f3rio +sysadmin.field.alfresco.protocol=Protocolo do reposit\u00f3rio +sysadmin.field.server.allowedusers=Usu\u00e1rios permitidos +sysadmin.field.server.maxusers=M\u00e1ximo de usu\u00e1rios +sysadmin.field.server.transaction.allow-writes=Permitir grava\u00e7\u00e3o +sysadmin.field.share.context=Contexto do Share +sysadmin.field.share.host=Host do Share +sysadmin.field.share.port=Porta do Share +sysadmin.field.share.protocol=Protocolo do Share + +# Email (Inbound) +email-inbound.set.service=Servi\u00e7o de email de entrada +email-inbound.field.email.inbound.enabled=Servi\u00e7o ativado +email-inbound.field.email.inbound.unknownUser=Usu\u00e1rio desconhecido +email-inbound.set.server=Servidor de email de entrada +email-inbound.field.email.server.allowed.senders=Remetentes permitidos +email-inbound.field.email.server.blocked.senders=Remetentes bloqueados +email-inbound.field.email.server.enabled=Servidor ativado +email-inbound.field.email.server.domain=Dom\u00ednio +email-inbound.field.email.server.port=Porta +email-inbound.field.email.server.connections.max=N\u00famero m\u00e1ximo de conex\u00f5es +email-inbound.set.tls=Seguran\u00e7a da camada de transporte +email-inbound.field.email.server.requireTLS=Requer Seguran\u00e7a da camada de transporte (TLS) +email-inbound.field.email.server.hideTLS=A Seguran\u00e7a da camada de transporte (TLS, Transport Layer Security) n\u00e3o foi retornada pelo EHELO +email-inbound.field.email.server.enableTLS=Aceitar a Seguran\u00e7a da camada de transporte (TLS) + +# Email (Outbound) +email-outbound.set.auth=Autentica\u00e7\u00e3o +email-outbound.set.test-message=Mensagem de teste +email-outbound.field.mail.host=Host +email-outbound.field.mail.port=Porta +email-outbound.field.mail.protocol=Protocolo +email-outbound.field.mail.encoding=Codifica\u00e7\u00e3o +email-outbound.field.mail.from.default=Endere\u00e7o de remetente padr\u00e3o +email-outbound.field.mail.from.enabled=De ativado +email-outbound.field.mail.smtp.auth=Autentica\u00e7\u00e3o SMTP necess\u00e1ria +email-outbound.field.mail.smtps.auth=Autentica\u00e7\u00e3o SMTPS necess\u00e1ria +email-outbound.field.mail.username=Nome de usu\u00e1rio +email-outbound.field.mail.password=Senha +email-outbound.field.mail.testmessage.send=Enviar mensagem de teste na inicializa\u00e7\u00e3o +email-outbound.field.mail.testmessage.to=Para +email-outbound.field.mail.testmessage.subject=Assunto +email-outbound.field.mail.testmessage.text=Mensagem + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=Caminho da pasta inicial +imap.field.imap.config.home.rootPath=Caminho raiz de in\u00edcio +imap.field.imap.config.home.store=Armazenamento inicial +imap.field.imap.server.attachments.extraction.enabled=Extra\u00e7\u00e3o ativada +imap.field.imap.config.ignore.extraction=Ignorar a extra\u00e7\u00e3o +imap.field.imap.config.server.mountPoints=Pontos de montagem +imap.field.imap.mail.from.default=Correio do padr\u00e3o +imap.field.imap.mail.to.default=Correio para o padr\u00e3o +imap.field.imap.server.enabled=Ativado +imap.field.imap.server.host=Host +imap.field.imap.server.port=Porta + +# Activities Feed +activities.set.activities=Feed de atividades +activities.field.feed.notifier.enabled=Notifica\u00e7\u00e3o de feed ativada +activities.field.feed.notifier.repeatIntervalMins=Intervalo de repeti\u00e7\u00e3o (min) +activities.field.feed.max.ageMins=Idade m\u00e1xima (min) +activities.field.feed.max.size=Tamanho m\u00e1ximo + +# Subscriptions +subscriptions.field.subscriptions.enabled=Ativado + +# Workflow +workflow.field.message=Mensagem +workflow.field.comment=Coment\u00e1rio +workflow.field.assign_to=Atribuir a +workflow.field.review_group=Grupo de revis\u00e3o +workflow.field.reviewer=Revisor +workflow.field.reviewers=Revisores +workflow.field.due=Prazo +workflow.field.priority=Prioridade +workflow.field.outcome=Resultado +workflow.field.enabled.activiti=Ativado +workflow.field.enabled.jbpm=Ativado +workflow.field.definitions.visible=Defini\u00e7\u00f5es vis\u00edveis +workflow.field.number.tasks=N\u00famero de tarefas +workflow.field.number.definitions=N\u00famero de defini\u00e7\u00f5es +workflow.field.number.workflows=N\u00famero de fluxos de trabalho +workflow.field.requiredApprovePercent=Porcentagem de aprova\u00e7\u00e3o obrigat\u00f3ria +workflow.set.general=Geral +workflow.set.assignee=Destinat\u00e1rio +workflow.set.assignees=Destinat\u00e1rios +workflow.set.information=Informa\u00e7\u00e3o +workflow.set.items=Itens +workflow.set.outcome=Resultado +workflow.set.other=Outras op\u00e7\u00f5es +workflow.set.task.info=Informa\u00e7\u00f5es +workflow.set.workflow.more_info=Mais informa\u00e7\u00f5es +workflow.set.task.progress=Progresso +workflow.set.response=Resposta +workflow.set.engine.activiti=Mecanismo Activiti +workflow.set.engine.jbpm=Mecanismo JBPM +workflow.task.error=Falha ao carregar tarefa. +workflow.task.error.404=A tarefa n'ao existe ou foi cancelada. +workflow.task.invite.title=Site {0} +workflow.task.invite.subtitle=Voc\u00ea foi convidado para ingressar no site {0}. +workflow.task.invite.role=Sua fun\u00e7\u00e3o ser\u00e1 de {0}. +workflow.task.invite.accepted={0} {1} aceitou seu convite para ingressar no site {2}. +workflow.task.invite.rejected={0} {1} rejeitou seu convite para ingressar no site {2}. +workflow.task.request.invite.title=O usu\u00e1rio {0} pediu para ingressar no site {1}. +workflow.cancel.title=Cancelar fluxo de trabalho +workflow.cancel.label=Tem certeza de que deseja cancelar o fluxo de trabalho? +workflow.cancel.feedback=Cancelando o fluxo de trabalho... +workflow.cancel.success=O fluxo de trabalho foi cancelado com sucesso +workflow.cancel.failure=Falha ao cancelar o fluxo de trabalho +workflow.delete.title=Excluir o fluxo de trabalho +workflow.delete.label=Tem certeza de que deseja excluir o fluxo de trabalho? +workflow.delete.feedback=Excluindo o fluxo de trabalho... +workflow.delete.success=Fluxo de trabalho exclu\u00eddo com sucesso +workflow.delete.failure=Falha ao excluir o fluxo de trabalho +workflow.no_message=(Sem mensagens) +tool.workflow.activiti.tools=Ferramentas Activiti +tool.workflow.activiti.admin.link=Console de fluxo de trabalho do Activiti + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=Gerente de pesquisa +tool.searchmanager.description=Gerente de pesquisa + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=Ativado +lucene.field.dir.indexes=Diret\u00f3rio do \u00edndice +lucene.field.index.recovery.mode=Modo de recupera\u00e7\u00e3o do \u00edndice +lucene.field.lucene.indexer.contentIndexingEnabled=Indexa\u00e7\u00e3o de conte\u00fado ativada +lucene.field.index.tracking.disableInTransactionIndexing=Desativar indexa\u00e7\u00e3o em transa\u00e7\u00e3o + +lucene.set.backup=Backup +lucene.backup.field.dir.indexes.backup=Diret\u00f3rio de backup de \u00edndice +lucene.backup.field.index.backup.cronExpression=Express\u00e3o Cron de backup + +lucene.set.advanced=Avan\u00e7ado +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=Indexa\u00e7\u00e3o de conte\u00fado ativada +lucene.advanced.field.fts.indexer.batchSize=Tamanho do lote de indexa\u00e7\u00e3o +lucene.advanced.field.lucene.maxAtomicTransformationTime=M\u00e1x. Tempo de transforma\u00e7\u00e3o at\u00f4mica +lucene.advanced.field.index.reindexMissingContent.cronExpression=Falta express\u00e3o Cron de conte\u00fado +lucene.advanced.field.indexer.maxFieldLength=N\u00famero m\u00e1ximo de tokens indexados por documento +lucene.field.indexer.mergerMaxMergeDocs=N\u00famero m\u00e1ximo de documentos de mesclagem +lucene.field.indexer.mergerMergeFactor=Fator m\u00e1ximo de mesclagem + +# Transform action form +transform.field.mime-type=Formato exigido +transform.field.destination-folder=Destino + +# Transform Image action form +transform-image.field.mime-type=Formato exigido +transform-image.field.convert-command=Op\u00e7\u00f5es +transform-image.field.destination-folder=Destino + +publish-content.field.publish-channel-id=Canal de publica\u00e7\u00e3o +publish-content.field.unpublish=Cancelar publica\u00e7\u00e3o +publish-content.field.status-update=Atualiza\u00e7\u00e3o de status +publish-content.field.status-update-channel-id=Canais de atualiza\u00e7\u00e3o de status + +# Execute Script action form +script.field.script-ref=Script + +# Solr +solr.set.spacesstore=Propriedades de armazenamento principal +solr.set.archivestore=Propriedades de armazenamento de arquivamento +solr.field.search.solrTrackingSupport.enabled=Rastreamento ativado +solr.help.search.solrTrackingSupport.enabled=Ativar para permitir que Solr se conecte a esse servidor, rastreie e indexe atualiza\u00e7\u00f5es +solr.field.solr.host=Nome do host Solr +solr.help.field.solr.host=Nome do host em que seu servidor Solr est\u00e1 em execu\u00e7\u00e3o. Use host local se estiver em execu\u00e7\u00e3o na mesma m\u00e1quina. +solr.field.solr.port=Porta Solr (n\u00e3o SSL) +solr.help.field.solr.port=A porta https (n\u00e3o segura) do servidor de aplicativo no qual Solr est\u00e1 em execu\u00e7\u00e3o. Usado apenas se Solr estiver configurado para execu\u00e7\u00e3o sem comunica\u00e7\u00f5es seguras. +solr.field.solr.port.ssl=Porta Solr SSL +solr.help.field.solr.port.ssl=A porta https do servidor de aplicativo no qual Solr est\u00e1 em execu\u00e7\u00e3o. + +# Tracker Properties +solr.field.tracker.alfresco.active=Indexa\u00e7\u00e3o em andamento +solr.field.tracker.alfresco.lag=Atraso de \u00edndice (segundos) +solr.field.tracker.alfresco.last.indexed.txn=\u00daltima transa\u00e7\u00e3o indexada +solr.field.tracker.alfresco.approx.txns.remaining=Transa\u00e7\u00f5es aproximadas a indexar +solr.field.tracker.alfresco.approx.indexing.time.remaining=Tempo restante aproximado da indexa\u00e7\u00e3o +solr.help.field.tracker.alfresco.lag=Os \u00edndices Solr s\u00e3o atualizados em segundo plano. Esse \u00e9 o tempo (em segundos) que esse \u00edndice de texto completo Solr est\u00e1 atrasado atualmente em rela\u00e7\u00e3o \u00e0s atualiza\u00e7\u00f5es do reposit\u00f3rio. +solr.field.tracker.archive.active=Indexa\u00e7\u00e3o em andamento +solr.field.tracker.archive.lag=Atraso de \u00edndice (segundos) +solr.field.tracker.archive.last.indexed.txn=\u00daltima transa\u00e7\u00e3o indexada +solr.field.tracker.archive.approx.txns.remaining=Transa\u00e7\u00f5es aproximadas a indexar +solr.field.tracker.archive.approx.indexing.time.remaining=Tempo restante aproximado da indexa\u00e7\u00e3o + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=Express\u00e3o Cron de backup +solr.field.solr.backup.alfresco.remoteBackupLocation=Localiza\u00e7\u00e3o do backup +solr.field.solr.backup.alfresco.numberToKeep=Backups a manter +solr.help.solr.backup.alfresco.remoteBackupLocation=Caminho completo para a localiza\u00e7\u00e3o do sistema de arquivos do servidor Solr para armazenamento do backup de \u00edndice +solr.help.solr.backup.alfresco.numberToKeep=O n\u00famero de backups a manter (incluindo o backup mais recente) +solr.field.solr.backup.archive.cronExpression=Express\u00e3o Cron de backup +solr.field.solr.backup.archive.remoteBackupLocation=Localiza\u00e7\u00e3o do backup +solr.field.solr.backup.archive.numberToKeep=Backups a manter +solr.help.solr.backup.archive.remoteBackupLocation=Caminho completo para a localiza\u00e7\u00e3o do sistema de arquivos do servidor Solr para armazenamento do backup de \u00edndice +solr.help.solr.backup.archive.numberToKeep=O n\u00famero de backups a manter (incluindo o backup mais recente) + +# searchmanager +searchmanager.field.sourceBeanName=Servi\u00e7o de pesquisa + +## Tooltips +tooltip.path=Caminho: {0} +tooltip.site=Site: {0} + +## Create content +create-content.text=Texto simples... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=Pasta + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=Escolha o m\u00eas +calendar.widget_control_config.label_year=Digite o ano +calendar.widget_control_config.label_invalid_year=Digite um ano v\u00e1lido + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=Link para: {0} +details.created-by=Criado {0} por {1} +details.created-in-site=Criado {0} em {1} +details.editing-started-by=Edi\u00e7\u00e3o iniciada em {0} por {1} +details.editing-started-in-site=Edi\u00e7\u00e3o iniciada {0} em {1} +details.modified-by=Modificado {0} por {1} +details.modified-in-site=Modificado {0} em {1} +details.description.none=Sem descri\u00e7\u00e3o +details.tags.none=Sem marcas +details.categories.none=Sem categorias +details.user.deleted=''{0}'' (usu\u00e1rio exclu\u00eddo) + +## Social Interactions +# Favourite +favourite.document.add.tip=Adicionar documento aos favoritos +favourite.document.add.label=Favorito +favourite.document.remove.tip=Remover documento dos favoritos +favourite.folder.add.tip=Adicionar pasta aos favoritos +favourite.folder.add.label=Favorito +favourite.folder.remove.tip=Remover pasta dos favoritos +favourite.imap-site.add.tip=Adicionar site aos favoritos em IMAP +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=Remover site dos favoritos em IMAP +favourite.site.add.tip=Adicionar site aos favoritos +favourite.site.add.label=Favorito +favourite.site.remove.tip=Remover site dos favoritos +favourite.message.failure=Falha ao salvar favorito +# Like +like.document.add.tip=Curtir este documento +like.document.add.label=Curtir +like.document.remove.tip=N\u00e3o curtir +like.folder.add.tip=Curtir esta pasta +like.folder.add.label=Curtir +like.folder.remove.tip=N\u00e3o curtir +like.site.add.tip=Curtir este site +like.site.add.label=Curtir +like.site.remove.tip=N\u00e3o curtir +like.message.failure=Falha ao salvar o ''Curtir'' +# Quickshare +quickshare.link.label=Link p\u00fablico +quickshare.link.tooltip=Pressione ctrl-c para copiar +quickshare.link.tooltip.mac=Pressione cmd-c para copiar +quickshare.view.label=Exibir +quickshare.unshare.label=Descompartilhar +quickshare.document.shared.label=Compartilhado +quickshare.document.shared.tip=Este documento \u00e9 compartilhado (clique para ver mais op\u00e7\u00f5es) +quickshare.document.share.label=Compartilhar +quickshare.document.share.tip=Compartilhar documento +quickshare.document.share.failure=O documento n\u00e3o p\u00f4de ser compartilhado +quickshare.document.unshared.label=Compartilhar +quickshare.document.unshared.tip=Compartilhar documento +quickshare.document.unshare.success=O documento n\u00e3o est\u00e1 mais compartilhado +quickshare.document.unshare.failure=O documento n\u00e3o p\u00f4de ser descompartilhado +quickshare.document.unshare.user.failure=Voc\u00ea n\u00e3o tem as autoriza\u00e7\u00f5es apropriadas para executar a a\u00e7\u00e3o de Descompartilhar. +quickshare.linkshare.label=Compartilhar com +# LinkShare +linkshare.action.email.label=Compartilhar por email +linkshare.action.email.subject=Arquivo compartilhado a partir do Alfresco Content Services +linkshare.action.email.body=Arquivo {1} compartilhado a partir de Alfresco Content Services. Visualize-o aqui: {0} +linkshare.action.facebook.label=Compartilhar usando o Facebook +linkshare.action.facebook.message=Arquivo {1} compartilhado a partir do Alfresco Content Services +linkshare.action.twitter.label=Compartilhar usando o Twitter +linkshare.action.twitter.message=Arquivo {1} compartilhado a partir do Alfresco Content Services +linkshare.action.google-plus.label=Compartilhar usando o Google + + + +# Comment +comment.document.tip=Comentar sobre este documento +comment.document.label=Coment\u00e1rio +comment.folder.tip=Comentar sobre esta pasta +comment.folder.label=Coment\u00e1rio + +#Dashlets +dashlet.help.tooltip=Exibir a ajuda deste dashlet +dashlet.rss.tooltip=Assinar o feed de RSS desse dashlet +dashlet.edit.tooltip=Configurar esse dashlet + +#Module Package Admin page +tool.module-package.label=Navegador de m\u00f3dulos +tool.module-package.description=Navegador de m\u00f3dulos + +# Category Manager Admin Console +tool.category-manager.label=Gerente de categoria +tool.category-manager.description=Gerente de categoria +tool.category-manager.edit-category=Editar categoria +tool.category-manager.edit-category.failure=N\u00e3o \u00e9 poss\u00edvel editar o nome. +tool.category-manager.add-category=Adicionar categoria +tool.category-manager.add-category.failure=N\u00e3o foi poss\u00edvel adicionar a categoria. +tool.category-manager.label.category-name=Nome da categoria: +tool.category-manager.delete-category=Excluir categoria +tool.category-manager.delete-category.failure=N\u00e3o foi poss\u00edvel excluir a categoria. +tool.category-manager.message.confirm.delete.title=Excluir categoria +tool.category-manager.message.confirm.delete=Tem certeza de que deseja excluir: {0}? + +# Node browser +tool.node-browser.label=Navegador de n\u00f3s +tool.node-browser.description=Navegador de n\u00f3s + +# Label +label.folder=Pasta +label.document=Documento +label.blogpost=Postagem de blog +label.forumpost=T\u00f3pico do f\u00f3rum +label.calendarevent=Evento do calend\u00e1rio +label.wikipage=P\u00e1gina Wiki +label.link=Vincular +label.datalist=Lista de dados +label.datalistitem=Item da lista de dados +label.unknown=Desconhecido +label.download=Baixar +label.viewinbrowser=Exibir no navegador +label.viewdetails=Visualizar detalhes +label.selectAll=Selecionar tudo +label.selectInvert=Inverter sele\u00e7\u00e3o +label.selectNone=Nenhum +label.selectedItems=Itens selecionados +label.select=Selecionar +label.restricted-settings=Alfresco Identity Service est\u00e1 ativado. Algumas configura\u00e7\u00f5es est\u00e3o restritas. + +# Path +message.infolderpath=Na pasta + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=Sincroniza\u00e7\u00e3o pendente +sync.status.synced={0} sincronizado por {1} +sync.status.last-attempt=\u00daltima sincroniza\u00e7\u00e3o bem-sucedida {0}, por {1} +sync.status.failed=Tentativa de sincroniza\u00e7\u00e3o {0}, por {1} +sync.status.last-failed=\u00daltima falha de sincroniza\u00e7\u00e3o +sync.status.transient-error=Erro de sincroniza\u00e7\u00e3o tempor\u00e1rio +sync.status.transient-error.default-details=A sincroniza\u00e7\u00e3o ser\u00e1 retomada assim que o Alfresco Content Services conseguir se comunicar com a nuvem novamente. +sync.status.copy.pending=Sincroniza\u00e7\u00e3o pendente em {2} +sync.status.copy.synced={2} sincronizado {0}, por {1} +sync.status.copy.last-attempt={2} \u00faltima sincroniza\u00e7\u00e3o bem-sucedida {0}, por {1} +sync.status.copy.failed=tentativa de sincroniza\u00e7\u00e3o em {2} {0}, por {1} +sync.status.copy.last-failed=Falha da \u00faltima sincroniza\u00e7\u00e3o de {2} +sync.status.show-details=Mostrar detalhes +sync.status.hide-details=Ocultar detalhes +sync.status.title=Informa\u00e7\u00f5es de sincroniza\u00e7\u00e3o +sync.status.action.more=Mais informa\u00e7\u00f5es +sync.original-document=Documento original + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=N\u00e3o \u00e9 poss\u00edvel exibir o status de sincroniza\u00e7\u00e3o +sync.unable.get.details=N\u00e3o \u00e9 poss\u00edvel obter detalhes do n\u00f3 + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=Remover ''{0}'' da nuvem. +sync.remove.folder.from.cloud=Remover ''{0}'' da nuvem, e qualquer conte\u00fado abaixo dele. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=Conte\u00fado com o mesmo nome j\u00e1 existe na pasta de destino. +sync.folder.not_found=N\u00e3o \u00e9 poss\u00edvel localizar a pasta. +sync.node.already_synced=N\u00e3o \u00e9 poss\u00edvel criar conte\u00fado: j\u00e1 foi sincronizado a partir de outra localiza\u00e7\u00e3o. +sync.node.other_sync_set=Este conte\u00fado j\u00e1 foi sincronizado a partir de outra localiza\u00e7\u00e3o. +sync.node.no_longer_exists=Esse conte\u00fado n\u00e3o existe mais no Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=Esse conte\u00fado n\u00e3o existe mais no Alfresco Content Services in the Cloud. Clique em Solicitar sincroniza\u00e7\u00e3o para tentar novamente. +sync.node.unknown=Encontramos um problema. Tente novamente. +sync.node.unknown.description=Ocorreu um erro inesperado. Causa: {0}. +sync.node.access_denied=N\u00e3o \u00e9 poss\u00edvel sincronizar o conte\u00fado: voc\u00ea n\u00e3o tem permiss\u00e3o para acessar o arquivo de destino. +sync.node.access_denied_source=N\u00e3o \u00e9 poss\u00edvel sincronizar o conte\u00fado: voc\u00ea n\u00e3o tem permiss\u00e3o para acessar o arquivo de origem. +sync.node.content_limit_violation=Esse arquivo ultrapassa o limite de conte\u00fado. O arquivo \u00e9 muito grande para executar a a\u00e7\u00e3o. +sync.node.quota_limit_violation=Voc\u00ea ultrapassou a cota de conte\u00fado. N\u00e3o h\u00e1 espa\u00e7o livre suficiente para executar a a\u00e7\u00e3o. +sync.node.authentication_error=N\u00e3o \u00e9 poss\u00edvel sincronizar o conte\u00fado com a nuvem: os detalhes de autentica\u00e7\u00e3o n\u00e3o s\u00e3o v\u00e1lidos. +sync.node.authentication_error.description=N\u00e3o \u00e9 poss\u00edvel sincronizar o conte\u00fado com a nuvem: os detalhes de autentica\u00e7\u00e3o do usu\u00e1rio {0} n\u00e3o s\u00e3o v\u00e1lidos. +sync.node.owner_not_found=N\u00e3o conseguimos sincronizar o conte\u00fado porque o propriet\u00e1rio foi removido ou deletado. +sync.node.owner_not_found.description=O usu\u00e1rio que possui esta sincroniza\u00e7\u00e3o, {0}, n\u00e3o existe mais. Clique em Dessincronizar. + +sync.communications.error=N\u00e3o \u00e9 poss\u00edvel se comunicar com o sistema remoto +sync.communications.error.description=N\u00e3o \u00e9 poss\u00edvel se comunicar com o sistema remoto. A sincroniza\u00e7\u00e3o funcionar\u00e1 automaticamente quando as comunica\u00e7\u00f5es voltarem a funcionar + +# Cloud Sync no network available for sync +sync.message.no.active.network=N\u00e3o h\u00e1 rede ativada para sincroniza\u00e7\u00e3o + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=Nova pasta +sync.new-folder.in-the-cloud.header=Detalhes da nova pasta +sync.new-folder.creation.success=Pasta criada com sucesso +sync.new-folder.creation.failure=N\u00e3o foi poss\u00edvel criar pasta + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=ID de Sincroniza\u00e7\u00e3o +hybridsync.ssd-failed-reason-header-label=Tipo de Falha na Sincroniza\u00e7\u00e3o +hybridsync.path-desc-header-label=Localiza\u00e7\u00e3o de Item Original +hybridsync.sync-creator-header-label=Criador de Sincroniza\u00e7\u00e3o +hybridsync.cloud-user-header-label=Usu\u00e1rio de Nuvem +hybridsync.remote-tenant-id-header-label=Rede de Nuvem +hybridsync.target-folder-node-ref-header-label=Destino de Nuvem +hybridsync.actions-header-label=A\u00e7\u00f5es + +#Hybrid workflow +hybridworkflow.destination-select.title=Selecione o destino dos documentos na nuvem +hybridworkflow.set.destination=Destino e destinat\u00e1rio +hybridworkflow.authority.single=Destinat\u00e1rio +hybridworkflow.authority.multiple=Revisores +hybridworkflow.review.approved=Aprovado +hybridworkflow.review.rejected=Rejeitado +hybridworkflow.destination-select.folderPrefix=Documentos +hybridworkflow.destination.network=Rede +hybridworkflow.destination.site=Site +hybridworkflow.destination.folder=Pasta +hybridworkflow.destination.button=Selecionar + +# Security +security.insecuremimetype=O tipo MIME do conte\u00fado solicitado \u00e9 considerado um risco de seguran\u00e7a e n\u00e3o ser\u00e1 exibido. + +# Lightbox +lightbox.close=fechar +lightbox.loading=carregando diff --git a/share/src/main/resources/alfresco/messages/slingshot_ru.properties b/share/src/main/resources/alfresco/messages/slingshot_ru.properties new file mode 100755 index 0000000000..473affc88c --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_ru.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430... +# header menu items +header.advanced-search.label=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a... +header.advanced-search.description=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a... +header.application.label=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +header.application.description=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +header.change-password.label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c +header.change-password.description=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c +header.groups.label=\u0413\u0440\u0443\u043f\u043f\u044b +header.groups.description=\u0413\u0440\u0443\u043f\u043f\u044b +header.tag-management.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 +header.tag-management.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 +header.help.label=\u0421\u043f\u0440\u0430\u0432\u043a\u0430 +header.help.description=\u0421\u043f\u0440\u0430\u0432\u043a\u0430 +header.logout.label=\u0412\u044b\u0445\u043e\u0434 +header.logout.description=\u0412\u044b\u0445\u043e\u0434 +header.more.label=\u0415\u0449\u0435... +header.more.description=\u0415\u0449\u0435... +header.my.label=\u041c\u043e\u0438... +header.my.description=\u041c\u043e\u0438... +header.my-content.label=\u041c\u043e\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b +header.my-content.description=\u041c\u043e\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b +header.my-dashboard.label=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 +header.my-dashboard.description=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 +header.my-profile.label=\u041c\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c +header.my-profile.description=\u041c\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c +header.my-sites.label=\u041c\u043e\u0438 \u0441\u0430\u0439\u0442\u044b +header.my-sites.description=\u041c\u043e\u0438 \u0441\u0430\u0439\u0442\u044b +header.my-tasks.label=\u041c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 +header.my-tasks.description=\u041c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 +header.my-workflows.label=\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b +header.my-workflows.description=\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b +header.people.label=\u041b\u044e\u0434\u0438 +header.people.description=\u041b\u044e\u0434\u0438 +header.replication-jobs.label=\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +header.replication-jobs.description=\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +header.repository.label=\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +header.repository.description=\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +header.trashcan.label=\u041a\u043e\u0440\u0437\u0438\u043d\u0430 +header.trashcan.description=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 +header.saved-searches.label=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0438\u0441\u043a\u0438 +header.saved-searches.description=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0438\u0441\u043a\u0438 +header.search.description=\u041e\u043f\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430... +header.sites.label=\u0421\u0430\u0439\u0442\u044b +header.sites.description=\u0421\u0430\u0439\u0442\u044b +header.submit-status.label=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f +header.submit-status.description=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f +header.tools.label=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430... +header.tools.description=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +header.users.description=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 + +## Buttons +button.browse=\u041e\u0431\u0437\u043e\u0440 +button.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +button.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +button.savechanges=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f +button.saveandclose=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c +button.upload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c +button.login=\u0412\u0445\u043e\u0434 +button.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +button.take-ownership=OK +button.download=\u0421\u043a\u0430\u0447\u0430\u0442\u044c +button.clear=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c +button.reset=\u0421\u0431\u0440\u043e\u0441 +button.search=\u041f\u043e\u0438\u0441\u043a +button.update=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c +button.goback=\u041d\u0430\u0437\u0430\u0434 +button.done=\u0413\u043e\u0442\u043e\u0432\u043e +button.undo=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c +button.new=\u041d\u043e\u0432\u044b\u0439 +button.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c +button.rename=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c +button.refreshPage=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 +button.createanother=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 +button.view.simple=\u041a\u0440\u0430\u0442\u043a\u043e +button.view.detailed=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e +button.view.gallery=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0433\u0430\u043b\u0435\u0440\u0435\u0438 +button.view.filmstrip=\u0414\u0438\u0430\u0444\u0438\u043b\u044c\u043c +button.view.table=\u0422\u0430\u0431\u043b\u0438\u0446\u0430 +button.view.media-table=\u041c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 +button.view.email=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 +button.view.audio=\u0410\u0443\u0434\u0438\u043e +button.view.dublinCore=\u0414\u0443\u0431\u043b\u0438\u043d\u0441\u043a\u043e\u0435 \u044f\u0434\u0440\u043e +button.view.effectivity=\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c + +button.follow=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f +button.unfollow=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 +button.unsync=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e + +## Messages +message.failure=\u0421\u0431\u043e\u0439 +message.failure.workflow=\u0423 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {0} \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435. +message.loginfailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 +message.loginautherror=\u0412\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b \u0438\u043b\u0438 Alfresco Content Services \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. +message.passwordchangeauthfailed=\u0412\u044b \u0432\u0432\u0435\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044f. +message.login-portal=\u0412\u043e\u0439\u0434\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u0442\u0430\u043b. +message.unsavedChanges.blog=\u0412 \u0432\u0430\u0448\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. +message.unsavedChanges.comment=\u0412\u0430\u0448 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d. +message.unsavedChanges.discussion=\u0412 \u0432\u0430\u0448\u0435\u0439 \u0442\u0435\u043c\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. +message.unsavedChanges.reply=\u0412 \u0432\u0430\u0448\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. +message.unsavedChanges.wiki=\u0412 \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. +message.searching=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a... +message.searchingFor=\u041f\u043e\u0438\u0441\u043a ''{0}''... +message.minimum-length=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 {0} \u0441\u0438\u043c\u0432 +message.folders-trimmed=\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d {0} \u0441\u0438\u043c\u0432 +message.item-missing=\u0417\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. +message.save.success=\u0412\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b. +message.save.failure=\u0412\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c. +message.cookiesfailure=\u0424\u0430\u0439\u043b\u044b cookie \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b +message.cookieserror=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u044b cookie \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. +message.siteRedirect.noPages.manager=\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430.
\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u0430\u0439\u0442\u0430, \u0449\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u043e\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a   \u0438 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0430\u0439\u0442. +message.siteRedirect.noPages.user=\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430.
\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0441\u0430\u0439\u0442\u0430 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0441\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u0441\u0430\u0439\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. +message.logged-out=\u0412\u044b \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. +message.timeout=\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0441\u0442\u0435\u043a\u043b\u043e. \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0437\u0430\u043d\u044f\u043b\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435. +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430... +message.viewInCloud.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c URL-\u0430\u0434\u0440\u0435\u0441. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. +message.logged-out=\u0412\u044b \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. + +## Common Text labels and CM model metadata +label.tags=\u041c\u0435\u0442\u043a\u0438 +label.none=(\u041d\u0435\u0442) +label.empty=(\u041f\u0443\u0441\u0442\u043e) +label.about=\u041a\u0440\u0430\u0442\u043a\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +label.username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +label.password=\u041f\u0430\u0440\u043e\u043b\u044c +label.copyright=© 2005\u20132021 Alfresco Software Inc. \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b. +label.name=\u0418\u043c\u044f +label.id=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +label.title=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 +label.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +label.version=\u0412\u0435\u0440\u0441\u0438\u044f +label.firstname=\u0418\u043c\u044f +label.lastname=\u0424\u0430\u043c\u0438\u043b\u0438\u044f +label.jobtitle=\u0414\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044c +label.location=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +label.bio=\u0421\u0432\u043e\u0434\u043a\u0430 +label.photo=\u0424\u043e\u0442\u043e +label.contactinfo=\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +label.skype=Skype +label.im=IM +label.googleusername=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Google +label.company=\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f +label.companyinfo=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 +label.companyname=\u0418\u043c\u044f +label.companyaddress=\u0410\u0434\u0440\u0435\u0441 +label.companytelephone=\u0422\u0435\u043b\u0435\u0444\u043e\u043d +label.companyfax=\u0424\u0430\u043a\u0441 +label.companyemail=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 +label.companypostcode=\u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 +label.email=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 +label.telephone=\u0422\u0435\u043b\u0435\u0444\u043e\u043d +label.mobile=\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 +label.fax=\u0424\u0430\u043a\u0441 +label.address=\u0410\u0434\u0440\u0435\u0441 +label.postcode=\u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 +label.groups=\u0413\u0440\u0443\u043f\u043f\u044b +label.yes=\u0414\u0430 +label.no=\u041d\u0435\u0442 +label.ok=OK +label.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430... +label.validating=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430... +label.validationError=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. +label.site=\u0421\u0430\u0439\u0442 +label.path=\u041f\u0443\u0442\u044c +label.type=\u0422\u0438\u043f +label.creator=\u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c +label.created=\u0421\u043e\u0437\u0434\u0430\u043d\u043e +label.modifier=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 +label.modified=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e +label.author=\u0410\u0432\u0442\u043e\u0440 +label.priority=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 {0} +label.size=\u0420\u0430\u0437\u043c\u0435\u0440 +label.mimetype=\u0422\u0438\u043f MIME +label.mimetype.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e +label.popularity=\u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c +label.avatar=\u0410\u0432\u0430\u0442\u0430\u0440 +label.editType=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c: {0} +label.moreInfo=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 > +label.actions.column.header=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f +# Dictionary Model +label.modelActive=\u0410\u043a\u0442\u0438\u0432\u043d\u0430 +label.modelName=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 +label.modelDescription=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 +# Transfer Targets +label.trx_enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d +label.trx_endpointhost=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0445\u043e\u0441\u0442 +label.trx_endpointport=\u041f\u043e\u0440\u0442 +label.you=\u0432\u044b +label.licensedTo=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u0434\u043b\u044f: + +## Location +location.tooltip.path=\u041f\u0443\u0442\u044c: {0} +location.tooltip.site=\u0421\u0430\u0439\u0442: {0} +location.path.repository=\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +location.path.documents=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b +location.path.userHome=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 +location.path.myfiles=\u041c\u043e\u0438 \u0444\u0430\u0439\u043b\u044b +location.path.shared=\u041e\u0431\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b +location.label.none=(\u041d\u0435\u0442) +location.label.local={0} +location.label.site={0} \u0432 {1} +location.label.repository={0} + +## EXIF +label.exif.width=\u0428\u0438\u0440\u0438\u043d\u0430 +label.exif.height=\u0412\u044b\u0441\u043e\u0442\u0430 + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord}-{endRecord} \u0438\u0437 {totalRecords} +pagination.template.page-report.more=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b {startRecord}\u2013{endRecord} \u0438\u0437 {totalRecords}++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=({currentPage} \u0438\u0437 {totalPages}) +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=\u0421\u0432\u0435\u0442\u043b\u0430\u044f \u0442\u0435\u043c\u0430 +theme.default=\u0413\u043e\u043b\u0443\u0431\u0430\u044f \u0442\u0435\u043c\u0430 +theme.greenTheme=\u0417\u0435\u043b\u0435\u043d\u0430\u044f \u0442\u0435\u043c\u0430 +theme.hcBlack=\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u0442\u0435\u043c\u0430 +theme.yellowTheme=\u0416\u0435\u043b\u0442\u0430\u044f \u0442\u0435\u043c\u0430 +theme.gdocs=\u0422\u0435\u043c\u0430 Google Docs + +## Admin console tools +tool.users.label=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +tool.users.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 +tool.groups.label=\u0413\u0440\u0443\u043f\u043f\u044b +tool.groups.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 +tool.application.label=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 +tool.application.description=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c +tool.replication-jobs.label=\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +tool.replication-jobs.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f\u043c\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +tool.repository.label=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +tool.repository.description=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +tool.tag-management.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 +tool.tag-management.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 +tool.workflow.label=\u0411\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +tool.workflow.description=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 +tool.trashcan.label=\u041a\u043e\u0440\u0437\u0438\u043d\u0430 +tool.trashcan.description=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 +tool.email-inbound.label=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 (\u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435) +tool.email-inbound.description=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 (\u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435) +tool.email-outbound.label=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 (\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435) +tool.email-outbound.description=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 (\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435) +tool.email-imap.label=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 (IMAP) +tool.email-imap.description=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 (IMAP) +tool.runtime.label=\u0421\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f +tool.runtime.description=\u0421\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f +tool.repository-server.label=\u0412\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u0442\u0435\u043a\u0443\u0449\u0430\u044f) +tool.repository-server.description=\u0412\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u0442\u0435\u043a\u0443\u0449\u0430\u044f) +tool.repository-installed.label=\u0412\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f) +tool.repository-installed.description=\u0412\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f) +tool.authority.label=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +tool.authority.description=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +tool.license.label=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f Alfresco +tool.license.description=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f Alfresco +tool.license.link=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439 +tool.license.usageinfo.label=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=\u0421\u0438\u0441\u0442\u0435\u043c\u0430 OpenOffice +tool.openoffice-subsystem.description=\u0421\u0438\u0441\u0442\u0435\u043c\u0430 OpenOffice +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 pdf2swf +tool.transformer-pdf2swf.description=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 pdf2swf +tool.transformer-imagemagick.label=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 ImageMagick +tool.transformer-imagemagick.description=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 ImageMagick +tool.fileservers.label=\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b +tool.fileservers.description=\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b +tool.subscriptions.label=\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 +tool.subscriptions.description=\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 +tool.sysadmin.label=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b +tool.sysadmin.description=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b +tool.activities.label=\u041a\u0430\u043d\u0430\u043b \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 +tool.activities.description=\u041a\u0430\u043d\u0430\u043b \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 +tool.workflow.label=\u0411\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +tool.workflow.description=\u0411\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +tool.manage-sites.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0430\u0439\u0442\u0430\u043c\u0438 +tool.manage-sites.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0430\u0439\u0442\u0430\u043c\u0438 +tool.cloud-sync-management.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441 \u041e\u0431\u043b\u0430\u043a\u043e\u043c +tool.cloud-sync-management.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441 \u041e\u0431\u043b\u0430\u043a\u043e\u043c +tool.search-manager.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c +tool.search-manager.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c + +## Admin console tool groups +tool.group.usersgroups=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u0433\u0440\u0443\u043f\u043f\u044b +tool.group.email=\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430 +tool.group.transformations=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f +tool.group.filemanagement=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 +tool.group.subscriptions=\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 +tool.group.repository=\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +tool.group.search=\u041f\u043e\u0438\u0441\u043a +tool.group.site=\u0421\u0430\u0439\u0442\u044b + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 +page.acceptInvite.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0430\u0441 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0441\u0430\u0439\u0442\u0430 \u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0432\u0430\u0448\u0435\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0435\u0441\u043b\u0438 \u0432\u044b \u043e\u043d\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0430 +page.addGroups.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b +page.addGroups.description=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b +page.add-users.title=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +page.add-users.description=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0441\u0430\u0439\u0442 +page.adminConsole.title=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 +page.adminConsole.description=\u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f +page.advsearch.title=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a +page.advsearch.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 +page.blogCreateEdit.title=\u0411\u043b\u043e\u0433: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +page.blogCreateEdit.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 +page.blogPostList.title=\u0411\u043b\u043e\u0433 +page.blogPostList.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043b\u043e\u0433\u0430 +page.blogPostView.title=\u0411\u043b\u043e\u0433: \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 +page.blogPostView.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0432\u0438\u0434 \u0437\u0430\u043f\u0438\u0441\u0438 +page.calendar.title=\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c +page.calendar.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u0441\u0430\u0439\u0442\u0430 +page.changePassword.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.changePassword.description=\u0420\u0430\u0437\u0434\u0435\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.contentViewer.title=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 +page.contentViewer.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 +page.createContent.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 +page.createContent.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 +page.createEditReplicationJob.title=\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +page.createEditReplicationJob.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +page.customiseSite.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0430\u0439\u0442 +page.customiseSite.description=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0430\u0439\u0442\u0430 +page.customiseSiteDashboard.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0430\u0439\u0442\u0430 +page.customiseSiteDashboard.description=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0435\u0442 \u0438 \u0434\u0430\u0448\u043b\u0435\u0442\u044b \u0434\u043b\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0430\u0439\u0442\u0430 +page.customiseUserDashboard.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 +page.customiseUserDashboard.description=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0435\u0442 \u0438 \u0434\u0430\u0448\u043b\u0435\u0442\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b +page.data-lists.title=\u0421\u043f\u0438\u0441\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 +page.data-lists.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 +page.discussionsCreateTopic.title=\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b +page.discussionsCreateTopic.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u043c\u044b +page.discussionsTopicList.title=\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f +page.discussionsTopicList.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0442\u0435\u043c\u044b \u0444\u043e\u0440\u0443\u043c\u0430 +page.discussionsTopicView.title=\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f: \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0442\u0435\u043c\u044b +page.discussionsTopicView.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0432\u0438\u0434 \u0442\u0435\u043c\u044b +page.documentDetails.title=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 +page.documentDetails.description=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 +page.documentLibrary.title=\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +page.documentLibrary.description=\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 +page.editMetadata.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +page.editMetadata.description=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 +page.folderDetails.title=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u0430\u043f\u043a\u0435 +page.folderDetails.description=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u0430\u043f\u043a\u0435 +page.folderRules.title=\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0430\u043f\u043a\u0438 +page.folderRules.description=\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0430\u043f\u043a\u0438 +page.geographicMap.title=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 Google Maps +page.geographicMap.description=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u0432 Google Maps +page.inlineEdit.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 Alfresco Share +page.inlineEdit.description=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 Alfresco Share +page.invite.title=\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c +page.invite.description=\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c +page.links.title=\u0421\u0441\u044b\u043b\u043a\u0438 +page.links.description=\u0421\u0441\u044b\u043b\u043a\u0438 +page.linkCreateEdit.title=\u0421\u0441\u044b\u043b\u043a\u0438: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 +page.linkCreateEdit.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a +page.linksView.title=\u0421\u0441\u044b\u043b\u043a\u0438: \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u0441\u044b\u043b\u043a\u0438 +page.linksView.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0432\u0438\u0434 \u0441\u0441\u044b\u043b\u043a\u0438 +page.login.title=\u0412\u043e\u0439\u0442\u0438 +page.logout.title=\u0412\u044b\u0445\u043e\u0434 +page.managePermissions.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +page.managePermissions.description=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +page.myFiles.title=\u041c\u043e\u0438 \u0444\u0430\u0439\u043b\u044b +page.myFiles.description=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u043e\u0438 \u0444\u0430\u0439\u043b\u044b +page.myDocumentLibraries.title=\u041c\u043e\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +page.myDocumentLibraries.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +page.myTasks.title=\u041c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 +page.myTasks.description=\u0421\u043f\u0438\u0441\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. +page.myWorkflows.title=\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b +page.myWorkflows.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 +page.pendingInvites.title=\u041e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0435 +page.pendingInvites.description=\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u043d\u044b\u0435 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 +page.peopleFinder.title=\u041f\u043e\u0438\u0441\u043a \u043b\u044e\u0434\u0435\u0439 +page.peopleFinder.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u044e\u0434\u0435\u0439 +page.profile.title=\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.profile.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.rejectInvite.title=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 +page.rejectInvite.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f. \u041e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435\u043c +page.repository.title=\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +page.repository.description=\u041e\u0431\u0437\u043e\u0440 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +page.ruleEdit.title=\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0430\u043f\u043a\u0438 +page.ruleEdit.description=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u043f\u0430\u043f\u043a\u0438. +page.search.title=\u041f\u043e\u0438\u0441\u043a +page.search.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 +page.sharedFiles.title=\u041e\u0431\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b +page.sharedFiles.description=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b +page.siteConsole.title=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0430\u0439\u0442\u0430\u043c\u0438 +page.siteConsole.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430\u043c\u0438 \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u043e\u0432 +page.siteFinder.title=\u041f\u043e\u0438\u0441\u043a \u0441\u0430\u0439\u0442\u043e\u0432 +page.siteFinder.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 +page.siteIndex.title=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c +page.siteIndex.description=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0443\u044e \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0430\u0439\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u043d\u0435\u0435 +page.siteGroups.title=\u0413\u0440\u0443\u043f\u043f\u044b-\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 +page.siteGroups.description=\u0413\u0440\u0443\u043f\u043f\u044b-\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 +page.siteMembers.title=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 +page.siteMembers.description=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 +page.startWorkflow.title=\u041d\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +page.startWorkflow.description=\u041d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +page.taskDetails.title=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0437\u0430\u0434\u0430\u0447\u0435 +page.taskDetails.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u0437\u0430\u0434\u0430\u0447\u0435 +page.taskEdit.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 +page.taskEdit.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u0437\u0430\u0434\u0430\u0447\u0435 +page.userContent.title=\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c +page.userContent.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c +page.userFollowers.title=\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438 +page.userFollowers.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043b\u044e\u0434\u0435\u0439, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.userFollowing.title=\u041c\u043e\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 +page.userFollowing.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043b\u044e\u0434\u0435\u0439, \u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d +page.userNotifications.title=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.userNotifications.description=\u0420\u0430\u0437\u0434\u0435\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.userCloudAuth.title=\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 +page.userCloudAuth.description=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u043b\u0430\u043a\u0430 +page.userSites.title=\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0430\u0439\u0442\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.userSites.description=\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0430\u0439\u0442\u043e\u0432, \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +page.userTrashcan.title=\u041a\u043e\u0440\u0437\u0438\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.userTrashcan.description=\u0421\u043f\u0438\u0441\u043e\u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0430\u043f\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +page.wiki.title=\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a +page.wiki.description=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 +page.wikiCreate.title=\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b +page.wikiCreate.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435 +page.wikiPage.title=\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a +page.wikiPage.description=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 +page.workspace.title=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +page.workspace.description=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +page.workflowDetails.title=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 +page.workflowDetails.description=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 + +## Dashboard page titles and descriptions +page.siteDashboard.title=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 +page.siteDashboard.description=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b +page.userDashboard.title=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 +page.userDashboard.description=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +page.meeting_workspace.title=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u0439 +page.meeting_workspace.description=\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u0439 + +page.error.500.title=Alfresco Share » \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 +page.error.500.header=\u0421 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a... +page.error.500.detail=

\u0423 \u043d\u0430\u0441 \u043c\u043e\u0433\u043b\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u043b\u0438\u0431\u043e \u0447\u0442\u043e-\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043b\u0438 \u0432\u044b \u0432\u0432\u0435\u043b\u0438 URL-\u0430\u0434\u0440\u0435\u0441.

\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0447\u0430\u0441\u0442\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435) \u0438\u043b\u0438 \u0436\u0435 \u043c\u043e\u0433\u043b\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u043e\u044e \u0418\u0422-\u0441\u043b\u0443\u0436\u0431\u0443.

\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0430 \u043e\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430, \u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0449\u0435\u043b\u043a\u043d\u0443\u0432 \u0441\u0432\u043e\u0435 \u0438\u043c\u044f \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

+page.error.500.nav.dashboard=\u041d\u0430\u0437\u0430\u0434 \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 +page.error.500.footer=Alfresco Software Inc. © 2005-2023 \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b. + +## Title bar component titles for pages that use the simple-title component +title.repository=\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +title.browser=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 +title.siteFinder=\u041f\u043e\u0438\u0441\u043a \u0441\u0430\u0439\u0442\u043e\u0432 +title.peopleFinder=\u041f\u043e\u0438\u0441\u043a \u043b\u044e\u0434\u0435\u0439 +title.myTasks=\u041c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 + +## Site Visibility +site.visibility.label.PUBLIC=\u041e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 +site.visibility.label.MODERATED=\u041c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 +site.visibility.label.PRIVATE=\u041b\u0438\u0447\u043d\u044b\u0439 +site.visibility.description.PUBLIC=\u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u0437 \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0443. +site.visibility.description.MODERATED=\u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u0437 \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u044d\u0442\u043e\u0442 \u0441\u0430\u0439\u0442 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f. \u0414\u043e\u0441\u0442\u0443\u043f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u0441\u0430\u0439\u0442\u0430. +site.visibility.description.PRIVATE=\u042d\u0442\u043e\u0442 \u0441\u0430\u0439\u0442 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0439\u0442\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043b\u044e\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0430\u0439\u0442\u0430. + +## Roles +role.SiteManager=\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 +role.SiteManager.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0430\u0439\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u0430\u043a \u0438\u043c \u0441\u0430\u043c\u0438\u043c, \u0442\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0441\u0430\u0439\u0442\u0430. +role.Collaborator=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 +role.Collaborator.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435; \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043d\u043e \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0430\u0432\u0430 \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c. +role.SiteCollaborator=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 +role.SiteCollaborator.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435; \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043d\u043e \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0430\u0432\u0430 \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c. +role.Contributor=\u041f\u0438\u0441\u0430\u0442\u0435\u043b\u044c +role.Contributor.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0435 \u0435\u043c\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435; \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438. +role.SiteContributor=\u041f\u0438\u0441\u0430\u0442\u0435\u043b\u044c +role.SiteContributor.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0435 \u0435\u043c\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435; \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438. +role.Consumer=\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c +role.Consumer.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440; \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. +role.SiteConsumer=\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c +role.SiteConsumer.description=\u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440; \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. +role.Coordinator=\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 +role.Coordinator.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0430\u0439\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u0430\u043a \u0438\u043c \u0441\u0430\u043c\u0438\u043c, \u0442\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0441\u0430\u0439\u0442\u0430. +role.Editor=\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043e\u0440 +role.Editor.description=\u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0444\u0430\u0439\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432; \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. + +roles.readassociations=\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c + +roles-tooltip.header=\u041e \u0440\u043e\u043b\u044f\u0445 +roles-tooltip.docs-url-label=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=\u041c\u0435\u0442\u043a\u0438 +taglibrary.populartagslink=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0430\u0439\u0442\u0435 +taglibrary.msg.failedLoadTags=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0441\u0431\u043e\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f?) +taglibrary.msg.unableLoadTags=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438: {0} +taglibrary.tip.removeTag=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 +taglibrary.tip.help=\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u043a \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438. \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u0432 \u043e\u0434\u043d\u0443 \u043c\u0435\u0442\u043a\u0443 \u043c\u043e\u0436\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f "\u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438" + +## YUI Editor keys +yuieditor.toolbar.group.font=\u0421\u0442\u0438\u043b\u044c \u0448\u0440\u0438\u0444\u0442\u0430 +yuieditor.toolbar.group.lists=\u0421\u043f\u0438\u0441\u043a\u0438 +yuieditor.toolbar.group.link=\u0421\u0432\u044f\u0437\u0430\u0442\u044c +yuieditor.toolbar.item.createorderedlist=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a +yuieditor.toolbar.item.createunorderedlist=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a +yuieditor.toolbar.item.fontcolor=\u0426\u0432\u0435\u0442 \u0448\u0440\u0438\u0444\u0442\u0430 +yuieditor.toolbar.item.backgroundcolor=\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 +yuieditor.toolbar.item.bold=\u0416\u0438\u0440\u043d\u044b\u0439 CTRL + SHIFT + B +yuieditor.toolbar.item.italic=\u041a\u0443\u0440\u0441\u0438\u0432 CTRL + SHIFT + I +yuieditor.toolbar.item.underline=\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435 CTRL + SHIFT + U +yuieditor.toolbar.item.link=HTML-\u0441\u0441\u044b\u043b\u043a\u0430 CTRL + SHIFT + L + +## Document Library Drop-down Menus +menu.select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c +menu.select.all=\u0412\u0441\u0435 +menu.select.none=\u041d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e +menu.select.invert=\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 +menu.select.folders=\u041f\u0430\u043f\u043a\u0438 +menu.select.documents=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 +menu.create-content.by-template-folder=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 +menu.selected-items=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b... +menu.selected-items.copy=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432... +menu.selected-items.move=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432... +menu.selected-items.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +menu.selected-items.download=\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043a\u0430\u043a Zip +menu.selected-items.assign-workflow=\u041d\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441... +menu.selected-items.manage-permissions=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\u2026... +menu.selected-items.deselect-all=\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 +menu.selected-items.cloudSync=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c +menu.selected-items.cloudUnsync=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c +menu.selected-items.cloudRequestSync=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e + +## Document Library Actions +actions.document.assign-workflow=\u041d\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +actions.document.cancel-editing=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 +actions.document.cancel-editing-unlock=\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +actions.document.change-type=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f +actions.document.copy-to=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432... +actions.document.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +actions.document.download=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c +actions.document.download-again=\u0421\u043a\u0430\u0447\u0430\u0442\u044c +actions.document.download-original=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b +actions.document.edit-metadata=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +actions.document.edit-offline=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 +actions.document.edit-online=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 Microsoft Office\u2122 +message.edit-online.supported_office_version_required=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Microsoft Office. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c Microsoft Office. Office 2007 \u0438 2008 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 Google Chrome. +actions.document.extract-metadata=\u0418\u0437\u0432\u043b\u0435\u0447\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 +actions.document.execute-script=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 +actions.document.inline-edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 Alfresco Share +actions.document.increment-counter=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a +actions.document.locate=\u041d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b +actions.document.manage-aspects=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u0441\u043f\u0435\u043a\u0442\u044b +actions.document.manage-permissions=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +actions.document.take-ownership=\u0421\u0442\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c +actions.document.move-to=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432... +actions.document.simple-approve=\u041f\u0440\u0438\u043d\u044f\u0442\u044c +actions.document.simple-reject=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c +actions.document.upload-new-version=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e +actions.document.view=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 +actions.document.view-google-map=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 Google Maps +actions.document.view-original=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 +actions.document.view-source-repository=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 +actions.document.view-working-copy=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043a\u043e\u043f\u0438\u044e +actions.document.publish=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c +actions.document.transform=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c +actions.document.transform-image=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 +actions.document.publish-content=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b +actions.document.cloud-sync=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u041e\u0431\u043b\u0430\u043a\u043e\u043c +actions.document.cloud-unsync=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +actions.document.view-in-cloud=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 Alfresco Cloud +actions.document.request-sync=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +actions.document.unzip-to=\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432... +actions.folder.download=\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043a\u0430\u043a Zip +actions.folder.change-type=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f +actions.folder.copy-to=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432... +actions.folder.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 +actions.folder.edit-metadata=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +actions.folder.locate=\u041d\u0430\u0439\u0442\u0438 \u043f\u0430\u043f\u043a\u0443 +actions.folder.manage-aspects=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u0441\u043f\u0435\u043a\u0442\u044b +actions.folder.manage-permissions=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 +actions.folder.take-ownership=\u0421\u0442\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c +actions.folder.move-to=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432... +actions.folder.rules=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 +actions.folder.simple-approve=\u041f\u0440\u0438\u043d\u044f\u0442\u044c +actions.folder.simple-reject=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c +actions.folder.view-details=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e +actions.folder.view-source-repository=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 +actions.folder.cloud-sync=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u041e\u0431\u043b\u0430\u043a\u043e\u043c +actions.folder.cloud-unsync=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +actions.folder.view-in-cloud=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 Alfresco Cloud +actions.link.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 +actions.link.locate=\u041d\u0430\u0439\u0442\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 +actions.editOnline.failure=\u0424\u0430\u0439\u043b ''{0}'' \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0412\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443. \n \u0414\u043b\u044f Windows: Microsoft Office 2010 \n \u0434\u043b\u044f Mac OS X: \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 SharePoint +actions.editOnline.invalid=\u0424\u0430\u0439\u043b ''{0}'' \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c SPP.\n\u041d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b: ~ " # % & * : < > ? / \\ { | }. +actions.synced.document.delete=
''{0}'' \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u0430. +actions.synced.folder.delete=
''{0}'' \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043f\u043a\u0438 \u0438 \u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u0430. +actions.synced.remove-sync=
\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 ''\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e''. +actions.synced.cloud.document.delete=
''{0}'' \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430. +actions.synced.cloud.folder.delete=
''{0}'' \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043f\u043a\u0438 \u0438 \u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e. +actions.synced.cloud.document.delete.on.prem=
''{0}'' \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0438 \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. +actions.synced.cloud.folder.delete.on.prem=
''{0}'' \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0438 \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. + + + +## Document Library Pop-up Messages +message.actions.failure.locate=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442: \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0434\u0430\u043b\u0435\u043d. +message.change-type.success=\u0422\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 ''{0}'' \u0438\u0437\u043c\u0435\u043d\u0435\u043d +message.change-type.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 ''{0}'' +message.confirm.delete=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.delete.success=\u0423\u0434\u0430\u043b\u0435\u043d\u043e: ''{0}'' +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' +message.multiple-delete.please-wait=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435. \u0424\u0430\u0439\u043b\u044b \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f... +message.confirm.take-ownership.title=\u0421\u0442\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c? +message.confirm.take-ownership=\u0412\u044b \u0441\u0442\u0430\u043d\u0435\u0442\u0435 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c ''{0}'', \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0430\u0432\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b. +message.take-ownership.success=\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c ''{0}'' +message.take-ownership.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0442\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c ''{0}'' +message.details.success=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b +message.details.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f +message.details.failure.name=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. +message.details.failure.more.max.length=\u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. +message.sync.success=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +message.sync.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +message.sync.unavailable=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. +message.unsync.confirm=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e ''{0}''? +message.unsync.success=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.unsync.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +message.request.sync.success=\u0417\u0430\u043f\u0440\u043e\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d +message.request.sync.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +message.error=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +message.empty=\u041d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 +message.empty.subfolders=\u041d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ''{0}'' \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043e\u043a ({1}). +message.empty.subfolders.link=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0438 +message.edit-offline.failure=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ''{0}''. +message.edit-offline.success=\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ''{0}'' +message.edit-offline.success.ie7=\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0438\u0436\u0435. +message.edit-online.office.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Microsoft Office. +message.edit-online.office.path.failure=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a URL-\u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 260 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043c\u0435\u043d\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439 \u043f\u0443\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443. +message.edit-online-aos.no_supported_environment=\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u041e\u0421 Windows \u0438 Mac OS X. +message.edit-online-aos.starting_office_failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c Microsoft Office. +message.edit-online-aos.plugin_blocked.caption=Microsoft Office \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d +message.edit-online-aos.plugin_blocked.body.firefox=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 Firefox \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f. +message.edit-online-aos.plugin_blocked.body.chrome=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 Chrome, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c. +message.edit-online-aos.plugin_blocked.body.safari=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 ''\u0414\u043e\u0432\u0435\u0440\u044f\u0442\u044c'', \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c. +message.edit-online-aos.plugin_blocked.button_dismiss=OK +message.edit-online-aos.supported_office_version_required=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Microsoft Office. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c Microsoft Office. +message.edit-online-aos.edit_offline_locked.title=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b +message.edit-online-aos.edit_offline_locked.message=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b. +message.edit-online-aos.edit_offline_locked.confirm=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c +message.edit-online-aos.edit_offline_locked.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +message.edit-online-aos.edit_locked.title=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b +message.edit-online-aos.edit_locked.message=\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d. +message.edit-online-aos.edit_locked.button_dismiss=OK +message.unlock-document.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c ''{0}''. +message.edit-cancel.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ''{0}''. +message.edit-cancel.success=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ''{0}'' \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e. +message.unlock-document.success=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ''{0}'' \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e. +message.file-dnd-move.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442. +message.increment-counter.success=\u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0441\u044f +message.increment-counter.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a. +message.extract-metadata.success=\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u044b. +message.extract-metadata.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. +message.execute-script.success=\u0421\u043a\u0440\u0438\u043f\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d +message.execute-script.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 +message.insitu-edit.name.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432... +message.simple-workflow.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. +message.simple-workflow.approved=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043a\u0430\u043a \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0439 +message.simple-workflow.rejected=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043a\u0430\u043a \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043d\u044b\u0439 +message.simple-workflow.failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. +message.transform.success=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d +message.transform.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +message.transform-image.success=\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 ''{0}'' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043e +message.transform-image.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +message.new-version-upload.success=\u0424\u0430\u0439\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0437\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. + +message.insitu-edit.tag.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 + +## Drag and Drop +message.dnd.allColumnsAreFull=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b + +## Data Dictionary +# Aspects +aspect.cm_complianceable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 +aspect.cm_dublincore=\u0414\u0443\u0431\u043b\u0438\u043d\u0441\u043a\u043e\u0435 \u044f\u0434\u0440\u043e +aspect.cm_effectivity=\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c +aspect.cm_emailed=\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 +aspect.cm_generalclassifiable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 +aspect.cm_summarizable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +aspect.cm_taggable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u043a +aspect.cm_templatable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 +aspect.cm_versionable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439 +aspect.emailserver_aliasable=\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b +aspect.app_inlineeditable=\u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u0438 +aspect.cm_geographic=\u0413\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 +aspect.exif_exif=EXIF +aspect.exif_resolution=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 +aspect.exif_camera=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u0430\u043c\u0435\u0440\u0435 +aspect.audio_audio=\u0410\u0443\u0434\u0438\u043e +aspect.cm_indexControl=\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 +aspect.dp_restrictable=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0439 +aspect.cm_attachable=\u0412\u043b\u043e\u0436\u0435\u043d\u0438\u044f + +# Groups +group.everyone=\u0412\u0421\u0415 + +# Types +type.cm_content=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 +type.cm_folder=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0438\u043f \u043f\u0430\u043f\u043a\u0438 +type.trx_transferTarget=\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 +type.trx_fileTransferTarget=\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 + +# Generic Form labels +form.set.general=\u041e\u0431\u0449\u0435\u0435 +form.set.operations=\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 + +# Runtime +runtime.field.FreeMemory=\u041e\u0431\u044a\u0435\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 +runtime.field.MaxMemory=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 +runtime.field.TotalMemory=\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 + +# Repository Server +repository-server.set.version=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0435\u0440\u0441\u0438\u0438 +repository-server.field.Name=\u0418\u043c\u044f +repository-server.field.Id=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +repository-server.field.Edition=\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f +repository-server.field.Schema=\u0421\u0445\u0435\u043c\u0430 +repository-server.field.Version=\u0412\u0435\u0440\u0441\u0438\u044f +repository-server.field.VersionLabel=\u042f\u0440\u043b\u044b\u043a +repository-server.field.VersionMinor=\u041d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 +repository-server.field.VersionMajor=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 +repository-server.field.VersionRevision=\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f +repository-server.field.VersionBuild=\u0421\u0431\u043e\u0440\u043a\u0430 +repository-server.field.VersionNumber=\u041d\u043e\u043c\u0435\u0440 + +# Repository Installed +repository-installed.set.version=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0435\u0440\u0441\u0438\u0438 +repository-installed.field.Name=\u0418\u043c\u044f +repository-installed.field.Id=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +repository-installed.field.Edition=\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f +repository-installed.field.Schema=\u0421\u0445\u0435\u043c\u0430 +repository-installed.field.Version=\u0412\u0435\u0440\u0441\u0438\u044f +repository-installed.field.VersionLabel=\u042f\u0440\u043b\u044b\u043a +repository-installed.field.VersionMinor=\u041d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 +repository-installed.field.VersionMajor=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 +repository-installed.field.VersionRevision=\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f +repository-installed.field.VersionBuild=\u0421\u0431\u043e\u0440\u043a\u0430 +repository-installed.field.VersionNumber=\u041d\u043e\u043c\u0435\u0440 + +# Authority +authority.field.NumberOfGroups=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f +authority.field.NumberOfUsers=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 + +# License +header.license= +license.field.Subject=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 +license.field.Days=\u0434\u043d. +license.field.Holder=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0430\u0442 +license.field.ValidUntil=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u0434\u043e +license.field.RemainingDays=\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043d\u0435\u0439 +license.field.Issued=\u0414\u0430\u0442\u0430 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 +license.field.Issuer=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0430\u0440 +license.field.HeartBeatDisabled=\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d +license.field.LicenseMode=\u0422\u0438\u043f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +license.field.CloudSyncKeyAvailable=\u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u043b\u044e\u0447 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c +license.field.MaxDocs=\u041c\u0430\u043a\u0441. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 +license.field.MaxUsers=\u041c\u0430\u043a\u0441. \u043a\u043e\u043b-\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +license.field.Users=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +license.field.Documents=\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 +license.field.Info=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0443\u043b\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. + +# Pdf2Swf +pdf2swf.field.Available=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e +pdf2swf.field.VersionString=\u0412\u0435\u0440\u0441\u0438\u044f + +# Open Office +openoffice.field.available=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e +openoffice.field.ooName=\u0418\u043c\u044f +openoffice.field.ooOpenSourceContext=\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c +openoffice.field.ooSetupExtension=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f +openoffice.field.ooSetupVersion=\u0412\u0435\u0440\u0441\u0438\u044f +openoffice.field.ooSetupVersionAboutBox=\u041a\u0440\u0430\u0442\u043a\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +openoffice.field.ooXMLFileFormatName=\u0424\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u043e\u0432 XML +openoffice.field.ooXMLFileFormatVersion=\u0412\u0435\u0440\u0441\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 XML +openoffice.error=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 OpenOffice +openoffice.error.404=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 OpenOffice (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 ''ooo.enabled'' \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ''\u043b\u043e\u0436\u044c''?) + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +openoffice-subsystem.field.ooo.exe=Exe +openoffice-subsystem.field.ooo.port=\u041f\u043e\u0440\u0442 + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +ooojodconverter.field.jodconverter.maxTasksPerProcess=\u041c\u0430\u043a\u0441. \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 +ooojodconverter.field.jodconverter.officeHome=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 Office +ooojodconverter.field.jodconverter.portNumbers=\u041d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0440\u0442\u043e\u0432 +ooojodconverter.field.jodconverter.taskExecutionTimeout=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 +ooojodconverter.field.jodconverter.taskQueueTimeout=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u0434\u0430\u0447 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 + +# Transformer ImageMagick +transformer-imagemagick.field.Available=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e +transformer-imagemagick.field.VersionString=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0435\u0440\u0441\u0438\u0438 + +# File servers +fileservers.set.filesystem=\u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e +fileservers.field.filesystem.acl.global.domainAccessControls=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0434\u043e\u043c\u0435\u043d\u0443 +fileservers.field.filesystem.acl.global.protocolAccessControls=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 +fileservers.field.filesystem.acl.global.userAccessControls=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +fileservers.field.filesystem.domainMappings=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043c\u0435\u043d\u0430 +fileservers.field.filesystem.name=\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b +fileservers.field.filesystem.name.description=\u0418\u043c\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 CIFS/FTP/WebDAV +fileservers.field.cifs.WINS.autoDetectEnabled=\u0410\u0432\u0442\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 WINS \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e +fileservers.field.cifs.WINS.primary=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 WINS-\u0441\u0435\u0440\u0432\u0435\u0440 +fileservers.field.cifs.WINS.secondary=\u0412\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0439 WINS-\u0441\u0435\u0440\u0432\u0435\u0440 +fileservers.field.cifs.bindto=\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a +fileservers.field.cifs.broadcast=\u0428\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430 +fileservers.field.cifs.disableNIO=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c NIO +fileservers.field.cifs.disableNativeCode=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 +fileservers.field.cifs.domain=\u0414\u043e\u043c\u0435\u043d +fileservers.field.cifs.enabled=CIFS \u0432\u043a\u043b\u044e\u0447\u0435\u043d +fileservers.field.cifs.hostannounce=\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u043e\u0441\u0442\u0430 +fileservers.field.cifs.ipv6.enabled=IPV6 \u0432\u043a\u043b\u044e\u0447\u0435\u043d +fileservers.field.cifs.netBIOSSMB.datagramPort=\u041f\u043e\u0440\u0442 \u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b NetBIOS SMB +fileservers.field.cifs.netBIOSSMB.namePort=\u0418\u043c\u044f \u043f\u043e\u0440\u0442\u0430 NetBIOS SMB +fileservers.field.cifs.netBIOSSMB.sessionPort=\u041f\u043e\u0440\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 NetBIOS SMB +fileservers.field.cifs.serverName=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 +fileservers.field.cifs.sessionDebug=\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 +fileservers.field.cifs.sessionTimeout=\u0422\u0430\u0439\u043c-\u0430\u0443\u0442 \u0441\u0435\u0430\u043d\u0441\u0430 +fileservers.field.cifs.tcpipSMB.port=\u041f\u043e\u0440\u0442 TCP/IP SMB +fileservers.field.ftp.dataPortFrom=Dataport \u043e\u0442 +fileservers.field.ftp.dataPortTo=Dataport \u0434\u043e +fileservers.field.ftp.enabled=FTP \u0432\u043a\u043b\u044e\u0447\u0435\u043d +fileservers.field.ftp.keyStore=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 +fileservers.field.ftp.passphrase=\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0444\u0440\u0430\u0437\u0430 +fileservers.field.ftp.port=\u041f\u043e\u0440\u0442 +fileservers.field.ftp.requireSecureSession=\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u0430\u043d\u0430\u043b\u0443 +fileservers.field.ftp.sessionDebug=\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 +fileservers.field.ftp.sslEngineDebug=\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f SSL +fileservers.field.ftp.trustStore=\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 + +# Sysadmin +sysadmin.field.alfresco.context=\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +sysadmin.field.alfresco.host=\u0425\u043e\u0441\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +sysadmin.field.alfresco.port=\u041f\u043e\u0440\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +sysadmin.field.alfresco.protocol=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f +sysadmin.field.server.allowedusers=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 +sysadmin.field.server.maxusers=\u041c\u0430\u043a\u0441. \u043a\u043e\u043b-\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +sysadmin.field.server.transaction.allow-writes=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +sysadmin.field.share.context=\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 Share +sysadmin.field.share.host=\u0425\u043e\u0441\u0442 Share +sysadmin.field.share.port=\u041f\u043e\u0440\u0442 Share +sysadmin.field.share.protocol=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Share + +# Email (Inbound) +email-inbound.set.service=\u0421\u043b\u0443\u0436\u0431\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 +email-inbound.field.email.inbound.enabled=\u0421\u043b\u0443\u0436\u0431\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 +email-inbound.field.email.inbound.unknownUser=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +email-inbound.set.server=\u0421\u0435\u0440\u0432\u0435\u0440 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 +email-inbound.field.email.server.allowed.senders=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0438 +email-inbound.field.email.server.blocked.senders=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0438 +email-inbound.field.email.server.enabled=\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d +email-inbound.field.email.server.domain=\u0414\u043e\u043c\u0435\u043d +email-inbound.field.email.server.port=\u041f\u043e\u0440\u0442 +email-inbound.field.email.server.connections.max=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 +email-inbound.set.tls=\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (TLS) +email-inbound.field.email.server.requireTLS=\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 TLS +email-inbound.field.email.server.hideTLS=\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (TLS) \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0430 EHELO +email-inbound.field.email.server.enableTLS=\u041f\u0440\u0438\u043d\u044f\u0442\u044c TLS + +# Email (Outbound) +email-outbound.set.auth=\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f +email-outbound.set.test-message=\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 +email-outbound.field.mail.host=\u0425\u043e\u0441\u0442 +email-outbound.field.mail.port=\u041f\u043e\u0440\u0442 +email-outbound.field.mail.protocol=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b +email-outbound.field.mail.encoding=\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 +email-outbound.field.mail.from.default=\u0410\u0434\u0440\u0435\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e +email-outbound.field.mail.from.enabled=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e\u043b\u0435 ''\u041e\u0442:'' +email-outbound.field.mail.smtp.auth=\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e SMTP +email-outbound.field.mail.smtps.auth=\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e SMTPS +email-outbound.field.mail.username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +email-outbound.field.mail.password=\u041f\u0430\u0440\u043e\u043b\u044c +email-outbound.field.mail.testmessage.send=\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 +email-outbound.field.mail.testmessage.to=\u041a\u043e\u043c\u0443 +email-outbound.field.mail.testmessage.subject=\u0422\u0435\u043c\u0430 +email-outbound.field.mail.testmessage.text=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=\u041f\u0443\u0442\u044c \u043a \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 +imap.field.imap.config.home.rootPath=\u041f\u0443\u0442\u044c \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 +imap.field.imap.config.home.store=\u0414\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 +imap.field.imap.server.attachments.extraction.enabled=\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e +imap.field.imap.config.ignore.extraction=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 +imap.field.imap.config.server.mountPoints=\u0422\u043e\u0447\u043a\u0438 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +imap.field.imap.mail.from.default=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e +imap.field.imap.mail.to.default=\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e +imap.field.imap.server.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +imap.field.imap.server.host=\u0425\u043e\u0441\u0442 +imap.field.imap.server.port=\u041f\u043e\u0440\u0442 + +# Activities Feed +activities.set.activities=\u041a\u0430\u043d\u0430\u043b \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 +activities.field.feed.notifier.enabled=\u041a\u0430\u043d\u0430\u043b \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432\u043a\u043b\u044e\u0447\u0435\u043d +activities.field.feed.notifier.repeatIntervalMins=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u0430 (\u043c\u0438\u043d) +activities.field.feed.max.ageMins=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442 (\u043c\u0438\u043d) +activities.field.feed.max.size=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 + +# Subscriptions +subscriptions.field.subscriptions.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e + +# Workflow +workflow.field.message=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 +workflow.field.comment=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c +workflow.field.assign_to=\u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c +workflow.field.review_group=\u0413\u0440\u0443\u043f\u043f\u0430 \u0440\u0435\u0446\u0435\u043d\u0437\u0435\u043d\u0442\u043e\u0432 +workflow.field.reviewer=\u0420\u0435\u0446\u0435\u043d\u0437\u0435\u043d\u0442 +workflow.field.reviewers=\u0420\u0435\u0446\u0435\u043d\u0437\u0435\u043d\u0442\u044b +workflow.field.due=\u0421\u0440\u043e\u043a +workflow.field.priority=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 +workflow.field.outcome=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 +workflow.field.enabled.activiti=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +workflow.field.enabled.jbpm=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +workflow.field.definitions.visible=\u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 +workflow.field.number.tasks=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0430\u0447 +workflow.field.number.definitions=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 +workflow.field.number.workflows=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 +workflow.field.requiredApprovePercent=\u0422\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f +workflow.set.general=\u041e\u0431\u0449\u0435\u0435 +workflow.set.assignee=\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c +workflow.set.assignees=\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 +workflow.set.information=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +workflow.set.items=\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b +workflow.set.outcome=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 +workflow.set.other=\u0414\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0446\u0438\u0438 +workflow.set.task.info=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +workflow.set.workflow.more_info=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 +workflow.set.task.progress=\u0421\u0442\u0430\u0442\u0443\u0441 +workflow.set.response=\u041e\u0442\u0432\u0435\u0442 +workflow.set.engine.activiti=\u041c\u043e\u0434\u0443\u043b\u044c Activiti +workflow.set.engine.jbpm=\u041c\u043e\u0434\u0443\u043b\u044c JBPM +workflow.task.error=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438. +workflow.task.error.404=\u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438\u0431\u043e \u0431\u044b\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430. +workflow.task.invite.title=\u0421\u0430\u0439\u0442 {0} +workflow.task.invite.subtitle=\u0412\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u044b \u043d\u0430 \u0441\u0430\u0439\u0442 {0}. +workflow.task.invite.role=\u0412\u0430\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0440\u043e\u043b\u044c {0}. +workflow.task.invite.accepted={0} {1} \u043f\u0440\u0438\u043d\u044f\u043b \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 {2}. +workflow.task.invite.rejected={0} {1} \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 {2}. +workflow.task.request.invite.title=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0430\u0439\u0442\u0443 {1}. +workflow.cancel.title=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +workflow.cancel.label=\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441? +workflow.cancel.feedback=\u041e\u0442\u043c\u0435\u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430... +workflow.cancel.success=\u0411\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043c\u0435\u043d\u0435\u043d +workflow.cancel.failure=\u0421\u0431\u043e\u0439 \u043f\u0440\u0438 \u043e\u0442\u043c\u0435\u043d\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 +workflow.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +workflow.delete.label=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441? +workflow.delete.feedback=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u2026... +workflow.delete.success=\u0411\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043b\u0435\u043d +workflow.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +workflow.no_message=(\u041d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439) +tool.workflow.activiti.tools=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Activiti +tool.workflow.activiti.admin.link=\u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 Activiti + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c +tool.searchmanager.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +lucene.field.dir.indexes=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 +lucene.field.index.recovery.mode=\u0420\u0435\u0436\u0438\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 +lucene.field.lucene.indexer.contentIndexingEnabled=\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e +lucene.field.index.tracking.disableInTransactionIndexing=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043f\u0440\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 + +lucene.set.backup=\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 +lucene.backup.field.dir.indexes.backup=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 +lucene.backup.field.index.backup.cronExpression=\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 Cron \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f + +lucene.set.advanced=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e +lucene.advanced.field.fts.indexer.batchSize=\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +lucene.advanced.field.lucene.maxAtomicTransformationTime=\u041c\u0430\u043a\u0441. \u0412\u0440\u0435\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f +lucene.advanced.field.index.reindexMissingContent.cronExpression=\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 Cron \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 +lucene.advanced.field.indexer.maxFieldLength=\u041c\u0430\u043a\u0441. \u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u043e\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +lucene.field.indexer.mergerMaxMergeDocs=\u041c\u0430\u043a\u0441. \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +lucene.field.indexer.mergerMergeFactor=\u041c\u0430\u043a\u0441. \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f + +# Transform action form +transform.field.mime-type=\u0422\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 +transform.field.destination-folder=\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 + +# Transform Image action form +transform-image.field.mime-type=\u0422\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 +transform-image.field.convert-command=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b +transform-image.field.destination-folder=\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 + +publish-content.field.publish-channel-id=\u041a\u0430\u043d\u0430\u043b \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +publish-content.field.unpublish=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e +publish-content.field.status-update=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 +publish-content.field.status-update-channel-id=\u041a\u0430\u043d\u0430\u043b\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430 + +# Execute Script action form +script.field.script-ref=\u0421\u043a\u0440\u0438\u043f\u0442 + +# Solr +solr.set.spacesstore=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 +solr.set.archivestore=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0430\u0440\u0445\u0438\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 +solr.field.search.solrTrackingSupport.enabled=\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e +solr.help.search.solrTrackingSupport.enabled=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c Solr \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 +solr.field.solr.host=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Solr +solr.help.field.solr.host=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f Solr. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 localhost, \u0435\u0441\u043b\u0438 Solr \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. +solr.field.solr.port=\u041f\u043e\u0440\u0442 Solr (\u043d\u0435 SSL) +solr.help.field.solr.port=\u041f\u043e\u0440\u0442 HTTP (\u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439) \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Solr. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Solr. +solr.field.solr.port.ssl=\u041f\u043e\u0440\u0442 Solr SSL +solr.help.field.solr.port.ssl=\u041f\u043e\u0440\u0442 HTTPS \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Solr. + +# Tracker Properties +solr.field.tracker.alfresco.active=\u0418\u0434\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +solr.field.tracker.alfresco.lag=\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445) +solr.field.tracker.alfresco.last.indexed.txn=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f +solr.field.tracker.alfresco.approx.txns.remaining=\u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +solr.field.tracker.alfresco.approx.indexing.time.remaining=\u0414\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e +solr.help.field.tracker.alfresco.lag=\u0418\u043d\u0434\u0435\u043a\u0441\u044b Solr \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u042d\u0442\u043e \u0432\u0440\u0435\u043c\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044d\u0442\u043e\u0442 \u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 Solr \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0441\u0442\u0430\u0435\u0442 \u043e\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. +solr.field.tracker.archive.active=\u0418\u0434\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +solr.field.tracker.archive.lag=\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445) +solr.field.tracker.archive.last.indexed.txn=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f +solr.field.tracker.archive.approx.txns.remaining=\u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +solr.field.tracker.archive.approx.indexing.time.remaining=\u0414\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 Cron \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +solr.field.solr.backup.alfresco.remoteBackupLocation=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 +solr.field.solr.backup.alfresco.numberToKeep=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +solr.help.solr.backup.alfresco.remoteBackupLocation=\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043c\u0435\u0441\u0442\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Solr +solr.help.solr.backup.alfresco.numberToKeep=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e) +solr.field.solr.backup.archive.cronExpression=\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 Cron \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +solr.field.solr.backup.archive.remoteBackupLocation=\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 +solr.field.solr.backup.archive.numberToKeep=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +solr.help.solr.backup.archive.remoteBackupLocation=\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043c\u0435\u0441\u0442\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Solr +solr.help.solr.backup.archive.numberToKeep=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e) + +# searchmanager +searchmanager.field.sourceBeanName=\u0421\u043b\u0443\u0436\u0431\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 + +## Tooltips +tooltip.path=\u041f\u0443\u0442\u044c: {0} +tooltip.site=\u0421\u0430\u0439\u0442: {0} + +## Create content +create-content.text=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=\u041f\u0430\u043f\u043a\u0430 + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0441\u044f\u0446 +calendar.widget_control_config.label_year=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0433\u043e\u0434 +calendar.widget_control_config.label_invalid_year=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0433\u043e\u0434 + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430: {0} +details.created-by=\u0421\u043e\u0437\u0434\u0430\u043d\u043e {0} \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1} +details.created-in-site=\u0421\u043e\u0437\u0434\u0430\u043d\u043e {0} \u0432 {1} +details.editing-started-by=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u0442\u043e {0} \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1} +details.editing-started-in-site=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u0442\u043e {0} \u0432 {1} +details.modified-by=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e {0} \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1} +details.modified-in-site=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e {0} \u0432 {1} +details.description.none=\u041d\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f +details.tags.none=\u041d\u0435\u0442 \u043c\u0435\u0442\u043e\u043a +details.categories.none=\u041d\u0435\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 +details.user.deleted=''{0}'' (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c) + +## Social Interactions +# Favourite +favourite.document.add.tip=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0432 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +favourite.document.add.label=\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +favourite.document.remove.tip=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0438\u0437 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e +favourite.folder.add.tip=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0432 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +favourite.folder.add.label=\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +favourite.folder.remove.tip=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0438\u0437 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e +favourite.imap-site.add.tip=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u0439\u0442 \u0432 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 IMAP +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0430\u0439\u0442 \u0438\u0437 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e IMAP +favourite.site.add.tip=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u0439\u0442 \u0432 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +favourite.site.add.label=\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +favourite.site.remove.tip=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0430\u0439\u0442 \u0438\u0437 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e +favourite.message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +# Like +like.document.add.tip=\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +like.document.add.label=\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f +like.document.remove.tip=\u041c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f +like.folder.add.tip=\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u0430 \u043f\u0430\u043f\u043a\u0430 +like.folder.add.label=\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f +like.folder.remove.tip=\u041c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f +like.site.add.tip=\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0441\u0430\u0439\u0442 +like.site.add.label=\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f +like.site.remove.tip=\u041c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f +like.message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0430\u0448\u0443 \u043e\u0446\u0435\u043d\u043a\u0443 +# Quickshare +quickshare.link.label=\u041e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 +quickshare.link.tooltip=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 ctrl-c \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +quickshare.link.tooltip.mac=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 cmd-c \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +quickshare.view.label=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c +quickshare.unshare.label=\u0421\u043d\u044f\u0442\u044c \u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +quickshare.document.shared.label=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 +quickshare.document.shared.tip=\u042d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d (\u0449\u0435\u043b\u043a\u043d\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432) +quickshare.document.share.label=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f +quickshare.document.share.tip=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +quickshare.document.share.failure=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d +quickshare.document.unshared.label=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f +quickshare.document.unshared.tip=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +quickshare.document.unshare.success=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u043d\u044f\u0442 \u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +quickshare.document.unshare.failure=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043d\u044f\u0442 \u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +quickshare.document.unshare.user.failure=\u0423 \u0432\u0430\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0441\u043d\u044f\u0442\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. +quickshare.linkshare.label=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 +# LinkShare +linkshare.action.email.label=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 +linkshare.action.email.subject=\u0424\u0430\u0439\u043b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0438\u0437 Alfresco Content Services +linkshare.action.email.body=\u0424\u0430\u0439\u043b {1} \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0438\u0437 Alfresco Content Services. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c: {0} +linkshare.action.facebook.label=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Facebook +linkshare.action.facebook.message=\u0424\u0430\u0439\u043b {1} \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0438\u0437 Alfresco Content Services +linkshare.action.twitter.label=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Twitter +linkshare.action.twitter.message=\u0424\u0430\u0439\u043b {1} \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0438\u0437 Alfresco Content Services +linkshare.action.google-plus.label=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Google+ + + +# Comment +comment.document.tip=\u041f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +comment.document.label=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c +comment.folder.tip=\u041f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u0430\u043f\u043a\u0443 +comment.folder.label=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c + +#Dashlets +dashlet.help.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0448\u043b\u0435\u0442\u0443 +dashlet.rss.tooltip=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 RSS-\u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0448\u043b\u0435\u0442\u0430 +dashlet.edit.tooltip=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0430\u0448\u043b\u0435\u0442 + +#Module Package Admin page +tool.module-package.label=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 +tool.module-package.description=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 + +# Category Manager Admin Console +tool.category-manager.label=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 +tool.category-manager.description=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 +tool.category-manager.edit-category=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e +tool.category-manager.edit-category.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c\u044f. +tool.category-manager.add-category=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e +tool.category-manager.add-category.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e. +tool.category-manager.label.category-name=\u0418\u043c\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438: +tool.category-manager.delete-category=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e +tool.category-manager.delete-category.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e. +tool.category-manager.message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e +tool.category-manager.message.confirm.delete=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c: {0}? + +# Node browser +tool.node-browser.label=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 +tool.node-browser.description=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 + +# Label +label.folder=\u041f\u0430\u043f\u043a\u0430 +label.document=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 +label.blogpost=\u0417\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 +label.forumpost=\u0422\u0435\u043c\u0430 \u0444\u043e\u0440\u0443\u043c\u0430 +label.calendarevent=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435 +label.wikipage=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 Wiki +label.link=\u0421\u0441\u044b\u043b\u043a\u0430 +label.datalist=\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 +label.datalistitem=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 +label.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e +label.download=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c +label.viewinbrowser=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 +label.viewdetails=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e +label.selectAll=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 +label.selectInvert=\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 +label.selectNone=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 +label.selectedItems=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b +label.select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c +label.restricted-settings=Alfresco Identity Service \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b. + +# Path +message.infolderpath=\u0412 \u043f\u0430\u043f\u043a\u0435 + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f +sync.status.synced=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e: {0}, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {1} +sync.status.last-attempt=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f: {0}, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {1} +sync.status.failed=\u041f\u043e\u043f\u044b\u0442\u043e\u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438: {0}, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {1} +sync.status.last-failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e +sync.status.transient-error=\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +sync.status.transient-error.default-details=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e Alfresco Content Services \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c. +sync.status.copy.pending=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 {2} +sync.status.copy.synced={2} \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e: {0}, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {1} +sync.status.copy.last-attempt={2} \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f: {0}, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {1} +sync.status.copy.failed=\u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430: {2} {0}, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {1} +sync.status.copy.last-failed=\u0421\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 {2} +sync.status.show-details=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f +sync.status.hide-details=\u0421\u043a\u0440\u044b\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f +sync.status.title=\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e +sync.status.action.more=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 +sync.original-document=\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +sync.unable.get.details=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u0430. +sync.remove.folder.from.cloud=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0438 \u0432\u0441\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u0430. + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=\u041a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. +sync.folder.not_found=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u043f\u043a\u0443. +sync.node.already_synced=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442: \u043e\u043d \u0443\u0436\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. +sync.node.other_sync_set=\u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0443\u0436\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. +sync.node.no_longer_exists=\u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 Alfresco Content Services in the Cloud. +sync.node.no_longer_exists.description=\u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 Alfresco Content Services in the Cloud. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 "\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438\u044e", \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443. +sync.node.unknown=\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. +sync.node.unknown.description=\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430: {0}. +sync.node.access_denied=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442: \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0446\u0435\u043b\u0435\u0432\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443. +sync.node.access_denied_source=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442: \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443. +sync.node.content_limit_violation=\u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u043b \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430. \u0424\u0430\u0439\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. +sync.node.quota_limit_violation=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430 \u043a\u0432\u043e\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. +sync.node.authentication_error=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c: \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. +sync.node.authentication_error.description=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c: \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {0}. +sync.node.owner_not_found=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. +sync.node.owner_not_found.description=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f, {0}, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ''\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e''. + +sync.communications.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 +sync.communications.error.description=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438 + +# Cloud Sync no network available for sync +sync.message.no.active.network=\u041d\u0435\u0442 \u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=\u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +sync.new-folder.in-the-cloud.header=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043d\u043e\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 +sync.new-folder.creation.success=\u041f\u0430\u043f\u043a\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430 +sync.new-folder.creation.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +hybridsync.ssd-failed-reason-header-label=\u0422\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +hybridsync.path-desc-header-label=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 +hybridsync.sync-creator-header-label=\u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +hybridsync.cloud-user-header-label=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432 \u041e\u0431\u043b\u0430\u043a\u0435 +hybridsync.remote-tenant-id-header-label=\u0421\u0435\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430 +hybridsync.target-folder-node-ref-header-label=\u041c\u0435\u0441\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 +hybridsync.actions-header-label=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f + +#Hybrid workflow +hybridworkflow.destination-select.title=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u041e\u0431\u043b\u0430\u043a\u0435 +hybridworkflow.set.destination=\u041c\u0435\u0441\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c +hybridworkflow.authority.single=\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c +hybridworkflow.authority.multiple=\u0420\u0435\u0446\u0435\u043d\u0437\u0435\u043d\u0442\u044b +hybridworkflow.review.approved=\u041f\u0440\u0438\u043d\u044f\u0442\u043e +hybridworkflow.review.rejected=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e +hybridworkflow.destination-select.folderPrefix=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b +hybridworkflow.destination.network=\u0421\u0435\u0442\u044c +hybridworkflow.destination.site=\u0421\u0430\u0439\u0442 +hybridworkflow.destination.folder=\u041f\u0430\u043f\u043a\u0430 +hybridworkflow.destination.button=\u0412\u044b\u0431\u0440\u0430\u0442\u044c + +# Security +security.insecuremimetype=\u0422\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0433\u0440\u043e\u0437\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d. + +# Lightbox +lightbox.close=\u0437\u0430\u043a\u0440\u044b\u0442\u044c +lightbox.loading=\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 diff --git a/share/src/main/resources/alfresco/messages/slingshot_zh_CN.properties b/share/src/main/resources/alfresco/messages/slingshot_zh_CN.properties new file mode 100755 index 0000000000..7b4be9be68 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/slingshot_zh_CN.properties @@ -0,0 +1,1309 @@ +## Slingshot Common Messages + +app.name=Alfresco Share +app.tagline=Alfresco Content Services +app.community=Alfresco Community Edition + +## Page Title +page.title=Alfresco » {0} + +## Header logo - prefixed with ${url.context}/res/themes/${theme}/images/ +# app-logo.png is the default, a 48 pixel width image is also provided: app-logo-48.png +# it can be localised here or applied application wide in the admin console +header.logo=app-logo-48.png +header.search.default=\u8f93\u5165\u641c\u7d22\u8bcd... +# header menu items +header.advanced-search.label=\u9ad8\u7ea7\u641c\u7d22... +header.advanced-search.description=\u9ad8\u7ea7\u641c\u7d22... +header.application.label=\u5e94\u7528\u7a0b\u5e8f +header.application.description=\u5e94\u7528\u7a0b\u5e8f +header.change-password.label=\u66f4\u6539\u5bc6\u7801 +header.change-password.description=\u66f4\u6539\u5bc6\u7801 +header.groups.label=\u7ec4 +header.groups.description=\u7ec4 +header.tag-management.label=\u6807\u8bb0\u7ba1\u7406\u5668 +header.tag-management.description=\u6807\u8bb0\u7ba1\u7406\u5668 +header.help.label=\u5e2e\u52a9 +header.help.description=\u5e2e\u52a9 +header.logout.label=\u6ce8\u9500 +header.logout.description=\u6ce8\u9500 +header.more.label=\u66f4\u591a... +header.more.description=\u66f4\u591a... +header.my.label=\u6211\u7684... +header.my.description=\u6211\u7684... +header.my-content.label=\u6211\u7684\u5185\u5bb9 +header.my-content.description=\u6211\u7684\u5185\u5bb9 +header.my-dashboard.label=\u6211\u7684\u4eea\u8868\u677f +header.my-dashboard.description=\u6211\u7684\u4eea\u8868\u677f +header.my-profile.label=\u6211\u7684\u4e2a\u4eba\u6863\u6848 +header.my-profile.description=\u6211\u7684\u4e2a\u4eba\u6863\u6848 +header.my-sites.label=\u6211\u7684\u7ad9\u70b9 +header.my-sites.description=\u6211\u7684\u7ad9\u70b9 +header.my-tasks.label=\u6211\u7684\u4efb\u52a1 +header.my-tasks.description=\u6211\u7684\u4efb\u52a1 +header.my-workflows.label=\u6211\u542f\u52a8\u7684\u5de5\u4f5c\u6d41\u7a0b +header.my-workflows.description=\u6211\u542f\u52a8\u7684\u5de5\u4f5c\u6d41\u7a0b +header.people.label=\u4eba\u5458 +header.people.description=\u4eba\u5458 +header.replication-jobs.label=\u590d\u5236\u4f5c\u4e1a +header.replication-jobs.description=\u590d\u5236\u4f5c\u4e1a +header.repository.label=\u5b58\u50a8\u5e93 +header.repository.description=\u5b58\u50a8\u5e93 +header.trashcan.label=\u5783\u573e\u6876 +header.trashcan.description=\u6587\u4ef6\u6062\u590d\u4e0e\u5220\u9664\u5de5\u5177 +header.saved-searches.label=\u4fdd\u5b58\u7684\u641c\u7d22 +header.saved-searches.description=\u4fdd\u5b58\u7684\u641c\u7d22 +header.search.description=\u641c\u7d22\u9009\u9879... +header.sites.label=\u7ad9\u70b9 +header.sites.description=\u7ad9\u70b9 +header.submit-status.label=\u5171\u4eab +header.submit-status.description=\u5171\u4eab +header.tools.label=\u7ba1\u7406\u5de5\u5177... +header.tools.description=\u7ba1\u7406\u5de5\u5177... +# 0 = username, 1 = first name, 2 = last name, 3 = full name +header.user.label={3} +header.user.description={3} +header.users.label=\u7528\u6237 +header.users.description=\u7528\u6237 + +## Buttons +button.browse=\u6d4f\u89c8 +button.edit=\u7f16\u8f91 +button.save=\u4fdd\u5b58 +button.savechanges=\u4fdd\u5b58\u66f4\u6539 +button.saveandclose=\u4fdd\u5b58\u5e76\u5173\u95ed +button.upload=\u4e0a\u4f20 +button.login=\u767b\u5f55 +button.delete=\u5220\u9664 +button.take-ownership=\u786e\u5b9a +button.download=\u4e0b\u8f7d +button.clear=\u6e05\u9664 +button.reset=\u91cd\u7f6e +button.search=\u641c\u7d22 +button.update=\u66f4\u65b0 +button.goback=\u540e\u9000 +button.done=\u5b8c\u6210 +button.undo=\u64a4\u6d88 +button.new=\u65b0\u5efa +button.create=\u521b\u5efa +button.rename=\u91cd\u547d\u540d +button.refreshPage=\u5237\u65b0\u9875\u9762 +button.createanother=\u521b\u5efa\u5e76\u521b\u5efa\u53e6\u4e00\u4e2a +button.view.simple=\u7b80\u5355\u89c6\u56fe +button.view.detailed=\u8be6\u7ec6\u89c6\u56fe +button.view.gallery=\u56fe\u5e93\u89c6\u56fe +button.view.filmstrip=\u5e7b\u706f\u5f71\u7247\u89c6\u56fe +button.view.table=\u8868\u89c6\u56fe +button.view.media-table=\u5a92\u4f53\u89c6\u56fe +button.view.email=\u7535\u5b50\u90ae\u4ef6\u89c6\u56fe +button.view.audio=\u97f3\u9891\u89c6\u56fe +button.view.dublinCore=\u90fd\u67cf\u6797\u6838\u5fc3\u89c6\u56fe +button.view.effectivity=\u6709\u6548\u6027\u89c6\u56fe + +button.follow=\u5173\u6ce8 +button.unfollow=\u53d6\u6d88\u5173\u6ce8 +button.unsync=\u79fb\u9664\u540c\u6b65 + +## Messages +message.failure=\u5931\u8d25 +message.failure.workflow=\u7528\u6237 {0} \u6ca1\u6709\u8bbf\u95ee\u6b64\u4efb\u52a1\u7684\u6743\u9650\u3002 +message.loginfailure=\u767b\u5f55\u5931\u8d25 +message.loginautherror=\u60a8\u7684\u8eab\u4efd\u9a8c\u8bc1\u8be6\u7ec6\u4fe1\u606f\u5c1a\u672a\u8bc6\u522b\uff0c\u6216 Alfresco Content Services \u6b64\u65f6\u53ef\u80fd\u4e0d\u53ef\u7528\u3002 +message.passwordchangeauthfailed=\u8eab\u4efd\u9a8c\u8bc1\u8be6\u7ec6\u4fe1\u606f\u4e0d\u6b63\u786e\u6216\u65e0\u6743\u66f4\u6539\u5bc6\u7801\u3002 +message.login-portal=\u8bf7\u901a\u8fc7\u60a8\u7684\u95e8\u6237\u767b\u5f55\u3002 +message.unsavedChanges.blog=\u60a8\u7684\u535a\u5ba2\u5e16\u5b50\u6709\u5c1a\u672a\u4fdd\u5b58\u7684\u66f4\u6539\u3002 +message.unsavedChanges.comment=\u5c1a\u672a\u4fdd\u5b58\u60a8\u7684\u8bc4\u8bba\u3002 +message.unsavedChanges.discussion=\u60a8\u7684\u8ba8\u8bba\u4e3b\u9898\u6709\u5c1a\u672a\u4fdd\u5b58\u7684\u66f4\u6539\u3002 +message.unsavedChanges.reply=\u60a8\u7684\u4e3b\u9898\u56de\u590d\u6709\u5c1a\u672a\u4fdd\u5b58\u7684\u66f4\u6539\u3002 +message.unsavedChanges.wiki=\u60a8\u7684\u7ef4\u57fa\u6587\u7ae0\u6709\u5c1a\u672a\u4fdd\u5b58\u7684\u66f4\u6539\u3002 +message.searching=\u6b63\u5728\u641c\u7d22... +message.searchingFor=\u6b63\u5728\u641c\u7d22 ''{0}''... +message.minimum-length=\u81f3\u5c11\u8f93\u5165 {0} \u4e2a\u5b57\u7b26 +message.folders-trimmed=\u5217\u8868\u9650\u4e8e {0} \u4e2a\u6761\u76ee +message.item-missing=\u8bf7\u6c42\u7684\u9879\u65e0\u6cd5\u663e\u793a\uff0c\u56e0\u4e3a\u5df2\u4e0d\u5b58\u5728\u3002 +message.save.success=\u60a8\u7684\u66f4\u6539\u5df2\u4fdd\u5b58\u3002 +message.save.failure=\u60a8\u7684\u66f4\u6539\u65e0\u6cd5\u4fdd\u5b58\u3002 +message.cookiesfailure=\u5df2\u7981\u7528 Cookie +message.cookieserror=\u6d4f\u89c8\u5668\u4e2d\u5fc5\u987b\u542f\u7528 Cookie\u3002 +message.siteRedirect.noPages.manager=\u7ad9\u70b9\u7ba1\u7406\u5458\u5df2\u5173\u95ed\u6b64\u7ad9\u70b9\u7684\u6240\u6709\u529f\u80fd\u3002
\u5355\u51fb\u8bbe\u7f6e\u56fe\u6807   \u5e76\u9009\u62e9"\u81ea\u5b9a\u4e49\u7ad9\u70b9"\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u6216\u591a\u4e2a\u7ad9\u70b9\u529f\u80fd\u3002 +message.siteRedirect.noPages.user=\u7ad9\u70b9\u7ba1\u7406\u5458\u5df2\u5173\u95ed\u6b64\u7ad9\u70b9\u7684\u6240\u6709\u5df2\u529f\u80fd\u3002
\u67e5\u770b\u7ad9\u70b9\u6210\u5458\u4ee5\u67e5\u627e\u53ef\u6dfb\u52a0\u529f\u80fd\u5230\u7ad9\u70b9\u7684\u7ad9\u70b9\u7ba1\u7406\u5458\u3002 +message.logged-out=\u73b0\u5728\uff0c\u60a8\u5df2\u5b8c\u6210\u6ce8\u9500\u3002 +message.timeout=\u670d\u52a1\u5668\u8d85\u65f6\u3002 \u8bf7\u6c42\u65f6\u95f4\u592a\u957f\uff0c\u65e0\u6cd5\u5b8c\u6210\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002 +message.loading=\u52a0\u8f7d\u4e2d... +message.viewInCloud.failure=\u65e0\u6cd5\u68c0\u7d22 URL\u3002 \u68c0\u67e5\u540c\u6b65\u72b6\u6001\u3002 +message.logged-out=\u73b0\u5728\uff0c\u60a8\u5df2\u5b8c\u6210\u6ce8\u9500\u3002 + +## Common Text labels and CM model metadata +label.tags=\u6807\u8bb0 +label.none=\uff08\u65e0\uff09 +label.empty=\uff08\u7a7a\uff09 +label.about=\u5173\u4e8e +label.username=\u7528\u6237\u540d +label.password=\u5bc6\u7801 +label.copyright=© 2005-2023 Alfresco Software Inc\u3002\u4fdd\u7559\u6240\u6709\u6743\u5229\u3002 +label.name=\u540d\u79f0 +label.id=ID +label.title=\u6807\u9898 +label.description=\u8bf4\u660e +label.version=\u7248\u672c +label.firstname=\u540d\u5b57 +label.lastname=\u59d3\u6c0f +label.jobtitle=\u804c\u4f4d +label.location=\u4f4d\u7f6e +label.bio=\u6458\u8981 +label.photo=\u7167\u7247 +label.contactinfo=\u8054\u7cfb\u4fe1\u606f +label.skype=Skype +label.im=IM +label.googleusername=Google \u7528\u6237\u540d +label.company=\u516c\u53f8 +label.companyinfo=\u516c\u53f8\u8be6\u7ec6\u4fe1\u606f +label.companyname=\u540d\u79f0 +label.companyaddress=\u5730\u5740 +label.companytelephone=\u7535\u8bdd +label.companyfax=\u4f20\u771f +label.companyemail=\u7535\u5b50\u90ae\u4ef6 +label.companypostcode=\u90ae\u653f\u7f16\u7801 +label.email=\u7535\u5b50\u90ae\u4ef6 +label.telephone=\u7535\u8bdd +label.mobile=\u79fb\u52a8\u7535\u8bdd +label.fax=\u4f20\u771f +label.address=\u5730\u5740 +label.postcode=\u90ae\u653f\u7f16\u7801 +label.groups=\u7ec4 +label.yes=\u662f +label.no=\u5426 +label.ok=\u786e\u5b9a +label.loading=\u52a0\u8f7d\u4e2d... +label.validating=\u6b63\u5728\u9a8c\u8bc1... +label.validationError=\u65e0\u6cd5\u9a8c\u8bc1\u51ed\u636e\u3002 +label.site=\u7ad9\u70b9 +label.path=\u8def\u5f84 +label.type=\u7c7b\u578b +label.creator=\u521b\u5efa\u8005 +label.created=\u521b\u5efa\u65f6\u95f4 +label.modifier=\u4fee\u6539\u8005 +label.modified=\u4fee\u6539\u65f6\u95f4 +label.author=\u4f5c\u8005 +label.priority={0} \u4f18\u5148\u7ea7 +label.size=\u5927\u5c0f +label.mimetype=MIME \u7c7b\u578b +label.mimetype.unknown=\u672a\u77e5 +label.popularity=\u70ed\u95e8\u7a0b\u5ea6 +label.avatar=\u7528\u6237\u6807\u8bc6\u56fe +label.editType=\u7f16\u8f91\uff1a {0} +label.moreInfo=\u66f4\u591a\u4fe1\u606f > +label.actions.column.header=\u64cd\u4f5c +# Dictionary Model +label.modelActive=\u6d3b\u8dc3 +label.modelName=\u6a21\u578b\u540d\u79f0 +label.modelDescription=\u6a21\u578b\u8bf4\u660e +# Transfer Targets +label.trx_enabled=\u5df2\u542f\u7528 +label.trx_endpointhost=\u8f6c\u79fb\u5230\u4e3b\u673a +label.trx_endpointport=\u7aef\u53e3 +label.you=\u60a8 +label.licensedTo=\u6388\u6743\u7ed9\uff1a + +## Location +location.tooltip.path=\u8def\u5f84\uff1a {0} +location.tooltip.site=\u7ad9\u70b9\uff1a {0} +location.path.repository=\u5b58\u50a8\u5e93 +location.path.documents=\u6587\u6863 +location.path.userHome=\u6211\u7684\u7528\u6237\u4e3b\u9875 +location.path.myfiles=\u6211\u7684\u6587\u4ef6 +location.path.shared=\u5171\u4eab\u6587\u4ef6 +location.label.none=\uff08\u65e0\uff09 +location.label.local={0} +location.label.site={1} \u4e2d\u7684 {0} +location.label.repository={0} + +## EXIF +label.exif.width=\u5bbd\u5ea6 +label.exif.height=\u9ad8\u5ea6 + +## Pagination +pagination.template={CurrentPageReport}   {PreviousPageLink} {PageLinks} {NextPageLink} +pagination.template.page-report={startRecord} - {endRecord} \u4e2a\uff08\u5171 {totalRecords} \u4e2a\uff09 +pagination.template.page-report.more=\u6b63\u5728\u663e\u793a\u7b2c {startRecord} - {endRecord} \u9879\uff08\u5171 {totalRecords} \u9879\uff09++ +pagination.previousPageLinkLabel=<< +pagination.nextPageLinkLabel=>> + +## Tiny Pagination (used in column browser) +tinyPagination.firstPageLinkLabel=<< +tinyPagination.lastPageLinkLabel=>> +tinyPagination.previousPageLinkLabel=< +tinyPagination.nextPageLinkLabel=> +tinyPagination.pageReportTemplate=\uff08\u7b2c {currentPage} \u9875\uff08\u5171 {totalPages} \u9875\uff09\uff09 +tinyPagination.template={FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} + +## Themes +theme.lightTheme=\u7070\u767d\u4e3b\u9898 +theme.default=\u84dd\u8272\u4e3b\u9898 +theme.greenTheme=\u7eff\u8272\u4e3b\u9898 +theme.hcBlack=\u9ad8\u5bf9\u6bd4\u5ea6\u4e3b\u9898 +theme.yellowTheme=\u9ec4\u8272\u4e3b\u9898 +theme.gdocs=Google Docs \u4e3b\u9898 + +## Admin console tools +tool.users.label=\u7528\u6237 +tool.users.description=\u7528\u6237\u7ba1\u7406 +tool.groups.label=\u7ec4 +tool.groups.description=\u7ec4\u7ba1\u7406 +tool.application.label=\u5e94\u7528\u7a0b\u5e8f +tool.application.description=\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u4e0e\u7ba1\u7406 +tool.replication-jobs.label=\u590d\u5236\u4f5c\u4e1a +tool.replication-jobs.description=\u590d\u5236\u4f5c\u4e1a\u7ba1\u7406 +tool.repository.label=\u5b58\u50a8\u5e93\u5de5\u5177 +tool.repository.description=\u5b58\u50a8\u5e93\u5de5\u5177 +tool.tag-management.label=\u6807\u8bb0\u7ba1\u7406\u5668 +tool.tag-management.description=\u6807\u8bb0\u7ba1\u7406\u5668 +tool.workflow.label=\u5de5\u4f5c\u6d41\u7a0b +tool.workflow.description=\u5de5\u4f5c\u6d41\u7a0b\u5de5\u5177 +tool.trashcan.label=\u5783\u573e\u6876 +tool.trashcan.description=\u6587\u4ef6\u6062\u590d\u4e0e\u5220\u9664\u5de5\u5177 +tool.email-inbound.label=\u7535\u5b50\u90ae\u4ef6\uff08\u5165\u7ad9\uff09 +tool.email-inbound.description=\u7535\u5b50\u90ae\u4ef6\uff08\u5165\u7ad9\uff09 +tool.email-outbound.label=\u7535\u5b50\u90ae\u4ef6\uff08\u51fa\u7ad9\uff09 +tool.email-outbound.description=\u7535\u5b50\u90ae\u4ef6\uff08\u51fa\u7ad9\uff09 +tool.email-imap.label=\u7535\u5b50\u90ae\u4ef6 (IMAP) +tool.email-imap.description=\u7535\u5b50\u90ae\u4ef6 (IMAP) +tool.runtime.label=\u8fd0\u884c\u65f6 +tool.runtime.description=\u8fd0\u884c\u65f6 +tool.repository-server.label=\u5b58\u50a8\u5e93\u63cf\u8ff0\u7b26\uff08\u5f53\u524d\uff09 +tool.repository-server.description=\u5b58\u50a8\u5e93\u63cf\u8ff0\u7b26\uff08\u5f53\u524d\uff09 +tool.repository-installed.label=\u5b58\u50a8\u5e93\u63cf\u8ff0\u7b26\uff08\u539f\u59cb\u5b89\u88c5\uff09 +tool.repository-installed.description=\u5b58\u50a8\u5e93\u63cf\u8ff0\u7b26\uff08\u539f\u59cb\u5b89\u88c5\uff09 +tool.authority.label=\u6388\u6743 +tool.authority.description=\u6388\u6743 +tool.license.label=\u8bb8\u53ef\u8bc1\u63cf\u8ff0\u7b26 +tool.license.description=\u8bb8\u53ef\u8bc1\u63cf\u8ff0\u7b26 +tool.license.link=\u7ba1\u7406\u6211\u7684\u8ba2\u9605 +tool.license.usageinfo.label=\u8bb8\u53ef\u8bc1\u4f7f\u7528\u4fe1\u606f +tool.ooojodconverter.label=OOoJodConverter +tool.ooojodconverter.description=OOoJodConverter +tool.openoffice-subsystem.label=OpenOffice \u7cfb\u7edf +tool.openoffice-subsystem.description=OpenOffice \u7cfb\u7edf +tool.openoffice.label=OpenOffice +tool.openoffice.description=OpenOffice +tool.transformer-pdf2swf.label=\u8f6c\u6362\u5668 pdf2swf +tool.transformer-pdf2swf.description=\u8f6c\u6362\u5668 pdf2swf +tool.transformer-imagemagick.label=\u8f6c\u6362\u5668 ImageMagick +tool.transformer-imagemagick.description=\u8f6c\u6362\u5668 ImageMagick +tool.fileservers.label=\u6587\u4ef6\u670d\u52a1\u5668 +tool.fileservers.description=\u6587\u4ef6\u670d\u52a1\u5668 +tool.subscriptions.label=\u8ba2\u9605 +tool.subscriptions.description=\u8ba2\u9605 +tool.sysadmin.label=\u7cfb\u7edf\u7ba1\u7406\u5458 +tool.sysadmin.description=\u7cfb\u7edf\u7ba1\u7406\u5458 +tool.activities.label=\u6d3b\u52a8\u8ba2\u9605\u6e90 +tool.activities.description=\u6d3b\u52a8\u8ba2\u9605\u6e90 +tool.workflow.label=\u5de5\u4f5c\u6d41\u7a0b +tool.workflow.description=\u5de5\u4f5c\u6d41\u7a0b +tool.manage-sites.label=\u7ad9\u70b9\u7ba1\u7406\u5458 +tool.manage-sites.description=\u7ad9\u70b9\u7ba1\u7406\u5458 +tool.cloud-sync-management.label=\u4e91\u540c\u6b65\u7ba1\u7406\u5668 +tool.cloud-sync-management.description=\u4e91\u540c\u6b65\u7ba1\u7406\u5668 +tool.search-manager.label=\u641c\u7d22\u7ba1\u7406\u5668 +tool.search-manager.description=\u641c\u7d22\u7ba1\u7406\u5668 + +## Admin console tool groups +tool.group.usersgroups=\u7528\u6237\u548c\u7ec4 +tool.group.email=\u7535\u5b50\u90ae\u4ef6 +tool.group.transformations=\u8f6c\u6362 +tool.group.filemanagement=\u6587\u4ef6\u7ba1\u7406 +tool.group.subscriptions=\u8ba2\u9605 +tool.group.repository=\u5b58\u50a8\u5e93 +tool.group.search=\u641c\u7d22 +tool.group.site=\u7ad9\u70b9 + + +## Page titles displayed in browsers header bar +page.acceptInvite.title=\u63a5\u53d7\u9080\u8bf7 +page.acceptInvite.description=\u63a5\u53d7\u9080\u8bf7\u9875\u9762\u3002 \u52a0\u8f7d\u6b64\u9875\u9762\u4f1a\u5bfc\u81f4\u63a5\u53d7\u7ad9\u70b9\u9080\u8bf7\uff0c\u5e76\u542f\u7528\u4ecd\u7981\u7528\u7684\u7528\u6237\u5e10\u6237 +page.addGroups.title=\u6dfb\u52a0\u7ec4 +page.addGroups.description=\u6dfb\u52a0\u7ec4 +page.add-users.title=\u6dfb\u52a0\u7528\u6237 +page.add-users.description=\u5c06\u7528\u6237\u6dfb\u52a0\u5230\u4e00\u4e2a\u7ad9\u70b9 +page.adminConsole.title=\u7ba1\u7406\u5de5\u5177 +page.adminConsole.description=\u7ba1\u7406\u63a7\u5236\u53f0 +page.advsearch.title=\u9ad8\u7ea7\u641c\u7d22 +page.advsearch.description=\u9ad8\u7ea7\u641c\u7d22 \u89c6\u56fe +page.blogCreateEdit.title=\u535a\u5ba2\uff1a \u521b\u5efa\u6216\u7f16\u8f91\u535a\u5ba2\u5e16\u5b50 +page.blogCreateEdit.description=\u663e\u793a\u7a97\u4f53\u4ee5\u521b\u5efa\u6216\u7f16\u8f91\u5e16\u5b50 +page.blogPostList.title=\u535a\u5ba2 +page.blogPostList.description=\u663e\u793a\u535a\u5ba2\u5e16\u5b50 +page.blogPostView.title=\u535a\u5ba2\uff1a \u663e\u793a\u5e16\u5b50\u8be6\u7ec6\u4fe1\u606f\u89c6\u56fe +page.blogPostView.description=\u663e\u793a\u5e16\u5b50\u8be6\u7ec6\u4fe1\u606f\u89c6\u56fe +page.calendar.title=\u65e5\u5386 +page.calendar.description=\u7ad9\u70b9\u65e5\u5386\u7ec4\u4ef6 +page.changePassword.title=\u66f4\u6539\u7528\u6237\u5bc6\u7801 +page.changePassword.description=\u7528\u6237\u4e2a\u4eba\u6863\u6848\u9875\u9762\u4e0a\u7684\u66f4\u6539\u5bc6\u7801\u90e8\u5206 +page.contentViewer.title=\u5185\u5bb9\u67e5\u770b\u5668 +page.contentViewer.description=\u7528\u4e8e\u67e5\u770b\u8282\u70b9\u5f15\u7528\u5185\u5bb9\u7684\u9875\u9762 +page.createContent.title=\u521b\u5efa\u5185\u5bb9 +page.createContent.description=\u521b\u5efa\u57fa\u4e8e\u6587\u672c\u7684\u5185\u5bb9 +page.createEditReplicationJob.title=\u590d\u5236\u4f5c\u4e1a +page.createEditReplicationJob.description=\u65b0\u5efa\u590d\u5236\u4f5c\u4e1a\u6216\u7f16\u8f91\u73b0\u6709\u590d\u5236\u4f5c\u4e1a +page.customiseSite.title=\u5b9a\u5236\u7ad9\u70b9 +page.customiseSite.description=\u5728\u7ad9\u70b9\u4e2d\u6dfb\u52a0\u6216\u79fb\u9664\u9875\u9762 +page.customiseSiteDashboard.title=\u5b9a\u5236\u7ad9\u70b9\u4eea\u8868\u677f +page.customiseSiteDashboard.description=\u5b9a\u5236\u7ad9\u70b9\u4eea\u8868\u677f\u7684\u4eea\u8868\u677f\u5e03\u5c40\u548c Dashlet +page.customiseUserDashboard.title=\u5b9a\u5236\u7528\u6237\u4eea\u8868\u677f +page.customiseUserDashboard.description=\u5b9a\u5236\u7528\u6237\u4eea\u8868\u677f\u7684\u4eea\u8868\u677f\u5e03\u5c40\u548c Dashlet +page.data-lists.title=\u6570\u636e\u5217\u8868 +page.data-lists.description=\u6570\u636e\u5217\u8868\u9875\u9762 +page.discussionsCreateTopic.title=\u8ba8\u8bba\uff1a \u67e5\u770b\u521b\u5efa\u4e3b\u9898\u9875\u9762 +page.discussionsCreateTopic.description=\u663e\u793a\u7528\u4e8e\u521b\u5efa\u4e3b\u9898\u7684\u7a97\u4f53 +page.discussionsTopicList.title=\u8ba8\u8bba +page.discussionsTopicList.description=\u663e\u793a\u8bba\u575b\u4e3b\u9898 +page.discussionsTopicView.title=\u8ba8\u8bba\uff1a \u663e\u793a\u4e3b\u9898\u8be6\u7ec6\u4fe1\u606f\u89c6\u56fe +page.discussionsTopicView.description=\u663e\u793a\u4e3b\u9898\u8be6\u7ec6\u4fe1\u606f\u89c6\u56fe +page.documentDetails.title=\u6587\u6863\u8be6\u7ec6\u4fe1\u606f +page.documentDetails.description=\u6587\u6863\u8be6\u7ec6\u4fe1\u606f +page.documentLibrary.title=\u6587\u6863\u5e93 +page.documentLibrary.description=\u6811\u89c6\u56fe\u683c\u5f0f\u7684\u6587\u6863\u5e93 +page.editMetadata.title=\u7f16\u8f91\u5c5e\u6027 +page.editMetadata.description=\u7f16\u8f91\u8282\u70b9\u7684\u5c5e\u6027 +page.folderDetails.title=\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f +page.folderDetails.description=\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f +page.folderRules.title=\u6587\u4ef6\u5939\u89c4\u5219 +page.folderRules.description=\u6587\u4ef6\u5939\u89c4\u5219 +page.geographicMap.title=Google \u5730\u56fe\u89c6\u56fe +page.geographicMap.description=\u5728 Google \u5730\u56fe\u4e2d\u67e5\u770b\u7167\u7247\u4f4d\u7f6e +page.inlineEdit.title=\u5728 Alfresco Share \u4e2d\u7f16\u8f91 +page.inlineEdit.description=\u5728 Alfresco Share \u4e2d\u7f16\u8f91\u6587\u672c\u6587\u4ef6 +page.invite.title=\u9080\u8bf7 +page.invite.description=\u9080\u8bf7 +page.links.title=\u94fe\u63a5 +page.links.description=\u94fe\u63a5 +page.linkCreateEdit.title=\u94fe\u63a5\uff1a \u521b\u5efa\u6216\u7f16\u8f91\u94fe\u63a5 +page.linkCreateEdit.description=\u663e\u793a\u7a97\u4f53\u4ee5\u521b\u5efa\u6216\u7f16\u8f91\u94fe\u63a5 +page.linksView.title=\u94fe\u63a5\uff1a \u663e\u793a\u94fe\u63a5\u8be6\u7ec6\u4fe1\u606f\u89c6\u56fe +page.linksView.description=\u663e\u793a\u94fe\u63a5\u8be6\u7ec6\u4fe1\u606f\u89c6\u56fe +page.login.title=\u767b\u5f55 +page.logout.title=\u6ce8\u9500 +page.managePermissions.title=\u7ba1\u7406\u6743\u9650 +page.managePermissions.description=\u7ba1\u7406\u6743\u9650 +page.myFiles.title=\u6211\u7684\u6587\u4ef6 +page.myFiles.description=\u6d4f\u89c8\u6211\u7684\u6587\u4ef6 +page.myDocumentLibraries.title=\u6211\u7684\u6587\u6863\u5e93 +page.myDocumentLibraries.description=\u6211\u7684\u6587\u6863\u5e93\u542f\u52a8\u9875 +page.myTasks.title=\u6211\u7684\u4efb\u52a1 +page.myTasks.description=\u6d3b\u52a8\u548c\u5df2\u5b8c\u6210\u4efb\u52a1\u5217\u8868\u3002 +page.myWorkflows.title=\u6211\u542f\u52a8\u7684\u5de5\u4f5c\u6d41\u7a0b +page.myWorkflows.description=\u6211\u542f\u52a8\u7684\u5de5\u4f5c\u6d41\u7a0b\u9875\u9762 +page.pendingInvites.title=\u5f85\u51b3 +page.pendingInvites.description=\u5f85\u51b3\u9080\u8bf7\u548c\u52a0\u5165\u8bf7\u6c42 +page.peopleFinder.title=\u4eba\u5458\u67e5\u627e\u5668 +page.peopleFinder.description=\u4eba\u5458\u67e5\u627e\u5668\u9875\u9762 +page.profile.title=\u7528\u6237\u4e2a\u4eba\u6863\u6848\u9875\u9762 +page.profile.description=\u7528\u6237\u7684\u4e2a\u4eba\u6863\u6848\u9875\u9762 +page.rejectInvite.title=\u62d2\u7edd\u9080\u8bf7 +page.rejectInvite.description=\u62d2\u7edd\u9080\u8bf7\u9875\u9762\u3002 \u62d2\u7edd\u9080\u8bf7\u8bf7\u6c42 +page.repository.title=\u5b58\u50a8\u5e93\u6d4f\u89c8\u5668 +page.repository.description=\u5728\u6574\u4e2a\u5b58\u50a8\u5e93\u5185\u6d4f\u89c8\u5185\u5bb9 +page.ruleEdit.title=\u6587\u4ef6\u5939\u89c4\u5219 +page.ruleEdit.description=\u521b\u5efa\u6216\u7f16\u8f91\u6587\u4ef6\u5939\u7684\u89c4\u5219\u3002 +page.search.title=\u641c\u7d22 +page.search.description=\u641c\u7d22\u89c6\u56fe +page.sharedFiles.title=\u5171\u4eab\u6587\u4ef6 +page.sharedFiles.description=\u6d4f\u89c8\u5171\u4eab\u6587\u4ef6 +page.siteConsole.title=\u7ad9\u70b9\u7ba1\u7406\u5458 +page.siteConsole.description=\u7ad9\u70b9\u7ba1\u7406\u5458\u9875\u9762 - \u7ad9\u70b9\u7ba1\u7406\u5de5\u5177 +page.siteFinder.title=\u7ad9\u70b9\u67e5\u627e\u5668 +page.siteFinder.description=\u7ad9\u70b9\u67e5\u627e\u5668\u9875\u9762 +page.siteIndex.title=\u6b22\u8fce +page.siteIndex.description=\u7528\u6237\u7684\u767b\u5f55\u9875\u9762 - \u5c06\u6839\u636e\u9700\u8981\u521b\u5efa\u7528\u6237\u7ad9\u70b9\u4eea\u8868\u677f\u5e76\u8f6c\u53d1\u5230\u6b64\u4eea\u8868\u677f +page.siteGroups.title=\u7ad9\u70b9\u7ec4 +page.siteGroups.description=\u7ad9\u70b9\u7ec4 +page.siteMembers.title=\u7ad9\u70b9\u6210\u5458 +page.siteMembers.description=\u7ad9\u70b9\u6210\u5458 +page.startWorkflow.title=\u542f\u52a8\u5de5\u4f5c\u6d41\u7a0b +page.startWorkflow.description=\u542f\u52a8\u65b0\u5de5\u4f5c\u6d41\u7a0b +page.taskDetails.title=\u4efb\u52a1\u8be6\u7ec6\u4fe1\u606f +page.taskDetails.description=\u663e\u793a\u8be6\u7ec6\u4efb\u52a1\u4fe1\u606f\u7684\u9875\u9762 +page.taskEdit.title=\u7f16\u8f91\u4efb\u52a1 +page.taskEdit.description=\u7f16\u8f91\u4efb\u52a1\u8be6\u7ec6\u4fe1\u606f\u7684\u9875\u9762 +page.userContent.title=\u7528\u6237\u7f16\u8f91\u7684\u5185\u5bb9 +page.userContent.description=\u5217\u51fa\u7528\u6237\u6700\u8fd1\u7f16\u8f91\u7684\u5185\u5bb9 +page.userFollowers.title=\u5173\u6ce8\u8005 +page.userFollowers.description=\u5217\u51fa\u5173\u6ce8\u6b64\u7528\u6237\u7684\u4eba\u5458 +page.userFollowing.title=\u5173\u6ce8 +page.userFollowing.description=\u5217\u51fa\u6b64\u7528\u6237\u5173\u6ce8\u7684\u4eba\u5458 +page.userNotifications.title=\u7528\u6237\u901a\u77e5\u8bbe\u7f6e +page.userNotifications.description=\u7528\u6237\u4e2a\u4eba\u6863\u6848\u9875\u9762\u4e0a\u7684\u66f4\u6539\u901a\u77e5\u8bbe\u7f6e\u90e8\u5206 +page.userCloudAuth.title=\u7528\u6237\u4e91\u8eab\u4efd\u9a8c\u8bc1 +page.userCloudAuth.description=\u66f4\u6539\u4e91\u8eab\u4efd\u9a8c\u8bc1\u8be6\u7ec6\u4fe1\u606f +page.userSites.title=\u7528\u6237\u7ad9\u70b9\u5217\u8868 +page.userSites.description=\u5217\u51fa\u7528\u6237\u6240\u5c5e\u7684\u7ad9\u70b9 +page.userTrashcan.title=\u7528\u6237\u5783\u573e\u6876 +page.userTrashcan.description=\u5f53\u524d\u7528\u6237\u5df2\u5220\u9664\u7684\u6587\u6863\u548c\u6587\u4ef6\u5939\u5217\u8868 +page.wiki.title=\u7ef4\u57fa +page.wiki.description=\u7ef4\u57fa\u7684\u767b\u5f55\u9875\u9762 +page.wikiCreate.title=\u7ef4\u57fa\u521b\u5efa\u7a97\u4f53 +page.wikiCreate.description=\u663e\u793a\u7528\u4e8e\u65b0\u5efa\u7ef4\u57fa\u9875\u9762\u7684\u7a97\u4f53 +page.wikiPage.title=\u7ef4\u57fa +page.wikiPage.description=\u663e\u793a\u7ef4\u57fa\u9875\u9762 +page.workspace.title=\u6587\u6863\u5de5\u4f5c\u7a7a\u95f4\u4eea\u8868\u677f +page.workspace.description=\u6587\u6863\u5de5\u4f5c\u7a7a\u95f4\u4eea\u8868\u677f\u9875\u9762 +page.workflowDetails.title=\u5de5\u4f5c\u6d41\u7a0b\u8be6\u7ec6\u4fe1\u606f +page.workflowDetails.description=\u5de5\u4f5c\u6d41\u7a0b\u8be6\u7ec6\u4fe1\u606f\u9875\u9762 + +## Dashboard page titles and descriptions +page.siteDashboard.title=\u7ad9\u70b9\u4eea\u8868\u677f +page.siteDashboard.description=\u5408\u4f5c\u7ad9\u70b9\u7684\u4eea\u8868\u677f\u9875\u9762 +page.userDashboard.title=\u7528\u6237\u4eea\u8868\u677f +page.userDashboard.description=\u7528\u6237\u4eea\u8868\u677f\u9875\u9762 +page.meeting_workspace.title=\u4f1a\u8bae\u5de5\u4f5c\u7a7a\u95f4\u4eea\u8868\u677f +page.meeting_workspace.description=\u4f1a\u8bae\u5de5\u4f5c\u7a7a\u95f4\u4eea\u8868\u677f\u9875\u9762 + +page.error.500.title=Alfresco Share » \u7cfb\u7edf\u9519\u8bef +page.error.500.header=\u6b64\u9875\u9762\u51fa\u4e86\u95ee\u9898... +page.error.500.detail=

\u6211\u4eec\u53ef\u80fd\u9047\u5230\u4e86\u4e00\u4e2a\u9519\u8bef\u6216\u53ef\u80fd\u79fb\u9664\u6216\u5220\u9664\u4e86\u4ec0\u4e48\uff0c\u56e0\u6b64\u8bf7\u68c0\u67e5 URL \u662f\u5426\u6b63\u786e\u3002

\u6216\u8005\uff0c\u60a8\u53ef\u80fd\u6ca1\u6709\u67e5\u770b\u8be5\u9875\u9762\u7684\u6743\u9650\uff08\u53ef\u80fd\u5728\u79c1\u4eba\u7ad9\u70b9\u4e0a\uff09\u6216\u53ef\u80fd\u51fa\u73b0\u4e86\u5185\u90e8\u9519\u8bef\u3002\u5c1d\u8bd5\u4e0e\u60a8\u7684 IT \u56e2\u961f\u6838\u5b9e\u3002

\u5982\u679c\u60a8\u8981\u8fdb\u5165\u4e3b\u9875\u4f46\u5176\u4e0d\u518d\u53ef\u7528\uff0c\u60a8\u5e94\u8be5\u5355\u51fb\u5de5\u5177\u680f\u4e0a\u60a8\u7684\u540d\u5b57\u5bf9\u5176\u8fdb\u884c\u66f4\u6539\u3002

+page.error.500.nav.dashboard=\u8fd4\u56de\u6211\u7684\u4eea\u8868\u677f +page.error.500.footer=Alfresco Software Inc. © 2005-2023 \u4fdd\u7559\u6240\u6709\u6743\u5229\u3002 + +## Title bar component titles for pages that use the simple-title component +title.repository=\u5b58\u50a8\u5e93 +title.browser=\u6d4f\u89c8\u5668 +title.siteFinder=\u7ad9\u70b9\u67e5\u627e\u5668 +title.peopleFinder=\u4eba\u5458\u67e5\u627e\u5668 +title.myTasks=\u6211\u7684\u4efb\u52a1 + +## Site Visibility +site.visibility.label.PUBLIC=\u516c\u5f00 +site.visibility.label.MODERATED=\u7ecf\u5ba1\u6838 +site.visibility.label.PRIVATE=\u79c1\u6709 +site.visibility.description.PUBLIC=\u60a8\u7ec4\u7ec7\u4e2d\u7684\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u6b64\u7ad9\u70b9\u3002 +site.visibility.description.MODERATED=\u60a8\u7ec4\u7ec7\u4e2d\u7684\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u67e5\u627e\u6b64\u7ad9\u70b9\u5e76\u8bf7\u6c42\u8bbf\u95ee\u3002 \u7ad9\u70b9\u7ba1\u7406\u5458\u6388\u4e88\u8bbf\u95ee\u6743\u9650. +site.visibility.description.PRIVATE=\u4ec5\u7ad9\u70b9\u7ba1\u7406\u5458\u6dfb\u52a0\u7684\u4eba\u5458\u53ef\u4ee5\u67e5\u627e\u548c\u4f7f\u7528\u6b64\u7ad9\u70b9\u3002 + +## Roles +role.SiteManager=\u7ba1\u7406\u5458 +role.SiteManager.description=\u6709\u7ba1\u7406\u6240\u6709\u7ad9\u70b9\u5185\u5bb9\u7684\u5168\u90e8\u6743\u9650 - \u4ed6\u4eec\u81ea\u5df1\u521b\u5efa\u7684\u5185\u5bb9\u548c\u5176\u4ed6\u7ad9\u70b9\u6210\u5458\u521b\u5efa\u7684\u5185\u5bb9\u3002 +role.Collaborator=\u5408\u4f5c\u8005 +role.Collaborator.description=\u6709\u7ba1\u7406\u4ed6\u4eec\u6240\u62e5\u6709\u5185\u5bb9\u7684\u5168\u90e8\u6743\u9650\uff1b\u4ed6\u4eec\u6709\u6743\u7f16\u8f91\u4f46\u4e0d\u80fd\u5220\u9664\u4ed6\u4eba\u521b\u5efa\u7684\u5185\u5bb9\u3002 +role.SiteCollaborator=\u5408\u4f5c\u8005 +role.SiteCollaborator.description=\u6709\u7ba1\u7406\u4ed6\u4eec\u6240\u62e5\u6709\u7ad9\u70b9\u5185\u5bb9\u7684\u5168\u90e8\u6743\u9650\uff1b\u4ed6\u4eec\u6709\u6743\u7f16\u8f91\u4f46\u4e0d\u80fd\u5220\u9664\u5176\u4ed6\u7ad9\u70b9\u6210\u5458\u521b\u5efa\u7684\u5185\u5bb9\u3002 +role.Contributor=\u8d21\u732e\u8005 +role.Contributor.description=\u6709\u7ba1\u7406\u4ed6\u4eec\u6240\u62e5\u6709\u5185\u5bb9\u7684\u5168\u90e8\u6743\u9650\uff1b\u4ed6\u4eec\u4e0d\u80fd\u7f16\u8f91\u6216\u5220\u9664\u4ed6\u4eba\u521b\u5efa\u7684\u5185\u5bb9\u3002 +role.SiteContributor=\u8d21\u732e\u8005 +role.SiteContributor.description=\u6709\u7ba1\u7406\u4ed6\u4eec\u6240\u62e5\u6709\u7ad9\u70b9\u5185\u5bb9\u7684\u5168\u90e8\u6743\u9650\uff1b\u4ed6\u4eec\u4e0d\u80fd\u7f16\u8f91\u6216\u5220\u9664\u5176\u4ed6\u7ad9\u70b9\u6210\u5458\u521b\u5efa\u7684\u5185\u5bb9\u3002 +role.Consumer=\u4f7f\u7528\u8005 +role.Consumer.description=\u53ea\u6709\u67e5\u770b\u6743\u9650\uff1b\u4ed6\u4eec\u4e0d\u80fd\u521b\u5efa\u81ea\u5df1\u7684\u5185\u5bb9\u3002 +role.SiteConsumer=\u4f7f\u7528\u8005 +role.SiteConsumer.description=\u53ea\u6709\u5728\u7ad9\u70b9\u4e2d\u67e5\u770b\u7684\u6743\u9650\uff1b\u4ed6\u4eec\u4e0d\u80fd\u521b\u5efa\u81ea\u5df1\u7684\u5185\u5bb9\u3002 +role.Coordinator=\u534f\u8c03\u8005 +role.Coordinator.description=\u6709\u7ba1\u7406\u6240\u6709\u5185\u5bb9\u7684\u5168\u90e8\u6743\u9650 - \u4ed6\u4eec\u81ea\u5df1\u521b\u5efa\u7684\u5185\u5bb9\u548c\u4ed6\u4eba\u521b\u5efa\u7684\u5185\u5bb9\u3002 +role.Editor=\u7f16\u8f91\u8005 +role.Editor.description=\u6709\u7f16\u8f91\u6587\u4ef6\u5c5e\u6027\u548c\u7b7e\u5165\u53ca\u7b7e\u51fa\u6587\u4ef6\u7684\u6743\u9650\uff1b\u4ed6\u4eec\u4e0d\u80fd\u521b\u5efa\u81ea\u5df1\u7684\u5185\u5bb9\u3002 + +roles.readassociations=\u4f7f\u7528\u8005 + +roles-tooltip.header=\u5173\u4e8e\u89d2\u8272 +roles-tooltip.docs-url-label=\u67e5\u770b\u66f4\u591a +roles-tooltip.docs-url=http://docs.alfresco.com/{0}/references/permissions_share.html + +share-help.docs-url=http://docs.alfresco.com/{0}/topics/sh-uh-welcome.html +share-tutorial.docs-url=http://docs.alfresco.com/{0}/topics/alfresco-video-tutorials.html + +## Tag Library +taglibrary.tags=\u6807\u8bb0 +taglibrary.populartagslink=\u4ece\u672c\u7ad9\u70b9\u4e2d\u7684\u70ed\u95e8\u6807\u8bb0\u9009\u62e9 +taglibrary.msg.failedLoadTags=\u65e0\u6cd5\u4ece\u670d\u52a1\u5668\u52a0\u8f7d\u6807\u8bb0\uff08\u8fde\u63a5\u662f\u5426\u5df2\u65ad\u5f00\uff1f\uff09 +taglibrary.msg.unableLoadTags=\u65e0\u6cd5\u52a0\u8f7d\u6807\u8bb0\uff1a {0} +taglibrary.tip.removeTag=\u79fb\u9664\u6807\u8bb0 +taglibrary.tip.help=\u4f7f\u7528\u7a7a\u683c\u5206\u9694\u6807\u8bb0\u3002 \u4f7f\u7528"\u53cc\u5f15\u53f7"\u8fde\u63a5\u4e24\u4e2a\u6216\u591a\u4e2a\u5355\u8bcd + +## YUI Editor keys +yuieditor.toolbar.group.font=\u5b57\u578b +yuieditor.toolbar.group.lists=\u5217\u8868 +yuieditor.toolbar.group.link=\u94fe\u63a5 +yuieditor.toolbar.item.createorderedlist=\u521b\u5efa\u6709\u5e8f\u5217\u8868 +yuieditor.toolbar.item.createunorderedlist=\u521b\u5efa\u65e0\u5e8f\u5217\u8868 +yuieditor.toolbar.item.fontcolor=\u5b57\u4f53\u989c\u8272 +yuieditor.toolbar.item.backgroundcolor=\u80cc\u666f\u8272 +yuieditor.toolbar.item.bold=\u52a0\u7c97\uff1aCTRL + SHIFT + B \u952e +yuieditor.toolbar.item.italic=\u659c\u4f53\uff1aCTRL + SHIFT + I \u952e +yuieditor.toolbar.item.underline=\u52a0\u4e0b\u5212\u7ebf\uff1aCTRL + SHIFT + U \u952e +yuieditor.toolbar.item.link=HTML \u94fe\u63a5\uff1aCTRL + SHIFT + L \u952e + +## Document Library Drop-down Menus +menu.select=\u9009\u62e9 +menu.select.all=\u5168\u90e8 +menu.select.none=\u65e0 +menu.select.invert=\u53cd\u9009 +menu.select.folders=\u6587\u4ef6\u5939 +menu.select.documents=\u6587\u6863 + +## Document Library Drop-down Action Menus +menu.create-content.by-template-node=\u4ece\u6a21\u677f\u521b\u5efa\u6587\u6863 +menu.create-content.by-template-folder=\u4ece\u6a21\u677f\u521b\u5efa\u6587\u4ef6\u5939 +menu.selected-items=\u5df2\u9009\u62e9\u9879... +menu.selected-items.copy=\u590d\u5236\u5230... +menu.selected-items.move=\u79fb\u52a8\u5230... +menu.selected-items.delete=\u5220\u9664 +menu.selected-items.download=\u4ee5 Zip \u683c\u5f0f\u4e0b\u8f7d +menu.selected-items.assign-workflow=\u542f\u52a8\u5de5\u4f5c\u6d41\u7a0b... +menu.selected-items.manage-permissions=\u7ba1\u7406\u6743\u9650... +menu.selected-items.deselect-all=\u53d6\u6d88\u5168\u9009 +menu.selected-items.cloudSync=\u540c\u6b65\u5230\u4e91\u7aef +menu.selected-items.cloudUnsync=\u53d6\u6d88\u4e91\u7aef\u540c\u6b65 +menu.selected-items.cloudRequestSync=\u8bf7\u6c42\u540c\u6b65 + +## Document Library Actions +actions.document.assign-workflow=\u542f\u52a8\u5de5\u4f5c\u6d41\u7a0b +actions.document.cancel-editing=\u53d6\u6d88\u7f16\u8f91 +actions.document.cancel-editing-unlock=\u89e3\u9501\u6587\u6863 +actions.document.change-type=\u66f4\u6539\u7c7b\u578b +actions.document.copy-to=\u590d\u5236\u5230... +actions.document.delete=\u5220\u9664\u6587\u6863 +actions.document.download=\u4e0b\u8f7d +actions.document.download-again=\u4e0b\u8f7d +actions.document.download-original=\u4e0b\u8f7d\u539f\u59cb\u5185\u5bb9 +actions.document.edit-metadata=\u7f16\u8f91\u5c5e\u6027 +actions.document.edit-offline=\u79bb\u7ebf\u7f16\u8f91 +actions.document.edit-online=\u5728 Microsoft Office\u2122 \u4e2d\u7f16\u8f91 +message.edit-online.supported_office_version_required=\u60a8\u6b63\u5728\u4f7f\u7528\u4e0d\u652f\u6301\u7684 Microsoft Office \u7248\u672c\u3002\u8bf7\u5c1d\u8bd5\u66f4\u65b0 Microsoft Office\u3002Office 2007 \u548c 2008 \u65e0\u6cd5\u4e0e Google Chrome \u914d\u5408\u4f7f\u7528\u3002 +actions.document.extract-metadata=\u63d0\u53d6\u5143\u6570\u636e +actions.document.execute-script=\u6267\u884c\u811a\u672c +actions.document.inline-edit=\u5728 Alfresco Share \u4e2d\u7f16\u8f91 +actions.document.increment-counter=\u589e\u91cf\u8ba1\u6570\u5668 +actions.document.locate=\u67e5\u627e\u6587\u4ef6 +actions.document.manage-aspects=\u7ba1\u7406\u5207\u9762 +actions.document.manage-permissions=\u7ba1\u7406\u6743\u9650 +actions.document.take-ownership=\u6210\u4e3a\u6240\u6709\u8005 +actions.document.move-to=\u79fb\u52a8\u5230... +actions.document.simple-approve=\u6279\u51c6 +actions.document.simple-reject=\u62d2\u7edd +actions.document.upload-new-version=\u4e0a\u4f20\u65b0\u7248\u672c +actions.document.view=\u5728\u6d4f\u89c8\u5668\u4e2d\u67e5\u770b +actions.document.view-google-map=\u5728 Google Maps \u4e0a\u67e5\u770b +actions.document.view-original=\u67e5\u770b\u539f\u59cb\u6587\u6863 +actions.document.view-source-repository=\u5728\u6e90\u5b58\u50a8\u5e93\u4e2d\u67e5\u770b +actions.document.view-working-copy=\u67e5\u770b\u5de5\u4f5c\u526f\u672c +actions.document.publish=\u53d1\u5e03 +actions.document.transform=\u8f6c\u6362 +actions.document.transform-image=\u8f6c\u6362\u4e3a\u56fe\u50cf +actions.document.publish-content=\u53d1\u5e03\u5185\u5bb9 +actions.document.cloud-sync=\u540c\u6b65\u5230\u4e91\u7aef +actions.document.cloud-unsync=\u53d6\u6d88\u4e91\u7aef\u540c\u6b65 +actions.document.view-in-cloud=\u5728\u4e91\u7aef\u67e5\u770b +actions.document.request-sync=\u8bf7\u6c42\u540c\u6b65 +actions.document.unzip-to=\u89e3\u538b\u7f29\u5230... +actions.folder.download=\u4ee5 Zip \u683c\u5f0f\u4e0b\u8f7d +actions.folder.change-type=\u66f4\u6539\u7c7b\u578b +actions.folder.copy-to=\u590d\u5236\u5230... +actions.folder.delete=\u5220\u9664\u6587\u4ef6\u5939 +actions.folder.edit-metadata=\u7f16\u8f91\u5c5e\u6027 +actions.folder.locate=\u67e5\u627e\u6587\u4ef6\u5939 +actions.folder.manage-aspects=\u7ba1\u7406\u5207\u9762 +actions.folder.manage-permissions=\u7ba1\u7406\u6743\u9650 +actions.folder.take-ownership=\u6210\u4e3a\u6240\u6709\u8005 +actions.folder.move-to=\u79fb\u52a8\u5230... +actions.folder.rules=\u7ba1\u7406\u89c4\u5219 +actions.folder.simple-approve=\u6279\u51c6 +actions.folder.simple-reject=\u62d2\u7edd +actions.folder.view-details=\u67e5\u770b\u8be6\u7ec6\u4fe1\u606f +actions.folder.view-source-repository=\u5728\u6e90\u5b58\u50a8\u5e93\u4e2d\u67e5\u770b +actions.folder.cloud-sync=\u540c\u6b65\u5230\u4e91\u7aef +actions.folder.cloud-unsync=\u53d6\u6d88\u4e91\u7aef\u540c\u6b65 +actions.folder.view-in-cloud=\u5728\u4e91\u7aef\u67e5\u770b +actions.link.delete=\u5220\u9664\u94fe\u63a5 +actions.link.locate=\u67e5\u627e\u94fe\u63a5\u7684\u9879 +actions.editOnline.failure=\u65e0\u6cd5\u6253\u5f00\u6587\u4ef6 ''{0}'' \u8fdb\u884c\u5728\u7ebf\u7f16\u8f91\u3002 \u9700\u8981\u5728\u60a8\u7684\u6d4f\u89c8\u5668\u4e2d\u5b89\u88c5\u4ee5\u4e0b\u63d2\u4ef6\u4e4b\u4e00\u3002 \n\u5bf9\u4e8e Windows\uff1a Microsoft Office 2010 \n\u5bf9\u4e8e Mac OS X\uff1a SharePoint \u6d4f\u89c8\u5668\u63d2\u4ef6 +actions.editOnline.invalid=\u65e0\u6cd5\u5728\u7ebf\u7f16\u8f91\u6587\u4ef6\u201c{0}\u201d\uff0c\u56e0\u4e3a\u5176\u8def\u5f84\u5305\u542b SPP \u534f\u8bae\u4e0d\u5141\u8bb8\u7684\u5b57\u7b26\u3002.\n\u65e0\u6548\u7684\u5b57\u7b26\u5305\u542b\u4ee5\u4e0b\uff1a ~ " # % & * : < > ? / \\ { | }\u3002 +actions.synced.document.delete=
''{0}'' \u5df2\u540c\u6b65\uff0c\u5e76\u4e14\u6b64\u5220\u9664\u64cd\u4f5c\u5c06\u4ece\u672c\u5730\u548c\u4e91\u7aef\u79fb\u9664\u6587\u6863\u3002 +actions.synced.folder.delete=
''{0}'' \u5df2\u540c\u6b65\uff0c\u5e76\u4e14\u6b64\u5220\u9664\u64cd\u4f5c\u5c06\u4ece\u672c\u5730\u548c\u4e91\u7aef\u79fb\u9664\u6b64\u6587\u4ef6\u5939\u53ca\u6b64\u6587\u4ef6\u5939\u4e0b\u7684\u5185\u5bb9\u3002 +actions.synced.remove-sync=
\u5982\u679c\u5bf9\u8c61\u5fc5\u987b\u4fdd\u7559\u5728\u4e91\u4e2d\uff0c\u5219\u7acb\u5373\u6267\u884c ''\u79fb\u9664\u540c\u6b65'' \u64cd\u4f5c\u3002 +actions.synced.cloud.document.delete=
''{0}'' \u5df2\u540c\u6b65\uff0c\u5e76\u4e14\u6b64\u5220\u9664\u64cd\u4f5c\u5c06\u4ec5\u4ece\u672c\u5730\u79fb\u9664\u6587\u6863\u3002 +actions.synced.cloud.folder.delete=
''{0}'' \u5df2\u540c\u6b65\uff0c\u5e76\u4e14\u6b64\u5220\u9664\u64cd\u4f5c\u5c06\u4ec5\u4ece\u672c\u5730\u79fb\u9664\u6b64\u6587\u4ef6\u5939\u53ca\u6b64\u6587\u4ef6\u5939\u4e0b\u7684\u5185\u5bb9\u3002 +actions.synced.cloud.document.delete.on.prem=
''{0}'' \u5df2\u540c\u6b65\u5e76\u4e14\u6b64\u5220\u9664\u64cd\u4f5c\u4f1a\u540c\u65f6\u79fb\u9664\u5185\u90e8\u90e8\u7f72\u7248\u672c\u548c\u4e91\u7248\u672c\u4e2d\u7684\u6587\u6863\u3002 +actions.synced.cloud.folder.delete.on.prem=
''{0}'' \u5df2\u540c\u6b65\u5e76\u4e14\u6b64\u5220\u9664\u64cd\u4f5c\u4f1a\u540c\u65f6\u79fb\u9664\u5185\u90e8\u90e8\u7f72\u6216\u4e91\u7248\u672c\u4e2d\u6587\u4ef6\u5939\u4e0b\u7684\u6240\u6709\u5185\u5bb9\u3002 + + + +## Document Library Pop-up Messages +message.actions.failure.locate=\u65e0\u6cd5\u627e\u5230\u94fe\u63a5\u7684\u9879\u76ee\uff1a\u76ee\u6807\u5df2\u88ab\u5220\u9664\u3002 +message.change-type.success=\u5df2\u6210\u529f\u66f4\u6539\u4e86\u6587\u6863 ''{0}'' \u7684\u7c7b\u578b +message.change-type.failure=\u65e0\u6cd5\u66f4\u6539\u6587\u6863 ''{0}'' \u7684\u7c7b\u578b +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.delete.success=\u5df2\u5220\u9664 ''{0}'' +message.delete.failure=\u65e0\u6cd5\u5220\u9664 ''{0}'' +message.multiple-delete.please-wait=\u8bf7\u7a0d\u5019\u3002 \u6b63\u5728\u5220\u9664\u6587\u4ef6... +message.confirm.take-ownership.title=\u6210\u4e3a\u6240\u6709\u8005\uff1f +message.confirm.take-ownership=\u60a8\u5c06\u6210\u4e3a ''{0}'' \u7684\u6240\u6709\u8005\uff0c\u4e0a\u4e00\u4e2a\u6240\u6709\u8005\u53ef\u80fd\u5df2\u9650\u5236\u4ed6\u4eec\u7684\u6743\u9650\u3002 +message.take-ownership.success=\u60a8\u73b0\u5728\u662f ''{0}'' \u7684\u6240\u6709\u8005 +message.take-ownership.failure=\u65e0\u6cd5\u83b7\u53d6 ''{0}'' \u7684\u6240\u6709\u6743 +message.details.success=\u5df2\u6210\u529f\u66f4\u65b0\u8be6\u7ec6\u4fe1\u606f +message.details.failure=\u65e0\u6cd5\u66f4\u65b0\u8be6\u7ec6\u4fe1\u606f +message.details.failure.name=\u65e0\u6cd5\u91cd\u547d\u540d\u9879\u76ee\u3002 \u53ef\u80fd\u5b58\u5728\u53e6\u4e00\u4e2a\u5177\u6709\u76f8\u540c\u540d\u79f0\u7684\u9879\u76ee\u3002 +message.details.failure.more.max.length=\u5176\u4e2d\u4e00\u4e2a\u5c5e\u6027\u7684\u5927\u5c0f\u8d85\u51fa\u6700\u5927\u503c\u3002 +message.sync.success=\u5df2\u521b\u5efa\u540c\u6b65 +message.sync.failure=\u65e0\u6cd5\u521b\u5efa\u540c\u6b65 +message.sync.unavailable=\u65e0\u6cd5\u8fde\u63a5\u5230\u540c\u6b65\u670d\u52a1\u5668\u3002 +message.unsync.confirm=\u662f\u5426\u786e\u5b9a\u8981\u53d6\u6d88\u540c\u6b65 ''{0}''\uff1f +message.unsync.success=\u5df2\u79fb\u9664\u540c\u6b65 +message.unsync.failure=\u65e0\u6cd5\u79fb\u9664\u540c\u6b65 +message.request.sync.success=\u5df2\u6210\u529f\u8bf7\u6c42\u540c\u6b65 +message.request.sync.failure=\u65e0\u6cd5\u8bf7\u6c42\u540c\u6b65 +message.error=\u65e0\u6cd5\u8bbf\u95ee\u6587\u6863\u5e93 +message.empty=\u65e0\u9879 +message.empty.subfolders=\u65e0\u9879\u3002 \u5355\u51fb ''{0}'' \u4ee5\u4fbf\u67e5\u770b\u6b64\u5904\u7684 {1} \u4e2a\u5b50\u6587\u4ef6\u5939\u3002 +message.empty.subfolders.link=\u663e\u793a\u6587\u4ef6\u5939 +message.edit-offline.failure=\u4e0d\u80fd\u7f16\u8f91 ''{0}''\u3002 +message.edit-offline.success=\u73b0\u5728\u53ef\u4ee5\u7f16\u8f91 ''{0}'' +message.edit-offline.success.ie7=\u4f7f\u7528\u4e0b\u9762\u7684\u6309\u94ae\u4e0b\u8f7d\u6587\u6863\u3002 +message.edit-online.office.failure=\u65e0\u6cd5\u542f\u52a8 MS Office\u3002 +message.edit-online.office.path.failure=\u5728\u7ebf\u7f16\u8f91\u4e0d\u53ef\u7528\uff0c\u56e0\u4e3a URL \u7684\u957f\u5ea6\u8d85\u8fc7 260 \u4e2a\u5b57\u7b26\u3002 \u4f7f\u7528\u66f4\u6d45\u7684\u8def\u5f84\u7f29\u77ed\u957f\u5ea6\u3002 +message.edit-online-aos.no_supported_environment=\u6b64\u529f\u80fd\u4ec5\u5728 Windows \u6216 Mac OS X \u4e0a\u53ef\u7528\u3002 +message.edit-online-aos.starting_office_failed=\u65e0\u6cd5\u6253\u5f00 Microsoft Office\u3002 +message.edit-online-aos.plugin_blocked.caption=Microsoft Office \u5df2\u963b\u6b62 +message.edit-online-aos.plugin_blocked.body.firefox=\u5355\u51fb Firefox \u5de5\u5177\u680f\u4ee5\u7ee7\u7eed\u3002 +message.edit-online-aos.plugin_blocked.body.chrome=\u5355\u51fb Chrome \u5730\u5740\u680f\u4e2d\u7684\u5df2\u963b\u6b62\u6807\u8bc6\u4ee5\u7ee7\u7eed\u3002 +message.edit-online-aos.plugin_blocked.body.safari=\u5355\u51fb\u201c\u4fe1\u4efb\u201d\u4ee5\u7ee7\u7eed\u3002 +message.edit-online-aos.plugin_blocked.button_dismiss=\u786e\u5b9a +message.edit-online-aos.supported_office_version_required=\u60a8\u6b63\u5728\u4f7f\u7528\u4e0d\u652f\u6301\u7684 Microsoft Office \u7248\u672c\u3002\u8bf7\u5c1d\u8bd5\u66f4\u65b0 Microsoft Office\u3002 +message.edit-online-aos.edit_offline_locked.title={0} \u6b63\u5728\u7f16\u8f91\u6b64\u6587\u4ef6 +message.edit-online-aos.edit_offline_locked.message=\u60a8\u6240\u505a\u7684\u4efb\u4f55\u66f4\u6539\u53ef\u80fd\u4f1a\u4e22\u5931\u3002 +message.edit-online-aos.edit_offline_locked.confirm=\u7ee7\u7eed +message.edit-online-aos.edit_offline_locked.cancel=\u53d6\u6d88 +message.edit-online-aos.edit_locked.title={0} \u6b63\u5728\u7f16\u8f91\u6b64\u6587\u4ef6 +message.edit-online-aos.edit_locked.message=\u6b64\u6587\u6863\u76ee\u524d\u5df2\u88ab\u9501\u5b9a\u3002 +message.edit-online-aos.edit_locked.button_dismiss=\u786e\u5b9a +message.unlock-document.failure=\u65e0\u6cd5\u89e3\u9501 ''{0}''\u3002 +message.edit-cancel.failure=\u65e0\u6cd5\u53d6\u6d88\u7f16\u8f91 ''{0}''\u3002 +message.edit-cancel.success=\u5df2\u53d6\u6d88\u5bf9 ''{0}'' \u7684\u7f16\u8f91\u3002 +message.unlock-document.success=\u5df2\u89e3\u9501\u5bf9 ''{0}'' \u7684\u7f16\u8f91\u3002 +message.file-dnd-move.failure=\u65e0\u6cd5\u79fb\u52a8\u6b64\u6587\u6863\u3002 +message.increment-counter.success=\u8ba1\u6570\u5668\u5df2\u9012\u589e +message.increment-counter.failure=\u8ba1\u6570\u5668\u65e0\u6cd5\u9012\u589e\u3002 +message.extract-metadata.success=\u5df2\u6210\u529f\u63d0\u53d6\u5143\u6570\u636e\u3002 +message.extract-metadata.failure=\u65e0\u6cd5\u63d0\u53d6\u5143\u6570\u636e\u3002 +message.execute-script.success=\u5df2\u6210\u529f\u6267\u884c\u811a\u672c +message.execute-script.failure=\u65e0\u6cd5\u6267\u884c\u811a\u672c +message.insitu-edit.name.failure=\u65e0\u6cd5\u91cd\u547d\u540d\u6587\u4ef6\u3002 \u53ef\u80fd\u5b58\u5728\u53e6\u4e00\u4e2a\u540c\u540d\u6587\u4ef6\u3002 +message.loading=\u6b63\u5728\u52a0\u8f7d\u6587\u6863\u5e93... +message.simple-workflow.failure=\u65e0\u6cd5\u5b8c\u6210\u5de5\u4f5c\u6d41\u7a0b\u64cd\u4f5c\u3002 +message.simple-workflow.approved=\u6807\u8bb0\u4e3a\u5df2\u6279\u51c6\u7684\u9879 +message.simple-workflow.rejected=\u6807\u8bb0\u4e3a\u5df2\u62d2\u7edd\u7684\u9879 +message.simple-workflow.failed=\u65e0\u6cd5\u5b8c\u6210\u5de5\u4f5c\u6d41\u7a0b\u64cd\u4f5c\u3002 +message.transform.success=\u5df2\u6210\u529f\u8f6c\u6362\u6587\u6863 ''{0}'' +message.transform.failure=\u65e0\u6cd5\u8f6c\u6362\u6587\u6863 +message.transform-image.success=\u5df2\u6210\u529f\u8f6c\u6362\u56fe\u50cf ''{0}'' +message.transform-image.failure=\u65e0\u6cd5\u8f6c\u6362\u6587\u6863 +message.new-version-upload.success=\u6587\u4ef6\u4e0a\u4f20\u6210\u529f\u3002 \u9884\u89c8\u53ef\u80fd\u6ca1\u6709\u663e\u793a\u6587\u6863\u7684\u6700\u65b0\u7248\u672c - \u60a8\u53ef\u7a0d\u540e\u5237\u65b0\u8be5\u9875\u9762\u4ee5\u66f4\u65b0\u5b83\u3002 + +message.insitu-edit.tag.failure=\u65e0\u6cd5\u7f16\u8f91\u6807\u8bb0 + +## Drag and Drop +message.dnd.allColumnsAreFull=\u7531\u4e8e\u6240\u6709\u5217\u5747\u5df2\u6ee1\uff0c\u6240\u4ee5\u65e0\u6cd5\u6dfb\u52a0\u5143\u7d20 + +## Data Dictionary +# Aspects +aspect.cm_complianceable=\u53ef\u5408\u89c4 +aspect.cm_dublincore=\u90fd\u67cf\u6797\u6838\u5fc3 +aspect.cm_effectivity=\u6709\u6548\u6027 +aspect.cm_emailed=\u7535\u5b50\u90ae\u4ef6\u65b9\u5f0f +aspect.cm_generalclassifiable=\u53ef\u5206\u7c7b +aspect.cm_summarizable=\u53ef\u6458\u8981 +aspect.cm_taggable=\u53ef\u8bbe\u7f6e\u6807\u8bb0 +aspect.cm_templatable=\u53ef\u8bbe\u7f6e\u6a21\u677f +aspect.cm_versionable=\u53ef\u8bbe\u7f6e\u7248\u672c +aspect.emailserver_aliasable=\u7535\u5b50\u90ae\u4ef6\u522b\u540d +aspect.app_inlineeditable=\u53ef\u76f4\u63a5\u7f16\u8f91 +aspect.cm_geographic=\u5730\u7406 +aspect.exif_exif=EXIF +aspect.exif_resolution=\u5206\u8fa8\u7387 +aspect.exif_camera=\u76f8\u673a\u8be6\u7ec6\u4fe1\u606f +aspect.audio_audio=\u97f3\u9891 +aspect.cm_indexControl=\u7d22\u5f15\u63a7\u4ef6 +aspect.dp_restrictable=\u53ef\u9650\u5236 +aspect.cm_attachable=\u9644\u4ef6 + +# Groups +group.everyone=\u4efb\u4f55\u4eba + +# Types +type.cm_content=\u5185\u5bb9\u57fa\u7c7b\u578b +type.cm_folder=\u6587\u4ef6\u5939\u57fa\u7c7b\u578b +type.trx_transferTarget=\u4f20\u8f93\u76ee\u6807 +type.trx_fileTransferTarget=\u6587\u4ef6\u4f20\u8f93\u76ee\u6807 + +# Generic Form labels +form.set.general=\u5e38\u89c4 +form.set.operations=\u64cd\u4f5c + +# Runtime +runtime.field.FreeMemory=\u53ef\u7528\u5185\u5b58 +runtime.field.MaxMemory=\u6700\u5927\u5185\u5b58 +runtime.field.TotalMemory=\u5185\u5b58\u603b\u91cf + +# Repository Server +repository-server.set.version=\u7248\u672c\u4fe1\u606f +repository-server.field.Name=\u540d\u79f0 +repository-server.field.Id=ID +repository-server.field.Edition=\u7248\u672c +repository-server.field.Schema=\u67b6\u6784 +repository-server.field.Version=\u7248\u672c +repository-server.field.VersionLabel=\u6807\u7b7e +repository-server.field.VersionMinor=\u6b21\u8981 +repository-server.field.VersionMajor=\u4e3b\u8981 +repository-server.field.VersionRevision=\u4fee\u8ba2 +repository-server.field.VersionBuild=\u5185\u90e8\u7248\u672c +repository-server.field.VersionNumber=\u53f7 + +# Repository Installed +repository-installed.set.version=\u7248\u672c\u4fe1\u606f +repository-installed.field.Name=\u540d\u79f0 +repository-installed.field.Id=ID +repository-installed.field.Edition=\u7248\u672c +repository-installed.field.Schema=\u67b6\u6784 +repository-installed.field.Version=\u7248\u672c +repository-installed.field.VersionLabel=\u6807\u7b7e +repository-installed.field.VersionMinor=\u6b21\u8981 +repository-installed.field.VersionMajor=\u4e3b\u8981 +repository-installed.field.VersionRevision=\u4fee\u8ba2 +repository-installed.field.VersionBuild=\u5185\u90e8\u7248\u672c +repository-installed.field.VersionNumber=\u53f7 + +# Authority +authority.field.NumberOfGroups=\u7ec4\u6570 +authority.field.NumberOfUsers=\u7528\u6237\u6570 + +# License +header.license= +license.field.Subject=\u8bb8\u53ef\u8bc1\u4e3b\u9898 +license.field.Days=\u5929 +license.field.Holder=\u6301\u6709\u8005 +license.field.ValidUntil=\u5931\u6548\u65e5\u671f +license.field.RemainingDays=\u5269\u4f59\u5929\u6570 +license.field.Issued=\u5df2\u9881\u53d1 +license.field.Issuer=\u9881\u53d1\u8005 +license.field.HeartBeatDisabled=\u5df2\u7981\u7528\u68c0\u6d4b\u4fe1\u53f7 +license.field.LicenseMode=\u8bb8\u53ef\u8bc1\u6a21\u5f0f +license.field.CloudSyncKeyAvailable=\u4e91\u540c\u6b65\u5bc6\u94a5\u53ef\u7528 +license.field.MaxDocs=\u6700\u5927\u5185\u5bb9\u5bf9\u8c61\u6570 +license.field.MaxUsers=\u6700\u5927\u7528\u6237\u6570 +license.field.Users=\u7528\u6237 +license.field.Documents=\u5185\u5bb9\u5bf9\u8c61\u6570 +license.field.Info=\u5982\u679c\u60a8\u7684\u8bb8\u53ef\u8bc1\u7684\u7528\u6237\u6570\u91cf\u6ca1\u6709\u9650\u5236\uff0c\u8fd9\u4e2a\u503c\u53ef\u80fd\u663e\u793a\u4e3a\u96f6\u3002 + +# Pdf2Swf +pdf2swf.field.Available=\u53ef\u7528 +pdf2swf.field.VersionString=\u7248\u672c + +# Open Office +openoffice.field.available=\u53ef\u7528 +openoffice.field.ooName=\u540d\u79f0 +openoffice.field.ooOpenSourceContext=\u5f00\u6e90\u4e0a\u4e0b\u6587 +openoffice.field.ooSetupExtension=\u6269\u5c55 +openoffice.field.ooSetupVersion=\u7248\u672c +openoffice.field.ooSetupVersionAboutBox=\u5173\u4e8e +openoffice.field.ooXMLFileFormatName=XML \u6587\u4ef6\u683c\u5f0f +openoffice.field.ooXMLFileFormatVersion=XML \u6587\u4ef6\u683c\u5f0f\u7248\u672c +openoffice.error=\u65e0\u6cd5\u663e\u793a OpenOffice \u4fe1\u606f +openoffice.error.404=\u65e0\u6cd5\u627e\u5230\u6709\u5173 OpenOffice \u7684\u4fe1\u606f\uff08\u662f\u5426\u5df2\u5c06\u201cooo.enabled\u201d\u5c5e\u6027\u8bbe\u7f6e\u4e3a\u201cfalse\u201d\uff1f\uff09 + +# OpenOffice Subsystem +openoffice-subsystem.field.ooo.enabled=\u5df2\u542f\u7528 +openoffice-subsystem.field.ooo.exe=exe +openoffice-subsystem.field.ooo.port=\u7aef\u53e3 + +# OpenOffice JodConverter +ooojodconverter.field.jodconverter.enabled=\u5df2\u542f\u7528 +ooojodconverter.field.jodconverter.maxTasksPerProcess=\u6bcf\u6d41\u7a0b\u6700\u591a\u4efb\u52a1 +ooojodconverter.field.jodconverter.officeHome=Office \u4e3b\u9875 +ooojodconverter.field.jodconverter.portNumbers=\u7aef\u53e3\u6570 +ooojodconverter.field.jodconverter.taskExecutionTimeout=\u4efb\u52a1\u6267\u884c\u8d85\u65f6 +ooojodconverter.field.jodconverter.taskQueueTimeout=\u4efb\u52a1\u961f\u5217\u8d85\u65f6 + +# Transformer ImageMagick +transformer-imagemagick.field.Available=\u53ef\u7528 +transformer-imagemagick.field.VersionString=\u7248\u672c\u4fe1\u606f + +# File servers +fileservers.set.filesystem=\u6587\u4ef6\u7cfb\u7edf +fileservers.set.cifs=CIFS +fileservers.set.ftp=FTP +fileservers.field.filesystem.acl.global.defaultAccessLevel=\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b +fileservers.field.filesystem.acl.global.domainAccessControls=\u57df\u8bbf\u95ee\u63a7\u5236 +fileservers.field.filesystem.acl.global.protocolAccessControls=\u534f\u8bae\u8bbf\u95ee\u63a7\u5236 +fileservers.field.filesystem.acl.global.userAccessControls=\u7528\u6237\u8bbf\u95ee\u63a7\u5236 +fileservers.field.filesystem.domainMappings=\u57df\u6620\u5c04 +fileservers.field.filesystem.name=\u6587\u4ef6\u7cfb\u7edf\u540d\u79f0 +fileservers.field.filesystem.name.description=\u901a\u8fc7 CIFS/FTP/WebDAV \u8bbf\u95ee\u65f6\u7528\u4e8e\u6587\u4ef6\u7cfb\u7edf\u7684\u540d\u79f0 +fileservers.field.cifs.WINS.autoDetectEnabled=\u5df2\u542f\u7528\u4e86 WINS \u81ea\u52a8\u68c0\u6d4b\u529f\u80fd +fileservers.field.cifs.WINS.primary=WINS \u4e3b\u8981\u5730\u5740 +fileservers.field.cifs.WINS.secondary=WINS \u8f85\u52a9\u5730\u5740 +fileservers.field.cifs.bindto=\u7ed1\u5b9a\u5230 +fileservers.field.cifs.broadcast=\u5e7f\u64ad +fileservers.field.cifs.disableNIO=\u7981\u7528 NIO +fileservers.field.cifs.disableNativeCode=\u7981\u7528\u672c\u673a\u4ee3\u7801 +fileservers.field.cifs.domain=\u57df +fileservers.field.cifs.enabled=\u5df2\u542f\u7528 CIFS +fileservers.field.cifs.hostannounce=\u4e3b\u673a\u516c\u544a +fileservers.field.cifs.ipv6.enabled=\u5df2\u542f\u7528 IPV6 +fileservers.field.cifs.netBIOSSMB.datagramPort=NetBIOS SMB \u6570\u636e\u62a5\u7aef\u53e3 +fileservers.field.cifs.netBIOSSMB.namePort=NetBIOS SMB \u540d\u79f0\u7aef\u53e3 +fileservers.field.cifs.netBIOSSMB.sessionPort=NetBIOS SMB \u4f1a\u8bdd\u7aef\u53e3 +fileservers.field.cifs.serverName=\u670d\u52a1\u5668\u540d\u79f0 +fileservers.field.cifs.sessionDebug=\u4f1a\u8bdd\u8c03\u8bd5 +fileservers.field.cifs.sessionTimeout=\u4f1a\u8bdd\u8d85\u65f6 +fileservers.field.cifs.tcpipSMB.port=TCP/IP SMB \u7aef\u53e3 +fileservers.field.ftp.dataPortFrom=\u6570\u636e\u7aef\u53e3\u6765\u6e90 +fileservers.field.ftp.dataPortTo=\u6570\u636e\u7aef\u53e3\u76ee\u6807 +fileservers.field.ftp.enabled=\u5df2\u542f\u7528 FTP +fileservers.field.ftp.keyStore=\u5bc6\u94a5\u5e93 +fileservers.field.ftp.passphrase=\u5bc6\u7801 +fileservers.field.ftp.port=\u7aef\u53e3 +fileservers.field.ftp.requireSecureSession=\u9700\u8981\u5b89\u5168\u4f1a\u8bdd +fileservers.field.ftp.sessionDebug=\u4f1a\u8bdd\u8c03\u8bd5 +fileservers.field.ftp.sslEngineDebug=SSL \u5f15\u64ce\u8c03\u8bd5 +fileservers.field.ftp.trustStore=\u4fe1\u4efb\u5e93 + +# Sysadmin +sysadmin.field.alfresco.context=\u5b58\u50a8\u5e93\u4e0a\u4e0b\u6587 +sysadmin.field.alfresco.host=\u5b58\u50a8\u5e93\u4e3b\u673a +sysadmin.field.alfresco.port=\u5b58\u50a8\u5e93\u7aef\u53e3 +sysadmin.field.alfresco.protocol=\u5b58\u50a8\u5e93\u534f\u8bae +sysadmin.field.server.allowedusers=\u5141\u8bb8\u7684\u7528\u6237\u6570 +sysadmin.field.server.maxusers=\u6700\u5927\u7528\u6237\u6570 +sysadmin.field.server.transaction.allow-writes=\u5141\u8bb8\u5199 +sysadmin.field.share.context=Share \u4e0a\u4e0b\u6587 +sysadmin.field.share.host=Share \u4e3b\u673a +sysadmin.field.share.port=Share \u7aef\u53e3 +sysadmin.field.share.protocol=Share \u534f\u8bae + +# Email (Inbound) +email-inbound.set.service=\u4f20\u5165\u7535\u5b50\u90ae\u4ef6\u670d\u52a1 +email-inbound.field.email.inbound.enabled=\u670d\u52a1\u5df2\u542f\u7528 +email-inbound.field.email.inbound.unknownUser=\u672a\u77e5\u7528\u6237 +email-inbound.set.server=\u4f20\u5165\u7535\u5b50\u90ae\u4ef6\u670d\u52a1\u5668 +email-inbound.field.email.server.allowed.senders=\u5141\u8bb8\u7684\u53d1\u4ef6\u4eba +email-inbound.field.email.server.blocked.senders=\u963b\u6b62\u7684\u53d1\u4ef6\u4eba +email-inbound.field.email.server.enabled=\u670d\u52a1\u5668\u5df2\u542f\u7528 +email-inbound.field.email.server.domain=\u57df +email-inbound.field.email.server.port=\u7aef\u53e3 +email-inbound.field.email.server.connections.max=\u6700\u5927\u8fde\u63a5\u6570 +email-inbound.set.tls=\u4f20\u8f93\u5c42\u5b89\u5168 +email-inbound.field.email.server.requireTLS=\u9700\u8981\u4f20\u8f93\u5c42\u5b89\u5168 (TLS) +email-inbound.field.email.server.hideTLS=EHELO \u672a\u8fd4\u56de\u4f20\u8f93\u5c42\u5b89\u5168 (TLS) +email-inbound.field.email.server.enableTLS=\u63a5\u53d7\u4f20\u8f93\u5c42\u5b89\u5168 (TLS) + +# Email (Outbound) +email-outbound.set.auth=\u8eab\u4efd\u9a8c\u8bc1 +email-outbound.set.test-message=\u6d4b\u8bd5\u6d88\u606f +email-outbound.field.mail.host=\u4e3b\u673a +email-outbound.field.mail.port=\u7aef\u53e3 +email-outbound.field.mail.protocol=\u534f\u8bae +email-outbound.field.mail.encoding=\u7f16\u7801 +email-outbound.field.mail.from.default=\u9ed8\u8ba4\u53d1\u9001\u8005\u5730\u5740 +email-outbound.field.mail.from.enabled=\u6765\u81ea\u5df2\u542f\u7528\u9879 +email-outbound.field.mail.smtp.auth=\u8981\u6c42\u8fdb\u884c SMTP \u8eab\u4efd\u9a8c\u8bc1 +email-outbound.field.mail.smtps.auth=\u8981\u6c42\u8fdb\u884c SMTPS \u8eab\u4efd\u9a8c\u8bc1 +email-outbound.field.mail.username=\u7528\u6237\u540d +email-outbound.field.mail.password=\u5bc6\u7801 +email-outbound.field.mail.testmessage.send=\u542f\u52a8\u65f6\u53d1\u9001\u6d4b\u8bd5\u6d88\u606f +email-outbound.field.mail.testmessage.to=\u6536\u4ef6\u4eba +email-outbound.field.mail.testmessage.subject=\u4e3b\u9898 +email-outbound.field.mail.testmessage.text=\u6d88\u606f + +# IMAP +imap.set.imap=IMAP +imap.field.imap.config.home.folderPath=\u4e3b\u6587\u4ef6\u5939\u8def\u5f84 +imap.field.imap.config.home.rootPath=\u4e3b\u6839\u8def\u5f84 +imap.field.imap.config.home.store=\u4e3b\u5e93 +imap.field.imap.server.attachments.extraction.enabled=\u5df2\u542f\u7528\u63d0\u53d6 +imap.field.imap.config.ignore.extraction=\u5ffd\u7565\u63d0\u53d6 +imap.field.imap.config.server.mountPoints=\u6302\u8f7d\u70b9 +imap.field.imap.mail.from.default=\u6765\u81ea\u9ed8\u8ba4\u53d1\u4ef6\u4eba\u7684\u90ae\u4ef6 +imap.field.imap.mail.to.default=\u53d1\u5f80\u9ed8\u8ba4\u6536\u4ef6\u4eba\u7684\u90ae\u4ef6 +imap.field.imap.server.enabled=\u5df2\u542f\u7528 +imap.field.imap.server.host=\u4e3b\u673a +imap.field.imap.server.port=\u7aef\u53e3 + +# Activities Feed +activities.set.activities=\u6d3b\u52a8\u8ba2\u9605\u6e90 +activities.field.feed.notifier.enabled=\u5df2\u542f\u7528\u8ba2\u9605\u6e90\u901a\u77e5\u5668 +activities.field.feed.notifier.repeatIntervalMins=\u91cd\u590d\u65f6\u95f4\u95f4\u9694\uff08\u5206\u949f\uff09 +activities.field.feed.max.ageMins=\u6700\u5927\u5b58\u5728\u65f6\u95f4\uff08\u5206\u949f\uff09 +activities.field.feed.max.size=\u6700\u5927\u5927\u5c0f + +# Subscriptions +subscriptions.field.subscriptions.enabled=\u5df2\u542f\u7528 + +# Workflow +workflow.field.message=\u6d88\u606f +workflow.field.comment=\u8bc4\u8bba +workflow.field.assign_to=\u6307\u6d3e\u7ed9 +workflow.field.review_group=\u5ba1\u9605\u7ec4 +workflow.field.reviewer=\u590d\u67e5\u8005 +workflow.field.reviewers=\u590d\u67e5\u8005 +workflow.field.due=\u622a\u6b62\u65f6\u95f4 +workflow.field.priority=\u4f18\u5148\u7ea7 +workflow.field.outcome=\u7ed3\u679c +workflow.field.enabled.activiti=\u5df2\u542f\u7528 +workflow.field.enabled.jbpm=\u5df2\u542f\u7528 +workflow.field.definitions.visible=\u5b9a\u4e49\u53ef\u89c1 +workflow.field.number.tasks=\u4efb\u52a1\u6570 +workflow.field.number.definitions=\u5b9a\u4e49\u6570 +workflow.field.number.workflows=\u5de5\u4f5c\u6d41\u7a0b\u6570 +workflow.field.requiredApprovePercent=\u6240\u9700\u6279\u51c6\u767e\u5206\u6bd4 +workflow.set.general=\u5e38\u89c4 +workflow.set.assignee=\u88ab\u6307\u6d3e\u8005 +workflow.set.assignees=\u88ab\u6307\u6d3e\u8005\u6570 +workflow.set.information=\u4fe1\u606f +workflow.set.items=\u9879\u6570 +workflow.set.outcome=\u7ed3\u679c +workflow.set.other=\u5176\u4ed6\u9009\u9879 +workflow.set.task.info=\u4fe1\u606f +workflow.set.workflow.more_info=\u66f4\u591a\u4fe1\u606f +workflow.set.task.progress=\u8fdb\u5ea6 +workflow.set.response=\u54cd\u5e94 +workflow.set.engine.activiti=Activiti \u5f15\u64ce +workflow.set.engine.jbpm=JBPM \u5f15\u64ce +workflow.task.error=\u65e0\u6cd5\u8f7d\u5165\u4efb\u52a1\u3002 +workflow.task.error.404=\u4efb\u52a1\u4e0d\u5b58\u5728\u6216\u5df2\u53d6\u6d88\u3002 +workflow.task.invite.title={0} \u7ad9\u70b9 +workflow.task.invite.subtitle=\u60a8\u5df2\u53d7\u9080\u52a0\u5165 {0} \u7ad9\u70b9\u3002 +workflow.task.invite.role=\u60a8\u7684\u89d2\u8272\u5c06\u4e3a {0}\u3002 +workflow.task.invite.accepted={0} {1} \u5df2\u63a5\u53d7\u4e86\u60a8\u5173\u4e8e\u52a0\u5165 {2} \u7ad9\u70b9\u7684\u9080\u8bf7\u3002 +workflow.task.invite.rejected={0} {1} \u5df2\u62d2\u7edd\u4e86\u60a8\u5173\u4e8e\u52a0\u5165 {2} \u7ad9\u70b9\u7684\u9080\u8bf7\u3002 +workflow.task.request.invite.title=\u7528\u6237 {0} \u5df2\u8bf7\u6c42\u52a0\u5165 {1} \u7ad9\u70b9\u3002 +workflow.cancel.title=\u53d6\u6d88\u5de5\u4f5c\u6d41\u7a0b +workflow.cancel.label=\u662f\u5426\u786e\u5b9a\u8981\u53d6\u6d88\u6b64\u5de5\u4f5c\u6d41\u7a0b\uff1f +workflow.cancel.feedback=\u6b63\u5728\u53d6\u6d88\u5de5\u4f5c\u6d41\u7a0b... +workflow.cancel.success=\u5de5\u4f5c\u6d41\u7a0b\u5df2\u6210\u529f\u53d6\u6d88 +workflow.cancel.failure=\u53d6\u6d88\u5de5\u4f5c\u6d41\u7a0b\u5931\u8d25 +workflow.delete.title=\u5220\u9664\u5de5\u4f5c\u6d41\u7a0b +workflow.delete.label=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u6b64\u5de5\u4f5c\u6d41\u7a0b\uff1f +workflow.delete.feedback=\u6b63\u5728\u5220\u9664\u5de5\u4f5c\u6d41\u7a0b... +workflow.delete.success=\u5df2\u6210\u529f\u5220\u9664\u5de5\u4f5c\u6d41\u7a0b +workflow.delete.failure=\u5220\u9664\u5de5\u4f5c\u6d41\u7a0b\u5931\u8d25 +workflow.no_message=\uff08\u65e0\u6d88\u606f\uff09 +tool.workflow.activiti.tools=Activiti \u5de5\u5177 +tool.workflow.activiti.admin.link=Activiti \u5de5\u4f5c\u6d41\u7a0b\u63a7\u5236\u53f0 + +# Admin console search tool +tool.lucene.label=Lucene +tool.lucene.description=Lucene +tool.solr.label=Solr +tool.solr.description=Solr +tool.searchmanager.label=\u641c\u7d22\u7ba1\u7406\u5668 +tool.searchmanager.description=\u641c\u7d22\u7ba1\u7406\u5668 + + +# lucene +lucene.field.subscriptions.field.subscriptions.enabled=\u5df2\u542f\u7528 +lucene.field.dir.indexes=\u7d22\u5f15\u76ee\u5f55 +lucene.field.index.recovery.mode=\u7d22\u5f15\u6062\u590d\u6a21\u5f0f +lucene.field.lucene.indexer.contentIndexingEnabled=\u5df2\u542f\u7528\u5185\u5bb9\u7d22\u5f15 +lucene.field.index.tracking.disableInTransactionIndexing=\u7981\u7528\u4e8b\u52a1\u4e2d\u7d22\u5f15 + +lucene.set.backup=\u5907\u4efd +lucene.backup.field.dir.indexes.backup=\u7d22\u5f15\u5907\u4efd\u76ee\u5f55 +lucene.backup.field.index.backup.cronExpression=\u5907\u4efd Cron \u8868\u8fbe\u5f0f + +lucene.set.advanced=\u9ad8\u7ea7 +lucene.advanced.field.lucene.indexer.contentIndexingEnabled=\u5df2\u542f\u7528\u5185\u5bb9\u7d22\u5f15 +lucene.advanced.field.fts.indexer.batchSize=\u7d22\u5f15\u5efa\u7acb\u6279\u91cf\u6570 +lucene.advanced.field.lucene.maxAtomicTransformationTime=\u6700\u957f \u539f\u5b50\u8f6c\u6362\u65f6\u95f4 +lucene.advanced.field.index.reindexMissingContent.cronExpression=\u7f3a\u5c11\u5185\u5bb9 Cron \u8868\u8fbe\u5f0f +lucene.advanced.field.indexer.maxFieldLength=\u6bcf\u4e2a\u6587\u6863\u4e2d\u5df2\u7d22\u5f15\u4ee4\u724c\u7684\u6700\u5927\u6570\u91cf +lucene.field.indexer.mergerMaxMergeDocs=\u6700\u5927\u5408\u5e76\u6587\u6863\u6570 +lucene.field.indexer.mergerMergeFactor=\u6700\u5927\u5408\u5e76\u56e0\u5b50 + +# Transform action form +transform.field.mime-type=\u6240\u9700\u683c\u5f0f +transform.field.destination-folder=\u76ee\u6807 + +# Transform Image action form +transform-image.field.mime-type=\u6240\u9700\u683c\u5f0f +transform-image.field.convert-command=\u9009\u9879 +transform-image.field.destination-folder=\u76ee\u6807 + +publish-content.field.publish-channel-id=\u53d1\u5e03\u6e20\u9053 +publish-content.field.unpublish=\u53d6\u6d88\u53d1\u5e03 +publish-content.field.status-update=\u72b6\u6001\u66f4\u65b0 +publish-content.field.status-update-channel-id=\u72b6\u6001\u66f4\u65b0\u6e20\u9053 + +# Execute Script action form +script.field.script-ref=\u811a\u672c + +# Solr +solr.set.spacesstore=\u4e3b\u5e93\u5c5e\u6027 +solr.set.archivestore=\u5b58\u6863\u5e93\u5c5e\u6027 +solr.field.search.solrTrackingSupport.enabled=\u5df2\u542f\u7528\u8ddf\u8e2a +solr.help.search.solrTrackingSupport.enabled=\u542f\u7528\u4ee5\u5141\u8bb8 Solr \u8fde\u63a5\u5230\u6b64\u670d\u52a1\u5668\uff0c\u5e76\u8ddf\u8e2a\u53ca\u66f4\u65b0\u7d22\u5f15 +solr.field.solr.host=Solr \u4e3b\u673a\u540d +solr.help.field.solr.host=Solr \u670d\u52a1\u5668\u8fd0\u884c\u7684\u4e3b\u673a\u540d\u3002 \u5982\u679c\u5728\u540c\u4e00\u53f0\u8ba1\u7b97\u673a\u4e0a\u8fd0\u884c\uff0c\u8bf7\u4f7f\u7528 localhost. +solr.field.solr.port=Solr \u7aef\u53e3\uff08\u975e SSL\uff09 +solr.help.field.solr.port=\u8fd0\u884c Solr \u7684\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u5668\u7684\uff08\u4e0d\u5b89\u5168\uff09HTTP \u7aef\u53e3\u3002 \u4ec5\u5f53 Solr \u914d\u7f6e\u4e3a\u5728\u4e0d\u8fdb\u884c\u5b89\u5168\u901a\u4fe1\u7684\u60c5\u51b5\u4e0b\u8fd0\u884c\u65f6\u4f7f\u7528\u3002 +solr.field.solr.port.ssl=Solr SSL \u7aef\u53e3 +solr.help.field.solr.port.ssl=\u8fd0\u884c Solr \u7684\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u5668\u7684 HTTPS \u7aef\u53e3\u3002 + +# Tracker Properties +solr.field.tracker.alfresco.active=\u6b63\u5728\u5efa\u7acb\u7d22\u5f15 +solr.field.tracker.alfresco.lag=\u7d22\u5f15\u5ef6\u8fdf\uff08\u79d2\uff09 +solr.field.tracker.alfresco.last.indexed.txn=\u6700\u540e\u7d22\u5f15\u7684\u4e8b\u52a1 +solr.field.tracker.alfresco.approx.txns.remaining=\u8981\u7d22\u5f15\u7684\u5927\u7ea6\u4e8b\u52a1\u6570 +solr.field.tracker.alfresco.approx.indexing.time.remaining=\u5269\u4f59\u5927\u7ea6\u7d22\u5f15\u65f6\u95f4 +solr.help.field.tracker.alfresco.lag=Solr \u7d22\u5f15\u5728\u540e\u53f0\u66f4\u65b0\u3002 \u8fd9\u662f\u6b64 Solr \u5168\u6587\u7d22\u5f15\u5f53\u524d\u6ede\u540e\u4e8e\u5b58\u50a8\u5e93\u66f4\u65b0\u7684\u65f6\u95f4\uff08\u79d2\uff09\u3002 +solr.field.tracker.archive.active=\u6b63\u5728\u5efa\u7acb\u7d22\u5f15 +solr.field.tracker.archive.lag=\u7d22\u5f15\u5ef6\u8fdf\uff08\u79d2\uff09 +solr.field.tracker.archive.last.indexed.txn=\u6700\u540e\u7d22\u5f15\u7684\u4e8b\u52a1 +solr.field.tracker.archive.approx.txns.remaining=\u8981\u7d22\u5f15\u7684\u5927\u7ea6\u4e8b\u52a1\u6570 +solr.field.tracker.archive.approx.indexing.time.remaining=\u5269\u4f59\u5927\u7ea6\u7d22\u5f15\u65f6\u95f4 + +# Backup properties +solr.field.solr.backup.alfresco.cronExpression=\u5907\u4efd Cron \u8868\u8fbe\u5f0f +solr.field.solr.backup.alfresco.remoteBackupLocation=\u5907\u4efd\u4f4d\u7f6e +solr.field.solr.backup.alfresco.numberToKeep=\u8981\u4fdd\u7559\u7684\u5907\u4efd +solr.help.solr.backup.alfresco.remoteBackupLocation=Solr \u670d\u52a1\u5668\u6587\u4ef6\u7cfb\u7edf\u4e0a\u7528\u4e8e\u5b58\u50a8\u7d22\u5f15\u5907\u4efd\u7684\u4f4d\u7f6e\u7684\u5b8c\u6574\u8def\u5f84 +solr.help.solr.backup.alfresco.numberToKeep=\u8981\u4fdd\u7559\u7684\u5907\u4efd\u6570\u91cf\uff08\u5305\u62ec\u6700\u65b0\u5907\u4efd\uff09 +solr.field.solr.backup.archive.cronExpression=\u5907\u4efd Cron \u8868\u8fbe\u5f0f +solr.field.solr.backup.archive.remoteBackupLocation=\u5907\u4efd\u4f4d\u7f6e +solr.field.solr.backup.archive.numberToKeep=\u8981\u4fdd\u7559\u7684\u5907\u4efd +solr.help.solr.backup.archive.remoteBackupLocation=Solr \u670d\u52a1\u5668\u6587\u4ef6\u7cfb\u7edf\u4e0a\u7528\u4e8e\u5b58\u50a8\u7d22\u5f15\u5907\u4efd\u7684\u4f4d\u7f6e\u7684\u5b8c\u6574\u8def\u5f84 +solr.help.solr.backup.archive.numberToKeep=\u8981\u4fdd\u7559\u7684\u5907\u4efd\u6570\u91cf\uff08\u5305\u62ec\u6700\u65b0\u5907\u4efd\uff09 + +# searchmanager +searchmanager.field.sourceBeanName=\u641c\u7d22\u670d\u52a1 + +## Tooltips +tooltip.path=\u8def\u5f84\uff1a {0} +tooltip.site=\u7ad9\u70b9\uff1a {0} + +## Create content +create-content.text=\u7eaf\u6587\u672c... +create-content.html=HTML... +create-content.xml=XML... +create-content.folder=\u6587\u4ef6\u5939 + +## YUI Mini Calendar Widget Configuration, see: http://developer.yahoo.com/yui/docs/YAHOO.widget.Calendar.html#config_MY_LABEL_MONTH_POSITION +calendar.widget_config.my_label_month_position=1 +calendar.widget_config.my_label_month_suffix= +calendar.widget_config.my_label_year_position=2 +calendar.widget_config.my_label_year_suffix= +# this one is also used by Share's calendar: +calendar.widget_config.start_weekday=1 + +## YUI Mini Calendar Widget Control Configuration, see: http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/calendar/calnavigator.html +calendar.widget_control_config.label_month=\u9009\u62e9\u6708\u4efd +calendar.widget_control_config.label_year=\u8f93\u5165\u5e74\u4efd +calendar.widget_control_config.label_invalid_year=\u8bf7\u8f93\u5165\u6709\u6548\u7684\u5e74\u4efd + +## Common metadata rendering (e.g. SimpleDocList) +details.link-to=\u94fe\u63a5\u5230\uff1a{0} +details.created-by={1} \u521b\u5efa\u4e86 {0} +details.created-in-site={0} \u5df2\u5728 {1} \u4e2d\u521b\u5efa +details.editing-started-by={0} \u7531 {1} \u542f\u52a8\u4e86\u7f16\u8f91 +details.editing-started-in-site={1} \u5df2\u5728 {0} \u5f00\u59cb\u7f16\u8f91 +details.modified-by={0} \u7531 {1} \u4fee\u6539 +details.modified-in-site={0} \u5df2\u5728 {1} \u4e2d\u8fdb\u884c\u4fee\u6539 +details.description.none=\u65e0\u8bf4\u660e +details.tags.none=\u65e0\u6807\u8bb0 +details.categories.none=\u65e0\u7c7b\u522b +details.user.deleted=''{0}''\uff08\u5df2\u5220\u9664\u7528\u6237\uff09 + +## Social Interactions +# Favourite +favourite.document.add.tip=\u5411\u6536\u85cf\u5939\u6dfb\u52a0\u6587\u6863 +favourite.document.add.label=\u6536\u85cf\u5939 +favourite.document.remove.tip=\u4ece\u6536\u85cf\u5939\u79fb\u9664\u6587\u6863 +favourite.folder.add.tip=\u5411\u6536\u85cf\u5939\u6dfb\u52a0\u6587\u4ef6\u5939 +favourite.folder.add.label=\u6536\u85cf\u5939 +favourite.folder.remove.tip=\u4ece\u6536\u85cf\u5939\u79fb\u9664\u6587\u4ef6\u5939 +favourite.imap-site.add.tip=\u5411 IMAP \u6536\u85cf\u5939\u6dfb\u52a0\u7ad9\u70b9 +favourite.imap-site.add.label=IMAP +favourite.imap-site.remove.tip=\u4ece IMAP \u6536\u85cf\u5939\u79fb\u9664\u7ad9\u70b9 +favourite.site.add.tip=\u5411\u6536\u85cf\u5939\u6dfb\u52a0\u7ad9\u70b9 +favourite.site.add.label=\u6536\u85cf\u5939 +favourite.site.remove.tip=\u4ece\u6536\u85cf\u5939\u79fb\u9664\u7ad9\u70b9 +favourite.message.failure=\u4fdd\u5b58\u6536\u85cf\u5939\u5931\u8d25 +# Like +like.document.add.tip=\u559c\u6b22\u6b64\u6587\u6863 +like.document.add.label=\u559c\u6b22 +like.document.remove.tip=\u4e0d\u559c\u6b22 +like.folder.add.tip=\u559c\u6b22\u6b64\u6587\u4ef6\u5939 +like.folder.add.label=\u559c\u6b22 +like.folder.remove.tip=\u4e0d\u559c\u6b22 +like.site.add.tip=\u559c\u6b22\u6b64\u7ad9\u70b9 +like.site.add.label=\u559c\u6b22 +like.site.remove.tip=\u4e0d\u559c\u6b22 +like.message.failure=\u4fdd\u5b58\u559c\u6b22\u5931\u8d25 +# Quickshare +quickshare.link.label=\u516c\u5171\u94fe\u63a5 +quickshare.link.tooltip=\u6309 Ctrl-C \u590d\u5236 +quickshare.link.tooltip.mac=\u6309 Cmd-C \u590d\u5236 +quickshare.view.label=\u67e5\u770b +quickshare.unshare.label=\u53d6\u6d88\u5171\u4eab +quickshare.document.shared.label=\u5df2\u5171\u4eab +quickshare.document.shared.tip=\u6b64\u6587\u6863\u5df2\u5171\u4eab\uff08\u5355\u51fb\u663e\u793a\u66f4\u591a\u9009\u9879\uff09 +quickshare.document.share.label=\u5171\u4eab +quickshare.document.share.tip=\u5171\u4eab\u6587\u6863 +quickshare.document.share.failure=\u65e0\u6cd5\u5171\u4eab\u6587\u6863 +quickshare.document.unshared.label=\u5171\u4eab +quickshare.document.unshared.tip=\u5171\u4eab\u6587\u6863 +quickshare.document.unshare.success=\u4e0d\u518d\u5171\u4eab\u6587\u6863 +quickshare.document.unshare.failure=\u65e0\u6cd5\u53d6\u6d88\u5171\u4eab\u6587\u6863 +quickshare.document.unshare.user.failure=\u60a8\u6ca1\u6709\u9002\u5f53\u7684\u6743\u9650\u6267\u884c\u53d6\u6d88\u5171\u4eab\u64cd\u4f5c\u3002 +quickshare.linkshare.label=\u5171\u4eab\u5bf9\u8c61 +# LinkShare +linkshare.action.email.label=\u901a\u8fc7\u7535\u5b50\u90ae\u4ef6\u5171\u4eab +linkshare.action.email.subject=\u5df2\u4ece Alfresco Content Services \u5171\u4eab\u6587\u4ef6 +linkshare.action.email.body=\u5df2\u4ece Alfresco Content Services \u5171\u4eab\u6587\u4ef6 {1}\uff0c\u53ef\u5728\u6b64\u5904\u67e5\u770b\u8be5\u6587\u4ef6\uff1a{0} +linkshare.action.facebook.label=\u4f7f\u7528 Facebook \u5171\u4eab +linkshare.action.facebook.message=\u5df2\u4ece Alfresco Content Services \u5171\u4eab\u6587\u4ef6 {1} +linkshare.action.twitter.label=\u4f7f\u7528 Twitter \u5171\u4eab +linkshare.action.twitter.message=\u5df2\u4ece Alfresco Content Services \u5171\u4eab\u6587\u4ef6 {1} +linkshare.action.google-plus.label=\u4f7f\u7528 Google+ \u5171\u4eab + + +# Comment +comment.document.tip=\u8bc4\u8bba\u6b64\u6587\u6863 +comment.document.label=\u8bc4\u8bba +comment.folder.tip=\u8bc4\u8bba\u6b64\u6587\u4ef6\u5939 +comment.folder.label=\u8bc4\u8bba + +#Dashlets +dashlet.help.tooltip=\u663e\u793a\u6b64 Dashlet \u7684\u5e2e\u52a9 +dashlet.rss.tooltip=\u8ba2\u9605\u6b64 Dashlet \u7684 RSS \u8ba2\u9605\u6e90 +dashlet.edit.tooltip=\u914d\u7f6e\u6b64 Dashlet + +#Module Package Admin page +tool.module-package.label=\u6a21\u5757\u6d4f\u89c8\u5668 +tool.module-package.description=\u6a21\u5757\u6d4f\u89c8\u5668 + +# Category Manager Admin Console +tool.category-manager.label=\u7c7b\u522b\u7ba1\u7406\u5668 +tool.category-manager.description=\u7c7b\u522b\u7ba1\u7406\u5668 +tool.category-manager.edit-category=\u7f16\u8f91\u7c7b\u522b +tool.category-manager.edit-category.failure=\u65e0\u6cd5\u7f16\u8f91\u540d\u79f0\u3002 +tool.category-manager.add-category=\u6dfb\u52a0\u7c7b\u522b +tool.category-manager.add-category.failure=\u65e0\u6cd5\u6dfb\u52a0\u7c7b\u522b\u3002 +tool.category-manager.label.category-name=\u7c7b\u522b\u540d\u79f0\uff1a +tool.category-manager.delete-category=\u5220\u9664\u7c7b\u522b +tool.category-manager.delete-category.failure=\u65e0\u6cd5\u5220\u9664\u7c7b\u522b\u3002 +tool.category-manager.message.confirm.delete.title=\u5220\u9664\u7c7b\u522b +tool.category-manager.message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\uff1a {0}\uff1f + +# Node browser +tool.node-browser.label=\u8282\u70b9\u6d4f\u89c8\u5668 +tool.node-browser.description=\u8282\u70b9\u6d4f\u89c8\u5668 + +# Label +label.folder=\u6587\u4ef6\u5939 +label.document=\u6587\u6863 +label.blogpost=\u535a\u5ba2\u5e16\u5b50 +label.forumpost=\u8bba\u575b\u4e3b\u9898 +label.calendarevent=\u65e5\u5386\u4e8b\u4ef6 +label.wikipage=\u7ef4\u57fa\u9875\u9762 +label.link=\u94fe\u63a5 +label.datalist=\u6570\u636e\u5217\u8868 +label.datalistitem=\u6570\u636e\u5217\u8868\u9879 +label.unknown=\u672a\u77e5 +label.download=\u4e0b\u8f7d +label.viewinbrowser=\u5728\u6d4f\u89c8\u5668\u4e2d\u67e5\u770b +label.viewdetails=\u67e5\u770b\u8be6\u7ec6\u4fe1\u606f +label.selectAll=\u9009\u62e9\u5168\u90e8 +label.selectInvert=\u53cd\u9009 +label.selectNone=\u65e0 +label.selectedItems=\u6240\u9009\u9879 +label.select=\u9009\u62e9 +label.restricted-settings=Alfresco Identity Service \u5df2\u542f\u7528\uff0c\u4e00\u4e9b\u8bbe\u7f6e\u53d7\u5230\u9650\u5236\u3002 + +# Path +message.infolderpath=\u5728\u6587\u4ef6\u5939\u4e2d + +# Cloud Sync Status +# Variables available: {0} = Relative Time (string, e.g. "just now" or "last week"); {1} Sync Owner's name or contents of label.you; NOTE: Both strings contain HTML formatting, {2} Original document link +sync.status.pending=\u540c\u6b65\u5f85\u51b3 +sync.status.synced={1} \u5df2\u540c\u6b65 {0} +sync.status.last-attempt={1} \u4e0a\u6b21\u6210\u529f\u540c\u6b65\u4e86 {0} +sync.status.failed={1} \u5c1d\u8bd5\u4e86\u540c\u6b65 {0} +sync.status.last-failed=\u4e0a\u6b21\u540c\u6b65\u5931\u8d25 +sync.status.transient-error=\u4e34\u65f6\u540c\u6b65\u9519\u8bef +sync.status.transient-error.default-details=\u5982\u679c Alfresco Content Services \u53ef\u4ee5\u518d\u6b21\u4e0e\u4e91\u901a\u4fe1\uff0c\u5c06\u6062\u590d\u540c\u6b65\u3002 +sync.status.copy.pending={2} \u7684\u540c\u6b65\u5f85\u51b3 +sync.status.copy.synced={1} \u4e8e {0} \u540c\u6b65\u4e86 {2} +sync.status.copy.last-attempt={1} \u4e0a\u6b21\u4e8e {0} \u6210\u529f\u540c\u6b65\u4e86 {2} +sync.status.copy.failed={1} \u4e8e {0} \u5c1d\u8bd5\u540c\u6b65\u4e86 {2} +sync.status.copy.last-failed=\u4e0a\u6b21\u540c\u6b65 {2} \u5931\u8d25 +sync.status.show-details=\u663e\u793a\u8be6\u7ec6\u4fe1\u606f +sync.status.hide-details=\u9690\u85cf\u8be6\u7ec6\u4fe1\u606f +sync.status.title=\u540c\u6b65\u4fe1\u606f +sync.status.action.more=\u66f4\u591a\u4fe1\u606f +sync.original-document=\u539f\u59cb\u6587\u6863 + +# Cloud Sync Ajax Failure +sync.unable.diplay.status=\u65e0\u6cd5\u663e\u793a\u540c\u6b65\u72b6\u6001 +sync.unable.get.details=\u65e0\u6cd5\u83b7\u53d6\u8282\u70b9\u8be6\u7ec6\u4fe1\u606f + +# Cloud Sync Confirmation +sync.remove.document.from.cloud=\u4ece\u4e91\u7aef\u79fb\u9664''{0}''\u3002 +sync.remove.folder.from.cloud=\u4ece\u4e91\u7aef\u79fb\u9664''{0}''\u53ca\u5176\u4e0b\u7684\u6240\u6709\u5185\u5bb9\u3002 + +# Cloud Sync related messages +# note: These are also used by the repo tier (copied at build time) + +sync.folder.name_clash=\u76ee\u6807\u6587\u4ef6\u5939\u4e2d\u5df2\u5b58\u5728\u540c\u540d\u7684\u5185\u5bb9\u3002 +sync.folder.not_found=\u65e0\u6cd5\u67e5\u627e\u6587\u4ef6\u5939\u3002 +sync.node.already_synced=\u65e0\u6cd5\u521b\u5efa\u5185\u5bb9\uff1a \u6b64\u5185\u5bb9\u5df2\u4ece\u5176\u4ed6\u4f4d\u7f6e\u540c\u6b65\u3002 +sync.node.other_sync_set=\u6b64\u5185\u5bb9\u5df2\u4ece\u5176\u4ed6\u4f4d\u7f6e\u540c\u6b65\u3002 +sync.node.no_longer_exists=Alfresco Content Services in the Cloud \u4e2d\u4e0d\u518d\u5b58\u5728\u6b64\u5185\u5bb9\u3002 +sync.node.no_longer_exists.description=Alfresco Content Services in the Cloud \u4e2d\u4e0d\u518d\u5b58\u5728\u6b64\u5185\u5bb9\u3002\u8bf7\u5355\u51fb\u8bf7\u6c42\u540c\u6b65\u4ee5\u91cd\u8bd5\u3002 +sync.node.unknown=\u6211\u4eec\u9047\u5230\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002 +sync.node.unknown.description=\u53d1\u751f\u4e86\u610f\u5916\u9519\u8bef\u3002 \u539f\u56e0\uff1a {0}. +sync.node.access_denied=\u65e0\u6cd5\u540c\u6b65\u5185\u5bb9\uff1a \u60a8\u6ca1\u6709\u8bbf\u95ee\u76ee\u6807\u6587\u4ef6\u7684\u6743\u9650\u3002 +sync.node.access_denied_source=\u65e0\u6cd5\u540c\u6b65\u5185\u5bb9\uff1a \u60a8\u6ca1\u6709\u8bbf\u95ee\u6e90\u6587\u4ef6\u7684\u6743\u9650\u3002 +sync.node.content_limit_violation=\u6b64\u6587\u4ef6\u8d85\u8fc7\u4e86\u5185\u5bb9\u9650\u989d\u3002 \u6b64\u6587\u4ef6\u592a\u5927\uff0c\u56e0\u6b64\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002 +sync.node.quota_limit_violation=\u60a8\u8d85\u8fc7\u4e86\u5185\u5bb9\u914d\u989d\u3002 \u53ef\u7528\u7a7a\u95f4\u4e0d\u8db3\uff0c\u56e0\u6b64\u65e0\u6cd5\u6267\u884c\u6b64\u64cd\u4f5c\u3002 +sync.node.authentication_error=\u65e0\u6cd5\u540c\u6b65\u5185\u5bb9\u5230\u4e91\uff1a \u8eab\u4efd\u9a8c\u8bc1\u8be6\u7ec6\u4fe1\u606f\u65e0\u6548\u3002 +sync.node.authentication_error.description=\u65e0\u6cd5\u540c\u6b65\u5185\u5bb9\u5230\u4e91\uff1a \u7528\u6237 {0} \u7684\u8eab\u4efd\u9a8c\u8bc1\u4fe1\u606f\u65e0\u6548\u3002 +sync.node.owner_not_found=\u6211\u4eec\u65e0\u6cd5\u540c\u6b65\u5185\u5bb9\uff0c\u56e0\u4e3a\u6240\u6709\u8005\u5df2\u88ab\u79fb\u9664\u6216\u5220\u9664\u3002 +sync.node.owner_not_found.description=\u5df2\u4e0d\u518d\u5b58\u5728\u62e5\u6709\u6b64\u540c\u6b65\u7684\u7528\u6237 {0}\u3002 \u8bf7\u5355\u51fb\u201c\u53d6\u6d88\u540c\u6b65\u201d\u3002 + +sync.communications.error=\u65e0\u6cd5\u4e0e\u8fdc\u7a0b\u7cfb\u7edf\u901a\u4fe1 +sync.communications.error.description=\u65e0\u6cd5\u4e0e\u8fdc\u7a0b\u7cfb\u7edf\u901a\u4fe1\u3002 \u4e00\u65e6\u662f\u901a\u4fe1\u5efa\u7acb\uff0c\u540c\u6b65\u5c06\u81ea\u52a8\u5f00\u59cb + +# Cloud Sync no network available for sync +sync.message.no.active.network=\u5c1a\u672a\u4e3a\u540c\u6b65\u542f\u7528\u7f51\u7edc + +# Cloud Sync create folder in the cloud dialog +sync.new-folder.in-the-cloud.title=\u65b0\u5efa\u6587\u4ef6\u5939 +sync.new-folder.in-the-cloud.header=\u65b0\u5efa\u6587\u4ef6\u5939\u8be6\u7ec6\u4fe1\u606f +sync.new-folder.creation.success=\u5df2\u6210\u529f\u521b\u5efa\u6587\u4ef6\u5939 +sync.new-folder.creation.failure=\u65e0\u6cd5\u521b\u5efa\u6587\u4ef6\u5939 + +#Hybrid Sync Console +hybridsync.ssd-id-header-label=\u540c\u6b65 ID +hybridsync.ssd-failed-reason-header-label=\u540c\u6b65\u5931\u8d25\u7c7b\u578b +hybridsync.path-desc-header-label=\u539f\u59cb\u9879\u4f4d\u7f6e +hybridsync.sync-creator-header-label=\u540c\u6b65\u521b\u5efa\u8005 +hybridsync.cloud-user-header-label=\u4e91\u7528\u6237 +hybridsync.remote-tenant-id-header-label=\u4e91\u7f51\u7edc +hybridsync.target-folder-node-ref-header-label=\u4e91\u76ee\u7684\u5730 +hybridsync.actions-header-label=\u64cd\u4f5c + +#Hybrid workflow +hybridworkflow.destination-select.title=\u4e3a\u4e91\u4e0a\u7684\u6587\u6863\u9009\u62e9\u76ee\u7684\u5730 +hybridworkflow.set.destination=\u76ee\u7684\u5730\u548c\u88ab\u6307\u6d3e\u8005 +hybridworkflow.authority.single=\u88ab\u6307\u6d3e\u8005 +hybridworkflow.authority.multiple=\u590d\u67e5\u8005 +hybridworkflow.review.approved=\u5df2\u6279\u51c6 +hybridworkflow.review.rejected=\u5df2\u62d2\u7edd +hybridworkflow.destination-select.folderPrefix=\u6587\u6863 +hybridworkflow.destination.network=\u7f51\u7edc +hybridworkflow.destination.site=\u7ad9\u70b9 +hybridworkflow.destination.folder=\u6587\u4ef6\u5939 +hybridworkflow.destination.button=\u9009\u62e9 + +# Security +security.insecuremimetype=\u8bf7\u6c42\u5185\u5bb9\u7684 MIME \u7c7b\u578b\u88ab\u8ba4\u4e3a\u6709\u5b89\u5168\u98ce\u9669\uff0c\u5c06\u4e0d\u88ab\u663e\u793a\u3002 + +# Lightbox +lightbox.close=\u5173\u95ed +lightbox.loading=\u52a0\u8f7d\u4e2d diff --git a/share/src/main/resources/alfresco/messages/smartfolder.properties b/share/src/main/resources/alfresco/messages/smartfolder.properties new file mode 100644 index 0000000000..aa313c8a92 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Smart Folder Template +aspect.smf_customConfigSmartFolder=Custom Smart Folder +aspect.smf_systemConfigSmartFolder=System Smart Folder +aspect.smf_smartFolder=Smart Folder +aspect.smf_smartFolderChild=Smart Folder Child +property.smf_system-template-location=Smart Folder Template +property.smf_custom-template-association=Smart Folder Template diff --git a/share/src/main/resources/alfresco/messages/smartfolder_de.properties b/share/src/main/resources/alfresco/messages/smartfolder_de.properties new file mode 100644 index 0000000000..7ab8c77ab5 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_de.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Vorlage f\u00fcr Smart-Folder +aspect.smf_customConfigSmartFolder=Parametrierter Smart-Folder +aspect.smf_systemConfigSmartFolder=System-Smart-Folder +aspect.smf_smartFolder=Smart-Folder +aspect.smf_smartFolderChild=Dem Smart-Folder untergeordnetes Element +property.smf_system-template-location=Vorlage f\u00fcr Smart-Folder +property.smf_custom-template-association=Vorlage f\u00fcr Smart-Folder diff --git a/share/src/main/resources/alfresco/messages/smartfolder_es.properties b/share/src/main/resources/alfresco/messages/smartfolder_es.properties new file mode 100644 index 0000000000..90a832b4bd --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_es.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Plantilla de carpeta inteligente +aspect.smf_customConfigSmartFolder=Carpeta inteligente personalizada +aspect.smf_systemConfigSmartFolder=Carpeta inteligente del sistema +aspect.smf_smartFolder=Carpeta inteligente +aspect.smf_smartFolderChild=Subdirectorio de carpeta inteligente +property.smf_system-template-location=Plantilla de carpeta inteligente +property.smf_custom-template-association=Plantilla de carpeta inteligente diff --git a/share/src/main/resources/alfresco/messages/smartfolder_fr.properties b/share/src/main/resources/alfresco/messages/smartfolder_fr.properties new file mode 100644 index 0000000000..d5d3eb17d3 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_fr.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Mod\u00e8le de dossier intelligent +aspect.smf_customConfigSmartFolder=Dossier intelligent personnalis\u00e9 +aspect.smf_systemConfigSmartFolder=Dossier intelligent syst\u00e8me +aspect.smf_smartFolder=Dossier intelligent +aspect.smf_smartFolderChild=Sous-r\u00e9pertoire de dossier intelligent +property.smf_system-template-location=Mod\u00e8le de dossier intelligent +property.smf_custom-template-association=Mod\u00e8le de dossier intelligent diff --git a/share/src/main/resources/alfresco/messages/smartfolder_it.properties b/share/src/main/resources/alfresco/messages/smartfolder_it.properties new file mode 100644 index 0000000000..00734f9ee0 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_it.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Modello di cartella intelligente +aspect.smf_customConfigSmartFolder=Cartella intelligente personalizzata +aspect.smf_systemConfigSmartFolder=Cartella intelligente di sistema +aspect.smf_smartFolder=Cartella intelligente +aspect.smf_smartFolderChild=Cartella intelligente figlio +property.smf_system-template-location=Modello di cartella intelligente +property.smf_custom-template-association=Modello di cartella intelligente diff --git a/share/src/main/resources/alfresco/messages/smartfolder_ja.properties b/share/src/main/resources/alfresco/messages/smartfolder_ja.properties new file mode 100644 index 0000000000..72888b6e4b --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_ja.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 +aspect.smf_customConfigSmartFolder=\u30ab\u30b9\u30bf\u30e0\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0 +aspect.smf_systemConfigSmartFolder=\u30b7\u30b9\u30c6\u30e0\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0 +aspect.smf_smartFolder=\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0 +aspect.smf_smartFolderChild=\u5b50\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0 +property.smf_system-template-location=\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 +property.smf_custom-template-association=\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 diff --git a/share/src/main/resources/alfresco/messages/smartfolder_nb.properties b/share/src/main/resources/alfresco/messages/smartfolder_nb.properties new file mode 100644 index 0000000000..bc88568e6b --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_nb.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Smartmappe Mal +aspect.smf_customConfigSmartFolder=Tilpasset Smartmappe +aspect.smf_systemConfigSmartFolder=System Smartmappe +aspect.smf_smartFolder=Smartmappe +aspect.smf_smartFolderChild=Smartmappe Underordnede +property.smf_system-template-location=Smartmappe Mal +property.smf_custom-template-association=Smartmappe Mal diff --git a/share/src/main/resources/alfresco/messages/smartfolder_nl.properties b/share/src/main/resources/alfresco/messages/smartfolder_nl.properties new file mode 100644 index 0000000000..f1ad555590 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_nl.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Slimme-mapsjabloon +aspect.smf_customConfigSmartFolder=Aangepaste slimme map +aspect.smf_systemConfigSmartFolder=Slimme map systeem +aspect.smf_smartFolder=Slimme map +aspect.smf_smartFolderChild=Onderliggend element slimme map +property.smf_system-template-location=Slimme-mapsjabloon +property.smf_custom-template-association=Slimme-mapsjabloon diff --git a/share/src/main/resources/alfresco/messages/smartfolder_pt_BR.properties b/share/src/main/resources/alfresco/messages/smartfolder_pt_BR.properties new file mode 100644 index 0000000000..540ee19a41 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_pt_BR.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=Modelo de pasta inteligente +aspect.smf_customConfigSmartFolder=Pasta inteligente personalizada +aspect.smf_systemConfigSmartFolder=Pasta inteligente do sistema +aspect.smf_smartFolder=Pasta inteligente +aspect.smf_smartFolderChild=Pasta inteligente secund\u00e1ria +property.smf_system-template-location=Modelo de pasta inteligente +property.smf_custom-template-association=Modelo de pasta inteligente diff --git a/share/src/main/resources/alfresco/messages/smartfolder_ru.properties b/share/src/main/resources/alfresco/messages/smartfolder_ru.properties new file mode 100644 index 0000000000..3b4524bc05 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_ru.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=\u0428\u0430\u0431\u043b\u043e\u043d \u0423\u043c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +aspect.smf_customConfigSmartFolder=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0423\u043c\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +aspect.smf_systemConfigSmartFolder=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0423\u043c\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +aspect.smf_smartFolder=\u0423\u043c\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +aspect.smf_smartFolderChild=\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0423\u043c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +property.smf_system-template-location=\u0428\u0430\u0431\u043b\u043e\u043d \u0423\u043c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +property.smf_custom-template-association=\u0428\u0430\u0431\u043b\u043e\u043d \u0423\u043c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 diff --git a/share/src/main/resources/alfresco/messages/smartfolder_zh_CN.properties b/share/src/main/resources/alfresco/messages/smartfolder_zh_CN.properties new file mode 100644 index 0000000000..3f38855ec3 --- /dev/null +++ b/share/src/main/resources/alfresco/messages/smartfolder_zh_CN.properties @@ -0,0 +1,9 @@ +## Smart Folder Common Labels + +type.smf_smartFolderTemplate=\u667a\u80fd\u6587\u4ef6\u6a21\u677f +aspect.smf_customConfigSmartFolder=\u81ea\u5b9a\u4e49\u667a\u80fd\u6587\u4ef6\u5939 +aspect.smf_systemConfigSmartFolder=\u7cfb\u7edf\u667a\u80fd\u6587\u4ef6\u5939 +aspect.smf_smartFolder=\u667a\u80fd\u6587\u4ef6\u5939 +aspect.smf_smartFolderChild=\u667a\u80fd\u6587\u4ef6\u5939\u5b50\u7ea7 +property.smf_system-template-location=\u667a\u80fd\u6587\u4ef6\u6a21\u677f +property.smf_custom-template-association=\u667a\u80fd\u6587\u4ef6\u6a21\u677f diff --git a/share/src/main/resources/alfresco/share-cmis-config.xml b/share/src/main/resources/alfresco/share-cmis-config.xml new file mode 100644 index 0000000000..c79d7bf629 --- /dev/null +++ b/share/src/main/resources/alfresco/share-cmis-config.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/share-cmm-config.xml b/share/src/main/resources/alfresco/share-cmm-config.xml new file mode 100644 index 0000000000..3092807a36 --- /dev/null +++ b/share/src/main/resources/alfresco/share-cmm-config.xml @@ -0,0 +1,107 @@ + + + + + + true + + + + + + + + act + app + bpm + brightcove + cloudfront + dl + dod + download + facebook + flickr + fm + hwf + ia + imap + imwf + inwf + linkedin + lnk + prj + pub + pubwf + rma + rmr + rmwf + slideshare + srft + st + surf + trx + twitter + wf + youtube + + + + act + additionalXmpModel + aos + app + audio + blg + bpm + brightcove + cloudfront + cm + cmm + dl + dod + dp + emailserver + exif + facebook + flickr + fm + hwf + ia + imap + imwf + inwf + iptcxmp + linkedin + lnk + pbcoreModel + pub + qshare + rc + rma + rmc + rmv + rn + rule + slideshare + srft + srn + st + surf + sync + sys + trx + twitter + ver2 + ver + webdav + webvttModel + wf + wfl + youtube + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/share-config.xml b/share/src/main/resources/alfresco/share-config.xml new file mode 100644 index 0000000000..1a4cc4980f --- /dev/null +++ b/share/src/main/resources/alfresco/share-config.xml @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + false + + false + + + false + + + + en,de,es,fr,it,ja,nl,zh_CN,ru,nb,pt_BR + + +
+ + + 5 + + + 5 + +
+
+ + + + + + manual + true + + + true + true + + + + ^/WEB-INF/.* + .*/\.\./WEB-INF/.* + .*/classes/.*\.properties + .*/classes/alfresco/.*\.xml + + + + + + +
+ alfresco-logo.svg + Alfresco Share + footer-com + +
+ + logo-com + + + logo-com + +
+ + + + + + + + /site/{site}/{pageid}/p/{pagename} + /{pageid}/p/{pagename} + + + /site/{site}/{pageid}/ws/{webscript} + + /site/{site}/dashboard + /context/{pagecontext}/{pageid} + /site/{site}/{pageid} + /user/{userid}/dashboard + /user/{userid}/{pageid} + /user/{userid}/profile + /user/{pageid} + /console/{pageid}/{toolid} + /console/{pageid} + /{pageid}/ws/{webscript} + + + + + + + dashboard + calendar + wiki-page?title=Main_Page + documentlibrary + discussions-topiclist + blog-postlist + links + data-lists + + + + add-users + + + + + + + 2 + 8 + true + + + false + + + + + + 100 + + + + + + + + 50 + + + + + + + 1 + + + 250 + + + 20 + + + + always-options + + + true + + + + + + + cm:name + cm:title + cm:description + cm:author + cm:modifier + cm:modified|false + cm:creator + cm:created|false + .size|true + .mimetype + TYPE + + + + + + + + +
cm:content
+
cm:folder
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {context}/s/{sharedId} + + + + + + + mailto:?subject={subject}&body={body} + new + + + https://www.facebook.com/sharer/sharer.php?u={shareUrl}&t={message} + new + + + https://twitter.com/intent/tweet?text={message}&url={shareUrl} + new + + + https://plus.google.com/share?url={shareUrl} + new + + + + + + + + + + alfresco + Alfresco Connector + Connects to an Alfresco instance using cookie-based authentication + org.springframework.extensions.webscripts.RequestCachingConnector + alfresco-ticket + 0 + + + + + + + ${aims.enabled} + ${aims.realm} + ${aims.resource} + ${aims.authServerUrl} + ${aims.sslRequired} + ${aims.publicClient} + ${aims.autodetectBearerOnly} + ${aims.alwaysRefreshToken} + ${aims.principalAttribute} + + ${aims.enableBasicAuth} + + + + + ${cookies.sameSite} + ${http.secured.session} + + + + + ${test.firstName} + ${test.lastName} + + +
diff --git a/share/src/main/resources/alfresco/share-datalist-form-config.xml b/share/src/main/resources/alfresco/share-datalist-form-config.xml new file mode 100644 index 0000000000..bac391adb5 --- /dev/null +++ b/share/src/main/resources/alfresco/share-datalist-form-config.xml @@ -0,0 +1,657 @@ + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + {doclib} + + + + + + + +
+ + + + + + + + +
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + {doclib} + + + + +
+
+ +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/share-documentlibrary-config.xml b/share/src/main/resources/alfresco/share-documentlibrary-config.xml new file mode 100644 index 0000000000..7766d36399 --- /dev/null +++ b/share/src/main/resources/alfresco/share-documentlibrary-config.xml @@ -0,0 +1,1543 @@ + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "actions": { + "show": "true" + }, + "indicators": { + "show": "true" + }, + "selector": { + "show": "true" + }, + "thumbnail": { + "show": "true" + }, + "propertyColumns": [ + { + "property": "name", + "label": "label.name", + "width": "300" + }, + { + "property": "cm:title", + "label": "label.title" + }, + { + "property": "cm:description", + "label": "label.description" + }, + { + "property": "cm:creator", + "label": "label.creator" + }, + { + "property": "cm:created", + "label": "label.created" + }, + { + "property": "cm:modifier", + "label": "label.modifier" + }, + { + "property": "modified", + "label": "label.modified" + } + ] + } + + + + + + + + + + + { + "actions": { + "show": "true" + }, + "indicators": { + "show": "true" + }, + "selector": { + "show": "true" + }, + "thumbnail": { + "show": "true" + }, + "propertyColumns": [ + { + "property": "name", + "label": "table.audio.label.name", + "width": "300" + }, + { + "property": "cm:title", + "label": "table.audio.label.title", + "width": "200" + }, + { + "property": "audio:album", + "label": "table.audio.label.album", + "width": "200", + "link": "true" + }, + { + "property": "audio:artist", + "label": "table.audio.label.artist", + "width": "200" + }, + { + "property": "audio:genre", + "label": "table.audio.label.genre", + "width": "100" + }, + { + "property": "audio:trackNumber", + "label": "table.audio.label.trackNumber", + "width": "100" + }, + { + "property": "audio:sampleRate", + "label": "table.audio.label.sampleRate", + "width": "100" + }, + { + "property": "audio:compressor", + "label": "table.audio.label.compressor", + "width": "100" + } + ] + } + + + + + + + + + + + { + "actions": { + "show": "true" + }, + "indicators": { + "show": "true" + }, + "selector": { + "show": "true" + }, + "thumbnail": { + "show": "true" + }, + "propertyColumns": [ + { + "property": "name", + "label": "label.name", + "width": "300" + }, + { + "property": "cm:description", + "label": "label.description", + "width": "200" + }, + { + "property": "tags", + "label": "label.tags", + "width": "100" + }, + { + "property": "exif:pixelXDimension", + "label": "label.exif.width", + "width": "75" + }, + { + "property": "exif:pixelYDimension", + "label": "label.exif.height", + "width": "75" + }, + { + "property": "size", + "label": "label.size", + "width": "75" + }, + { + "property": "version", + "label": "label.version", + "width": "50" + } + ] + } + + + + + + + + + + + + + resolver.doclib.doclistDataUrl + + + + + + + + + + true + + + -1 + + + 7000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + 262144000 + + 0 + + + + + cm:name|true + cm:likesRatingSchemeCount|false + cm:title + cm:description + cm:created + cm:creator + cm:modified + cm:modifier + cm:content.size + cm:content.mimetype + TYPE + + + + + + 100 + + + + + + + evaluator.doclib.indicator.editing + + + + evaluator.doclib.indicator.lockOwner + + + + evaluator.doclib.indicator.lockedOwner + {jsNode.properties.owner.displayName} + {jsNode.properties.owner.userName} + + + + evaluator.doclib.indicator.nodeLocked + {jsNode.properties.cm_lockOwner.displayName} + {jsNode.properties.cm_lockOwner.userName} + locked + + + + evaluator.doclib.indicator.activeWorkflows + {activeWorkflows} + + + evaluator.doclib.indicator.simpleWorkflow + + + + evaluator.doclib.indicator.rules + + + evaluator.doclib.indicator.exifMetadata + + + evaluator.doclib.indicator.geographicMetadata + + + evaluator.doclib.indicator.transferredNode + + + + + + + + + + + + + + + + + + + + + + create-content?destination={nodeRef}&itemId=cm:content&mimeType=text/plain + + + create-content?destination={nodeRef}&itemId=cm:content&mimeType=text/html + + + create-content?destination={nodeRef}&itemId=cm:content&mimeType=text/xml + + + onNewFolder + + + + true + + + + + + + + + + + true + + + + + + + alfresco://company/home + + + false + + + + false + + + 500 + + + + + + + + + + + + + + + + + {downloadUrl} + _blank + evaluator.doclib.action.downloadBrowser + evaluator.doclib.action.hasContent + + + + + {viewUrl} + evaluator.doclib.action.hasContent + + + + + document-details?nodeRef={node.nodeRef} + + + + + folder-details?nodeRef={node.nodeRef} + + + + + onActionDetails + + Write + + evaluator.doclib.metadata.isLocked + evaluator.doclib.action.checkedOutAspect + + + + + edit-metadata?nodeRef={node.nodeRef} + + Write + + evaluator.doclib.metadata.isLocked + evaluator.doclib.action.checkedOutAspect + + + + + onActionSimpleRepoAction + + accept-simpleworkflow + message.simple-workflow.approved + message.simple-workflow.failure + + evaluator.doclib.action.simpleApprove + + + + + onActionSimpleRepoAction + + reject-simpleworkflow + message.simple-workflow.rejected + message.simple-workflow.failure + + evaluator.doclib.action.simpleReject + + + + + onActionSimpleRepoAction + + counter + message.increment-counter.success + message.increment-counter.failure + + + + + onActionSimpleRepoAction + + extract-metadata + message.extract-metadata.success + message.extract-metadata.failure + + + + + onActionFormDialog + + action + transform + create + {node.nodeRef} + message.transform.success + message.transform.failure + + + + + onActionFormDialog + + action + transform-image + create + {node.nodeRef} + message.transform-image.success + message.transform-image.failure + + + + + onActionFormDialog + + action + script + create + {node.nodeRef} + message.execute-script.success + message.execute-script.failure + + + + + onActionLocate + evaluator.doclib.action.locateAction + + + + + onActionUploadNewVersion + + Write + + evaluator.doclib.action.upload + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.metadata.isLocked + + + + + inline-edit?nodeRef={node.nodeRef} + + Write + + + evaluator.doclib.action.inlineEdit + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + + + + + onActionEditOnline + + Write + + + evaluator.doclib.action.onlineEdit + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isLocked + evaluator.doclib.action.isAosOnlineEditAvailable + + + + + onActionEditOnlineAos + + Write + + evaluator.doclib.action.isAosOnlineEditAvailable + evaluator.doclib.action.notEditBrowser + evaluator.doclib.action.isLockedForAos + evaluator.doclib.action.isNodeEditableAos + + + + + onActionEditOffline + + Write + + evaluator.doclib.action.offlineEdit + evaluator.doclib.action.hasContent + evaluator.doclib.action.notEditable + + + + + onActionCopyTo + evaluator.doclib.action.editableByCurrentUser + + + + + onActionMoveTo + + Delete + + evaluator.doclib.action.editableByCurrentUser + + + + + onActionUnzipTo + evaluator.doclib.action.unzipTo + + + + + onActionDelete + + Delete + + evaluator.doclib.action.editableByCurrentUser + evaluator.doclib.action.isDeletable + + + + + onActionAssignWorkflow + + + + + {managePermissionsUrl} + + ChangePermissions + + evaluator.doclib.action.siteBased + evaluator.doclib.action.isWorkingCopy + + + + + {managePermissionsUrl} + + ChangePermissions + + evaluator.doclib.action.siteBased + evaluator.doclib.action.isWorkingCopy + + + + + + + Delete + + onActionTakeOwnership + take-ownership + message.take-ownership.success + message.take-ownership.failure + + + + + onActionManageAspects + + Write + + evaluator.doclib.action.isLocked + + + + + onActionChangeType + + Write + + evaluator.doclib.action.isLocked + + + + + document-details?nodeRef={workingCopy.sourceNodeRef} + + evaluator.doclib.action.isWorkingCopy + + + + + document-details?nodeRef={workingCopy.workingCopyNodeRef} + + evaluator.doclib.action.hasWorkingCopy + + + + + onActionCancelEditing + + CancelCheckOut + + evaluator.doclib.action.cancelEditing + + + + + onActionUnlockDocument + + Unlock + + evaluator.doclib.metadata.isSomeoneLocked + evaluator.doclib.action.notHasWorkingCopy + evaluator.doclib.action.cancelLockedBlacklist + evaluator.doclib.action.transferred + + + + + folder-rules?nodeRef={node.nodeRef} + + ChangePermissions + + + + + + geographic-map?nodeRef={node.nodeRef} + + evaluator.doclib.action.googleMaps + + + + + + {sourceRepositoryUrl} + _blank + + evaluator.doclib.action.transferred + + + + + onActionFolderDownload + + + + + + + resolver.doclib.actionGroup + + + + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + + + + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + evaluator.doclib.action.DocumentEnableInSmartFolder + + + + + + + + evaluator.doclib.action.FolderAndSmartFolderEnable + + + evaluator.doclib.action.FolderAndSmartFolderEnable + + + evaluator.doclib.action.FolderEnableInSmartFolder + + + + + + + + + + + + evaluator.doclib.action.FolderEnableInSmartFolder + + + + + + + + + evaluator.doclib.action.FolderAndSmartFolderEnable + + + + + evaluator.doclib.action.FolderEnableInSmartFolder + + + + + + + + + evaluator.doclib.action.FolderEnableInSmartFolder + + + evaluator.doclib.action.FolderEnableInSmartFolder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "social":{ + "browse":{ + "folder":[ + { + "filter":{ + "name":"aspect", + "match":[ + "smf:smartFolder" + ], + "name":"type", + "match":[ + "app:folderlink" + ] + } + } + ], + "file":[ + { + "filter":{ + "name":"type", + "match":[ + "app:filelink" + ] + } + } + ] + }, + "details":{ + "folder":[ + { + "filter":{ + "name":"aspect", + "match":[ + "smf:smartFolder" + ], + "name":"type", + "match":[ + "app:folderlink" + ] + } + } + ], + "file":[ + { + "filter":{ + "name":"type", + "match":[ + "app:filelink" + ] + } + } + ] + } + }, + "tags":{ + "browse":{ + "folder":[ + { + "filter":{ + "name":"aspect", + "match":[ + "smf:smartFolder" + ], + "name":"type", + "match":[ + "app:folderlink" + ] + } + } + ], + "file":[ + { + "filter":{ + "name":"type", + "match":[ + "app:filelink" + ] + } + } + ] + } + }, + "date":{ + "browse":{ + "folder":[ + { + "filter":{ + "name":"aspect", + "match":[ + "smf:smartFolder" + ] + } + } + ] + }, + "details":{ + "folder":[ + { + "filter":{ + "name":"aspect", + "match":[ + "smf:smartFolder" + ] + } + } + ] + } + } + } + + + + + + + { + "browse":{ + "folder":[ + { + "filter":{ + "name":"aspect", + "match":[ + "smf:smartFolder" + ] + }, + "style":{ + "css":"icon-smart", + "icons":{ + "16x16":{ + "icon":"components/documentlibrary/images/smart-folder-16.png" + }, + "32x32":{ + "icon":"components/documentlibrary/images/smart-folder-32.png" + }, + "48x48":{ + "icon":"components/documentlibrary/images/smart-folder-48.png" + }, + "64x64":{ + "icon":"components/documentlibrary/images/smart-folder-64.png" + }, + "256x256":{ + "icon":"components/documentlibrary/images/smart-folder-256.png" + } + } + } + } + ] + } + } + + + + diff --git a/share/src/main/resources/alfresco/share-form-config.xml b/share/src/main/resources/alfresco/share-form-config.xml new file mode 100644 index 0000000000..9ba428b638 --- /dev/null +++ b/share/src/main/resources/alfresco/share-form-config.xml @@ -0,0 +1,1953 @@ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 255 + + + + + + + + true + + + + + + + + + + + + + + + + + + + + true + aspect=cm:taggable + /api/tag/workspace/SpacesStore + tag + + + + + true + + + + + + + + +
+ + +
+ + + + + + + + + + + + + 255 + + + + + + + + true + + + + + true + aspect=cm:taggable + /api/tag/workspace/SpacesStore + tag + + + + + true + + + + + + +
+ + + + + + + + + + 255 + + + + + + + + explorer + true + + + +
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + 255 + + + + + + + + true + + + + + + + + + + + + true + aspect=cm:taggable + /api/tag/workspace/SpacesStore + tag + + + + + true + + + +
+ + +
+ + + + + + + + + + + + + 255 + + + + + + + + true + + + + + true + aspect=cm:taggable + /api/tag/workspace/SpacesStore + tag + + + + + true + + + + +
+
+ + + + + +
+ + + + + + + + + + + + 255 + + + + + + + + explorer + + + + + mimeType + + + + + editInline + + + +
+ + +
+
+ + + + + +
+ + + + + + + + + + 255 + + + + + + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + true + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + true + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + true + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + true + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + 1024 + + + + + + + + + 15 + + + + + 1024 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + http|http,https|https + + + + + + + + + + + + + + + + + + + http|http,https|https + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + VALIDATE|VALIDATE,AUTO|AUTO,FULL|FULL + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + width: 250px; + + + + + width: 50px; + + + + + width: 50px; + + + + + width: 50px; + + + + + width: 100px; + + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 50px; + + + + + width: 100px; + + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 200px; + + + + + width: 325px; + + + + + width: 50px; + + + + + width: 200px; + + + + + width: 325px; + + + + + width: 50px; + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + width: 250px; + + + + + width: 50px; + + + + + width: 50px; + + + + + width: 50px; + + + + + width: 100px; + + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 50px; + + + + + width: 100px; + + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 100px; + + + + + width: 200px; + + + + + width: 325px; + + + + + width: 50px; + + + + + width: 200px; + + + + + width: 325px; + + + + + width: 50px; + + + +
+
+
+ + + + +
+ + + + + + + + lucene|Lucene,solr|Solr,solr4|Solr 4 + + + +
+
+
+ + + + +
+ + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + image/gif|GIF Image,image/jpeg|JPEG Image,image/png|PNG Image + + + + + +
+
+
+ + + + +
+ + + + + + +
+
+
+ + + + +
+ + + + + + + + + + +
+
+
+ + +
+ + + + +
+
+
+ + +
+ + + + + +
+
+
+ + +
+ + + +
+
+
+ + + +
+ + + + + + + + +
+
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + +
+
+
+ + + +
+ + + + + + + +
+
+
+ + + +
+ + + + + + + + + false + + + + + false + + + +
+
+
+ + + +
+ + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + +
+
+
+ + + + +
+ + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + +
+
+
+ + + +
+ + + + + + + +
+
+
+ + + +
+ + + + + + + +
+
+
+ + + + + +
+ + + + + + + + +
+
+
+ + + + +
+ + + + + + +
+
+
+
diff --git a/share/src/main/resources/alfresco/share-security-config.xml b/share/src/main/resources/alfresco/share-security-config.xml new file mode 100644 index 0000000000..6854dd815b --- /dev/null +++ b/share/src/main/resources/alfresco/share-security-config.xml @@ -0,0 +1,304 @@ + + + + + + + allow + + + + + * + + + + + + + + + + + Alfresco-CSRFToken + + + + + + + + + + + {token} +
{token}
+ {token} +
+ + + + + + + + /proxy/alfresco/remoteadm/.* + + + It is not allowed to access this url from your browser + + + + + + + POST + /proxy/alfresco/api/publishing/channels/.+ + + + {referer} + + + {origin} + + + + + + + POST + /page/caches/dependency/clear|/page/index|/page/surfBugStatus|/page/modules/deploy|/page/modules/module|/page/api/javascript/debugger|/page/console + + + {referer} + + + {origin} + + + + + + + POST + /page/dologin(\?.+)?|/page/site/[^/]+/start-workflow|/page/start-workflow|/page/context/[^/]+/start-workflow + + + {referer} + + + {origin} + + + + + + + POST + /page/dologout(\?.+)? + + + {referer} + + + {origin} + + + {token} + {token} + + + + + + + + .+ + + + + + + {token} + {token} + + + + + + + GET + /page/.* + + .+ + .+ + + + + {token} + {token} + + + + + + + POST +
multipart/.+
+ + .+ + +
+ + {token} + {token} + + + {referer} + + + {origin} + +
+ + + + + POST|PUT|DELETE + + .+ + + + + {token} + {token} + + + {referer} + + + {origin} + + +
+ +
+ + + + + +
+ X-Frame-Options + SAMEORIGIN +
+ + +
+ X-Content-Type-Options + nosniff +
+ + +
+ X-XSS-Protection + 1; mode=block +
+
+
+ + +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/share-workflow-form-config.xml b/share/src/main/resources/alfresco/share-workflow-form-config.xml new file mode 100644 index 0000000000..b87a9e252b --- /dev/null +++ b/share/src/main/resources/alfresco/share-workflow-form-config.xml @@ -0,0 +1,1600 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + + + + + + + + +
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + + 1 + 100 + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + width: 95% + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + 1 + 100 + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + width: 95% + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + 1 + 100 + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + width: 95% + + + + + false + false + + + + + + + + + + + +
+
+
+ + + + + + + + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + + + + + + + + + +
+
+ + + +
+ + + + + + + + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+
+ +
diff --git a/share/src/main/resources/alfresco/site-data/chrome/slingshot-region-chrome.xml b/share/src/main/resources/alfresco/site-data/chrome/slingshot-region-chrome.xml new file mode 100644 index 0000000000..0e8931e029 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/chrome/slingshot-region-chrome.xml @@ -0,0 +1,15 @@ + + + Slingshot Region Chrome + + + + webtemplate + slingshot-region-chrome + + + webtemplate + ${mode.view.uri} + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/components/global.bootstrap.xml b/share/src/main/resources/alfresco/site-data/components/global.bootstrap.xml new file mode 100644 index 0000000000..2c4d4ade14 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/components/global.bootstrap.xml @@ -0,0 +1,7 @@ + + + global + bootstrap + global + /surf/dojo/bootstrap + diff --git a/share/src/main/resources/alfresco/site-data/components/global.footer.xml b/share/src/main/resources/alfresco/site-data/components/global.footer.xml new file mode 100644 index 0000000000..04643d7c83 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/components/global.footer.xml @@ -0,0 +1,7 @@ + + + global + footer + global + /components/footer + diff --git a/share/src/main/resources/alfresco/site-data/components/global.head-resources.xml b/share/src/main/resources/alfresco/site-data/components/global.head-resources.xml new file mode 100644 index 0000000000..62656cd121 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/components/global.head-resources.xml @@ -0,0 +1,12 @@ + + + global + head-resources + global + /components/head/resources + + {theme} + {pageid} + {site} + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/components/global.head-title.xml b/share/src/main/resources/alfresco/site-data/components/global.head-title.xml new file mode 100644 index 0000000000..f84f827649 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/components/global.head-title.xml @@ -0,0 +1,28 @@ + + + global + head-title + global + + + + + + + + quickshare + + + + /components/quickshare/title + + {shareid} + + + + /components/head/title + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/components/global.header.xml b/share/src/main/resources/alfresco/site-data/components/global.header.xml new file mode 100644 index 0000000000..9018d09fa2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/components/global.header.xml @@ -0,0 +1,7 @@ + + + global + header + global + /components/header + diff --git a/share/src/main/resources/alfresco/site-data/components/global.share-header.xml b/share/src/main/resources/alfresco/site-data/components/global.share-header.xml new file mode 100644 index 0000000000..add2054ea4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/components/global.share-header.xml @@ -0,0 +1,7 @@ + + + global + share-header + global + /share-header + diff --git a/share/src/main/resources/alfresco/site-data/configurations/slingshot.site.configuration.xml b/share/src/main/resources/alfresco/site-data/configurations/slingshot.site.configuration.xml new file mode 100644 index 0000000000..a2f18f166d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/configurations/slingshot.site.configuration.xml @@ -0,0 +1,10 @@ + + + Slingshot Project + Slingshot Project + site + + lightTheme + site-index + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/extensions/debug-disabler-extension.xml b/share/src/main/resources/alfresco/site-data/extensions/debug-disabler-extension.xml new file mode 100644 index 0000000000..cd44da7a99 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/extensions/debug-disabler-extension.xml @@ -0,0 +1,16 @@ + + + + Debug Disabler Extension + Applies config to disable debug + + + + false + false + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/extensions/debug-enabler-extension.xml b/share/src/main/resources/alfresco/site-data/extensions/debug-enabler-extension.xml new file mode 100644 index 0000000000..807d3c4274 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/extensions/debug-enabler-extension.xml @@ -0,0 +1,16 @@ + + + + Debug Enabler Extension + Applies config to enable debug + + + + true + false + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/page-types/login.xml b/share/src/main/resources/alfresco/site-data/page-types/login.xml new file mode 100644 index 0000000000..cdb17fe2fd --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/page-types/login.xml @@ -0,0 +1,4 @@ + + + Login Page Type + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/page-types/logout.xml b/share/src/main/resources/alfresco/site-data/page-types/logout.xml new file mode 100644 index 0000000000..98ba33dd3a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/page-types/logout.xml @@ -0,0 +1,4 @@ + + + Logout Page Type + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/accept-invite.xml b/share/src/main/resources/alfresco/site-data/pages/accept-invite.xml new file mode 100644 index 0000000000..f24023caec --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/accept-invite.xml @@ -0,0 +1,9 @@ + + + Accept invitation + page.acceptInvite.title + Accept invitation page. Loading the page will trigger the site invitation to be accepted and enables the account of the user if still disabled + page.acceptInvite.description + accept-invite + none + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/add-groups.xml b/share/src/main/resources/alfresco/site-data/pages/add-groups.xml new file mode 100644 index 0000000000..c0dd1a4b3a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/add-groups.xml @@ -0,0 +1,11 @@ + + + add-groups + add-groups + Add Groups + page.addGroups.title + Site Groups + page.addGroups.description + add-groups + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/add-users.xml b/share/src/main/resources/alfresco/site-data/pages/add-users.xml new file mode 100644 index 0000000000..8e55a60937 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/add-users.xml @@ -0,0 +1,11 @@ + + + invite + invite + Invite + page.add-users.title + Add Users + page.add-users.description + add-users + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/admin-console.xml b/share/src/main/resources/alfresco/site-data/pages/admin-console.xml new file mode 100644 index 0000000000..31d3a2fac8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/admin-console.xml @@ -0,0 +1,27 @@ + + + Admin Console + page.adminConsole.title + Administration and Management Console + page.adminConsole.description + console + admin + + + + + title + /components/title/simple-title + + page.adminConsole.title + + + + + + tools + /components/console/tools + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/advsearch.xml b/share/src/main/resources/alfresco/site-data/pages/advsearch.xml new file mode 100644 index 0000000000..0ab022b9fe --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/advsearch.xml @@ -0,0 +1,24 @@ + + + Advanced Search + page.advsearch.title + Advanced Search view + page.advsearch.description + search + user + + + + + title + /components/title/advsearch-title + + + + + search + /components/search/advsearch + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/blog-postedit.xml b/share/src/main/resources/alfresco/site-data/pages/blog-postedit.xml new file mode 100644 index 0000000000..8ab5aa8aa1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/blog-postedit.xml @@ -0,0 +1,11 @@ + + + blog-postedit + blog-postedit + Blog: create or edit blog post + page.blogCreateEdit.title + Displays a form to create or edit a post + page.blogCreateEdit.description + blog-postedit + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/blog-postlist.xml b/share/src/main/resources/alfresco/site-data/pages/blog-postlist.xml new file mode 100644 index 0000000000..3e91819abe --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/blog-postlist.xml @@ -0,0 +1,11 @@ + + + blog-postlist + blog-postlist + Blog + page.blogPostList.title + Displays the blog posts + page.blogPostList.description + blog-postlist + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/blog-postview.xml b/share/src/main/resources/alfresco/site-data/pages/blog-postview.xml new file mode 100644 index 0000000000..f85459af93 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/blog-postview.xml @@ -0,0 +1,11 @@ + + + blog-postview + blog-postview + Blog: display post detail view + page.blogPostView.title + Displays the post detail view + page.blogPostView.description + blog-postview + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/calendar.xml b/share/src/main/resources/alfresco/site-data/pages/calendar.xml new file mode 100644 index 0000000000..af0650a49e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/calendar.xml @@ -0,0 +1,9 @@ + + + Calendar + page.calendar.title + Site Calendar Component + page.calendar.description + calendar + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/change-password.xml b/share/src/main/resources/alfresco/site-data/pages/change-password.xml new file mode 100644 index 0000000000..0404b0027f --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/change-password.xml @@ -0,0 +1,9 @@ + + + Change Password Page for a User + page.changePassword.title + Change Password section on Profile page for a User + page.changePassword.description + change-password + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/content-viewer.xml b/share/src/main/resources/alfresco/site-data/pages/content-viewer.xml new file mode 100644 index 0000000000..99ca02b1fe --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/content-viewer.xml @@ -0,0 +1,9 @@ + + + Content Viewer + page.contentViewer.title + Page for viewing the content of a node ref + page.contentViewer.description + content-viewer + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/create-content.xml b/share/src/main/resources/alfresco/site-data/pages/create-content.xml new file mode 100644 index 0000000000..44bd5d71e1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/create-content.xml @@ -0,0 +1,9 @@ + + + Create Content + page.createContent.title + Create text-based content + page.createContent.description + create-content + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/custom-model-management-console.xml b/share/src/main/resources/alfresco/site-data/pages/custom-model-management-console.xml new file mode 100644 index 0000000000..0aca2eaf86 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/custom-model-management-console.xml @@ -0,0 +1,27 @@ + + + Custom Model Manager Console + tool.custom-model-manager.label + Custom Model Manager Console + tool.custom-model-manager.description + console + user + + + + + title + /components/title/simple-title + + tool.custom-model-manager.label + + + + + + tools + /components/console/tools + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/customise-site-dashboard.xml b/share/src/main/resources/alfresco/site-data/pages/customise-site-dashboard.xml new file mode 100644 index 0000000000..f15b92dace --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/customise-site-dashboard.xml @@ -0,0 +1,10 @@ + + + customise-site-dashboard + Customize Site Dashboard + page.customiseSiteDashboard.title + Customize dashboard layout and dashlets for a site dashboard + page.customiseSiteDashboard.description + customise-site-dashboard + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/customise-site.xml b/share/src/main/resources/alfresco/site-data/pages/customise-site.xml new file mode 100644 index 0000000000..3abb5387f9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/customise-site.xml @@ -0,0 +1,9 @@ + + + Customize Site + page.customiseSite.title + Add and remove pages from a site + page.customiseSite.description + customise-site + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/customise-user-dashboard.xml b/share/src/main/resources/alfresco/site-data/pages/customise-user-dashboard.xml new file mode 100644 index 0000000000..d59e8f582d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/customise-user-dashboard.xml @@ -0,0 +1,10 @@ + + + customise-user-dashboard + Customize User Dashboard + page.customiseUserDashboard.title + Customize dashboard layout and dashlets for a user dashboard + page.customiseUserDashboard.description + customise-user-dashboard + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/dashboard.xml b/share/src/main/resources/alfresco/site-data/pages/dashboard.xml new file mode 100644 index 0000000000..35f570a955 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/dashboard.xml @@ -0,0 +1,9 @@ + + + dashboard + Site Dashboard + page.siteDashboard.title + Collaboration Site Dashboard + page.siteDashboard.description + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/data-lists.xml b/share/src/main/resources/alfresco/site-data/pages/data-lists.xml new file mode 100644 index 0000000000..48bd7578bb --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/data-lists.xml @@ -0,0 +1,11 @@ + + + data-lists + data-lists + Data Lists + page.data-lists.title + Data Lists + page.data-lists.description + data-lists + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/discussions-createtopic.xml b/share/src/main/resources/alfresco/site-data/pages/discussions-createtopic.xml new file mode 100644 index 0000000000..f8c5d091da --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/discussions-createtopic.xml @@ -0,0 +1,11 @@ + + + discussions-createtopic + discussions-createtopic + Discussions: view create topic page + page.discussionsCreateTopic.title + Displays the form to create a topic + page.discussionsCreateTopic.description + discussions-createtopic + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/discussions-topiclist.xml b/share/src/main/resources/alfresco/site-data/pages/discussions-topiclist.xml new file mode 100644 index 0000000000..345519678e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/discussions-topiclist.xml @@ -0,0 +1,11 @@ + + + discussions-topiclist + discussions-topiclist + Discussions + page.discussionsTopicList.title + Displays the forum topics + page.discussionsTopicList.description + discussions-topiclist + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/discussions-topicview.xml b/share/src/main/resources/alfresco/site-data/pages/discussions-topicview.xml new file mode 100644 index 0000000000..37458b6a3e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/discussions-topicview.xml @@ -0,0 +1,11 @@ + + + discussions-topicview + discussions-topicview + Discussions: display topic detail view + page.discussionsTopicView.title + Displays the topic detail view + page.discussionsTopicView.description + discussions-topicview + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/document-details.xml b/share/src/main/resources/alfresco/site-data/pages/document-details.xml new file mode 100644 index 0000000000..c27662f3df --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/document-details.xml @@ -0,0 +1,9 @@ + + + Document Details + page.documentDetails.title + Document details + page.documentDetails.description + document-details + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/documentlibrary.xml b/share/src/main/resources/alfresco/site-data/pages/documentlibrary.xml new file mode 100644 index 0000000000..4e99639130 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/documentlibrary.xml @@ -0,0 +1,9 @@ + + + Document Library + page.documentLibrary.title + Document library with Tree view + page.documentLibrary.description + documentlibrary + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/dp.xml b/share/src/main/resources/alfresco/site-data/pages/dp.xml new file mode 100644 index 0000000000..4d12acec6c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/dp.xml @@ -0,0 +1,6 @@ + + + dp + share-template + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/edit-metadata.xml b/share/src/main/resources/alfresco/site-data/pages/edit-metadata.xml new file mode 100644 index 0000000000..2e9c84d7b8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/edit-metadata.xml @@ -0,0 +1,9 @@ + + + Edit Metadata + page.editMetadata.title + Edit metadata of a node + page.editMetadata.description + edit-metadata + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/folder-details.xml b/share/src/main/resources/alfresco/site-data/pages/folder-details.xml new file mode 100644 index 0000000000..cc35ec5ae1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/folder-details.xml @@ -0,0 +1,9 @@ + + + Folder Details + page.folderDetails.title + Folder details + page.folderDetails.description + folder-details + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/folder-rules.xml b/share/src/main/resources/alfresco/site-data/pages/folder-rules.xml new file mode 100644 index 0000000000..c8c1717e2a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/folder-rules.xml @@ -0,0 +1,9 @@ + + + Folder Rules + page.folderRules.title + Folder rules + page.folderRules.description + folder-rules + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/followers.xml b/share/src/main/resources/alfresco/site-data/pages/followers.xml new file mode 100644 index 0000000000..56444dc623 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/followers.xml @@ -0,0 +1,9 @@ + + + Followers + page.userFollowers.title + Lists people that follow the user + page.userFollowers.description + followers + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/following.xml b/share/src/main/resources/alfresco/site-data/pages/following.xml new file mode 100644 index 0000000000..c82fcd9a6c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/following.xml @@ -0,0 +1,9 @@ + + + Following + page.userFollowing.title + Lists people that the user follows + page.userFollowing.description + following + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/geographic-map.xml b/share/src/main/resources/alfresco/site-data/pages/geographic-map.xml new file mode 100644 index 0000000000..d52ac6f5f1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/geographic-map.xml @@ -0,0 +1,9 @@ + + + Geographic Map + page.geographicMap.title + Geographic Map + page.geographicMap.description + geographic-map + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/hdp.xml b/share/src/main/resources/alfresco/site-data/pages/hdp.xml new file mode 100644 index 0000000000..fb199b9f75 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/hdp.xml @@ -0,0 +1,6 @@ + + + hdp + share-hybrid-template + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/hrp.xml b/share/src/main/resources/alfresco/site-data/pages/hrp.xml new file mode 100644 index 0000000000..0ba1974b18 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/hrp.xml @@ -0,0 +1,6 @@ + + + hrp + share-hybrid-remote-template + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/inline-edit.xml b/share/src/main/resources/alfresco/site-data/pages/inline-edit.xml new file mode 100644 index 0000000000..2f85632fed --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/inline-edit.xml @@ -0,0 +1,9 @@ + + + Inline Edit + page.inlineEdit.title + Edit text-based content + page.inlineEdit.description + inline-edit + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/invite.xml b/share/src/main/resources/alfresco/site-data/pages/invite.xml new file mode 100644 index 0000000000..df2cad6408 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/invite.xml @@ -0,0 +1,11 @@ + + + invite + invite + Invite + page.invite.title + Invite + page.invite.description + invite + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/links-linkedit.xml b/share/src/main/resources/alfresco/site-data/pages/links-linkedit.xml new file mode 100644 index 0000000000..00c0b970a5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/links-linkedit.xml @@ -0,0 +1,11 @@ + + + links-linkedit + links-linkedit + Links: create or edit link + page.linkCreateEdit.title + Displays a form to create or edit link + page.linkCreateEdit.description + links-linkedit + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/links-view.xml b/share/src/main/resources/alfresco/site-data/pages/links-view.xml new file mode 100644 index 0000000000..8dfad06a5b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/links-view.xml @@ -0,0 +1,11 @@ + + + links-view + links-view + Links: display links detail view + page.linksView.title + Displays the links detail view + page.linksView.description + links-view + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/links.xml b/share/src/main/resources/alfresco/site-data/pages/links.xml new file mode 100644 index 0000000000..87bcd9b8fe --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/links.xml @@ -0,0 +1,11 @@ + + + links + links + Links + page.links.title + Links + page.links.description + links + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/manage-permissions.xml b/share/src/main/resources/alfresco/site-data/pages/manage-permissions.xml new file mode 100644 index 0000000000..a402476f88 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/manage-permissions.xml @@ -0,0 +1,9 @@ + + + Manage Permissions + page.managePermissions.title + Manage Permissions + page.managePermissions.description + manage-permissions + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/message.xml b/share/src/main/resources/alfresco/site-data/pages/message.xml new file mode 100644 index 0000000000..ca71c205d2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/message.xml @@ -0,0 +1,20 @@ + + + Login + page.login.title + simple-guest + none + + + + + components + /components/guest/guest-message + +
{header}
+ {text} +
+
+ +
+
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/my-tasks.xml b/share/src/main/resources/alfresco/site-data/pages/my-tasks.xml new file mode 100644 index 0000000000..cd5830b89d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/my-tasks.xml @@ -0,0 +1,9 @@ + + + My Tasks + page.myTasks.title + Tasks assigned to the current user + page.myTasks.description + my-tasks + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/my-workflows.xml b/share/src/main/resources/alfresco/site-data/pages/my-workflows.xml new file mode 100644 index 0000000000..38b031046b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/my-workflows.xml @@ -0,0 +1,9 @@ + + + My Workflows + page.myWorkflows.title + Workflows assigned to the current user + page.myWorkflows.description + my-workflows + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/myfiles.xml b/share/src/main/resources/alfresco/site-data/pages/myfiles.xml new file mode 100644 index 0000000000..94b4c2261b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/myfiles.xml @@ -0,0 +1,9 @@ + + + My Files + page.myFiles.title + Browse my files + page.myFiles.description + myfiles + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/pending-invites.xml b/share/src/main/resources/alfresco/site-data/pages/pending-invites.xml new file mode 100644 index 0000000000..01165f3479 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/pending-invites.xml @@ -0,0 +1,11 @@ + + + pending-invites + pending-invites + Pending Invites + page.pendingInvites.title + Pending Invites + page.pendingInvites.description + pending-invites + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/people-finder.xml b/share/src/main/resources/alfresco/site-data/pages/people-finder.xml new file mode 100644 index 0000000000..9d94fea0cb --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/people-finder.xml @@ -0,0 +1,9 @@ + + + People Finder + page.peopleFinder.title + People finder page + page.peopleFinder.description + people-finder + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/profile.xml b/share/src/main/resources/alfresco/site-data/pages/profile.xml new file mode 100644 index 0000000000..0f45a178eb --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/profile.xml @@ -0,0 +1,9 @@ + + + Profile Page for a User + page.profile.title + Profile page for a User + page.profile.description + user-profile + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/quickshare-redirect.xml b/share/src/main/resources/alfresco/site-data/pages/quickshare-redirect.xml new file mode 100644 index 0000000000..04855038ea --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/quickshare-redirect.xml @@ -0,0 +1,7 @@ + + + Quick Share Redirect + Page for redirecting shared content to their correct Share page + quickshare-redirect + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/quickshare.xml b/share/src/main/resources/alfresco/site-data/pages/quickshare.xml new file mode 100644 index 0000000000..caa847f42e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/quickshare.xml @@ -0,0 +1,62 @@ + + + Quick Share + Page for sharing content + quickshare + none + + + + + components + + + + /components/quickshare/header + + {shareid} + document-details + + + + + /components/quickshare/node-header + + {shareid} + + + + + /components/preview/web-preview + + {shareid} + api/internal/shared + alfresco-noauth + + + + + + + + + error + + + + /components/quickshare/header + + {shareid} + login + + + + + /components/quickshare/error + + + + + + + diff --git a/share/src/main/resources/alfresco/site-data/pages/reject-invite.xml b/share/src/main/resources/alfresco/site-data/pages/reject-invite.xml new file mode 100644 index 0000000000..4d5c80aabf --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/reject-invite.xml @@ -0,0 +1,9 @@ + + + Reject invitation + page.rejectInvite.title + Reject invitation page. Rejects an invite request + page.rejectInvite.description + reject-invite + none + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/replication-job.xml b/share/src/main/resources/alfresco/site-data/pages/replication-job.xml new file mode 100644 index 0000000000..1552d9eb5a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/replication-job.xml @@ -0,0 +1,9 @@ + + + Replication Job + page.createEditReplicationJob.title + Create new or Edit existing Replication Job + page.createEditReplicationJob.description + replication-job + admin + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/repository.xml b/share/src/main/resources/alfresco/site-data/pages/repository.xml new file mode 100644 index 0000000000..3b49e31fd3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/repository.xml @@ -0,0 +1,9 @@ + + + Repository Browser + page.repository.title + Browse content across the whole Repository + page.repository.description + repository + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/rp.xml b/share/src/main/resources/alfresco/site-data/pages/rp.xml new file mode 100644 index 0000000000..e22a709010 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/rp.xml @@ -0,0 +1,6 @@ + + + rp + share-remote-template + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/rule-edit.xml b/share/src/main/resources/alfresco/site-data/pages/rule-edit.xml new file mode 100644 index 0000000000..2ca96b7e91 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/rule-edit.xml @@ -0,0 +1,9 @@ + + + Rule Edit + page.ruleEdit.title + Rule edit + page.ruleEdit.description + rule-edit + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/search.xml b/share/src/main/resources/alfresco/site-data/pages/search.xml new file mode 100644 index 0000000000..ef852a36a5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/search.xml @@ -0,0 +1,24 @@ + + + Search + page.search.title + Search view + page.search.description + search + user + + + + + title + /components/title/search-title + + + + + search + /components/search/search + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/sharedfiles.xml b/share/src/main/resources/alfresco/site-data/pages/sharedfiles.xml new file mode 100644 index 0000000000..830853819b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/sharedfiles.xml @@ -0,0 +1,9 @@ + + + Shared Files + page.sharedFiles.title + Browse shared files + page.sharedFiles.description + sharedfiles + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/site-finder.xml b/share/src/main/resources/alfresco/site-data/pages/site-finder.xml new file mode 100644 index 0000000000..c8ff6fe57c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/site-finder.xml @@ -0,0 +1,9 @@ + + + Site Finder + page.siteFinder.title + Site finder page + page.siteFinder.description + site-finder + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/site-groups.xml b/share/src/main/resources/alfresco/site-data/pages/site-groups.xml new file mode 100644 index 0000000000..7e04839e83 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/site-groups.xml @@ -0,0 +1,11 @@ + + + site-groups + site-groups + Site Groups + page.siteGroups.title + Site Groups + page.siteGroups.description + site-groups + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/site-index.xml b/share/src/main/resources/alfresco/site-data/pages/site-index.xml new file mode 100644 index 0000000000..b732eba7b2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/site-index.xml @@ -0,0 +1,9 @@ + + + Welcome + page.siteIndex.title + Landing page for all users - will forward to user site dashboard + page.siteIndex.description + site-index + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/site-members.xml b/share/src/main/resources/alfresco/site-data/pages/site-members.xml new file mode 100644 index 0000000000..c3e5c5d1bf --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/site-members.xml @@ -0,0 +1,11 @@ + + + site-members + site-members + Site Members + page.siteMembers.title + Site Members + page.siteMembers.description + site-members + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/site-redirect.xml b/share/src/main/resources/alfresco/site-data/pages/site-redirect.xml new file mode 100644 index 0000000000..56a91c4946 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/site-redirect.xml @@ -0,0 +1,7 @@ + + + Site Redirect + Page for redirecting site root to the site default page + site-redirect + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/sites-console.xml b/share/src/main/resources/alfresco/site-data/pages/sites-console.xml new file mode 100644 index 0000000000..13dcbaddb0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/sites-console.xml @@ -0,0 +1,27 @@ + + + Site Management Console + page.siteConsole.title + Site Management Console + page.sitesConsole.description + console + user + + + + + title + /components/title/simple-title + + page.sitesConsole.title + + + + + + tools + /components/console/tools + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/slingshot-login.xml b/share/src/main/resources/alfresco/site-data/pages/slingshot-login.xml new file mode 100644 index 0000000000..e6b837f58b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/slingshot-login.xml @@ -0,0 +1,24 @@ + + + Login + page.login.title + simple-guest + none + + + + + components + /components/guest/login + + {error} + + + + + tradeMarkLogo + /components/tradeMarkLogo/tradeMarkLogo + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/slingshot-logout.xml b/share/src/main/resources/alfresco/site-data/pages/slingshot-logout.xml new file mode 100644 index 0000000000..7af7750f00 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/slingshot-logout.xml @@ -0,0 +1,19 @@ + + + Logout + page.logout.title + simple-guest + none + + + + + components + /components/guest/message + + message.logged-out + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/start-workflow.xml b/share/src/main/resources/alfresco/site-data/pages/start-workflow.xml new file mode 100644 index 0000000000..c4e3ea2beb --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/start-workflow.xml @@ -0,0 +1,9 @@ + + + Start workflow + page.startWorkflow.title + Page for starting a workflow + page.startWorkflow.description + start-workflow + user + diff --git a/share/src/main/resources/alfresco/site-data/pages/tag-management.xml b/share/src/main/resources/alfresco/site-data/pages/tag-management.xml new file mode 100644 index 0000000000..f98b4166b4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/tag-management.xml @@ -0,0 +1,21 @@ + + + Tag Management + page.manageTags.title + Create new or Edit existing Tags + page.manageTags.description + tag-management + admin + + + + + title + /components/title/simple-title + + page.adminConsole.title + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/task-details.xml b/share/src/main/resources/alfresco/site-data/pages/task-details.xml new file mode 100644 index 0000000000..3f7f54e9a4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/task-details.xml @@ -0,0 +1,47 @@ + + + Task Details + page.taskDetails.title + Page displaying task details + page.taskDetails.description + workflow-details + user + + + + + data-header + /components/workflow/task-details-header + + + + + data-form + /components/form + + task + {taskId} + view + true + + + + + + data-actions + /components/workflow/task-details-actions + + + + + data-loader + /components/data/data-loader + + api/task-instances/{taskId}?detailed=true + taskDetailedData + data + + + + + diff --git a/share/src/main/resources/alfresco/site-data/pages/task-edit.xml b/share/src/main/resources/alfresco/site-data/pages/task-edit.xml new file mode 100644 index 0000000000..2520e32348 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/task-edit.xml @@ -0,0 +1,46 @@ + + + Task Edit + page.taskEdit.title + Page for editing task details + page.taskEdit.description + workflow-details + user + + + + + data-header + /components/workflow/task-edit-header + + + + + data-form + /components/form + + task + {taskId} + edit + true + json + true + true + workflow.task.error + + + + + + data-loader + /components/data/data-loader + + api/task-instances/{taskId}?detailed=true + taskDetailedData + data + message.task-data.failure + + + + + diff --git a/share/src/main/resources/alfresco/site-data/pages/user-cloud-auth.xml b/share/src/main/resources/alfresco/site-data/pages/user-cloud-auth.xml new file mode 100644 index 0000000000..274548be8a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/user-cloud-auth.xml @@ -0,0 +1,9 @@ + + + Change Cloud Authentication Settings for a User + page.userCloudAuth.title + Change Cloud Authentication Settings section on Profile page for a User + page.userCloudAuth.description + user-cloud-auth + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/user-content.xml b/share/src/main/resources/alfresco/site-data/pages/user-content.xml new file mode 100644 index 0000000000..8ae299c006 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/user-content.xml @@ -0,0 +1,9 @@ + + + Last edited content list for a User + page.userContent.title + Lists content that a user has last edited + page.userContent.description + user-content + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/user-notifications.xml b/share/src/main/resources/alfresco/site-data/pages/user-notifications.xml new file mode 100644 index 0000000000..b2932c8e72 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/user-notifications.xml @@ -0,0 +1,9 @@ + + + Change Notification Settings for a User + page.userNotifications.title + Change Notification Settings section on Profile page for a User + page.userNotifications.description + user-notifications + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/user-sites.xml b/share/src/main/resources/alfresco/site-data/pages/user-sites.xml new file mode 100644 index 0000000000..c902de5c35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/user-sites.xml @@ -0,0 +1,9 @@ + + + Sites list for a User + page.userSites.title + Lists sites that a user belongs to + page.userSites.description + user-sites + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/user-trashcan.xml b/share/src/main/resources/alfresco/site-data/pages/user-trashcan.xml new file mode 100644 index 0000000000..e02d614c71 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/user-trashcan.xml @@ -0,0 +1,9 @@ + + + Trashcan page for current user + page.userTrashcan.title + List of deleted documents and folders for the current user + page.userTrashcan.description + user-trashcan + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/webview-default.xml b/share/src/main/resources/alfresco/site-data/pages/webview-default.xml new file mode 100644 index 0000000000..af21a8dd30 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/webview-default.xml @@ -0,0 +1,9 @@ + + + Default webview page + page.defaultWebView.title + Displays default text for a webview dashlet + page.defaultWebView.description + webview-default + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/wiki-create.xml b/share/src/main/resources/alfresco/site-data/pages/wiki-create.xml new file mode 100644 index 0000000000..76f2ff098c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/wiki-create.xml @@ -0,0 +1,9 @@ + + + Wiki Create Form + page.wikiCreate.title + Displays a form to create a new wiki page + page.wikiCreate.description + wiki-create + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/wiki-page.xml b/share/src/main/resources/alfresco/site-data/pages/wiki-page.xml new file mode 100644 index 0000000000..6174963c6d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/wiki-page.xml @@ -0,0 +1,9 @@ + + + Wiki + page.wikiPage.title + Displays a wiki page + page.wikiPage.description + wiki-page + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/wiki.xml b/share/src/main/resources/alfresco/site-data/pages/wiki.xml new file mode 100644 index 0000000000..19d716d0a2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/wiki.xml @@ -0,0 +1,9 @@ + + + Wiki + page.wiki.title + The landing page for the wiki + page.wiki.description + wiki + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/pages/workflow-details.xml b/share/src/main/resources/alfresco/site-data/pages/workflow-details.xml new file mode 100644 index 0000000000..51fa156c21 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/pages/workflow-details.xml @@ -0,0 +1,41 @@ + + + Workflow Details + page.workflowDetails.title + Page displaying workflow details + page.workflowDetails.description + workflow-details + user + + + + + data-header + /components/workflow/workflow-details-header + + + + + data-form + /components/workflow/workflow-form + + + + + data-actions + /components/workflow/workflow-details-actions + + + + + data-loader + /components/data/data-loader + + api/workflow-instances/{workflowId}?includeTasks=true + workflowDetailedData + data + + + + + diff --git a/share/src/main/resources/alfresco/site-data/presets/presets.xml b/share/src/main/resources/alfresco/site-data/presets/presets.xml new file mode 100644 index 0000000000..918fac6d56 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/presets/presets.xml @@ -0,0 +1,277 @@ + + + + + + + + page + title + site/${siteid}/dashboard + /components/title/collaboration-title + + + + page + navigation + site/${siteid}/dashboard + /components/navigation/collaboration-navigation + + + + page + component-1-1 + site/${siteid}/dashboard + /components/dashlets/colleagues + + 504 + + + + page + component-2-1 + site/${siteid}/dashboard + /components/dashlets/docsummary + + + page + component-2-2 + site/${siteid}/dashboard + /components/dashlets/activityfeed + + + + + Collaboration Site Dashboard + page.siteDashboard.title + Collaboration site's dashboard page + page.siteDashboard.description + dashboard-2-columns-wide-right + user + + [{"pageId":"dashboard"}, {"pageId":"documentlibrary"}] + true + + + + + + + + + + + page + title + user/${userid}/dashboard + /components/title/user-dashboard-title + + + + page + full-width-dashlet + user/${userid}/dashboard + /components/dashlets/dynamic-welcome + + user + + + + page + component-1-1 + user/${userid}/dashboard + /components/dashlets/my-sites + + + page + component-1-2 + user/${userid}/dashboard + /components/dashlets/my-tasks + + + page + component-2-1 + user/${userid}/dashboard + /components/dashlets/my-activities + + + page + component-2-2 + user/${userid}/dashboard + /components/dashlets/my-documents + + 240 + + + + + + User Dashboard + page.userDashboard.title + Users dashboard page + page.userDashboard.description + dashboard-2-columns-wide-right + user + + + + + + + + + + page + title + site/${siteid}/dashboard + /components/title/collaboration-title + + + + page + navigation + site/${siteid}/dashboard + /components/navigation/collaboration-navigation + + + + page + component-1-1 + site/${siteid}/dashboard + /components/dashlets/colleagues + + + page + component-2-1 + site/${siteid}/dashboard + /components/dashlets/docsummary + + + page + component-2-2 + site/${siteid}/dashboard + /components/dashlets/activityfeed + + + + + Records Management Site Dashboard + page.rmSiteDashboard.title + Records Management site's dashboard page + page.rmSiteDashboard.description + dashboard-2-columns-wide-right + user + + [{"pageId":"documentlibrary"}, {"pageId":"rmsearch"}] + {"documentlibrary":{"titleId":"page.rmDocumentLibrary.title", "descriptionId":"page.rmDocumentLibrary.description", "type":"dod5015"}} + + + + + + + + + + + page + title + site/${siteid}/dashboard + /components/title/collaboration-title + + + + page + navigation + site/${siteid}/dashboard + /components/navigation/collaboration-navigation + + + + page + component-1-1 + site/${siteid}/dashboard + /components/dashlets/colleagues + + + page + component-2-1 + site/${siteid}/dashboard + /components/dashlets/docsummary + + + page + component-2-2 + site/${siteid}/dashboard + /components/dashlets/activityfeed + + + + + Document Workspace Dashboard + page.workspace.title + Document Workspace dashboard page + page.workspace.description + dashboard-2-columns-wide-left + user + + [{"pageId":"documentlibrary"}, {"pageId":"links"}] + + + + + + + + + + + page + title + site/${siteid}/dashboard + /components/title/collaboration-title + + + + page + navigation + site/${siteid}/dashboard + /components/navigation/collaboration-navigation + + + + page + component-1-1 + site/${siteid}/dashboard + /components/dashlets/colleagues + + + page + component-2-1 + site/${siteid}/dashboard + /components/dashlets/docsummary + + + page + component-2-2 + site/${siteid}/dashboard + /components/dashlets/activityfeed + + + + + Meeting Workspace Dashboard + page.meeting_workspace.title + Meeting Workspace dashboard page + page.meeting_workspace.description + dashboard-2-columns-wide-left + user + + [{"pageId":"documentlibrary"}, {"pageId":"calendar"}] + + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/1-column.xml b/share/src/main/resources/alfresco/site-data/template-instances/1-column.xml new file mode 100644 index 0000000000..6a141ac08c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/1-column.xml @@ -0,0 +1,4 @@ + + + org/alfresco/1-column + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/2-columns-narrow-left.xml b/share/src/main/resources/alfresco/site-data/template-instances/2-columns-narrow-left.xml new file mode 100644 index 0000000000..8c4a6d4a82 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/2-columns-narrow-left.xml @@ -0,0 +1,4 @@ + + + org/alfresco/2-columns-narrow-left + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/2-columns-narrow-right.xml b/share/src/main/resources/alfresco/site-data/template-instances/2-columns-narrow-right.xml new file mode 100644 index 0000000000..bfe88ac49d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/2-columns-narrow-right.xml @@ -0,0 +1,4 @@ + + + org/alfresco/2-columns-narrow-right + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/2-columns-resizable.xml b/share/src/main/resources/alfresco/site-data/template-instances/2-columns-resizable.xml new file mode 100644 index 0000000000..6c139ab258 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/2-columns-resizable.xml @@ -0,0 +1,4 @@ + + + org/alfresco/2-columns-resizable + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/2-columns.xml b/share/src/main/resources/alfresco/site-data/template-instances/2-columns.xml new file mode 100644 index 0000000000..84b2bf76ff --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/2-columns.xml @@ -0,0 +1,4 @@ + + + org/alfresco/2-columns + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/3-columns.xml b/share/src/main/resources/alfresco/site-data/template-instances/3-columns.xml new file mode 100644 index 0000000000..227b2bf3f2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/3-columns.xml @@ -0,0 +1,4 @@ + + + org/alfresco/3-columns + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/accept-invite.xml b/share/src/main/resources/alfresco/site-data/template-instances/accept-invite.xml new file mode 100644 index 0000000000..97fb06f9f4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/accept-invite.xml @@ -0,0 +1,13 @@ + + + org/alfresco/accept-invite + + + + + accept-invite + /components/invite/accept-invite + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/add-groups.xml b/share/src/main/resources/alfresco/site-data/template-instances/add-groups.xml new file mode 100644 index 0000000000..2c710c8432 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/add-groups.xml @@ -0,0 +1,46 @@ + + + org/alfresco/add-groups + Add Groups page + + site-members + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + membersbar + /components/invite/members-bar + + + + + group-finder + /components/people-finder/group-finder + + true + >> + api/sites/[siteId]/potentialmembers?authorityType=GROUP + + + + + + groupslist + /components/invite/groupslist + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/add-users.xml b/share/src/main/resources/alfresco/site-data/template-instances/add-users.xml new file mode 100644 index 0000000000..9a4a08ed2e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/add-users.xml @@ -0,0 +1,64 @@ + + + org/alfresco/add-users + Add Users page + + site-members + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + membersbar + /components/invite/members-bar + + + + + instructions-bar + /components/invite/instructions-bar + + + + + people-finder + /components/people-finder/people-finder + + true + >> + api/sites/[siteId]/potentialmembers?authorityType=USER + + + + + + addemail + /components/invite/addemail + + + + + invitationlist + /components/invite/invitationlist + + + + + added-users-list + /components/invite/added-users-list + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/blog-postedit.xml b/share/src/main/resources/alfresco/site-data/template-instances/blog-postedit.xml new file mode 100644 index 0000000000..6e8cc3bf1f --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/blog-postedit.xml @@ -0,0 +1,29 @@ + + + org/alfresco/blog-postedit + + blog-postlist + blog + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + postedit + /components/blog/postedit + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/blog-postlist.xml b/share/src/main/resources/alfresco/site-data/template-instances/blog-postlist.xml new file mode 100644 index 0000000000..aadb77e737 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/blog-postlist.xml @@ -0,0 +1,56 @@ + + + org/alfresco/blog-postlist + + blog-postlist + blog + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/blog/toolbar + + false + + + + + + postlist + /components/blog/postlist + + + + + filters + /components/blog/filters + + + + + archives + /components/blog/archives + + + + + tags + /components/tag-filter + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/blog-postview.xml b/share/src/main/resources/alfresco/site-data/template-instances/blog-postview.xml new file mode 100644 index 0000000000..f9c4edd70b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/blog-postview.xml @@ -0,0 +1,48 @@ + + + org/alfresco/blog-postview + + blog-postlist + blog + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/blog/toolbar + + true + + + + + + postview + /components/blog/postview + + + + + comments + /components/comments/list + + {nodeRef} + blog + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/calendar.xml b/share/src/main/resources/alfresco/site-data/template-instances/calendar.xml new file mode 100644 index 0000000000..fdec5984ee --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/calendar.xml @@ -0,0 +1,47 @@ + + + org/alfresco/calendar + + calendar + calendar + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/calendar/toolbar + + + + + view + /components/calendar/view + + + + + calendar + /components/calendar/mycalendar + + + + + tags + /components/tags + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/change-password.xml b/share/src/main/resources/alfresco/site-data/template-instances/change-password.xml new file mode 100644 index 0000000000..87b1cffbf2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/change-password.xml @@ -0,0 +1,24 @@ + + + org/alfresco/change-password + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + change-password + /components/profile/change-password + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/console.xml b/share/src/main/resources/alfresco/site-data/template-instances/console.xml new file mode 100644 index 0000000000..5e5f6d22ec --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/console.xml @@ -0,0 +1,23 @@ + + + org/alfresco/console + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/content-viewer.xml b/share/src/main/resources/alfresco/site-data/template-instances/content-viewer.xml new file mode 100644 index 0000000000..c469760c18 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/content-viewer.xml @@ -0,0 +1,13 @@ + + + org/alfresco/content-viewer + + + + + content-viewer + /components/content-viewer + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/create-content.xml b/share/src/main/resources/alfresco/site-data/template-instances/create-content.xml new file mode 100644 index 0000000000..42312428de --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/create-content.xml @@ -0,0 +1,76 @@ + + + org/alfresco/create-content + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + create-content-mgr + /components/create-content/create-content-mgr + + + + + create-content + /components/form?mimeType={mimeType}&destination={destination}&formId={formId} + + type + {itemId} + create + json + true + true + true + + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/customise-site-dashboard.xml b/share/src/main/resources/alfresco/site-data/template-instances/customise-site-dashboard.xml new file mode 100644 index 0000000000..a45a8c09f2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/customise-site-dashboard.xml @@ -0,0 +1,36 @@ + + + org/alfresco/customise-dashboard + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + customise-layout + /components/dashboard/customise-layout + + site + + + + + + customise-dashlets + /components/dashboard/customise-dashlets + + site + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/customise-site.xml b/share/src/main/resources/alfresco/site-data/template-instances/customise-site.xml new file mode 100644 index 0000000000..e9ea145139 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/customise-site.xml @@ -0,0 +1,24 @@ + + + org/alfresco/customise-site + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + customise-pages + /components/site/customise-pages + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/customise-user-dashboard.xml b/share/src/main/resources/alfresco/site-data/template-instances/customise-user-dashboard.xml new file mode 100644 index 0000000000..dc686badbc --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/customise-user-dashboard.xml @@ -0,0 +1,30 @@ + + + org/alfresco/customise-dashboard + + + + + title + /components/title/user-dashboard-title + + + + + customise-layout + /components/dashboard/customise-layout + + user + + + + + + customise-dashlets + /components/dashboard/customise-dashlets + + user + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/dashboard-1-column.xml b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-1-column.xml new file mode 100644 index 0000000000..0feeaac931 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-1-column.xml @@ -0,0 +1,9 @@ + + + org/alfresco/dashboard + One column + + + 5 + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/dashboard-2-columns-wide-left.xml b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-2-columns-wide-left.xml new file mode 100644 index 0000000000..18c5062f6c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-2-columns-wide-left.xml @@ -0,0 +1,10 @@ + + + org/alfresco/dashboard + Two columns: narrow left, wide right + + yui-gc + 5 + 5 + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/dashboard-2-columns-wide-right.xml b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-2-columns-wide-right.xml new file mode 100644 index 0000000000..2fa9654cff --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-2-columns-wide-right.xml @@ -0,0 +1,10 @@ + + + org/alfresco/dashboard + Two columns: narrow left, wide right + + yui-gd + 5 + 5 + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/dashboard-3-columns.xml b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-3-columns.xml new file mode 100644 index 0000000000..2c123eac7d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-3-columns.xml @@ -0,0 +1,11 @@ + + + org/alfresco/dashboard + Three column: narrow left, wide centre, narrow right + + yui-gb + 5 + 5 + 5 + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/dashboard-4-columns.xml b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-4-columns.xml new file mode 100644 index 0000000000..65a1eb43e7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/dashboard-4-columns.xml @@ -0,0 +1,12 @@ + + + org/alfresco/dashboard + Four columns + + yui-g + 5 + 5 + 5 + 5 + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/data-lists.xml b/share/src/main/resources/alfresco/site-data/template-instances/data-lists.xml new file mode 100644 index 0000000000..9a9ea09ad6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/data-lists.xml @@ -0,0 +1,57 @@ + + + org/alfresco/data-lists + + data-lists + dataLists + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/data-lists/toolbar + + + + + datagrid + /components/data-lists/datagrid + + true + + + + + + datalists + /components/data-lists/datalists + + + + + filter + /components/data-lists/filter + + + + + actions-common + /components/data-lists/actions-common + + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/discussions-createtopic.xml b/share/src/main/resources/alfresco/site-data/template-instances/discussions-createtopic.xml new file mode 100644 index 0000000000..a01d36e6ec --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/discussions-createtopic.xml @@ -0,0 +1,28 @@ + + + org/alfresco/discussions-createtopic + + discussions-topiclist + discussions + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + createtopic + /components/discussions/createtopic + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/discussions-topiclist.xml b/share/src/main/resources/alfresco/site-data/template-instances/discussions-topiclist.xml new file mode 100644 index 0000000000..1fc2f9dc75 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/discussions-topiclist.xml @@ -0,0 +1,50 @@ + + + org/alfresco/discussions-topiclist + + discussions-topiclist + discussions + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/discussions/toolbar + + false + + + + + + topiclist + /components/discussions/topiclist + + + + + filters + /components/discussions/filters + + + + + tags + /components/tag-filter + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/discussions-topicview.xml b/share/src/main/resources/alfresco/site-data/template-instances/discussions-topicview.xml new file mode 100644 index 0000000000..630b4e2186 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/discussions-topicview.xml @@ -0,0 +1,44 @@ + + + org/alfresco/discussions-topicview + + discussions-topiclist + discussions + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/discussions/toolbar + + true + + + + + + topic + /components/discussions/topic + + + + + replies + /components/discussions/replies + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/document-details.xml b/share/src/main/resources/alfresco/site-data/template-instances/document-details.xml new file mode 100644 index 0000000000..04f4701c0c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/document-details.xml @@ -0,0 +1,298 @@ + + + org/alfresco/document-details + + documentlibrary + documentLibrary + + + + + + mobile-app + + + + + + + + + iPhone|iPod|iPad + + + + /components/mobile-app-support/ios-mobile + + + + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + node-header + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + + + + + + + + + mine + + + + /components/node-details/node-header + + {nodeRef} + alfresco://user/home + context/mine/myfiles + location.path.myfiles + + + + + + + shared + + + + /components/node-details/node-header + + {nodeRef} + alfresco://company/shared + context/shared/sharedfiles + location.path.shared + + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + + + + + + + + + + web-preview + + + + + + + + DocumentDetails/document-details/display-web-preview + + + + /components/preview/web-preview + + {nodeRef} + api + alfresco + document-details + + + + + + + + + + comments + /components/comments/list + + {nodeRef} + document + + + + document-attachments + /components/document-details/document-attachments + + {nodeRef} + + + + repo-document-attachments + /components/document-details/document-attachments + + {nodeRef} + + + + + + document-actions + /components/document-details/document-actions + + {nodeRef} + + + + actions-common + /components/documentlibrary/actions-common + + {nodeRef} + document-details + + + + + + document-tags + + + + + + + + + /components/document-details/document-tags + + {nodeRef} + + + + + + + + + + document-links + /components/document-details/document-links + + {nodeRef} + + + + + + document-metadata + /components/document-details/document-metadata + + {nodeRef} + + + + + + + + document-workflows + /components/document-details/document-workflows + + {nodeRef} + + + + + + document-versions + /components/document-details/document-versions + + {nodeRef} + + + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/documentlibrary.xml b/share/src/main/resources/alfresco/site-data/template-instances/documentlibrary.xml new file mode 100644 index 0000000000..642149ad47 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/documentlibrary.xml @@ -0,0 +1,113 @@ + + + org/alfresco/documentlibrary + + documentlibrary + documentLibrary + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + actions-common + /components/documentlibrary/actions-common + + documentlibrary + + + + + + toolbar + /components/documentlibrary/toolbar + + + + + documentlist + /components/documentlibrary/documentlist + + true + documentlibrary + + + + + documentlist_v2 + /components/documentlibrary/documentlist_v2 + + true + documentlibrary + + + + + + filter + /components/documentlibrary/filter + + + + + tree + /components/documentlibrary/tree + + + + + + categories + /components/documentlibrary/categories + + + + + tags + /components/tag-filter + + true + + + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + archive-and-download + /components/download/archive + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/edit-metadata.xml b/share/src/main/resources/alfresco/site-data/template-instances/edit-metadata.xml new file mode 100644 index 0000000000..4edf79816d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/edit-metadata.xml @@ -0,0 +1,75 @@ + + + org/alfresco/edit-metadata + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + edit-metadata-mgr + /components/edit-metadata/edit-metadata-mgr + + + + + edit-metadata + /components/form + + node + {nodeRef} + edit + json + true + true + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/folder-details.xml b/share/src/main/resources/alfresco/site-data/template-instances/folder-details.xml new file mode 100644 index 0000000000..7bff82e819 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/folder-details.xml @@ -0,0 +1,205 @@ + + + org/alfresco/folder-details + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + node-header + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + + + + + + + + + mine + + + + /components/node-details/node-header + + {nodeRef} + alfresco://user/home + context/mine/myfiles + location.path.myfiles + + + + + + + shared + + + + /components/node-details/node-header + + {nodeRef} + alfresco://company/shared + context/shared/sharedfiles + location.path.shared + + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + + + + + + + + + + comments + /components/comments/list + + {nodeRef} + folder + + + + + + folder-actions + /components/folder-details/folder-actions + + {nodeRef} + + + + actions-common + /components/documentlibrary/actions-common + + {nodeRef} + folder-details + + + + + + folder-tags + + + + + + + + + /components/folder-details/folder-tags + + {nodeRef} + + + + + + + + + + folder-links + /components/folder-details/folder-links + + {nodeRef} + + + + + + folder-metadata + /components/folder-details/folder-metadata + + {nodeRef} + + + + + + + + archive-and-download + /components/download/archive + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/folder-rules.xml b/share/src/main/resources/alfresco/site-data/template-instances/folder-rules.xml new file mode 100644 index 0000000000..adfd3fb633 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/folder-rules.xml @@ -0,0 +1,192 @@ + + + org/alfresco/folder-rules + + documentlibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + path + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + true + false + false + false + false + false + + + + + + + + + mine + + + + /components/node-details/node-header + + {nodeRef} + alfresco://user/home + context/mine/myfiles + location.path.myfiles + true + false + false + false + false + false + + + + + + + shared + + + + /components/node-details/node-header + + {nodeRef} + alfresco://company/shared + context/shared/sharedfiles + location.path.shared + true + false + false + false + false + false + + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + true + false + false + false + false + false + + + + + + + + + + rules-header + /components/rules/rules-header + + + + + rules-linked + /components/rules/rules-linked + + + + + inherited-rules + /components/rules/rules-list + + inherited + + + + + + folder-rules + /components/rules/rules-list + + folder + true + true + + + + + + rule-details + /components/rules/rule-details + + + + + rules-none + /components/rules/rules-none + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/followers.xml b/share/src/main/resources/alfresco/site-data/template-instances/followers.xml new file mode 100644 index 0000000000..503b5d4cbe --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/followers.xml @@ -0,0 +1,25 @@ + + + org/alfresco/followers + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + followers + /components/profile/followers + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/following.xml b/share/src/main/resources/alfresco/site-data/template-instances/following.xml new file mode 100644 index 0000000000..f69664e71f --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/following.xml @@ -0,0 +1,23 @@ + + + org/alfresco/following + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + following + /components/profile/following + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/geographic-map.xml b/share/src/main/resources/alfresco/site-data/template-instances/geographic-map.xml new file mode 100644 index 0000000000..1cf995b1d6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/geographic-map.xml @@ -0,0 +1,94 @@ + + + org/alfresco/geographic-map + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + node-header + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + false + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + false + + + + + + + + + map + /components/geographic/google-map + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/inline-edit.xml b/share/src/main/resources/alfresco/site-data/template-instances/inline-edit.xml new file mode 100644 index 0000000000..41166b48b5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/inline-edit.xml @@ -0,0 +1,76 @@ + + + org/alfresco/inline-edit + + documentlibrary + documentLibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + inline-edit-mgr + /components/inline-edit/inline-edit-mgr + + + + + inline-edit + /components/form + + doclib-inline-edit + node + {nodeRef} + edit + json + true + true + + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/invite.xml b/share/src/main/resources/alfresco/site-data/template-instances/invite.xml new file mode 100644 index 0000000000..55174d4804 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/invite.xml @@ -0,0 +1,52 @@ + + + org/alfresco/invite + Invite users page + + site-members + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + membersbar + /components/invite/members-bar + + + + + people-finder + /components/people-finder/people-finder + + true + >> + api/sites/[siteId]/potentialmembers?authorityType=USER + + + + + + addemail + /components/invite/addemail + + + + + invitationlist + /components/invite/invitationlist + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/links-linkedit.xml b/share/src/main/resources/alfresco/site-data/template-instances/links-linkedit.xml new file mode 100644 index 0000000000..061a3b5d45 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/links-linkedit.xml @@ -0,0 +1,29 @@ + + + org/alfresco/links-linkedit + + links + links + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + linkedit + /components/links/linkedit + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/links-view.xml b/share/src/main/resources/alfresco/site-data/template-instances/links-view.xml new file mode 100644 index 0000000000..ef5d4a73ef --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/links-view.xml @@ -0,0 +1,41 @@ + + + org/alfresco/links-view + + links + links + + + + + + title + /components/title/collaboration-title + + + + + navigation + links-view + /components/navigation/collaboration-navigation + + + + + linksview + links-view + /components/links/linksview + + + + + comments + /components/comments/list + + {nodeRef} + link + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/links.xml b/share/src/main/resources/alfresco/site-data/template-instances/links.xml new file mode 100644 index 0000000000..4b744232f1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/links.xml @@ -0,0 +1,42 @@ + + + org/alfresco/links + Links + + links + links + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + links + /components/links + + + + + filters + /components/links/filters + + + + + tags + /components/tag-filter + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/manage-permissions.xml b/share/src/main/resources/alfresco/site-data/template-instances/manage-permissions.xml new file mode 100644 index 0000000000..571af4b51f --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/manage-permissions.xml @@ -0,0 +1,158 @@ + + + org/alfresco/manage-permissions + + documentlibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + path + + + + + + + + + /components/node-details/node-header + + {nodeRef} + documentlibrary + path.documents + true + false + false + false + false + false + + + + + + + + + mine + + + + /components/node-details/node-header + + {nodeRef} + alfresco://user/home + context/mine/myfiles + location.path.myfiles + true + false + false + false + false + false + + + + + + + shared + + + + /components/node-details/node-header + + {nodeRef} + alfresco://company/shared + context/shared/sharedfiles + location.path.shared + true + false + false + false + false + false + + + + + + /components/node-details/node-header + + {nodeRef} + repository + path.repository + true + false + false + false + false + false + + + + + + + + + + manage-permissions + /components/manage-permissions/manage-permissions + + true + {nodeRef} + + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/my-tasks.xml b/share/src/main/resources/alfresco/site-data/template-instances/my-tasks.xml new file mode 100644 index 0000000000..7dc9e6fa8b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/my-tasks.xml @@ -0,0 +1,46 @@ + + + org/alfresco/my-tasks + + + + + all-filter + /components/workflow/filter/all + + tasks + + + + + + due-filter + /components/workflow/filter/due + + + + + priority-filter + /components/workflow/filter/priority + + + + + assignee-filter + /components/workflow/filter/assignee + + + + + toolbar + /components/workflow/task-list-toolbar + + + + + list + /components/workflow/task-list + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/my-workflows.xml b/share/src/main/resources/alfresco/site-data/template-instances/my-workflows.xml new file mode 100644 index 0000000000..d4a44a9ed5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/my-workflows.xml @@ -0,0 +1,52 @@ + + + org/alfresco/my-workflows + + + + + all-filter + /components/workflow/filter/all + + workflows + + + + + + due-filter + /components/workflow/filter/due + + + + + started-filter + /components/workflow/filter/started + + + + + priority-filter + /components/workflow/filter/priority + + + + + workflow-type-filter + /components/workflow/filter/workflow-type + + + + + toolbar + /components/workflow/workflow-list-toolbar + + + + + list + /components/workflow/workflow-list + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/myfiles.xml b/share/src/main/resources/alfresco/site-data/template-instances/myfiles.xml new file mode 100644 index 0000000000..5d9f7d5011 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/myfiles.xml @@ -0,0 +1,86 @@ + + + org/alfresco/myfiles + + + + + title + /components/title/simple-title + + page.myFiles.title + + + + + + actions-common + /components/documentlibrary/actions-common + + documentlibrary + + + + + documentlist_v2 + /components/documentlibrary/myfiles + + true + documentlibrary + + + + + + filter + /components/documentlibrary/filter + + + + + tree + /components/documentlibrary/myfiles/tree + + + + + categories + /components/documentlibrary/categories + + + + + tags + /components/myfiles/tag-filter + + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + archive-and-download + /components/download/archive + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/pending-invites.xml b/share/src/main/resources/alfresco/site-data/template-instances/pending-invites.xml new file mode 100644 index 0000000000..fec37e15ab --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/pending-invites.xml @@ -0,0 +1,47 @@ + + + org/alfresco/pending-invites + Pending invites page + + site-members + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + membersbar + /components/invite/members-bar + + + + + sent-invites + /components/invite/sent-invites + + 0 + + + + + + pending-requests + /components/invite/pending-requests + + 0 + + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/people-finder.xml b/share/src/main/resources/alfresco/site-data/template-instances/people-finder.xml new file mode 100644 index 0000000000..655805adf5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/people-finder.xml @@ -0,0 +1,26 @@ + + + org/alfresco/people-finder + + + + + title + /components/title/simple-title + + title.peopleFinder + + + + + + people-finder + /components/people-finder/people-finder + + true + Alfresco.PeopleFinder.VIEW_MODE_FULLPAGE + + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/quickshare-redirect.xml b/share/src/main/resources/alfresco/site-data/template-instances/quickshare-redirect.xml new file mode 100644 index 0000000000..5652683088 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/quickshare-redirect.xml @@ -0,0 +1,4 @@ + + + org/alfresco/quickshare-redirect + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/quickshare.xml b/share/src/main/resources/alfresco/site-data/template-instances/quickshare.xml new file mode 100644 index 0000000000..09de62fc8a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/quickshare.xml @@ -0,0 +1,4 @@ + + + org/alfresco/quickshare + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/redirect.xml b/share/src/main/resources/alfresco/site-data/template-instances/redirect.xml new file mode 100644 index 0000000000..db35d1372f --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/redirect.xml @@ -0,0 +1,6 @@ + + + org/alfresco/redirect + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/reject-invite.xml b/share/src/main/resources/alfresco/site-data/template-instances/reject-invite.xml new file mode 100644 index 0000000000..679ceb6407 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/reject-invite.xml @@ -0,0 +1,13 @@ + + + org/alfresco/reject-invite + + + + + reject-invite + /components/invite/reject-invite + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/replication-job.xml b/share/src/main/resources/alfresco/site-data/template-instances/replication-job.xml new file mode 100644 index 0000000000..c6304666fb --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/replication-job.xml @@ -0,0 +1,13 @@ + + + org/alfresco/replication-job + + + + + replication-job + /components/admin/replication-job + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/repository.xml b/share/src/main/resources/alfresco/site-data/template-instances/repository.xml new file mode 100644 index 0000000000..8705f250d9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/repository.xml @@ -0,0 +1,101 @@ + + + org/alfresco/repository + + + + + title + /components/title/simple-title + + title.repository + title.browser + + + + + + actions-common + /components/documentlibrary/actions-common + + documentlibrary + + + + + + toolbar + /components/documentlibrary/repo/toolbar + + + + + documentlist + /components/documentlibrary/documentlist + + true + + + + + documentlist_v2 + /components/documentlibrary/repo + + true + + + + + + filter + /components/documentlibrary/repo/filter + + + + + tree + /components/documentlibrary/repo/tree + + + + + categories + /components/documentlibrary/categories + + + + + tags + /components/tag-filter + + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + archive-and-download + /components/download/archive + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/rule-edit.xml b/share/src/main/resources/alfresco/site-data/template-instances/rule-edit.xml new file mode 100644 index 0000000000..906defcbcb --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/rule-edit.xml @@ -0,0 +1,60 @@ + + + org/alfresco/rule-edit + + documentlibrary + + + + + + title + + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + rule-edit + /components/rules/rule-edit + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/search.xml b/share/src/main/resources/alfresco/site-data/template-instances/search.xml new file mode 100644 index 0000000000..a1e9e9da7b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/search.xml @@ -0,0 +1,4 @@ + + + org/alfresco/search + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/share-hybrid-remote-template.xml b/share/src/main/resources/alfresco/site-data/template-instances/share-hybrid-remote-template.xml new file mode 100644 index 0000000000..c133d9780e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/share-hybrid-remote-template.xml @@ -0,0 +1,4 @@ + + + share-hybrid-remote-template-type + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/share-hybrid-template.xml b/share/src/main/resources/alfresco/site-data/template-instances/share-hybrid-template.xml new file mode 100644 index 0000000000..883ae0ec8e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/share-hybrid-template.xml @@ -0,0 +1,4 @@ + + + share-hybrid-template-type + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/share-remote-template.xml b/share/src/main/resources/alfresco/site-data/template-instances/share-remote-template.xml new file mode 100644 index 0000000000..20204d9f90 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/share-remote-template.xml @@ -0,0 +1,4 @@ + + + share-remote-template-type + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/share-template.xml b/share/src/main/resources/alfresco/site-data/template-instances/share-template.xml new file mode 100644 index 0000000000..d741b4f76a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/share-template.xml @@ -0,0 +1,4 @@ + + + share-template-type + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/sharedfiles.xml b/share/src/main/resources/alfresco/site-data/template-instances/sharedfiles.xml new file mode 100644 index 0000000000..3151292676 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/sharedfiles.xml @@ -0,0 +1,101 @@ + + + org/alfresco/sharedfiles + + + + + title + /components/title/simple-title + + page.sharedFiles.title + + + + + + actions-common + /components/documentlibrary/actions-common + + documentlibrary + + + + + + toolbar + /components/documentlibrary/repo/toolbar + + + + + documentlist + /components/documentlibrary/documentlist + + true + + + + + documentlist_v2 + /components/documentlibrary/sharedfiles + + true + documentlibrary + + + + + + filter + /components/documentlibrary/filter + + + + + tree + /components/documentlibrary/sharedfiles/tree + + + + + categories + /components/documentlibrary/categories + + + + + tags + /components/sharedfiles/tag-filter + + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + archive-and-download + /components/download/archive + + + + + doclib-custom + /components/documentlibrary/doclib-custom + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/simple-guest.xml b/share/src/main/resources/alfresco/site-data/template-instances/simple-guest.xml new file mode 100644 index 0000000000..765cdbe381 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/simple-guest.xml @@ -0,0 +1,6 @@ + + + org/alfresco/simple-guest + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/simple.xml b/share/src/main/resources/alfresco/site-data/template-instances/simple.xml new file mode 100644 index 0000000000..cd456beca4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/simple.xml @@ -0,0 +1,6 @@ + + + org/alfresco/simple + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/site-finder.xml b/share/src/main/resources/alfresco/site-data/template-instances/site-finder.xml new file mode 100644 index 0000000000..d3cbc28108 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/site-finder.xml @@ -0,0 +1,25 @@ + + + org/alfresco/site-finder + + + + + title + /components/title/simple-title + + title.siteFinder + + + + + + site-finder + /components/site-finder + + 0 + true + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/site-groups.xml b/share/src/main/resources/alfresco/site-data/template-instances/site-groups.xml new file mode 100644 index 0000000000..2f02ad4147 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/site-groups.xml @@ -0,0 +1,39 @@ + + + org/alfresco/site-groups + Site Groups page + + site-members + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + membersbar + /components/invite/members-bar + + + + + site-groups + /components/site-groups + + 0 + true + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/site-index.xml b/share/src/main/resources/alfresco/site-data/template-instances/site-index.xml new file mode 100644 index 0000000000..c3e291c01f --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/site-index.xml @@ -0,0 +1,4 @@ + + + site-index + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/site-members.xml b/share/src/main/resources/alfresco/site-data/template-instances/site-members.xml new file mode 100644 index 0000000000..53ba610c5d --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/site-members.xml @@ -0,0 +1,39 @@ + + + org/alfresco/site-members + Site members page + + site-members + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + membersbar + /components/invite/members-bar + + + + + site-members + /components/site-members + + 0 + true + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/site-redirect.xml b/share/src/main/resources/alfresco/site-data/template-instances/site-redirect.xml new file mode 100644 index 0000000000..3c356cf5b7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/site-redirect.xml @@ -0,0 +1,32 @@ + + + org/alfresco/site-redirect + Site redirect page + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + site-redirect + /components/site/site-redirect + + + + + site-no-pages + /components/site/site-no-pages + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/start-workflow.xml b/share/src/main/resources/alfresco/site-data/template-instances/start-workflow.xml new file mode 100644 index 0000000000..52993e0570 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/start-workflow.xml @@ -0,0 +1,114 @@ + + + org/alfresco/start-workflow + + documentlibrary + + + + + + title + + + + + + + + + {referrer} + tasks + + + + /components/title/simple-title + + title.myTasks + + + + + + + + {referrer} + workflows + + + + /components/title/simple-title + + title.myWorkflows + + + + + + + + /components/title/collaboration-title + + + + /components/title/simple-title + + title.repository + title.browser + + + + + + + + + + navigation + + + + + + + + + {referer} + tasks + + + + /components/workflow/task-toolbar + + + + + + + {referer} + workflows + + + + /components/workflow/workflow-toolbar + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + start-workflow + /components/workflow/start + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/tag-management.xml b/share/src/main/resources/alfresco/site-data/template-instances/tag-management.xml new file mode 100644 index 0000000000..d0f8f413d0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/tag-management.xml @@ -0,0 +1,10 @@ + + + org/alfresco/tag-management + + + tag-management + /components/admin/tag-management + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/task-details.xml b/share/src/main/resources/alfresco/site-data/template-instances/task-details.xml new file mode 100644 index 0000000000..c9a2c65537 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/task-details.xml @@ -0,0 +1,24 @@ + + + org/alfresco/workflow-details + + documentlibrary + + + + + navigation + /components/navigation/collaboration-navigation + + + + tasks-navigation + /components/workflow/task-toolbar + + + + workflows-navigation + /components/workflow/workflow-toolbar + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/task-edit.xml b/share/src/main/resources/alfresco/site-data/template-instances/task-edit.xml new file mode 100644 index 0000000000..c9a2c65537 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/task-edit.xml @@ -0,0 +1,24 @@ + + + org/alfresco/workflow-details + + documentlibrary + + + + + navigation + /components/navigation/collaboration-navigation + + + + tasks-navigation + /components/workflow/task-toolbar + + + + workflows-navigation + /components/workflow/workflow-toolbar + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/user-cloud-auth.xml b/share/src/main/resources/alfresco/site-data/template-instances/user-cloud-auth.xml new file mode 100644 index 0000000000..90e48a974e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/user-cloud-auth.xml @@ -0,0 +1,25 @@ + + + org/alfresco/user-cloud-auth + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + user-cloud-auth + /components/profile/cloud-auth + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/user-content.xml b/share/src/main/resources/alfresco/site-data/template-instances/user-content.xml new file mode 100644 index 0000000000..165fd927ac --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/user-content.xml @@ -0,0 +1,25 @@ + + + org/alfresco/user-content + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + user-content + /components/profile/user-content + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/user-notifications.xml b/share/src/main/resources/alfresco/site-data/template-instances/user-notifications.xml new file mode 100644 index 0000000000..fc43b8f07e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/user-notifications.xml @@ -0,0 +1,25 @@ + + + org/alfresco/user-notifications + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + user-notifications + /components/profile/user-notifications + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/user-profile.xml b/share/src/main/resources/alfresco/site-data/template-instances/user-profile.xml new file mode 100644 index 0000000000..1e91eece3b --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/user-profile.xml @@ -0,0 +1,43 @@ + + + org/alfresco/user-profile + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + user-profile + /components/profile/userprofile + + + + + html-upload + /components/upload/html-upload + + + flash-upload + /components/upload/flash-upload + + + file-upload + /components/upload/file-upload + + + dnd-upload + /components/upload/dnd-upload + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/user-sites.xml b/share/src/main/resources/alfresco/site-data/template-instances/user-sites.xml new file mode 100644 index 0000000000..29bbef56d7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/user-sites.xml @@ -0,0 +1,24 @@ + + + org/alfresco/user-sites + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + user-sites + /components/profile/user-sites + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/user-trashcan.xml b/share/src/main/resources/alfresco/site-data/template-instances/user-trashcan.xml new file mode 100644 index 0000000000..304f196ee0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/user-trashcan.xml @@ -0,0 +1,25 @@ + + + org/alfresco/user-trashcan + + + + + title + /components/title/profile-title + + + + + toolbar + /components/profile/userprofile-toolbar + + + + + user-trashcan + /components/profile/user-trashcan + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/webview-default.xml b/share/src/main/resources/alfresco/site-data/template-instances/webview-default.xml new file mode 100644 index 0000000000..344f5ea6af --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/webview-default.xml @@ -0,0 +1,13 @@ + + + org/alfresco/webview-default + + + + + view + /components/dashlets/webview-default + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/wiki-create.xml b/share/src/main/resources/alfresco/site-data/template-instances/wiki-create.xml new file mode 100644 index 0000000000..42cca708cc --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/wiki-create.xml @@ -0,0 +1,28 @@ + + + org/alfresco/wiki-create + + wiki + wiki + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + createform + /components/wiki/createform + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/wiki-page.xml b/share/src/main/resources/alfresco/site-data/template-instances/wiki-page.xml new file mode 100644 index 0000000000..f9c78fbf8c --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/wiki-page.xml @@ -0,0 +1,38 @@ + + + org/alfresco/wiki-page + + wiki + wiki + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/wiki/toolbar + + true + + + + + + wikipage + /components/wiki/page + + + + diff --git a/share/src/main/resources/alfresco/site-data/template-instances/wiki.xml b/share/src/main/resources/alfresco/site-data/template-instances/wiki.xml new file mode 100644 index 0000000000..381d601781 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/wiki.xml @@ -0,0 +1,50 @@ + + + org/alfresco/wiki + + wiki + wiki + + + + + + title + /components/title/collaboration-title + + + + + navigation + /components/navigation/collaboration-navigation + + + + + toolbar + /components/wiki/toolbar + + false + + + + + + pagelist + /components/wiki/list + + + + + filter + /components/wiki/filter + + + + + tags + /components/tags + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-instances/workflow-details.xml b/share/src/main/resources/alfresco/site-data/template-instances/workflow-details.xml new file mode 100644 index 0000000000..c150259533 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-instances/workflow-details.xml @@ -0,0 +1,74 @@ + + + org/alfresco/workflow-details + + documentlibrary + + + + + + navigation + + + + + + + + + {referrer} + tasks + + + + /components/workflow/task-toolbar + + + + + + + {referrer} + workflows + + + + /components/workflow/workflow-toolbar + + + + + + + /components/navigation/collaboration-navigation + + + + + + + + + path + + + + + + + + + /components/document-details/path + + + + /components/document-details/repo/path + + + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-types/share-hybrid-remote-template-type.xml b/share/src/main/resources/alfresco/site-data/template-types/share-hybrid-remote-template-type.xml new file mode 100644 index 0000000000..53f2867ba7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-types/share-hybrid-remote-template-type.xml @@ -0,0 +1,9 @@ + + + Share Hybrid Remote Page + This template-type references the "hybrid-page" WebScript to render page definitions stored on the repository referenced by name + + webscript + /share/hybrid-remote-page/template + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-types/share-hybrid-template-type.xml b/share/src/main/resources/alfresco/site-data/template-types/share-hybrid-template-type.xml new file mode 100644 index 0000000000..8fe5413d92 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-types/share-hybrid-template-type.xml @@ -0,0 +1,9 @@ + + + Share Hybrid Page + This template-type references the "hybrid-page" WebScript to render Dojo based widgets between the "legacy" Share header and footer + + webscript + /share/hybrid-page/template + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-types/share-remote-template-type.xml b/share/src/main/resources/alfresco/site-data/template-types/share-remote-template-type.xml new file mode 100644 index 0000000000..a6971b7c2e --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-types/share-remote-template-type.xml @@ -0,0 +1,9 @@ + + + Share Hybrid Remote Page + This template-type references the "hybrid-page" WebScript to render page definitions stored on the repository referenced by name + + webscript + /share/remote-page/template + + diff --git a/share/src/main/resources/alfresco/site-data/template-types/share-template-type.xml b/share/src/main/resources/alfresco/site-data/template-types/share-template-type.xml new file mode 100644 index 0000000000..d83ed5fca8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-types/share-template-type.xml @@ -0,0 +1,9 @@ + + + Share Full Page + This template-type references the "full-page" WebScript to render a complete page of Dojo based widgets + + webscript + /share/full-page/template + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/template-types/site-index.xml b/share/src/main/resources/alfresco/site-data/template-types/site-index.xml new file mode 100644 index 0000000000..8e2d203767 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/template-types/site-index.xml @@ -0,0 +1,12 @@ + + + Site index landing page template type + Site index landing page JSP Template Type + + + + jsp + /site-index.jsp + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-data/themes/default.xml b/share/src/main/resources/alfresco/site-data/themes/default.xml new file mode 100644 index 0000000000..5dbadf77d5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/themes/default.xml @@ -0,0 +1,20 @@ + + + Default Blue Theme + theme.default + + + @dashlet-background: transparent; + @dashlet-border: 1px solid #bababa; + @dashlet-border-radius: 0; + @dashlet-title-background: #d7e0e7 linear-gradient(to bottom, #e3ebef, #afc0cf); + @dashlet-title-border-bottom: 0; + @dashlet-title-border-radius: 0; + @dashlet-title-color: #262d35; + @dashlet-toolbar-background: #f6f6f6; + @dashlet-toolbar-border-bottom: 1px solid #d3d3d3; + @dashlet-body-background: #f9fcfd; + @dashlet-body-border-radius: 0; + + + diff --git a/share/src/main/resources/alfresco/site-data/themes/gdocs.xml b/share/src/main/resources/alfresco/site-data/themes/gdocs.xml new file mode 100644 index 0000000000..09857f5757 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/themes/gdocs.xml @@ -0,0 +1,20 @@ + + + Google Docs Theme + theme.gdocs + + + @dashlet-background: #fff; + @dashlet-border: 1px solid #ddd; + @dashlet-border-radius: 0; + @dashlet-title-background: #eff3fa; + @dashlet-title-border-bottom: 0; + @dashlet-title-border-radius: 0; + @dashlet-title-color: #333; + @dashlet-toolbar-background: #fff; + @dashlet-toolbar-border-bottom: 1px solid #ddd; + @dashlet-body-background: #fff; + @dashlet-body-border-radius: 0; + + + diff --git a/share/src/main/resources/alfresco/site-data/themes/greenTheme.xml b/share/src/main/resources/alfresco/site-data/themes/greenTheme.xml new file mode 100644 index 0000000000..9054134718 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/themes/greenTheme.xml @@ -0,0 +1,20 @@ + + + Green Theme + theme.greenTheme + + + @dashlet-background: #fff; + @dashlet-border: 1px solid #bababa; + @dashlet-border-radius: 0; + @dashlet-title-background: #92c15f linear-gradient(to bottom, #a3d07a, #92c15f); + @dashlet-title-border-bottom: 0; + @dashlet-title-border-radius: 0; + @dashlet-title-color: #fff; + @dashlet-toolbar-background: #f6f6f6; + @dashlet-toolbar-border-bottom: 1px solid #d3d3d3; + @dashlet-body-background: #f9fcfd; + @dashlet-body-border-radius: 0; + + + diff --git a/share/src/main/resources/alfresco/site-data/themes/hcBlack.xml b/share/src/main/resources/alfresco/site-data/themes/hcBlack.xml new file mode 100644 index 0000000000..7e3d3f19f2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/themes/hcBlack.xml @@ -0,0 +1,20 @@ + + + High Contrast Theme + theme.hcBlack + + + @dashlet-background: #fff; + @dashlet-border: 1px solid #232323; + @dashlet-border-radius: 0; + @dashlet-title-background: #d7e0e7 linear-gradient(to bottom, #4c4c4c, #101010); + @dashlet-title-border-bottom: 0; + @dashlet-title-border-radius: 0; + @dashlet-title-color: #fff; + @dashlet-toolbar-background: #f6f6f6; + @dashlet-toolbar-border-bottom: 1px solid #7e7e7e; + @dashlet-body-background: #fff linear-gradient(to bottom, #ebebeb, #fff 116px, #fff); + @dashlet-body-border-radius: 0; + + + diff --git a/share/src/main/resources/alfresco/site-data/themes/lightTheme.xml b/share/src/main/resources/alfresco/site-data/themes/lightTheme.xml new file mode 100644 index 0000000000..6ab6244f7a --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/themes/lightTheme.xml @@ -0,0 +1,23 @@ + + + Light Theme + theme.lightTheme + + + @dashlet-background: #fff; + @dashlet-border: 1px solid #ccc; + @dashlet-border-radius: 6px 6px 0 0; + @dashlet-title-background: #eee; + @dashlet-title-border-bottom: 1px solid #ccc; + @dashlet-title-border-radius: 6px 6px 0 0; + @dashlet-title-color: #333; + @dashlet-toolbar-background: transparent; + @dashlet-toolbar-border-bottom: 1px solid #ccc; + @dashlet-body-background: #fff; + @dashlet-body-border-radius: 0; + + @use-legacy-buttons: false; + + + + diff --git a/share/src/main/resources/alfresco/site-data/themes/yellowTheme.xml b/share/src/main/resources/alfresco/site-data/themes/yellowTheme.xml new file mode 100644 index 0000000000..9ee6b59325 --- /dev/null +++ b/share/src/main/resources/alfresco/site-data/themes/yellowTheme.xml @@ -0,0 +1,20 @@ + + + Yellow Theme + theme.yellowTheme + + + @dashlet-background: #fff; + @dashlet-border: 1px solid #d7d7d7; + @dashlet-border-radius: 0; + @dashlet-title-background: #eee linear-gradient(to bottom, #fff, #eee); + @dashlet-title-border-bottom: 0; + @dashlet-title-border-radius: 0; + @dashlet-title-color: inherit; + @dashlet-toolbar-background: #f8f8f8; + @dashlet-toolbar-border-bottom: 1px solid #e8e8e8; + @dashlet-body-background: #fff; + @dashlet-body-border-radius: 0; + + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/callutils.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/callutils.js new file mode 100644 index 0000000000..aa9f98c101 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/callutils.js @@ -0,0 +1,148 @@ +/** + * Returns a template config param or the passed default if not found. + * This method first checks in template.properties + */ +function getTemplateParam(paramName, defaultValue) +{ + if (template.properties[paramName] != undefined) + { + return template.properties[paramName]; + } + else + { + return defaultValue; + } +} + + +/** Gets a param from a page request. */ +function getPageUrlParam(paramName, defaultValue) +{ + if (page.url.args[paramName] != undefined) + { + return page.url.args[paramName]; + } + else + { + return defaultValue; + } +} + +/** Gets a param from a webscript request. */ +function getRequestParam(paramName, defaultValue) +{ + if (args[paramName] != undefined) + { + return args[paramName]; + } + else + { + return defaultValue; + } +} + +/** + * Adds a request parameter to a url + * @return the new url + */ +function addParamToUrl(theUrl, paramName, paramValue) +{ + if (theUrl.indexOf('?') > -1) + { + return theUrl += "&" + paramName + "=" + paramValue; + } + else + { + return theUrl += "?" + paramName + "=" + paramValue; + } +} + +/** Adds a path element to a url. + * E.g. if the url is /abc/def and elem is ghi the returned url would be + * /abc/def/ghi. On the other hand, if elem is null, the input url would be + * returned + */ +function addUrlPathElement(theUrl, elem) +{ + if (elem != undefined && elem.length > 0) + { + theUrl += "/" + elem; + } + return theUrl; +} + +/** + * Copies all properties from one javascript object to another. + */ +function copyDataToObject(data, target) +{ + for (n in data) + { + target[n] = data[n]; + } +} + +/** + * Copies all properties from the passed javascript object to the model. + */ +function applyDataToModel(data) +{ + copyDataToObject(data, model); +} + + +/** + * POST call + */ +function doPostCall(theUrl, paramsJSON) +{ + var connector = remote.connect("alfresco"); + var result = connector.post(theUrl, paramsJSON, "application/json"); + if (result.status == status.STATUS_OK) + { + return JSON.parse(result.response); + } + else + { + status.code = result.status; + status.message = result.response; + } +} + + +/** + * PUT call + */ +function doPutCall(theUrl, paramsJSON) +{ + var connector = remote.connect("alfresco"); + var result = connector.put(theUrl, paramsJSON, "application/json"); + if (result.status == status.STATUS_OK) + { + return JSON.parse(result.response); + } + else + { + status.code = result.status; + status.message = result.response; + } +} + + +/** + * GET call + */ +function doGetCall(theUrl) +{ + var connector = remote.connect("alfresco"); + var result = connector.get(theUrl); + if (result.status == status.STATUS_OK) + { + return JSON.parse(result.response); + } + else + { + status.code = result.status; + status.message = result.response; + } +} diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/admin-menu/share-header.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/admin-menu/share-header.get.js new file mode 100644 index 0000000000..9275376496 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/admin-menu/share-header.get.js @@ -0,0 +1,14 @@ + + +/** + * If user is not Admin, and they belong to group GROUP_ALFRESCO_MODEL_ADMINISTRATORS, add model manager + * link to the share header. + */ +if (!user.isAdmin && (user.properties["alfUserGroups"].indexOf("GROUP_ALFRESCO_MODEL_ADMINISTRATORS") != -1)) +{ + addNonAdminAdministrativeMenuItem(model.jsonModel, { + id: "HEADER_CUSTOM_MODEL_MANAGER_CONSOLE", + label: "tool.custom-model-manager.label", + targetUrl: "console/custom-model-management-console/custom-model-manager" + }); +} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-dictionary.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-dictionary.get.desc.xml new file mode 100644 index 0000000000..6762b913ed --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-dictionary.get.desc.xml @@ -0,0 +1,9 @@ + + CMM Dictionary GET + Custom Model Management Dictionary Query Service + + /cmm/dictionary/subclasses/{entity} + /cmm/dictionary/{classtype} + user + true + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-dictionary.get.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-dictionary.get.json.ftl new file mode 100644 index 0000000000..3f62d894ac --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-dictionary.get.json.ftl @@ -0,0 +1,13 @@ +<#escape x as jsonUtils.encodeJSONString(x)> +{ + "entities": [ + <#list entities as e> + { + "name": "${e.name}", + "title": "${e.title!""}", + "description": "${e.description!""}" + }<#if e_has_next>, + + ] +} + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.delete.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.delete.desc.xml new file mode 100644 index 0000000000..9d6acdf7fb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.delete.desc.xml @@ -0,0 +1,8 @@ + + CMM Service DELETE + Custom Model Management Service + + /cmm/model-service + /cmm/model-service/{model}/{entity} + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.delete.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.delete.json.ftl new file mode 100644 index 0000000000..967faeb995 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.delete.json.ftl @@ -0,0 +1 @@ +${result} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.get.desc.xml new file mode 100644 index 0000000000..6f6c842ae7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.get.desc.xml @@ -0,0 +1,10 @@ + + CMM Service GET + Custom Model Management Service + + /cmm/model-service/{model} + /cmm/model-service/{model}/{entity} + /cmm/model-service/{model}/forms + user + true + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.get.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.get.json.ftl new file mode 100644 index 0000000000..d523c55595 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.get.json.ftl @@ -0,0 +1,17 @@ +{ +<#if form??> + "form": ${form} + +<#escape x as jsonUtils.encodeJSONString(x)> +<#if moduleId??> + "moduleId": "${moduleId}" + +<#if forms??> + "forms": { + <#list forms as f> + "${f}": true<#if f_has_next>, + + } + + +} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.post.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.post.desc.xml new file mode 100644 index 0000000000..3ef2ab2df5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.post.desc.xml @@ -0,0 +1,7 @@ + + CMM Service POST + Custom Model Management Service + + /cmm/model-service + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.post.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.post.json.ftl new file mode 100644 index 0000000000..967faeb995 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.post.json.ftl @@ -0,0 +1 @@ +${result} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.put.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.put.desc.xml new file mode 100644 index 0000000000..24cade75f8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.put.desc.xml @@ -0,0 +1,7 @@ + + CMM Service PUT + Custom Model Management Service + + /cmm/model-service + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.put.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.put.json.ftl new file mode 100644 index 0000000000..967faeb995 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/cmm-service.put.json.ftl @@ -0,0 +1 @@ +${result} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/module-configuration.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/module-configuration.ftl new file mode 100644 index 0000000000..b07b15b796 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/cmm/components/module-configuration.ftl @@ -0,0 +1,129 @@ +<#macro form e> +<#escape x as x?xml> + + <#list e.properties as p> + for-mode="${p.mode}" <#if p.force?? && p.force>force="true" /> + + + + <#if e.sets??> + <#list e.sets as set> + template="${set.template}" appearance="${set.appearance}" <#if set.label??>label-id="${set.label}" id="${set.id}" /> + + + <#if e.fields??> + <#list e.fields as field> + set="${field.set}" <#if field.readonly?? && field.readonly>read-only="true"> + <#if field.template?? || (field.params?? && field.params?size!=0)> + template="${field.template}"> + <#if field.params??> + <#list field.params?keys as param> + ${field.params[param]} + + + + + + + + + + +<#escape x as x?xml> + + ${moduleName} + true + + + + + <#if aspects?size != 0> + + + <#list aspects as a> + + + + + + <#if subtypes?size != 0> + + <#list subtypes as st> + + <#list st.subtypes as t> + + + + + + + + + + <#list types as t> + <#if t.properties??> + + +
+ <@form e=t/> +
+ + +
+ + <@form e=t/> + + + +
+ + + + + + + + + + 255 + + + + + + + + explorer + true + + + +
+
+
+ + + + + <#list aspects as a> + <#if a.properties??> + + +
+ <@form e=a/> +
+
+
+ + + + + + <#list entities as t> + ${t.form} + + + +
+
+ \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.desc.xml new file mode 100644 index 0000000000..e4ee0724f0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.desc.xml @@ -0,0 +1,5 @@ + + edit-tag + Edit Tags + /components/admin/edit-tag + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.head.ftl new file mode 100644 index 0000000000..59a56f4f46 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.html.ftl new file mode 100644 index 0000000000..03c08c2c12 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.html.ftl @@ -0,0 +1,37 @@ +<@standalone> + <@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/console/tag-management.css" group="admin"/> + + + <@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/modules/form/control-wrapper.js" group="admin"/> + <@script type="text/javascript" src="${url.context}/res/components/console/tag-management.js" group="admin"/> + + + <@markup id="widgets"> + <@createWidgets group="admin"/> + + + <@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid?html> +
+
${msg("label.title")}
+
+
+
+
:
+
 *
+
+
+ + +
+
+
+
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.js new file mode 100644 index 0000000000..63c2e65e55 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.js @@ -0,0 +1 @@ +model.tagName = args["tagName"] != null ? args["tagName"] : ""; diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.properties new file mode 100644 index 0000000000..df9fd8d25b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get.properties @@ -0,0 +1,2 @@ +label.newName=Rename Tag +label.title=Edit Tag diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_de.properties new file mode 100755 index 0000000000..7d73029c00 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_de.properties @@ -0,0 +1,2 @@ +label.newName=Tag umbenennen +label.title=Tag bearbeiten diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_es.properties new file mode 100755 index 0000000000..8367b79e48 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_es.properties @@ -0,0 +1,2 @@ +label.newName=Cambiar nombre de etiqueta +label.title=Editar etiqueta diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_fr.properties new file mode 100755 index 0000000000..6fb51faa45 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_fr.properties @@ -0,0 +1,2 @@ +label.newName=Renommer le tag +label.title=Modifier le tag diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_it.properties new file mode 100755 index 0000000000..7b6fb1c3c5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_it.properties @@ -0,0 +1,2 @@ +label.newName=Rinomina tag +label.title=Modifica tag diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_ja.properties new file mode 100755 index 0000000000..e10c7d6bda --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_ja.properties @@ -0,0 +1,2 @@ +label.newName=\u30bf\u30b0\u540d\u306e\u5909\u66f4 +label.title=\u30bf\u30b0\u306e\u7de8\u96c6 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_nb.properties new file mode 100755 index 0000000000..456eb666fc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_nb.properties @@ -0,0 +1,2 @@ +label.newName=Gi tagg et nytt navn +label.title=Rediger tagg diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_nl.properties new file mode 100755 index 0000000000..101c8bafc8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_nl.properties @@ -0,0 +1,2 @@ +label.newName=Naam van tag wijzigen +label.title=Tag bewerken diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_pt_BR.properties new file mode 100644 index 0000000000..76afc40bce --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_pt_BR.properties @@ -0,0 +1,2 @@ +label.newName=Renomear marca +label.title=Editar marca diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_ru.properties new file mode 100755 index 0000000000..70948571bf --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_ru.properties @@ -0,0 +1,2 @@ +label.newName=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 +label.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_zh_CN.properties new file mode 100755 index 0000000000..47e4574cf0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/edit-tag.get_zh_CN.properties @@ -0,0 +1,2 @@ +label.newName=\u91cd\u547d\u540d\u6807\u8bb0 +label.title=\u7f16\u8f91\u6807\u8bb0 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.desc.xml new file mode 100644 index 0000000000..0e59685682 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.desc.xml @@ -0,0 +1,5 @@ + + Replication Job + Admin: Create and Edit Replication Jobs + /components/admin/replication-job + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.html.ftl new file mode 100644 index 0000000000..3c04d563ce --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.html.ftl @@ -0,0 +1,118 @@ +<#include "../form/form.dependencies.inc"> +<#assign jobName = (page.url.args.jobName?html)!""> +<#assign mode = (jobName = "")?string("create", "edit")> +<#assign action = url.context + "/proxy/alfresco/api/replication-definition" + (jobName = "")?string("s", "/" + jobName?url)> +<#assign intervalPeriods = +{ + "Second": msg("option.seconds"), + "Minute": msg("option.minutes"), + "Hour": msg("option.hours"), + "Day": msg("option.days"), + "Week": msg("option.weeks"), + "Month": msg("option.months") +}> + +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/admin/replication-job.css" group="admin"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/modules/form/control-wrapper.js" group="admin"/> + <@script type="text/javascript" src="${url.context}/res/components/admin/replication-job.js" group="admin"/> + + + +<@markup id="widgets"> + <#if mode == "edit" && !(jobDetail.name??)> +
${msg("message.no-job-details", jobName)}
+ <#else> + <@createWidgets group="admin"/> + + + +<@markup id="html"> + <@uniqueIdDiv> + + <#if mode == "edit" && !(jobDetail.name??)> +
${msg("message.no-job-details", jobName)}
+ <#else> + <#assign id = args.htmlid?html> +
+

${msg("header." + mode, jobName)}

+
+ + + + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.js new file mode 100644 index 0000000000..ab6280956d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.js @@ -0,0 +1,55 @@ +function main() +{ + // Model variables + var jobDetail = {}; + + var jobName = page.url.args.jobName; + if (jobName != null) + { + var response = remote.call("/api/replication-definition/" + encodeURIComponent(jobName)); + if (response.status == 200) + { + var json = JSON.parse(response); + jobDetail = json.data; + } + } + + model.jobDetail = jobDetail; + + // Define widget model... + + + var payload = []; + if (jobDetail && jobDetail.payload) + { + for (var i = 0; i < jobDetail.payload.length; i++) + { + payload.push(jobDetail.payload[i]["nodeRef"]); + } + } + + var scheduleStart = ""; + if (jobDetail && jobDetail.schedule && jobDetail.schedule.start && jobDetail.schedule.start.iso8601) + { + scheduleStart = jobDetail.schedule.start.iso8601; + } + var targetName = ""; + if (jobDetail.targetName) + { + targetName = jobDetail.targetName; + } + var replicationJob = { + id: "ReplicationJob", + name: "Alfresco.component.ReplicationJob", + options : { + jobName : jobName || "", + payload : payload, + targetName : targetName, + scheduleStart : scheduleStart + }, + }; + + model.widgets = [replicationJob]; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.properties new file mode 100644 index 0000000000..bc9d201a67 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get.properties @@ -0,0 +1,31 @@ +header.create=Create New Replication Job +header.edit=Edit Replication Job: {0} + +form.required.fields=Required Fields +form.required.fields.marker=* + +label.set.general=General +label.set.payload=Payload +label.set.transfer-target=Transfer Target +label.set.schedule=Schedule +label.set.other=Other Options + +label.source-items=Source Items +label.transfer-to=Transfer to +label.schedule-job=Schedule job +label.start-date=Start Date +label.repeat=Repeat Every +label.enabled=Enabled + +button.create-job=Create Job +button.edit-job=Save + +option.none=(Select ...) +option.seconds=Second(s) +option.minutes=Minute(s) +option.hours=Hour(s) +option.days=Day(s) +option.weeks=Week(s) +option.months=Month(s) + +message.no-job-details=Couldn''t load details for job "{0}". Has it been deleted? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_de.properties new file mode 100755 index 0000000000..b7f7dbfd03 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_de.properties @@ -0,0 +1,31 @@ +header.create=Neuen Replikationsjob anlegen +header.edit=Replikationsjob bearbeiten: {0} + +form.required.fields=Pflichtfelder +form.required.fields.marker=* + +label.set.general=Allgemein +label.set.payload=Nutzdaten +label.set.transfer-target=\u00dcbertragungsziel +label.set.schedule=Ablaufplan +label.set.other=Weitere Optionen + +label.source-items=Quelldokumente +label.transfer-to=\u00dcbertragen nach +label.schedule-job=Job planen +label.start-date=Anfangsdatum +label.repeat=Wiederholung alle +label.enabled=Aktiviert + +button.create-job=Job anlegen +button.edit-job=Speichern + +option.none=(Ausw\u00e4hlen...) +option.seconds=Sekunde(n) +option.minutes=Minute(n) +option.hours=Stunde(n) +option.days=Tag(e) +option.weeks=Woche(n) +option.months=Monat(e) + +message.no-job-details=Einzelheiten zu Job ''{0}'' konnten nicht geladen werden. Wurde er gel\u00f6scht? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_es.properties new file mode 100755 index 0000000000..9f89d4f39f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_es.properties @@ -0,0 +1,31 @@ +header.create=Crear nuevo trabajo de replicaci\u00f3n +header.edit=Editar trabajo de replicaci\u00f3n: {0} + +form.required.fields=Campos requeridos +form.required.fields.marker=* + +label.set.general=General +label.set.payload=Datos \u00fatiles +label.set.transfer-target=Destino de la transferencia +label.set.schedule=Lista +label.set.other=Otras opciones + +label.source-items=Elementos de origen +label.transfer-to=Transferir a +label.schedule-job=Programar trabajo +label.start-date=Fecha de inicio +label.repeat=Repetir cada +label.enabled=Activo + +button.create-job=Crear trabajo +button.edit-job=Guardar + +option.none=(Seleccionar...) +option.seconds=Segundo(s) +option.minutes=Minuto(s) +option.hours=Hora(s) +option.days=D\u00eda(s) +option.weeks=Semana(s) +option.months=Mes(es) + +message.no-job-details=No se pudo cargar los detalles del trabajo ''{0}''. \u00bfHa sido eliminado? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_fr.properties new file mode 100755 index 0000000000..7212dff944 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_fr.properties @@ -0,0 +1,31 @@ +header.create=Cr\u00e9er une t\u00e2che de r\u00e9plication +header.edit=Modifier une t\u00e2che de r\u00e9plication : {0} + +form.required.fields=Champs requis +form.required.fields.marker=* + +label.set.general=G\u00e9n\u00e9ral +label.set.payload=Charge utile +label.set.transfer-target=Cible de transfert +label.set.schedule=Planning +label.set.other=Autres options + +label.source-items=\u00c9l\u00e9ments source +label.transfer-to=Transf\u00e9rer \u00e0 +label.schedule-job=T\u00e2che planifi\u00e9e +label.start-date=Date de d\u00e9but +label.repeat=R\u00e9p\u00e9ter tous les +label.enabled=Activ\u00e9 + +button.create-job=Cr\u00e9er une t\u00e2che +button.edit-job=Enregistrer + +option.none=(S\u00e9lectionner...) +option.seconds=Seconde(s) +option.minutes=Minute(s) +option.hours=Heure(s) +option.days=Jour(s) +option.weeks=Semaine(s) +option.months=Mois + +message.no-job-details=Impossible de charger les d\u00e9tails de la t\u00e2che ''{0}''. Cette t\u00e2che a-t-elle \u00e9t\u00e9 supprim\u00e9e ? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_it.properties new file mode 100755 index 0000000000..f377d013cb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_it.properties @@ -0,0 +1,31 @@ +header.create=Crea nuovo job di replica +header.edit=Modifica job di replica: {0} + +form.required.fields=Campi richiesti +form.required.fields.marker=* + +label.set.general=Generale +label.set.payload=Payload +label.set.transfer-target=Destinazione trasferimento +label.set.schedule=Programma +label.set.other=Altre opzioni + +label.source-items=Elementi fonte +label.transfer-to=Trasferisci a +label.schedule-job=Programma job +label.start-date=Data di inizio +label.repeat=Ripeti ogni +label.enabled=Abilitato + +button.create-job=Crea job +button.edit-job=Salva + +option.none=(Seleziona...) +option.seconds=Secondo/i +option.minutes=Minuto/i +option.hours=Ora/e +option.days=Giorno/i +option.weeks=Settimana/e +option.months=Mese/i + +message.no-job-details=Impossibile caricare i dettagli per il job ''{0}''. \u00c8 stato eliminato? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_ja.properties new file mode 100755 index 0000000000..2e0af12267 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_ja.properties @@ -0,0 +1,31 @@ +header.create=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u306e\u65b0\u898f\u4f5c\u6210 +header.edit=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u306e\u7de8\u96c6 + +form.required.fields=\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 +form.required.fields.marker=* + +label.set.general=\u4e00\u822c +label.set.payload=\u30da\u30a4\u30ed\u30fc\u30c9 +label.set.transfer-target=\u8ee2\u9001\u5148 +label.set.schedule=\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb +label.set.other=\u305d\u306e\u4ed6\u306e\u30aa\u30d7\u30b7\u30e7\u30f3 + +label.source-items=\u30bd\u30fc\u30b9\u30a2\u30a4\u30c6\u30e0 +label.transfer-to=\u8ee2\u9001\u5148 +label.schedule-job=\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u30b8\u30e7\u30d6 +label.start-date=\u958b\u59cb\u65e5 +label.repeat=\u7e70\u308a\u8fd4\u3057\u5358\u4f4d +label.enabled=\u6709\u52b9 + +button.create-job=\u30b8\u30e7\u30d6\u306e\u4f5c\u6210 +button.edit-job=\u4fdd\u5b58 + +option.none=(\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044...) +option.seconds=\u79d2 +option.minutes=\u5206 +option.hours=\u6642 +option.days=\u65e5 +option.weeks=\u9031 +option.months=\u6708 + +message.no-job-details=\u30b8\u30e7\u30d6 ''{0}'' \u306e\u8a73\u7d30\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u524a\u9664\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_nb.properties new file mode 100755 index 0000000000..6fb5273795 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_nb.properties @@ -0,0 +1,31 @@ +header.create=Opprett ny replikeringsjobb +header.edit=Rediger replikasjonsjobb: {0} + +form.required.fields=Obligatoriske felt +form.required.fields.marker=* + +label.set.general=Generelt +label.set.payload=Nyttelast +label.set.transfer-target=Overf\u00f8ringsm\u00e5l +label.set.schedule=Tidsplan +label.set.other=Andre alternativer + +label.source-items=Kildeelementer +label.transfer-to=Overf\u00f8r til +label.schedule-job=Planlegg jobb +label.start-date=Startdato +label.repeat=Gjenta hver/hvert +label.enabled=Aktivert + +button.create-job=Opprett jobb +button.edit-job=Lagre + +option.none=(Velg...) +option.seconds=Sekund(er) +option.minutes=Minutt(er) +option.hours=Time(r) +option.days=Dag(er) +option.weeks=Uke(r) +option.months=M\u00e5ned(er) + +message.no-job-details=Kan ikke laste detaljer for jobb {0}. Er den slettet? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_nl.properties new file mode 100755 index 0000000000..89de4e677b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_nl.properties @@ -0,0 +1,31 @@ +header.create=Nieuwe replicatiejob maken +header.edit=Replicatiejob bewerken: {0} + +form.required.fields=Verplichte velden +form.required.fields.marker=* + +label.set.general=Algemeen +label.set.payload=Lading +label.set.transfer-target=Bestemming van overdracht +label.set.schedule=Schema +label.set.other=Andere opties + +label.source-items=Bronobjecten +label.transfer-to=Overbrengen naar +label.schedule-job=Job plannen +label.start-date=Begindatum +label.repeat=Herhalen elk(e) +label.enabled=Ingeschakeld + +button.create-job=Job maken +button.edit-job=Opslaan + +option.none=(Selecteren...) +option.seconds=Seconde(n) +option.minutes=Minuut(/minuten) +option.hours=Uur +option.days=Dag(en) +option.weeks=Week(/weken) +option.months=Maand(/maanden) + +message.no-job-details=Kan details niet laden voor job "{0}". Is deze verwijderd? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_pt_BR.properties new file mode 100644 index 0000000000..6f8edb6728 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_pt_BR.properties @@ -0,0 +1,31 @@ +header.create=Criar novo trabalho de replica\u00e7\u00e3o +header.edit=Editar trabalho de replica\u00e7\u00e3o: {0} + +form.required.fields=Campos obrigat\u00f3rios +form.required.fields.marker=* + +label.set.general=Geral +label.set.payload=Carga +label.set.transfer-target=Destino de transfer\u00eancia +label.set.schedule=Programar +label.set.other=Outras op\u00e7\u00f5es + +label.source-items=Itens de origem +label.transfer-to=Transferir para +label.schedule-job=Programar trabalho +label.start-date=Data de in\u00edcio +label.repeat=Repetir a cada +label.enabled=Ativado + +button.create-job=Criar trabalho +button.edit-job=Salvar + +option.none=(Selecionar...) +option.seconds=Segundo(s) +option.minutes=Minuto(s) +option.hours=Hora(s) +option.days=Dia(s) +option.weeks=Semana(s) +option.months=M\u00eas(es) + +message.no-job-details=N\u00e3o foi poss\u00edvel carregar os detalhes do trabalho ''{0}''. Foi exclu\u00eddo? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_ru.properties new file mode 100755 index 0000000000..3bf7d5d74e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_ru.properties @@ -0,0 +1,31 @@ +header.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +header.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438: {0} + +form.required.fields=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f +form.required.fields.marker=* + +label.set.general=\u041e\u0431\u0449\u0435\u0435 +label.set.payload=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 +label.set.transfer-target=\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 +label.set.schedule=\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +label.set.other=\u0414\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0446\u0438\u0438 + +label.source-items=\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b +label.transfer-to=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432 +label.schedule-job=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 +label.start-date=\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 +label.repeat=\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0435 +label.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e + +button.create-job=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 +button.edit-job=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c + +option.none=(\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435...) +option.seconds=\u0421\u0435\u043a +option.minutes=\u041c\u0438\u043d +option.hours=\u0427\u0430\u0441 +option.days=\u0414\u043d +option.weeks=\u041d\u0435\u0434 +option.months=\u041c\u0435\u0441 + +message.no-job-details=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f ''{0}''. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e? diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_zh_CN.properties new file mode 100755 index 0000000000..673f4dcad4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/admin/replication-job.get_zh_CN.properties @@ -0,0 +1,31 @@ +header.create=\u521b\u5efa\u65b0\u590d\u5236\u4f5c\u4e1a +header.edit=\u7f16\u8f91\u590d\u5236\u4f5c\u4e1a\uff1a{0} + +form.required.fields=\u5fc5\u586b\u5b57\u6bb5 +form.required.fields.marker=* + +label.set.general=\u5e38\u89c4 +label.set.payload=\u8d1f\u8f7d +label.set.transfer-target=\u4f20\u8f93\u76ee\u6807 +label.set.schedule=\u8ba1\u5212 +label.set.other=\u5176\u4ed6\u9009\u9879 + +label.source-items=\u6e90\u9879 +label.transfer-to=\u8f6c\u79fb\u5230 +label.schedule-job=\u8ba1\u5212\u4f5c\u4e1a +label.start-date=\u5f00\u59cb\u65e5\u671f +label.repeat=\u91cd\u590d\u5468\u671f +label.enabled=\u5df2\u542f\u7528 + +button.create-job=\u521b\u5efa\u4f5c\u4e1a +button.edit-job=\u4fdd\u5b58 + +option.none=\uff08\u9009\u62e9...\uff09 +option.seconds=\u79d2\u949f +option.minutes=\u5206\u949f +option.hours=\u5c0f\u65f6 +option.days=\u5929 +option.weeks=\u5468 +option.months=\u6708 + +message.no-job-details=\u65e0\u6cd5\u52a0\u8f7d\u4f5c\u4e1a "{0}" \u7684\u8be6\u7ec6\u4fe1\u606f\u3002 \u662f\u5426\u5df2\u5c06\u5176\u5220\u9664\uff1f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.desc.xml new file mode 100644 index 0000000000..c8407cc82a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.desc.xml @@ -0,0 +1,5 @@ + + Blog Archives + Blog: Post List Archives Component + /components/blog/archives + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.html.ftl new file mode 100644 index 0000000000..80748e2c90 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.html.ftl @@ -0,0 +1,21 @@ +<@markup id="css" > + <#-- No CSS Dependencies --> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/blog/archive.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+

${msg("header.title")}

+ +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.js new file mode 100644 index 0000000000..72a34d045e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.js @@ -0,0 +1,14 @@ +function main() +{ + var blogPostListArchive = { + id: "BlogPostListArchive", + name : "Alfresco.BlogPostListArchive", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : template.properties.container != null ? template.properties.container : "documentLibrary" + } + }; + model.widgets = [blogPostListArchive]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.properties new file mode 100644 index 0000000000..4c203186b5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get.properties @@ -0,0 +1,2 @@ +# Header +header.title=Archives diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_de.properties new file mode 100755 index 0000000000..9bc7e1dd48 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_de.properties @@ -0,0 +1,2 @@ +# Header +header.title=Archive diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_es.properties new file mode 100755 index 0000000000..0d5353542f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_es.properties @@ -0,0 +1,2 @@ +# Header +header.title=Hist\u00f3rico diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_fr.properties new file mode 100755 index 0000000000..4c203186b5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_fr.properties @@ -0,0 +1,2 @@ +# Header +header.title=Archives diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_it.properties new file mode 100755 index 0000000000..6e994fa4d8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_it.properties @@ -0,0 +1,2 @@ +# Header +header.title=Archivi diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_ja.properties new file mode 100755 index 0000000000..67cd0dcaaf --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_ja.properties @@ -0,0 +1,2 @@ +# Header +header.title=\u30a2\u30fc\u30ab\u30a4\u30d6 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_nb.properties new file mode 100755 index 0000000000..09d9a1afdc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_nb.properties @@ -0,0 +1,2 @@ +# Header +header.title=Arkiver diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_nl.properties new file mode 100755 index 0000000000..892c3d1d7d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_nl.properties @@ -0,0 +1,2 @@ +# Header +header.title=Archieven diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_pt_BR.properties new file mode 100644 index 0000000000..6dacc20d54 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_pt_BR.properties @@ -0,0 +1,2 @@ +# Header +header.title=Arquivos diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_ru.properties new file mode 100755 index 0000000000..012da715a3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_ru.properties @@ -0,0 +1,2 @@ +# Header +header.title=\u0410\u0440\u0445\u0438\u0432\u044b diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_zh_CN.properties new file mode 100755 index 0000000000..d3e40d3028 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/archives.get_zh_CN.properties @@ -0,0 +1,2 @@ +# Header +header.title=\u5b58\u6863 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.desc.xml new file mode 100644 index 0000000000..6a148fa687 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.desc.xml @@ -0,0 +1,6 @@ + + Blog + Get a blog + /components/blog/post/site/{site}/{container}/{path} + argument + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.js new file mode 100644 index 0000000000..61a7b2a5f1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.js @@ -0,0 +1,25 @@ + +function main() +{ + // retrieve the blog post + var uri = "/api/blog/post/site/" + url.templateArgs.site +"/" + url.templateArgs.container +"/" + url.templateArgs.path; + var connector = remote.connect("alfresco"); + var result = connector.get(encodeURI(uri)); + if (result.status.code == status.STATUS_OK) + { + // Strip out possible malicious code + var post = JSON.parse(result.response); + if (post && post.item && post.item.content) { + post.item.content = stringUtils.stripUnsafeHTML(post.item.content); + } + return jsonUtils.toJSONString(post); + } + else + { + status.code = result.status.code; + status.message = msg.get("message.failure"); + status.redirect = true; + } +} + +model.post = main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.json.ftl new file mode 100644 index 0000000000..58a2995de0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.json.ftl @@ -0,0 +1 @@ +${post!"{}"} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.properties new file mode 100644 index 0000000000..3d1c659a2d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get.properties @@ -0,0 +1 @@ +message.failure=An error occurred when retrieving the blog post diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_de.properties new file mode 100755 index 0000000000..8f04895d24 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_de.properties @@ -0,0 +1 @@ +message.failure=Beim Abruf des Blog-Post ist ein Fehler aufgetreten diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_es.properties new file mode 100755 index 0000000000..5aeb06bbb6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_es.properties @@ -0,0 +1 @@ +message.failure=No se pudo recuperar la entrada del blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_fr.properties new file mode 100755 index 0000000000..0a5d8f12fa --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_fr.properties @@ -0,0 +1 @@ +message.failure=Une erreur s\u0092est produite lors de la r\u00e9cup\u00e9ration de l\u0092article du blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_it.properties new file mode 100755 index 0000000000..77309a37ef --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_it.properties @@ -0,0 +1 @@ +message.failure=Si \u00e8 verificato un errore durante il recupero del post del blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_ja.properties new file mode 100755 index 0000000000..e73eaba3bb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_ja.properties @@ -0,0 +1 @@ +message.failure=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_nb.properties new file mode 100755 index 0000000000..fa9e5348e1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_nb.properties @@ -0,0 +1 @@ +message.failure=Det oppsto en feil under henting av blogginnlegget diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_nl.properties new file mode 100755 index 0000000000..730377bd94 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_nl.properties @@ -0,0 +1 @@ +message.failure=Er is een fout opgetreden bij het ophalen van het blogbericht diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_pt_BR.properties new file mode 100644 index 0000000000..071cb2819d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_pt_BR.properties @@ -0,0 +1 @@ +message.failure=Ocorreu um erro ao recuperar a postagem do blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_ru.properties new file mode 100755 index 0000000000..00b0f75224 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_ru.properties @@ -0,0 +1 @@ +message.failure=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043b\u043e\u0433\u0430 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_zh_CN.properties new file mode 100755 index 0000000000..d17327ce36 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-post.get_zh_CN.properties @@ -0,0 +1 @@ +message.failure=\u68c0\u7d22\u535a\u5ba2\u5e16\u5b50\u65f6\u51fa\u9519 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.desc.xml new file mode 100644 index 0000000000..bc39ee859d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.desc.xml @@ -0,0 +1,8 @@ + + Blog posts + Get all posts for a blog using same filter and params as in + repo webscript for url /api/blog/site/{site}/{container}/posts + /components/blog/site/{site}/{container}/posts + /components/blog/site/{site}/{container}/posts/{filter} + argument + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.js new file mode 100644 index 0000000000..02655cf79b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.js @@ -0,0 +1,38 @@ + +function main() +{ + // retrieve blog posts using a filter + var filter = "", + params = []; + if (url.templateArgs.filter) + { + filter = "/" + url.templateArgs.filter; + } + for (var name in args) + { + params.push(name + "=" + args[name]); + } + var uri = "/api/blog/site/" + url.templateArgs.site +"/" + url.templateArgs.container +"/posts" + filter + "?" + params.join("&"); + var connector = remote.connect("alfresco"); + var result = connector.get(encodeURI(uri)); + if (result.status.code == status.STATUS_OK) + { + // Strip out possible malicious code + var posts = JSON.parse(result.response); + if (posts && posts.items) { + for (var i = 0, il = posts.items.length; i < il; i++) + { + posts.items[i].content = stringUtils.stripUnsafeHTML(posts.items[i].content); + } + } + return jsonUtils.toJSONString(posts); + } + else + { + status.code = result.status.code; + status.message = msg.get("message.failure"); + status.redirect = true; + } +} + +model.posts = main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.json.ftl new file mode 100644 index 0000000000..94838a9df1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.json.ftl @@ -0,0 +1 @@ +${posts!"{}"} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.properties new file mode 100644 index 0000000000..35331fa5fd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get.properties @@ -0,0 +1 @@ +message.failure=An error occurred when retrieving the blog posts diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_de.properties new file mode 100755 index 0000000000..f8c6a8ffe0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_de.properties @@ -0,0 +1 @@ +message.failure=Beim Abruf der Blog-Posts ist ein Fehler aufgetreten diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_es.properties new file mode 100755 index 0000000000..f86fed2725 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_es.properties @@ -0,0 +1 @@ +message.failure=No se pudieron recuperar las entradas del blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_fr.properties new file mode 100755 index 0000000000..a0b38c038c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_fr.properties @@ -0,0 +1 @@ +message.failure=Une erreur s\u0092est produite lors de la r\u00e9cup\u00e9ration des articles du blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_it.properties new file mode 100755 index 0000000000..d7fd997fcf --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_it.properties @@ -0,0 +1 @@ +message.failure=Si \u00e8 verificato un errore durante il recupero dei post del blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_ja.properties new file mode 100755 index 0000000000..e73eaba3bb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_ja.properties @@ -0,0 +1 @@ +message.failure=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_nb.properties new file mode 100755 index 0000000000..48340ed281 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_nb.properties @@ -0,0 +1 @@ +message.failure=Det oppsto en feil under henting av blogginnleggene diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_nl.properties new file mode 100755 index 0000000000..928a21687c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_nl.properties @@ -0,0 +1 @@ +message.failure=Er is een fout opgetreden bij het ophalen van de blogberichten diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_pt_BR.properties new file mode 100644 index 0000000000..d45e657738 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_pt_BR.properties @@ -0,0 +1 @@ +message.failure=Ocorreu um erro ao recuperar as postagens do blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_ru.properties new file mode 100755 index 0000000000..49eb66f157 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_ru.properties @@ -0,0 +1 @@ +message.failure=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u043b\u043e\u0433\u0430 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_zh_CN.properties new file mode 100755 index 0000000000..d17327ce36 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/blog-posts.get_zh_CN.properties @@ -0,0 +1 @@ +message.failure=\u68c0\u7d22\u535a\u5ba2\u5e16\u5b50\u65f6\u51fa\u9519 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.desc.xml new file mode 100644 index 0000000000..19b22e448c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.desc.xml @@ -0,0 +1,5 @@ + + Blog comments component + Blog: Displays comments to a post + /components/blog/comments + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.html.ftl new file mode 100644 index 0000000000..33c585e157 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.html.ftl @@ -0,0 +1,26 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/blog/commentlist.css" group="blog"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/blog/commentlist.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.js new file mode 100644 index 0000000000..34118ddc90 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.js @@ -0,0 +1,28 @@ +function main() +{ + var height = (args.editorHeight != null) ? args.editorHeight : 180, + width = (args.editorWidth != null) ? args.editorWidth : 700; + + var commentList = { + id: "CommentList", + name : "Alfresco.CommentList", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : template.properties.container != null ? template.properties.container : "documentLibrary", + height : height, + width : width, + editorConfig : { + height: height, + width: width, + menu: {}, + toolbar: "bold italic underline | bullist numlist | forecolor backcolor | undo redo removeformat", + language: locale, + statusbar: false + } + } + }; + + model.widgets = [commentList]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.properties new file mode 100644 index 0000000000..e0c22996b6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Unable to load comments +message.delete.success=Comment deleted +message.delete.failure=Unable to delete comment +message.loadeditform.failure=Unable to load edit comment form +message.savecomment=Saving comment... +message.savecomment.success=Comment updated +message.savecomment.failure=Unable to save comment +message.confirm.delete.title=Delete Comment +message.confirm.delete=Are you sure you want to delete this comment? +message.wait=Please wait... + +label.comments=Comments ({0}/{1}) +label.noComments=No comments + +## Actions +action.edit=Edit +action.delete=Delete + +## Comment +comment.said=said +comment.postedOn=Posted on +comment.updated=Updated diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_de.properties new file mode 100755 index 0000000000..e359c43e2a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_de.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Kommentare k\u00f6nnen nicht geladen werden +message.delete.success=Kommentar gel\u00f6scht +message.delete.failure=Kommentar l\u00f6schen nicht m\u00f6glich +message.loadeditform.failure=Laden des Formulars zur \u00c4nderung des Kommentars nicht m\u00f6glich +message.savecomment=Kommentar wird gespeichert... +message.savecomment.success=Kommentar aktualisiert +message.savecomment.failure=Kommentar kann nicht gespeichert werden +message.confirm.delete.title=Kommentar l\u00f6schen +message.confirm.delete=M\u00f6chten Sie diesen Kommentar wirklich l\u00f6schen? +message.wait=Bitte warten... + +label.comments=Kommentare ({0}/{1}) +label.noComments=Keine Kommentare vorhanden + +## Actions +action.edit=Bearbeiten +action.delete=L\u00f6schen + +## Comment +comment.said=schrieb +comment.postedOn=Gepostet am +comment.updated=Aktualisiert diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_es.properties new file mode 100755 index 0000000000..c2d05e9aa5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_es.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Error al cargar los comentarios +message.delete.success=Comentario eliminado +message.delete.failure=Error al eliminar el comentario +message.loadeditform.failure=Error al cargar el formulario de edici\u00f3n de comentarios +message.savecomment=Guardando el comentario... +message.savecomment.success=Comentario actualizado +message.savecomment.failure=Error al guardar el comentario +message.confirm.delete.title=Eliminar comentario +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar el comentario? +message.wait=Espere por favor... + +label.comments=Comentarios ({0}/{1}) +label.noComments=No hay comentarios + +## Actions +action.edit=Editar +action.delete=Eliminar + +## Comment +comment.said=dijo +comment.postedOn=Publicado el +comment.updated=Actualizado diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_fr.properties new file mode 100755 index 0000000000..b7c5bd33e3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_fr.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Echec du chargement des commentaires +message.delete.success=Commentaire supprim\u00e9 +message.delete.failure=Echec de la suppression du commentaire +message.loadeditform.failure=Echec du chargement du formulaire de modification des commentaires +message.savecomment=Enregistrement du commentaire... +message.savecomment.success=Commentaire mis \u00e0 jour +message.savecomment.failure=Echec de l'enregistrement du commentaire +message.confirm.delete.title=Supprimer le commentaire +message.confirm.delete=\u00cates-vous s\u00fbr de vouloir supprimer ce commentaire ? +message.wait=Veuillez patienter... + +label.comments=Commentaires ({0}/{1}) +label.noComments=Pas de commentaire + +## Actions +action.edit=Modifier +action.delete=Supprimer + +## Comment +comment.said=a dit +comment.postedOn=Publi\u00e9 le +comment.updated=Mis \u00e0 jour diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_it.properties new file mode 100755 index 0000000000..6e5c78a98d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_it.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Impossibile caricare i commenti +message.delete.success=Commento eliminato +message.delete.failure=Impossibile eliminare il commento +message.loadeditform.failure=Impossibile caricare il modulo di modifica del commento +message.savecomment=Salvataggio del commento in corso... +message.savecomment.success=Commento aggiornato +message.savecomment.failure=Impossibile salvare il commento +message.confirm.delete.title=Elimina commento +message.confirm.delete=Eliminare questo commento? +message.wait=Attendere... + +label.comments=Commenti ({0}/{1}) +label.noComments=Nessun commento + +## Actions +action.edit=Modifica +action.delete=Elimina + +## Comment +comment.said=ha detto +comment.postedOn=Postato il +comment.updated=Aggiornato diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_ja.properties new file mode 100755 index 0000000000..564387edde --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_ja.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093 +message.delete.success=\u30b3\u30e1\u30f3\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +message.loadeditform.failure=\u30b3\u30e1\u30f3\u30c8\u306e\u7de8\u96c6\u30d5\u30a9\u30fc\u30e0\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093 +message.savecomment=\u30b3\u30e1\u30f3\u30c8\u3092\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059... +message.savecomment.success=\u30b3\u30e1\u30f3\u30c8\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.savecomment.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093 +message.confirm.delete.title=\u30b3\u30e1\u30f3\u30c8\u306e\u524a\u9664 +message.confirm.delete=\u3053\u306e\u30b3\u30e1\u30f3\u30c8\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +message.wait=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044... + +label.comments=\u30b3\u30e1\u30f3\u30c8 ({0}/{1}) +label.noComments=\u30b3\u30e1\u30f3\u30c8\u306a\u3057 + +## Actions +action.edit=\u7de8\u96c6 +action.delete=\u524a\u9664 + +## Comment +comment.said=\u30b3\u30e1\u30f3\u30c8 +comment.postedOn=\u6295\u7a3f\u65e5 +comment.updated=\u66f4\u65b0\u6e08\u307f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_nb.properties new file mode 100755 index 0000000000..e43a017aeb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_nb.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Kan ikke laste kommentarer +message.delete.success=Kommentar ble slettet +message.delete.failure=Kan ikke slette kommentar +message.loadeditform.failure=Kan ikke laste skjema for redigeringskommentar +message.savecomment=Lagrer kommentar... +message.savecomment.success=Kommentar ble oppdatert +message.savecomment.failure=Kan ikke lagre kommentar +message.confirm.delete.title=Slett kommentar +message.confirm.delete=Er du sikker p\u00e5 at du vil slette denne kommentaren? +message.wait=Vent litt... + +label.comments=Kommentarer ({0}/{1}) +label.noComments=Ingen kommentarer + +## Actions +action.edit=Rediger +action.delete=Slett + +## Comment +comment.said=sa +comment.postedOn=Lagt inn den +comment.updated=Oppdatert diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_nl.properties new file mode 100755 index 0000000000..0ed6271501 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_nl.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=Kan opmerkingen niet laden +message.delete.success=Opmerking verwijderd +message.delete.failure=Kan opmerking niet verwijderen +message.loadeditform.failure=Kan formulier voor bewerken van opmerking niet laden +message.savecomment=Opmerking opslaan... +message.savecomment.success=Opmerking bijgewerkt +message.savecomment.failure=Kan opmerking niet opslaan +message.confirm.delete.title=Opmerking verwijderen +message.confirm.delete=Weet u zeker dat u deze opmerking wilt verwijderen? +message.wait=Een ogenblik geduld... + +label.comments=Opmerkingen ({0}/{1}) +label.noComments=Geen opmerkingen + +## Actions +action.edit=Bewerken +action.delete=Verwijderen + +## Comment +comment.said=schreef +comment.postedOn=Gepubliceerd op +comment.updated=Bijgewerkt diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_pt_BR.properties new file mode 100644 index 0000000000..03eec2408e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_pt_BR.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=N\u00e3o \u00e9 poss\u00edvel carregar os coment\u00e1rios +message.delete.success=Coment\u00e1rio exclu\u00eddo +message.delete.failure=N\u00e3o \u00e9 poss\u00edvel excluir o coment\u00e1rio +message.loadeditform.failure=N\u00e3o \u00e9 poss\u00edvel carregar o formul\u00e1rio para editar o coment\u00e1rio +message.savecomment=Salvando coment\u00e1rio... +message.savecomment.success=Coment\u00e1rio atualizado +message.savecomment.failure=N\u00e3o \u00e9 poss\u00edvel salvar o coment\u00e1rio +message.confirm.delete.title=Excluir coment\u00e1rio +message.confirm.delete=Tem certeza de que deseja excluir esse coment\u00e1rio? +message.wait=Por favor, aguarde... + +label.comments=Coment\u00e1rios ({0}/{1}) +label.noComments=Sem coment\u00e1rios + +## Actions +action.edit=Editar +action.delete=Excluir + +## Comment +comment.said=dito +comment.postedOn=Postado em +comment.updated=Atualizado diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_ru.properties new file mode 100755 index 0000000000..d4ceccfcb1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_ru.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 +message.delete.success=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0443\u0434\u0430\u043b\u0435\u043d +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.loadeditform.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 +message.savecomment=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f... +message.savecomment.success=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d +message.savecomment.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.confirm.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439? +message.wait=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435... + +label.comments=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 ({0}/{1}) +label.noComments=\u041d\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 + +## Actions +action.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +action.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c + +## Comment +comment.said=\u0441\u043a\u0430\u0437\u0430\u043b +comment.postedOn=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e +comment.updated=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_zh_CN.properties new file mode 100755 index 0000000000..f20ce3635c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/comments.get_zh_CN.properties @@ -0,0 +1,23 @@ +# Messages +message.loadComments.failure=\u65e0\u6cd5\u52a0\u8f7d\u8bc4\u8bba +message.delete.success=\u8bc4\u8bba\u5df2\u5220\u9664 +message.delete.failure=\u65e0\u6cd5\u5220\u9664\u8bc4\u8bba +message.loadeditform.failure=\u65e0\u6cd5\u52a0\u8f7d\u7f16\u8f91\u8bc4\u8bba\u7a97\u4f53 +message.savecomment=\u6b63\u5728\u4fdd\u5b58\u8bc4\u8bba... +message.savecomment.success=\u8bc4\u8bba\u5df2\u66f4\u65b0 +message.savecomment.failure=\u65e0\u6cd5\u4fdd\u5b58\u8bc4\u8bba +message.confirm.delete.title=\u5220\u9664\u8bc4\u8bba +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u6b64\u8bc4\u8bba\uff1f +message.wait=\u8bf7\u7a0d\u5019... + +label.comments=\u8bc4\u8bba ({0}/{1}) +label.noComments=\u65e0\u8bc4\u8bba + +## Actions +action.edit=\u7f16\u8f91 +action.delete=\u5220\u9664 + +## Comment +comment.said=\u5df2\u8bc4\u8bba +comment.postedOn=\u53d1\u5e16\u65f6\u95f4 +comment.updated=\u5df2\u66f4\u65b0 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.desc.xml new file mode 100644 index 0000000000..16f7637328 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.desc.xml @@ -0,0 +1,5 @@ + + Create comment component + Shows a dialog to create a comment + /components/blog/createcomment + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.html.ftl new file mode 100644 index 0000000000..a5a0ed8aa1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.html.ftl @@ -0,0 +1,40 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/blog/createcomment.css" group="blog"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/blog/createcomment.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.js new file mode 100644 index 0000000000..f29d4e6cd8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.js @@ -0,0 +1,28 @@ +function main() +{ + var height = (args.editorHeight != null) ? args.editorHeight : 250, + width = (args.editorWidth != null) ? args.editorWidth : 538; + + var createComment = { + id: "CreateComment", + name : "Alfresco.CreateComment", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : template.properties.container != null ? template.properties.container : "documentLibrary", + height : height, + width : width, + editorConfig : { + height: height, + width: width, + menu: {}, + toolbar: "bold italic underline | bullist numlist | forecolor backcolor | undo redo removeformat", + language: locale, + statusbar: false + } + } + }; + model.widgets = [createComment]; + model.widgets.push(); +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.properties new file mode 100644 index 0000000000..cecd1121d0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get.properties @@ -0,0 +1,8 @@ +## template +addComment=Add Comment +postComment=Create Comment + +# messages +message.createcomment.success=Comment created +message.createcomment.failure=Unable to add comment +message.creating=Creating comment... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_de.properties new file mode 100755 index 0000000000..dc81f62115 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_de.properties @@ -0,0 +1,8 @@ +## template +addComment=Kommentar hinzuf\u00fcgen +postComment=Kommentar erstellen + +# messages +message.createcomment.success=Kommentar erstellt +message.createcomment.failure=Kommentar kann nicht hinzugef\u00fcgt werden +message.creating=Erstelle Kommentar... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_es.properties new file mode 100755 index 0000000000..6e54a815e8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_es.properties @@ -0,0 +1,8 @@ +## template +addComment=A\u00f1adir un comentario +postComment=Crear un comentario + +# messages +message.createcomment.success=Comentario creado +message.createcomment.failure=Error al a\u00f1adir el comentario +message.creating=Creando el comentario... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_fr.properties new file mode 100755 index 0000000000..eb6ad80a60 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_fr.properties @@ -0,0 +1,8 @@ +## template +addComment=Ajouter un commentaire +postComment=Publier le commentaire + +# messages +message.createcomment.success=Commentaire publi\u00e9 +message.createcomment.failure=Impossible d'ajouter le commentaire +message.creating=Publication du commentaire... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_it.properties new file mode 100755 index 0000000000..229aa6c4e3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_it.properties @@ -0,0 +1,8 @@ +## template +addComment=Aggiungi commento +postComment=Crea commento + +# messages +message.createcomment.success=Commento creato +message.createcomment.failure=Impossibile aggiungere il commento +message.creating=Creazione del commento in corso... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_ja.properties new file mode 100755 index 0000000000..4b784b6409 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_ja.properties @@ -0,0 +1,8 @@ +## template +addComment=\u30b3\u30e1\u30f3\u30c8\u306e\u8ffd\u52a0 +postComment=\u30b3\u30e1\u30f3\u30c8\u306e\u4f5c\u6210 + +# messages +message.createcomment.success=\u30b3\u30e1\u30f3\u30c8\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.createcomment.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093 +message.creating=\u30b3\u30e1\u30f3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_nb.properties new file mode 100755 index 0000000000..c3411b7b7b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_nb.properties @@ -0,0 +1,8 @@ +## template +addComment=Legg til kommentar +postComment=Opprett kommentar + +# messages +message.createcomment.success=Kommentar ble opprettet +message.createcomment.failure=Kan ikke legge til kommentar +message.creating=Oppretter kommentar... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_nl.properties new file mode 100755 index 0000000000..6b155c13bb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_nl.properties @@ -0,0 +1,8 @@ +## template +addComment=Opmerking toevoegen +postComment=Opmerking maken + +# messages +message.createcomment.success=Opmerking gemaakt +message.createcomment.failure=Kan geen opmerking toevoegen +message.creating=Opmerking maken... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_pt_BR.properties new file mode 100644 index 0000000000..0ae5bd8a9e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_pt_BR.properties @@ -0,0 +1,8 @@ +## template +addComment=Adicionar coment\u00e1rio +postComment=Criar coment\u00e1rio + +# messages +message.createcomment.success=Coment\u00e1rio criado +message.createcomment.failure=N\u00e3o \u00e9 poss\u00edvel adicionar o coment\u00e1rio +message.creating=Criando coment\u00e1rio... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_ru.properties new file mode 100755 index 0000000000..5ed0849b7c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_ru.properties @@ -0,0 +1,8 @@ +## template +addComment=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +postComment=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 + +# messages +message.createcomment.success=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d +message.createcomment.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.creating=\u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_zh_CN.properties new file mode 100755 index 0000000000..1f11e7cde3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/createcomment.get_zh_CN.properties @@ -0,0 +1,8 @@ +## template +addComment=\u6dfb\u52a0\u8bc4\u8bba +postComment=\u521b\u5efa\u8bc4\u8bba + +# messages +message.createcomment.success=\u8bc4\u8bba\u5df2\u521b\u5efa +message.createcomment.failure=\u65e0\u6cd5\u6dfb\u52a0\u8bc4\u8bba +message.creating=\u6b63\u5728\u521b\u5efa\u8bc4\u8bba... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.config.xml new file mode 100644 index 0000000000..26ad09202b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.config.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.desc.xml new file mode 100644 index 0000000000..54f37eaa67 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.desc.xml @@ -0,0 +1,5 @@ + + Blog Filter + Blog: Filter Component + /components/blog/filters + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.html.ftl new file mode 100644 index 0000000000..eea4a41c03 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.html.ftl @@ -0,0 +1,24 @@ +<@markup id="css" > + <#-- No CSS Dependencies --> + + +<@markup id="js"> + <#-- No JavaScript Dependencies --> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+

${msg("header.browseposts")}

+ +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.js new file mode 100644 index 0000000000..e96a6a1372 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.js @@ -0,0 +1,34 @@ +/** + * Main entrypoint for component webscript logic + * + * @method main + */ +function main() +{ + // Actions + var myConfig = new XML(config.script), + filters = []; + + for each(var xmlFilter in myConfig..filter) + { + filters.push( + { + id: xmlFilter.@id.toString(), + label: xmlFilter.@label.toString() + }); + } + + model.filters = filters; + + // Widget instantiation metadata... + var blogPostListFilter = { + id: "BlogPostListFilter", + name : "Alfresco.component.BaseFilter", + initArgs : [ "'Alfresco.BlogPostListFilter'", "\"" + args.htmlid + "\""], + useMessages : false, + useOptions : false + }; + model.widgets = [blogPostListFilter]; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.properties new file mode 100644 index 0000000000..eaa9ce7a56 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Posts + +## Filter Names +link.all=All +link.new=Latest +link.mydrafts=My Drafts +link.mypublished=My Published +link.publishedext=Published Externally diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_de.properties new file mode 100755 index 0000000000..990b9f593a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_de.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Posts + +## Filter Names +link.all=Alle +link.new=Neueste +link.mydrafts=Meine Entw\u00fcrfe +link.mypublished=Meine publizierten +link.publishedext=Extern publizierte diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_es.properties new file mode 100755 index 0000000000..15320a3fde --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_es.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Entradas + +## Filter Names +link.all=Todas +link.new=\u00daltimas +link.mydrafts=Mis Borradores +link.mypublished=Mis Publicaciones +link.publishedext=Publicaciones externas diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_fr.properties new file mode 100755 index 0000000000..4bc1f299d8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_fr.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Messages + +## Filter Names +link.all=Tout +link.new=Dernier +link.mydrafts=Mes brouillons +link.mypublished=Mes publications +link.publishedext=Publi\u00e9s en externe diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_it.properties new file mode 100755 index 0000000000..8099cbea1f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_it.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Post + +## Filter Names +link.all=Tutti +link.new=Pi\u00f9 recenti +link.mydrafts=Le mie bozze +link.mypublished=Pubblicati da me +link.publishedext=Pubblicati esternamente diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_ja.properties new file mode 100755 index 0000000000..e075fd994d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_ja.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=\u6295\u7a3f + +## Filter Names +link.all=\u3059\u3079\u3066 +link.new=\u6700\u8fd1\u306e\u6295\u7a3f +link.mydrafts=\u3042\u306a\u305f\u306e\u4e0b\u66f8\u304d +link.mypublished=\u3042\u306a\u305f\u306e\u516c\u958b\u6e08\u307f\u6295\u7a3f +link.publishedext=\u5916\u90e8\u516c\u958b\u6e08\u307f\u6295\u7a3f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_nb.properties new file mode 100755 index 0000000000..f2cb8b5bb5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_nb.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Innlegg + +## Filter Names +link.all=Alle +link.new=Siste +link.mydrafts=Mine kladder +link.mypublished=Mine publiserte +link.publishedext=Publisert eksternt diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_nl.properties new file mode 100755 index 0000000000..05c4e65255 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_nl.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Berichten + +## Filter Names +link.all=Alle +link.new=Laatste +link.mydrafts=Mijn concepten +link.mypublished=Mijn publicaties +link.publishedext=Extern gepubliceerd diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_pt_BR.properties new file mode 100644 index 0000000000..ec8d1fd40d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_pt_BR.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=Postagens + +## Filter Names +link.all=Tudo +link.new=Mais recentes +link.mydrafts=Meus rascunhos +link.mypublished=Meus publicados +link.publishedext=Publicados externamente diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_ru.properties new file mode 100755 index 0000000000..6c40b6faa9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_ru.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=\u0417\u0430\u043f\u0438\u0441\u0438 + +## Filter Names +link.all=\u0412\u0441\u0435 +link.new=\u041d\u0435\u0434\u0430\u0432\u043d\u0438\u0435 +link.mydrafts=\u041c\u043e\u0438 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 +link.mypublished=\u041c\u043e\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 +link.publishedext=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_zh_CN.properties new file mode 100755 index 0000000000..57eaac91f0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/filters.get_zh_CN.properties @@ -0,0 +1,9 @@ +## Title +header.browseposts=\u5e16\u5b50 + +## Filter Names +link.all=\u5168\u90e8 +link.new=\u6700\u65b0 +link.mydrafts=\u6211\u7684\u8349\u7a3f +link.mypublished=\u6211\u53d1\u5e03\u7684\u5e16\u5b50 +link.publishedext=\u5916\u90e8\u53d1\u5e03\u7684\u5e16\u5b50 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.desc.xml new file mode 100644 index 0000000000..967b77c67a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.desc.xml @@ -0,0 +1,5 @@ + + Create or edit a post + Create or edit post form + /components/blog/postedit + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.html.ftl new file mode 100644 index 0000000000..61a853ddf8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.html.ftl @@ -0,0 +1,74 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/taglibrary/taglibrary.css" group="blog"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/modules/taglibrary/taglibrary.js" group="blog"/> + <@script type="text/javascript" src="${url.context}/res/components/blog/postedit.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+ <#if page.url.args.postId??> +

${msg("editPost")}

+ <#else> +

${msg("createPost")}

+ +
+
+ + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.js new file mode 100644 index 0000000000..8ce04381a2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.js @@ -0,0 +1,20 @@ +function main() +{ + var blogPostEdit = { + id : "BlogPostEdit", + name : "Alfresco.BlogPostEdit", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : "blog", + editMode : (page.url.args.postId != null), + postId : (page.url.args.postId != null) ? page.url.args.postId : "", + editorConfig : { + height: 300, + language: locale + } + } + }; + model.widgets = [blogPostEdit]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.properties new file mode 100644 index 0000000000..8afb70de34 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get.properties @@ -0,0 +1,27 @@ +## template +createPost=Create Blog Post +editPost=Edit Blog Post + +## form +text=Text + +## form buttons +action.update=Update +action.saveAsDraft=Save as Draft +action.publish=Publish Internally +action.publishIntAndExt=Publish Internally and Externally +action.updateIntAndExt=Update Internally and Externally +action.updateIntAndPublishExt=Update Internally and Publish Externally +action.cancel=Cancel + +## JS object messages +message.noText=You must write something in the text editor area +message.loadpostdata.failure=Unable to load blog post data +message.savepost.success=Blog post saved +message.savepost.failure=Unable to save the blog post +message.postSavedNowPublish=Post saved. Synchronizing with external blog... +message.publishExternal.success=Blog post published +message.publishExternal.failure=Post saved but unable to publish to external blog +message.updateExternal.success=External blog post updated +message.updateExternal.failure=Post saved but unable to update external blog +message.submitting=Submitting... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_de.properties new file mode 100755 index 0000000000..a4470efbc3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_de.properties @@ -0,0 +1,27 @@ +## template +createPost=Blog-Post erstellen +editPost=Blog-Post bearbeiten + +## form +text=Text + +## form buttons +action.update=Aktualisieren +action.saveAsDraft=Als Entwurf speichern +action.publish=Intern publizieren +action.publishIntAndExt=Intern und extern publizieren +action.updateIntAndExt=Intern und extern aktualisieren +action.updateIntAndPublishExt=Intern aktualisieren und extern publizieren +action.cancel=Abbrechen + +## JS object messages +message.noText=Sie m\u00fcssen etwas in den Textbereich eintragen +message.loadpostdata.failure=Blog-Post-Daten k\u00f6nnen nicht geladen werden +message.savepost.success=Blog-Post gespeichert +message.savepost.failure=Blog-Post kann nicht gespeichert werden +message.postSavedNowPublish=Post gespeichert. Synchronisiere mit externem Blog... +message.publishExternal.success=Blog-Post publiziert +message.publishExternal.failure=Post gespeichert aber Publizieren auf externem Blog nicht m\u00f6glich +message.updateExternal.success=Externen Blog-Post aktualisiert +message.updateExternal.failure=Post gespeichert aber Aktualisieren des externen Blogs nicht m\u00f6glich +message.submitting=\u00dcbertrage... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_es.properties new file mode 100755 index 0000000000..73abdb0489 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_es.properties @@ -0,0 +1,27 @@ +## template +createPost=Crear una entrada en el blog +editPost=Editar una entrada en el blog + +## form +text=Texto + +## form buttons +action.update=Actualizar +action.saveAsDraft=Guardar como borrador +action.publish=Publicar internamente +action.publishIntAndExt=Publicar interna y externamente +action.updateIntAndExt=Actualizar interna y externamente +action.updateIntAndPublishExt=Actualizar internamente y publicar externamente +action.cancel=Cancelar + +## JS object messages +message.noText=Debe insertar contenido en el \u00e1rea de edici\u00f3n +message.loadpostdata.failure=Error al cargar los datos de la entrada del blog +message.savepost.success=Entrada guardada en el blog +message.savepost.failure=Error al guardar la entrada en el blog +message.postSavedNowPublish=Entrada guardada. Sincronizando con el blog externo... +message.publishExternal.success=Entrada publicada en el blog +message.publishExternal.failure=Entrada guardada pero no se pudo realizar la publicaci\u00f3n externa +message.updateExternal.success=Entrada del blog externo actualizada +message.updateExternal.failure=Entrada guardada pero no se pudo actualizar el blog externo +message.submitting=Env\u00edo en curso... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_fr.properties new file mode 100755 index 0000000000..b18aff1978 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_fr.properties @@ -0,0 +1,27 @@ +## template +createPost=Cr\u00e9er un article sur le blog +editPost=Modifier un article sur le blog + +## form +text=Texte + +## form buttons +action.update=Mettre \u00e0 jour +action.saveAsDraft=Enregistrer en tant que brouillon +action.publish=Publier en interne +action.publishIntAndExt=Publier en interne et en externe +action.updateIntAndExt=Mettre \u00e0 jour en interne et en externe +action.updateIntAndPublishExt=Mettre \u00e0 jour en interne et publier en externe +action.cancel=Annuler + +## JS object messages +message.noText=Vous devez \u00e9crire quelque chose dans la zone d'\u00e9dition de texte +message.loadpostdata.failure=Echec du chargement des donn\u00e9es de l'article du blog +message.savepost.success=Article du blog enregistr\u00e9 +message.savepost.failure=Echec de l'enregistrement de l'article sur le blog +message.postSavedNowPublish=Article enregistr\u00e9. Synchronisation avec le blog externe... +message.publishExternal.success=Article publi\u00e9 sur le blog +message.publishExternal.failure=Article enregistr\u00e9 mais publication sur le blog externe impossible +message.updateExternal.success=Article de blog externe mis \u00e0 jour avec succ\u00e8s +message.updateExternal.failure=Article enregistr\u00e9 mais mise \u00e0 jour du blog externe impossible +message.submitting=Envoi en cours... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_it.properties new file mode 100755 index 0000000000..f86d5c286c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_it.properties @@ -0,0 +1,27 @@ +## template +createPost=Crea post del blog +editPost=Modifica post del blog + +## form +text=Testo + +## form buttons +action.update=Aggiorna +action.saveAsDraft=Salva come bozza +action.publish=Pubblica internamente +action.publishIntAndExt=Pubblica internamente ed esternamente +action.updateIntAndExt=Aggiorna internamente ed esternamente +action.updateIntAndPublishExt=Aggiorna internamente e pubblica esternamente +action.cancel=Annulla + +## JS object messages +message.noText=\u00c8 necessario scrivere qualcosa nell'area dell'editor di testo +message.loadpostdata.failure=Impossibile caricare i dati del post del blog +message.savepost.success=Post del blog salvato +message.savepost.failure=Impossibile salvare il post del blog +message.postSavedNowPublish=Post salvato. Sincronizzazione con il blog esterno in corso... +message.publishExternal.success=Post del blog pubblicato +message.publishExternal.failure=Post salvato, ma non \u00e8 possibile pubblicarlo nel blog esterno +message.updateExternal.success=Post del blog esterno aggiornato +message.updateExternal.failure=Post salvato, ma non \u00e8 possibile aggiornare il blog esterno +message.submitting=Invio in corso... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_ja.properties new file mode 100755 index 0000000000..5b1f1e038d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_ja.properties @@ -0,0 +1,27 @@ +## template +createPost=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u4f5c\u6210 +editPost=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u7de8\u96c6 + +## form +text=\u30c6\u30ad\u30b9\u30c8 + +## form buttons +action.update=\u66f4\u65b0 +action.saveAsDraft=\u4e0b\u66f8\u304d\u3068\u3057\u3066\u4fdd\u5b58 +action.publish=\u5185\u90e8\u306b\u516c\u958b +action.publishIntAndExt=\u5185\u5916\u306b\u516c\u958b +action.updateIntAndExt=\u5185\u5916\u3067\u66f4\u65b0 +action.updateIntAndPublishExt=\u5185\u90e8\u3067\u66f4\u65b0\u3057\u3066\u5916\u90e8\u306b\u516c\u958b +action.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb + +## JS object messages +message.noText=\u30c6\u30ad\u30b9\u30c8\u30a8\u30c7\u30a3\u30bf\u306e\u9818\u57df\u306b\u4f55\u304b\u66f8\u304d\u8fbc\u3093\u3067\u304f\u3060\u3055\u3044 +message.loadpostdata.failure=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093 +message.savepost.success=\u30d6\u30ed\u30b0\u6295\u7a3f\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f +message.savepost.failure=\u30d6\u30ed\u30b0\u6295\u7a3f\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093 +message.postSavedNowPublish=\u6295\u7a3f\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002 \u5916\u90e8\u306e\u30d6\u30ed\u30b0\u3068\u540c\u671f\u3057\u3066\u3044\u307e\u3059... +message.publishExternal.success=\u30d6\u30ed\u30b0\u6295\u7a3f\u304c\u516c\u958b\u3055\u308c\u307e\u3057\u305f +message.publishExternal.failure=\u6295\u7a3f\u306f\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u304c\u3001\u5916\u90e8\u306e\u30d6\u30ed\u30b0\u306b\u516c\u958b\u3067\u304d\u307e\u305b\u3093 +message.updateExternal.success=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.updateExternal.failure=\u6295\u7a3f\u306f\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u304c\u3001\u5916\u90e8\u30d6\u30ed\u30b0\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093 +message.submitting=\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_nb.properties new file mode 100755 index 0000000000..07b706fb0d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_nb.properties @@ -0,0 +1,27 @@ +## template +createPost=Opprett blogginnlegg +editPost=Rediger blogginnlegg + +## form +text=Tekst + +## form buttons +action.update=Oppdater +action.saveAsDraft=Lagre som utkast +action.publish=Publiser internt +action.publishIntAndExt=Publiser internt og eksternt +action.updateIntAndExt=Oppdater internt og eksternt +action.updateIntAndPublishExt=Oppdater internt og publiser eksternt +action.cancel=Avbryt + +## JS object messages +message.noText=Du m\u00e5 skrive noe i tekstredigeringsomr\u00e5det +message.loadpostdata.failure=Kan ikke laste blogginnleggsdata +message.savepost.success=Blogginnlegg er lagret +message.savepost.failure=Kan ikke lagre blogginnlegget +message.postSavedNowPublish=Innlegget er lagret. Synkroniserer med ekstern blogg... +message.publishExternal.success=Blogginnlegg er publisert +message.publishExternal.failure=Innlegg er lagret, men kan ikke publisere til ekstern blogg +message.updateExternal.success=Eksternt blogginnlegg er oppdatert +message.updateExternal.failure=Innlegg er lagret, men kan ikke oppdatere ekstern blogg +message.submitting=Sender... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_nl.properties new file mode 100755 index 0000000000..db00fd637d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_nl.properties @@ -0,0 +1,27 @@ +## template +createPost=Blogbericht maken +editPost=Blogbericht bewerken + +## form +text=Tekst + +## form buttons +action.update=Bijwerken +action.saveAsDraft=Opslaan als concept +action.publish=Intern publiceren +action.publishIntAndExt=Intern en extern publiceren +action.updateIntAndExt=Intern en extern bijwerken +action.updateIntAndPublishExt=Intern bijwerken en extern publiceren +action.cancel=Annuleren + +## JS object messages +message.noText=U moet iets schrijven in het teksteditorgedeelte +message.loadpostdata.failure=Kan blogberichtgegevens niet laden +message.savepost.success=Blogbericht opgeslagen +message.savepost.failure=Kan het blogbericht niet opslaan +message.postSavedNowPublish=Bericht opgeslagen. Synchroniseren met externe blog... +message.publishExternal.success=Blogbericht gepubliceerd +message.publishExternal.failure=Bericht opgeslagen maar kan niet publiceren naar externe blog +message.updateExternal.success=Extern blogbericht bijgewerkt +message.updateExternal.failure=Bericht opgeslagen maar kan externe blog niet bijwerken +message.submitting=Verzenden... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_pt_BR.properties new file mode 100644 index 0000000000..a06e7633f3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_pt_BR.properties @@ -0,0 +1,27 @@ +## template +createPost=Criar postagem de blog +editPost=Editar postagem de blog + +## form +text=Texto + +## form buttons +action.update=Atualizar +action.saveAsDraft=Salvar como rascunho +action.publish=Publicar internamente +action.publishIntAndExt=Publicar interna e externamente +action.updateIntAndExt=Atualizar interna e externamente +action.updateIntAndPublishExt=Atualizar internamente e publicar externamente +action.cancel=Cancelar + +## JS object messages +message.noText=Voc\u00ea deve escrever algo na \u00e1rea do editor de texto +message.loadpostdata.failure=N\u00e3o \u00e9 poss\u00edvel carregar os dados de postagem do blog +message.savepost.success=Postagem de blog salva +message.savepost.failure=N\u00e3o \u00e9 poss\u00edvel salvar a postagem de blog +message.postSavedNowPublish=Postagem salva. Sincronizando com o blog externo... +message.publishExternal.success=Postagem do blog publicada +message.publishExternal.failure=Postagem salva, mas n\u00e3o foi poss\u00edvel public\u00e1-la no blog externo +message.updateExternal.success=Postagem do blog externo atualizada +message.updateExternal.failure=Postagem salva, mas n\u00e3o foi poss\u00edvel atualizar o blog externo +message.submitting=Enviando... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_ru.properties new file mode 100755 index 0000000000..b3fbed2d5b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_ru.properties @@ -0,0 +1,27 @@ +## template +createPost=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 +editPost=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 + +## form +text=\u0422\u0435\u043a\u0441\u0442 + +## form buttons +action.update=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c +action.saveAsDraft=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a +action.publish=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +action.publishIntAndExt=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0430\u0445 +action.updateIntAndExt=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0430\u0445 +action.updateIntAndPublishExt=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c +action.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 + +## JS object messages +message.noText=\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 +message.loadpostdata.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043b\u043e\u0433\u0430 +message.savepost.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 +message.savepost.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +message.postSavedNowPublish=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0431\u043b\u043e\u0433\u043e\u043c... +message.publishExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 +message.publishExternal.failure=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430, \u043d\u043e \u0435\u0435 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +message.updateExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 +message.updateExternal.failure=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430, \u043d\u043e \u0435\u0435 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +message.submitting=\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_zh_CN.properties new file mode 100755 index 0000000000..8f8d283753 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postedit.get_zh_CN.properties @@ -0,0 +1,27 @@ +## template +createPost=\u521b\u5efa\u535a\u5ba2\u5e16\u5b50 +editPost=\u7f16\u8f91\u535a\u5ba2\u5e16\u5b50 + +## form +text=\u6587\u672c + +## form buttons +action.update=\u66f4\u65b0 +action.saveAsDraft=\u4fdd\u5b58\u4e3a\u8349\u7a3f +action.publish=\u5185\u90e8\u53d1\u5e03 +action.publishIntAndExt=\u540c\u65f6\u5728\u5185\u90e8\u548c\u5916\u90e8\u53d1\u5e03 +action.updateIntAndExt=\u540c\u65f6\u5728\u5185\u90e8\u548c\u5916\u90e8\u66f4\u65b0 +action.updateIntAndPublishExt=\u5185\u90e8\u66f4\u65b0\uff0c\u5916\u90e8\u53d1\u5e03 +action.cancel=\u53d6\u6d88 + +## JS object messages +message.noText=\u5fc5\u987b\u5728\u6587\u672c\u7f16\u8f91\u5668\u533a\u57df\u5199\u5165\u4e00\u4e9b\u5185\u5bb9 +message.loadpostdata.failure=\u65e0\u6cd5\u52a0\u8f7d\u535a\u5ba2\u5e16\u5b50\u6570\u636e +message.savepost.success=\u535a\u5ba2\u5e16\u5b50\u5df2\u4fdd\u5b58 +message.savepost.failure=\u65e0\u6cd5\u4fdd\u5b58\u535a\u5ba2\u5e16\u5b50 +message.postSavedNowPublish=\u5e16\u5b50\u5df2\u4fdd\u5b58\u3002 \u6b63\u5728\u4e0e\u5916\u90e8\u535a\u5ba2\u540c\u6b65... +message.publishExternal.success=\u535a\u5ba2\u5e16\u5b50\u5df2\u53d1\u5e03 +message.publishExternal.failure=\u5e16\u5b50\u5df2\u4fdd\u5b58\uff0c\u4f46\u662f\u65e0\u6cd5\u53d1\u5e03\u5230\u5916\u90e8\u535a\u5ba2 +message.updateExternal.success=\u5916\u90e8\u535a\u5ba2\u5e16\u5b50\u5df2\u66f4\u65b0 +message.updateExternal.failure=\u5e16\u5b50\u5df2\u4fdd\u5b58\uff0c\u4f46\u662f\u65e0\u6cd5\u66f4\u65b0\u5916\u90e8\u535a\u5ba2 +message.submitting=\u6b63\u5728\u63d0\u4ea4... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.desc.xml new file mode 100644 index 0000000000..04c2ecd87b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.desc.xml @@ -0,0 +1,5 @@ + + Blog PostList + Blog: List of Posts component + /components/blog/postlist?filter={filter} + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.html.ftl new file mode 100644 index 0000000000..ee6723fe02 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.html.ftl @@ -0,0 +1,32 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/blog/postlist.css" group="blog"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/blog/postlist.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+
+
+ ${msg("title.postlist")} +
+
+
+
 
+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.js new file mode 100644 index 0000000000..bd277fe6d2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.js @@ -0,0 +1,32 @@ +function main() +{ + // Set the initialFilter defaults if not supplied. + var initialFilter = { + filterId : (page.url.args.filterId != null) ? page.url.args.filterId : "new", + filterOwner : (page.url.args.filterOwner != null) ? page.url.args.filterOwner : "Alfresco.BlogPostListFilter", + filterData : page.url.args.filterData + }; + + // Allow a tag specific URL shortcut, as per MNT-12058 + if (page.url.args.tag) + { + initialFilter = { + filterId: "tag", + filterOwner: "Alfresco.TagFilter", + filterData: page.url.args.tag + } + } + + var blogPostList = { + id : "BlogPostList", + name : "Alfresco.BlogPostList", + options : { + siteId :(page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : (template.properties.container != null) ? template.properties.container : "blog", + initialFilter : initialFilter + } + }; + model.widgets = [blogPostList]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.properties new file mode 100644 index 0000000000..9e4888ea6a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Draft +status.updated=Updated +status.published.outofsync=Out of sync +status.published=Published + +## post actions +action.edit=Edit +action.delete=Delete +action.updateexternal=Update Externally +action.unpublishexternal=Remove Externally +action.publishexternal=Publish Externally + +## Header +header.createPost=Create Post +header.rssFeed=RSS Feed +header.configureBlog=Configure External Blog +header.detailList=Detailed View +header.simpleList=Simple View + +## Postlist title +title.newposts=New Posts +title.mydrafts=My Draft Posts +title.mypublished=My Published Posts +title.publishedext=Externally Published Posts +title.bytag=Posts with Tag {0} +title.bymonth=Posts for Month {0} +title.allposts=All Posts +title.postlist=Blog Post List + +# blog post content +post.publishedOn=Published on +post.author=Author +post.externalLink=External Post +post.clickHere=Click here +post.read=Read +post.replies=Replies +post.noTags=(None) + +# JS strings +message.loading=Loading data... +message.wait=Please wait... +message.empty=No blog posts found +message.error=Error while loading the blog post list data +message.confirm.delete.title=Delete Blog Post +message.confirm.delete=Do you really want to delete blog post ''{0}''? +message.delete.success=Post deleted +message.delete.failure=Unable to delete post +message.publishExternal.success=Blog post published +message.publishExternal.failure=Unable to publish to external blog +message.updateExternal.success=External blog post updated +message.updateExternal.failure=Unable to update external post +message.unpublishExternal.success=External blog post removed +message.unpublishExternal.failure=Unable to remove external post diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_de.properties new file mode 100755 index 0000000000..b14a86b278 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_de.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Entwurf +status.updated=Aktualisiert +status.published.outofsync=Nicht synchronisiert +status.published=Publiziert + +## post actions +action.edit=Bearbeiten +action.delete=L\u00f6schen +action.updateexternal=Extern aktualisieren +action.unpublishexternal=Extern entfernen +action.publishexternal=Extern publizieren + +## Header +header.createPost=Post erstellen +header.rssFeed=RSS-Feed +header.configureBlog=Externen Blog konfigurieren +header.detailList=Detaillierte Ansicht +header.simpleList=Einfache Ansicht + +## Postlist title +title.newposts=Neue Posts +title.mydrafts=Meine Post-Entw\u00fcrfe +title.mypublished=Meine publizierten Posts +title.publishedext=Extern publizierte Posts +title.bytag=Posts mit Tag {0} +title.bymonth=Posts des Monats {0} +title.allposts=Alle Posts +title.postlist=Blog-Post-Liste + +# blog post content +post.publishedOn=Publiziert am +post.author=Autor +post.externalLink=Externer Post +post.clickHere=Hier klicken +post.read=Lesen +post.replies=Antworten +post.noTags=(Kein) + +# JS strings +message.loading=Lade Daten... +message.wait=Bitte warten... +message.empty=Keine Blog-Posts gefunden +message.error=Fehler beim Laden der Blog-Post-Listendaten +message.confirm.delete.title=Blog-Post l\u00f6schen +message.confirm.delete=M\u00f6chten Sie den Blog-Post ''{0}'' wirklich l\u00f6schen? +message.delete.success=Post gel\u00f6scht +message.delete.failure=Post kann nicht gel\u00f6scht werden +message.publishExternal.success=Blog-Post publiziert +message.publishExternal.failure=Publizieren auf externem Blog nicht m\u00f6glich +message.updateExternal.success=Externen Blog-Post aktualisiert +message.updateExternal.failure=Aktualisieren des externen Post nicht m\u00f6glich +message.unpublishExternal.success=Externen Blog-Post entfernt +message.unpublishExternal.failure=Entfernen des externen Post nicht m\u00f6glich diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_es.properties new file mode 100755 index 0000000000..0f9fa346f0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_es.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Borrador +status.updated=Actualizado +status.published.outofsync=Sin sincronizar +status.published=Publicado + +## post actions +action.edit=Editar +action.delete=Eliminar +action.updateexternal=Actualizar externamente +action.unpublishexternal=Quitar externamente +action.publishexternal=Publicar externamente + +## Header +header.createPost=Crear una entrada +header.rssFeed=Canal RSS +header.configureBlog=Configurar un blog externo +header.detailList=Vista detallada +header.simpleList=Vista sencilla + +## Postlist title +title.newposts=Nuevas entradas +title.mydrafts=Mis borradores de entrada +title.mypublished=Mis entradas publicadas +title.publishedext=Entradas publicadas externamente +title.bytag=Entradas con la etiqueta {0} +title.bymonth=Entradas del mes de {0} +title.allposts=Todas las entradas +title.postlist=Lista de entradas en el blog + +# blog post content +post.publishedOn=Publicada el +post.author=Autor +post.externalLink=Entrada externa +post.clickHere=Pulse aqu\u00ed +post.read=Leer +post.replies=Respuestas +post.noTags=(Ninguna) + +# JS strings +message.loading=Cargando datos... +message.wait=Espere por favor... +message.empty=No hay entradas en el blog +message.error=Error al cargar los datos de la lista de entradas del blog +message.confirm.delete.title=Eliminar entrada del blog +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar la entrada ''{0}'' del blog? +message.delete.success=Entrada eliminada +message.delete.failure=Error al eliminar la entrada +message.publishExternal.success=Entrada publicada en el blog +message.publishExternal.failure=Error al publicar en el blog externo +message.updateExternal.success=Entrada del blog externo actualizada +message.updateExternal.failure=Error al actualizar la entrada en el blog externo +message.unpublishExternal.success=Entrada eliminada en el blog externo +message.unpublishExternal.failure=No se pudo quitar la entrada del blog externo diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_fr.properties new file mode 100755 index 0000000000..0c3a2dbd8c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_fr.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Brouillon +status.updated=Mis \u00e0 jour +status.published.outofsync=D\u00e9synchronis\u00e9 +status.published=Publi\u00e9 + +## post actions +action.edit=Modifier +action.delete=Supprimer +action.updateexternal=Mettre \u00e0 jour en externe +action.unpublishexternal=Supprimer en externe +action.publishexternal=Publier en externe + +## Header +header.createPost=Cr\u00e9er un article +header.rssFeed=Flux RSS +header.configureBlog=Configurer un blog externe +header.detailList=Vue d\u00e9taill\u00e9e +header.simpleList=Vue simplifi\u00e9e + +## Postlist title +title.newposts=Nouveaux articles +title.mydrafts=Mes brouillons +title.mypublished=Mes articles publi\u00e9s +title.publishedext=Articles publi\u00e9s en externe +title.bytag=Articles avec le tag {0} +title.bymonth=Articles du mois de {0} +title.allposts=Tous les articles +title.postlist=Liste des articles + +# blog post content +post.publishedOn=Publi\u00e9 le +post.author=Auteur +post.externalLink=Article externe +post.clickHere=Cliquer ici +post.read=Lire +post.replies=R\u00e9ponses +post.noTags=(Aucun) + +# JS strings +message.loading=Chargement des donn\u00e9es... +message.wait=Veuillez patienter... +message.empty=Pas d'article trouv\u00e9 sur le blog +message.error=Erreur lors du chargement des donn\u00e9es des articles du blog +message.confirm.delete.title=Supprimer l'article de blog +message.confirm.delete=\u00cates-vous s\u00fbr de vouloir supprimer l''article ''{0}'' ? +message.delete.success=Article supprim\u00e9 +message.delete.failure=Echec de la suppression de l'article +message.publishExternal.success=Article publi\u00e9 sur le blog +message.publishExternal.failure=Echec de la publication sur le blog externe +message.updateExternal.success=Article de blog externe mis \u00e0 jour avec succ\u00e8s +message.updateExternal.failure=Echec de la mise \u00e0 jour de l'article du blog externe +message.unpublishExternal.success=Article externe supprim\u00e9 +message.unpublishExternal.failure=Echec de la suppression de l'article externe diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_it.properties new file mode 100755 index 0000000000..c133c5e880 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_it.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Bozza +status.updated=Aggiornato +status.published.outofsync=Non sincronizzato +status.published=Pubblicato + +## post actions +action.edit=Modifica +action.delete=Elimina +action.updateexternal=Aggiorna esternamente +action.unpublishexternal=Rimuovi esternamente +action.publishexternal=Pubblica esternamente + +## Header +header.createPost=Crea post +header.rssFeed=Feed RSS +header.configureBlog=Configura blog esterno +header.detailList=Vista dettagliata +header.simpleList=Vista semplice + +## Postlist title +title.newposts=Nuovi post +title.mydrafts=Le mie bozze dei post +title.mypublished=I miei post pubblicati +title.publishedext=Post pubblicati esternamente +title.bytag=Post con il tag {0} +title.bymonth=Post per il mese {0} +title.allposts=Tutti i post +title.postlist=Elenco post del blog + +# blog post content +post.publishedOn=Pubblicato il +post.author=Autore +post.externalLink=Post esterno +post.clickHere=Fare clic qui +post.read=Letti +post.replies=Risposte +post.noTags=(Nessuno) + +# JS strings +message.loading=Caricamento dei dati in corso... +message.wait=Attendere... +message.empty=Nessun post del blog trovato +message.error=Errore durante il caricamento dei dati dell'elenco dei post del blog +message.confirm.delete.title=Elimina post del blog +message.confirm.delete=Eliminare il post del blog ''{0}''? +message.delete.success=Post eliminato +message.delete.failure=Impossibile eliminare il post +message.publishExternal.success=Post del blog pubblicato +message.publishExternal.failure=Impossibile pubblicare nel blog esterno +message.updateExternal.success=Post del blog esterno aggiornato +message.updateExternal.failure=Impossibile aggiornare il post esterno +message.unpublishExternal.success=Post del blog esterno rimosso +message.unpublishExternal.failure=Impossibile rimuovere il post esterno diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_ja.properties new file mode 100755 index 0000000000..4a100969cc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_ja.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=\u4e0b\u66f8\u304d +status.updated=\u66f4\u65b0\u6e08\u307f +status.published.outofsync=\u540c\u671f\u306a\u3057 +status.published=\u516c\u958b\u6e08\u307f + +## post actions +action.edit=\u7de8\u96c6 +action.delete=\u524a\u9664 +action.updateexternal=\u5916\u90e8\u5411\u3051\u3092\u66f4\u65b0 +action.unpublishexternal=\u5916\u90e8\u5411\u3051\u3092\u524a\u9664 +action.publishexternal=\u5916\u90e8\u306b\u516c\u958b + +## Header +header.createPost=\u6295\u7a3f\u306e\u4f5c\u6210 +header.rssFeed=RSS \u30d5\u30a3\u30fc\u30c9 +header.configureBlog=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u8a2d\u5b9a +header.detailList=\u8a73\u7d30\u8868\u793a +header.simpleList=\u30b7\u30f3\u30d7\u30eb\u8868\u793a + +## Postlist title +title.newposts=\u65b0\u3057\u3044\u6295\u7a3f +title.mydrafts=\u3042\u306a\u305f\u306e\u4e0b\u66f8\u304d\u6295\u7a3f +title.mypublished=\u3042\u306a\u305f\u306e\u516c\u958b\u6e08\u307f\u6295\u7a3f +title.publishedext=\u5916\u90e8\u306b\u516c\u958b\u3057\u305f\u6295\u7a3f +title.bytag=\u30bf\u30b0 "{0}" \u306e\u4ed8\u3044\u305f\u6295\u7a3f +title.bymonth={0} \u6708\u306e\u6295\u7a3f +title.allposts=\u3059\u3079\u3066\u306e\u6295\u7a3f +title.postlist=\u30d6\u30ed\u30b0\u6295\u7a3f\u30ea\u30b9\u30c8 + +# blog post content +post.publishedOn=\u516c\u958b\u65e5\u6642 +post.author=\u4f5c\u6210\u8005 +post.externalLink=\u5916\u90e8\u5411\u3051\u6295\u7a3f +post.clickHere=\u3053\u3053\u3092\u30af\u30ea\u30c3\u30af +post.read=\u8aad\u3080 +post.replies=\u8fd4\u4fe1 +post.noTags=(\u306a\u3057) + +# JS strings +message.loading=\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +message.wait=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044... +message.empty=\u30d6\u30ed\u30b0\u6295\u7a3f\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 +message.error=\u30d6\u30ed\u30b0\u6295\u7a3f\u30ea\u30b9\u30c8\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +message.confirm.delete.title=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u524a\u9664 +message.confirm.delete=\u30d6\u30ed\u30b0\u6295\u7a3f ''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.delete.success=\u6295\u7a3f\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=\u6295\u7a3f\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +message.publishExternal.success=\u30d6\u30ed\u30b0\u6295\u7a3f\u304c\u516c\u958b\u3055\u308c\u307e\u3057\u305f +message.publishExternal.failure=\u5916\u90e8\u30d6\u30ed\u30b0\u306b\u516c\u958b\u3067\u304d\u307e\u305b\u3093 +message.updateExternal.success=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.updateExternal.failure=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093 +message.unpublishExternal.success=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.unpublishExternal.failure=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_nb.properties new file mode 100755 index 0000000000..de28fb27b9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_nb.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Utkast +status.updated=Oppdatert +status.published.outofsync=Usynkronisert +status.published=Publisert + +## post actions +action.edit=Rediger +action.delete=Slett +action.updateexternal=Oppdater eksternt +action.unpublishexternal=Fjern eksternt +action.publishexternal=Publiser eksternt + +## Header +header.createPost=Opprett innlegg +header.rssFeed=RSS-feed +header.configureBlog=Konfigurer ekstern blogg +header.detailList=Detaljert visning +header.simpleList=Enkel visning + +## Postlist title +title.newposts=Nye innlegg +title.mydrafts=Mine innleggsutkast +title.mypublished=Mine publiserte innlegg +title.publishedext=Eksternt publiserte innlegg +title.bytag=Innlegg med taggen {0} +title.bymonth=Innlegg i m\u00e5neden {0} +title.allposts=Alle innlegg +title.postlist=Liste over blogginnlegg + +# blog post content +post.publishedOn=Publisert den +post.author=Forfatter +post.externalLink=Eksternt innlegg +post.clickHere=Klikk her +post.read=Les +post.replies=Svar +post.noTags=(Ingen) + +# JS strings +message.loading=Laster data... +message.wait=Vent litt... +message.empty=Finner ingen blogginnlegg +message.error=Det oppstod en feil lasting av listedata for blogginnlegg +message.confirm.delete.title=Slett blogginnlegg +message.confirm.delete=Er du sikker p\u00e5 at du vil slette blogginnlegg ''{0}''? +message.delete.success=Blogginnlegg er slettet +message.delete.failure=Kan ikke slette innlegg +message.publishExternal.success=Blogginnlegg er publisert +message.publishExternal.failure=Kan ikke publisere til ekstern blogg +message.updateExternal.success=Eksternt blogginnlegg er oppdatert +message.updateExternal.failure=Kan ikke oppdatere eksternt innlegg +message.unpublishExternal.success=Eksternt blogginnlegg er fjernet +message.unpublishExternal.failure=Kan ikke fjerne eksternt innlegg diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_nl.properties new file mode 100755 index 0000000000..df48ef496d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_nl.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Concept +status.updated=Bijgewerkt +status.published.outofsync=Niet gesynchroniseerd +status.published=Gepubliceerd + +## post actions +action.edit=Bewerken +action.delete=Verwijderen +action.updateexternal=Extern bijwerken +action.unpublishexternal=Extern verwijderen +action.publishexternal=Extern publiceren + +## Header +header.createPost=Bericht maken +header.rssFeed=RSS-feed +header.configureBlog=Externe blog configureren +header.detailList=Gedetailleerde weergave +header.simpleList=Eenvoudige weergave + +## Postlist title +title.newposts=Nieuwe berichten +title.mydrafts=Mijn conceptberichten +title.mypublished=Mijn gepubliceerde berichten +title.publishedext=Extern gepubliceerde berichten +title.bytag=Berichten met tag {0} +title.bymonth=Berichten voor maand {0} +title.allposts=Alle berichten +title.postlist=Lijst met blogberichten + +# blog post content +post.publishedOn=Gepubliceerd op +post.author=Auteur +post.externalLink=Extern bericht +post.clickHere=Klik hier +post.read=Lezen +post.replies=Antwoorden +post.noTags=(Geen) + +# JS strings +message.loading=Gegevens laden... +message.wait=Een ogenblik geduld... +message.empty=Kan geen blogberichten vinden +message.error=Fout bij laden van gegevens van lijst met blogberichten +message.confirm.delete.title=Blogbericht verwijderen +message.confirm.delete=Weet u zeker dat u blogbericht ''{0}'' wilt verwijderen? +message.delete.success=Bericht verwijderd +message.delete.failure=Kan bericht niet verwijderen +message.publishExternal.success=Blogbericht gepubliceerd +message.publishExternal.failure=Kan niet publiceren naar externe blog +message.updateExternal.success=Extern blogbericht bijgewerkt +message.updateExternal.failure=Kan extern bericht niet bijwerken +message.unpublishExternal.success=Extern blogbericht verwijderd +message.unpublishExternal.failure=Kan extern bericht niet verwijderen diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_pt_BR.properties new file mode 100644 index 0000000000..77789e226d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_pt_BR.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=Rascunho +status.updated=Atualizado +status.published.outofsync=Fora de sincronia +status.published=Publicado + +## post actions +action.edit=Editar +action.delete=Excluir +action.updateexternal=Atualizar externamente +action.unpublishexternal=Remover externamente +action.publishexternal=Publicar externamente + +## Header +header.createPost=Criar postagem +header.rssFeed=Feed RSS +header.configureBlog=Configurar blog externo +header.detailList=Modo de exibi\u00e7\u00e3o detalhada +header.simpleList=Modo de exibi\u00e7\u00e3o simples + +## Postlist title +title.newposts=Novas postagens +title.mydrafts=Minhas postagens de rascunho +title.mypublished=Minhas postagens publicadas +title.publishedext=Postagens publicadas externamente +title.bytag=Postagens com marca {0} +title.bymonth=Postagens do m\u00eas {0} +title.allposts=Todas as postagens +title.postlist=Lista de postagens do blog + +# blog post content +post.publishedOn=Publicado em +post.author=Autor +post.externalLink=Postagem externa +post.clickHere=Clique aqui +post.read=Ler +post.replies=Respostas +post.noTags=(Nenhum) + +# JS strings +message.loading=Carregando dados... +message.wait=Por favor, aguarde... +message.empty=Nenhuma postagem do blog encontrada +message.error=Erro ao carregar os dados da lista de postagens de blog +message.confirm.delete.title=Excluir postagem do blog +message.confirm.delete=Deseja realmente excluir a postagem de blog ''{0}''? +message.delete.success=Postagem exclu\u00edda +message.delete.failure=N\u00e3o \u00e9 poss\u00edvel excluir a postagem +message.publishExternal.success=Postagem do blog publicada +message.publishExternal.failure=N\u00e3o \u00e9 poss\u00edvel publicar no blog externo +message.updateExternal.success=Postagem do blog externo atualizada +message.updateExternal.failure=N\u00e3o \u00e9 poss\u00edvel atualizar a postagem externa +message.unpublishExternal.success=Postagem do blog externo removida +message.unpublishExternal.failure=N\u00e3o \u00e9 poss\u00edvel remover a postagem externa diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_ru.properties new file mode 100755 index 0000000000..369f3a342c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_ru.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=\u0427\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 +status.updated=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 +status.published.outofsync=\u041d\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +status.published=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e + +## post actions +action.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +action.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +action.updateexternal=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +action.unpublishexternal=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +action.publishexternal=\u041f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 + +## Header +header.createPost=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +header.rssFeed=RSS-\u043a\u0430\u043d\u0430\u043b +header.configureBlog=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +header.detailList=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e +header.simpleList=\u041a\u0440\u0430\u0442\u043a\u043e + +## Postlist title +title.newposts=\u041d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +title.mydrafts=\u041c\u043e\u0438 \u0447\u0435\u0440\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +title.mypublished=\u041c\u043e\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +title.publishedext=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +title.bytag=\u0417\u0430\u043f\u0438\u0441\u0438 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 {0} +title.bymonth=\u0417\u0430\u043f\u0438\u0441\u0438 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446 {0} +title.allposts=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +title.postlist=\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u043b\u043e\u0433\u0430 + +# blog post content +post.publishedOn=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e +post.author=\u0410\u0432\u0442\u043e\u0440 +post.externalLink=\u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0437\u0430\u043f\u0438\u0441\u044c +post.clickHere=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c +post.read=\u0427\u0442\u0435\u043d\u0438\u0435 +post.replies=\u041e\u0442\u0432\u0435\u0442\u044b +post.noTags=(\u041d\u0435\u0442) + +# JS strings +message.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445... +message.wait=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435... +message.empty=\u0412 \u0431\u043b\u043e\u0433\u0435 \u043d\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +message.error=\u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u043b\u043e\u0433\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 +message.confirm.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 ''{0}''? +message.delete.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +message.publishExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 +message.publishExternal.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +message.updateExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 +message.updateExternal.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +message.unpublishExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.unpublishExternal.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_zh_CN.properties new file mode 100755 index 0000000000..d29b8545e2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postlist.get_zh_CN.properties @@ -0,0 +1,54 @@ +## post status values +status.draft=\u8349\u7a3f +status.updated=\u5df2\u66f4\u65b0 +status.published.outofsync=\u4e0d\u540c\u6b65 +status.published=\u5df2\u53d1\u5e03 + +## post actions +action.edit=\u7f16\u8f91 +action.delete=\u5220\u9664 +action.updateexternal=\u5916\u90e8\u66f4\u65b0 +action.unpublishexternal=\u5916\u90e8\u79fb\u9664 +action.publishexternal=\u5916\u90e8\u53d1\u5e03 + +## Header +header.createPost=\u521b\u5efa\u5e16\u5b50 +header.rssFeed=RSS \u8ba2\u9605\u6e90 +header.configureBlog=\u914d\u7f6e\u5916\u90e8\u535a\u5ba2 +header.detailList=\u8be6\u7ec6\u89c6\u56fe +header.simpleList=\u7b80\u5355\u89c6\u56fe + +## Postlist title +title.newposts=\u53d1\u65b0\u8d34 +title.mydrafts=\u6211\u7684\u5e16\u5b50\u8349\u7a3f +title.mypublished=\u6211\u7684\u5df2\u53d1\u5e03\u5e16\u5b50 +title.publishedext=\u5916\u90e8\u53d1\u5e03\u7684\u5e16\u5b50 +title.bytag=\u6807\u8bb0\u4e3a {0} \u7684\u5e16\u5b50 +title.bymonth={0} \u6708\u7684\u5e16\u5b50 +title.allposts=\u6240\u6709\u5e16\u5b50 +title.postlist=\u535a\u5ba2\u5e16\u5b50\u5217\u8868 + +# blog post content +post.publishedOn=\u53d1\u5e03\u65f6\u95f4 +post.author=\u4f5c\u8005 +post.externalLink=\u5916\u90e8\u5e16\u5b50 +post.clickHere=\u5355\u51fb\u6b64\u5904 +post.read=\u8bfb +post.replies=\u56de\u590d +post.noTags=\uff08\u65e0\uff09 + +# JS strings +message.loading=\u6570\u636e\u52a0\u8f7d\u4e2d... +message.wait=\u8bf7\u7a0d\u5019... +message.empty=\u672a\u627e\u5230\u535a\u5ba2\u5e16\u5b50 +message.error=\u52a0\u8f7d\u535a\u5ba2\u5e16\u5b50\u5217\u8868\u6570\u636e\u65f6\u51fa\u9519 +message.confirm.delete.title=\u5220\u9664\u535a\u5ba2\u5e16\u5b50 +message.confirm.delete=\u662f\u5426\u771f\u7684\u8981\u5220\u9664\u535a\u5ba2\u5e16\u5b50 ''{0}''\uff1f +message.delete.success=\u5e16\u5b50\u5df2\u5220\u9664 +message.delete.failure=\u65e0\u6cd5\u5220\u9664\u5e16\u5b50 +message.publishExternal.success=\u535a\u5ba2\u5e16\u5b50\u5df2\u53d1\u5e03 +message.publishExternal.failure=\u65e0\u6cd5\u53d1\u5e03\u5230\u5916\u90e8\u535a\u5ba2 +message.updateExternal.success=\u5916\u90e8\u535a\u5ba2\u5e16\u5b50\u5df2\u66f4\u65b0 +message.updateExternal.failure=\u65e0\u6cd5\u66f4\u65b0\u5916\u90e8\u5e16\u5b50 +message.unpublishExternal.success=\u5916\u90e8\u535a\u5ba2\u5e16\u5b50\u5df2\u79fb\u9664 +message.unpublishExternal.failure=\u65e0\u6cd5\u79fb\u9664\u5916\u90e8\u5e16\u5b50 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.desc.xml new file mode 100644 index 0000000000..35d5ca20c9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.desc.xml @@ -0,0 +1,5 @@ + + Blog view post + Blog: Returns a detail view of a post + /components/blog/postview + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.html.ftl new file mode 100644 index 0000000000..8869c059dd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.html.ftl @@ -0,0 +1,22 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/blog/postview.css" group="blog"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/blog/postview.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+
+
+
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.js new file mode 100644 index 0000000000..cc1b460d0d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.js @@ -0,0 +1,18 @@ +function main() +{ + var result = remote.call("/isreadonly"); + var isReadOnly = (result.status == 200 && result == "true"); + var blogPostView = { + id: "BlogPostView", + name : "Alfresco.BlogPostView", + options : { + siteId : page.url.templateArgs.site, + containerId : "blog", + postId : page.url.args.postId, + isReadOnly: isReadOnly + } + }; + model.widgets = [blogPostView]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.properties new file mode 100644 index 0000000000..0e625ce720 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get.properties @@ -0,0 +1,38 @@ +## template +header.back=Go to Post List + +## JS messages +message.loadpostdata.failure=Unable to load blog post data +message.confirm.delete.title=Delete Blog Post +message.confirm.delete=Do you really want to delete blog post ''{0}''? +message.delete.success=Post deleted +message.delete.failure=Unable to delete post +message.publishExternal.success=Blog post published +message.publishExternal.failure=Unable to publish to external blog +message.updateExternal.success=External blog post updated +message.updateExternal.failure=Unable to update external post +message.unpublishExternal.success=External blog post removed +message.unpublishExternal.failure=Unable to remove external post +message.wait=Please wait... + +# blog post content +post.publishedOn=Published on +post.author=Author +post.externalLink=External Post +post.clickHere=Click here +post.read=Read +post.replies=Replies +post.noTags=(None) + +## post status values +status.draft=Draft +status.updated=Updated +status.published.outofsync=Out of sync +status.published=Published + +## post actions +action.edit=Edit +action.delete=Delete +action.updateexternal=Update Externally +action.unpublishexternal=Remove Externally +action.publishexternal=Publish Externally diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_de.properties new file mode 100755 index 0000000000..ab04065b5f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_de.properties @@ -0,0 +1,38 @@ +## template +header.back=Gehe zur Post-Liste + +## JS messages +message.loadpostdata.failure=Blog-Post-Daten k\u00f6nnen nicht geladen werden +message.confirm.delete.title=Blog-Post l\u00f6schen +message.confirm.delete=M\u00f6chten Sie den Blog-Post ''{0}'' wirklich l\u00f6schen? +message.delete.success=Post gel\u00f6scht +message.delete.failure=Post kann nicht gel\u00f6scht werden +message.publishExternal.success=Blog-Post publiziert +message.publishExternal.failure=Publizieren auf externem Blog nicht m\u00f6glich +message.updateExternal.success=Externen Blog-Post aktualisiert +message.updateExternal.failure=Aktualisieren des externen Post nicht m\u00f6glich +message.unpublishExternal.success=Externen Blog-Post entfernt +message.unpublishExternal.failure=Entfernen des externen Post nicht m\u00f6glich +message.wait=Bitte warten... + +# blog post content +post.publishedOn=Publiziert am +post.author=Autor +post.externalLink=Externer Post +post.clickHere=Hier klicken +post.read=Lesen +post.replies=Antworten +post.noTags=(Kein) + +## post status values +status.draft=Entwurf +status.updated=Aktualisiert +status.published.outofsync=Nicht synchronisiert +status.published=Publiziert + +## post actions +action.edit=Bearbeiten +action.delete=L\u00f6schen +action.updateexternal=Extern aktualisieren +action.unpublishexternal=Extern entfernen +action.publishexternal=Extern publizieren diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_es.properties new file mode 100755 index 0000000000..f594d28edb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_es.properties @@ -0,0 +1,38 @@ +## template +header.back=Ir a la lista de entrada + +## JS messages +message.loadpostdata.failure=Error al cargar los datos de la entrada del blog +message.confirm.delete.title=Eliminar entrada del blog +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar la entrada ''{0}'' del blog? +message.delete.success=Entrada eliminada +message.delete.failure=Error al eliminar la entrada +message.publishExternal.success=Entrada publicada en el blog +message.publishExternal.failure=Error al publicar en el blog externo +message.updateExternal.success=Entrada del blog externo actualizada +message.updateExternal.failure=Error al actualizar la entrada en el blog externo +message.unpublishExternal.success=Entrada eliminada en el blog externo +message.unpublishExternal.failure=No se pudo quitar la entrada del blog externo +message.wait=Espere por favor... + +# blog post content +post.publishedOn=Publicado el +post.author=Autor +post.externalLink=Entrada externa +post.clickHere=Pulse aqu\u00ed +post.read=Leer +post.replies=Respuestas +post.noTags=(Ninguno) + +## post status values +status.draft=Borrador +status.updated=Actualizado +status.published.outofsync=Sin sincronizar +status.published=Publicado + +## post actions +action.edit=Editar +action.delete=Eliminar +action.updateexternal=Actualizar externamente +action.unpublishexternal=Quitar externamente +action.publishexternal=Publicar externamente diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_fr.properties new file mode 100755 index 0000000000..854488f834 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_fr.properties @@ -0,0 +1,38 @@ +## template +header.back=Aller \u00e0 la liste des articles + +## JS messages +message.loadpostdata.failure=Echec du chargement des donn\u00e9es de l'article du blog +message.confirm.delete.title=Supprimer l'article de blog +message.confirm.delete=\u00cates-vous s\u00fbr de vouloir supprimer l''article ''{0}'' ? +message.delete.success=Article supprim\u00e9 +message.delete.failure=Echec de la suppression de l'article +message.publishExternal.success=Article publi\u00e9 sur le blog +message.publishExternal.failure=Echec de la publication sur le blog externe +message.updateExternal.success=Article de blog externe mis \u00e0 jour avec succ\u00e8s +message.updateExternal.failure=Echec de la mise \u00e0 jour de l'article du blog externe +message.unpublishExternal.success=Article externe supprim\u00e9 +message.unpublishExternal.failure=Echec de la suppression de l'article externe +message.wait=Veuillez patienter... + +# blog post content +post.publishedOn=Publi\u00e9 le +post.author=Auteur +post.externalLink=Article externe +post.clickHere=Cliquer ici +post.read=Lire +post.replies=R\u00e9ponses +post.noTags=(Aucun) + +## post status values +status.draft=Brouillon +status.updated=Mis \u00e0 jour +status.published.outofsync=D\u00e9synchronis\u00e9 +status.published=Publi\u00e9 + +## post actions +action.edit=Modifier +action.delete=Supprimer +action.updateexternal=Mettre \u00e0 jour en externe +action.unpublishexternal=Supprimer en externe +action.publishexternal=Publier en externe diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_it.properties new file mode 100755 index 0000000000..89bdacec9d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_it.properties @@ -0,0 +1,38 @@ +## template +header.back=Vai all'elenco dei post + +## JS messages +message.loadpostdata.failure=Impossibile caricare i dati del post del blog +message.confirm.delete.title=Elimina post del blog +message.confirm.delete=Eliminare il post del blog ''{0}''? +message.delete.success=Post eliminato +message.delete.failure=Impossibile eliminare il post +message.publishExternal.success=Post del blog pubblicato +message.publishExternal.failure=Impossibile pubblicare nel blog esterno +message.updateExternal.success=Post del blog esterno aggiornato +message.updateExternal.failure=Impossibile aggiornare il post esterno +message.unpublishExternal.success=Post del blog esterno rimosso +message.unpublishExternal.failure=Impossibile rimuovere il post esterno +message.wait=Attendere... + +# blog post content +post.publishedOn=Pubblicato il +post.author=Autore +post.externalLink=Post esterno +post.clickHere=Fare clic qui +post.read=Letti +post.replies=Risposte +post.noTags=(Nessuno) + +## post status values +status.draft=Bozza +status.updated=Aggiornato +status.published.outofsync=Non sincronizzato +status.published=Pubblicato + +## post actions +action.edit=Modifica +action.delete=Elimina +action.updateexternal=Aggiorna esternamente +action.unpublishexternal=Rimuovi esternamente +action.publishexternal=Pubblica esternamente diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_ja.properties new file mode 100755 index 0000000000..76158bf52c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_ja.properties @@ -0,0 +1,38 @@ +## template +header.back=\u6295\u7a3f\u30ea\u30b9\u30c8\u306b\u79fb\u52d5 + +## JS messages +message.loadpostdata.failure=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093 +message.confirm.delete.title=\u30d6\u30ed\u30b0\u6295\u7a3f\u306e\u524a\u9664 +message.confirm.delete=\u30d6\u30ed\u30b0\u6295\u7a3f ''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.delete.success=\u6295\u7a3f\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=\u6295\u7a3f\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +message.publishExternal.success=\u30d6\u30ed\u30b0\u6295\u7a3f\u304c\u516c\u958b\u3055\u308c\u307e\u3057\u305f +message.publishExternal.failure=\u5916\u90e8\u30d6\u30ed\u30b0\u306b\u516c\u958b\u3067\u304d\u307e\u305b\u3093 +message.updateExternal.success=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.updateExternal.failure=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093 +message.unpublishExternal.success=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.unpublishExternal.failure=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u6295\u7a3f\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +message.wait=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044... + +# blog post content +post.publishedOn=\u516c\u958b\u65e5\u6642 +post.author=\u4f5c\u6210\u8005 +post.externalLink=\u5916\u90e8\u5411\u3051\u6295\u7a3f +post.clickHere=\u3053\u3053\u3092\u30af\u30ea\u30c3\u30af +post.read=\u8aad\u3080 +post.replies=\u8fd4\u4fe1 +post.noTags=(\u306a\u3057) + +## post status values +status.draft=\u4e0b\u66f8\u304d +status.updated=\u66f4\u65b0\u6e08\u307f +status.published.outofsync=\u540c\u671f\u306a\u3057 +status.published=\u516c\u958b\u6e08\u307f + +## post actions +action.edit=\u7de8\u96c6 +action.delete=\u524a\u9664 +action.updateexternal=\u5916\u90e8\u5411\u3051\u3092\u66f4\u65b0 +action.unpublishexternal=\u5916\u90e8\u5411\u3051\u3092\u524a\u9664 +action.publishexternal=\u5916\u90e8\u306b\u516c\u958b diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_nb.properties new file mode 100755 index 0000000000..5abebcd1e8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_nb.properties @@ -0,0 +1,38 @@ +## template +header.back=G\u00e5 til innleggsliste + +## JS messages +message.loadpostdata.failure=Kan ikke laste blogginnleggsdata +message.confirm.delete.title=Slett blogginnlegg +message.confirm.delete=Er du sikker p\u00e5 at du vil slette blogginnlegg ''{0}''? +message.delete.success=Blogginnlegg er slettet +message.delete.failure=Kan ikke slette innlegg +message.publishExternal.success=Blogginnlegg er publisert +message.publishExternal.failure=Kan ikke publisere til ekstern blogg +message.updateExternal.success=Eksternt blogginnlegg er oppdatert +message.updateExternal.failure=Kan ikke oppdatere eksternt innlegg +message.unpublishExternal.success=Eksternt blogginnlegg er fjernet +message.unpublishExternal.failure=Kan ikke fjerne eksternt innlegg +message.wait=Vent litt... + +# blog post content +post.publishedOn=Publisert den +post.author=Forfatter +post.externalLink=Eksternt innlegg +post.clickHere=Klikk her +post.read=Les +post.replies=Svar +post.noTags=(Ingen) + +## post status values +status.draft=Utkast +status.updated=Oppdatert +status.published.outofsync=Usynkronisert +status.published=Publisert + +## post actions +action.edit=Rediger +action.delete=Slett +action.updateexternal=Oppdater eksternt +action.unpublishexternal=Fjern eksternt +action.publishexternal=Publiser eksternt diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_nl.properties new file mode 100755 index 0000000000..756b0d661d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_nl.properties @@ -0,0 +1,38 @@ +## template +header.back=Ga naar berichtenlijst + +## JS messages +message.loadpostdata.failure=Kan blogberichtgegevens niet laden +message.confirm.delete.title=Blogbericht verwijderen +message.confirm.delete=Weet u zeker dat u blogbericht ''{0}'' wilt verwijderen? +message.delete.success=Bericht verwijderd +message.delete.failure=Kan bericht niet verwijderen +message.publishExternal.success=Blogbericht gepubliceerd +message.publishExternal.failure=Kan niet publiceren naar externe blog +message.updateExternal.success=Extern blogbericht bijgewerkt +message.updateExternal.failure=Kan extern bericht niet bijwerken +message.unpublishExternal.success=Extern blogbericht verwijderd +message.unpublishExternal.failure=Kan extern bericht niet verwijderen +message.wait=Een ogenblik geduld... + +# blog post content +post.publishedOn=Gepubliceerd op +post.author=Auteur +post.externalLink=Extern bericht +post.clickHere=Klik hier +post.read=Lezen +post.replies=Antwoorden +post.noTags=(Geen) + +## post status values +status.draft=Concept +status.updated=Bijgewerkt +status.published.outofsync=Niet gesynchroniseerd +status.published=Gepubliceerd + +## post actions +action.edit=Bewerken +action.delete=Verwijderen +action.updateexternal=Extern bijwerken +action.unpublishexternal=Extern verwijderen +action.publishexternal=Extern publiceren diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_pt_BR.properties new file mode 100644 index 0000000000..cb6ecb168a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_pt_BR.properties @@ -0,0 +1,38 @@ +## template +header.back=Ir para a lista de postagens + +## JS messages +message.loadpostdata.failure=N\u00e3o \u00e9 poss\u00edvel carregar os dados de postagem do blog +message.confirm.delete.title=Excluir postagem do blog +message.confirm.delete=Deseja realmente excluir a postagem de blog ''{0}''? +message.delete.success=Postagem exclu\u00edda +message.delete.failure=N\u00e3o \u00e9 poss\u00edvel excluir a postagem +message.publishExternal.success=Postagem do blog publicada +message.publishExternal.failure=N\u00e3o \u00e9 poss\u00edvel publicar no blog externo +message.updateExternal.success=Postagem do blog externo atualizada +message.updateExternal.failure=N\u00e3o \u00e9 poss\u00edvel atualizar a postagem externa +message.unpublishExternal.success=Postagem do blog externo removida +message.unpublishExternal.failure=N\u00e3o \u00e9 poss\u00edvel remover a postagem externa +message.wait=Por favor, aguarde... + +# blog post content +post.publishedOn=Publicado em +post.author=Autor +post.externalLink=Postagem externa +post.clickHere=Clique aqui +post.read=Ler +post.replies=Respostas +post.noTags=(Nenhum) + +## post status values +status.draft=Rascunho +status.updated=Atualizado +status.published.outofsync=Fora de sincronia +status.published=Publicado + +## post actions +action.edit=Editar +action.delete=Excluir +action.updateexternal=Atualizar externamente +action.unpublishexternal=Remover externamente +action.publishexternal=Publicar externamente diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_ru.properties new file mode 100755 index 0000000000..aa73351a97 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_ru.properties @@ -0,0 +1,38 @@ +## template +header.back=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 + +## JS messages +message.loadpostdata.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043b\u043e\u0433\u0430 +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 +message.confirm.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 ''{0}''? +message.delete.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +message.publishExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u0433\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 +message.publishExternal.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +message.updateExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 +message.updateExternal.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +message.unpublishExternal.success=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +message.unpublishExternal.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +message.wait=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435... + +# blog post content +post.publishedOn=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e +post.author=\u0410\u0432\u0442\u043e\u0440 +post.externalLink=\u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0437\u0430\u043f\u0438\u0441\u044c +post.clickHere=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c +post.read=\u0427\u0442\u0435\u043d\u0438\u0435 +post.replies=\u041e\u0442\u0432\u0435\u0442\u044b +post.noTags=(\u041d\u0435\u0442) + +## post status values +status.draft=\u0427\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 +status.updated=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 +status.published.outofsync=\u041d\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 +status.published=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e + +## post actions +action.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +action.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +action.updateexternal=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +action.unpublishexternal=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 +action.publishexternal=\u041f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u043b\u043e\u0433\u0435 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_zh_CN.properties new file mode 100755 index 0000000000..30f6ecfb11 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/postview.get_zh_CN.properties @@ -0,0 +1,38 @@ +## template +header.back=\u8f6c\u81f3\u5e16\u5b50\u5217\u8868 + +## JS messages +message.loadpostdata.failure=\u65e0\u6cd5\u52a0\u8f7d\u535a\u5ba2\u5e16\u5b50\u6570\u636e +message.confirm.delete.title=\u5220\u9664\u535a\u5ba2\u5e16\u5b50 +message.confirm.delete=\u662f\u5426\u771f\u7684\u8981\u5220\u9664\u535a\u5ba2\u5e16\u5b50 ''{0}''\uff1f +message.delete.success=\u5e16\u5b50\u5df2\u5220\u9664 +message.delete.failure=\u65e0\u6cd5\u5220\u9664\u5e16\u5b50 +message.publishExternal.success=\u535a\u5ba2\u5e16\u5b50\u5df2\u53d1\u5e03 +message.publishExternal.failure=\u65e0\u6cd5\u53d1\u5e03\u5230\u5916\u90e8\u535a\u5ba2 +message.updateExternal.success=\u5916\u90e8\u535a\u5ba2\u5e16\u5b50\u5df2\u66f4\u65b0 +message.updateExternal.failure=\u65e0\u6cd5\u66f4\u65b0\u5916\u90e8\u5e16\u5b50 +message.unpublishExternal.success=\u5916\u90e8\u535a\u5ba2\u5e16\u5b50\u5df2\u79fb\u9664 +message.unpublishExternal.failure=\u65e0\u6cd5\u79fb\u9664\u5916\u90e8\u5e16\u5b50 +message.wait=\u8bf7\u7a0d\u5019... + +# blog post content +post.publishedOn=\u53d1\u5e03\u65f6\u95f4 +post.author=\u4f5c\u8005 +post.externalLink=\u5916\u90e8\u5e16\u5b50 +post.clickHere=\u5355\u51fb\u6b64\u5904 +post.read=\u8bfb +post.replies=\u56de\u590d +post.noTags=\uff08\u65e0\uff09 + +## post status values +status.draft=\u8349\u7a3f +status.updated=\u5df2\u66f4\u65b0 +status.published.outofsync=\u4e0d\u540c\u6b65 +status.published=\u5df2\u53d1\u5e03 + +## post actions +action.edit=\u7f16\u8f91 +action.delete=\u5220\u9664 +action.updateexternal=\u5916\u90e8\u66f4\u65b0 +action.unpublishexternal=\u5916\u90e8\u79fb\u9664 +action.publishexternal=\u5916\u90e8\u53d1\u5e03 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.desc.xml new file mode 100644 index 0000000000..04c04f3385 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.desc.xml @@ -0,0 +1,5 @@ + + blogtoolbar + Blog: Toolbar + /components/blog/toolbar + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.html.ftl new file mode 100644 index 0000000000..c2b76917ae --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.html.ftl @@ -0,0 +1,40 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/blog/toolbar.css" group="blog"/> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/blog/config-blog.css" group="blog"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/blog/toolbar.js" group="blog"/> + <@script type="text/javascript" src="${url.context}/res/modules/blog/config-blog.js" group="blog"/> + + +<@markup id="widgets"> + <@createWidgets group="blog"/> + + +<@markup id="html"> + <@uniqueIdDiv> + +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.js new file mode 100644 index 0000000000..e398f6ee2a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.js @@ -0,0 +1,41 @@ +function main() +{ + // A default blog description + var defaultBlog = + { + permissions: + { + create: false, + edit: false + } + }; + + // Call the repo to get the permissions for the user for this blog + var result = remote.call("/api/blog/site/" + page.url.templateArgs.site + "/" + (template.properties.container ? template.properties.container : "blog")); + var obj = JSON.parse(result); + if (result.status == 200) + { + // Prepare the model for the template + model.blog = obj.item; + } + else + { + model.blog = defaultBlog; + } + + // Widget instantiation metadata... + + var blogToolbar = { + id : "BlogToolbar", + name : "Alfresco.BlogToolbar", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + containerId : (template.properties.container != null) ? template.properties.continer : "blog", + allowCreate : model.blog.permissions.create, + allowConfigure : model.blog.permissions.edit + } + }; + model.widgets = [blogToolbar]; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.properties new file mode 100644 index 0000000000..7ecaabbfa4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get.properties @@ -0,0 +1,4 @@ +button.create=New Post +button.configure=Configure External Blog +button.rssfeed=RSS Feed +link.listView=Blog Post List diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_de.properties new file mode 100755 index 0000000000..5fb9f5c1fd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_de.properties @@ -0,0 +1,4 @@ +button.create=Neuer Post +button.configure=Externen Blog konfigurieren +button.rssfeed=RSS-Feed +link.listView=Blog-Post-Liste diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_es.properties new file mode 100755 index 0000000000..25e4f26f00 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_es.properties @@ -0,0 +1,4 @@ +button.create=Nueva entrada +button.configure=Configurar un blog externo +button.rssfeed=Canal RSS +link.listView=Lista de entradas en el blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_fr.properties new file mode 100755 index 0000000000..96b1295542 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_fr.properties @@ -0,0 +1,4 @@ +button.create=Nouvel article +button.configure=Configurer un blog externe +button.rssfeed=Flux RSS +link.listView=Liste des articles diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_it.properties new file mode 100755 index 0000000000..56ec89d135 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_it.properties @@ -0,0 +1,4 @@ +button.create=Nuovo post +button.configure=Configura blog esterno +button.rssfeed=Feed RSS +link.listView=Elenco post del blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_ja.properties new file mode 100755 index 0000000000..d31d4f0787 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_ja.properties @@ -0,0 +1,4 @@ +button.create=\u65b0\u3057\u3044\u6295\u7a3f +button.configure=\u5916\u90e8\u30d6\u30ed\u30b0\u306e\u8a2d\u5b9a +button.rssfeed=RSS \u30d5\u30a3\u30fc\u30c9 +link.listView=\u30d6\u30ed\u30b0\u6295\u7a3f\u30ea\u30b9\u30c8 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_nb.properties new file mode 100755 index 0000000000..442f5b6ff3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_nb.properties @@ -0,0 +1,4 @@ +button.create=Nytt innlegg +button.configure=Konfigurer ekstern blogg +button.rssfeed=RSS-feed +link.listView=Liste over blogginnlegg diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_nl.properties new file mode 100755 index 0000000000..d3ce7bc510 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_nl.properties @@ -0,0 +1,4 @@ +button.create=Nieuw bericht +button.configure=Externe blog configureren +button.rssfeed=RSS-feed +link.listView=Lijst met blogberichten diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_pt_BR.properties new file mode 100644 index 0000000000..b3e16a0a66 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_pt_BR.properties @@ -0,0 +1,4 @@ +button.create=Nova postagem +button.configure=Configurar blog externo +button.rssfeed=Feed RSS +link.listView=Lista de postagens do blog diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_ru.properties new file mode 100755 index 0000000000..358e6e4b22 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_ru.properties @@ -0,0 +1,4 @@ +button.create=\u041d\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c +button.configure=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u043b\u043e\u0433 +button.rssfeed=RSS-\u043a\u0430\u043d\u0430\u043b +link.listView=\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u043b\u043e\u0433\u0430 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_zh_CN.properties new file mode 100755 index 0000000000..95c0e4c24d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/blog/toolbar.get_zh_CN.properties @@ -0,0 +1,4 @@ +button.create=\u53d1\u65b0\u8d34 +button.configure=\u914d\u7f6e\u5916\u90e8\u535a\u5ba2 +button.rssfeed=RSS \u8ba2\u9605\u6e90 +link.listView=\u535a\u5ba2\u5e16\u5b50\u5217\u8868 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.desc.xml new file mode 100644 index 0000000000..f88eeba0d9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.desc.xml @@ -0,0 +1,5 @@ + + calendar + Calendar: Calendar Component + /components/calendar/mycalendar + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.head.ftl new file mode 100644 index 0000000000..030c95af47 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.html.ftl new file mode 100644 index 0000000000..f1358aa3c7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.html.ftl @@ -0,0 +1,29 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/calendar/calendar.css" group="calendar"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/calendar/calendar.js" group="calendar"/> + + +<@markup id="widgets"> + <@createWidgets group="calendar"/> + <@inlineScript group="calendar"> + <#-- JavaScript to be executed AFTER widget instantiation here --> + calendar.setSiteId("${(page.url.templateArgs.site!"")?js_string}"); + + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid?html> + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.js new file mode 100644 index 0000000000..2db5d17d12 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.js @@ -0,0 +1,12 @@ +function main() +{ + var calendar = { + id : "Calendar", + name : "Alfresco.Calendar", + assignTo : "calendar", + useOptions: false + }; + model.widgets = [calendar]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.properties new file mode 100644 index 0000000000..1a991603f3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get.properties @@ -0,0 +1,3 @@ +button.this-month=This Month + +message.add.success=''{0}'' was added diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_de.properties new file mode 100755 index 0000000000..147d8071ba --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_de.properties @@ -0,0 +1,3 @@ +button.this-month=Dieser Monat + +message.add.success=''{0}'' wurde hinzugef\u00fcgt diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_es.properties new file mode 100755 index 0000000000..92ab156692 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_es.properties @@ -0,0 +1,3 @@ +button.this-month=Mes en curso + +message.add.success=Se ha a\u00f1adido ''{0}'' diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_fr.properties new file mode 100755 index 0000000000..116be0fa33 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_fr.properties @@ -0,0 +1,3 @@ +button.this-month=Ce mois + +message.add.success=''{0}'' a \u00e9t\u00e9 ajout\u00e9 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_it.properties new file mode 100755 index 0000000000..6ca3efec27 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_it.properties @@ -0,0 +1,3 @@ +button.this-month=Questo mese + +message.add.success=''{0}'' \u00e8 stato aggiunto diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_ja.properties new file mode 100755 index 0000000000..c30aaf3d0f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_ja.properties @@ -0,0 +1,3 @@ +button.this-month=\u4eca\u6708 + +message.add.success=''{0}'' \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_nb.properties new file mode 100755 index 0000000000..5034f18bcd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_nb.properties @@ -0,0 +1,3 @@ +button.this-month=Denne m\u00e5ned + +message.add.success=''{0}'' ble lagt til diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_nl.properties new file mode 100755 index 0000000000..fb33101b7c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_nl.properties @@ -0,0 +1,3 @@ +button.this-month=Deze maand + +message.add.success=''{0}'' is toegevoegd diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_pt_BR.properties new file mode 100644 index 0000000000..20e597fc55 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_pt_BR.properties @@ -0,0 +1,3 @@ +button.this-month=Este m\u00eas + +message.add.success=''{0}'' foi adicionado diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_ru.properties new file mode 100755 index 0000000000..8064a0f1ac --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_ru.properties @@ -0,0 +1,3 @@ +button.this-month=\u042d\u0442\u043e\u0442 \u043c\u0435\u0441\u044f\u0446 + +message.add.success=\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d "{0}" diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_zh_CN.properties new file mode 100755 index 0000000000..26536c8b73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/calendar.get_zh_CN.properties @@ -0,0 +1,3 @@ +button.this-month=\u672c\u6708 + +message.add.success=\u5df2\u6dfb\u52a0 ''{0}'' diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/enabledViews.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/enabledViews.js new file mode 100644 index 0000000000..9408f160ae --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/enabledViews.js @@ -0,0 +1,4 @@ +// Enabled Calendar Views +// These settings are parsed both by the template level calendar.js and helper.js used by [toolbar|view].get.js calendar components (that means a server restart is needed to pick up changes). +model.defaultView= "month"; +model.enabledViews= {day: true, week: true, month: true, agenda: true}; \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/helper.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/helper.js new file mode 100644 index 0000000000..66b12b2d38 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/helper.js @@ -0,0 +1,380 @@ + + +var CalendarScriptHelper = (function() +{ + var now = new Date(); + /* Number of ms in a day & hour */ + var HOUR = 60 * 60 * 1000; + var DAY = 24 * HOUR; + /* Days in a week */ + var DAYS_IN_WEEK = 7; + + //add n days to given date + var addDays = function(d, nDays) + { + d.setDate(d.getDate() + nDays); + return d; + }; + //returns number of days in month + var daysInMonth = function(iMonth, iYear) + { + return 32 - new Date(iYear, iMonth, 32).getDate(); + }; + + var zeroPad = function(value) + { + return (value < 10) ? '0' + value : value; + }; + // { + // "name" : "1225808148178-998.ics", + // "title" : "lunch", + // "where" : "somewhere", + // "when" : "04 Nov 2008", + // "url" : "page/site/testSite/calendar?date=2008-11-04", + // "start" : "12:00", + // "end" : "13:00", + // "site" : "testSite" + // } + var convertToIcalFormat = function(event, eventDate, endDate) + { + var convertedEvent = {}; + convertedEvent.location = event.where; + convertedEvent.dtstart = toISOString(eventDate).split('+')[0]; + convertedEvent.dtstartText = zeroPad(eventDate.getHours()) + ':' + zeroPad(eventDate.getMinutes()); + convertedEvent.dtend = toISOString(endDate).split('+')[0]; + convertedEvent.dtendText = zeroPad(endDate.getHours()) + ':' + zeroPad(endDate.getMinutes()); + convertedEvent.summary = event.title; + // convertedEvent.url = event.url; + convertedEvent.description = event.description || event.title; + convertedEvent.location = event.where; + convertedEvent.name = event.name; + convertedEvent.tags = event.tags; + convertedEvent.duration = event.duration; + + if (event.startAt.iso8601 === event.endAt.iso8601) + { + convertedEvent.allday = true; + } + else + { + convertedEvent.allday = false; + } + + + return convertedEvent; + }; + + /** + * Converts a JavaScript native Date object into a ISO8601-formatted string + * + * Original code: + * dojo.date.stamp.toISOString + * Copyright (c) 2005-2008, The Dojo Foundation + * All rights reserved. + * BSD license (http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE) + * + * @method toISO8601 + * @param dateObject {Date} JavaScript Date object + * @param options {object} Optional conversion options + * zulu = true|false + * selector = "time|date" + * milliseconds = true|false + * @return {string} + * @static + */ + var toISOString = function() + { + // summary: + // Format a Date object as a string according a subset of the ISO-8601 standard + // + // description: + // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt) + // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date) + // Does not check bounds. Only years between 100 and 9999 are supported. + // + // dateObject: + // A Date object + var _ = function(n) + { + return (n < 10) ? "0" + n : n; + }; + + return function(dateObject, options) + { + options = options || {}; + var formattedDate = []; + var getter = options.zulu ? "getUTC" : "get"; + var date = ""; + if (options.selector != "time") + { + var year = dateObject[getter + "FullYear"](); + date = ["0000".substr((year + "").length) + year, _(dateObject[getter + "Month"]() + 1), _(dateObject[getter + "Date"]())].join('-'); + } + formattedDate.push(date); + if (options.selector != "date") + { + var time = [_(dateObject[getter + "Hours"]()), _(dateObject[getter + "Minutes"]()), _(dateObject[getter + "Seconds"]())].join(':'); + var millis = dateObject[getter + "Milliseconds"](); + if (options.milliseconds) + { + time += "." + (millis < 100 ? "0" : "") + _(millis); + } + if (options.zulu) + { + time += "Z"; + } + else if (options.selector != "time") + { + var timezoneOffset = dateObject.getTimezoneOffset(); + var absOffset = Math.abs(timezoneOffset); + time += (timezoneOffset > 0 ? "-" : "+") + + _(Math.floor(absOffset / 60)) + + ":" + + _(absOffset % 60); + } + formattedDate.push(time); + } + return formattedDate.join('T'); // String + }; + }(); + /** + * Converts an ISO8601-formatted date into a JavaScript native Date object + * + * Original code: + * dojo.date.stamp.fromISOString + * Copyright (c) 2005-2008, The Dojo Foundation + * All rights reserved. + * BSD license (http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE) + * + * @method Alfresco.thirdparty.fromISO8601 + * @param formattedString {string} ISO8601-formatted date string + * @return {Date|null} + * @static + */ + var fromISOString = function() + { + // summary: + // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard. + // + // description: + // Accepts a string formatted according to a profile of ISO8601 as defined by + // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed. + // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime) + // The following combinations are valid: + // + // * dates only + // | * yyyy + // | * yyyy-MM + // | * yyyy-MM-dd + // * times only, with an optional time zone appended + // | * THH:mm + // | * THH:mm:ss + // | * THH:mm:ss.SSS + // * and "datetimes" which could be any combination of the above + // + // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm + // Assumes the local time zone if not specified. Does not validate. Improperly formatted + // input may return null. Arguments which are out of bounds will be handled + // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st) + // Only years between 100 and 9999 are supported. + // + // formattedString: + // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00 + + var isoRegExp = /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/; + + return function(formattedString) + { + var match = isoRegExp.exec(formattedString); + var result = null; + + if (match) + { + match.shift(); + if (match[1]) + { + match[1]--; + } // Javascript Date months are 0-based + if (match[6]) + { + match[6] *= 1000; + } // Javascript Date expects fractional seconds as milliseconds + result = new Date(match[0] || 1970, match[1] || 0, match[2] || 1, match[3] || 0, match[4] || 0, match[5] || 0, match[6] || 0); + + var offset = 0; + var zoneSign = match[7] && match[7].charAt(0); + if (zoneSign != 'Z') + { + offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0); + if (zoneSign != '-') + { + offset *= -1; + } + } + if (zoneSign) + { + offset -= result.getTimezoneOffset(); + } + if (offset) + { + result.setTime(result.getTime() + offset * 60000); + } + } + + return result; // Date or null + }; + }(); + + return { + /** + * Retrieves user events for specified date + * + * @param {Date} d Optional. Date from which to retrieve user events. If not specified, + * the date used is one specified in request or the current date. + * + * @returns {Array} eventList Array of events + */ + getUserEvents: function(d) + { + var d = d || this.getContextDate(this.getDefaultDate()); + var uri = "/calendar/events/" + encodeURIComponent(page.url.templateArgs.site) + + "/user?from=" + + encodeURIComponent(toISOString(d, { + selector: 'date' + })); + var connector = remote.connect("alfresco"); + var result = connector.get(uri); + if (result.status == status.STATUS_OK) + { + var eventList = JSON.parse(result.response).events; + return eventList; + } + }, + + getDefaultDate: function() + { + var d = new Date(); + return d; + }, + + /** + * Gets the current date + * + * @returns {Date} The current date + */ + getCurrentDate: function() + { + return now; + }, + + /** + * Gets the name of the requested view & checks that view is enabled + * + * @return {String} view name ["day"|"week"|"month"|"agenda"] + */ + + getView: function() + { + return context.properties.filteredView; + }, + + /** + * Returns the number of views supported by this calendar install + * + * @return {int} + */ + + countViews: function() + { + var j = 0; + for (var key in model.enabledViews) { + model.enabledViews[key] ? j++ : null ; + } + return j; + }, + + /* + * Returns a list of views supported + * + * @return {array} + */ + + listViews: function() + { + var views = []; + for (var key in model.enabledViews) { + model.enabledViews[key] ? views.push(key) : null ; + } + return views; + }, + + /** + * Gets the requested date for the request or the specified default date (for the current view) if not specified + * + * @param {Date} Date to use as default if not date param specified + * @returns {String} The contextual date for the request. + */ + getContextDate: function(defaultDate) + { + return fromISOString(getPageUrlParam('date', defaultDate.getFullYear() + "-" + zeroPad(defaultDate.getMonth() + 1) + "-" + zeroPad(defaultDate.getDate()))); + }, + + /** + * Initialises data used to render the calendar view + * @return {object} + **/ + initialiseViews: function(d) + { + var viewArgs = {}; + var firstDayOfMonth = new Date(d.getTime() - ((d.getDate() - 1) * DAY)); + //number of days in month + var num_daysInMonth = daysInMonth(d.getMonth(), d.getFullYear()); + + var lastDayOfMonth = new Date(((firstDayOfMonth.getTime() + (DAY * num_daysInMonth)))); + + + viewArgs.viewEvents = []; + viewArgs.startDate = toISOString(d, { + selector: 'date' + }); + viewArgs.titleDate = viewArgs.startDate; + viewArgs.endDate = toISOString(new Date(d.getTime() + (DAY * 31)), { + selector: 'date' + }); + return viewArgs; + }, + isUserPermittedToCreateEvents: function() + { + var json = remote.call("/api/sites/" + page.url.templateArgs.site + "/memberships/" + encodeURIComponent(user.name)), + membership = JSON.parse(json); + + // If the user isn't a member of the site, the response won't have role. + return (membership.role && membership.role !== "SiteConsumer")? true : false; + }, + + /** + * Initialises the data required for the view + * + * return {object} + **/ + initView: function() + { + var viewArgs = {}; + viewArgs.viewType = CalendarScriptHelper.getView(); + viewArgs.enabledViews = CalendarScriptHelper.listViews(); + viewArgs.permitToCreateEvents = this.isUserPermittedToCreateEvents(); + viewArgs.view = this.initialiseViews(this.getContextDate(this.getDefaultDate())); + return viewArgs; + }, + + convertFromISOString: function(formattedDate) + { + return fromISOString(formattedDate); + }, + convertToISOString: function(dateObject, options) + { + return toISOString(dateObject, options); + } + }; + +}()); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.desc.xml new file mode 100644 index 0000000000..7a021eb8f9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.desc.xml @@ -0,0 +1,5 @@ + + eventinfo + Calendar: Event Information Panel + /components/calendar/info + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.html.ftl new file mode 100644 index 0000000000..4dafe517a7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.html.ftl @@ -0,0 +1,80 @@ +<#assign el=args.htmlid?html> + + +
${msg("label.eventinfo")}
+
+
+

${msg("label.details")}

+
+
+
${msg("label.what")}:
+
${(result.what!"")?html?html}
+
+
+
${msg("label.location")}:
+
${(result.location!"")?html?html}
+
+
+
${msg("label.description")}:
+
${(result.description!"")?html?html}
+
+
+
${msg("label.tags")}:
+
+<#if result.tags?? && result.tags?size > 0> + <#list result.tags as tag>${tag}<#if tag_has_next>,  +<#else> + ${msg("label.none")} + +
+
+
+

${msg("label.time")}

+
+<#if result.allday?? && result.allday == 'true'> +
+
 
+
${msg("label.allday")}
+
+ +
+
${msg("label.startdate")}:
+
<#if result.startAt??>${result.startAt.iso8601!""}
+
+
+
${msg("label.enddate")}:
+
<#if result.endAt??>${result.endAt.iso8601!""}
+
+<#if result.recurrence?? && result.recurrence != ''> +
+
${msg("label.recurrence")}:
+
${(result.recurrence!"")?html}
+
+ + +<#if result.docfolder?? && result.docfolder != ''> +
+

${msg("label.relatedcontent")}

+
+
+
${msg("label.docfolder")}:
+ +
+ + +
+
+ + <#if result.permissions?? && result.permissions.edit> + + + <#if result.permissions?? && result.permissions.delete> + + +
+ <#if result.isoutlook?? && result.isoutlook == 'false'> +
+ +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.js new file mode 100644 index 0000000000..bb90c6b75b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.js @@ -0,0 +1,4 @@ + + +var uri = unescape(args['uri']); +model.result = doGetCall(uri); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.properties new file mode 100644 index 0000000000..ff9ee569d8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get.properties @@ -0,0 +1,12 @@ +label.what=What +label.location=Where +label.allday=All Day Event +label.time=Time +label.details=Details +label.documents=Documents +label.eventinfo=Event Information +label.startdate=Start Date +label.enddate=End Date +label.relatedcontent=Related Content +label.docfolder=Document Folder +label.recurrence=Recurrence diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_de.properties new file mode 100755 index 0000000000..5229eb0d50 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_de.properties @@ -0,0 +1,12 @@ +label.what=Was +label.location=Wo +label.allday=Ganzt\u00e4giges Ereignis +label.time=Zeit +label.details=Details +label.documents=Dokumente +label.eventinfo=Informationen zum Ereignis +label.startdate=Anfangsdatum +label.enddate=Enddatum +label.relatedcontent=\u00c4hnlicher Inhalt +label.docfolder=Dokumentenordner +label.recurrence=Wiederholung diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_es.properties new file mode 100755 index 0000000000..10e3212649 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_es.properties @@ -0,0 +1,12 @@ +label.what=Qu\u00e9 +label.location=D\u00f3nde +label.allday=Evento para todo el d\u00eda +label.time=Hora +label.details=Detalles +label.documents=Documentos +label.eventinfo=Informaci\u00f3n del evento +label.startdate=Fecha de inicio +label.enddate=Fecha de fin +label.relatedcontent=Contenido asociado +label.docfolder=Carpeta de documentos +label.recurrence=Repetici\u00f3n diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_fr.properties new file mode 100755 index 0000000000..e4dac86164 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_fr.properties @@ -0,0 +1,12 @@ +label.what=Quoi +label.location=O\u00f9 +label.allday=Journ\u00e9e enti\u00e8re +label.time=Heure +label.details=D\u00e9tails +label.documents=Documents +label.eventinfo=Informations sur l'\u00e9v\u00e9nement +label.startdate=Date de d\u00e9but +label.enddate=Date de fin +label.relatedcontent=Contenu associ\u00e9 +label.docfolder=Dossier de documents +label.recurrence=R\u00e9currence diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_it.properties new file mode 100755 index 0000000000..1f558d9ab8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_it.properties @@ -0,0 +1,12 @@ +label.what=Cosa +label.location=Dove +label.allday=Evento a giornata intera +label.time=Ora +label.details=Dettagli +label.documents=Documenti +label.eventinfo=Informazioni sull'evento +label.startdate=Data di inizio +label.enddate=Data di fine +label.relatedcontent=Contenuto correlato +label.docfolder=Cartella di documenti +label.recurrence=Ricorrenza diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_ja.properties new file mode 100755 index 0000000000..bd6464de55 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_ja.properties @@ -0,0 +1,12 @@ +label.what=\u30bf\u30a4\u30c8\u30eb +label.location=\u5834\u6240 +label.allday=\u7d42\u65e5\u306e\u30a4\u30d9\u30f3\u30c8 +label.time=\u6642\u9593 +label.details=\u8a73\u7d30 +label.documents=\u6587\u66f8 +label.eventinfo=\u30a4\u30d9\u30f3\u30c8\u60c5\u5831 +label.startdate=\u958b\u59cb\u65e5 +label.enddate=\u7d42\u4e86\u65e5 +label.relatedcontent=\u95a2\u9023\u30b3\u30f3\u30c6\u30f3\u30c4 +label.docfolder=\u6587\u66f8\u30d5\u30a9\u30eb\u30c0 +label.recurrence=\u5b9a\u671f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_nb.properties new file mode 100755 index 0000000000..6876fa7231 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_nb.properties @@ -0,0 +1,12 @@ +label.what=Hva +label.location=Hvor +label.allday=Heldagshendelse +label.time=Tid +label.details=Detaljer +label.documents=Dokumenter +label.eventinfo=Hendelsesinformasjon +label.startdate=Startdato +label.enddate=Sluttdato +label.relatedcontent=Beslektet innhold +label.docfolder=Dokumentmappe +label.recurrence=Regelmessighet diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_nl.properties new file mode 100755 index 0000000000..ab1decd6ca --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_nl.properties @@ -0,0 +1,12 @@ +label.what=Wat +label.location=Waar +label.allday=Gebeurtenis die gehele dag duurt +label.time=Tijd +label.details=Details +label.documents=Documenten +label.eventinfo=Informatie over gebeurtenis +label.startdate=Begindatum +label.enddate=Einddatum +label.relatedcontent=Verwante content +label.docfolder=Documentenmap +label.recurrence=Herhaling diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_pt_BR.properties new file mode 100644 index 0000000000..96fdc1f84a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_pt_BR.properties @@ -0,0 +1,12 @@ +label.what=O que +label.location=Onde +label.allday=Evento de dia inteiro +label.time=Hora +label.details=Detalhes +label.documents=Documentos +label.eventinfo=Informa\u00e7\u00f5es sobre o evento +label.startdate=Data de in\u00edcio +label.enddate=Data de t\u00e9rmino +label.relatedcontent=Conte\u00fado relacionado +label.docfolder=Pasta de documento +label.recurrence=Recorr\u00eancia diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_ru.properties new file mode 100755 index 0000000000..b78dbd9dd6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_ru.properties @@ -0,0 +1,12 @@ +label.what=\u0427\u0442\u043e +label.location=\u0413\u0434\u0435 +label.allday=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430 \u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c +label.time=\u0412\u0440\u0435\u043c\u044f +label.details=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f +label.documents=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b +label.eventinfo=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 +label.startdate=\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 +label.enddate=\u0414\u0430\u0442\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f +label.relatedcontent=\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 +label.docfolder=\u041f\u0430\u043f\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +label.recurrence=\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_zh_CN.properties new file mode 100755 index 0000000000..4f2bcbb0a3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/info.get_zh_CN.properties @@ -0,0 +1,12 @@ +label.what=\u5185\u5bb9 +label.location=\u5730\u70b9 +label.allday=\u5168\u5929\u4e8b\u4ef6 +label.time=\u65f6\u95f4 +label.details=\u8be6\u7ec6\u4fe1\u606f +label.documents=\u6587\u6863 +label.eventinfo=\u4e8b\u4ef6\u4fe1\u606f +label.startdate=\u5f00\u59cb\u65e5\u671f +label.enddate=\u7ed3\u675f\u65e5\u671f +label.relatedcontent=\u76f8\u5173\u5185\u5bb9 +label.docfolder=\u6587\u6863\u6587\u4ef6\u5939 +label.recurrence=\u91cd\u590d\u5468\u671f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.desc.xml new file mode 100644 index 0000000000..dd049e7de6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.desc.xml @@ -0,0 +1,5 @@ + + calendar-toolbar + Calendar: Toolbar + /components/calendar/toolbar + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.head.ftl new file mode 100644 index 0000000000..030c95af47 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.html.ftl new file mode 100644 index 0000000000..261ade2185 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.html.ftl @@ -0,0 +1,66 @@ +<#assign el=args.htmlid?html> + +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/calendar/toolbar.css" group="calendar"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/calendar/toolbar.js" group="calendar"/> + + +<@markup id="widgets"> + <@createWidgets group="calendar"/> + <@inlineScript group="calendar"> + Alfresco.util.relToTarget("${el}-body"); + Alfresco.util.addMessages(${messages}, "Alfresco.CalendarToolbar"); + + + +<@markup id="html"> + <@uniqueIdDiv> +
+
+ <#if role = "SiteCollaborator" || role = "SiteManager"> +
+
+ +
+
+   + +
+ + <#if viewToolbarNav > + + + <#if viewToolbarViewCount> +
+ <#-- Don't insert linefeeds between these tags --> + ${day!""}${week!""}${month!""}${agenda!""} +
+ + <#if viewToolbarNav > + + +
+
+ + + + + +
+ <@markup id="iCalAction"> + + +
+
+
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.js new file mode 100644 index 0000000000..24f74e318d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.js @@ -0,0 +1,67 @@ + + + +function main() +{ + // Check whether the current user is a member of the site first and then if they are + // the role of the user - until there is a method of doing this check on the web tier + // we have to make a call back to the repo to get this information. + + var role = null; + var obj = null; + var json = remote.call("/api/sites/" + page.url.templateArgs.site + "/memberships/" + encodeURIComponent(user.name)); + if (json.status == 200) + { + obj = JSON.parse(json); + } + if (obj) + { + role = obj.role; + } + + // set role appropriately + if (role !== null) + { + model.role = role; + } + else + { + model.role = "Consumer"; // default to safe option + } + model.viewType = CalendarScriptHelper.getView(); // returns current view after checking for enabled views + model.viewToolbarViews = CalendarScriptHelper.listViews(); // returns a array of enabled views + model.viewToolbarViewCount = CalendarScriptHelper.countViews() > 1; // if only one view, hide view switching buttons + model.viewToolbarNav = (model.enabledViews.day || model.enabledViews.week || model.enabledViews.month) // see if the Today, Previous and Next navigation items are relevant + + var enabledViewList = []; + if (model.enabledViews.day) + { + model.day = ''; + enabledViewList.push("\"day\""); + } + if (model.enabledViews.week) + { + model.week =''; + enabledViewList.push("\"week\""); + } + if (model.enabledViews.month) + { + model.month =''; + enabledViewList.push("\"month\""); + } + if (model.enabledViews.agenda) + { + model.agenda =''; + enabledViewList.push("\"agenda\""); + } + + var calendarToolbar = { + id : "CalendarToolbar", + name : "Alfresco.CalendarToolbar", + assignTo : "calendarToolbar", + initArgs : ["\"" + args.htmlid + "\"", enabledViewList, "\"" + model.defaultView + "\""] + }; + model.widgets = [calendarToolbar]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.properties new file mode 100644 index 0000000000..3fb3122479 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get.properties @@ -0,0 +1,11 @@ +button.add-event=Add Event +button.ical=iCal Feed +button.today=Today +button.previous=\u25c0 +button.day=Day +button.week=Week +button.month=Month +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Show all hours +button.work-hours.working=Show working hours diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_de.properties new file mode 100755 index 0000000000..7cf19e2d97 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_de.properties @@ -0,0 +1,11 @@ +button.add-event=Ereignis hinzuf\u00fcgen +button.ical=iCal-Feed +button.today=Heute +button.previous=\u25c0 +button.day=Tag +button.week=Woche +button.month=Monat +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Zeige alle Stunden +button.work-hours.working=Zeige alle Arbeitsstunden diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_es.properties new file mode 100755 index 0000000000..bf233e45d7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_es.properties @@ -0,0 +1,11 @@ +button.add-event=A\u00f1adir un evento +button.ical=iCal +button.today=Hoy +button.previous=\u25c0 +button.day=D\u00eda +button.week=Semana +button.month=Mes +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Mostrar todas las horas +button.work-hours.working=Mostrar horas de trabajo diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_fr.properties new file mode 100755 index 0000000000..267643450b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_fr.properties @@ -0,0 +1,11 @@ +button.add-event=Ajouter un \u00e9v\u00e9nement +button.ical=Flux iCal +button.today=Aujourd'hui +button.previous=\u25c0 +button.day=Jour +button.week=Semaine +button.month=Mois +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Montrer toutes les heures +button.work-hours.working=Montrer les heures de travail diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_it.properties new file mode 100755 index 0000000000..6a9ada33ab --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_it.properties @@ -0,0 +1,11 @@ +button.add-event=Aggiungi evento +button.ical=Feed iCal +button.today=Oggi +button.previous=\u25c0 +button.day=Giorno +button.week=Settimana +button.month=Mese +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Mostra tutte le ore +button.work-hours.working=Mostra ore lavorative diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_ja.properties new file mode 100755 index 0000000000..0e522c9a26 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_ja.properties @@ -0,0 +1,11 @@ +button.add-event=\u30a4\u30d9\u30f3\u30c8\u306e\u8ffd\u52a0 +button.ical=iCal \u30d5\u30a3\u30fc\u30c9 +button.today=\u4eca\u65e5 +button.previous=\u25c0 +button.day=\u65e5 +button.week=\u9031 +button.month=\u6708 +button.agenda=\u4e88\u5b9a\u30ea\u30b9\u30c8 +button.next=\u25b6 +button.work-hours.all=\u3059\u3079\u3066\u306e\u6642\u9593\u3092\u8868\u793a +button.work-hours.working=\u55b6\u696d\u6642\u9593\u3092\u8868\u793a diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_nb.properties new file mode 100755 index 0000000000..1a1e7cdaae --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_nb.properties @@ -0,0 +1,11 @@ +button.add-event=Legg til hendelse +button.ical=iCal-feed +button.today=I dag +button.previous=\u25c0 +button.day=Dag +button.week=Uke +button.month=M\u00e5ned +button.agenda=Saksliste +button.next=\u25b6 +button.work-hours.all=Vis alle timer +button.work-hours.working=Vis arbeidstimer diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_nl.properties new file mode 100755 index 0000000000..d1083a7c35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_nl.properties @@ -0,0 +1,11 @@ +button.add-event=Gebeurtenis toevoegen +button.ical=iCal-feed +button.today=Vandaag +button.previous=\u25c0 +button.day=Dag +button.week=Week +button.month=Maand +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Alle uren weergeven +button.work-hours.working=Werkuren weergeven diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_pt_BR.properties new file mode 100644 index 0000000000..566031da40 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_pt_BR.properties @@ -0,0 +1,11 @@ +button.add-event=Adicionar evento +button.ical=Feed iCal +button.today=Hoje +button.previous=\u25c0 +button.day=Dia +button.week=Semana +button.month=M\u00eas +button.agenda=Agenda +button.next=\u25b6 +button.work-hours.all=Mostrar todas as horas +button.work-hours.working=Mostrar horas de trabalho diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_ru.properties new file mode 100755 index 0000000000..c90dbd3a10 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_ru.properties @@ -0,0 +1,11 @@ +button.add-event=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +button.ical=\u041a\u0430\u043d\u0430\u043b iCal +button.today=\u0421\u0435\u0433\u043e\u0434\u043d\u044f +button.previous=\u25c0 +button.day=\u0414\u0435\u043d\u044c +button.week=\u041d\u0435\u0434\u0435\u043b\u044f +button.month=\u041c\u0435\u0441\u044f\u0446 +button.agenda=\u041f\u043e\u0432\u0435\u0441\u0442\u043a\u0430 +button.next=\u25b6 +button.work-hours.all=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0430\u0441\u044b +button.work-hours.working=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0447\u0430\u0441\u044b diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_zh_CN.properties new file mode 100755 index 0000000000..cbe6385ca0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/toolbar.get_zh_CN.properties @@ -0,0 +1,11 @@ +button.add-event=\u6dfb\u52a0\u4e8b\u4ef6 +button.ical=iCal \u8ba2\u9605\u6e90 +button.today=\u4eca\u5929 +button.previous=\u25c0 +button.day=\u5929 +button.week=\u5468 +button.month=\u6708 +button.agenda=\u65e5\u7a0b +button.next=\u25b6 +button.work-hours.all=\u663e\u793a\u6240\u6709\u65f6\u95f4 +button.work-hours.working=\u663e\u793a\u5de5\u4f5c\u65f6\u95f4 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.config.xml new file mode 100644 index 0000000000..3c9fb878fd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.config.xml @@ -0,0 +1,18 @@ + + 100 + "agendaWeek" + "agendaDay" + "month" + "variable" + true + true + 0 + 7 + 19 + 0 + 24 + 1.5 + 30 + false + false + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.desc.xml new file mode 100644 index 0000000000..1bd92e62de --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.desc.xml @@ -0,0 +1,5 @@ + + view + Calendar: View Component + /components/calendar/view + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.head.ftl new file mode 100644 index 0000000000..030c95af47 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.html.ftl new file mode 100644 index 0000000000..b6289e4028 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.html.ftl @@ -0,0 +1,61 @@ +<#assign view=context.properties.filteredView /> + +<@markup id="css" > + <#-- CSS Dependencies --> + <#if (view !='agenda')> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/jquery/fullcalendar/fullcalendar.css" group="calendar"/> + + <@link rel="stylesheet" type="text/css" href="${url.context}/res/modules/taglibrary/taglibrary.css" group="calendar"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/modules/simple-dialog.js" group="calendar"/> + <@script type="text/javascript" src="${url.context}/res/components/calendar/calendar-view.js" group="calendar"/> + <#if (view=='agenda')> + <@script type="text/javascript" src="${url.context}/res/components/calendar/calendar-view-${context.properties.filteredView?js_string}.js" group="calendar"/> + <#else> + <@script type="text/javascript" src="${url.context}/res/jquery/jquery-1.12.4.min.js" group="calendar"/> + <@script type="text/javascript" src="${url.context}/res/jquery/fullcalendar/fullcalendar.js" group="calendar"/> + <@script type="text/javascript" src="${url.context}/res/components/calendar/calendar-view-fullCalendar.js" group="calendar"/> + + <@script type="text/javascript" src="${url.context}/res/components/calendar/eventinfo.js" group="calendar"/> + <@script type="text/javascript" src="${url.context}/res/modules/taglibrary/taglibrary.js" group="calendar"/> + + +<@markup id="widgets"> + <@createWidgets group="calendar"/> + <@inlineScript group="calendar"> + Alfresco.util.addMessages(${messages}, "Alfresco.EventInfo"); + + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid?html> + <#if (viewArgs.viewType=='agenda')> + + +

 

+
+
+
+

${msg("agenda.initial-text")}

+
+
+
+ + + <#else> + + + +
+
+
+
+ + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.js new file mode 100644 index 0000000000..5ca83cddb2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.js @@ -0,0 +1,47 @@ + + + +function main() +{ + model.viewArgs = CalendarScriptHelper.initView(); + + // Widget instantiation metadata... + var calendarView = { + id : "CalendarView", + name : "Alfresco.CalendarView", + assignTo : "calendarView", + initArgs : ["\"" + args.htmlid + "Container\""], + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + view : model.viewArgs.viewType, + id : args.htmlid + "View", + startDate : model.viewArgs.view.startDate, + endDate : model.viewArgs.view.endDate, + titleDate : model.viewArgs.view.titleDate, + permitToCreateEvents : model.viewArgs.permitToCreateEvents, + truncateLength : parseInt(100), + fcOpts : + { + weekView: "agendaWeek", + dayView: "agendaDay", + monthView: "month", + weekMode: "variable", + weekends: true, + allDaySlot: true, + firstHour: parseInt(0), + minTimeWorkHours: parseInt(7), + maxTimeWorkHours: parseInt(19), + minTimeToggle: parseInt(0), + maxTimeToggle: parseInt(24), + aspectRatio: parseFloat(1.5), + slotMinutes: parseInt(30), + disableDragging: false, + disableResizing: false + } + } + }; + model.widgets = [calendarView]; +} + +main(); + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.properties new file mode 100644 index 0000000000..742b8d51a4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get.properties @@ -0,0 +1,72 @@ +label.day=Day +label.week=Week +label.month=Month +label.agenda=Agenda +label.all-tags=All +label.all-day=All day +label.hours=Hours +label.click-for-early-hours=Click here to toggle early hours +label.show-more=+ More v +label.show-less=Show Less ^ +label.tagged-with=Tagged with +label.add-event=Add event + +message.load.failure=Could not load calendar data +message.edited.success=Event updated +message.edited.failure=Event update failed +message.deleted.success=Event deleted +message.deleted.failure=Event delete failed +message.created.success=Event created +message.created.failure=Event creation failed +message.no-agenda-items=There are no upcoming events in your agenda +message.confirm.delete.title=Delete Event +message.confirm.delete=Are you sure you want to delete ''{0}'' on {1}? +message.invalid-date=Event end date cannot be before start date. +message.delete.success=''{0}'' was deleted +message.delete.failure=Could not delete ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Agenda for {0} to {1} +# {0} = number of events (1 based integer) +title.count.single=({0} event) +title.count.multiple=({0} events) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=show more +agenda.truncate.show-less=show less +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Event info +agenda.action.info.tooltip=View +agenda.action.edit.label=Edit event +agenda.action.edit.tooltip=Edit +agenda.action.delete.lable=Delete event +agenda.action.delete.tooltip=Delete + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Show Earlier Events +agenda.next=Show Later Events + +#Text used in the calendar view when there are no events +agenda.initial-text=Loading events... +agenda.no-events=There are no events for this period. +#{0} = link start, {1} = link end +agenda.add-events={0}Add an event{1} to this calendar. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=Requested site does not exist or you don't have permissions to access it. +calendar.site-does-not-exist-title=Site ''{0}'' does not exist or you don''t have permissions to access it. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_de.properties new file mode 100755 index 0000000000..a46463ffb3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_de.properties @@ -0,0 +1,72 @@ +label.day=Tag +label.week=Woche +label.month=Monat +label.agenda=Agenda +label.all-tags=Alle +label.all-day=Ganzt\u00e4gig +label.hours=Stunden +label.click-for-early-hours=Hier klicken um fr\u00fchere Stunden ein- / auszuschalten +label.show-more=+ Mehr v +label.show-less=Weniger anzeigen ^ +label.tagged-with=Getagged mit +label.add-event=Ereignis hinzuf\u00fcgen + +message.load.failure=Laden der Kalenderdaten nicht m\u00f6glich +message.edited.success=Ereignis aktualisiert +message.edited.failure=Aktualisierten des Ereignisses fehlgeschlagen +message.deleted.success=Ereignis gel\u00f6scht +message.deleted.failure=L\u00f6schen des Ereignisses fehlgeschlagen +message.created.success=Ereignis erstellt +message.created.failure=Erstellen des Ereignisses fehlgeschlagen +message.no-agenda-items=Keine anstehenden Ereignisse in Ihrer Agenda +message.confirm.delete.title=Ereignis l\u00f6schen +message.confirm.delete=M\u00f6chten Sie ''{0}'' am {1} wirklich l\u00f6schen? +message.invalid-date=Das Enddatum kann nicht vor dem Startdatum liegen. +message.delete.success=''{0}'' wurde gel\u00f6scht +message.delete.failure=''{0}'' konnte nicht gel\u00f6scht werden + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Kalender f\u00fcr {0} bis {1} +# {0} = number of events (1 based integer) +title.count.single=({0} Ereignisse) +title.count.multiple=({0} Ereignisse) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=Mehr anzeigen +agenda.truncate.show-less=Weniger anzeigen +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Ereignisinfo +agenda.action.info.tooltip=Anzeigen +agenda.action.edit.label=Ereignis bearbeiten +agenda.action.edit.tooltip=Bearbeiten +agenda.action.delete.lable=Ereignis l\u00f6schen +agenda.action.delete.tooltip=L\u00f6schen + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Fr\u00fchere Ereignisse anzeigen +agenda.next=Sp\u00e4tere Ereignisse anzeigen + +#Text used in the calendar view when there are no events +agenda.initial-text=Ereignisse laden... +agenda.no-events=F\u00fcr diesen Zeitraum gibt es keine Ereignisse. +#{0} = link start, {1} = link end +agenda.add-events={0}Ein Ereignis {1} zu diesem Kalender hinzuf\u00fcgen. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=Die angeforderte Site existiert nicht oder Sie haben nicht die n\u00f6tigen Berechtigungen zum Zugriff darauf. +calendar.site-does-not-exist-title=Die Site ''{0}'' existiert nicht oder Sie haben nicht die n\u00f6tigen Berechtigungen zum Zugriff darauf. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_es.properties new file mode 100755 index 0000000000..37a7c6051e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_es.properties @@ -0,0 +1,72 @@ +label.day=D\u00eda +label.week=Semana +label.month=Mes +label.agenda=Agenda +label.all-tags=Todos +label.all-day=D\u00eda completo +label.hours=Horas +label.click-for-early-hours=Pulse aqu\u00ed para cambiar a horas anteriores +label.show-more=+ Mostrar m\u00e1s v +label.show-less=Mostrar menos ^ +label.tagged-with=Etiquetado como +label.add-event=A\u00f1adir un evento + +message.load.failure=No se pudieron cargar los datos del calendario +message.edited.success=Evento actualizado +message.edited.failure=No se pudo actualizar el evento +message.deleted.success=Evento eliminado +message.deleted.failure=No se pudo eliminar el evento +message.created.success=Evento creado +message.created.failure=No se pudo crear el evento +message.no-agenda-items=No hay eventos pr\u00f3ximos en su agenda +message.confirm.delete.title=Eliminar evento +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar ''{0}'' en {1}? +message.invalid-date=La fecha final del evento no puede ser anterior a la fecha de inicio. +message.delete.success=Se ha eliminado ''{0}'' +message.delete.failure=No se ha podido eliminar ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Agenda de {0} a {1} +# {0} = number of events (1 based integer) +title.count.single=({0} evento) +title.count.multiple=({0} eventos) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=mostrar m\u00e1s +agenda.truncate.show-less=mostrar menos +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Informaci\u00f3n del evento +agenda.action.info.tooltip=Ver +agenda.action.edit.label=Editar evento +agenda.action.edit.tooltip=Editar +agenda.action.delete.lable=Eliminar evento +agenda.action.delete.tooltip=Eliminar + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Mostrar eventos anteriores +agenda.next=Mostrar eventos posteriores + +#Text used in the calendar view when there are no events +agenda.initial-text=Cargando eventos... +agenda.no-events=No hay eventos en este periodo. +#{0} = link start, {1} = link end +agenda.add-events={0}A\u00f1ada un evento{1} a este calendario. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=El sitio solicitado no existe o no tiene permisos para accederlo. +calendar.site-does-not-exist-title=El sitio ''{0}'' no existe o no tiene permisos para accederlo. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_fr.properties new file mode 100755 index 0000000000..b59cabe67a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_fr.properties @@ -0,0 +1,72 @@ +label.day=Jour +label.week=Semaine +label.month=Mois +label.agenda=Agenda +label.all-tags=Tout +label.all-day=Journ\u00e9e enti\u00e8re +label.hours=Heures +label.click-for-early-hours=Cliquer ici pour afficher/cacher les heures pr\u00e9c\u00e9dentes +label.show-more=+ Plus... v +label.show-less=Montrer moins ^ +label.tagged-with=Tagg\u00e9 avec +label.add-event=Ajouter un \u00e9v\u00e9nement + +message.load.failure=Echec du chargement des informations du calendrier +message.edited.success=\u00c9v\u00e9nement mis \u00e0 jour +message.edited.failure=Echec de la mise \u00e0 jour de l'\u00e9v\u00e9nement +message.deleted.success=\u00c9v\u00e9nement supprim\u00e9 +message.deleted.failure=Echec de la suppression de l'\u00e9v\u00e9nement +message.created.success=\u00c9v\u00e9nement cr\u00e9\u00e9 +message.created.failure=Echec de la cr\u00e9ation de l'\u00e9v\u00e9nement +message.no-agenda-items=Il n'y a pas d'\u00e9v\u00e9nement \u00e0 venir dans votre agenda +message.confirm.delete.title=Supprimer l'\u00e9v\u00e9nement +message.confirm.delete=Etes-vous s\u00fbr de vouloir supprimer ''{0}'' de {1} ? +message.invalid-date=La date de fin ne peut \u00eatre ant\u00e9rieure \u00e0 celle de d\u00e9but. +message.delete.success=''{0}'' a \u00e9t\u00e9 supprim\u00e9 +message.delete.failure=Impossible de supprimer ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Agenda pour {0} \u00e0 {1} +# {0} = number of events (1 based integer) +title.count.single=({0} \u00e9v\u00e9nement) +title.count.multiple=({0} \u00e9v\u00e9nements) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=montrer plus +agenda.truncate.show-less=montrer moins +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Infos sur l'\u00e9v\u00e9nement +agenda.action.info.tooltip=Afficher +agenda.action.edit.label=Modifier l'\u00e9v\u00e9nement +agenda.action.edit.tooltip=Modifier +agenda.action.delete.lable=Supprimer l'\u00e9v\u00e9nement +agenda.action.delete.tooltip=Supprimer + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Afficher les \u00e9v\u00e9nements pr\u00e9c\u00e9dents +agenda.next=Afficher les \u00e9v\u00e9nements suivants + +#Text used in the calendar view when there are no events +agenda.initial-text=Chargement des \u00e9v\u00e9nements... +agenda.no-events=Il n'y a pas d'\u00e9v\u00e9nement pour cette p\u00e9riode. +#{0} = link start, {1} = link end +agenda.add-events={0} Ajouter un \u00e9v\u00e9nement {1} \u00e0 ce calendrier. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=Le site requis n'existe pas ou vous ne disposez pas des autorisations pour y acc\u00e9der. +calendar.site-does-not-exist-title=Le site ''{0}'' n''existe pas ou vous ne disposez pas des autorisations pour y acc\u00e9der. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_it.properties new file mode 100755 index 0000000000..22971a8509 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_it.properties @@ -0,0 +1,72 @@ +label.day=Giorno +label.week=Settimana +label.month=Mese +label.agenda=Agenda +label.all-tags=Tutti +label.all-day=Giornata intera +label.hours=Ore +label.click-for-early-hours=Fare clic qui per mostrare o nascondere le prime ore del giorno +label.show-more=+ Mostra v +label.show-less=Nascondi ^ +label.tagged-with=Con tag +label.add-event=Aggiungi evento + +message.load.failure=Impossibile caricare i dati del calendario +message.edited.success=Evento aggiornato +message.edited.failure=Aggiornamento dell'evento non riuscito +message.deleted.success=Evento eliminato +message.deleted.failure=Eliminazione dell'evento non riuscita +message.created.success=Evento creato +message.created.failure=Creazione dell'evento non riuscita +message.no-agenda-items=Non ci sono eventi imminenti nell'agenda +message.confirm.delete.title=Elimina evento +message.confirm.delete=Eliminare ''{0}'' su {1}? +message.invalid-date=La data di fine dell'evento non pu\u00f2 essere anteriore alla data di inizio. +message.delete.success=''{0}'' \u00e8 stato eliminato +message.delete.failure=Impossibile eliminare ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Agenda dal {0} al {1} +# {0} = number of events (1 based integer) +title.count.single=({0} evento) +title.count.multiple=({0} eventi) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=mostra altro +agenda.truncate.show-less=nascondi +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Informazioni sull'evento +agenda.action.info.tooltip=Visualizza +agenda.action.edit.label=Modifica evento +agenda.action.edit.tooltip=Modifica +agenda.action.delete.lable=Elimina evento +agenda.action.delete.tooltip=Elimina + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Mostra eventi meno recenti +agenda.next=Mostra eventi pi\u00f9 recenti + +#Text used in the calendar view when there are no events +agenda.initial-text=Caricamento eventi... +agenda.no-events=Non sono disponibili eventi per il periodo specificato. +#{0} = link start, {1} = link end +agenda.add-events={0} Aggiungere un evento{1} al calendario. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=Il sito non esiste o non si dispone delle autorizzazioni necessarie per accedervi. +calendar.site-does-not-exist-title=Il sito ''{0}'' non esiste o non si dispone delle autorizzazioni necessarie per accedervi. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_ja.properties new file mode 100755 index 0000000000..22564c038f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_ja.properties @@ -0,0 +1,72 @@ +label.day=\u65e5 +label.week=\u9031 +label.month=\u6708 +label.agenda=\u4e88\u5b9a\u30ea\u30b9\u30c8 +label.all-tags=\u3059\u3079\u3066 +label.all-day=\u7d42\u65e5 +label.hours=\u6642 +label.click-for-early-hours=\u65e9\u3044\u6642\u9593\u5e2f\u3092\u8868\u793a +label.show-more=&# 43; \u8a73\u7d30\u3092\u8868\u793av +label.show-less=\u8a73\u7d30\u3092\u96a0\u3059 ^ +label.tagged-with=\u30bf\u30b0\u4ed8\u304d +label.add-event=\u30a4\u30d9\u30f3\u30c8\u306e\u8ffd\u52a0 + +message.load.failure=\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f +message.edited.success=\u30a4\u30d9\u30f3\u30c8\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f +message.edited.failure=\u30a4\u30d9\u30f3\u30c8\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.deleted.success=\u30a4\u30d9\u30f3\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.deleted.failure=\u30a4\u30d9\u30f3\u30c8\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.created.success=\u30a4\u30d9\u30f3\u30c8\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f +message.created.failure=\u30a4\u30d9\u30f3\u30c8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.no-agenda-items=\u4e88\u5b9a\u3055\u308c\u3066\u3044\u308b\u30a4\u30d9\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093 +message.confirm.delete.title=\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664 +message.confirm.delete={1} \u306e ''{0}'' \u3092 \u524a\u9664\u3057\u307e\u3059\u304b? +message.invalid-date=\u30a4\u30d9\u30f3\u30c8\u306e\u7d42\u4e86\u65e5\u306b\u958b\u59cb\u65e5\u3088\u308a\u524d\u306e\u65e5\u4ed8\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 +message.delete.success=''{0}'' \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda={0}\u301c{1} \u306e\u4e88\u5b9a\u30ea\u30b9\u30c8 +# {0} = number of events (1 based integer) +title.count.single=\uff08{0} \u4ef6\u306e\u30a4\u30d9\u30f3\u30c8\uff09 +title.count.multiple=\uff08{0} \u4ef6\u306e\u30a4\u30d9\u30f3\u30c8\uff09 +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=\u8a73\u7d30\u3092\u8868\u793a +agenda.truncate.show-less=\u8a73\u7d30\u3092\u96a0\u3059 +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=\u30a4\u30d9\u30f3\u30c8\u60c5\u5831 +agenda.action.info.tooltip=\u8868\u793a +agenda.action.edit.label=\u30a4\u30d9\u30f3\u30c8\u306e\u7de8\u96c6 +agenda.action.edit.tooltip=\u7de8\u96c6 +agenda.action.delete.lable=\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664 +agenda.action.delete.tooltip=\u524a\u9664 + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=\u524d\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u8868\u793a +agenda.next=\u5148\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u8868\u793a + +#Text used in the calendar view when there are no events +agenda.initial-text=\u30a4\u30d9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059... +agenda.no-events=\u3053\u306e\u671f\u9593\u306e\u30a4\u30d9\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +#{0} = link start, {1} = link end +agenda.add-events=\u3053\u306e\u30ab\u30ec\u30f3\u30c0\u306b{0}\u30a4\u30d9\u30f3\u30c8\u3092\u8ffd\u52a0{1}\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=yyyy \u5e74 m \u6708 d \u65e5 dddd +fullCalendar.titleFormat.month=yyyy \u5e74 M \u6708 +fullCalendar.titleFormat.week=yyyy \u5e74 M \u6708 d \u65e5 + +calendar.site-does-not-exist=\u30ea\u30af\u30a8\u30b9\u30c8\u3057\u305f\u30b5\u30a4\u30c8\u306f\u5b58\u5728\u3057\u306a\u3044\u304b\u3001\u305d\u306e\u30b5\u30a4\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +calendar.site-does-not-exist-title=\u30b5\u30a4\u30c8 ''{0}'' \u306f\u5b58\u5728\u3057\u306a\u3044\u304b\u3001\u305d\u306e\u30b5\u30a4\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_nb.properties new file mode 100755 index 0000000000..0ecca20331 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_nb.properties @@ -0,0 +1,72 @@ +label.day=Dag +label.week=Uke +label.month=M\u00e5ned +label.agenda=Saksliste +label.all-tags=Alle +label.all-day=Hele dagen +label.hours=Timer +label.click-for-early-hours=Klikk her for \u00e5 veksle tidlige timer +label.show-more=+ Mer v +label.show-less=Vis mindre ^ +label.tagged-with=Merket med +label.add-event=Legg til hendelse + +message.load.failure=Kunne ikke laste kalenderdata +message.edited.success=Hendelse oppdatert +message.edited.failure=Oppdatering av hendelse mislyktes +message.deleted.success=Hendelse slettet +message.deleted.failure=Sletting av hendelse mislyktes +message.created.success=Hendelse opprettet +message.created.failure=Opprettelse av hendelse mislyktes +message.no-agenda-items=Det er ingen kommende hendelser p\u00e5 sakslisten din +message.confirm.delete.title=Slett hendelse +message.confirm.delete=Er du sikker p\u00e5 at du vil slette ''{0}'' p\u00e5 {1}? +message.invalid-date=Sluttdato for hendelse kan ikke komme f\u00f8r startdatoen. +message.delete.success=''{0}'' ble slettet +message.delete.failure=Kan ikke slette ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Saksliste for {0} til {1} +# {0} = number of events (1 based integer) +title.count.single=({0} hendelse) +title.count.multiple=({0} hendelser) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=vis mer +agenda.truncate.show-less=vis mindre +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Hendelsesinfo +agenda.action.info.tooltip=Vis +agenda.action.edit.label=Rediger hendelse +agenda.action.edit.tooltip=Rediger +agenda.action.delete.lable=Slett hendelse +agenda.action.delete.tooltip=Slett + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Vis tidligere hendelser +agenda.next=Vis senere hendelser + +#Text used in the calendar view when there are no events +agenda.initial-text=Laster hendelser... +agenda.no-events=Det er ingen hendelser for denne perioden. +#{0} = link start, {1} = link end +agenda.add-events={0}Legg til en hendelse{1} i denne kalenderen. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=TT.mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=Det forespurte omr\u00e5det finnes ikke, eller du har ikke tillatelsene som trengs, for \u00e5 kunne g\u00e5 til det. +calendar.site-does-not-exist-title=Omr\u00e5det ''{0}'' finnes ikke, eller du har ikke tillatelsene som trengs, for \u00e5 kunne g\u00e5 til det. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_nl.properties new file mode 100755 index 0000000000..c282144a23 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_nl.properties @@ -0,0 +1,72 @@ +label.day=Dag +label.week=Week +label.month=Maand +label.agenda=Agenda +label.all-tags=Alle +label.all-day=Gehele dag +label.hours=Uur +label.click-for-early-hours=Klik hier om vroege uren weer te geven +label.show-more=+ Meer of +label.show-less=Minder weergeven ^ +label.tagged-with=Getagd met +label.add-event=Gebeurtenis toevoegen + +message.load.failure=Kan agendagegevens niet laden +message.edited.success=Gebeurtenis bijgewerkt +message.edited.failure=Bijwerken van gebeurtenis mislukt +message.deleted.success=Gebeurtenis verwijderd +message.deleted.failure=Verwijderen van gebeurtenis mislukt +message.created.success=Gebeurtenis gemaakt +message.created.failure=Maken van gebeurtenis mislukt +message.no-agenda-items=Uw agenda bevat geen aanstaande gebeurtenissen +message.confirm.delete.title=Gebeurtenis verwijderen +message.confirm.delete=Weet u zeker dat u ''{0}'' op {1} wilt verwijderen? +message.invalid-date=Einddatum van gebeurtenis mag niet vallen v\u00f3\u00f3r begindatum. +message.delete.success=''{0}'' is verwijderd +message.delete.failure=Kan ''{0}'' niet verwijderen + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Agenda voor {0} tot {1} +# {0} = number of events (1 based integer) +title.count.single=({0} gebeurtenis) +title.count.multiple=({0} gebeurtenissen) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=meer weergeven +agenda.truncate.show-less=minder weergeven +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Gebeurtenisgegevens +agenda.action.info.tooltip=Weergeven +agenda.action.edit.label=Gebeurtenis bewerken +agenda.action.edit.tooltip=Bewerken +agenda.action.delete.lable=Gebeurtenis verwijderen +agenda.action.delete.tooltip=Verwijderen + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Eerdere gebeurtenissen weergeven +agenda.next=Latere gebeurtenissen weergeven + +#Text used in the calendar view when there are no events +agenda.initial-text=Gebeurtenissen laden... +agenda.no-events=Deze periode bevat geen gebeurtenissen. +#{0} = link start, {1} = link end +agenda.add-events={0}Een gebeurtenis{1} toevoegen aan deze kalender. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=UU:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM jjjj +fullCalendar.titleFormat.month=MMMM jjjj +fullCalendar.titleFormat.week=d MMMM jjjj + +calendar.site-does-not-exist=Aangevraagde site bestaat niet of u hebt geen machtigingen om deze te openen. +calendar.site-does-not-exist-title=Site ''{0}'' bestaat niet of u hebt geen machtigingen om deze te openen. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_pt_BR.properties new file mode 100644 index 0000000000..06e251691f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_pt_BR.properties @@ -0,0 +1,72 @@ +label.day=Dia +label.week=Semana +label.month=M\u00eas +label.agenda=Agenda +label.all-tags=Tudo +label.all-day=O dia todo +label.hours=Horas +label.click-for-early-hours=Clique aqui para alternar as horas iniciais +label.show-more=+ Mais v +label.show-less=Mostrar menos ^ +label.tagged-with=Marcado com +label.add-event=Adicionar evento + +message.load.failure=N\u00e3o foi poss\u00edvel carregar os dados de calend\u00e1rio +message.edited.success=Evento atualizado +message.edited.failure=Falha na atualiza\u00e7\u00e3o do evento +message.deleted.success=Evento exclu\u00eddo +message.deleted.failure=Falha na exclus\u00e3o do evento +message.created.success=Evento criado +message.created.failure=Falha na cria\u00e7\u00e3o do evento +message.no-agenda-items=N\u00e3o h\u00e1 eventos futuros na sua agenda +message.confirm.delete.title=Excluir evento +message.confirm.delete=Tem certeza de que deseja excluir ''{0}'' em {1}? +message.invalid-date=A data do fim do evento n\u00e3o pode ser anterior \u00e0 data de in\u00edcio. +message.delete.success=''{0}'' foi exclu\u00eddo +message.delete.failure=N\u00e3o foi poss\u00edvel excluir ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=Agenda de {0} a {1} +# {0} = number of events (1 based integer) +title.count.single=({0} evento) +title.count.multiple=({0} eventos) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=mostrar mais +agenda.truncate.show-less=mostrar menos +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=Informa\u00e7\u00f5es sobre o evento +agenda.action.info.tooltip=Exibir +agenda.action.edit.label=Editar evento +agenda.action.edit.tooltip=Editar +agenda.action.delete.lable=Excluir evento +agenda.action.delete.tooltip=Excluir + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=Exibir eventos anteriores +agenda.next=Exibir eventos posteriores + +#Text used in the calendar view when there are no events +agenda.initial-text=Carregando eventos... +agenda.no-events=N\u00e3o h\u00e1 eventos para esse per\u00edodo. +#{0} = link start, {1} = link end +agenda.add-events={0}Adicionar um evento{1} a este calend\u00e1rio. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=O site solicitado n\u00e3o existe ou voc\u00ea n\u00e3o tem permiss\u00f5es para acess\u00e1-lo. +calendar.site-does-not-exist-title=O site ''{0}'' n\u00e3o existe ou voc\u00ea n\u00e3o tem permiss\u00f5es para acess\u00e1-lo. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_ru.properties new file mode 100755 index 0000000000..ba021d6d3b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_ru.properties @@ -0,0 +1,72 @@ +label.day=\u0414\u0435\u043d\u044c +label.week=\u041d\u0435\u0434\u0435\u043b\u044f +label.month=\u041c\u0435\u0441\u044f\u0446 +label.agenda=\u041f\u043e\u0432\u0435\u0441\u0442\u043a\u0430 +label.all-tags=\u0412\u0441\u0435 +label.all-day=\u0412\u0435\u0441\u044c \u0434\u0435\u043d\u044c +label.hours=\u0427\u0430\u0441\u044b +label.click-for-early-hours=\u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0435 \u0447\u0430\u0441\u044b +label.show-more=+ \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e v +label.show-less=\u041a\u0440\u0430\u0442\u043a\u043e ^ +label.tagged-with=\u0421 \u043c\u0435\u0442\u043a\u043e\u0439 +label.add-event=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 + +message.load.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f +message.edited.success=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e +message.edited.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +message.deleted.success=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043e +message.deleted.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +message.created.success=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043e +message.created.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +message.no-agenda-items=\u0412 \u0432\u0430\u0448\u0435\u0439 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0435 \u043d\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +message.confirm.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0432 {1}? +message.invalid-date=\u0414\u0430\u0442\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0430\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u0430. +message.delete.success=\u0423\u0434\u0430\u043b\u0435\u043d\u043e: ''{0}'' +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=\u041f\u043e\u0432\u0435\u0441\u0442\u043a\u0430 \u0434\u043d\u044f \u043d\u0430 {0} - {1} +# {0} = number of events (1 based integer) +title.count.single=({0} \u0441\u043e\u0431\u044b\u0442\u0438\u0435) +title.count.multiple=(\u0441\u043e\u0431\u044b\u0442\u0438\u0439: {0}) +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 +agenda.truncate.show-less=\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 +agenda.action.info.tooltip=\u0412\u0438\u0434 +agenda.action.edit.label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +agenda.action.edit.tooltip=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +agenda.action.delete.lable=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 +agenda.action.delete.tooltip=\u0423\u0434\u0430\u043b\u0438\u0442\u044c + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=\u0420\u0430\u043d\u044c\u0448\u0435 +agenda.next=\u041f\u043e\u0437\u0436\u0435 + +#Text used in the calendar view when there are no events +agenda.initial-text=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439... +agenda.no-events=\u041d\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. +#{0} = link start, {1} = link end +agenda.add-events={0} \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 {1} \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c. + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=\u0427\u0427:\u043c\u043c +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=\u0422\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u0441\u0430\u0439\u0442 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443. +calendar.site-does-not-exist-title=\u0421\u0430\u0439\u0442 ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_zh_CN.properties new file mode 100755 index 0000000000..0d24d31452 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/calendar/view.get_zh_CN.properties @@ -0,0 +1,72 @@ +label.day=\u5929 +label.week=\u5468 +label.month=\u6708 +label.agenda=\u65e5\u7a0b +label.all-tags=\u5168\u90e8 +label.all-day=\u5168\u5929 +label.hours=\u5c0f\u65f6 +label.click-for-early-hours=\u5355\u51fb\u6b64\u5904\u5207\u6362\u5230\u524d\u51e0\u4e2a\u5c0f\u65f6 +label.show-more=+ \u66f4\u591a v +label.show-less=\u663e\u793a\u66f4\u5c11 ^ +label.tagged-with=\u6807\u8bb0\u4e3a +label.add-event=\u6dfb\u52a0\u4e8b\u4ef6 + +message.load.failure=\u65e0\u6cd5\u52a0\u8f7d\u65e5\u5386\u6570\u636e +message.edited.success=\u4e8b\u4ef6\u5df2\u66f4\u65b0 +message.edited.failure=\u66f4\u65b0\u4e8b\u4ef6\u5931\u8d25 +message.deleted.success=\u4e8b\u4ef6\u5df2\u5220\u9664 +message.deleted.failure=\u5220\u9664\u4e8b\u4ef6\u5931\u8d25 +message.created.success=\u4e8b\u4ef6\u5df2\u521b\u5efa +message.created.failure=\u521b\u5efa\u4e8b\u4ef6\u5931\u8d25 +message.no-agenda-items=\u60a8\u7684\u65e5\u7a0b\u4e2d\u6ca1\u6709\u5373\u5c06\u5230\u6765\u7684\u4e8b\u4ef6 +message.confirm.delete.title=\u5220\u9664\u4e8b\u4ef6 +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 {1} \u4e0a\u7684 ''{0}''\uff1f +message.invalid-date=\u4e8b\u4ef6\u7ed3\u675f\u65e5\u671f\u4e0d\u80fd\u65e9\u4e8e\u5f00\u59cb\u65e5\u671f\u3002 +message.delete.success=\u5df2\u5220\u9664 ''{0}'' +message.delete.failure=\u65e0\u6cd5\u5220\u9664 ''{0}'' + +# {0} = start date - formatted with date-format.mediumDate, unless year matches {1} when date-format.mediumDateNoYear is used. +# {1} = end date - formatted with date-format.mediumDate +title.agenda=\u5bf9 {0} \u81f3 {1} \u7684\u65e5\u7a0b +# {0} = number of events (1 based integer) +title.count.single=\uff08{0} \u4e2a\u4e8b\u4ef6\uff09 +title.count.multiple=\uff08{0} \u4e2a\u4e8b\u4ef6\uff09 +title.count.none= + +# used by the agenda truncate property to format the description string +agenda.truncate.show-more=\u663e\u793a\u66f4\u591a +agenda.truncate.show-less=\u663e\u793a\u66f4\u5c11 +agenda.truncate.ellipsis=… + +# used as alt text for action logos (label isn't shown by default) +agenda.action.info.label=\u4e8b\u4ef6\u4fe1\u606f +agenda.action.info.tooltip=\u67e5\u770b +agenda.action.edit.label=\u7f16\u8f91\u4e8b\u4ef6 +agenda.action.edit.tooltip=\u7f16\u8f91 +agenda.action.delete.lable=\u5220\u9664\u4e8b\u4ef6 +agenda.action.delete.tooltip=\u5220\u9664 + +# Used for the add event links at top and bottom of agenda view. +agenda.previous=\u663e\u793a\u8f83\u65e9\u4e8b\u4ef6 +agenda.next=\u663e\u793a\u8f83\u665a\u4e8b\u4ef6 + +#Text used in the calendar view when there are no events +agenda.initial-text=\u4e8b\u4ef6\u52a0\u8f7d\u4e2d... +agenda.no-events=\u6b64\u671f\u95f4\u65e0\u4e8b\u4ef6\u3002 +#{0} = link start, {1} = link end +agenda.add-events={0}\u6dfb\u52a0\u4e00\u4e2a\u4e8b\u4ef6{1}\u5230\u6b64\u65e5\u5386\u3002 + +# See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for details on available options +fullCalendar.axisFormat=HH:mm +fullCalendar.columnFormat.day= +fullCalendar.columnFormat.month=ddd +fullCalendar.columnFormat.week=ddd d +fullCalendar.timeFormat.day=h:mmtt +fullCalendar.timeFormat.month=h:mmtt +fullCalendar.timeFormat.week=h:mmtt +fullCalendar.titleFormat.day=ddd, dd, MMMM yyyy +fullCalendar.titleFormat.month=MMMM yyyy +fullCalendar.titleFormat.week=d MMMM yyyy + +calendar.site-does-not-exist=\u8bf7\u6c42\u7684\u7ad9\u70b9\u4e0d\u5b58\u5728\u6216\u60a8\u6ca1\u6709\u8bbf\u95ee\u8be5\u7ad9\u70b9\u7684\u6743\u9650\u3002 +calendar.site-does-not-exist-title=\u7ad9\u70b9 ''{0}'' \u4e0d\u5b58\u5728\u6216\u60a8\u6ca1\u6709\u8bbf\u95ee\u8be5\u7ad9\u70b9\u7684\u6743\u9650\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.desc.xml new file mode 100644 index 0000000000..f135227ca3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.desc.xml @@ -0,0 +1,5 @@ + + Comments component + Displays comments for a node + /components/comments/list + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.html.ftl new file mode 100644 index 0000000000..72e83c0c4a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.html.ftl @@ -0,0 +1,51 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/comments/comments-list.css" group="comments"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/comments/comments-list.js" group="comments"/> + + +<@markup id="widgets"> + <#if nodeRef??> + <@createWidgets group="comments"/> + + + +<@markup id="html"> + <@uniqueIdDiv> + <#if nodeRef??> + <#assign el=args.htmlid?html> +
+

${msg("header.comments")}

+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.js new file mode 100644 index 0000000000..486afdf24c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.js @@ -0,0 +1,124 @@ + + +function getActivityParameters(nodeRef, defaultValue) +{ + var cm = "{http://www.alfresco.org/model/content/1.0}", + metadata = AlfrescoUtil.getMetaData(nodeRef, {}); + if (metadata.properties) + { + if (model.activityType == "document") + { + return ( + { + itemTitle: metadata.properties[cm + 'name'], + page: 'document-details', + pageParams: + { + nodeRef: metadata.nodeRef + } + }); + } + else if (model.activityType == "folder") + { + return ( + { + itemTitle: metadata.properties[cm + 'name'], + page: 'folder-details', + pageParams: + { + nodeRef: metadata.nodeRef + } + }); + } + else if (model.activityType == "link") + { + var lm = "{http://www.alfresco.org/model/linksmodel/1.0}"; + return ( + { + itemTitle: metadata.properties[lm + "title"], + page: 'links-view', + pageParams: + { + linkId: metadata.properties[cm + "name"] + } + }); + } + else if (model.activityType == "blog") + { + return ( + { + itemTitle: metadata.properties[cm + 'title'], + page: 'blog-postview', + pageParams: + { + postId: metadata.properties[cm + "name"] + } + }); + } + } + return defaultValue; +} + +function main() +{ + AlfrescoUtil.param('nodeRef', null); + AlfrescoUtil.param('site', null); + AlfrescoUtil.param('maxItems', 10); + AlfrescoUtil.param('activityType', null); + + if (!model.nodeRef) + { + // Handle urls that doesn't use nodeRef + AlfrescoUtil.param('postId', null); + if (model.postId) + { + // translate blog post "postId" to a nodeRef + AlfrescoUtil.param('container', 'blog'); + model.nodeRef = AlfrescoUtil.getBlogPostDetailsByPostId(model.site, model.container, model.postId, {}).nodeRef; + } + else + { + AlfrescoUtil.param('linkId', null); + if (model.linkId) + { + // translate link's "linkId" to a nodeRef + AlfrescoUtil.param('container', 'links'); + model.nodeRef = AlfrescoUtil.getLinkDetailsByPostId(model.site, model.container, model.linkId, {}).nodeRef; + } + } + } + + var documentDetails = AlfrescoUtil.getNodeDetails(model.nodeRef, model.site); + var suppressSocial = documentDetails && AlfrescoUtil.isComponentSuppressed(documentDetails.item.node, AlfrescoUtil.getSupressSocialfolderDetailsConfig()); + var activityParameters = null; + if (documentDetails && !suppressSocial) + { + activityParameters = getActivityParameters(model.nodeRef, null); + } + else + { + // Signal to the template that the node doesn't exist and that comments therefore shouldn't be displayed. + model.nodeRef = null; + } + + // Widget instantiation metadata... + var commentList = { + id : "CommentsList", + name : "Alfresco.CommentsList", + options : { + nodeRef : model.nodeRef, + siteId : model.site, + maxItems : parseInt(model.maxItems), + activity : activityParameters, + editorConfig : { + menu: {}, + toolbar: "bold italic underline | bullist numlist | forecolor backcolor | undo redo removeformat", + language: locale, + statusbar: false + } + } + }; + model.widgets = [commentList]; +} + +main(); diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.properties new file mode 100644 index 0000000000..b495e742d8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get.properties @@ -0,0 +1,22 @@ +header.comments=Comments +header.add=Add Your Comment... +header.edit=Edit Comment... +label.avatar=Avatar +link.deleteComment=Delete Comment +link.editComment=Edit Comment +link.showHelp=Display help +link.help=Keyboard Shortcuts: Bold (Ctrl+B), Italic (Ctrl+I), Underline (Ctrl+U), Undo (Ctrl+Z), Redo (Ctrl+Y). +button.addComment=Add Comment +button.save=Save +button.cancel=Cancel + +message.noComments=No comments +message.delete.success=Comment deleted +message.delete.failure=Unable to delete comment +message.loadeditform.failure=Unable to load edit comment form +message.savecomment=Saving comment... +message.savecomment.failure=Unable to save comment +message.confirm.delete.title=Delete Comment +message.confirm.delete=Are you sure you want to delete this comment? +message.wait=Please wait... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_de.properties new file mode 100644 index 0000000000..a728dbf27a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_de.properties @@ -0,0 +1,22 @@ +header.comments=Kommentare +header.add=F\u00fcgen Sie Ihren Kommentar hinzu... +header.edit=Kommentar bearbeiten... +label.avatar=Avatar +link.deleteComment=Kommentar l\u00f6schen +link.editComment=Kommentar bearbeiten +link.showHelp=Hilfe anzeigen +link.help=Tastenkombinationen: Fett (Strg+B), Kursiv (Strg+I), Unterstreichen (Strg+U), R\u00fcckg\u00e4ngig machen (Strg+Z), Wiederherstellen (Strg+Y). +button.addComment=Kommentar hinzuf\u00fcgen +button.save=Speichern +button.cancel=Abbrechen + +message.noComments=Keine Kommentare vorhanden +message.delete.success=Kommentar gel\u00f6scht +message.delete.failure=Kommentar l\u00f6schen nicht m\u00f6glich +message.loadeditform.failure=Laden des Formulars zur \u00c4nderung des Kommentars nicht m\u00f6glich +message.savecomment=Kommentar wird gespeichert... +message.savecomment.failure=Kommentar kann nicht gespeichert werden +message.confirm.delete.title=Kommentar l\u00f6schen +message.confirm.delete=M\u00f6chten Sie diesen Kommentar wirklich l\u00f6schen? +message.wait=Bitte warten... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_es.properties new file mode 100644 index 0000000000..9ff5af60e5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_es.properties @@ -0,0 +1,22 @@ +header.comments=Comentarios +header.add=A\u00f1ada su comentario... +header.edit=Edite el comentario... +label.avatar=Avatar +link.deleteComment=Eliminar comentario +link.editComment=Editar el comentario +link.showHelp=Mostrar la ayuda +link.help=Accesos directos del teclado: Negrita (Ctrl+N), Cursiva (Ctrl+K), Subrayado (Ctrl+S), Deshacer (Ctrl+Z), Repetir (Ctrl+Y). +button.addComment=A\u00f1adir un comentario +button.save=Guardar +button.cancel=Cancelar + +message.noComments=No hay comentarios +message.delete.success=Comentario eliminado +message.delete.failure=Error al eliminar el comentario +message.loadeditform.failure=Error al cargar el formulario de edici\u00f3n de comentarios +message.savecomment=Guardando el comentario... +message.savecomment.failure=Error al guardar el comentario +message.confirm.delete.title=Eliminar comentario +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar el comentario? +message.wait=Espere por favor... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_fr.properties new file mode 100644 index 0000000000..df2eff791d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_fr.properties @@ -0,0 +1,22 @@ +header.comments=Commentaires +header.add=Ajouter votre commentaire... +header.edit=Modifier le commentaire... +label.avatar=Avatar +link.deleteComment=Supprimer le commentaire +link.editComment=Modifier le commentaire +link.showHelp=Afficher l'aide +link.help=Raccourcis clavier\u00a0: Gras (Ctrl+B), Italique (Ctrl+I), Soulign\u00e9 (Ctrl+U), Annuler (Ctrl+Z), R\u00e9tablir (Ctrl+Y). +button.addComment=Ajouter un commentaire +button.save=Enregistrer +button.cancel=Annuler + +message.noComments=Pas de commentaire +message.delete.success=Commentaire supprim\u00e9 +message.delete.failure=Echec de la suppression du commentaire +message.loadeditform.failure=Echec du chargement du formulaire de modification des commentaires +message.savecomment=Enregistrement du commentaire... +message.savecomment.failure=Echec de l'enregistrement du commentaire +message.confirm.delete.title=Supprimer le commentaire +message.confirm.delete=\u00cates-vous s\u00fbr de vouloir supprimer ce commentaire ? +message.wait=Veuillez patienter... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_it.properties new file mode 100644 index 0000000000..5a142a46a9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_it.properties @@ -0,0 +1,22 @@ +header.comments=Commenti +header.add=Aggiungi commento... +header.edit=Modifica commento... +label.avatar=Avatar +link.deleteComment=Elimina commento +link.editComment=Modifica commento +link.showHelp=Mostra aiuto +link.help=Scorciatoie da tastiera: Grassetto (Ctrl+B), Corsivo (Ctrl+I), Sottolineato (Ctrl+U), Annulla (Ctrl+Z), Ripeti (Ctrl+Y). +button.addComment=Aggiungi commento +button.save=Salva +button.cancel=Annulla + +message.noComments=Nessun commento +message.delete.success=Commento eliminato +message.delete.failure=Impossibile eliminare il commento +message.loadeditform.failure=Impossibile caricare il modulo di modifica del commento +message.savecomment=Salvataggio del commento in corso... +message.savecomment.failure=Impossibile salvare il commento +message.confirm.delete.title=Elimina commento +message.confirm.delete=Eliminare questo commento? +message.wait=Attendere... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_ja.properties new file mode 100755 index 0000000000..063177fc33 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_ja.properties @@ -0,0 +1,22 @@ +header.comments=\u30b3\u30e1\u30f3\u30c8 +header.add=\u30b3\u30e1\u30f3\u30c8\u306e\u8ffd\u52a0... +header.edit=\u30b3\u30e1\u30f3\u30c8\u306e\u7de8\u96c6... +label.avatar=\u30a2\u30d0\u30bf\u30fc +link.deleteComment=\u30b3\u30e1\u30f3\u30c8\u306e\u524a\u9664 +link.editComment=\u30b3\u30e1\u30f3\u30c8\u306e\u7de8\u96c6 +link.showHelp=\u30d8\u30eb\u30d7\u3092\u8868\u793a +link.help=\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u30ad\u30fc: \u592a\u5b57 (Ctrl+B)\u3001\u659c\u4f53 (Ctrl+I)\u3001\u4e0b\u7dda (Ctrl+U)\u3001\u5143\u306b\u623b\u3059 (Ctrl+Z)\u3001\u3084\u308a\u76f4\u3057 (Ctrl+Y)\u3002 +button.addComment=\u30b3\u30e1\u30f3\u30c8\u306e\u8ffd\u52a0 +button.save=\u4fdd\u5b58 +button.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb + +message.noComments=\u30b3\u30e1\u30f3\u30c8\u306a\u3057 +message.delete.success=\u30b3\u30e1\u30f3\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +message.loadeditform.failure=\u30b3\u30e1\u30f3\u30c8\u306e\u7de8\u96c6\u30d5\u30a9\u30fc\u30e0\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093 +message.savecomment=\u30b3\u30e1\u30f3\u30c8\u3092\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059... +message.savecomment.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093 +message.confirm.delete.title=\u30b3\u30e1\u30f3\u30c8\u306e\u524a\u9664 +message.confirm.delete=\u3053\u306e\u30b3\u30e1\u30f3\u30c8\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +message.wait=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_nb.properties new file mode 100755 index 0000000000..222337eabc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_nb.properties @@ -0,0 +1,22 @@ +header.comments=Kommentarer +header.add=Legg til kommentar... +header.edit=Rediger kommentar... +label.avatar=Avatar +link.deleteComment=Slett kommentar +link.editComment=Rediger kommentar +link.showHelp=Visningshjelp +link.help=Hurtigtaster: Uthevet (Ctrl+B), kursiv (Ctrl+I), understreket (Ctrl+U), angre (Ctrl+Z), gj\u00f8r om igjen (Ctrl+Y). +button.addComment=Legg til kommentar +button.save=Lagre +button.cancel=Avbryt + +message.noComments=Ingen kommentarer +message.delete.success=Kommentar ble slettet +message.delete.failure=Kan ikke slette kommentar +message.loadeditform.failure=Kan ikke laste skjema for redigeringskommentar +message.savecomment=Lagrer kommentar... +message.savecomment.failure=Kan ikke lagre kommentar +message.confirm.delete.title=Slett kommentar +message.confirm.delete=Er du sikker p\u00e5 at du vil slette denne kommentaren? +message.wait=Vent litt... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_nl.properties new file mode 100755 index 0000000000..c70cf8b088 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_nl.properties @@ -0,0 +1,22 @@ +header.comments=Opmerkingen +header.add=Uw opmerking toevoegen... +header.edit=Opmerking bewerken... +label.avatar=Avatar +link.deleteComment=Opmerking verwijderen +link.editComment=Opmerking bewerken +link.showHelp=Help weergeven +link.help=Sneltoetsen: Vet (Ctrl+B), Cursief (Ctrl+I), Onderstreept (Ctrl+U), Ongedaan maken (Ctrl+Z), Opnieuw (Ctrl+Y). +button.addComment=Opmerking toevoegen +button.save=Opslaan +button.cancel=Annuleren + +message.noComments=Geen opmerkingen +message.delete.success=Opmerking verwijderd +message.delete.failure=Kan opmerking niet verwijderen +message.loadeditform.failure=Kan formulier voor bewerken van opmerking niet laden +message.savecomment=Opmerking opslaan... +message.savecomment.failure=Kan opmerking niet opslaan +message.confirm.delete.title=Opmerking verwijderen +message.confirm.delete=Weet u zeker dat u deze opmerking wilt verwijderen? +message.wait=Een ogenblik geduld... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_pt_BR.properties new file mode 100644 index 0000000000..566330d429 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_pt_BR.properties @@ -0,0 +1,22 @@ +header.comments=Coment\u00e1rios +header.add=Adicionar seu coment\u00e1rio... +header.edit=Editar coment\u00e1rio... +label.avatar=Avatar +link.deleteComment=Excluir coment\u00e1rio +link.editComment=Editar coment\u00e1rio +link.showHelp=Exibir a ajuda +link.help=Atalhos do teclado: Negrito (Ctrl+B), It\u00e1lico (Ctrl+I), Sublinhado (Ctrl+U), Desfazer (Ctrl+Z), Refazer (Ctrl+Y). +button.addComment=Adicionar coment\u00e1rio +button.save=Salvar +button.cancel=Cancelar + +message.noComments=Sem coment\u00e1rios +message.delete.success=Coment\u00e1rio exclu\u00eddo +message.delete.failure=N\u00e3o \u00e9 poss\u00edvel excluir o coment\u00e1rio +message.loadeditform.failure=N\u00e3o \u00e9 poss\u00edvel carregar o formul\u00e1rio para editar o coment\u00e1rio +message.savecomment=Salvando coment\u00e1rio... +message.savecomment.failure=N\u00e3o \u00e9 poss\u00edvel salvar o coment\u00e1rio +message.confirm.delete.title=Excluir coment\u00e1rio +message.confirm.delete=Tem certeza de que deseja excluir esse coment\u00e1rio? +message.wait=Por favor, aguarde... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_ru.properties new file mode 100755 index 0000000000..07ee97bb94 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_ru.properties @@ -0,0 +1,22 @@ +header.comments=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 +header.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439... +header.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439... +label.avatar=\u0410\u0432\u0430\u0442\u0430\u0440 +link.deleteComment=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +link.editComment=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +link.showHelp=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043a\u0443 +link.help=\u0421\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448: \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl + B), \u043a\u0443\u0440\u0441\u0438\u0432 (Ctrl + I), \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439 (Ctrl + U), \u043e\u0442\u043c\u0435\u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (Ctrl + Z), \u043f\u043e\u0432\u0442\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (Ctrl + Y). +button.addComment=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +button.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +button.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 + +message.noComments=\u041d\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 +message.delete.success=\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0443\u0434\u0430\u043b\u0435\u043d +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.loadeditform.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 +message.savecomment=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f... +message.savecomment.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 +message.confirm.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439? +message.wait=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_zh_CN.properties new file mode 100755 index 0000000000..ae13cc8af2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments-list.get_zh_CN.properties @@ -0,0 +1,22 @@ +header.comments=\u8bc4\u8bba +header.add=\u6dfb\u52a0\u60a8\u7684\u8bc4\u8bba... +header.edit=\u7f16\u8f91\u8bc4\u8bba... +label.avatar=\u7528\u6237\u6807\u8bc6\u56fe +link.deleteComment=\u5220\u9664\u8bc4\u8bba +link.editComment=\u7f16\u8f91\u8bc4\u8bba +link.showHelp=\u663e\u793a\u5e2e\u52a9 +link.help=\u952e\u76d8\u5feb\u6377\u65b9\u5f0f\uff1a \u7c97\u4f53 (Ctrl+B)\u3001\u659c\u4f53 (Ctrl+I)\u3001\u4e0b\u5212\u7ebf (Ctrl+U)\u3001\u53d6\u6d88 (Ctrl+Z)\u3001\u91cd\u505a (Ctrl+Y)\u3002 +button.addComment=\u6dfb\u52a0\u8bc4\u8bba +button.save=\u4fdd\u5b58 +button.cancel=\u53d6\u6d88 + +message.noComments=\u65e0\u8bc4\u8bba +message.delete.success=\u8bc4\u8bba\u5df2\u5220\u9664 +message.delete.failure=\u65e0\u6cd5\u5220\u9664\u8bc4\u8bba +message.loadeditform.failure=\u65e0\u6cd5\u52a0\u8f7d\u7f16\u8f91\u8bc4\u8bba\u7a97\u4f53 +message.savecomment=\u6b63\u5728\u4fdd\u5b58\u8bc4\u8bba... +message.savecomment.failure=\u65e0\u6cd5\u4fdd\u5b58\u8bc4\u8bba +message.confirm.delete.title=\u5220\u9664\u8bc4\u8bba +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u6b64\u8bc4\u8bba\uff1f +message.wait=\u8bf7\u7a0d\u5019... + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.desc.xml new file mode 100644 index 0000000000..940a40e9c1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.desc.xml @@ -0,0 +1,6 @@ + + Comments + Get all comments for a node + /components/node/{store_type}/{store_id}/{id}/comments + argument + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.js new file mode 100644 index 0000000000..149fec7dd4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.js @@ -0,0 +1,33 @@ + +function main() +{ + // retrieve comments + var params = []; + for (var name in args) + { + params.push(name + "=" + args[name]); + } + var uri = "/api/node/" + url.templateArgs.store_type + "/" + url.templateArgs.store_id +"/" + url.templateArgs.id + "/comments?" + params.join("&"); + var connector = remote.connect("alfresco"); + var result = connector.get(encodeURI(uri)); + if (result.status.code == status.STATUS_OK) + { + // Strip out possible malicious code + var comments = JSON.parse(result.response); + if (comments && comments.items) { + for (var i = 0, il = comments.items.length; i < il; i++) + { + comments.items[i].content = stringUtils.stripUnsafeHTML(comments.items[i].content); + } + } + return jsonUtils.toJSONString(comments); + } + else + { + status.code = result.status.code; + status.message = msg.get("message.failure"); + status.redirect = true; + } +} + +model.comments = main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.json.ftl new file mode 100644 index 0000000000..aae25280e1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.json.ftl @@ -0,0 +1 @@ +${comments!"{}"} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.properties new file mode 100644 index 0000000000..0f8151e599 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get.properties @@ -0,0 +1 @@ +message.failure=Failed to load the comments diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_de.properties new file mode 100755 index 0000000000..9b03434feb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_de.properties @@ -0,0 +1 @@ +message.failure=Kommentare konnten nicht geladen werden diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_es.properties new file mode 100755 index 0000000000..66f579174e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_es.properties @@ -0,0 +1 @@ +message.failure=No se pudieron cargar los comentarios diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_fr.properties new file mode 100755 index 0000000000..3d133756e5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_fr.properties @@ -0,0 +1 @@ +message.failure=Echec du chargement des commentaires diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_it.properties new file mode 100755 index 0000000000..4ecc3de13e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_it.properties @@ -0,0 +1 @@ +message.failure=Impossibile caricare i commenti diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_ja.properties new file mode 100755 index 0000000000..19ad8d32e0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_ja.properties @@ -0,0 +1 @@ +message.failure=\u30b3\u30e1\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_nb.properties new file mode 100755 index 0000000000..760ad1f6cb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_nb.properties @@ -0,0 +1 @@ +message.failure=Kunne ikke laste kommentarene diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_nl.properties new file mode 100755 index 0000000000..2fa8b2277e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_nl.properties @@ -0,0 +1 @@ +message.failure=Kan de opmerkingen niet laden diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_pt_BR.properties new file mode 100644 index 0000000000..09812c12e5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_pt_BR.properties @@ -0,0 +1 @@ +message.failure=Falha ao carregar os coment\u00e1rios diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_ru.properties new file mode 100755 index 0000000000..ff4381a1e5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_ru.properties @@ -0,0 +1 @@ +message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_zh_CN.properties new file mode 100755 index 0000000000..89f261a858 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/comments/comments.get_zh_CN.properties @@ -0,0 +1 @@ +message.failure=\u52a0\u8f7d\u8bc4\u8bba\u5931\u8d25 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.desc.xml new file mode 100644 index 0000000000..69874359e1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Application Tool + Administration Console - Application Settings Tool + /components/console/application + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.html.ftl new file mode 100644 index 0000000000..e4fac092ce --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.html.ftl @@ -0,0 +1,73 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/application.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/application.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid?html> + <#assign defaultlogo=msg("header.logo")><#if defaultlogo="header.logo"><#assign defaultlogo="app-logo.png"> + + +
+ + +
+ + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.js new file mode 100644 index 0000000000..042de1a5a8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get.js @@ -0,0 +1,56 @@ +/** + * Admin Console Application Tool component + */ + +function main() +{ + model.themes = []; + + // retrieve the available theme objects + var themes = sitedata.getObjects("theme"); + for (var i=0, t; iRepository Administration Console. +message.new-admin-console.doc-link=You can find further administration tools in the Repository Admin Console, find out more information in the Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_de.properties new file mode 100755 index 0000000000..098540b409 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_de.properties @@ -0,0 +1,10 @@ +label.options=Optionen +label.theme=Farbschema +label.logo=Logo +label.logonote=Die empfohlene Bildh\u00f6he betr\u00e4gt maximal 48 Pixel. +button.apply=\u00dcbernehmen +message.failure=Anwenden der ausgew\u00e4hlten Optionen fehlgeschlagen. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=Weitere Administratoren-Tools finden Sie in der Repository Administration Console. +message.new-admin-console.doc-link=Weitere Administratoren-Tools finden Sie in der Repository Administration Console. Mehr Informationen dazu finden Sie in der Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_es.properties new file mode 100755 index 0000000000..e7ad789112 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_es.properties @@ -0,0 +1,10 @@ +label.options=Opciones +label.theme=Temas +label.logo=Logotipo +label.logonote=La altura m\u00e1xima recomendada para la imagen es de 48 p\u00edxeles. +button.apply=Aplicar +message.failure=Error al aplicar las opciones seleccionadas. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=Puede encontrar m\u00e1s herramientas de administraci\u00f3n en la Consola de administraci\u00f3n del repositorio. +message.new-admin-console.doc-link=Puede encontrar m\u00e1s herramientas de administraci\u00f3n en la Consola de administraci\u00f3n del repositorio; para m\u00e1s informaci\u00f3n vea Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_fr.properties new file mode 100755 index 0000000000..11c735e5fa --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_fr.properties @@ -0,0 +1,10 @@ +label.options=Options +label.theme=Th\u00e8me +label.logo=Logo +label.logonote=La hauteur d'image maximale recommand\u00e9e est de 48 pixels. +button.apply=Appliquer +message.failure=Impossible d'appliquer les options choisies. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=Des outils admin suppl\u00e9mentaires sont disponibles dans la la console d''administration d''entrep\u00f4t. +message.new-admin-console.doc-link=Des outils admin suppl\u00e9mentaires sont disponibles dans la console d''administration d''entrep\u00f4t. Vous trouverez plus d''informations dans la Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_it.properties new file mode 100755 index 0000000000..2b2871cb59 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_it.properties @@ -0,0 +1,10 @@ +label.options=Opzioni +label.theme=Tema +label.logo=Logo +label.logonote=Altezza massima consigliata per le immagini: 48 pixel. +button.apply=Applica +message.failure=Impossibile applicare le opzioni selezionate. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=\u00c8 possibile trovare ulteriori strumenti di amministrazione in Console di amministrazione del repository. +message.new-admin-console.doc-link=\u00c8 possibile trovare ulteriori strumenti di amministrazione nella Console di amministrazione del repository. Maggiori informazioni possono essere trovate in Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_ja.properties new file mode 100755 index 0000000000..dc88ed37f0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_ja.properties @@ -0,0 +1,10 @@ +label.options=\u30aa\u30d7\u30b7\u30e7\u30f3 +label.theme=\u30c6\u30fc\u30de +label.logo=\u30ed\u30b4 +label.logonote=\u753b\u50cf\u306e\u63a8\u5968\u6700\u5927\u9ad8\u3055\u306f 48 \u30d4\u30af\u30bb\u30eb\u3067\u3059\u3002 +button.apply=\u9069\u7528 +message.failure=\u9078\u629e\u3057\u305f\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9069\u7528\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=\u8ffd\u52a0\u306e\u7ba1\u7406\u30c4\u30fc\u30eb\u306f\u30ea\u30dd\u30b8\u30c8\u30ea\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u3042\u308a\u307e\u3059\u3002 +message.new-admin-console.doc-link=\u8ffd\u52a0\u306e\u7ba1\u7406\u30c4\u30fc\u30eb\u306f\u30ea\u30dd\u30b8\u30c8\u30ea\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u3042\u308a\u307e\u3059\u3002\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001Alfresco Documentation \u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_nb.properties new file mode 100755 index 0000000000..8eba3e33db --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_nb.properties @@ -0,0 +1,10 @@ +label.options=Alternativer +label.theme=Tema +label.logo=Logo +label.logonote=Maksimum anbefalt bildeh\u00f8yde er 48 piksler. +button.apply=Bruk +message.failure=Kunne ikke bruke valgte alternativer. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=Du finner flere administratorverkt\u00f8y i Repository Administration Console. +message.new-admin-console.doc-link=Du finner flere administratorverkt\u00f8y i database. Du finner ytterligere informasjon om Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_nl.properties new file mode 100755 index 0000000000..2b7d490762 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_nl.properties @@ -0,0 +1,10 @@ +label.options=Opties +label.theme=Thema +label.logo=Logo +label.logonote=Aanbevolen maximale afbeeldingshoogte is 48 pixels. +button.apply=Toepassen +message.failure=Kan geselecteerde opties niet toepassen. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=U vindt meer beheertools in de repositorybeheerconsole. +message.new-admin-console.doc-link=U vindt meer beheertools in de repositorybeheerconsole. Meer informatie is te vinden in de Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_pt_BR.properties new file mode 100644 index 0000000000..020a4b2a02 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_pt_BR.properties @@ -0,0 +1,10 @@ +label.options=Op\u00e7\u00f5es +label.theme=Tema +label.logo=Logotipo +label.logonote=A altura m\u00e1xima recomendada para a imagem \u00e9 de 48 pixels. +button.apply=Aplicar +message.failure=Falha ao aplicar as op\u00e7\u00f5es selecionadas. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=\u00c9 poss\u00edvel encontrar mais ferramentas de administrador no Console de Administra\u00e7\u00e3o do Reposit\u00f3rio. +message.new-admin-console.doc-link=\u00c9 poss\u00edvel encontrar mais ferramentas de administrador no Console de Administra\u00e7\u00e3o do Reposit\u00f3rio. Veja mais informa\u00e7\u00f5es na Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_ru.properties new file mode 100755 index 0000000000..3437abf8ba --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_ru.properties @@ -0,0 +1,10 @@ +label.options=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b +label.theme=\u0422\u0435\u043c\u0430 +label.logo=\u041b\u043e\u0433\u043e\u0442\u0438\u043f +label.logonote=\u0412\u044b\u0441\u043e\u0442\u0430 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 48 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. +button.apply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c +message.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=\u041f\u0440\u043e\u0447\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u041a\u043e\u043d\u0441\u043e\u043b\u0438 \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. +message.new-admin-console.doc-link=\u041f\u0440\u043e\u0447\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u041a\u043e\u043d\u0441\u043e\u043b\u0438 \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_zh_CN.properties new file mode 100755 index 0000000000..466c4325e6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.get_zh_CN.properties @@ -0,0 +1,10 @@ +label.options=\u9009\u9879 +label.theme=\u4e3b\u9898 +label.logo=\u5fbd\u6807 +label.logonote=\u5efa\u8bae\u6700\u5927\u56fe\u50cf\u9ad8\u5ea6\u4e3a 48 \u50cf\u7d20\u3002 +button.apply=\u5e94\u7528 +message.failure=\u5e94\u7528\u6240\u9009\u9009\u9879\u5931\u8d25\u3002 + +## Note to translators: Please retain the HTML tags in the message.new-admin-console +message.new-admin-console.repo-link=\u60a8\u53ef\u4ee5\u5728\u5b58\u50a8\u5e93\u7ba1\u7406\u63a7\u5236\u53f0\u4e2d\u67e5\u627e\u5176\u4ed6\u7ba1\u7406\u5de5\u5177\u3002 +message.new-admin-console.doc-link=\u4f60\u4f1a\u5728\u5b58\u50a8\u5e93\u7ba1\u7406\u63a7\u5236\u53f0\u53d1\u73b0\u66f4\u591a\u7ba1\u7406\u5de5\u5177, \u66f4\u591a\u4fe1\u606f\u8bf7\u53c2\u8003 Alfresco Documentation. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.desc.xml new file mode 100644 index 0000000000..2d902a1e0d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.desc.xml @@ -0,0 +1,7 @@ + + Admin Console Application Tool POST + Admin Console Application Tool POST form submission processing + + /components/console/application + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.json.ftl new file mode 100644 index 0000000000..48ca71807f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.json.ftl @@ -0,0 +1,4 @@ +{ + "success": ${success?string}, + "message": "<#if errormsg??>${errormsg}" +} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.json.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.json.js new file mode 100644 index 0000000000..f69a643536 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/application.post.json.js @@ -0,0 +1,35 @@ +/** + * Admin Console Application Tool POST method + */ + +function main() +{ + if (user.isAdmin) + { + var sc = context.getSiteConfiguration(); + + // theme option + var themeId = json.get("console-options-theme-menu"); + context.setThemeId(new String(themeId)); + + // persist theme across application + // the theme is applied by the SlingshotPageView class on view render + if (sc.getProperty("theme") != themeId) + { + sc.setProperty("theme", themeId); + sc.save(); + } + + // logo option + var logoId = json.get("console-options-logo"); + if (logoId != null && (logoId = new String(logoId)).length != 0) + { + // "reset" is special case to reset application logo to theme default + sc.setProperty("logo", (logoId != "reset" ? logoId : "")); + sc.save(); + } + } + model.success = true; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.desc.xml new file mode 100644 index 0000000000..d21c047081 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Category Manager + Administration Console - Category Manager + /components/console/category-manager + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.html.ftl new file mode 100644 index 0000000000..71ca785724 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.html.ftl @@ -0,0 +1,32 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/category-manager.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/category-manager.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <#assign el=args.htmlid?html> + <@uniqueIdDiv> +
+ +
+
+
${msg("title.category-manager")}
+
+
+
+
+
+
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.js new file mode 100644 index 0000000000..be2dc8f199 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.js @@ -0,0 +1,12 @@ +function main() { + // Widget instantiation metadata... + var widget = { + id : "CategoryManager", + name : "Alfresco.CategoryManager", + options : { + nodeRef: "alfresco://category/root" + } + }; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.properties new file mode 100644 index 0000000000..232d25e8e7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Category Root + +title.category-manager=Category Manager diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_de.properties new file mode 100755 index 0000000000..bc3ea792d8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_de.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Kategorie-Root + +title.category-manager=Kategorie-Manager diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_es.properties new file mode 100755 index 0000000000..8957059388 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_es.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Ra\u00edz de categor\u00edas + +title.category-manager=Administrador de categor\u00edas diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_fr.properties new file mode 100755 index 0000000000..9bdb0d2809 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_fr.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Cat\u00e9gorie racine + +title.category-manager=Gestionnaire de cat\u00e9gories diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_it.properties new file mode 100755 index 0000000000..ca6075d646 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_it.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Radice categorie + +title.category-manager=Gestione categoria diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_ja.properties new file mode 100755 index 0000000000..d79133b22d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_ja.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=\u30ab\u30c6\u30b4\u30ea\u30eb\u30fc\u30c8 + +title.category-manager=\u30ab\u30c6\u30b4\u30ea\u30de\u30cd\u30fc\u30b8\u30e3 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_nb.properties new file mode 100755 index 0000000000..377280a7c6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_nb.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Kategorirot + +title.category-manager=Kategoriadministrator diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_nl.properties new file mode 100755 index 0000000000..a0ef347fbd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_nl.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Hoofdcategorie + +title.category-manager=Categoriebeheer diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_pt_BR.properties new file mode 100644 index 0000000000..c883e1bba4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_pt_BR.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=Raiz de categoria + +title.category-manager=Gerente de categoria diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_ru.properties new file mode 100755 index 0000000000..83263f2148 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_ru.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=\u041a\u043e\u0440\u0435\u043d\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 + +title.category-manager=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_zh_CN.properties new file mode 100755 index 0000000000..1ab5c1f803 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/category-manager.get_zh_CN.properties @@ -0,0 +1,4 @@ +## Top-level Root Node +node.root=\u7c7b\u522b\u6839 + +title.category-manager=\u7c7b\u522b\u7ba1\u7406\u5668 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.desc.xml new file mode 100644 index 0000000000..6dd51fa457 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.desc.xml @@ -0,0 +1,15 @@ + + Console Tools + Reusable Tools component for all Console pages + /components/console/tools + + + listType + + Decides how the list of tools will be displayed. + Possible values: "grouped" (grouped by category/folder) or "simple" (simple plain list). + Default value: "grouped". + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.html.ftl new file mode 100644 index 0000000000..4e071d6534 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.html.ftl @@ -0,0 +1,42 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/tools.css" group="console"/> + + +<@markup id="js"> + <#-- No JavaScript Dependencies --> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.js new file mode 100644 index 0000000000..826bc3c01b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.js @@ -0,0 +1,29 @@ +/** + * Admin Console Tools list component + */ + +function main() +{ + // get the tool info from the request context - as supplied by the console template script + var toolInfo = context.properties["console-tools"]; + + // resolve the message labels + for (var g = 0, group; g < toolInfo.length; g++) + { + group = toolInfo[g]; + for (var i = 0, info; i < group.length; i++) + { + info = group[i]; + info.label = msg.get(info.label); + info.description = msg.get(info.description); + if (info.group != "") + { + info.groupLabel = msg.get(info.groupLabel); + } + } + } + + model.tools = toolInfo; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.properties new file mode 100644 index 0000000000..1831b81cbb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get.properties @@ -0,0 +1 @@ +header.tools=Tools diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_de.properties new file mode 100755 index 0000000000..d752858c5b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_de.properties @@ -0,0 +1 @@ +header.tools=Werkzeuge diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_es.properties new file mode 100755 index 0000000000..bccef7d40b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_es.properties @@ -0,0 +1 @@ +header.tools=Herramientas diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_fr.properties new file mode 100755 index 0000000000..719c2719e3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_fr.properties @@ -0,0 +1 @@ +header.tools=Outils diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_it.properties new file mode 100755 index 0000000000..8030db6d8c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_it.properties @@ -0,0 +1 @@ +header.tools=Strumenti diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_ja.properties new file mode 100755 index 0000000000..041975cbe6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_ja.properties @@ -0,0 +1 @@ +header.tools=\u30c4\u30fc\u30eb diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_nb.properties new file mode 100755 index 0000000000..318be65b4f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_nb.properties @@ -0,0 +1 @@ +header.tools=Verkt\u00f8y diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_nl.properties new file mode 100755 index 0000000000..1831b81cbb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_nl.properties @@ -0,0 +1 @@ +header.tools=Tools diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_pt_BR.properties new file mode 100644 index 0000000000..e2b8b0d61b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_pt_BR.properties @@ -0,0 +1 @@ +header.tools=Ferramentas diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_ru.properties new file mode 100755 index 0000000000..e7847fe193 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_ru.properties @@ -0,0 +1 @@ +header.tools=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_zh_CN.properties new file mode 100755 index 0000000000..addc256a82 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/console-tools.get_zh_CN.properties @@ -0,0 +1 @@ +header.tools=\u5de5\u5177 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.config.xml new file mode 100644 index 0000000000..4cb245fb42 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.config.xml @@ -0,0 +1,8 @@ + + tool.email-imap.label +
+ mbean + Alfresco:Type=Configuration,Category=imap,id1=default +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.desc.xml new file mode 100644 index 0000000000..caf0c65105 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Email (IMAP) Tool + Administration Console - Email (IMAP) Tool + /components/console/email-imap + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-imap.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.config.xml new file mode 100644 index 0000000000..af0a24f9f6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.config.xml @@ -0,0 +1,8 @@ + + tool.email-inbound.label +
+ mbean + Alfresco:Type=Configuration,Category=email,id1=inbound +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.desc.xml new file mode 100644 index 0000000000..a1852c3c72 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console Email (Inbound) Tool + Administration Console - Email (Inbound) Tool + /components/console/email-inbound + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-inbound.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.config.xml new file mode 100644 index 0000000000..863804a0db --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.config.xml @@ -0,0 +1,8 @@ + + tool.email-outbound.label +
+ mbean + Alfresco:Type=Configuration,Category=email,id1=outbound +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.desc.xml new file mode 100644 index 0000000000..e9a1716a7c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Email (Outbound) Tool + Administration Console - Email (Outbound) Tool + /components/console/email-outbound + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/email/email-outbound.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.desc.xml new file mode 100644 index 0000000000..1b1d7e2d24 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Trashcan Tool + Administration Console - Trashcan File Recovery Tool + /components/console/trashcan + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.html.ftl new file mode 100644 index 0000000000..22c09b9f19 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.html.ftl @@ -0,0 +1,46 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/trashcan.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/trashcan.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid?html> +
+ + + + +
+ + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.js new file mode 100644 index 0000000000..67e7e0df94 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.js @@ -0,0 +1,9 @@ +function main() { + // Widget instantiation metadata... + var widget = { + id : "ConsoleTrashcan", + name : "Alfresco.ConsoleTrashcan" + }; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.properties new file mode 100644 index 0000000000..d7abdd1337 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get.properties @@ -0,0 +1,10 @@ +title.trashcan=Trashcan +button.empty=Empty +button.recover=Recover +message.metadata=Deleted on {0} by {1} +message.recover.success=Successfully recovered {0} +message.recover.failure=Failed to recover {0} +message.delete.success=Successfully deleted {0} +message.delete.failure=Failed to delete {0} +message.empty.confirm=Are you sure you wish to delete all items? +message.empty.inprogress=Emptying trashcan... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_de.properties new file mode 100755 index 0000000000..1ae080ab81 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_de.properties @@ -0,0 +1,10 @@ +title.trashcan=Papierkorb +button.empty=Leeren +button.recover=Wiederherstellen +message.metadata=Gel\u00f6scht am {0} von {1} +message.recover.success={0} erfolgreich wiederhergestellt +message.recover.failure={0} konnte nicht wiederhergestellt werden +message.delete.success={0} erfolgreich gel\u00f6scht +message.delete.failure={0} konnte nicht gel\u00f6scht werden +message.empty.confirm=M\u00f6chten Sie wirklich alle Elemente l\u00f6schen? +message.empty.inprogress=Papierkorb leeren... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_es.properties new file mode 100755 index 0000000000..43e49f7026 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_es.properties @@ -0,0 +1,10 @@ +title.trashcan=Papelera +button.empty=Vaciar +button.recover=Recuperar +message.metadata=Eliminado el {0} por {1} +message.recover.success={0} se ha recuperado con \u00e9xito +message.recover.failure=No se pudo recuperar {0} +message.delete.success={0} se ha eliminado correctamente +message.delete.failure=No se pudo eliminar {0} +message.empty.confirm=\u00bfSeguro que desea eliminar todos los elementos? +message.empty.inprogress=Vaciando la papelera... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_fr.properties new file mode 100755 index 0000000000..c0fe7621f1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_fr.properties @@ -0,0 +1,10 @@ +title.trashcan=Corbeille +button.empty=Vider +button.recover=R\u00e9cup\u00e9rer +message.metadata=Supprim\u00e9 le {0} par {1} +message.recover.success=R\u00e9cup\u00e9ration r\u00e9ussie {0} +message.recover.failure=R\u00e9cup\u00e9ration impossible {0} +message.delete.success=Suppression r\u00e9ussie {0} +message.delete.failure=Suppression impossible {0} +message.empty.confirm=Etes-vous s\u00fbr de vouloir supprimer tous les \u00e9l\u00e9ments ? +message.empty.inprogress=Vidage de la corbeille... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_it.properties new file mode 100755 index 0000000000..ae78f1fdb3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_it.properties @@ -0,0 +1,10 @@ +title.trashcan=Cestino +button.empty=Svuota +button.recover=Recupera +message.metadata=Eliminato il {0} da {1} +message.recover.success=Recupero di {0} riuscito +message.recover.failure=Impossibile recuperare {0} +message.delete.success=Eliminazione di {0} riuscita +message.delete.failure=Impossibile eliminare {0} +message.empty.confirm=Eliminare tutti gli elementi? +message.empty.inprogress=Svuotamento del cestino in corso... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_ja.properties new file mode 100755 index 0000000000..62842169ce --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_ja.properties @@ -0,0 +1,10 @@ +title.trashcan=\u3054\u307f\u7bb1 +button.empty=\u3054\u307f\u7bb1\u3092\u7a7a\u306b\u3059\u308b +button.recover=\u5fa9\u5143\u3059\u308b +message.metadata=\u524a\u9664\u65e5\u6642: {0}\u3001\u524a\u9664\u8005\uff1a{1} +message.recover.success={0} \u304c\u5fa9\u5143\u3055\u308c\u307e\u3057\u305f +message.recover.failure={0} \u3092\u5fa9\u5143\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.delete.success={0} \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure={0} \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.empty.confirm=\u3059\u3079\u3066\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.empty.inprogress=\u3054\u307f\u7bb1\u3092\u7a7a\u306b\u3057\u3066\u3044\u307e\u3059... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_nb.properties new file mode 100755 index 0000000000..b12465c5c1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_nb.properties @@ -0,0 +1,10 @@ +title.trashcan=Papirkurv +button.empty=Fjern +button.recover=Gjenopprett +message.metadata=Slettet den {0} av {1} +message.recover.success=Gjenopprettet {0} +message.recover.failure={0} ble ikke gjenopprettet +message.delete.success={0} ble slettet +message.delete.failure={0} ble ikke slettet +message.empty.confirm=Er du sikker p\u00e5 at du vil slette alle elementene? +message.empty.inprogress=T\u00f8mmer s\u00f8ppeldunk... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_nl.properties new file mode 100755 index 0000000000..9664485df9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_nl.properties @@ -0,0 +1,10 @@ +title.trashcan=Prullenbak +button.empty=Leeg +button.recover=Herstellen +message.metadata=Verwijderd op {0} door {1} +message.recover.success={0} hersteld +message.recover.failure=Kan {0} niet herstellen +message.delete.success={0} verwijderd +message.delete.failure=Kan {0} niet verwijderen +message.empty.confirm=Weet u zeker dat u alle objecten wilt verwijderen? +message.empty.inprogress=Prullenbak leegmaken... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_pt_BR.properties new file mode 100644 index 0000000000..4763b62a7a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_pt_BR.properties @@ -0,0 +1,10 @@ +title.trashcan=Lixeira +button.empty=Esvaziar +button.recover=Recuperar +message.metadata=Exclu\u00eddo em {0} por {1} +message.recover.success=Recuperado com sucesso {0} +message.recover.failure=Falha ao recuperar {0} +message.delete.success=Exclu\u00eddo com sucesso {0} +message.delete.failure=Falha ao excluir {0} +message.empty.confirm=Tem certeza de que deseja excluir todos os itens? +message.empty.inprogress=Esvaziando a lixeira... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_ru.properties new file mode 100755 index 0000000000..03ceb5db2a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_ru.properties @@ -0,0 +1,10 @@ +title.trashcan=\u041a\u043e\u0440\u0437\u0438\u043d\u0430 +button.empty=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c +button.recover=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c +message.metadata=\u0423\u0434\u0430\u043b\u0435\u043d\u043e {0} \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1} +message.recover.success=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d +message.recover.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c {0} +message.delete.success=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0443\u0434\u0430\u043b\u0435\u043d +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0} +message.empty.confirm=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b? +message.empty.inprogress=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u044b... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_zh_CN.properties new file mode 100755 index 0000000000..770e947347 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/filemanagement/trashcan.get_zh_CN.properties @@ -0,0 +1,10 @@ +title.trashcan=\u5783\u573e\u6876 +button.empty=\u6e05\u7a7a +button.recover=\u6062\u590d +message.metadata=\u88ab {1} \u5728 {0} \u5220\u9664 +message.recover.success=\u5df2\u6210\u529f\u6062\u590d {0} +message.recover.failure=\u6062\u590d {0} \u5931\u8d25 +message.delete.success=\u5df2\u6210\u529f\u5220\u9664 {0} +message.delete.failure=\u5220\u9664 {0} \u5931\u8d25 +message.empty.confirm=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u6240\u6709\u9879\uff1f +message.empty.inprogress=\u6b63\u5728\u6e05\u7a7a\u5783\u573e\u6876... diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/generic-form-tool.head.inc b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/generic-form-tool.head.inc new file mode 100644 index 0000000000..77a45e2977 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/generic-form-tool.head.inc @@ -0,0 +1,6 @@ +<#include "../component.head.inc"> +<#include "../form/form.get.head.ftl"> + +<@link rel="stylesheet" type="text/css" href="${page.url.context}/res/components/console/generic-form-tool.css" /> +<@script type="text/javascript" src="${page.url.context}/res/components/console/consoletool.js"> +<@script type="text/javascript" src="${page.url.context}/res/components/console/generic-form-tool.js"> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/generic-form-tool.lib.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/generic-form-tool.lib.ftl new file mode 100644 index 0000000000..be3bb5146d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/generic-form-tool.lib.ftl @@ -0,0 +1,72 @@ +<#macro renderPanel cfg name=""> + + <#include "../form/form.dependencies.inc"> + <@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${page.url.context}/res/components/console/generic-form-tool.css" group="console"/> + + + <@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${page.url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${page.url.context}/res/components/console/generic-form-tool.js" group="console"/> + + + <@markup id="widgets"> + <@createWidgets group="console"/> + + + <@markup id="html"> + <@uniqueIdDiv> + + + + <#assign el=args.htmlid?html> + +
+ + + + + +
+ <#nested> + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.desc.xml new file mode 100644 index 0000000000..7a6540b581 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.desc.xml @@ -0,0 +1,6 @@ + + Module Package List + Admin: Lists the installed Module Packages + /components/admin/module-package + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.html.ftl new file mode 100644 index 0000000000..efd6466981 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.html.ftl @@ -0,0 +1,7 @@ +<@markup id="widgets"> + <@processJsonModel group="share"/> + + +<@markup id="html"> +
+ \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.js new file mode 100644 index 0000000000..8d2907f220 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.js @@ -0,0 +1,119 @@ +model.jsonModel = { + services: [ + { + name: "alfresco/services/LoggingService", + config: { + loggingPreferences: { + enabled: true, + all: true, + warn: true, + error: true + } + } + } + ], + widgets: [ + { + id: "SET_PAGE_TITLE", + name: "alfresco/header/SetTitle", + config: { + title: msg.get("module-package.page.title") + } + }, + { + name: "alfresco/layout/VerticalWidgets", + config: { + widgetMarginTop: "15", + widgets: [ + { + id: "A_LIST", + name: "alfresco/lists/views/AlfListView", + config: { + id: "LIST_WITH_HEADER", + noItemsMessage: msg.get("module-package.no-modules"), + currentData: { + items: modulepackages + }, + widgetsForHeader: [ + { + name: "alfresco/documentlibrary/views/layouts/HeaderCell", + config: { + id: "titleTableHeader", + label: msg.get("module-package.title") + } + }, + { + name: "alfresco/documentlibrary/views/layouts/HeaderCell", + config: { + id: "descriptionTableHeader", + label: msg.get("module-package.description") + } + }, + { + name: "alfresco/documentlibrary/views/layouts/HeaderCell", + config: { + id: "versionTableHeader", + label: msg.get("module-package.version"), + sortable: false + } + } + ], + widgets:[ + { + name: "alfresco/lists/views/layouts/Row", + config: { + widgets: [ + { + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [ + { + name: "alfresco/renderers/Property", + config: { + propertyToRender: "title", + renderAsLink: false + } + } + ] + } + }, + { + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [ + { + name: "alfresco/renderers/Property", + config: { + propertyToRender: "description", + renderAsLink: false + } + } + ] + } + }, + { + name: "alfresco/lists/views/layouts/Cell", + config: { + widgets: [ + { + name: "alfresco/renderers/Property", + config: { + propertyToRender: "version", + renderAsLink: false + } + } + ] + } + } + ] + } + } + ] + + } + } + ] + } + } + ] +}; \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.properties new file mode 100644 index 0000000000..63682d995b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get.properties @@ -0,0 +1,5 @@ +module-package.page.title=Module Browser +module-package.no-modules=No Module Packages Found +module-package.title=Title +module-package.description=Description +module-package.version=Version diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_de.properties new file mode 100644 index 0000000000..c5e9d32b8d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_de.properties @@ -0,0 +1,5 @@ +module-package.page.title=Modul-Browser +module-package.no-modules=Keine Modulpakete gefunden +module-package.title=Titel +module-package.description=Beschreibung +module-package.version=Version diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_es.properties new file mode 100644 index 0000000000..d9be3d2372 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_es.properties @@ -0,0 +1,5 @@ +module-package.page.title=Navegador de m\u00f3dulos +module-package.no-modules=No se han encontrado paquetes de m\u00f3dulos +module-package.title=T\u00edtulo +module-package.description=Descripci\u00f3n +module-package.version=Versi\u00f3n diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_fr.properties new file mode 100644 index 0000000000..75882d3ac0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_fr.properties @@ -0,0 +1,5 @@ +module-package.page.title=Navigateur de modules +module-package.no-modules=Aucun package de module trouv\u00e9 +module-package.title=Titre +module-package.description=Description +module-package.version=Version diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_it.properties new file mode 100644 index 0000000000..4ff1e7ac97 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_it.properties @@ -0,0 +1,5 @@ +module-package.page.title=Browser moduli +module-package.no-modules=Non \u00e8 stato trovato alcun Module Package +module-package.title=Titolo +module-package.description=Descrizione +module-package.version=Versione diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_ja.properties new file mode 100644 index 0000000000..64a126fb91 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_ja.properties @@ -0,0 +1,5 @@ +module-package.page.title=\u30e2\u30b8\u30e5\u30fc\u30eb\u30d6\u30e9\u30a6\u30b6 +module-package.no-modules=\u30e2\u30b8\u30e5\u30fc\u30eb\u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f +module-package.title=\u30bf\u30a4\u30c8\u30eb +module-package.description=\u8aac\u660e +module-package.version=\u30d0\u30fc\u30b8\u30e7\u30f3 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_nb.properties new file mode 100644 index 0000000000..427a842568 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_nb.properties @@ -0,0 +1,5 @@ +module-package.page.title=Modulleser +module-package.no-modules=Ingen modulpakker funnet +module-package.title=Tittel +module-package.description=Beskrivelse +module-package.version=Versjon diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_nl.properties new file mode 100644 index 0000000000..c69949f30b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_nl.properties @@ -0,0 +1,5 @@ +module-package.page.title=Modulebrowser +module-package.no-modules=Geen modulepakketten gevonden +module-package.title=Titel +module-package.description=Beschrijving +module-package.version=Versie diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_pt_BR.properties new file mode 100644 index 0000000000..ed8fad1cef --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_pt_BR.properties @@ -0,0 +1,5 @@ +module-package.page.title=Navegador de m\u00f3dulos +module-package.no-modules=Nenhum Pacote de M\u00f3dulo encontrado +module-package.title=T\u00edtulo +module-package.description=Descri\u00e7\u00e3o +module-package.version=Vers\u00e3o diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_ru.properties new file mode 100644 index 0000000000..4cdc41fee1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_ru.properties @@ -0,0 +1,5 @@ +module-package.page.title=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 +module-package.no-modules=\u041d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e +module-package.title=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a +module-package.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +module-package.version=\u0412\u0435\u0440\u0441\u0438\u044f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_zh_CN.properties new file mode 100644 index 0000000000..8f6da6c732 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/module-package.get_zh_CN.properties @@ -0,0 +1,5 @@ +module-package.page.title=\u6a21\u5757\u6d4f\u89c8\u5668 +module-package.no-modules=\u672a\u627e\u5230\u6a21\u5757\u5305 +module-package.title=\u6807\u9898 +module-package.description=\u8bf4\u660e +module-package.version=\u7248\u672c diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.desc.xml new file mode 100644 index 0000000000..8f5ccc6929 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Node Browser + Administration Console - Node Browser + /components/console/node-browser + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.html.ftl new file mode 100644 index 0000000000..a896c585a6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.html.ftl @@ -0,0 +1,153 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/node-browser.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/node-browser.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + + <#assign el=args.htmlid?html> + +
+ + + + + + + +
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.js new file mode 100644 index 0000000000..6551de949a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.js @@ -0,0 +1,9 @@ +function main() { + // Widget instantiation metadata... + var widget = { + id : "ConsoleNodeBrowser", + name : "Alfresco.ConsoleNodeBrowser" + }; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.properties new file mode 100644 index 0000000000..bd9250ab77 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Node Browser +message.empty=Search to view nodes. +message.error=An error occurred during the search - no results to display. +message.noresults=No results. +message.results=Search for ''{0}'' found {1} results (search took {2}) +message.maxresults=Search for ''{0}'' found over {1} results (search took {2}). Showing first {1} only. +label.select-store=Select Store: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Name +label.parent_path=Parent +label.node-ref=Reference +label.about=About +label.node-ref=Reference +label.node-type=Type +label.node-path=Primary Path +label.parent=Parent +label.properties=Properties +label.properties-name=Name +label.properties-type=Type +label.properties-value=Value +label.properties-residual=Residual +label.aspects=Aspects +label.children=Children +label.children-name=Child Name +label.children-type=Child Type +label.children-node-ref=Child Reference +label.children-assoc-type=Association Type +label.children-primary=Primary +label.children-index=Index +label.parents=Parents +label.parents-name=Child Name +label.parents-type=Parent Type +label.parents-node-ref=Parent Reference +label.parents-assoc-type=Association Type +label.parents-primary=Primary +label.assocs=Associations +label.assocs-name=Target Name +label.assocs-type=Target Type +label.assocs-node-ref=Target Reference +label.assocs-assoc-type=Association Type +label.source-assocs=Source Associations +label.source-assocs-name=Source Name +label.source-assocs-type=Source Type +label.source-assocs-node-ref=Source Reference +label.source-assocs-assoc-type=Association Type +label.permissions=Permissions +label.permissions-permission=Permission +label.node-inherits-permissions=Inherits +label.node-owner=Owner +label.permissions-authority=Authority +label.permissions-access=Access +label.permissions-store-permission=Store Permission +button.searchback=Back to Search +message.getstores-failure=Failed to get store list +message.datatable.empty=No items found +label.node-value-collection=Collection +label.node-value-null=null + +# View node panel +label.title-view=Node Browser +message.getnode-failure=Failed to get node diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_de.properties new file mode 100755 index 0000000000..088d6452dc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_de.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Node-Browser +message.empty=Suchen, um Nodes anzuzeigen. +message.error=W\u00e4hrend der Suche trat ein Fehler auf - keine Ergebnisse anzuzeigen. +message.noresults=Keine Ergebnisse. +message.results=Suche nach ''{0}'' ergab {1} Ergebnisse (Suche dauerte {2}) +message.maxresults=Suche nach ''{0}'' ergab mehr als {1} Ergebnisse (Suche dauerte {2}). Es werden nur die ersten {1} angezeigt. +label.select-store=Speicher ausw\u00e4hlen: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Name +label.parent_path=\u00dcbergeordnetes Element +label.node-ref=Referenz +label.about=\u00dcber +label.node-ref=Referenz +label.node-type=Typ +label.node-path=Prim\u00e4rer Pfad +label.parent=\u00dcbergeordnetes Element +label.properties=Eigenschaften +label.properties-name=Name +label.properties-type=Typ +label.properties-value=Wert +label.properties-residual=Rest +label.aspects=Aspekte +label.children=Untergeordnete Elemente +label.children-name=Name des untergeordneten Elements +label.children-type=Typ des untergeordneten Elements +label.children-node-ref=Referenz des untergeordneten Elements +label.children-assoc-type=Zuordnungstyp +label.children-primary=Prim\u00e4r +label.children-index=Index +label.parents=\u00dcbergeordnete Elemente +label.parents-name=Name des untergeordneten Elements +label.parents-type=Typ des \u00fcbergeordneten Elements +label.parents-node-ref=Referenz des \u00fcbergeordneten Elements +label.parents-assoc-type=Zuordnungstyp +label.parents-primary=Prim\u00e4r +label.assocs=Zuordnungen +label.assocs-name=Zielname +label.assocs-type=Zieltyp +label.assocs-node-ref=Zielreferenz +label.assocs-assoc-type=Zuordnungstyp +label.source-assocs=Quellzuordnungen +label.source-assocs-name=Quellname +label.source-assocs-type=Quelltyp +label.source-assocs-node-ref=Quellreferenz +label.source-assocs-assoc-type=Zuordnungstyp +label.permissions=Berechtigungen +label.permissions-permission=Berechtigung +label.node-inherits-permissions=Erbt +label.node-owner=Eigent\u00fcmer +label.permissions-authority=Authority +label.permissions-access=Zugriff +label.permissions-store-permission=Speicherberechtigung +button.searchback=Zur\u00fcck zur Suche +message.getstores-failure=Speicherliste konnte nicht abgerufen werden +message.datatable.empty=Keine Elemente gefunden +label.node-value-collection=Sammlung +label.node-value-null=Null + +# View node panel +label.title-view=Node-Browser +message.getnode-failure=Fehler beim Zugriff auf Node diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_es.properties new file mode 100755 index 0000000000..888d737570 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_es.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Navegador de nodos +message.empty=B\u00fasqueda de nodos. +message.error=Sucedi\u00f3 un error mientras se procesaba la b\u00fasqueda - No se mostrar\u00e1 ning\u00fan resultado. +message.noresults=Ning\u00fan resultado. +message.results=La b\u00fasqueda de ''{0}'' ha encontrado {1} resultados (la b\u00fasqueda ha tardado {2}) +message.maxresults=La b\u00fasqueda de ''{0}'' ha encontrado m\u00e1s {1} resultados (la b\u00fasqueda ha tardado {2}). Se muestran solo los primeros {1}. +label.select-store=Seleccionar almac\u00e9n: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Nombre +label.parent_path=Elementos primario +label.node-ref=Referencia +label.about=Acerca de +label.node-ref=Referencia +label.node-type=Tipo +label.node-path=Ruta primaria +label.parent=Elemento primario +label.properties=Propiedades +label.properties-name=Nombre +label.properties-type=Tipo +label.properties-value=Valor +label.properties-residual=Residual +label.aspects=Aspectos +label.children=Subdirectorios +label.children-name=Nombre de subdirectorio +label.children-type=Tipo de subdirectorio +label.children-node-ref=Referencia de subdirectorio +label.children-assoc-type=Tipo de asociaci\u00f3n +label.children-primary=Primario +label.children-index=\u00cdndice +label.parents=Elementos primarios +label.parents-name=Nombre de subdirectorio +label.parents-type=Tipo de elemento primario +label.parents-node-ref=Referencia de elemento primario +label.parents-assoc-type=Tipo de asociaci\u00f3n +label.parents-primary=Primario +label.assocs=Asociaciones +label.assocs-name=Nombre de destino +label.assocs-type=Tipo de destino +label.assocs-node-ref=Referencia de destino +label.assocs-assoc-type=Tipo de asociaci\u00f3n +label.source-assocs=Asociaciones de origen +label.source-assocs-name=Nombre de origen +label.source-assocs-type=Tipo de origen +label.source-assocs-node-ref=Referencia de origen +label.source-assocs-assoc-type=Tipo de asociaci\u00f3n +label.permissions=Permisos +label.permissions-permission=Permiso +label.node-inherits-permissions=Herencias +label.node-owner=Propietario +label.permissions-authority=Autoridad +label.permissions-access=Acceso +label.permissions-store-permission=Almacenar permiso +button.searchback=Volver a la b\u00fasqueda +message.getstores-failure=No se pudo conseguir la lista de almacenes +message.datatable.empty=No se encontr\u00f3 ning\u00fan elemento +label.node-value-collection=Colecci\u00f3n +label.node-value-null=nulo + +# View node panel +label.title-view=Navegador de nodos +message.getnode-failure=No se pudo conseguir el nodo diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_fr.properties new file mode 100755 index 0000000000..0bd0c4eb2e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_fr.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Navigateur de n\u0153uds +message.empty=Rechercher les n\u0153uds. +message.error=Une erreur s'est produite pendant la recherche - Aucun r\u00e9sultat \u00e0 afficher. +message.noresults=Pas de r\u00e9sultat. +message.results=La recherche de ''{0}'' a trouv\u00e9 {1} r\u00e9sultat(s) (la recherche a pris {2}) +message.maxresults=La recherche de ''{0}'' a trouv\u00e9 plus de {1} r\u00e9sultats (la recherche a pris {2}). Affichage des {1} premiers seulement. +label.select-store=S\u00e9lectionner le store : +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Nom +label.parent_path=Parent +label.node-ref=R\u00e9f\u00e9rence +label.about=\u00c0 propos +label.node-ref=R\u00e9f\u00e9rence +label.node-type=Type +label.node-path=Chemin primaire +label.parent=Parent +label.properties=Propri\u00e9t\u00e9s +label.properties-name=Nom +label.properties-type=Type +label.properties-value=Valeur +label.properties-residual=R\u00e9siduelle +label.aspects=Aspects +label.children=Sous-r\u00e9pertoires +label.children-name=Nom du sous-r\u00e9pertoire +label.children-type=Type de sous-r\u00e9pertoire +label.children-node-ref=R\u00e9f\u00e9rence du sous-r\u00e9pertoire +label.children-assoc-type=Type d'association +label.children-primary=Primaire +label.children-index=Index +label.parents=Parents +label.parents-name=Nom du sous-r\u00e9pertoire +label.parents-type=Type de parent +label.parents-node-ref=R\u00e9f\u00e9rence du parent +label.parents-assoc-type=Type d'association +label.parents-primary=Primaire +label.assocs=Associations +label.assocs-name=Nom de la cible +label.assocs-type=Type de cible +label.assocs-node-ref=R\u00e9f\u00e9rence de la cible +label.assocs-assoc-type=Type d'association +label.source-assocs=Associations source +label.source-assocs-name=Nom de la source +label.source-assocs-type=Type de source +label.source-assocs-node-ref=R\u00e9f\u00e9rence de la source +label.source-assocs-assoc-type=Type d'association +label.permissions=Autorisations +label.permissions-permission=Autorisation +label.node-inherits-permissions=H\u00e9rite +label.node-owner=Propri\u00e9taire +label.permissions-authority=Autorit\u00e9s +label.permissions-access=Acc\u00e8s +label.permissions-store-permission=Autorisation de stockage +button.searchback=Revenir \u00e0 la recherche +message.getstores-failure=Echec de l'obtention de la liste de stores +message.datatable.empty=Pas d'\u00e9l\u00e9ment trouv\u00e9 +label.node-value-collection=Collection +label.node-value-null=nulle + +# View node panel +label.title-view=Navigateur de n\u0153uds +message.getnode-failure=Echec de l'obtention du n\u0153ud diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_it.properties new file mode 100755 index 0000000000..08b4a6130a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_it.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Browser nodi +message.empty=Cerca per visualizzare i nodi. +message.error=Si \u00e8 verificato un errore durante la ricerca - Nessun risultato da visualizzare. +message.noresults=Nessun risultato. +message.results=La ricerca di ''{0}'' ha restituito {1} risultati (tempo impiegato per la ricerca: {2}) +message.maxresults=La ricerca di ''{0}'' ha restituito oltre {1} risultati (tempo impiegato per la ricerca: {2}). Vengono mostrati solo i primi {1}. +label.select-store=Seleziona deposito: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Nome +label.parent_path=Genitore +label.node-ref=Riferimento +label.about=Informazioni +label.node-ref=Riferimento +label.node-type=Tipo +label.node-path=Percorso principale +label.parent=Genitore +label.properties=Propriet\u00e0 +label.properties-name=Nome +label.properties-type=Tipo +label.properties-value=Valore +label.properties-residual=Residuo +label.aspects=Aspetti +label.children=Figli +label.children-name=Nome figlio +label.children-type=Tipo di figlio +label.children-node-ref=Riferimento figlio +label.children-assoc-type=Tipo di associazione +label.children-primary=Primario +label.children-index=Indice +label.parents=Genitori +label.parents-name=Nome figlio +label.parents-type=Tipo di genitore +label.parents-node-ref=Riferimento genitore +label.parents-assoc-type=Tipo di associazione +label.parents-primary=Primario +label.assocs=Associazioni +label.assocs-name=Nome destinazione +label.assocs-type=Tipo di destinazione +label.assocs-node-ref=Riferimento destinazione +label.assocs-assoc-type=Tipo di associazione +label.source-assocs=Associazioni fonte +label.source-assocs-name=Nome fonte +label.source-assocs-type=Tipo di fonte +label.source-assocs-node-ref=Riferimento fonte +label.source-assocs-assoc-type=Tipo di associazione +label.permissions=Autorizzazioni +label.permissions-permission=Autorizzazione +label.node-inherits-permissions=Eredit\u00e0 +label.node-owner=Proprietario +label.permissions-authority=Autorit\u00e0 +label.permissions-access=Accesso +label.permissions-store-permission=Autorizzazione deposito +button.searchback=Torna alla ricerca +message.getstores-failure=Impsosibile ottenere l'elenco depositi +message.datatable.empty=Nessun elemento trovato +label.node-value-collection=Raccolta +label.node-value-null=nullo + +# View node panel +label.title-view=Browser nodi +message.getnode-failure=Impossibile ottenere il nodo diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_ja.properties new file mode 100755 index 0000000000..68b6bb0bab --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_ja.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=\u30ce\u30fc\u30c9\u30d6\u30e9\u30a6\u30b6 +message.empty=\u30ce\u30fc\u30c9\u3092\u691c\u7d22\u3057\u3066\u8868\u793a\u3067\u304d\u307e\u3059\u3002 +message.error=\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f - \u8868\u793a\u3059\u308b\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.noresults=\u691c\u7d22\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.results=''{0}'' \u306e\u691c\u7d22\u7d50\u679c: {1} \u4ef6 \uff08\u691c\u7d22\u6240\u8981\u6642\u9593: {2}\uff09 +message.maxresults=''{0}'' \u306e\u691c\u7d22\u7d50\u679c: {1} \u4ef6\u4ee5\u4e0a \uff08\u691c\u7d22\u6240\u8981\u6642\u9593: {2}\uff09\u3002\u6700\u521d\u306e {1} \u4ef6\u306e\u307f\u3092\u8868\u793a\u3057\u3066\u3044\u307e\u3059\u3002 +label.select-store=\u30b9\u30c8\u30a2\u306e\u9078\u629e\uff1a: +label.elapsedSeconds=\u79d2 +label.elapsedMilliseconds=\u30df\u30ea\u79d2 + +# Node view panel +label.name=\u540d\u524d +label.parent_path=\u89aa +label.node-ref=\u53c2\u7167 +label.about=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 +label.node-ref=\u53c2\u7167 +label.node-type=\u30bf\u30a4\u30d7 +label.node-path=\u30d7\u30e9\u30a4\u30de\u30ea\u30d1\u30b9 +label.parent=\u89aa +label.properties=\u30d7\u30ed\u30d1\u30c6\u30a3 +label.properties-name=\u540d\u524d +label.properties-type=\u30bf\u30a4\u30d7 +label.properties-value=\u5024 +label.properties-residual=\u672a\u51e6\u7406 +label.aspects=\u30a2\u30b9\u30da\u30af\u30c8 +label.children=\u5b50 +label.children-name=\u5b50\u306e\u540d\u524d +label.children-type=\u5b50\u306e\u30bf\u30a4\u30d7 +label.children-node-ref=\u5b50\u306e\u53c2\u7167 +label.children-assoc-type=\u95a2\u9023\u4ed8\u3051\u306e\u30bf\u30a4\u30d7 +label.children-primary=\u30d7\u30e9\u30a4\u30de\u30ea +label.children-index=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9 +label.parents=\u89aa +label.parents-name=\u5b50\u306e\u540d\u524d +label.parents-type=\u89aa\u30bf\u30a4\u30d7 +label.parents-node-ref=\u89aa\u306e\u53c2\u7167 +label.parents-assoc-type=\u95a2\u9023\u4ed8\u3051\u306e\u30bf\u30a4\u30d7 +label.parents-primary=\u30d7\u30e9\u30a4\u30de\u30ea +label.assocs=\u95a2\u9023\u4ed8\u3051 +label.assocs-name=\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u540d\u524d +label.assocs-type=\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u30bf\u30a4\u30d7 +label.assocs-node-ref=\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u53c2\u7167 +label.assocs-assoc-type=\u95a2\u9023\u4ed8\u3051\u306e\u30bf\u30a4\u30d7 +label.source-assocs=\u30bd\u30fc\u30b9\u306e\u95a2\u9023\u4ed8\u3051 +label.source-assocs-name=\u30bd\u30fc\u30b9\u306e\u540d\u524d +label.source-assocs-type=\u30bd\u30fc\u30b9\u306e\u30bf\u30a4\u30d7 +label.source-assocs-node-ref=\u30bd\u30fc\u30b9\u306e\u53c2\u7167 +label.source-assocs-assoc-type=\u95a2\u9023\u4ed8\u3051\u306e\u30bf\u30a4\u30d7 +label.permissions=\u6a29\u9650 +label.permissions-permission=\u6a29\u9650 +label.node-inherits-permissions=\u7d99\u627f +label.node-owner=\u6240\u6709\u8005 +label.permissions-authority=\u627f\u8a8d\u8005 +label.permissions-access=\u30a2\u30af\u30bb\u30b9 +label.permissions-store-permission=\u30b9\u30c8\u30a2\u306e\u6a29\u9650 +button.searchback=\u691c\u7d22\u306b\u623b\u308b +message.getstores-failure=\u30b9\u30c8\u30a2\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.datatable.empty=\u30a2\u30a4\u30c6\u30e0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 +label.node-value-collection=\u30b3\u30ec\u30af\u30b7\u30e7\u30f3 +label.node-value-null=\u30cc\u30eb + +# View node panel +label.title-view=\u30ce\u30fc\u30c9\u30d6\u30e9\u30a6\u30b6 +message.getnode-failure=\u30ce\u30fc\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_nb.properties new file mode 100755 index 0000000000..28b659bd90 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_nb.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Nodeleser +message.empty=S\u00f8k for \u00e5 vise nodder. +message.error=Det oppsto en feil under s\u00f8ket \u2014 ingen resultater vises. +message.noresults=Ingen resultater. +message.results=S\u00f8k etter ''{0}'' ga {1} resultater (s\u00f8ket tok {2}) +message.maxresults=S\u00f8k etter ''{0}'' ga flere enn {1} resultater (s\u00f8ket tok {2}). Viser kun de {1} f\u00f8rste. +label.select-store=Velg butikk: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Navn +label.parent_path=Overordnet +label.node-ref=Referanse +label.about=Om +label.node-ref=Referanse +label.node-type=Type +label.node-path=Prim\u00e6rbane +label.parent=Overordnet +label.properties=Egenskaper +label.properties-name=Navn +label.properties-type=Type +label.properties-value=Verdi +label.properties-residual=Rest +label.aspects=Aspekter +label.children=Underordnede +label.children-name=Underordnedes navn +label.children-type=Type underordnet +label.children-node-ref=Referanse for underordnet +label.children-assoc-type=Type tilknytning +label.children-primary=Prim\u00e6r +label.children-index=Indeks +label.parents=Overordnede +label.parents-name=Underordnedes navn +label.parents-type=Type overordnet +label.parents-node-ref=Referanse for overordnet +label.parents-assoc-type=Type tilknytning +label.parents-primary=Prim\u00e6r +label.assocs=Tilknytninger +label.assocs-name=Navn p\u00e5 m\u00e5l +label.assocs-type=Type m\u00e5l +label.assocs-node-ref=Referanse for m\u00e5l +label.assocs-assoc-type=Type tilknytning +label.source-assocs=Kildetilknytninger +label.source-assocs-name=Kildenavn +label.source-assocs-type=Type kilde +label.source-assocs-node-ref=Referanse for kilde +label.source-assocs-assoc-type=Type tilknytning +label.permissions=Tillatelser +label.permissions-permission=Tillatelse +label.node-inherits-permissions=Arver +label.node-owner=Eier +label.permissions-authority=Autoritet +label.permissions-access=Tilgang +label.permissions-store-permission=Butikktillatelse +button.searchback=Tilbake til S\u00f8k +message.getstores-failure=Fikk ikke butikkliste +message.datatable.empty=Finner ingen elementer +label.node-value-collection=Samling +label.node-value-null=null + +# View node panel +label.title-view=Nodeleser +message.getnode-failure=Fikk ikke node diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_nl.properties new file mode 100755 index 0000000000..7a18c1faa2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_nl.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Nodebrowser +message.empty=Zoeken om nodes weer te geven. +message.error=Er is een fout opgetreden bij het zoeken - geen resultaten om weer te geven. +message.noresults=Geen resultaten. +message.results=Bij zoeken naar ''{0}'' zijn {1} resultaten gevonden (zoeken duurde {2}) +message.maxresults=Bij zoeken naar ''{0}'' zijn meer dan {1} resultaten gevonden (zoeken duurde {2}). Alleen eerste {1} weergeven. +label.select-store=Selecteer archief: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Naam +label.parent_path=Bovenliggend element +label.node-ref=Verwijzing +label.about=Info +label.node-ref=Verwijzing +label.node-type=Type +label.node-path=Primair pad +label.parent=Bovenliggend element +label.properties=Eigenschappen +label.properties-name=Naam +label.properties-type=Type +label.properties-value=Waarde +label.properties-residual=Restwaarde +label.aspects=Aspecten +label.children=Onderliggende elementen +label.children-name=Naam onderliggend element +label.children-type=Type onderliggend element +label.children-node-ref=Verwijzing naar onderliggend element +label.children-assoc-type=Type koppeling +label.children-primary=Primair +label.children-index=Index +label.parents=Bovenliggende elementen +label.parents-name=Naam onderliggend element +label.parents-type=Bovenliggend type +label.parents-node-ref=Verwijzing naar bovenliggend element +label.parents-assoc-type=Type koppeling +label.parents-primary=Primair +label.assocs=Koppelingen +label.assocs-name=Naam van bestemming +label.assocs-type=Type bestemming +label.assocs-node-ref=Verwijzing naar bestemming +label.assocs-assoc-type=Type koppeling +label.source-assocs=Koppelingen naar bron +label.source-assocs-name=Naam van bron +label.source-assocs-type=Type bron +label.source-assocs-node-ref=Verwijzing naar bron +label.source-assocs-assoc-type=Type koppeling +label.permissions=Rechten +label.permissions-permission=Recht +label.node-inherits-permissions=Neemt over +label.node-owner=Eigenaar +label.permissions-authority=Autoriteit +label.permissions-access=Toegang +label.permissions-store-permission=Opslagrecht +button.searchback=Terug naar zoeken +message.getstores-failure=Kan archieflijst niet ophalen +message.datatable.empty=Geen items gevonden +label.node-value-collection=Verzameling +label.node-value-null=null + +# View node panel +label.title-view=Nodebrowser +message.getnode-failure=Kan node niet ophalen diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_pt_BR.properties new file mode 100644 index 0000000000..bbaacdc117 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_pt_BR.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=Navegador de n\u00f3s +message.empty=Pesquisar para exibir os n\u00f3s. +message.error=Ocorreu um erro durante a pesquisa. N\u00e3o h\u00e1 resultados a serem exibidos. +message.noresults=Nenhum resultado. +message.results=A pesquisa de ''{0}'' encontrou {1} resultados (a pesquisa levou {2}) +message.maxresults=A pesquisa de ''{0}'' encontrou mais de {1} resultados (a pesquisa levou {2}). Mostrando apenas os primeiros {1}. +label.select-store=Selecionar armazenamento: +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=Nome +label.parent_path=Prim\u00e1rio +label.node-ref=Refer\u00eancia +label.about=Sobre +label.node-ref=Refer\u00eancia +label.node-type=Tipo +label.node-path=Caminho prim\u00e1rio +label.parent=Prim\u00e1rio +label.properties=Propriedades +label.properties-name=Nome +label.properties-type=Tipo +label.properties-value=Valor +label.properties-residual=Residual +label.aspects=Aspectos +label.children=Secund\u00e1rios +label.children-name=Nome do secund\u00e1rio +label.children-type=Tipo do secund\u00e1rio +label.children-node-ref=Refer\u00eancia do secund\u00e1rio +label.children-assoc-type=Tipo de associa\u00e7\u00e3o +label.children-primary=Prim\u00e1rio +label.children-index=\u00cdndice +label.parents=Prim\u00e1rios +label.parents-name=Nome do secund\u00e1rio +label.parents-type=Tipo de prim\u00e1rio +label.parents-node-ref=Refer\u00eancia de prim\u00e1rio +label.parents-assoc-type=Tipo de associa\u00e7\u00e3o +label.parents-primary=Prim\u00e1rio +label.assocs=Associa\u00e7\u00f5es +label.assocs-name=Nome de destino +label.assocs-type=Tipo de destino +label.assocs-node-ref=Refer\u00eancia de destino +label.assocs-assoc-type=Tipo de associa\u00e7\u00e3o +label.source-assocs=Associa\u00e7\u00f5es de origem +label.source-assocs-name=Nome de origem +label.source-assocs-type=Tipo de origem +label.source-assocs-node-ref=Refer\u00eancia de origem +label.source-assocs-assoc-type=Tipo de associa\u00e7\u00e3o +label.permissions=Permiss\u00f5es +label.permissions-permission=Permiss\u00e3o +label.node-inherits-permissions=Herda +label.node-owner=Propriet\u00e1rio +label.permissions-authority=Autoridade +label.permissions-access=Acessar +label.permissions-store-permission=Permiss\u00e3o de armazenamento +button.searchback=Voltar \u00e0 pesquisa +message.getstores-failure=Falha ao obter a lista de armazenamento +message.datatable.empty=Nenhum item encontrado +label.node-value-collection=Cole\u00e7\u00e3o +label.node-value-null=nulo + +# View node panel +label.title-view=Navegador de n\u00f3s +message.getnode-failure=Falha ao obter o n\u00f3 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_ru.properties new file mode 100755 index 0000000000..39943ad97d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_ru.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 +message.empty=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043f\u043e\u0438\u0441\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b. +message.error=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u2014 \u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. +message.noresults=\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. +message.results=\u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 ''{0}'' \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432: {1} (\u043f\u043e\u0438\u0441\u043a \u0434\u043b\u0438\u043b\u0441\u044f {2}) +message.maxresults=\u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 ''{0}'' \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u0432\u044b\u0448\u0435: {1} (\u043f\u043e\u0438\u0441\u043a \u0434\u043b\u0438\u043b\u0441\u044f {2}). \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 {1}. +label.select-store=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435: +label.elapsedSeconds=\u0441 +label.elapsedMilliseconds=\u043c\u0441 + +# Node view panel +label.name=\u0418\u043c\u044f +label.parent_path=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 +label.node-ref=\u0421\u0441\u044b\u043b\u043a\u0430 +label.about=\u041a\u0440\u0430\u0442\u043a\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +label.node-ref=\u0421\u0441\u044b\u043b\u043a\u0430 +label.node-type=\u0422\u0438\u043f +label.node-path=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u0442\u044c +label.parent=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 +label.properties=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +label.properties-name=\u0418\u043c\u044f +label.properties-type=\u0422\u0438\u043f +label.properties-value=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 +label.properties-residual=\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 +label.aspects=\u0410\u0441\u043f\u0435\u043a\u0442\u044b +label.children=\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b +label.children-name=\u0418\u043c\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 +label.children-type=\u0422\u0438\u043f \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 +label.children-node-ref=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 +label.children-assoc-type=\u0422\u0438\u043f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 +label.children-primary=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 +label.children-index=\u0418\u043d\u0434\u0435\u043a\u0441 +label.parents=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b +label.parents-name=\u0418\u043c\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 +label.parents-type=\u0422\u0438\u043f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 +label.parents-node-ref=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 +label.parents-assoc-type=\u0422\u0438\u043f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 +label.parents-primary=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 +label.assocs=\u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 +label.assocs-name=\u0418\u043c\u044f \u0446\u0435\u043b\u0438 +label.assocs-type=\u0422\u0438\u043f \u0446\u0435\u043b\u0438 +label.assocs-node-ref=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0446\u0435\u043b\u044c +label.assocs-assoc-type=\u0422\u0438\u043f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 +label.source-assocs=\u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 +label.source-assocs-name=\u0418\u043c\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 +label.source-assocs-type=\u0422\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 +label.source-assocs-node-ref=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a +label.source-assocs-assoc-type=\u0422\u0438\u043f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 +label.permissions=\u041f\u0440\u0430\u0432\u0430 +label.permissions-permission=\u041f\u0440\u0430\u0432\u043e +label.node-inherits-permissions=\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 +label.node-owner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 +label.permissions-authority=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +label.permissions-access=\u0414\u043e\u0441\u0442\u0443\u043f +label.permissions-store-permission=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e +button.searchback=\u041d\u0430\u0437\u0430\u0434 \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 +message.getstores-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 +message.datatable.empty=\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b +label.node-value-collection=\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f +label.node-value-null=\u043f\u0443\u0441\u0442\u043e + +# View node panel +label.title-view=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 +message.getnode-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_zh_CN.properties new file mode 100755 index 0000000000..a1067bc9c5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/node-browser.get_zh_CN.properties @@ -0,0 +1,65 @@ +# Search panel +label.title-search=\u8282\u70b9\u6d4f\u89c8\u5668 +message.empty=\u641c\u7d22\u4ee5\u67e5\u770b\u8282\u70b9\u3002 +message.error=\u641c\u7d22\u671f\u95f4\u51fa\u9519 - \u65e0\u7ed3\u679c\u53ef\u663e\u793a\u3002 +message.noresults=\u65e0\u7ed3\u679c\u3002 +message.results=\u641c\u7d22 ''{0}'' \u627e\u5230 {1} \u4e2a\u7ed3\u679c\uff08\u641c\u7d22\u82b1\u8d39 {2}\uff09 +message.maxresults=\u641c\u7d22 ''{0}'' \u627e\u5230\u8d85\u8fc7 {1} \u4e2a\u7ed3\u679c\uff08\u641c\u7d22\u82b1\u8d39 {2}\uff09\u3002\u4ec5\u663e\u793a\u524d {1} \u4e2a\u3002 +label.select-store=\u9009\u62e9\u5e93\uff1a +label.elapsedSeconds=s +label.elapsedMilliseconds=ms + +# Node view panel +label.name=\u540d\u79f0 +label.parent_path=\u7236\u7ea7 +label.node-ref=\u5f15\u7528 +label.about=\u5173\u4e8e +label.node-ref=\u5f15\u7528 +label.node-type=\u7c7b\u578b +label.node-path=\u4e3b\u8def\u5f84 +label.parent=\u7236\u7ea7 +label.properties=\u5c5e\u6027 +label.properties-name=\u540d\u79f0 +label.properties-type=\u7c7b\u578b +label.properties-value=\u503c +label.properties-residual=\u6b8b\u7559 +label.aspects=\u5207\u9762 +label.children=\u5b50\u7ea7 +label.children-name=\u5b50\u540d\u79f0 +label.children-type=\u5b50\u7c7b\u578b +label.children-node-ref=\u5b50\u5f15\u7528 +label.children-assoc-type=\u5173\u8054\u7c7b\u578b +label.children-primary=\u4e3b +label.children-index=\u7d22\u5f15 +label.parents=\u7236\u7ea7 +label.parents-name=\u5b50\u540d\u79f0 +label.parents-type=\u7236\u7c7b\u578b +label.parents-node-ref=\u7236\u5f15\u7528 +label.parents-assoc-type=\u5173\u8054\u7c7b\u578b +label.parents-primary=\u4e3b +label.assocs=\u5173\u8054 +label.assocs-name=\u76ee\u6807\u540d\u79f0 +label.assocs-type=\u76ee\u6807\u7c7b\u578b +label.assocs-node-ref=\u76ee\u6807\u5f15\u7528 +label.assocs-assoc-type=\u5173\u8054\u7c7b\u578b +label.source-assocs=\u6e90\u5173\u8054 +label.source-assocs-name=\u6e90\u540d\u79f0 +label.source-assocs-type=\u6e90\u7c7b\u578b +label.source-assocs-node-ref=\u6e90\u5f15\u7528 +label.source-assocs-assoc-type=\u5173\u8054\u7c7b\u578b +label.permissions=\u6743\u9650 +label.permissions-permission=\u6743\u9650 +label.node-inherits-permissions=\u7ee7\u627f +label.node-owner=\u6240\u6709\u8005 +label.permissions-authority=\u6388\u6743 +label.permissions-access=\u8bbf\u95ee +label.permissions-store-permission=\u5e93\u6743\u9650 +button.searchback=\u8fd4\u56de\u641c\u7d22 +message.getstores-failure=\u83b7\u53d6\u5e93\u5217\u8868\u5931\u8d25 +message.datatable.empty=\u672a\u627e\u5230\u9879 +label.node-value-collection=\u6536\u96c6 +label.node-value-null=\u7a7a + +# View node panel +label.title-view=\u8282\u70b9\u6d4f\u89c8\u5668 +message.getnode-failure=\u83b7\u53d6\u8282\u70b9\u5931\u8d25 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.config.xml new file mode 100644 index 0000000000..2a95ff0ae7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.config.xml @@ -0,0 +1,8 @@ + + tool.activities.label +
+ mbean + Alfresco:Type=Configuration,Category=ActivitiesFeed,id1=default +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.desc.xml new file mode 100644 index 0000000000..f253aaa12d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Activities Feed Tool + Administration Console - Activities Feed Tool + /components/console/activities + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/activities.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.config.xml new file mode 100644 index 0000000000..ad8d2a0422 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.config.xml @@ -0,0 +1,8 @@ + + tool.fileservers.label +
+ mbean + Alfresco:Type=Configuration,Category=fileServers,id1=default +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.desc.xml new file mode 100644 index 0000000000..b96c2d5c14 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Fileservers Tool + Administration Console - Fileservers Tool + /components/console/fileservers + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/fileservers.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.config.xml new file mode 100644 index 0000000000..40469c7881 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.config.xml @@ -0,0 +1,11 @@ + + tool.license.label +
+ mbean + Alfresco:Name=License + false + false + true +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.desc.xml new file mode 100644 index 0000000000..269cbc44b9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console License Tool + Administration Console - License Tool + /components/console/license + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.html.ftl new file mode 100644 index 0000000000..e7eb073d54 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.html.ftl @@ -0,0 +1,55 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config "license"> +
+

${msg("tool.license.usageinfo.label")}

+ +
+ + <#if usage.level != 0> +
+ +
+ + + +<@link rel="stylesheet" type="text/css" href="${page.url.context}/res/components/console/generic-form-tool.css" /> + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.js new file mode 100644 index 0000000000..43218c5bd5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/license.get.js @@ -0,0 +1,19 @@ +/** + * Admin Console License info component GET method + */ + +function main() +{ + var usage = {}; + + // retrieve license usage information + var result = remote.call("/api/admin/usage"); + if (result.status.code == status.STATUS_OK) + { + usage = JSON.parse(result); + } + + model.usage = usage; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.desc.xml new file mode 100644 index 0000000000..75b7d609eb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Replication Jobs Tool + Administration Console - Replication Jobs Tool + /components/console/replication-jobs + admin-console + edition:ENTERPRISE + edition:UNKNOWN + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.html.ftl new file mode 100644 index 0000000000..5c6de3a018 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.html.ftl @@ -0,0 +1,137 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/replication-jobs.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/replication-jobs.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + + <#assign id = args.htmlid?html> +
+ + + + + + +
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.js new file mode 100644 index 0000000000..a0c5c26372 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.js @@ -0,0 +1,35 @@ +/** + * Admin Console Replication Jobs Tool component + */ + +function main() +{ + // Model variables + var targetGroupPath = "/Data Dictionary/Transfers/Transfer Target Groups/Default Group"; + + var targetGroupXPath = "/app:company_home/app:dictionary/app:transfers/app:transfer_groups/cm:default", + response = remote.call("/api/forms/picker/node/children?xpath=" + encodeURIComponent(targetGroupXPath)); + + if (response.status == 200) + { + var json = JSON.parse(response), + parent = json.data.parent; + + targetGroupPath = "/" + parent.displayPath.split("/").slice(2).join("/") + "/" + parent.name; + } + + model.targetGroupPath = targetGroupPath; + + // Widget instantiation metadata... + var widget = { + id : "ConsoleReplicationJobs", + name : "Alfresco.ConsoleReplicationJobs", + options : { + jobName: (page.url.args.jobName != null) ? page.url.args.jobName: "", + targetGroupPath: (model.targetGroupPath != null) ? model.targetGroupPath: "" + } + }; + model.widgets = [widget]; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.properties new file mode 100644 index 0000000000..821e6803fa --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Failed to retrieve Replication Definitions +message.get-job-details.failure=Failed to retrieve details for Job with name "{0}" +message.invalid-data.failure=Invalid data received from Repository +message.error-unknown=An unknown error occurred whilst displaying the Replication Jobs list. +message.confirm.delete.title=Delete Job +message.confirm.delete=Are you sure you want to delete ''{0}''? +message.delete.success=''{0}'' was deleted +message.delete.failure=Could not delete ''{0}'' +message.run.failure=Could not run ''{0}'' +message.cancel.failure=Could not cancel ''{0}'' + +button.create-job=Create Job +button.sort-by=Sort by: {0} +button.run-job=Run Job +button.cancel-job=Cancel Job +button.edit-job=Edit +button.delete-job=Delete +button.refresh=Refresh +button.view-report.local=View Local Report +button.view-report.remote=View Remote Report + +header.summary=Summary +header.jobs=Jobs + +label.summary.job-count={0} Replication Jobs +label.summary.cancelled={0} job(s) cancelled +label.summary.completed={0} job(s) completed +label.summary.failed={0} job(s) failed +label.summary.new={0} job(s) with no status +label.summary.running={0} job(s) running +label.sort-by.status=Status +label.sort-by.name=Name +label.sort-by.last-run-date=Last Run Date +label.no-jobs=No Replication Jobs Found +label.no-job-selected=No Job Selected +label.status=Status +label.status.cancelled=This job has been cancelled. {0} {1} +label.status.cancelrequested=Cancel request pending. {0} +label.status.completed=Last job successful. {0} {1} +label.status.failed=Last job failed. {0} {1} +label.status.new=This job has never run. +label.status.none=(None) +label.status.pending=This job has been queued. +label.status.running=This job is currently running. {0} {1} +label.started-at=Job started: {0} +label.ended-at=Ended: {0} +label.schedule=Schedule +label.schedule.none=(No schedule set) +label.schedule.details=Start at {0} and repeat every {1}{2} +label.transfer-target=Transfer Target +label.transfer-target.none=(No transfer target set) +label.payload=Payload +label.payload.none=(None) + +job.enabled=Enabled +job.disabled=Disabled diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_de.properties new file mode 100755 index 0000000000..646bc6415e --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_de.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Definitionen der Replikation konnten nicht abgerufen werden +message.get-job-details.failure=Details f\u00fcr Job unter dem Namen ''{0}'' konnten nicht abgerufen werden +message.invalid-data.failure=Repository hat ung\u00fcltige Daten ausgegeben +message.error-unknown=Beim Anzeigen der Liste der Replikationsjobs ist ein unbekannter Fehler aufgetreten. +message.confirm.delete.title=Job l\u00f6schen +message.confirm.delete=M\u00f6chten Sie ''{0}'' wirklich l\u00f6schen? +message.delete.success=''{0}'' wurde gel\u00f6scht +message.delete.failure=''{0}'' konnte nicht gel\u00f6scht werden +message.run.failure=''{0}'' konnte nicht ausgef\u00fchrt werden +message.cancel.failure=''{0}'' konnte nicht abgebrochen werden + +button.create-job=Job anlegen +button.sort-by=Sortieren nach: {0} +button.run-job=Job ausf\u00fchren +button.cancel-job=Job abbrechen +button.edit-job=Bearbeiten +button.delete-job=L\u00f6schen +button.refresh=Aktualisieren +button.view-report.local=Lokalen Bericht anzeigen +button.view-report.remote=Bericht mit Remoteverarbeitung anzeigen + +header.summary=Zusammenfassung +header.jobs=Jobs + +label.summary.job-count={0} Replikationsjobs +label.summary.cancelled={0} Job(s) abgebrochen +label.summary.completed={0} Job(s) abgeschlossen +label.summary.failed={0} Job(s) fehlgeschlagen +label.summary.new={0} Job(s) ohne Status +label.summary.running={0} laufende Job(s) +label.sort-by.status=Status +label.sort-by.name=Name +label.sort-by.last-run-date=Datum der letzten Ausf\u00fchrung +label.no-jobs=Keine Replikationsjobs gefunden +label.no-job-selected=Kein Job ausgew\u00e4hlt +label.status=Status +label.status.cancelled=Diese Job wurde abgebrochen. {0} {1} +label.status.cancelrequested=Abbruchsanforderung l\u00e4uft. {0} +label.status.completed=Letzter Job erfolgreich. {0} {1} +label.status.failed=Letzter Job fehlgeschlagen. {0} {1} +label.status.new=Dieser Job wurde nie ausgef\u00fchrt. +label.status.none=(Kein) +label.status.pending=Diese Job wurde in die Warteschlange gestellt. +label.status.running=Dieser Job wird gerade ausgef\u00fchrt. {0} {1} +label.started-at=Job begonnen: {0} +label.ended-at=Ende: {0} +label.schedule=Ablaufplan +label.schedule.none=(Kein Ablaufplan erstellt) +label.schedule.details=Um {0} anfangen und alle {1}{2} wiederholen +label.transfer-target=\u00dcbertragungsziel +label.transfer-target.none=(Kein \u00dcbertragungsziel festgelegt) +label.payload=Nutzdaten +label.payload.none=(Kein) + +job.enabled=Aktiviert +job.disabled=Deaktiviert diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_es.properties new file mode 100755 index 0000000000..4dd4e1b665 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_es.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=No se pudo recuperar las definiciones de replicaci\u00f3n +message.get-job-details.failure=No se pudo recuperar los detalles del trabajo cuyo nombre es ''{0}'' +message.invalid-data.failure=Datos recibidos del repositorio no son v\u00e1lidos +message.error-unknown=Error desconocido al mostrar la lista de trabajos de replicaci\u00f3n. +message.confirm.delete.title=Eliminar trabajo +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar ''{0}''? +message.delete.success=Se ha eliminado ''{0}'' +message.delete.failure=No se ha podido eliminar ''{0}'' +message.run.failure=No se pudo ejecutar ''{0}'' +message.cancel.failure=No se pudo cancelar ''{0}'' + +button.create-job=Crear trabajo +button.sort-by=Clasificar por: {0} +button.run-job=Ejecutar trabajo +button.cancel-job=Cancelar trabajo +button.edit-job=Editar +button.delete-job=Eliminar +button.refresh=Actualizar +button.view-report.local=Ver informe local +button.view-report.remote=Ver informe remoto + +header.summary=Resumen +header.jobs=Trabajos + +label.summary.job-count={0} trabajos de replicaci\u00f3n +label.summary.cancelled={0} trabajo(s) cancelados +label.summary.completed={0} trabajo(s) completados +label.summary.failed={0} trabajo(s) con error +label.summary.new={0} trabajo(s) sin datos de estado +label.summary.running={0} trabajo(s) en curso +label.sort-by.status=Estado +label.sort-by.name=Nombre +label.sort-by.last-run-date=\u00daltima fecha de ejecuci\u00f3n +label.no-jobs=No se encontraron trabajos de replicaci\u00f3n +label.no-job-selected=Ning\u00fan trabajo seleccionado +label.status=Estado +label.status.cancelled=Este trabajo ha sido cancelado. {0} {1} +label.status.cancelrequested=Cancelar solicitud pendiente. {0} +label.status.completed=\u00daltimo trabajo realizado con \u00e9xito. {0} {1} +label.status.failed=Error en el \u00faltimo trabajo. {0} {1} +label.status.new=Este trabajo nunca se ha ejecutado. +label.status.none=(Ninguno) +label.status.pending=Este trabajo ha sido puesto en cola de espera. +label.status.running=Este trabajo se est\u00e1 ejecutando actualmente. {0} {1} +label.started-at=Trabajo iniciado: {0} +label.ended-at=Finalizado: {0} +label.schedule=Lista +label.schedule.none=(Sin programaci\u00f3n) +label.schedule.details=Iniciar en (0) y repetir cada {1}{2} +label.transfer-target=Destino de la transferencia +label.transfer-target.none=(No hay destino de transferencia establecido) +label.payload=Datos \u00fatiles +label.payload.none=(Ninguno) + +job.enabled=Activado +job.disabled=Desactivado diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_fr.properties new file mode 100755 index 0000000000..3aa02d9e06 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_fr.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Impossible de r\u00e9cup\u00e9rer les d\u00e9finitions de r\u00e9plication +message.get-job-details.failure=Impossible de r\u00e9cup\u00e9rer les d\u00e9tails de la t\u00e2che intitul\u00e9e ''{0}'' +message.invalid-data.failure=Donn\u00e9es invalides re\u00e7ues de l'entrep\u00f4t +message.error-unknown=Une erreur inconnue s'est produite lors de l'affichage de la liste des t\u00e2ches de r\u00e9plication. +message.confirm.delete.title=Supprimer la t\u00e2che +message.confirm.delete=Etes-vous s\u00fbr de vouloir supprimer ''{0}'' ? +message.delete.success=''{0}'' a \u00e9t\u00e9 supprim\u00e9 +message.delete.failure=Impossible de supprimer ''{0}'' +message.run.failure=Impossible d''ex\u00e9cuter ''{0}'' +message.cancel.failure=Impossible d''annuler ''{0}'' + +button.create-job=Cr\u00e9er une t\u00e2che +button.sort-by=Trier par : {0} +button.run-job=Ex\u00e9cuter la t\u00e2che +button.cancel-job=Annuler la t\u00e2che +button.edit-job=Modifier +button.delete-job=Supprimer +button.refresh=Rafra\u00eechir +button.view-report.local=Afficher le rapport local +button.view-report.remote=Afficher le rapport distant + +header.summary=R\u00e9sum\u00e9 +header.jobs=T\u00e2ches + +label.summary.job-count={0} t\u00e2ches de r\u00e9plication +label.summary.cancelled={0} t\u00e2ches annul\u00e9es +label.summary.completed={0} t\u00e2ches termin\u00e9es +label.summary.failed={0} t\u00e2ches en \u00e9chec +label.summary.new={0} t\u00e2ches sans statut +label.summary.running={0} t\u00e2ches en cours d''ex\u00e9cution +label.sort-by.status=Statut +label.sort-by.name=Nom +label.sort-by.last-run-date=Date de derni\u00e8re ex\u00e9cution +label.no-jobs=Aucune t\u00e2che de r\u00e9plication trouv\u00e9e +label.no-job-selected=Aucune t\u00e2che s\u00e9lectionn\u00e9e +label.status=Statut +label.status.cancelled=Cette t\u00e2che a \u00e9t\u00e9 annul\u00e9e. {0} {1} +label.status.cancelrequested=Annuler la requ\u00eate en attente. {0} +label.status.completed=Derni\u00e8re t\u00e2che r\u00e9ussie. {0} {1} +label.status.failed=Derni\u00e8re t\u00e2che en \u00e9chec. {0} {1} +label.status.new=Cette t\u00e2che n'a jamais \u00e9t\u00e9 ex\u00e9cut\u00e9e. +label.status.none=(Aucun) +label.status.pending=Cette t\u00e2che a \u00e9t\u00e9 mise en attente. +label.status.running=Cette t\u00e2che est en cours d''ex\u00e9cution. {0} {1} +label.started-at=T\u00e2che d\u00e9marr\u00e9e : {0} +label.ended-at=Fin : {0} +label.schedule=Planning +label.schedule.none=(Aucun planning d\u00e9fini) +label.schedule.details=D\u00e9but \u00e0 {0} et r\u00e9p\u00e9tition tous les {1}{2} +label.transfer-target=Cible de transfert +label.transfer-target.none=(Aucune cible de transfert d\u00e9finie) +label.payload=Charge utile +label.payload.none=(Aucun) + +job.enabled=Activ\u00e9 +job.disabled=D\u00e9sactiv\u00e9 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_it.properties new file mode 100755 index 0000000000..0a318395e1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_it.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Impossibile recuperare le definizioni di replica +message.get-job-details.failure=Impossibile recuperare i dettagli per il job denominato ''{0}'' +message.invalid-data.failure=Sono stati ricevuti dati non validi dal repository +message.error-unknown=Si \u00e8 verificato un errore sconosciuto durante la visualizzazione dell'elenco dei job di replica. +message.confirm.delete.title=Elimina job +message.confirm.delete=Eliminare ''{0}''? +message.delete.success=''{0}'' \u00e8 stato eliminato +message.delete.failure=Impossibile eliminare ''{0}'' +message.run.failure=Impossibile eseguire ''{0}'' +message.cancel.failure=Impossibile annullare ''{0}'' + +button.create-job=Crea job +button.sort-by=Ordina per: {0} +button.run-job=Esegui job +button.cancel-job=Annulla job +button.edit-job=Modifica +button.delete-job=Elimina +button.refresh=Aggiorna +button.view-report.local=Visualizza rapporto locale +button.view-report.remote=Visualizza rapporto remoto + +header.summary=Riepilogo +header.jobs=Job + +label.summary.job-count={0} job di replica +label.summary.cancelled={0} job annullato/i +label.summary.completed={0} job completato/i +label.summary.failed={0} job non riuscito/i +label.summary.new={0} job senza stato +label.summary.running={0} job in esecuzione +label.sort-by.status=Stato +label.sort-by.name=Nome +label.sort-by.last-run-date=Data ultima esecuzione +label.no-jobs=Nessun job di replica trovato +label.no-job-selected=Nessun job selezionato +label.status=Stato +label.status.cancelled=Questo job \u00e8 stato annullato. {0} {1} +label.status.cancelrequested=Richiesta di annullamento in attesa. {0} +label.status.completed=Ultimo job riuscito. {0} {1} +label.status.failed=Ultimo job non riuscito. {0} {1} +label.status.new=Questo job non \u00e8 mai stato eseguito. +label.status.none=(Nessuno) +label.status.pending=Questo job \u00e8 stato inserito nella coda. +label.status.running=Questo job \u00e8 attualmente in esecuzione. {0} {1} +label.started-at=Job avviato alle: {0} +label.ended-at=Terminato alle: {0} +label.schedule=Programma +label.schedule.none=(Nessun programma impostato) +label.schedule.details=Avvia alle {0} e ripeti ogni {1}{2} +label.transfer-target=Destinazione trasferimento +label.transfer-target.none=(Nessuna destinazione di trasferimento impostata) +label.payload=Payload +label.payload.none=(Nessuno) + +job.enabled=Abilitato +job.disabled=Disabilitato diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_ja.properties new file mode 100644 index 0000000000..2c0442cf7d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_ja.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9a\u7fa9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.get-job-details.failure=\u540d\u524d ''{0}'' \u306e\u4ed8\u3044\u305f\u30b8\u30e7\u30d6\u306e\u8a73\u7d30\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.invalid-data.failure=\u30ea\u30dd\u30b8\u30c8\u30ea\u304b\u3089\u7121\u52b9\u306a\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308a\u307e\u3057\u305f +message.error-unknown=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3059\u308b\u969b\u306b\u3001\u4e0d\u660e\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +message.confirm.delete.title=\u30b8\u30e7\u30d6\u306e\u524a\u9664 +message.confirm.delete=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.delete.success=''{0}'' \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +message.delete.failure=''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.run.failure=''{0}'' \u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +message.cancel.failure=''{0}'' \u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f + +button.create-job=\u30b8\u30e7\u30d6\u306e\u4f5c\u6210 +button.sort-by=\u8868\u793a\u9806: {0} +button.run-job=\u30b8\u30e7\u30d6\u306e\u5b9f\u884c +button.cancel-job=\u30b8\u30e7\u30d6\u306e\u30ad\u30e3\u30f3\u30bb\u30eb +button.edit-job=\u7de8\u96c6 +button.delete-job=\u524a\u9664 +button.refresh=\u518d\u8aad\u307f\u8fbc\u307f +button.view-report.local=\u30ed\u30fc\u30ab\u30eb\u30ec\u30dd\u30fc\u30c8\u306e\u8868\u793a +button.view-report.remote=\u30ea\u30e2\u30fc\u30c8\u30ec\u30dd\u30fc\u30c8\u306e\u8868\u793a + +header.summary=\u6982\u8981 +header.jobs=\u30b8\u30e7\u30d6 + +label.summary.job-count={0} \u4ef6\u306e\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6 +label.summary.cancelled={0} \u4ef6\u306e\u30b8\u30e7\u30d6\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f +label.summary.completed={0} \u4ef6\u306e\u30b8\u30e7\u30d6\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f +label.summary.failed={0} \u4ef6\u306e\u30b8\u30e7\u30d6\u304c\u5931\u6557\u3057\u307e\u3057\u305f +label.summary.new={0} \u4ef6\u306e\u30b8\u30e7\u30d6\u306b\u30b9\u30c6\u30fc\u30bf\u30b9\u304c\u3042\u308a\u307e\u305b\u3093 +label.summary.running={0} \u4ef6\u306e\u30b8\u30e7\u30d6\u304c\u5b9f\u884c\u4e2d\u3067\u3059 +label.sort-by.status=\u30b9\u30c6\u30fc\u30bf\u30b9 +label.sort-by.name=\u540d\u524d +label.sort-by.last-run-date=\u6700\u5f8c\u306e\u5b9f\u884c\u65e5 +label.no-jobs=\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b8\u30e7\u30d6\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 +label.no-job-selected=\u30b8\u30e7\u30d6\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +label.status=\u30b9\u30c6\u30fc\u30bf\u30b9 +label.status.cancelled=\u3053\u306e\u30b8\u30e7\u30d6\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u3066\u3044\u307e\u3059\u3002 {1} {0} +label.status.cancelrequested=\u30ad\u30e3\u30f3\u30bb\u30eb\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u4fdd\u7559\u4e2d\u3067\u3059\u3002 {0} +label.status.completed=\u6700\u5f8c\u306e\u30b8\u30e7\u30d6\u304c\u6210\u529f\u3057\u307e\u3057\u305f\u3002 {1} {0} +label.status.failed=\u6700\u5f8c\u306e\u30b8\u30e7\u30d6\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 {1} {0} +label.status.new=\u3053\u306e\u30b8\u30e7\u30d6\u306f\u4e00\u5ea6\u3082\u5b9f\u884c\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +label.status.none=(\u306a\u3057) +label.status.pending=\u3053\u306e\u30b8\u30e7\u30d6\u306f\u30ad\u30e5\u30fc\u306b\u5165\u3063\u3066\u3044\u307e\u3059\u3002 +label.status.running=\u3053\u306e\u30b8\u30e7\u30d6\u306f\u73fe\u5728\u5b9f\u884c\u4e2d\u3067\u3059\u3002 {1} {0} +label.started-at=\u30b8\u30e7\u30d6\u306e\u958b\u59cb\u65e5: {0} +label.ended-at=\u7d42\u4e86\u65e5: {0} +label.schedule=\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb +label.schedule.none=(\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u306f\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093) +label.schedule.details={0} \u306b\u958b\u59cb\u3055\u308c\u3001{1}{2} \u7f6e\u304d\u306b\u7e70\u308a\u8fd4\u3055\u308c\u307e\u3059 +label.transfer-target=\u8ee2\u9001\u5148 +label.transfer-target.none=(\u8ee2\u9001\u5148\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093) +label.payload=\u30da\u30a4\u30ed\u30fc\u30c9 +label.payload.none=(\u306a\u3057) + +job.enabled=\u6709\u52b9 +job.disabled=\u7121\u52b9 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_nb.properties new file mode 100755 index 0000000000..83cce71386 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_nb.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Kan ikke hente replikeringsdefinisjoner +message.get-job-details.failure=Kan ikke hente detaljer for jobben kalt "{0}" +message.invalid-data.failure=Mottatt ugyldig data fra database +message.error-unknown=Det oppsto en ukjent feil under visning av listen over replikeringsjobber. +message.confirm.delete.title=Slett jobb +message.confirm.delete=Er du sikker p\u00e5 at du vil slette ''{0}''? +message.delete.success=''{0}'' ble slettet +message.delete.failure=Kan ikke slette ''{0}'' +message.run.failure=Kan ikke kj\u00f8re "{0}" +message.cancel.failure=Kan ikke avbryte "{0}" + +button.create-job=Opprett jobb +button.sort-by=Sorter etter: {0} +button.run-job=Kj\u00f8r jobb +button.cancel-job=Avbryt jobb +button.edit-job=Rediger +button.delete-job=Slett +button.refresh=Oppdater +button.view-report.local=Vis lokal rapport +button.view-report.remote=Vis ekstern rapport + +header.summary=Sammendrag +header.jobs=Jobber + +label.summary.job-count={0} replikeringsjobber +label.summary.cancelled={0} jobb(er) er avbrutt +label.summary.completed={0} jobb(er) er fullf\u00f8rt +label.summary.failed={0} jobb(er) mislyktes +label.summary.new={0} jobb(er) uten status +label.summary.running={0} jobb(er) kj\u00f8res +label.sort-by.status=Status +label.sort-by.name=Navn +label.sort-by.last-run-date=Siste kj\u00f8ringsdato +label.no-jobs=Finner ingen replikeringsjobber +label.no-job-selected=Ingen jobb er valgt +label.status=Status +label.status.cancelled=Denne jobben er avbrutt. {0} {1} +label.status.cancelrequested=Avbryt avventende foresp\u00f8rsel. {0} +label.status.completed=Den siste jobben er fullf\u00f8rt. {0} {1} +label.status.failed=Den siste jobben mislyktes. {0} {1} +label.status.new=Denne jobben er aldri kj\u00f8rt. +label.status.none=(Ingen) +label.status.pending=Denne jobben er satt i k\u00f8. +label.status.running=Denne jobben kj\u00f8res for \u00f8yeblikket. {0} {1} +label.started-at=Jobb startet: {0} +label.ended-at=Avsluttet: {0} +label.schedule=Tidsplan +label.schedule.none=(Tidsplan er ikke angitt) +label.schedule.details=Start kl. {0} og gjenta hver/hvert {1}{2} +label.transfer-target=Overf\u00f8ringsm\u00e5l +label.transfer-target.none=(Overf\u00f8ringsm\u00e5l er ikke angitt) +label.payload=Nyttelast +label.payload.none=(Ingen) + +job.enabled=Aktivert +job.disabled=Deaktivert diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_nl.properties new file mode 100755 index 0000000000..87dcbf0416 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_nl.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Kan replicatiedefinities niet ophalen +message.get-job-details.failure=Kan gegevens voor job met naam "{0}" niet ophalen +message.invalid-data.failure=Ongeldige gegevens ontvangen van repository +message.error-unknown=Er is een onbekende fout opgetreden bij het weergeven van de lijst met replicatiejobs. +message.confirm.delete.title=Job verwijderen +message.confirm.delete=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.delete.success=''{0}'' is verwijderd +message.delete.failure=Kan ''{0}'' niet verwijderen +message.run.failure=Kan ''{0}'' niet uitvoeren +message.cancel.failure=Kan ''{0}'' niet annuleren + +button.create-job=Job maken +button.sort-by=Sorteren op: {0} +button.run-job=Job uitvoeren +button.cancel-job=Job annuleren +button.edit-job=Bewerken +button.delete-job=Verwijderen +button.refresh=Vernieuwen +button.view-report.local=Lokaal rapport weergeven +button.view-report.remote=Extern rapport weergeven + +header.summary=Samenvatting +header.jobs=Jobs + +label.summary.job-count={0} replicatiejobs +label.summary.cancelled={0} job(s) geannuleerd +label.summary.completed={0} job(s) voltooid +label.summary.failed={0} job(s) mislukt +label.summary.new={0} job(s) zonder status +label.summary.running={0} job(s) wordt(/worden) uitgevoerd +label.sort-by.status=Status +label.sort-by.name=Naam +label.sort-by.last-run-date=Datum laatste uitvoering +label.no-jobs=Geen replicatiejobs gevonden +label.no-job-selected=Geen job geselecteerd +label.status=Status +label.status.cancelled=Deze job is geannuleerd. {0} {1} +label.status.cancelrequested=Openstaande aanvraag annuleren. {0} +label.status.completed=Laatste job geslaagd. {0} {1} +label.status.failed=Laatste job mislukt. {0} {1} +label.status.new=Deze job is nooit uitgevoerd. +label.status.none=(Geen) +label.status.pending=Deze job is in de wachtrij geplaatst. +label.status.running=Deze job wordt momenteel uitgevoerd. {0} {1} +label.started-at=Job gestart: {0} +label.ended-at=Be\u00ebindigd: {0} +label.schedule=Schema +label.schedule.none=(Geen schema ingesteld) +label.schedule.details=Beginnen om {0} en elke {1}{2} herhalen +label.transfer-target=Bestemming van overdracht +label.transfer-target.none=(Geen overdrachtsbestemming ingesteld) +label.payload=Lading +label.payload.none=(Geen) + +job.enabled=Ingeschakeld +job.disabled=Uitgeschakeld diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_pt_BR.properties new file mode 100644 index 0000000000..b0f57b4207 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_pt_BR.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=Falha ao recuperar as defini\u00e7\u00f5es de replica\u00e7\u00e3o +message.get-job-details.failure=Falha ao recuperar os detalhes do trabalho com o nome ''{0}'' +message.invalid-data.failure=Dados inv\u00e1lidos recebidos do reposit\u00f3rio +message.error-unknown=Ocorreu um erro desconhecido ao exibir a lista de Trabalhos de replica\u00e7\u00e3o. +message.confirm.delete.title=Excluir trabalho +message.confirm.delete=Tem certeza de que deseja excluir ''{0}''? +message.delete.success=''{0}'' foi exclu\u00eddo +message.delete.failure=N\u00e3o foi poss\u00edvel excluir ''{0}'' +message.run.failure=N\u00e3o foi poss\u00edvel executar ''{0}'' +message.cancel.failure=N\u00e3o foi poss\u00edvel cancelar ''{0}'' + +button.create-job=Criar trabalho +button.sort-by=Classificar por: {0} +button.run-job=Executar trabalho +button.cancel-job=Cancelar trabalho +button.edit-job=Editar +button.delete-job=Excluir +button.refresh=Atualizar +button.view-report.local=Exibir relat\u00f3rio local +button.view-report.remote=Exibir relat\u00f3rio remoto + +header.summary=Resumo +header.jobs=Trabalhos + +label.summary.job-count={0} trabalhos de replica\u00e7\u00e3o +label.summary.cancelled={0} trabalho(s) cancelado(s) +label.summary.completed={0} trabalho(s) conclu\u00eddo(s) +label.summary.failed={0} trabalhos(s) com falha +label.summary.new={0} trabalho(s) sem status +label.summary.running={0} trabalho(s) em execu\u00e7\u00e3o +label.sort-by.status=Status +label.sort-by.name=Nome +label.sort-by.last-run-date=Data da \u00faltima execu\u00e7\u00e3o +label.no-jobs=N\u00e3o foram encontrados trabalhos de replica\u00e7\u00e3o +label.no-job-selected=N\u00e3o h\u00e1 trabalhos selecionados +label.status=Status +label.status.cancelled=Esse trabalho foi cancelado. {0} {1} +label.status.cancelrequested=Cancelar solicita\u00e7\u00e3o pendente. {0} +label.status.completed=\u00daltimo trabalho bem-sucedido. {0} {1} +label.status.failed=\u00daltimo trabalho com falha. {0} {1} +label.status.new=Esse trabalho nunca foi executado. +label.status.none=(Nenhum) +label.status.pending=Esse trabalho foi colocado em fila. +label.status.running=Esse trabalho est\u00e1 em execu\u00e7\u00e3o no momento. {0} {1} +label.started-at=Trabalho iniciado: {0} +label.ended-at=Finalizado: {0} +label.schedule=Programar +label.schedule.none=(Nenhuma programa\u00e7\u00e3o definida) +label.schedule.details=Iniciar em {0} e repetir a cada {1}{2} +label.transfer-target=Destino de transfer\u00eancia +label.transfer-target.none=(Nenhum destino de transfer\u00eancia definido) +label.payload=Carga +label.payload.none=(Nenhum) + +job.enabled=Ativado +job.disabled=Desativado diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_ru.properties new file mode 100755 index 0000000000..6c0ad0c5a2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_ru.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 +message.get-job-details.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' +message.invalid-data.failure=\u0418\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 +message.error-unknown=\u041f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 +message.confirm.delete=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.delete.success=\u0423\u0434\u0430\u043b\u0435\u043d\u043e: ''{0}'' +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' +message.run.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c ''{0}'' +message.cancel.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c ''{0}'' + +button.create-job=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 +button.sort-by=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e: {0} +button.run-job=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 +button.cancel-job=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 +button.edit-job=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c +button.delete-job=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +button.refresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c +button.view-report.local=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 +button.view-report.remote=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 + +header.summary=\u0421\u0432\u043e\u0434\u043a\u0430 +header.jobs=\u0417\u0430\u0434\u0430\u043d\u0438\u044f + +label.summary.job-count=\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 {0} +label.summary.cancelled=\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e: {0} +label.summary.completed=\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e: {0} +label.summary.failed=\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u043e \u0441\u0431\u043e\u0435\u043c: {0} +label.summary.new=\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0431\u0435\u0437 \u0441\u0442\u0430\u0442\u0443\u0441\u0430: {0} +label.summary.running=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439: {0} +label.sort-by.status=\u0421\u0442\u0430\u0442\u0443\u0441 +label.sort-by.name=\u0418\u043c\u044f +label.sort-by.last-run-date=\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f +label.no-jobs=\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b +label.no-job-selected=\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e +label.status=\u0421\u0442\u0430\u0442\u0443\u0441 +label.status.cancelled=\u042d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e. {0} {1} +label.status.cancelrequested=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442\u043c\u0435\u043d\u044b. {0} +label.status.completed=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435. {0} {1} +label.status.failed=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u043e \u0441\u0431\u043e\u0435\u043c. {0} {1} +label.status.new=\u042d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c. +label.status.none=(\u041d\u0435\u0442) +label.status.pending=\u042d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. +label.status.running=\u042d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. {0} {1} +label.started-at=\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e: {0} +label.ended-at=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e: {0} +label.schedule=\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 +label.schedule.none=(\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e) +label.schedule.details=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432 {0} \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0435 {1}{2} +label.transfer-target=\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 +label.transfer-target.none=(\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430) +label.payload=\u041f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 +label.payload.none=(\u041d\u0435\u0442) + +job.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +job.disabled=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_zh_CN.properties new file mode 100755 index 0000000000..076f2008a9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/replication-jobs.get_zh_CN.properties @@ -0,0 +1,56 @@ +message.get-definitions.failure=\u68c0\u7d22\u590d\u5236\u5b9a\u4e49\u5931\u8d25 +message.get-job-details.failure=\u68c0\u7d22\u540d\u79f0\u4e3a "{0}" \u7684\u4f5c\u4e1a\u8be6\u7ec6\u4fe1\u606f\u5931\u8d25 +message.invalid-data.failure=\u4ece\u5b58\u50a8\u5e93\u63a5\u6536\u7684\u6570\u636e\u65e0\u6548 +message.error-unknown=\u663e\u793a\u590d\u5236\u4f5c\u4e1a\u5217\u8868\u65f6\u53d1\u751f\u4e86\u672a\u77e5\u9519\u8bef\u3002 +message.confirm.delete.title=\u5220\u9664\u4f5c\u4e1a +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.delete.success=\u5df2\u5220\u9664 ''{0}'' +message.delete.failure=\u65e0\u6cd5\u5220\u9664 ''{0}'' +message.run.failure=\u65e0\u6cd5\u8fd0\u884c ''{0}'' +message.cancel.failure=\u65e0\u6cd5\u53d6\u6d88 ''{0}'' + +button.create-job=\u521b\u5efa\u4f5c\u4e1a +button.sort-by=\u6392\u5e8f\u4f9d\u636e\uff1a{0} +button.run-job=\u8fd0\u884c\u4f5c\u4e1a +button.cancel-job=\u53d6\u6d88\u4f5c\u4e1a +button.edit-job=\u7f16\u8f91 +button.delete-job=\u5220\u9664 +button.refresh=\u5237\u65b0 +button.view-report.local=\u67e5\u770b\u672c\u5730\u62a5\u544a +button.view-report.remote=\u67e5\u770b\u8fdc\u7a0b\u62a5\u544a + +header.summary=\u6458\u8981 +header.jobs=\u4f5c\u4e1a + +label.summary.job-count={0} \u4e2a\u590d\u5236\u4f5c\u4e1a +label.summary.cancelled=\u53d6\u6d88\u4e86 {0} \u4e2a\u4f5c\u4e1a +label.summary.completed=\u5b8c\u6210\u4e86 {0} \u4e2a\u4f5c\u4e1a +label.summary.failed={0} \u4e2a\u4f5c\u4e1a\u5931\u8d25 +label.summary.new={0} \u4e2a\u4f5c\u4e1a\u65e0\u72b6\u6001 +label.summary.running={0} \u4e2a\u4f5c\u4e1a\u6b63\u5728\u8fd0\u884c +label.sort-by.status=\u72b6\u6001 +label.sort-by.name=\u540d\u79f0 +label.sort-by.last-run-date=\u4e0a\u6b21\u8fd0\u884c\u65e5\u671f +label.no-jobs=\u672a\u627e\u5230\u590d\u5236\u4f5c\u4e1a +label.no-job-selected=\u672a\u9009\u62e9\u4f5c\u4e1a +label.status=\u72b6\u6001 +label.status.cancelled=\u6b64\u4f5c\u4e1a\u5df2\u88ab\u53d6\u6d88\u3002 {0} {1} +label.status.cancelrequested=\u53d6\u6d88\u5f85\u51b3\u8bf7\u6c42\u3002 {0} +label.status.completed=\u4e0a\u4e00\u4e2a\u4f5c\u4e1a\u6210\u529f\u3002 {0} {1} +label.status.failed=\u4e0a\u4e00\u4e2a\u4f5c\u4e1a\u5931\u8d25\u3002 {0} {1} +label.status.new=\u6b64\u4f5c\u4e1a\u4ece\u672a\u8fd0\u884c\u3002 +label.status.none=\uff08\u65e0\uff09 +label.status.pending=\u6b64\u4f5c\u4e1a\u5df2\u5165\u5217\u3002 +label.status.running=\u6b64\u4f5c\u4e1a\u6b63\u5728\u8fd0\u884c\u3002 {0} {1} +label.started-at=\u4f5c\u4e1a\u542f\u52a8\u65f6\u95f4\uff1a{0} +label.ended-at=\u7ed3\u675f\u65f6\u95f4\uff1a{0} +label.schedule=\u8ba1\u5212 +label.schedule.none=\uff08\u672a\u8bbe\u7f6e\u8ba1\u5212\uff09 +label.schedule.details=\u542f\u52a8\u65f6\u95f4\u4e3a {0}\uff0c\u91cd\u590d\u5468\u671f\u4e3a {1}{2} +label.transfer-target=\u4f20\u8f93\u76ee\u6807 +label.transfer-target.none=\uff08\u672a\u8bbe\u7f6e\u4f20\u8f93\u76ee\u6807\uff09 +label.payload=\u8d1f\u8f7d +label.payload.none=\uff08\u65e0\uff09 + +job.enabled=\u5df2\u542f\u7528 +job.disabled=\u5df2\u7981\u7528 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.config.xml new file mode 100644 index 0000000000..45364e84b7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.config.xml @@ -0,0 +1,8 @@ + + tool.repository-installed.label +
+ mbean + Alfresco:Name=RepositoryDescriptor,Type=Initially Installed +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.desc.xml new file mode 100644 index 0000000000..7ee97c5db6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Repository Installed Tool + Administration Console - Repository Installed Tool + /components/console/repository-installed + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-installed.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.config.xml new file mode 100644 index 0000000000..348718df95 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.config.xml @@ -0,0 +1,8 @@ + + tool.repository-server.label +
+ mbean + Alfresco:Name=RepositoryDescriptor,Type=Current +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.desc.xml new file mode 100644 index 0000000000..9419cec977 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Repository Server Tool + Administration Console - Repository Server Tool + /components/console/repository-server + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository-server.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.desc.xml new file mode 100644 index 0000000000..032117b3bb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Repository Tool + Administration Console - Repository Info Tool + /components/console/repository + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.html.ftl new file mode 100644 index 0000000000..0d439d4cd7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.html.ftl @@ -0,0 +1,37 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/repository.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + +
+ + +
+
${msg("label.tools")}
+ +
+ ${msg("label.jmxdump")}: + ${msg("link.jmxdump")} +
+
+ +
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.properties new file mode 100644 index 0000000000..70c3c50eb1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get.properties @@ -0,0 +1,3 @@ +label.tools=Tools +label.jmxdump=JMX Dump +link.jmxdump=Download JMX Zip Dump diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_de.properties new file mode 100755 index 0000000000..39961aec7a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_de.properties @@ -0,0 +1,3 @@ +label.tools=Werkzeuge +label.jmxdump=JMX Speicherauszug +link.jmxdump=JMX Zip Speicherauszug herunterladen diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_es.properties new file mode 100755 index 0000000000..8769e28332 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_es.properties @@ -0,0 +1,3 @@ +label.tools=Herramientas +label.jmxdump=JMX Dump +link.jmxdump=Descargar JMX Dump en formato zip diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_fr.properties new file mode 100755 index 0000000000..3bc877480a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_fr.properties @@ -0,0 +1,3 @@ +label.tools=Outils +label.jmxdump=Dump JMX +link.jmxdump=T\u00e9l\u00e9charger un dump JMX compress\u00e9 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_it.properties new file mode 100755 index 0000000000..84ab70fe25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_it.properties @@ -0,0 +1,3 @@ +label.tools=Strumenti +label.jmxdump=Dump JMX +link.jmxdump=Scarica dump dello zip JMX diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_ja.properties new file mode 100755 index 0000000000..d6a9e0aac8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_ja.properties @@ -0,0 +1,3 @@ +label.tools=\u30c4\u30fc\u30eb +label.jmxdump=JMX \u30c0\u30f3\u30d7 +link.jmxdump=JMX Zip \u30c0\u30f3\u30d7\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_nb.properties new file mode 100755 index 0000000000..7d7bbc4400 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_nb.properties @@ -0,0 +1,3 @@ +label.tools=Verkt\u00f8y +label.jmxdump=JMX-dump +link.jmxdump=Last ned JMX-zipdump diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_nl.properties new file mode 100755 index 0000000000..147b37caa8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_nl.properties @@ -0,0 +1,3 @@ +label.tools=Tools +label.jmxdump=JMX-dump +link.jmxdump=JMX-zip-dump downloaden diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_pt_BR.properties new file mode 100644 index 0000000000..3ad6da4ade --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_pt_BR.properties @@ -0,0 +1,3 @@ +label.tools=Ferramentas +label.jmxdump=JMX Dump +link.jmxdump=Baixar JMX Zip Dump diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_ru.properties new file mode 100755 index 0000000000..3e6e355dd0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_ru.properties @@ -0,0 +1,3 @@ +label.tools=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b +label.jmxdump=\u0414\u0430\u043c\u043f JMX +link.jmxdump=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c Zip-\u0434\u0430\u043c\u043f JMX diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_zh_CN.properties new file mode 100755 index 0000000000..1e54bd1da0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/repository.get_zh_CN.properties @@ -0,0 +1,3 @@ +label.tools=\u5de5\u5177 +label.jmxdump=JMX Dump +link.jmxdump=\u4e0b\u8f7d JMX Zip Dump diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.config.xml new file mode 100644 index 0000000000..723a28164f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.config.xml @@ -0,0 +1,8 @@ + + tool.runtime.label +
+ mbean + Alfresco:Name=Runtime +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.desc.xml new file mode 100644 index 0000000000..3ae783c5ad --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console Runtime Tool + Administration Console - Runtime Tool + /components/console/runtime + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/runtime.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.config.xml new file mode 100644 index 0000000000..52de108148 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.config.xml @@ -0,0 +1,8 @@ + + tool.subscriptions.label +
+ mbean + Alfresco:Type=Configuration,Category=Subscriptions,id1=default +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.desc.xml new file mode 100644 index 0000000000..afa5bcb005 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Subscriptions Tool + Administration Console - Subscriptions Tool + /components/console/subscriptions + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/subscriptions.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.config.xml new file mode 100644 index 0000000000..76846a6311 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.config.xml @@ -0,0 +1,8 @@ + + tool.sysadmin.label +
+ mbean + Alfresco:Type=Configuration,Category=sysAdmin,id1=default +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.desc.xml new file mode 100644 index 0000000000..08ad179682 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Sysadmin Tool + Administration Console - Sysadmin Tool + /components/console/sysadmin + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/sysadmin.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.config.xml new file mode 100644 index 0000000000..48978c9f02 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.config.xml @@ -0,0 +1,8 @@ + + tool.workflow.label +
+ mbean + Alfresco:Name=WorkflowInformation +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.desc.xml new file mode 100644 index 0000000000..c0c9952ef2 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Workflow Tool + Administration Console - Workflow Tool + /components/console/workflow + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.html.ftl new file mode 100644 index 0000000000..2e6eca0d8a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.html.ftl @@ -0,0 +1,10 @@ +<#import "../generic-form-tool.lib.ftl" as gft> + +<@gft.renderPanel config.script.config "workflow"> + + + +<@link href="${page.url.context}/res/components/console/workflow.css" group="console"/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.js new file mode 100644 index 0000000000..456c3dfba6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/repository/workflow.get.js @@ -0,0 +1,8 @@ + + +function main() +{ + model.activitiAdminUrl = AlfrescoUtil.getActivitiAdminUrl(); +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.desc.xml new file mode 100644 index 0000000000..e9535ef38b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.desc.xml @@ -0,0 +1,6 @@ + + Search Manager Tool + Administration Console - Search Manager Tool + /components/console/search-manager + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.html.ftl new file mode 100644 index 0000000000..b248477c0c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.html.ftl @@ -0,0 +1,27 @@ +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+

+ Search Manager +

+
+

+ ${msg("text.search-manager.description")} + +

+
+

+ ${msg("text.search-manager.link-description")} + ${msg("text.search-manager.here")} + . + +

+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.properties new file mode 100644 index 0000000000..4f0efb49a9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Search Manager Tool +text.search-manager.description=With the Search Manager you can see details of existing search filters and create new filters.  The Search Manager is available to users in the ALFRESCO_ADMINISTRATORS and ALFRESCO_SEARCH_ADMINISTRATORS permissions groups. +text.search-manager.link-description=The Search Manager is accessed from the search results screen, or click +text.search-manager.here=here diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_de.properties new file mode 100755 index 0000000000..541a1697d4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_de.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Suchmanager +text.search-manager.description=Mit dem Suchmanager k\u00f6nnen Sie Angaben zu bestehenden Suchfiltern anzeigen und neue Filter erstellen. Der Suchmanager steht Benutzern aus den Berechtigungsgruppen ALFRESCO_ADMINISTRATORS und ALFRESCO_SEARCH_ADMINISTRATORS zur Verf\u00fcgung. +text.search-manager.link-description=Auf den Suchmanager greifen Sie vom Suchergebnis-Bildschirm aus zu oder durch einen Klick +text.search-manager.here=hier diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_es.properties new file mode 100644 index 0000000000..38f85c6044 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_es.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Herramienta Gestor de b\u00fasqueda +text.search-manager.description=Con el Gestor de b\u00fasqueda puede ver los detalles de filtros de b\u00fasqueda existentes y crear nuevos filtros.  El Administrador de b\u00fasqueda est\u00e1 disponible para los usuarios en los grupos de permisos ALFRESCO_ADMINISTRATORS y ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=Al Gestor de b\u00fasqueda se accede desde la pantalla de resultados de b\u00fasqueda, o haciendo clic +text.search-manager.here=aqu\u00ed diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_fr.properties new file mode 100644 index 0000000000..f2daef3aa0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_fr.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Outil Gestionnaire de recherche +text.search-manager.description=Le Gestionnaire de recherche permet d'afficher les d\u00e9tails des filtres de recherche existants et de cr\u00e9er de nouveaux filtres.  Le Gestionnaire de recherche est accessible aux utilisateurs des groupes d'autorisations ALFRESCO_ADMINISTRATORS et ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=Le Gestionnaire de recherche est accessible depuis l'\u00e9cran des r\u00e9sultats de la recherche ou en cliquant sur +text.search-manager.here=ici diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_it.properties new file mode 100755 index 0000000000..15722dbb59 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_it.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Strumento di gestione ricerca +text.search-manager.description=Con Gestione ricerca \u00e8 possibile visualizzare i dettagli dei filtri di ricerca esistenti e creare nuovi filtri.  Gestione ricerca \u00e8 disponibile per gli utenti dei gruppi di autorizzazioni ALFRESCO_ADMINISTRATORS e ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=\u00c8 possibile accedere a Gestione ricerca dalla schermata dei risultati di ricerca o facendo clic su +text.search-manager.here=qui diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_ja.properties new file mode 100644 index 0000000000..ff02f26fc5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_ja.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3\u30c4\u30fc\u30eb +text.search-manager.description=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3\u3092\u4f7f\u3046\u3068\u3001\u65e2\u5b58\u306e\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306e\u8a73\u7d30\u3092\u78ba\u8a8d\u3057\u305f\u308a\u3001\u65b0\u3057\u3044\u30d5\u30a3\u30eb\u30bf\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002  \u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3\u3092\u4f7f\u7528\u3067\u304d\u308b\u306e\u306f\u3001ALFRESCO_ADMINISTRATORS \u304a\u3088\u3073 ALFRESCO_SEARCH_ADMINISTRATORS \u6a29\u9650\u30b0\u30eb\u30fc\u30d7\u306b\u5c5e\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u3067\u3059. +text.search-manager.link-description=\u691c\u7d22\u30de\u30cd\u30fc\u30b8\u30e3\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u691c\u7d22\u7d50\u679c\u753b\u9762\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3059\u308b\u304b\u3001 +text.search-manager.here=\u3053\u3053 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_nb.properties new file mode 100644 index 0000000000..c0f68450bc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_nb.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=S\u00f8keadministrator-verkt\u00f8y +text.search-manager.description=Med s\u00f8keadministratoren kan du se detaljer om eksisterende s\u00f8kefiltre og opprette nye s\u00f8kefiltre.  S\u00f8keadministratoren er tilgjengelig for brukere i tillatelsesgruppene ALFRESCO_ADMINISTRATORS og ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=S\u00f8keadministratoren \u00e5pnes fra s\u00f8keresultatskjermen eller ved \u00e5 klikke p\u00e5 +text.search-manager.here=hit diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_nl.properties new file mode 100644 index 0000000000..3d518b3a51 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_nl.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Zoekbeheertool +text.search-manager.description=Met Zoekbeheer kunt u gegevens over bestaande zoekfilters weergeven en nieuwe filters maken.  Zoekbeheer is beschikbaar voor gebruikers in de rechtengroep ALFRESCO_ADMINISTRATORS en ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=U krijgt toegang tot Zoekbeheer vanuit de zoekresultaten of u klikt +text.search-manager.here=hier diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_pt_BR.properties new file mode 100644 index 0000000000..ecaae34926 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_pt_BR.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=Ferramenta Gerente de pesquisa +text.search-manager.description=Com a ferramenta Gerente de pesquisa, \u00e9 poss\u00edvel ver os detalhes dos filtros de pesquisa existentes e criar filtros.  O Gerente de pesquisa est\u00e1 dispon\u00edvel para os usu\u00e1rios nos grupos de permiss\u00e3o ALFRESCO_ADMINISTRATORS e ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=O Gerente de pesquisa \u00e9 acessado pela tela de resultados de pesquisa, ou clicando em +text.search-manager.here=aqui diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_ru.properties new file mode 100644 index 0000000000..31c44ecee3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_ru.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c" +text.search-manager.description=\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c" \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0445 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b.  \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c" \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0430\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 ALFRESCO_ADMINISTRATORS \u0438 ALFRESCO_SEARCH_ADMINISTRATORS. +text.search-manager.link-description=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0443 "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u043c" \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0432 +text.search-manager.here=\u0441\u044e\u0434\u0430 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_zh_CN.properties new file mode 100644 index 0000000000..253186f5c3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search-manager.get_zh_CN.properties @@ -0,0 +1,7 @@ +## Top-level Root Node +#node.root=Category Root + +title.search-manager=\u641c\u7d22\u7ba1\u7406\u5668\u5de5\u5177 +text.search-manager.description=\u901a\u8fc7\u641c\u7d22\u7ba1\u7406\u5668\uff0c\u60a8\u53ef\u4ee5\u67e5\u770b\u73b0\u6709\u6240\u6709\u7b5b\u9009\u5668\u7684\u8be6\u7ec6\u4fe1\u606f\u5e76\u521b\u5efa\u65b0\u7b5b\u9009\u5668\u3002 \u641c\u7d22\u7ba1\u7406\u5668\u9002\u7528\u4e8e ALFRESCO_ADMINISTRATORS \u548c ALFRESCO_SEARCH_ADMINISTRATORS \u6743\u9650\u7ec4\u4e2d\u7684\u7528\u6237\u3002 +text.search-manager.link-description=\u4ece\u641c\u7d22\u7ed3\u679c\u5c4f\u5e55\u8bbf\u95ee\u641c\u7d22\u7ba1\u7406\u5668\uff0c\u6216\u5355\u51fb +text.search-manager.here=\u6b64\u5904 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.config.xml new file mode 100644 index 0000000000..7bd3c66f74 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.config.xml @@ -0,0 +1,8 @@ + + tool.lucene.label +
+ mbean + Alfresco:Type=Configuration,Category=Search,id1=managed,id2=lucene +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.desc.xml new file mode 100644 index 0000000000..7d90b3c8ea --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console Lucene Tool + Administration Console - Lucene Tool + /components/console/lucene + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.html.ftl new file mode 100644 index 0000000000..e1c51ec665 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/lucene.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.config.xml new file mode 100644 index 0000000000..e1183fb8c4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.config.xml @@ -0,0 +1,8 @@ + + tool.searchmanager.label +
+ mbean + Alfresco:Type=Configuration,Category=Search,id1=manager +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.desc.xml new file mode 100644 index 0000000000..04a30e16da --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console Search Manager Tool + Administration Console - Search Manager Tool + /components/console/searchmanager + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.html.ftl new file mode 100644 index 0000000000..e1c51ec665 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/searchmanager.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.config.xml new file mode 100644 index 0000000000..90550bbb7b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.config.xml @@ -0,0 +1,8 @@ + + tool.solr.label +
+ mbean + Alfresco:Type=Configuration,Category=Search,id1=managed,id2=solr +
+ true +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.desc.xml new file mode 100644 index 0000000000..6fbc7899e0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console Solr Feed Tool + Administration Console - Solr Feed Tool + /components/console/solr + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.html.ftl new file mode 100644 index 0000000000..e1c51ec665 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/search/solr.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.desc.xml new file mode 100644 index 0000000000..7758b96204 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Tag Management Tool + Administration Console - Tag Management Tool + /components/console/tag-management + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.html.ftl new file mode 100644 index 0000000000..824e44ee07 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.html.ftl @@ -0,0 +1,43 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <#include "../form/form.css.ftl"/> + <@link href="${url.context}/res/components/console/tag-management.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <#include "../form/form.js.ftl"/> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/tag-management.js" group="console"/> + <@script src="${url.context}/res/modules/simple-dialog.js" group="console"/> + <@script src="${url.context}/res/modules/documentlibrary/doclib-actions.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#assign el=args.htmlid?html> +
+
+ +
+ + + +
+
+
+ +
+
${msg("item.tagList")}
+
+ +
+
+ + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.js new file mode 100644 index 0000000000..c3043f1bdc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.js @@ -0,0 +1,12 @@ +function main() { + // Widget instantiation metadata... + var widget = { + id : "ConsoleTagManagement", + name : "Alfresco.ConsoleTagManagement", + options : { + pageSize: parseInt((args.pageSize != null) ? args.pageSize : "15") + } + }; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.properties new file mode 100644 index 0000000000..39f17ddeea --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Tags List +loading-tags=Loading ... +no-tag-found=No tag found +tags-found=Tags found: {0} + +## Column Labels +title.tagName=Tag +title.modifiedBy=Modified by +title.modifiedOn=Modified on +title.actions=Actions +title.editTag=Edit tag +title.deleteTag=Delete tag + +# Dialog labels +title.error=Error + +# Edit Tag Labels +message.edit.failure=Unable to update Tag + +manage-tags.tag-name-missing=Tag name missing! +manage-tags.tag-not-found=Tag not Found! + +manage-tags.empty-name=Empty name! +manage-tags.duplicate-name=Duplicate Name! +manage-tags.edit-success=Tag updated - edited tags may disappear temporarily from search results while re-indexing occurs. +manage-tags.edit-failure=Error during updating tag + +# Delete Tag Labels +message.confirm.delete.title=Delete Tag +message.confirm.delete=Are you sure you want to delete ''{0}''? +message.delete.failure=Could not delete Tag + +manage-tags.delete-success=Tag deleted +manage-tags.delete-failure=Error during deleting tag + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_de.properties new file mode 100755 index 0000000000..5471a4e516 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_de.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Tag-Liste +loading-tags=Laden... +no-tag-found=Kein Tag gefunden +tags-found=Tags gefunden: {0} + +## Column Labels +title.tagName=Tag +title.modifiedBy=Ge\u00e4ndert von +title.modifiedOn=Ge\u00e4ndert am +title.actions=Aktionen +title.editTag=Tag bearbeiten +title.deleteTag=Tag l\u00f6schen + +# Dialog labels +title.error=Fehler + +# Edit Tag Labels +message.edit.failure=Tag konnte nicht aktualisiert werden + +manage-tags.tag-name-missing=Tagname fehlt! +manage-tags.tag-not-found=Tag nicht gefunden! + +manage-tags.empty-name=Leerer Name! +manage-tags.duplicate-name=Bereits vorhandener Name! +manage-tags.edit-success=Tag aktualisiert \u2013 Bearbeitete Tags werden w\u00e4hrend der Neuindizierung unter Umst\u00e4nden kurzzeitig nicht in Suchergebnissen angezeigt. +manage-tags.edit-failure=Fehler bei der Aktualisierung des Tags + +# Delete Tag Labels +message.confirm.delete.title=Tag l\u00f6schen +message.confirm.delete=M\u00f6chten Sie ''{0}'' wirklich l\u00f6schen? +message.delete.failure=Tag konnte nicht gel\u00f6scht werden + +manage-tags.delete-success=Tag gel\u00f6scht +manage-tags.delete-failure=Fehler beim L\u00f6schen des Tags + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_es.properties new file mode 100755 index 0000000000..d74e90ae5f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_es.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Lista de etiquetas +loading-tags=Cargando ... +no-tag-found=No se ha encontrado ninguna etiqueta +tags-found=Etiquetas encontradas: {0} + +## Column Labels +title.tagName=Etiqueta +title.modifiedBy=Modificado por +title.modifiedOn=Modificado +title.actions=Acciones +title.editTag=Editar etiqueta +title.deleteTag=Eliminar etiqueta + +# Dialog labels +title.error=Error + +# Edit Tag Labels +message.edit.failure=No se puede actualizar la etiqueta + +manage-tags.tag-name-missing=Falta el nombre de etiqueta +manage-tags.tag-not-found=Etiqueta no encontrada + +manage-tags.empty-name=Nombre vac\u00edo +manage-tags.duplicate-name=Duplicar nombre +manage-tags.edit-success=Etiqueta actualizada: las etiquetas modificadas pueden desaparecer temporalmente de los resultados de b\u00fasqueda durante la nueva indexaci\u00f3n. +manage-tags.edit-failure=Error al actualizar la etiqueta + +# Delete Tag Labels +message.confirm.delete.title=Eliminar etiqueta +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar ''{0}''? +message.delete.failure=No se pudo eliminar la etiqueta + +manage-tags.delete-success=Etiqueta eliminada +manage-tags.delete-failure=Error al eliminar la etiqueta + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_fr.properties new file mode 100755 index 0000000000..b0fa5a9a47 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_fr.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Liste des tags +loading-tags=Chargement... +no-tag-found=Aucun tag trouv\u00e9 +tags-found=Tags trouv\u00e9s : {0} + +## Column Labels +title.tagName=Tag +title.modifiedBy=Modifi\u00e9 par +title.modifiedOn=Modifi\u00e9 +title.actions=Actions +title.editTag=Modifier le tag +title.deleteTag=Supprimer le tag + +# Dialog labels +title.error=Erreur + +# Edit Tag Labels +message.edit.failure=Impossible de mettre \u00e0 jour le tag + +manage-tags.tag-name-missing=Nom du tag manquant ! +manage-tags.tag-not-found=Tag introuvable ! + +manage-tags.empty-name=Nom absent ! +manage-tags.duplicate-name=Nom en double ! +manage-tags.edit-success=Tag mis \u00e0 jour - les tags mis \u00e0 jour peuvent temporairement dispara\u00eetre des r\u00e9sultats de recherche pour cause de r\u00e9indexation. +manage-tags.edit-failure=Erreur lors de la mise \u00e0 jour du tag + +# Delete Tag Labels +message.confirm.delete.title=Supprimer le tag +message.confirm.delete=Etes-vous s\u00fbr de vouloir supprimer ''{0}'' ? +message.delete.failure=Echec de la suppression du tag + +manage-tags.delete-success=Tag supprim\u00e9 +manage-tags.delete-failure=Erreur lors de la suppression du tag + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_it.properties new file mode 100755 index 0000000000..2d687346b4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_it.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Elenco tag +loading-tags=Caricamento in corso... +no-tag-found=Nessun tag trovato +tags-found=Tag trovati: {0} + +## Column Labels +title.tagName=Tag +title.modifiedBy=Modificato da +title.modifiedOn=Modificato il +title.actions=Azioni +title.editTag=Modifica tag +title.deleteTag=Elimina tag + +# Dialog labels +title.error=Errore + +# Edit Tag Labels +message.edit.failure=Impossibile aggiornare il tag + +manage-tags.tag-name-missing=Nome tag mancante! +manage-tags.tag-not-found=Tag non trovato! + +manage-tags.empty-name=Nome vuoto! +manage-tags.duplicate-name=Nome duplicato! +manage-tags.edit-success=Tag aggiornato: i tag modificati possono scomparire temporaneamente dai risultati di ricerca mentre \u00e8 in corso la reindicizzazione. +manage-tags.edit-failure=Errore durante l'aggiornamento del tag + +# Delete Tag Labels +message.confirm.delete.title=Elimina tag +message.confirm.delete=Eliminare ''{0}''? +message.delete.failure=Impossibile eliminare il tag + +manage-tags.delete-success=Tag eliminato +manage-tags.delete-failure=Errore durante l'eliminazione del tag + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_ja.properties new file mode 100755 index 0000000000..6fd9ba1e01 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_ja.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=\u30bf\u30b0\u30ea\u30b9\u30c8 +loading-tags=\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059 ... +no-tag-found=\u30bf\u30b0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 +tags-found=\u898b\u3064\u304b\u3063\u305f\u30bf\u30b0: {0} + +## Column Labels +title.tagName=\u30bf\u30b0 +title.modifiedBy=\u5909\u66f4\u8005 +title.modifiedOn=\u5909\u66f4\u65e5\u6642 +title.actions=\u51e6\u7406 +title.editTag=\u30bf\u30b0\u306e\u7de8\u96c6 +title.deleteTag=\u30bf\u30b0\u306e\u524a\u9664 + +# Dialog labels +title.error=\u30a8\u30e9\u30fc + +# Edit Tag Labels +message.edit.failure=\u30bf\u30b0\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093 + +manage-tags.tag-name-missing=\u30bf\u30b0\u540d\u304c\u3042\u308a\u307e\u305b\u3093! +manage-tags.tag-not-found=\u30bf\u30b0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093! + +manage-tags.empty-name=\u540d\u524d\u304c\u7a7a\u3067\u3059! +manage-tags.duplicate-name=\u540d\u524d\u304c\u91cd\u8907\u3057\u3066\u3044\u307e\u3059! +manage-tags.edit-success=\u30bf\u30b0\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f - \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u51e6\u7406\u304c\u884c\u308f\u308c\u3066\u3044\u308b\u9593\u306f\u3001\u7de8\u96c6\u3057\u305f\u30bf\u30b0\u304c\u4e00\u6642\u7684\u306b\u691c\u7d22\u7d50\u679c\u304b\u3089\u6d88\u3048\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002 +manage-tags.edit-failure=\u30bf\u30b0\u306e\u66f4\u65b0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f + +# Delete Tag Labels +message.confirm.delete.title=\u30bf\u30b0\u306e\u524a\u9664 +message.confirm.delete=''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.delete.failure=\u30bf\u30b0\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f + +manage-tags.delete-success=\u30bf\u30b0\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f +manage-tags.delete-failure=\u30bf\u30b0\u306e\u524a\u9664\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_nb.properties new file mode 100755 index 0000000000..28f10d56c9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_nb.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Taggliste +loading-tags=Laster... +no-tag-found=Fant ingen tagger +tags-found=Tagger funnet: {0} + +## Column Labels +title.tagName=Tagg +title.modifiedBy=Modifisert av +title.modifiedOn=Modifisert den +title.actions=Handlinger +title.editTag=Rediger tagg +title.deleteTag=Slett tagg + +# Dialog labels +title.error=Feil + +# Edit Tag Labels +message.edit.failure=Kan ikke oppdatere tagg + +manage-tags.tag-name-missing=Taggnavn mangler! +manage-tags.tag-not-found=Finner ikke tagg! + +manage-tags.empty-name=Tomt navn! +manage-tags.duplicate-name=Duplikat navn! +manage-tags.edit-success=Tagg oppdatert - redigerte tagger kan forsvinne midlertidig fra s\u00f8keresultatene mens ny indeksering forekommer. +manage-tags.edit-failure=Feil under oppdatering av tagg + +# Delete Tag Labels +message.confirm.delete.title=Slett tagg +message.confirm.delete=Er du sikker p\u00e5 at du vil slette ''{0}''? +message.delete.failure=Kan ikke slette tagg + +manage-tags.delete-success=Tagg slettet +manage-tags.delete-failure=Feil under sletting av tagg + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_nl.properties new file mode 100755 index 0000000000..81ca2c8bfd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_nl.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Lijst met tags +loading-tags=Laden ... +no-tag-found=Geen tag gevonden +tags-found=Tags gevonden: {0} + +## Column Labels +title.tagName=Tag +title.modifiedBy=Gewijzigd door +title.modifiedOn=Gewijzigd +title.actions=Acties +title.editTag=Tag bewerken +title.deleteTag=Tag verwijderen + +# Dialog labels +title.error=Fout + +# Edit Tag Labels +message.edit.failure=Kan tag niet bijwerken + +manage-tags.tag-name-missing=Tagnaam ontbreekt! +manage-tags.tag-not-found=Tag niet gevonden! + +manage-tags.empty-name=Lege naam! +manage-tags.duplicate-name=Dubbele naam! +manage-tags.edit-success=Tag bijgewerkt - bewerkte tags worden mogelijk tijdelijk niet weergegeven in zoekresultaten wanneer herindexering plaatsvindt. +manage-tags.edit-failure=Fout bij bijwerken van tag + +# Delete Tag Labels +message.confirm.delete.title=Tag verwijderen +message.confirm.delete=Weet u zeker dat u ''{0}'' wilt verwijderen? +message.delete.failure=Kan tag niet verwijderen + +manage-tags.delete-success=Tag verwijderd +manage-tags.delete-failure=Fout bij verwijderen van tag + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_pt_BR.properties new file mode 100644 index 0000000000..38f8c44532 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_pt_BR.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=Lista de marcas +loading-tags=Carregando... +no-tag-found=Nenhuma marca encontrada +tags-found=Marcas encontradas: {0} + +## Column Labels +title.tagName=Marca +title.modifiedBy=Modificado por +title.modifiedOn=Modificado em +title.actions=A\u00e7\u00f5es +title.editTag=Editar marca +title.deleteTag=Excluir marca + +# Dialog labels +title.error=Erro + +# Edit Tag Labels +message.edit.failure=N\u00e3o \u00e9 poss\u00edvel atualizar a marca + +manage-tags.tag-name-missing=O nome da marca est\u00e1 ausente! +manage-tags.tag-not-found=Marca n\u00e3o encontrada! + +manage-tags.empty-name=Nome vazio! +manage-tags.duplicate-name=Nome duplicado! +manage-tags.edit-success=Marca atualizada: as marcas editadas podem desaparecer temporariamente dos resultados de pesquisa enquanto ocorre a reindexa\u00e7\u00e3o. +manage-tags.edit-failure=Erro durante a atualiza\u00e7\u00e3o da marca + +# Delete Tag Labels +message.confirm.delete.title=Excluir marca +message.confirm.delete=Tem certeza de que deseja excluir ''{0}''? +message.delete.failure=N\u00e3o foi poss\u00edvel excluir a marca + +manage-tags.delete-success=Marca exclu\u00edda +manage-tags.delete-failure=Erro durante a exclus\u00e3o da marca + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_ru.properties new file mode 100755 index 0000000000..64b2b29e43 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_ru.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=\u0421\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0442\u043e\u043a +loading-tags=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 ... +no-tag-found=\u041c\u0435\u0442\u043a\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b +tags-found=\u041d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438: {0} + +## Column Labels +title.tagName=\u041c\u0435\u0442\u043a\u0430 +title.modifiedBy=\u041a\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e +title.modifiedOn=\u0414\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f +title.actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f +title.editTag=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 +title.deleteTag=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 + +# Dialog labels +title.error=\u041e\u0448\u0438\u0431\u043a\u0430 + +# Edit Tag Labels +message.edit.failure=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 + +manage-tags.tag-name-missing=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c\u044f \u043c\u0435\u0442\u043a\u0438! +manage-tags.tag-not-found=\u041c\u0435\u0442\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430! + +manage-tags.empty-name=\u041f\u0443\u0441\u0442\u043e\u0435 \u0438\u043c\u044f! +manage-tags.duplicate-name=\u041c\u0435\u0442\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! +manage-tags.edit-success=\u041c\u0435\u0442\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442\u044c \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430, \u043f\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u044f. +manage-tags.edit-failure=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043a\u0438 + +# Delete Tag Labels +message.confirm.delete.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 +message.confirm.delete=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}''? +message.delete.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 + +manage-tags.delete-success=\u041c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 +manage-tags.delete-failure=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043a\u0438 + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_zh_CN.properties new file mode 100755 index 0000000000..d6275ed5ed --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/tag-management.get_zh_CN.properties @@ -0,0 +1,37 @@ +# Data table MSG Labels +item.tagList=\u6807\u8bb0\u5217\u8868 +loading-tags=\u52a0\u8f7d\u4e2d... +no-tag-found=\u672a\u627e\u5230\u6807\u8bb0 +tags-found=\u627e\u5230\u6807\u8bb0\uff1a{0} + +## Column Labels +title.tagName=\u6807\u8bb0 +title.modifiedBy=\u4fee\u6539\u8005 +title.modifiedOn=\u4fee\u6539\u65f6\u95f4 +title.actions=\u64cd\u4f5c +title.editTag=\u7f16\u8f91\u6807\u8bb0 +title.deleteTag=\u5220\u9664\u6807\u8bb0 + +# Dialog labels +title.error=\u9519\u8bef + +# Edit Tag Labels +message.edit.failure=\u65e0\u6cd5\u66f4\u65b0\u6807\u8bb0 + +manage-tags.tag-name-missing=\u7f3a\u5c11\u6807\u8bb0\u540d\u79f0\uff01 +manage-tags.tag-not-found=\u672a\u627e\u5230\u6807\u8bb0\uff01 + +manage-tags.empty-name=\u540d\u79f0\u4e3a\u7a7a\uff01 +manage-tags.duplicate-name=\u540d\u79f0\u91cd\u590d\uff01 +manage-tags.edit-success=\u6807\u8bb0\u5df2\u66f4\u65b0 - \u91cd\u65b0\u5efa\u7acb\u7d22\u5f15\u65f6\uff0c\u88ab\u7f16\u8f91\u7684\u6807\u8bb0\u53ef\u80fd\u6682\u65f6\u4ece\u641c\u7d22\u7ed3\u679c\u4e2d\u6d88\u5931\u3002 +manage-tags.edit-failure=\u66f4\u65b0\u6807\u8bb0\u65f6\u51fa\u9519 + +# Delete Tag Labels +message.confirm.delete.title=\u5220\u9664\u6807\u8bb0 +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664 ''{0}''\uff1f +message.delete.failure=\u65e0\u6cd5\u5220\u9664\u6807\u8bb0 + +manage-tags.delete-success=\u6807\u8bb0\u5df2\u5220\u9664 +manage-tags.delete-failure=\u5220\u9664\u6807\u8bb0\u65f6\u51fa\u9519 + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.config.xml new file mode 100644 index 0000000000..6dc3a4657b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.config.xml @@ -0,0 +1,8 @@ + + tool.ooojodconverter.label +
+ mbean + Alfresco:Type=Configuration,Category=OOoJodconverter,id1=default +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.desc.xml new file mode 100644 index 0000000000..f8010f2c26 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console OOoJodConverter Tool + Administration Console - OOoJodConverter Tool + /components/console/ooojodconverter + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/ooojodconverter.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.config.xml new file mode 100644 index 0000000000..25db5ef973 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.config.xml @@ -0,0 +1,8 @@ + + tool.openoffice-subsystem.label +
+ mbean + Alfresco:Type=Configuration,Category=OOoDirect,id1=default +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.desc.xml new file mode 100644 index 0000000000..33dad1ac94 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console OpenOffice Subsystem Tool + Administration Console - OpenOffice Subsystem Tool + /components/console/openoffice-subsystem + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice-subsystem.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.config.xml new file mode 100644 index 0000000000..f7b6ab0141 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.config.xml @@ -0,0 +1,9 @@ + + tool.openoffice.label +
+ mbean + Alfresco:Name=OpenOffice + openoffice.error +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.desc.xml new file mode 100644 index 0000000000..e92f6362a4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.desc.xml @@ -0,0 +1,7 @@ + + Admin Console OpenOffice Tool + Administration Console - OpenOffice Tool + /components/console/openoffice + + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/openoffice.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.config.xml new file mode 100644 index 0000000000..e354cd7d73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.config.xml @@ -0,0 +1,8 @@ + + tool.transformer-imagemagick.label +
+ mbean + Alfresco:Name=ContentTransformer,Type=ImageMagick +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.desc.xml new file mode 100644 index 0000000000..bdaf8e77cc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Transformer ImageMagick Tool + Administration Console - Transformer ImageMagick Tool + /components/console/transformer-imagemagick + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-imagemagick.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.config.xml new file mode 100644 index 0000000000..138c603234 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.config.xml @@ -0,0 +1,8 @@ + + tool.transformer-pdf2swf.label +
+ mbean + Alfresco:Name=ContentTransformer,Type=pdf2swf +
+ false +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.desc.xml new file mode 100644 index 0000000000..57a826c5d3 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.desc.xml @@ -0,0 +1,8 @@ + + Admin Console Transformer pdf2swf Tool + Administration Console - Transformer pdf2swf Tool + /components/console/transformer-pdf2swf + + edition:TEAM + edition:ENTERPRISE + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.head.ftl new file mode 100644 index 0000000000..deac892f73 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.html.ftl new file mode 100644 index 0000000000..b566928760 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/transformations/transformer-pdf2swf.get.html.ftl @@ -0,0 +1,2 @@ +<#import "../generic-form-tool.lib.ftl" as gft> +<@gft.renderPanel config.script.config/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.desc.xml new file mode 100644 index 0000000000..9aa334c2c7 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Groups Tool + Administration Console - Groups Management Tool + /components/console/groups + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.html.ftl new file mode 100644 index 0000000000..7caf01bfa6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.html.ftl @@ -0,0 +1,233 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/yui/columnbrowser/assets/columnbrowser.css" group="console"/> + <@link href="${url.context}/res/yui/columnbrowser/assets/skins/default/columnbrowser-skin.css" group="console"/> + <@link href="${url.context}/res/components/console/groups.css" group="console"/> + <@link href="${url.context}/res/components/people-finder/people-finder.css" group="console"/> + <@link href="${url.context}/res/components/people-finder/group-finder.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/groups.js" group="console"/> + <@script src="${url.context}/res/components/people-finder/people-finder.js" group="console"/> + <@script src="${url.context}/res/components/people-finder/group-finder.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + + <#assign el=args.htmlid?html> +
+ + + + + + + + + + + +
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.js new file mode 100644 index 0000000000..961cbdf219 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.js @@ -0,0 +1,31 @@ +function main() { + // Widget instantiation metadata... + var search = null, + searchMain = config.scoped["Search"]; + if (searchMain != null) + { + search = searchMain["search"]; + } + var groups = null, + console = config.scoped["Console"]; + if (console != null) + { + groups = console["groups"]; + } + + var minSearchTermLength = (args.minSearchTermLength != null) ? args.minSearchTermLength : search.getChildValue("min-search-term-length"), + maxSearchResults = (args.maxSearchResults != null) ? args.maxSearchResults : search.getChildValue("max-search-results"), + maxPageSize = (args.maxPageSize != null) ? args.maxPageSize : groups.getChildValue('max-page-size'); + + var widget = { + id : "ConsoleGroups", + name : "Alfresco.ConsoleGroups", + options : { + minSearchTermLength: parseInt(minSearchTermLength), + maxSearchResults: parseInt(maxSearchResults), + maxPageSize: parseInt(maxPageSize) + } + }; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.properties new file mode 100644 index 0000000000..fd7fa10685 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get.properties @@ -0,0 +1,82 @@ +label.title-browse=Groups +label.title-create=New Group +label.title-update=Edit Group + +label.enabled=Enabled +label.disabled=Disabled +label.properties=Properties +label.requiredfield=Required Field +label.shortname=Identifier +label.shortname.warning=(The Identifier for a Group cannot be changed once it has been set) +label.displayname=Display Name +label.showAll=Show System Groups + +label.nogroups=No groups +label.noofgroups={0} Group(s) +label.nousers=No users +label.noofusers={0} User(s) +label.theroot=the root + +button.newgroup=New Group +button.newsubgroup=New Subgroup +button.addgroup=Add Group +button.adduser=Add User +button.updategroup=Edit Group +button.deletegroup=Delete Group +button.removeuser=Remove User +button.creategroup=Create Group +button.usedefault=Use Default + +message.usage=Search to find groups you know. Click 'Browse' to create new groups or browse groups hierarchically. +message.empty=Search to view groups. +message.error=An error occurred during the search - no results to display. +message.noresults=No results. Note that your search will only match group identifiers and not display names. +message.noresults.short=No results. +message.results=Search for ''{0}'' found {1} results. +message.maxresults=Over {0} search results found. Show first {0} only. +message.getgroup-failure=Failed to retrieve group details for group ''{0}''. +message.confirm.add=Group ''{0}'' already exists and is placed under ''{1}''. Do you want to place it under ''{2}'' as well? +message.confirm.delete=Are you sure you want to delete group ''{0}''? +message.confirm.removeuser.title=Remove User from Group +message.confirm.removeuser=Are you sure you want to remove ''{0}'' from the group? +message.create-success=Successfully created new group. +message.create-failure=Failed to create the group ''{0}''. +message.delete-success=Successfully deleted group ''{0}''. +message.delete-failure=Failed to delete group ''{0}''. +message.removeuser-success=Successfully removed user ''{0}''. +message.removeuser-failure=Failed to remove user ''{0}''. +message.adduser-success=Successfully added user ''{0}''. +message.adduser-failure=Failed to add user ''{0}''. +message.addgroup-success=Successfully added group ''{0}''. +message.addgroup-failure=Failed to add group ''{0}''. +message.update-success=Successfully updated group. +message.update-failure=Failed to update the details for group ''{0}''. + +label.group=Group +label.actions= +label.breadcrumb.root=Path: +label.moregroups=... {0} more. + +panel.delete.header=Confirm +panel.delete.msg=Press Delete to remove this group from the system. +panel.delete.fail=Unable to delete the group. + +panel.deletegroup.header=Delete Group +panel.deletegroup.singleparentmessage=Are you sure you want to permanently delete group ''{0}''? +panel.deletegroup.oneormultiparentmessage=The group ''{0}'' has one or more parents: +panel.deletegroup.multiparentmessage=The group ''{0}'' has multiple parents: +panel.deletegroup.removemessage=Just delete ''{0}'' from ''{1}''. +panel.deletegroup.deletemessage=Delete ''{0}'' from all. +panel.deletegroup.deletewarning=Note: The group will be permanently deleted. +panel.deletegroup.searchdeletemessage=Are you sure you want to permanently delete group ''{0}''? +panel.deletegroup.showparents=View parents +panel.deletegroup.hideparents=Hide parents + +panel.adduser.header=Add User + +panel.addgroup.header=Add Group + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=It is not possible to delete a group from the root in this version +message.noAddGroupFromRootSupport=It is not possible to add an existing group to the root in this version diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_de.properties new file mode 100755 index 0000000000..0955460d50 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_de.properties @@ -0,0 +1,82 @@ +label.title-browse=Gruppen +label.title-create=Neue Gruppe +label.title-update=Gruppe bearbeiten + +label.enabled=Aktiviert +label.disabled=Deaktiviert +label.properties=Eigenschaften +label.requiredfield=Pflichtfeld +label.shortname=Identifikator +label.shortname.warning=(Die Bezeichnung einer Gruppe kann nach dem Anlegen nicht mehr ge\u00e4ndert werden) +label.displayname=Namen anzeigen +label.showAll=Systemgruppen anzeigen + +label.nogroups=Keine Gruppen +label.noofgroups={0} Gruppe(n) +label.nousers=Keine Benutzer +label.noofusers={0} Benutzer +label.theroot=Root + +button.newgroup=Neue Gruppe +button.newsubgroup=Neue Untergruppe +button.addgroup=Gruppe hinzuf\u00fcgen +button.adduser=Benutzer hinzuf\u00fcgen +button.updategroup=Gruppe bearbeiten +button.deletegroup=Gruppe l\u00f6schen +button.removeuser=Benutzer entfernen +button.creategroup=Gruppe erstellen +button.usedefault=Standard verwenden + +message.usage=Suchen, um Ihnen bekannte Gruppen zu finden. Klicken Sie auf 'Browse' um Gruppen zu erstellen oder durch die Hierarchie der Gruppen zu navigieren. +message.empty=Suchen, um Gruppen anzuzeigen. +message.error=W\u00e4hrend der Suche trat ein Fehler auf - keine Ergebnisse anzuzeigen. +message.noresults=Keine Ergebnisse. Bitte beachten Sie, dass Ihre Suche nur Treffer in den Gruppenbezeichnungen ber\u00fccksichtigt und keine Namen anzeigt. +message.noresults.short=Keine Ergebnisse. +message.results=Suche nach ''{0}'' ergab {1} Ergebnisse. +message.maxresults=Mehr als {0} Ergebnisse gefunden. Nur die ersten {0} anzeigen. +message.getgroup-failure=Konnte Gruppendetails f\u00fcr Gruppe ''{0}'' nicht abrufen. +message.confirm.add=Gruppe ''{0}'' existiert bereits und befindet sich unter ''{1}''. M\u00f6chten Sie die Gruppe ebenfalls unter ''{2}'' einordnen? +message.confirm.delete=M\u00f6chten Sie die Gruppe ''{0}'' wirklich l\u00f6schen? +message.confirm.removeuser.title=Benutzer aus Gruppe entfernen +message.confirm.removeuser=Sind Sie sicher, dass Sie ''{0}'' aus der Gruppe l\u00f6schen m\u00f6chten? +message.create-success=Neue Gruppe erfolgreich erstellt. +message.create-failure=Fehler beim Erstellen der Gruppe ''{0}''. +message.delete-success=Gruppe ''{0}'' erfolgreich gel\u00f6scht. +message.delete-failure=Fehler beim L\u00f6schen der Gruppe ''{0}''. +message.removeuser-success=Benutzer ''{0}'' erfolgreich entfernt. +message.removeuser-failure=Fehler beim Entfernen des Benutzers ''{0}''. +message.adduser-success=Benutzer ''{0}'' erfolgreich hinzugef\u00fcgt. +message.adduser-failure=Fehler beim Hinzuf\u00fcgen des Benutzers ''{0}''. +message.addgroup-success=Gruppe ''{0}'' erfolgreich hinzugef\u00fcgt. +message.addgroup-failure=Fehler beim Hinzuf\u00fcgen der Gruppe ''{0}''. +message.update-success=Gruppe erfolgreich aktualisiert. +message.update-failure=Fehler beim Aktualisierten der Details f\u00fcr die Gruppe ''{0}''. + +label.group=Gruppe +label.actions= +label.breadcrumb.root=Pfad: +label.moregroups=... {0} mehr. + +panel.delete.header=Best\u00e4tigen +panel.delete.msg=Dr\u00fccken Sie auf L\u00f6schen, um die Gruppe aus dem System zu entfernen. +panel.delete.fail=Konnte Gruppe nicht l\u00f6schen. + +panel.deletegroup.header=Gruppe l\u00f6schen +panel.deletegroup.singleparentmessage=M\u00f6chten Sie die Gruppe ''{0}'' wirklich endg\u00fcltig l\u00f6schen? +panel.deletegroup.oneormultiparentmessage=Die Gruppe ''{0}'' hat ein oder mehrere \u00fcbergeordnete Elemente: +panel.deletegroup.multiparentmessage=Die Gruppe ''{0}'' hat mehrere \u00fcbergeordnete Elemente: +panel.deletegroup.removemessage=L\u00f6sche ''{0}'' nur aus ''{1}''. +panel.deletegroup.deletemessage=L\u00f6sche ''{0}'' aus allen. +panel.deletegroup.deletewarning=Hinweis: Die Gruppe wird endg\u00fcltig gel\u00f6scht. +panel.deletegroup.searchdeletemessage=M\u00f6chten Sie die Gruppe ''{0}'' wirklich endg\u00fcltig l\u00f6schen? +panel.deletegroup.showparents=\u00dcbergeordnete Elemente anzeigen +panel.deletegroup.hideparents=\u00dcbergeordnete Elemente ausblenden + +panel.adduser.header=Benutzer hinzuf\u00fcgen + +panel.addgroup.header=Gruppe hinzuf\u00fcgen + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=Es ist in dieser Version nicht m\u00f6glich, eine Gruppe aus dem Root zu l\u00f6schen +message.noAddGroupFromRootSupport=Es ist in dieser Version nicht m\u00f6glich, eine bestehende Gruppe zum Root hinzuzuf\u00fcgen diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_es.properties new file mode 100755 index 0000000000..0f2e00cbd9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_es.properties @@ -0,0 +1,82 @@ +label.title-browse=Grupos +label.title-create=Nuevo grupo +label.title-update=Editar grupo + +label.enabled=Activo +label.disabled=Desactivado +label.properties=Propiedades +label.requiredfield=Campo requerido +label.shortname=Identificador +label.shortname.warning=(El identificador de un grupo no se puede modificar una vez que se ha elegido) +label.displayname=Nombre a mostrar +label.showAll=Mostrar grupos del sistema + +label.nogroups=Ning\u00fan grupo +label.noofgroups={0} Grupo(s) +label.nousers=Ning\u00fan usuario +label.noofusers={0} Usuario(s) +label.theroot=la ra\u00edz + +button.newgroup=Nuevo grupo +button.newsubgroup=Nuevo subgrupo +button.addgroup=A\u00f1adir un grupo +button.adduser=A\u00f1adir usuario +button.updategroup=Editar grupo +button.deletegroup=Eliminar grupo +button.removeuser=Eliminar usuario +button.creategroup=Crear grupo +button.usedefault=Utilizar predeterminado + +message.usage=Buscar grupos conocidos. Haga clic en 'Examinar' para crear nuevos grupos o navegar por ellos jer\u00e1rquicamente. +message.empty=B\u00fasqueda de grupos. +message.error=Sucedi\u00f3 un error mientras se procesaba la b\u00fasqueda - No se mostrar\u00e1 ning\u00fan resultado. +message.noresults=Ning\u00fan resultado. Nota: la b\u00fasqueda cotejar\u00e1 solo los identificadores de grupo y no los nombres a mostrar. +message.noresults.short=Ning\u00fan resultado. +message.results=La b\u00fasqueda de ''{0}'' devolvi\u00f3 {1} resultado(s). +message.maxresults=M\u00e1s de {0} resultados devueltos por la b\u00fasqueda. Se muestran solo los primeros {0}. +message.getgroup-failure=No se pudieron recuperar los detalles del grupo ''{0}''. +message.confirm.add=El grupo ''{0}'' ya existe y se encuentra bajo ''{1}''. \u00bfDesear\u00eda situarlo bajo ''{2}'' tambi\u00e9n? +message.confirm.delete=\u00bfEst\u00e1 seguro de que quiere eliminar el grupo ''{0}''? +message.confirm.removeuser.title=Eliminar usuario del grupo +message.confirm.removeuser=\u00bfEst\u00e1 seguro de que quiere eliminar al usuario ''{0}'' del grupo? +message.create-success=Se cre\u00f3 el nuevo grupo con \u00e9xito. +message.create-failure=No se pudo crear el grupo ''{0}''. +message.delete-success=Se elimin\u00f3 el grupo ''{0}''. +message.delete-failure=No se pudo eliminar el grupo ''{0}''. +message.removeuser-success=Usuario eliminado con \u00e9xito ''{0}''. +message.removeuser-failure=No se pudo eliminar el usuario ''{0}''. +message.adduser-success=Se a\u00f1adi\u00f3 con \u00e9xito el usuario ''{0}''. +message.adduser-failure=No se pudo a\u00f1adir el usuario ''{0}''. +message.addgroup-success=Grupo ''{0}'' a\u00f1adido correctamente. +message.addgroup-failure=No se pudo a\u00f1adir el grupo ''{0}''. +message.update-success=Se actualizaron con \u00e9xito los detalles del grupo. +message.update-failure=No se pudieron actualizar los detalles del grupo ''{0}''. + +label.group=Grupo +label.actions= +label.breadcrumb.root=Ruta: +label.moregroups=... {0} adicional(es). + +panel.delete.header=Confirmar +panel.delete.msg=Pulse Eliminar para quitar el grupo del sistema. +panel.delete.fail=No se pudo eliminar el grupo. + +panel.deletegroup.header=Eliminar grupo +panel.deletegroup.singleparentmessage=\u00bfEsta seguro de que desea eliminar definitivamente el grupo ''{0}''? +panel.deletegroup.oneormultiparentmessage=El grupo ''{0}'' tiene uno o m\u00e1s elementos primarios: +panel.deletegroup.multiparentmessage=El grupo ''{0}'' tiene de varios elementos primarios: +panel.deletegroup.removemessage=Eliminar \u00fanicamente ''{0}'' de ''{1}''. +panel.deletegroup.deletemessage=Eliminar ''{0}'' de todos. +panel.deletegroup.deletewarning=Nota: El grupo ser\u00e1 eliminado definitivamente. +panel.deletegroup.searchdeletemessage=\u00bfEsta seguro de que desea eliminar definitivamente el grupo ''{0}''? +panel.deletegroup.showparents=Ver los elementos primarios +panel.deletegroup.hideparents=Ocultar los elementos primarios + +panel.adduser.header=A\u00f1adir usuario + +panel.addgroup.header=A\u00f1adir un grupo + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=No se puede eliminar un grupo de la ra\u00edz en esta versi\u00f3n +message.noAddGroupFromRootSupport=No se puede a\u00f1adir un grupo en la ra\u00edz en esta versi\u00f3n diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_fr.properties new file mode 100755 index 0000000000..b8f87838f1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_fr.properties @@ -0,0 +1,82 @@ +label.title-browse=Groupes +label.title-create=Nouveau groupe +label.title-update=Editer un Groupe + +label.enabled=Activ\u00e9 +label.disabled=D\u00e9sactiv\u00e9 +label.properties=Propri\u00e9t\u00e9s +label.requiredfield=Champs Obligatoire +label.shortname=Identifiant +label.shortname.warning=(L'identifiant d'un groupe ne peut \u00eatre modifi\u00e9 une fois qu'il a \u00e9t\u00e9 choisi) +label.displayname=Nom affich\u00e9 +label.showAll=Afficher les groupes syst\u00e8me + +label.nogroups=Pas de groupe +label.noofgroups={0} groupe(s) +label.nousers=Pas d'utilisateur +label.noofusers={0} utilisateur(s) +label.theroot=la racine + +button.newgroup=Nouveau groupe +button.newsubgroup=Nouveau sous-groupe +button.addgroup=Ajouter un groupe +button.adduser=Ajouter un utilisateur +button.updategroup=Editer un Groupe +button.deletegroup=Supprimer le Groupe +button.removeuser=Enlever l'utilisateur +button.creategroup=Cr\u00e9er un groupe +button.usedefault=Utiliser les valeurs par d\u00e9faut + +message.usage=Rechercher des groupes que vous connaissez. Cliquer sur 'Parcourir' pour cr\u00e9er des groupes ou les parcourir de fa\u00e7on hi\u00e9rarchique. +message.empty=Rechercher pour voir les groupes. +message.error=Une erreur s'est produite pendant la recherche - Aucun r\u00e9sultat \u00e0 afficher. +message.noresults=Pas de r\u00e9sultat. Notez que la recherche va uniquement v\u00e9rifier les identifiants de groupe et pas leur nom d'affichage. +message.noresults.short=Pas de r\u00e9sultat. +message.results=La recherche de ''{0}'' a retourn\u00e9 {1} r\u00e9sultat(s). +message.maxresults=Plus de {0} r\u00e9sultats de recherche trouv\u00e9s. Montrer les {0} premiers seulement. +message.getgroup-failure=Echec de la r\u00e9cup\u00e9ration des d\u00e9tails pour le groupe ''{0}''. +message.confirm.add=Le groupe ''{0}'' existe d\u00e9j\u00e0 et se trouve sous ''{1}''. Voulez-vous \u00e9galement le placer sous ''{2}'' ? +message.confirm.delete=Etes-vous s\u00fbr de vouloir d\u00e9finitivement supprimer le groupe ''{0}'' ? +message.confirm.removeuser.title=Retirer l'utilisateur du groupe +message.confirm.removeuser=Etes-vous s\u00fbr de vouloir supprimer ''{0}'' du groupe ? +message.create-success=Succ\u00e8s de la cr\u00e9ation du nouveau groupe. +message.create-failure=Echec de la cr\u00e9ation du groupe ''{0}''. +message.delete-success=Succ\u00e8s de la suppression du groupe ''{0}''. +message.delete-failure=Echec de la suppression du groupe ''{0}''. +message.removeuser-success=Succ\u00e8s de la suppression de l''utilisateur ''{0}''. +message.removeuser-failure=Echec de la suppression de l''utilisateur ''{0}''. +message.adduser-success=Succ\u00e8s de l''ajout de l''utilisateur ''{0}''. +message.adduser-failure=Echec de l''ajout de l''utilisateur ''{0}''. +message.addgroup-success=Succ\u00e8s de l''ajout du groupe ''{0}''. +message.addgroup-failure=Echec de l''ajout du groupe ''{0}''. +message.update-success=Succ\u00e8s lors de la mise \u00e0 jour du groupe. +message.update-failure=Echec de la r\u00e9cup\u00e9ration des d\u00e9tails pour le groupe ''{0}''. + +label.group=Groupe +label.actions= +label.breadcrumb.root=Chemin : +label.moregroups=... {0} suppl\u00e9mentaire(s). + +panel.delete.header=Confirmer +panel.delete.msg=Cliquer sur Supprimer pour enlever ce groupe du syst\u00e8me. +panel.delete.fail=Echec de la suppression du groupe. + +panel.deletegroup.header=Supprimer le Groupe +panel.deletegroup.singleparentmessage=Etes-vous s\u00fbr de vouloir d\u00e9finitivement supprimer le groupe ''{0}'' ? +panel.deletegroup.oneormultiparentmessage=Le groupe ''{0}'' a un ou plusieurs parents : +panel.deletegroup.multiparentmessage=Le groupe ''{0}'' a de multiples parents : +panel.deletegroup.removemessage=Juste enlever ''{0}'' de ''{1}''. +panel.deletegroup.deletemessage=Enlever ''{0}'' de tous. +panel.deletegroup.deletewarning=Note : le groupe sera d\u00e9finitivement supprim\u00e9. +panel.deletegroup.searchdeletemessage=Etes-vous s\u00fbr de vouloir d\u00e9finitivement supprimer le groupe ''{0}'' ? +panel.deletegroup.showparents=Afficher les parents +panel.deletegroup.hideparents=Cacher les parents + +panel.adduser.header=Ajouter un utilisateur + +panel.addgroup.header=Ajouter un groupe + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=Il n'est pas possible de supprimer un groupe de la racine dans cette version +message.noAddGroupFromRootSupport=Il n'est pas possible d'ajouter un groupe existant \u00e0 la racine dans cette version diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_it.properties new file mode 100755 index 0000000000..a6aceab39a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_it.properties @@ -0,0 +1,82 @@ +label.title-browse=Gruppi +label.title-create=Nuovo gruppo +label.title-update=Modifica gruppo + +label.enabled=Abilitato +label.disabled=Disabilitato +label.properties=Propriet\u00e0 +label.requiredfield=Campo richiesto +label.shortname=Identificativo +label.shortname.warning=(L'identificativo di un gruppo non pu\u00f2 essere cambiato dopo che \u00e8 stato impostato) +label.displayname=Nome visualizzato +label.showAll=Mostra gruppi di sistema + +label.nogroups=Nessun gruppo +label.noofgroups={0} gruppo/i +label.nousers=Nessun utente +label.noofusers={0} utente/i +label.theroot=la radice + +button.newgroup=Nuovo gruppo +button.newsubgroup=Nuovo sottogruppo +button.addgroup=Aggiungi gruppo +button.adduser=Aggiungi utente +button.updategroup=Modifica gruppo +button.deletegroup=Elimina gruppo +button.removeuser=Rimuovi utente +button.creategroup=Crea gruppo +button.usedefault=Utilizza predefinito + +message.usage=Eseguire una ricerca per trovare i gruppi noti. Scegliere 'Sfoglia' per creare nuovi gruppi o esplorare i gruppi gerarchicamente. +message.empty=Eseguire una ricerca per visualizzare i gruppi. +message.error=Si \u00e8 verificato un errore durante la ricerca - Nessun risultato da visualizzare. +message.noresults=Nessun risultato. Si noti che la ricerca verifica solo gli identificativi dei gruppi e non i nomi visualizzati. +message.noresults.short=Nessun risultato. +message.results=La ricerca di ''{0}'' ha restituito {1} risultati. +message.maxresults=Sono stati trovati pi\u00f9 di {0} risultati. Vengono mostrati solo i primi {0}. +message.getgroup-failure=Impossibile recuperare i dettagli per il gruppo ''{0}''. +message.confirm.add=Il gruppo ''{0}'' esiste gi\u00e0 e si trova sotto ''{1}''. Posizionarlo anche sotto ''{2}''? +message.confirm.delete=Eliminare il gruppo ''{0}''? +message.confirm.removeuser.title=Rimuovi utente dal gruppo +message.confirm.removeuser=Rimuovere ''{0}'' dal gruppo? +message.create-success=Il nuovo gruppo \u00e8 stato creato. +message.create-failure=Impossibile creare il gruppo ''{0}''. +message.delete-success=Il gruppo \u00e8 stato eliminato ''{0}''. +message.delete-failure=Impossibile eliminare il gruppo ''{0}''. +message.removeuser-success=L''utente \u00e8 stato rimosso ''{0}''. +message.removeuser-failure=Impossibile rimuovere l''utente ''{0}''. +message.adduser-success=L''utente \u00e8 stato aggiunto ''{0}''. +message.adduser-failure=Impossibile aggiungere l''utente ''{0}''. +message.addgroup-success=Il gruppo \u00e8 stato aggiunto ''{0}''. +message.addgroup-failure=Impossibile aggiungere il gruppo ''{0}''. +message.update-success=Il gruppo \u00e8 stato aggiornato. +message.update-failure=Impossibile aggiornare i dettagli per il gruppo ''{0}''. + +label.group=Gruppo +label.actions= +label.breadcrumb.root=Percorso: +label.moregroups=... {0} in pi\u00f9. + +panel.delete.header=Conferma +panel.delete.msg=Scegliere Elimina per rimuovere il gruppo dal sistema. +panel.delete.fail=Impossibile eliminare il gruppo. + +panel.deletegroup.header=Elimina gruppo +panel.deletegroup.singleparentmessage=Eliminare permanentemente il gruppo ''{0}''? +panel.deletegroup.oneormultiparentmessage=Il gruppo ''{0}'' ha uno o pi\u00f9 padri: +panel.deletegroup.multiparentmessage=Il gruppo ''{0}'' ha pi\u00f9 genitori: +panel.deletegroup.removemessage=Elimina ''{0}'' solo da ''{1}''. +panel.deletegroup.deletemessage=Elimina ''{0}'' da tutti. +panel.deletegroup.deletewarning=Nota: il gruppo verr\u00e0 eliminato permanentemente. +panel.deletegroup.searchdeletemessage=Eliminare permanentemente il gruppo ''{0}''? +panel.deletegroup.showparents=Visualizza genitori +panel.deletegroup.hideparents=Nascondi genitori + +panel.adduser.header=Aggiungi utente + +panel.addgroup.header=Aggiungi gruppo + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=Non \u00e8 possibile eliminare un gruppo dalla radice in questa versione +message.noAddGroupFromRootSupport=Non \u00e8 possibile aggiungere un gruppo esistente alla radice in questa versione diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_ja.properties new file mode 100755 index 0000000000..28405b0ff6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_ja.properties @@ -0,0 +1,82 @@ +label.title-browse=\u30b0\u30eb\u30fc\u30d7 +label.title-create=\u65b0\u3057\u3044\u30b0\u30eb\u30fc\u30d7 +label.title-update=\u30b0\u30eb\u30fc\u30d7\u306e\u7de8\u96c6 + +label.enabled=\u6709\u52b9 +label.disabled=\u7121\u52b9 +label.properties=\u30d7\u30ed\u30d1\u30c6\u30a3 +label.requiredfield=\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 +label.shortname=ID +label.shortname.warning=\uff08\u30b0\u30eb\u30fc\u30d7\u306eID\u306f\u4e00\u5ea6\u8a2d\u5b9a\u3059\u308b\u3068\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\uff09 +label.displayname=\u8868\u793a\u540d +label.showAll=\u30b7\u30b9\u30c6\u30e0\u306e\u30b0\u30eb\u30fc\u30d7\u3092\u8868\u793a + +label.nogroups=\u30b0\u30eb\u30fc\u30d7\u306f\u3042\u308a\u307e\u305b\u3093 +label.noofgroups={0} \u500b\u306e\u30b0\u30eb\u30fc\u30d7 +label.nousers=\u30e6\u30fc\u30b6\u30fc\u306f\u3042\u308a\u307e\u305b\u3093 +label.noofusers={0} \u4eba\u306e\u30e6\u30fc\u30b6\u30fc +label.theroot=\u30eb\u30fc\u30c8 + +button.newgroup=\u65b0\u3057\u3044\u30b0\u30eb\u30fc\u30d7 +button.newsubgroup=\u65b0\u3057\u3044\u30b5\u30d6\u30b0\u30eb\u30fc\u30d7 +button.addgroup=\u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 +button.adduser=\u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0 +button.updategroup=\u30b0\u30eb\u30fc\u30d7\u306e\u7de8\u96c6 +button.deletegroup=\u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664 +button.removeuser=\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664 +button.creategroup=\u30b0\u30eb\u30fc\u30d7\u306e\u4f5c\u6210 +button.usedefault=\u30c7\u30d5\u30a9\u30eb\u30c8\u3092\u4f7f\u7528\u3059\u308b + +message.usage=\u30b0\u30eb\u30fc\u30d7\u3092\u691c\u7d22\u3067\u304d\u307e\u3059\u3002 [\u95b2\u89a7] \u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u30b0\u30eb\u30fc\u30d7\u306e\u968e\u5c64\u3092\u8868\u793a\u3057\u305f\u308a\u3001\u65b0\u3057\u3044\u30b0\u30eb\u30fc\u30d7\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002 +message.empty=\u30b0\u30eb\u30fc\u30d7\u3092\u691c\u7d22\u3057\u3066\u8868\u793a\u3067\u304d\u307e\u3059\u3002 +message.error=\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f - \u8868\u793a\u3059\u308b\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.noresults=\u691c\u7d22\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u3053\u3053\u3067\u691c\u7d22\u3067\u304d\u308b\u306e\u306f\u30b0\u30eb\u30fc\u30d7 ID \u306e\u307f\u3067\u3001\u8868\u793a\u540d\u3067\u306f\u691c\u7d22\u3067\u304d\u307e\u305b\u3093\u3002 +message.noresults.short=\u691c\u7d22\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.results=''{0}'' \u306e\u691c\u7d22\u7d50\u679c\u306f {1} \u4ef6\u3067\u3059\u3002 +message.maxresults=\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u304c {0} \u4ef6\u4ee5\u4e0a\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002 \u6700\u521d\u306e {0} \u4ef6\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +message.getgroup-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u306e\u30b0\u30eb\u30fc\u30d7\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.confirm.add=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u306f\u3059\u3067\u306b ''{1}'' \u306b\u3042\u308a\u307e\u3059\u3002 ''{2}'' \u306b\u3082\u914d\u7f6e\u3057\u307e\u3059\u304b? +message.confirm.delete=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.confirm.removeuser.title=\u30b0\u30eb\u30fc\u30d7\u304b\u3089\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664 +message.confirm.removeuser=\u30b0\u30eb\u30fc\u30d7\u304b\u3089 ''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u304b? +message.create-success=\u65b0\u3057\u3044\u30b0\u30eb\u30fc\u30d7\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002 +message.create-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.delete-success=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.delete-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.removeuser-success=\u30e6\u30fc\u30b6\u30fc \u300c{0}\u300d\u304c\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.removeuser-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.adduser-success=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +message.adduser-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.addgroup-success=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +message.addgroup-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.update-success=\u30b0\u30eb\u30fc\u30d7\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002 +message.update-failure=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u306e\u8a73\u7d30\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +label.group=\u30b0\u30eb\u30fc\u30d7 +label.actions= +label.breadcrumb.root=\u30d1\u30b9: +label.moregroups=... \u3042\u3068 {0} \u30b0\u30eb\u30fc\u30d7\u3042\u308a\u307e\u3059. + +panel.delete.header=\u78ba\u8a8d +panel.delete.msg=\u3053\u306e\u30b0\u30eb\u30fc\u30d7\u3092\u30b7\u30b9\u30c6\u30e0\u304b\u3089\u524a\u9664\u3059\u308b\u306b\u306f\u3001\uff3b\u524a\u9664\uff3d \u3092\u62bc\u3057\u307e\u3059\u3002 +panel.delete.fail=\u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002 + +panel.deletegroup.header=\u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664 +panel.deletegroup.singleparentmessage=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u5b8c\u5168\u306b\u524a\u9664\u3057\u307e\u3059\u304b? +panel.deletegroup.oneormultiparentmessage=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u306b\u306f\u3001\u6b21\u306e\u89aa\u304c\u3042\u308a\u307e\u3059: +panel.deletegroup.multiparentmessage=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u306b\u306f\u3001\u6b21\u306e\u8907\u6570\u306e\u89aa\u304c\u3042\u308a\u307e\u3059: +panel.deletegroup.removemessage=''{1}'' \u304b\u3089 ''{0}'' \u306e\u307f\u3092\u524a\u9664\u3057\u307e\u3059\u3002 +panel.deletegroup.deletemessage=\u3059\u3079\u3066\u304b\u3089 ''{0}'' \u3092\u524a\u9664\u3057\u307e\u3059\u3002 +panel.deletegroup.deletewarning=\u30e1\u30e2: \u30b0\u30eb\u30fc\u30d7\u306f\u5b8c\u5168\u306b\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +panel.deletegroup.searchdeletemessage=\u30b0\u30eb\u30fc\u30d7 ''{0}'' \u3092\u5b8c\u5168\u306b\u524a\u9664\u3057\u307e\u3059\u304b? +panel.deletegroup.showparents=\u89aa\u3092\u8868\u793a +panel.deletegroup.hideparents=\u89aa\u3092\u975e\u8868\u793a + +panel.adduser.header=\u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0 + +panel.addgroup.header=\u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306f\u30eb\u30fc\u30c8\u304b\u3089\u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +message.noAddGroupFromRootSupport=\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306f\u30eb\u30fc\u30c8\u306b\u65e2\u5b58\u306e\u30b0\u30eb\u30fc\u30d7\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_nb.properties new file mode 100755 index 0000000000..909ed68a86 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_nb.properties @@ -0,0 +1,82 @@ +label.title-browse=Grupper +label.title-create=Ny gruppe +label.title-update=Rediger gruppe + +label.enabled=Aktivert +label.disabled=Deaktivert +label.properties=Egenskaper +label.requiredfield=Obligatorisk felt +label.shortname=Identifikator +label.shortname.warning=(Identifikatoren for en gruppe kan ikke endres etter at den har blitt konfigurert) +label.displayname=Vis navn +label.showAll=Vis systemgrupper + +label.nogroups=Ingen grupper +label.noofgroups={0} Gruppe(r) +label.nousers=Ingen brukere +label.noofusers={0} Bruker(e) +label.theroot=roten + +button.newgroup=Ny gruppe +button.newsubgroup=Ny undergruppe +button.addgroup=Legg til gruppe +button.adduser=Legg til bruker +button.updategroup=Rediger gruppe +button.deletegroup=Slett gruppe +button.removeuser=Fjern bruker +button.creategroup=Opprett gruppe +button.usedefault=Bruk standardverdi + +message.usage=S\u00f8k for \u00e5 finne grupper som du kjenner. Klikk Bla gjennom for \u00e5 opprette nye grupper eller for \u00e5 bla gjennom grupper hierarkisk. +message.empty=S\u00f8k for \u00e5 vise grupper. +message.error=Det oppsto en feil under s\u00f8ket \u2014 ingen resultater vises. +message.noresults=Ingen resultater. V\u00e6r oppmerksom p\u00e5 at s\u00f8ket kun vil matche gruppeidentifikatorer og vil ikke vise navn. +message.noresults.short=Ingen resultater. +message.results=S\u00f8k etter ''{0}'' ga {1} resultater. +message.maxresults=Fant over {0} s\u00f8keresultater. Viser kun de {0} f\u00f8rste. +message.getgroup-failure=Kunne ikke hente gruppedetaljer for gruppe ''{0}''. +message.confirm.add=Gruppe ''{0}'' finnes allerede og er plassert under ''{1}''. Vil du ogs\u00e5 plassere den under ''{2}''? +message.confirm.delete=Er du sikker p\u00e5 at du vil slette gruppe ''{0}''? +message.confirm.removeuser.title=Fjern bruker fra gruppe +message.confirm.removeuser=Er du sikker p\u00e5 at du vil fjerne ''{0}'' fra gruppen? +message.create-success=Ny gruppe ble opprettet. +message.create-failure=Kunne ikke opprette gruppen ''{0}''. +message.delete-success=Gruppe ''{0}'' ble slettet. +message.delete-failure=Kunne ikke slette gruppe ''{0}''. +message.removeuser-success=Bruker ''{0}'' ble fjernet. +message.removeuser-failure=Kunne ikke fjerne bruker ''{0}''. +message.adduser-success=Bruker ''{0}'' ble lagt til. +message.adduser-failure=Kunne ikke legge til bruker ''{0}''. +message.addgroup-success=Gruppe ''{0}'' ble lagt til. +message.addgroup-failure=Kunne ikke legge til gruppe ''{0}''. +message.update-success=Gruppen ble oppdatert. +message.update-failure=Kunne ikke oppdatere detaljene for gruppe ''{0}''. + +label.group=Gruppe +label.actions= +label.breadcrumb.root=Bane: +label.moregroups=... {0} mer. + +panel.delete.header=Bekreft +panel.delete.msg=Trykk p\u00e5 Slett for \u00e5 fjerne denne gruppen fra systemet. +panel.delete.fail=Kunne ikke slette gruppen. + +panel.deletegroup.header=Slett gruppe +panel.deletegroup.singleparentmessage=Er du sikker p\u00e5 at du vil slette gruppen ''{0}'' permanent? +panel.deletegroup.oneormultiparentmessage=Gruppen ''{0}'' har en eller flere overordnede: +panel.deletegroup.multiparentmessage=Gruppen ''{0}'' har flere overordnede: +panel.deletegroup.removemessage=Bare slett ''{0}'' fra ''{1}''. +panel.deletegroup.deletemessage=Slett ''{0}'' fra alle. +panel.deletegroup.deletewarning=Merk: Gruppen vil bli slettet permanent. +panel.deletegroup.searchdeletemessage=Er du sikker p\u00e5 at du vil slette gruppen ''{0}'' permanent? +panel.deletegroup.showparents=Vis overordnede +panel.deletegroup.hideparents=Skjul overordnede + +panel.adduser.header=Legg til bruker + +panel.addgroup.header=Legg til gruppe + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=Det er ikke mulig \u00e5 slette en gruppe fra roten i denne versjonen +message.noAddGroupFromRootSupport=Det er ikke mulig \u00e5 legge til en eksisterende gruppe til roten i denne versjonen diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_nl.properties new file mode 100755 index 0000000000..1f49bba27f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_nl.properties @@ -0,0 +1,82 @@ +label.title-browse=Groepen +label.title-create=Nieuwe groep +label.title-update=Groep bewerken + +label.enabled=Ingeschakeld +label.disabled=Uitgeschakeld +label.properties=Eigenschappen +label.requiredfield=Verplicht veld +label.shortname=Identificatie +label.shortname.warning=(De identificatie van een groep kan niet meer worden gewijzigd nadat deze is ingesteld) +label.displayname=Weergavenaam +label.showAll=Systeemgroepen weergeven + +label.nogroups=Geen groepen +label.noofgroups={0} groep(en) +label.nousers=Geen gebruikers +label.noofusers={0} gebruiker(s) +label.theroot=de hoofdmap + +button.newgroup=Nieuwe groep +button.newsubgroup=Nieuwe subgroep +button.addgroup=Groep toevoegen +button.adduser=Gebruiker toevoegen +button.updategroup=Groep bewerken +button.deletegroup=Groep verwijderen +button.removeuser=Gebruiker verwijderen +button.creategroup=Groep maken +button.usedefault=Standaard gebruiken + +message.usage=Zoek om groepen te vinden die u kent. Klik op 'Bladeren' om nieuwe groepen te maken of in hi\u00ebrarchische volgorde door groepen te bladeren. +message.empty=Zoek om groepen weer te geven. +message.error=Er is een fout opgetreden bij het zoeken - geen resultaten om weer te geven. +message.noresults=Geen resultaten. Met uw zoekactie retourneert u alleen groeps-id's en geen weergavenamen. +message.noresults.short=Geen resultaten. +message.results=Bij zoeken naar ''{0}'' zijn {1} resultaten gevonden. +message.maxresults=Meer dan {0} zoekresultaten gevonden. Geef alleen de eerste {0} weer. +message.getgroup-failure=Kan groepsgegevens niet ophalen voor groep ''{0}''. +message.confirm.add=Groep ''{0}'' bestaat al en is geplaatst onder ''{1}''. Wilt u deze groep ook onder ''{2}'' plaatsen? +message.confirm.delete=Weet u zeker dat u groep ''{0}'' wilt verwijderen? +message.confirm.removeuser.title=Gebruiker uit groep verwijderen +message.confirm.removeuser=Weet u zeker dat u ''{0}'' wilt verwijderen uit de groep? +message.create-success=Nieuwe groep is gemaakt. +message.create-failure=Kan de groep ''{0}'' niet maken. +message.delete-success=Groep ''{0}'' is verwijderd. +message.delete-failure=Kan groep ''{0}'' niet verwijderen. +message.removeuser-success=Gebruiker ''{0}'' is verwijderd. +message.removeuser-failure=Kan gebruiker ''{0}'' niet verwijderen. +message.adduser-success=Gebruiker ''{0}'' is toegevoegd. +message.adduser-failure=Kan gebruiker ''{0}'' niet toevoegen. +message.addgroup-success=Groep ''{0}'' is toegevoegd. +message.addgroup-failure=Kan groep ''{0}'' niet toevoegen. +message.update-success=Groep is bijgewerkt. +message.update-failure=Kan de gegevens voor groep ''{0}'' niet bijwerken. + +label.group=Groep +label.actions= +label.breadcrumb.root=Pad: +label.moregroups=... {0} meer. + +panel.delete.header=Bevestigen +panel.delete.msg=Druk op Verwijderen om deze groep uit het systeem te verwijderen. +panel.delete.fail=Kan de groep niet verwijderen. + +panel.deletegroup.header=Groep verwijderen +panel.deletegroup.singleparentmessage=Weet u zeker dat u groep ''{0}'' voorgoed wilt verwijderen? +panel.deletegroup.oneormultiparentmessage=De groep ''{0}'' heeft een of meerdere bovenliggende groepen: +panel.deletegroup.multiparentmessage=De groep ''{0}'' heeft meerdere bovenliggende groepen: +panel.deletegroup.removemessage=Verwijder ''{0}'' uit ''{1}''. +panel.deletegroup.deletemessage=Verwijder ''{0}'' uit alles. +panel.deletegroup.deletewarning=Opmerking: de groep wordt voorgoed verwijderd. +panel.deletegroup.searchdeletemessage=Weet u zeker dat u groep ''{0}'' voorgoed wilt verwijderen? +panel.deletegroup.showparents=Bovenliggende groepen weergeven +panel.deletegroup.hideparents=Bovenliggende groepen verbergen + +panel.adduser.header=Gebruiker toevoegen + +panel.addgroup.header=Groep toevoegen + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=Een groep kan niet worden verwijderd uit de hoofdmap in deze versie +message.noAddGroupFromRootSupport=Kan geen bestaande groep toevoegen aan de hoofdmap in deze versie diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_pt_BR.properties new file mode 100644 index 0000000000..0a327dc5dd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_pt_BR.properties @@ -0,0 +1,82 @@ +label.title-browse=Grupos +label.title-create=Novo grupo +label.title-update=Editar grupo + +label.enabled=Ativado +label.disabled=Desativado +label.properties=Propriedades +label.requiredfield=Campo obrigat\u00f3rio +label.shortname=Identificador +label.shortname.warning=(O identificador de um grupo n\u00e3o pode ser alterado depois de definido) +label.displayname=Nome de exibi\u00e7\u00e3o +label.showAll=Mostrar grupos do sistema + +label.nogroups=Sem grupos +label.noofgroups={0} grupo(s) +label.nousers=Sem usu\u00e1rios +label.noofusers={0} usu\u00e1rio(s) +label.theroot=a raiz + +button.newgroup=Novo grupo +button.newsubgroup=Novo subgrupo +button.addgroup=Adicionar grupo +button.adduser=Adicionar usu\u00e1rio +button.updategroup=Editar grupo +button.deletegroup=Excluir grupo +button.removeuser=Remover usu\u00e1rio +button.creategroup=Criar grupo +button.usedefault=Usar padr\u00e3o + +message.usage=Pesquisar grupos que voc\u00ea conhece. Clique em 'Navegar' para criar novos grupos ou navegar nos grupos hierarquicamente. +message.empty=Pesquisar para exibir grupos. +message.error=Ocorreu um erro durante a pesquisa. N\u00e3o h\u00e1 resultados a serem exibidos. +message.noresults=Nenhum resultado. Note que sua pesquisa s\u00f3 far\u00e1 a correspond\u00eancia com identificadores de grupo e n\u00e3o nomes de exibi\u00e7\u00e3o. +message.noresults.short=Nenhum resultado. +message.results=A pesquisa de ''{0}'' encontrou {1} resultados. +message.maxresults=Mais de {0} resultados de pesquisa encontrados. Mostrar apenas os {0} primeiros. +message.getgroup-failure=Falha ao recuperar os detalhes do grupo ''{0}''. +message.confirm.add=O grupo ''{0}'' j\u00e1 existe e est\u00e1 sob ''{1}''. Deseja coloc\u00e1-lo sob ''{2}'' tamb\u00e9m? +message.confirm.delete=Tem certeza de que deseja excluir o grupo ''{0}''? +message.confirm.removeuser.title=Remover usu\u00e1rio do grupo +message.confirm.removeuser=Tem certeza de que deseja remover ''{0}'' do grupo? +message.create-success=Novo grupo criado com sucesso. +message.create-failure=Falha ao criar o grupo ''{0}''. +message.delete-success=Grupo ''{0}'' exclu\u00eddo com sucesso. +message.delete-failure=Falha ao excluir o grupo ''{0}''. +message.removeuser-success=Usu\u00e1rio ''{0}'' removido com sucesso. +message.removeuser-failure=Falha ao remover o usu\u00e1rio ''{0}''. +message.adduser-success=Usu\u00e1rio ''{0}'' adicionado com sucesso. +message.adduser-failure=Falha ao adicionar o usu\u00e1rio ''{0}''. +message.addgroup-success=Grupo ''{0}'' adicionado com sucesso. +message.addgroup-failure=Falha ao adicionar o grupo ''{0}''. +message.update-success=Grupo atualizado com sucesso. +message.update-failure=Falha ao atualizar os detalhes do grupo ''{0}''. + +label.group=Grupo +label.actions= +label.breadcrumb.root=Caminho: +label.moregroups=... {0} mais. + +panel.delete.header=Confirmar +panel.delete.msg=Pressione Excluir para remover esse grupo do sistema. +panel.delete.fail=N\u00e3o \u00e9 poss\u00edvel excluir o grupo. + +panel.deletegroup.header=Excluir grupo +panel.deletegroup.singleparentmessage=Tem certeza de que deseja excluir o grupo ''{0}'' permanentemente? +panel.deletegroup.oneormultiparentmessage=O grupo ''{0}'' tem um ou mais n\u00edveis superiores: +panel.deletegroup.multiparentmessage=O grupo ''{0}'' tem m\u00faltiplos prim\u00e1rios: +panel.deletegroup.removemessage=Basta excluir ''{0}'' de ''{1}''. +panel.deletegroup.deletemessage=Excluir ''{0}'' de todos. +panel.deletegroup.deletewarning=Observa\u00e7\u00e3o: O grupo ser\u00e1 exclu\u00eddo permanentemente. +panel.deletegroup.searchdeletemessage=Tem certeza de que deseja excluir o grupo ''{0}'' permanentemente? +panel.deletegroup.showparents=Exibir prim\u00e1rios +panel.deletegroup.hideparents=Ocultar prim\u00e1rios + +panel.adduser.header=Adicionar usu\u00e1rio + +panel.addgroup.header=Adicionar grupo + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=N\u00e3o \u00e9 poss\u00edvel excluir um grupo da raiz nessa vers\u00e3o +message.noAddGroupFromRootSupport=N\u00e3o \u00e9 poss\u00edvel adicionar um grupo existente \u00e0 raiz nessa vers\u00e3o diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_ru.properties new file mode 100755 index 0000000000..c51da4f7f0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_ru.properties @@ -0,0 +1,82 @@ +label.title-browse=\u0413\u0440\u0443\u043f\u043f\u044b +label.title-create=\u041d\u043e\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 +label.title-update=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 + +label.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +label.disabled=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e +label.properties=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 +label.requiredfield=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 +label.shortname=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +label.shortname.warning=(\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f) +label.displayname=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f +label.showAll=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b + +label.nogroups=\u041d\u0435\u0442 \u0433\u0440\u0443\u043f\u043f +label.noofgroups=\u0413\u0440\u0443\u043f\u043f: {0} +label.nousers=\u041d\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +label.noofusers=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439: {0} +label.theroot=\u043a\u043e\u0440\u0435\u043d\u044c + +button.newgroup=\u041d\u043e\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 +button.newsubgroup=\u041d\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u0430 +button.addgroup=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 +button.adduser=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +button.updategroup=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 +button.deletegroup=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 +button.removeuser=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +button.creategroup=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 +button.usedefault=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e + +message.usage=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043f\u043e\u0438\u0441\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0432\u0430\u043c \u0433\u0440\u0443\u043f\u043f\u044b. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 '\u041e\u0431\u0437\u043e\u0440' \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0433\u0440\u0443\u043f\u043f. +message.empty=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043f\u043e\u0438\u0441\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b. +message.error=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u2014 \u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. +message.noresults=\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c \u0433\u0440\u0443\u043f\u043f, \u0430 \u043d\u0435 \u043f\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u043c \u0438\u043c\u0435\u043d\u0430\u043c. +message.noresults.short=\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. +message.results=\u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 ''{0}'' \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432: {1}. +message.maxresults=\u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0431\u043e\u043b\u0435\u0435 {0} \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0411\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 {0}. +message.getgroup-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0433\u0440\u0443\u043f\u043f\u0435 "{0}". +message.confirm.add=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u043e\u0439 ''{1}''. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u043e\u0439 ''{2}''? +message.confirm.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''? +message.confirm.removeuser.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b +message.confirm.removeuser=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0438\u0437 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b? +message.create-success=\u041d\u043e\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430. +message.create-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''. +message.delete-success=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u0443\u0434\u0430\u043b\u0435\u043d\u0430. +message.delete-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''. +message.removeuser-success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c ''{0}'' \u0443\u0434\u0430\u043b\u0435\u043d. +message.removeuser-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ''{0}''. +message.adduser-success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c ''{0}'' \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d. +message.adduser-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ''{0}''. +message.addgroup-success=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430. +message.addgroup-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''. +message.update-success=\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430. +message.update-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0433\u0440\u0443\u043f\u043f\u0435 ''{0}''. + +label.group=\u0413\u0440\u0443\u043f\u043f\u0430 +label.actions= +label.breadcrumb.root=\u041f\u0443\u0442\u044c: +label.moregroups=... {0} \u0431\u043e\u043b\u044c\u0448\u0435. + +panel.delete.header=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c +panel.delete.msg=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0423\u0434\u0430\u043b\u0438\u0442\u044c', \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. +panel.delete.fail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443. + +panel.deletegroup.header=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 +panel.deletegroup.singleparentmessage=\u0411\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''? +panel.deletegroup.oneormultiparentmessage=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0433\u0440\u0443\u043f\u043f: +panel.deletegroup.multiparentmessage=\u0413\u0440\u0443\u043f\u043f\u0430 ''{0}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u043e\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0433\u0440\u0443\u043f\u043f: +panel.deletegroup.removemessage=\u041f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u0438\u0437 ''{1}''. +panel.deletegroup.deletemessage=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ''{0}'' \u043e\u0442\u043e\u0432\u0441\u044e\u0434\u0443. +panel.deletegroup.deletewarning=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0414\u0430\u043d\u043d\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 \u0431\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e. +panel.deletegroup.searchdeletemessage=\u0411\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 ''{0}''? +panel.deletegroup.showparents=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b +panel.deletegroup.hideparents=\u0421\u043a\u0440\u044b\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b + +panel.adduser.header=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f + +panel.addgroup.header=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=\u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 \u043a\u043e\u0440\u043d\u044f +message.noAddGroupFromRootSupport=\u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_zh_CN.properties new file mode 100755 index 0000000000..ce3e72661d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/groups.get_zh_CN.properties @@ -0,0 +1,82 @@ +label.title-browse=\u7ec4 +label.title-create=\u65b0\u5efa\u7ec4 +label.title-update=\u7f16\u8f91\u7ec4 + +label.enabled=\u5df2\u542f\u7528 +label.disabled=\u5df2\u7981\u7528 +label.properties=\u5c5e\u6027 +label.requiredfield=\u5fc5\u586b\u5b57\u6bb5 +label.shortname=\u6807\u8bc6\u7b26 +label.shortname.warning=\uff08\u7ec4\u7684\u6807\u8bc6\u7b26\u4e00\u65e6\u8bbe\u7f6e\uff0c\u5c31\u4e0d\u80fd\u66f4\u6539\uff09 +label.displayname=\u663e\u793a\u540d\u79f0 +label.showAll=\u663e\u793a\u7cfb\u7edf\u7ec4 + +label.nogroups=\u65e0\u7ec4 +label.noofgroups={0} \u4e2a\u7ec4 +label.nousers=\u65e0\u7528\u6237 +label.noofusers={0} \u4e2a\u7528\u6237 +label.theroot=\u6839 + +button.newgroup=\u65b0\u5efa\u7ec4 +button.newsubgroup=\u65b0\u5efa\u5b50\u7ec4 +button.addgroup=\u6dfb\u52a0\u7ec4 +button.adduser=\u6dfb\u52a0\u7528\u6237 +button.updategroup=\u7f16\u8f91\u7ec4 +button.deletegroup=\u5220\u9664\u7ec4 +button.removeuser=\u79fb\u9664\u7528\u6237 +button.creategroup=\u521b\u5efa\u7ec4 +button.usedefault=\u4f7f\u7528\u9ed8\u8ba4 + +message.usage=\u641c\u7d22\u4ee5\u67e5\u627e\u60a8\u77e5\u9053\u7684\u7ec4\u3002 \u5355\u51fb''\u6d4f\u89c8''\u521b\u5efa\u65b0\u7ec4\u6216\u6309\u5c42\u6b21\u7ed3\u6784\u6d4f\u89c8\u7ec4\u3002 +message.empty=\u641c\u7d22\u4ee5\u67e5\u770b\u7ec4\u3002 +message.error=\u641c\u7d22\u671f\u95f4\u51fa\u9519 - \u65e0\u7ed3\u679c\u53ef\u663e\u793a\u3002 +message.noresults=\u65e0\u7ed3\u679c\u3002 \u8bf7\u6ce8\u610f\uff0c\u60a8\u7684\u641c\u7d22\u5c06\u4ec5\u5339\u914d\u7ec4\u6807\u8bc6\u7b26\uff0c\u800c\u975e\u663e\u793a\u540d\u79f0\u3002 +message.noresults.short=\u65e0\u7ed3\u679c\u3002 +message.results=\u641c\u7d22 ''{0}'' \u627e\u5230\u4e86 {1} \u4e2a\u7ed3\u679c\u3002 +message.maxresults=\u627e\u5230\u7684\u641c\u7d22\u7ed3\u679c\u591a\u4e8e {0} \u4e2a\u3002 \u4ec5\u663e\u793a\u524d {0} \u4e2a\u3002 +message.getgroup-failure=\u68c0\u7d22\u7ec4 ''{0}'' \u7684\u8be6\u7ec6\u4fe1\u606f\u5931\u8d25\u3002 +message.confirm.add=\u7ec4 ''{0}'' \u5df2\u5b58\u5728\uff0c\u4f4d\u4e8e ''{1}'' \u4e0b\u3002 \u662f\u5426\u4e5f\u8981\u5c06\u5176\u653e\u5230 ''{2}'' \u4e0b\uff1f +message.confirm.delete=\u662f\u5426\u786e\u5b9a\u8981\u5220\u9664\u7ec4 ''{0}''\uff1f +message.confirm.removeuser.title=\u4ece\u7ec4\u4e2d\u79fb\u9664\u7528\u6237 +message.confirm.removeuser=\u662f\u5426\u786e\u5b9a\u8981\u4ece\u7ec4\u4e2d\u79fb\u9664 ''{0}''\uff1f +message.create-success=\u6210\u529f\u521b\u5efa\u4e86\u65b0\u7ec4\u3002 +message.create-failure=\u521b\u5efa\u7ec4 ''{0}'' \u5931\u8d25\u3002 +message.delete-success=\u6210\u529f\u5220\u9664\u4e86\u7ec4 ''{0}''\u3002 +message.delete-failure=\u5220\u9664\u7ec4 ''{0}'' \u5931\u8d25\u3002 +message.removeuser-success=\u5df2\u6210\u529f\u79fb\u9664\u7528\u6237 ''{0}''\u3002 +message.removeuser-failure=\u79fb\u9664\u7528\u6237 ''{0}'' \u5931\u8d25\u3002 +message.adduser-success=\u5df2\u6210\u529f\u6dfb\u52a0\u7528\u6237 ''{0}''\u3002 +message.adduser-failure=\u6dfb\u52a0\u7528\u6237 ''{0}'' \u5931\u8d25\u3002 +message.addgroup-success=\u5df2\u6210\u529f\u6dfb\u52a0\u7ec4 ''{0}''\u3002 +message.addgroup-failure=\u6dfb\u52a0\u7ec4 ''{0}'' \u5931\u8d25\u3002 +message.update-success=\u6210\u529f\u66f4\u65b0\u4e86\u7ec4\u3002 +message.update-failure=\u66f4\u65b0\u7ec4 ''{0}'' \u7684\u8be6\u7ec6\u4fe1\u606f\u5931\u8d25\u3002 + +label.group=\u7ec4 +label.actions= +label.breadcrumb.root=\u8def\u5f84\uff1a +label.moregroups=... \u8fd8\u6709 {0} \u4e2a. + +panel.delete.header=\u786e\u8ba4 +panel.delete.msg=\u6309 Delete \u952e\u4ece\u7cfb\u7edf\u4e2d\u79fb\u9664\u6b64\u7ec4\u3002 +panel.delete.fail=\u65e0\u6cd5\u5220\u9664\u6b64\u7ec4\u3002 + +panel.deletegroup.header=\u5220\u9664\u7ec4 +panel.deletegroup.singleparentmessage=\u662f\u5426\u786e\u5b9a\u8981\u6c38\u4e45\u6027\u5220\u9664\u7ec4 ''{0}''\uff1f +panel.deletegroup.oneormultiparentmessage=''{0}'' \u7ec4\u542b\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u7236\u9879\uff1a +panel.deletegroup.multiparentmessage=\u7ec4 ''{0}'' \u6709\u591a\u4e2a\u7236\u9879\uff1a +panel.deletegroup.removemessage=\u4ec5\u5220\u9664 ''{1}'' \u4e2d\u7684 ''{0}''\u3002 +panel.deletegroup.deletemessage=\u5220\u9664\u6240\u6709\u7236\u9879\u4e2d\u7684 ''{0}''\u3002 +panel.deletegroup.deletewarning=\u6ce8\uff1a\u5c06\u6c38\u4e45\u6027\u5220\u9664\u6b64\u7ec4\u3002 +panel.deletegroup.searchdeletemessage=\u662f\u5426\u786e\u5b9a\u8981\u6c38\u4e45\u6027\u5220\u9664\u7ec4 ''{0}''\uff1f +panel.deletegroup.showparents=\u67e5\u770b\u7236\u9879 +panel.deletegroup.hideparents=\u9690\u85cf\u7236\u9879 + +panel.adduser.header=\u6dfb\u52a0\u7528\u6237 + +panel.addgroup.header=\u6dfb\u52a0\u7ec4 + + +# todo remove this when webscript api supports it +message.noRemoveGroupFromRootSupport=\u6b64\u7248\u672c\u4e0d\u80fd\u5220\u9664\u6839\u4e2d\u7684\u7ec4 +message.noAddGroupFromRootSupport=\u6b64\u7248\u672c\u4e0d\u80fd\u5c06\u73b0\u6709\u7ec4\u6dfb\u52a0\u5230\u6839\u4e2d diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.desc.xml new file mode 100644 index 0000000000..d0e56b43b9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.desc.xml @@ -0,0 +1,6 @@ + + Admin Console Users Tool + Administration Console - User Management Tool + /components/console/users + admin-console + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.html.ftl new file mode 100644 index 0000000000..1981ec39e6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.html.ftl @@ -0,0 +1,515 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/console/users.css" group="console"/> + <@link href="${url.context}/res/components/people-finder/group-finder.css" group="console"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/console/consoletool.js" group="console"/> + <@script src="${url.context}/res/components/console/users.js" group="console"/> + <@script src="${url.context}/res/components/people-finder/group-finder.js" group="console"/> + + +<@markup id="widgets"> + <@createWidgets group="console"/> + + +<@markup id="html"> + <@uniqueIdDiv> + + + + <#assign el=args.htmlid?html> +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.js new file mode 100644 index 0000000000..8dfffcc28c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.js @@ -0,0 +1,39 @@ +function main() { + + var search = null, + searchMain = config.scoped["Search"]; + if (searchMain != null) + { + search = searchMain["search"]; + } + var users = null, + usersMain = config.scoped["Users"]; + if (usersMain != null) + { + users = usersMain["users"]; + } + + var minSearchTermLength = (args.minSearchTermLength != null) ? args.minSearchTermLength : search.getChildValue("min-search-term-length"), + maxSearchResults = (args.maxSearchResults != null) ? args.maxSearchResults : search.getChildValue("max-users-search-results"), + minUsernameLength = users.getChildValue('username-min-length'), + minPasswordLength = users.getChildValue('password-min-length'), + showAuthorizationStatus = users.getChildValue('show-authorization-status'); + + // Widget instantiation metadata... + var widget = { + id : "ConsoleUsers", + name : "Alfresco.ConsoleUsers", + options : { + minSearchTermLength: parseInt(minSearchTermLength), + maxSearchResults: parseInt(maxSearchResults), + minUsernameLength: parseInt(minUsernameLength), + minPasswordLength: parseInt(minPasswordLength), + showAuthorizationStatus: showAuthorizationStatus == 'true' ? true : false, + docsEdition: context.properties["docsEdition"].getValue() + } + }; + + model.aimsEnabled = typeof aimsEnabled === "boolean" ? aimsEnabled : false; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.properties new file mode 100644 index 0000000000..810a18ccb8 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get.properties @@ -0,0 +1,85 @@ +label.title-search=User Search +label.title-view=User Profile +label.title-create=New User +label.title-update=Edit User +label.title-csvresults=Upload Results + +button.newuser=New User +button.uploaduser=Upload User CSV File +button.edituser=Edit User +button.deleteuser=Delete User +button.createuser=Create User +button.createanother=Create and Start Another +button.usedefault=Use Default + +message.empty=Search users +message.error=We hit a problem during the search - no results found. +message.noresults=No results found. +message.results=Search for ''{0}'' - {1} results found. +message.maxresults=Over {0} results found. Show first {0} only. +message.getuser-failure=We couldn''t retrieve details for user {0}. +message.create-success=Successfully created new user. +message.create-failure=We couldn''t create user {0}. +message.create-user-exists=We couldn't create the user because the username already exists. +message.password-failure=We couldn't set the password for the new user. +message.password-validate-failure=Password fields don't match. +message.password-validate-length=Password must be at least {0} characters. +message.password-validate-oldpw=The old password is needed to update current user. +message.delete-success=Successfully deleted the user. +message.update-success=Successfully updated the user. +message.update-failure=We couldn''t update the details for user {0}. +message.clear-photo-failure=We couldn't reset the photo for the user. +message.authenticationdetails-failure=We couldn't retrieve authentication details. + +message.csvupload.success=Successfully uploaded {0} users. +message.csvupload.partialSuccess=Successfully uploaded {0} users, couldn''t upload {1} users. +message.csvupload.failure=No users were uploaded. +message.csvupload.error=We couldn't upload the file. +message.csvupload.invalid=The supplied CSV file was invalid. +message.csvupload.error.details=We couldn't process the uploaded file: + +label.quota=Quota +label.usage=Usage +label.moreuserinfo=More about this user +label.aboutuser=About User +label.accountstatus=Account Status +label.enabled=Enabled +label.disabled=Disabled +label.info=Info +label.requiredfield=Required Field +label.oldpassword=Old Password +label.newpassword=New Password +label.verifypassword=Verify Password +label.disableaccount=Disable Account +label.leaveblank=Leave empty if you don't want to change the password +label.removegroup=Remove Group +label.uploadStatus=Status + +label.authorization=Authorization State +label.authorization.status.AUTHORIZED=Authorized +label.authorization.status.DEAUTHORIZED=Deauthorized +label.authorization.status.NEVER_AUTHORIZED=Never Authorized +label.authorization.isdeleted=Deleted? +label.authorization.deleted=Deleted +label.authorization.actions=Action + +deauthorize.dialog.deauthorize.confirm.ok=Deauthorize +deauthorize.dialog.deauthorize.confirm.cancel=Cancel +deauthorize.dialog.cannot.deauthorize.admin=You can't deauthorize administrators +deauthorize.dialog.header=Are you sure you want to deauthorize ''{0}''? +deauthorize.dialog.message=
  You can't reauthorize a deauthorized user. +deauthorize.dialog.checkbox.message=I understand that if I deauthorize this user I can't reauthorize them.

+message.deauthorize.success=User was successfully deauthorized. +message.deauthorize.failure=We couldn''t deauthorize the user. \n ''{0}'' + + +reauthorize.dialog.title=Reauthorize user ''{0}'' +reauthorize.dialog.button.ok=Reauthorize +reauthorize.dialog.message=Provide the following authorization code to the Alfresco Support team "{0}". They will give you a file to upload. +reauthorize.dialog.fail=Reauthorization failed (the authorization code wasn't accepted or there was a server issue) +reauthorize.dialog.success=Reauthorization successful + +panel.delete.header=Delete User +panel.delete.msg=Click Delete User to remove this user. +panel.delete.note=Deleting a user removes their permissions from the repository. If you create a user with the same userid as a previously deleted user, the new user gets access to the original user's files but not their permissions as they are removed upon user deletion. +panel.delete.fail=We couldn't delete the user. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_de.properties new file mode 100755 index 0000000000..9745a9e57f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_de.properties @@ -0,0 +1,85 @@ +label.title-search=Benutzersuche +label.title-view=Benutzerprofil +label.title-create=Neuer Benutzer +label.title-update=Benutzer bearbeiten +label.title-csvresults=Ergebnisse hochladen + +button.newuser=Neuer Benutzer +button.uploaduser=Benutzer-CSV-Datei hochladen +button.edituser=Benutzer bearbeiten +button.deleteuser=Benutzer l\u00f6schen +button.createuser=Benutzer anlegen +button.createanother=Anderes erstellen und starten +button.usedefault=Standard verwenden + +message.empty=Benutzersuche +message.error=Bei der Suche ist ein Problem aufgetreten - keine Ergebnisse gefunden. +message.noresults=Keine Ergebnisse gefunden. +message.results=Suche nach ''{0}'' \u2013 {1} Ergebnisse. +message.maxresults=Mehr als {0} Ergebnisse gefunden. Nur die ersten {0} anzeigen. +message.getuser-failure=Angaben f\u00fcr Benutzer {0} konnten nicht abgerufen werden. +message.create-success=Neuen Benutzer erfolgreich erstellt. +message.create-failure=Benutzer {0} konnte nicht erstellt werden. +message.create-user-exists=Wir konnten den Benutzer nicht erstellen, weil der Benutzername bereits vorhanden ist. +message.password-failure=Wir konnten das Passwort f\u00fcr den neuen Benutzer nicht anlegen. +message.password-validate-failure=Die Eingaben in den Passwortfeldern stimmen nicht \u00fcberein. +message.password-validate-length=Das Passwort muss aus mindestens {0} Zeichen bestehen. +message.password-validate-oldpw=Das alte Passwort wird ben\u00f6tigt, um den derzeitigen Benutzer zu aktualisieren. +message.delete-success=Benutzer erfolgreich gel\u00f6scht. +message.update-success=Benutzer erfolgreich aktualisiert. +message.update-failure=Wir konnten die Angaben f\u00fcr Benutzer {0} nicht aktualisieren. +message.clear-photo-failure=Wir konnten das Foto f\u00fcr den Benutzer nicht zur\u00fccksetzen. +message.authenticationdetails-failure=Wir konnten die Authentifizierungsangaben nicht abrufen. + +message.csvupload.success={0} Benutzer erfolgreich hochgeladen. +message.csvupload.partialSuccess={0} Benutzer erfolgreich hochgeladen, {1} Benutzer konnten nicht hochgeladen werden. +message.csvupload.failure=Es wurden keine Benutzer hochgeladen. +message.csvupload.error=Wir konnten die Datei nicht hochladen. +message.csvupload.invalid=Die angegebene CSV-Datei war ung\u00fcltig. +message.csvupload.error.details=Wir konnten die hochgeladene Datei nicht verarbeiten: + +label.quota=Kontingent +label.usage=Gebrauch +label.moreuserinfo=Mehr \u00fcber diesen Benutzer +label.aboutuser=\u00dcber Benutzer +label.accountstatus=Kontostatus +label.enabled=Aktiviert +label.disabled=Deaktiviert +label.info=Info +label.requiredfield=Pflichtfeld +label.oldpassword=Altes Passwort +label.newpassword=Neues Passwort +label.verifypassword=Passwort pr\u00fcfen +label.disableaccount=Konto deaktivieren +label.leaveblank=Leer lassen, wenn Sie das Passwort nicht \u00e4ndern m\u00f6chten +label.removegroup=Gruppe entfernen +label.uploadStatus=Status + +label.authorization=Autorisierungsstatus +label.authorization.status.AUTHORIZED=Autorisiert +label.authorization.status.DEAUTHORIZED=Nicht mehr autorisiert +label.authorization.status.NEVER_AUTHORIZED=Niemals autorisiert +label.authorization.isdeleted=Gel\u00f6scht? +label.authorization.deleted=Gel\u00f6scht +label.authorization.actions=Aktion + +deauthorize.dialog.deauthorize.confirm.ok=Autorisierung entziehen +deauthorize.dialog.deauthorize.confirm.cancel=Abbrechen +deauthorize.dialog.cannot.deauthorize.admin=Administratoren kann die Autorisierung nicht entzogen werden +deauthorize.dialog.header=M\u00f6chten Sie ''{0}'' die Autorisierung wirklich entziehen? +deauthorize.dialog.message=
   Einen Benutzer, dem Sie die Autorisierung entzogen haben, k\u00f6nnen Sie nicht erneut autorisieren. +deauthorize.dialog.checkbox.message=Ich bin mir bewusst, dass ich diesen Benutzer nicht erneut autorisieren kann, nachdem ich ihm die Autorisierung entzogen habe.

+message.deauthorize.success=Benutzer wurde Autorisierung erfolgreich entzogen. +message.deauthorize.failure=Wir konnten den Benutzer nicht l\u00f6schen. \n ''{0}'' + + +reauthorize.dialog.title=Benutzer ''{0}'' erneut autorisieren +reauthorize.dialog.button.ok=Erneut autorisieren +reauthorize.dialog.message=Geben Sie dem Alfresco-Supportteam den Autorisierungscode ''{0}''. Sie erhalten dann eine Datei zum Hochladen. +reauthorize.dialog.fail=Erneute Autorisierung fehlgeschlagen (der Autorisierungscode wurde nicht angenommen oder es lag ein Serverproblem vor) +reauthorize.dialog.success=Erneute Autorisierung erfolgreich + +panel.delete.header=Benutzer l\u00f6schen +panel.delete.msg=Klicken Sie auf 'Benutzer l\u00f6schen', um diesen Benutzer zu entfernen. +panel.delete.note=Beim L\u00f6schen eines Benutzers werden dessen Berechtigungen aus dem Repository entfernt. Wenn ein Benutzer mit der selben Benutzer ID wie der des vorher gel\u00f6schten Benutzers angelegt wird, erh\u00e4lt der Benutzer Zugriff auf die Dateien des urspr\u00fcnglichen Benutzers, aber nicht dessen Berechtigungen, da diese beim L\u00f6schen des Benutzers entfernt wurden. +panel.delete.fail=Wir konnten den Benutzer nicht l\u00f6schen. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_es.properties new file mode 100755 index 0000000000..76ddfccb1b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_es.properties @@ -0,0 +1,85 @@ +label.title-search=B\u00fasqueda de usuario +label.title-view=Perfil de usuario +label.title-create=Nuevo usuario +label.title-update=Editar usuario +label.title-csvresults=Cargar resultados + +button.newuser=Nuevo usuario +button.uploaduser=Cargar fichero CSV de usuarios +button.edituser=Editar usuario +button.deleteuser=Eliminar usuario +button.createuser=Crear usuario +button.createanother=Crear e iniciar otro +button.usedefault=Utilizar predeterminado + +message.empty=Buscar usuarios +message.error=Se ha producido un problema durante la b\u00fasqueda; ning\u00fan resultado encontrado. +message.noresults=Ning\u00fan resultado encontrado. +message.results=La b\u00fasqueda de ''{0}'' devolvi\u00f3 {1} resultado(s). +message.maxresults=M\u00e1s de {0} resultados encontrados. Se muestran solo los primeros {0}. +message.getuser-failure=No se ha podido recuperar la informaci\u00f3n del usuario {0}. +message.create-success=Se creo el usuario con \u00e9xito. +message.create-failure=No se ha podido crear el usuario {0}. +message.create-user-exists=No se ha podido crear el usuario porque el nombre de usuario ya existe. +message.password-failure=No se ha podido establecer la contrase\u00f1a para el nuevo usuario. +message.password-validate-failure=Los campos de contrase\u00f1a no coinciden. +message.password-validate-length=La contrase\u00f1a debe tener al menos {0} caracteres. +message.password-validate-oldpw=Se necesita la contrase\u00f1a anterior para actualizar al usuario actual. +message.delete-success=Usuario eliminado correctamente. +message.update-success=Usuario actualizado correctamente. +message.update-failure=No se han podido actualizar los datos del usuario {0}. +message.clear-photo-failure=No se ha podido restablecer la foto del usuario. +message.authenticationdetails-failure=No se han podido recuperar los datos de autenticaci\u00f3n. + +message.csvupload.success={0} usuarios cargados correctamente. +message.csvupload.partialSuccess={0} usuarios cargados correctamente; no se han podido cargar {1} usuarios. +message.csvupload.failure=No se han cargado usuarios. +message.csvupload.error=No se ha podido cargar el fichero. +message.csvupload.invalid=El fichero CSV suministrado no era v\u00e1lido. +message.csvupload.error.details=No se ha podido procesar el fichero cargado: + +label.quota=Cuota +label.usage=Uso +label.moreuserinfo=M\u00e1s informaci\u00f3n sobre este usuario +label.aboutuser=Acerca del usuario +label.accountstatus=Estado de la cuenta +label.enabled=Activo +label.disabled=Desactivado +label.info=Informaci\u00f3n +label.requiredfield=Campo requerido +label.oldpassword=Contrase\u00f1a anterior +label.newpassword=Nueva contrase\u00f1a +label.verifypassword=Verificar contrase\u00f1a +label.disableaccount=Desactivar cuenta +label.leaveblank=D\u00e9jelo en blanco si no quiere cambiar la contrase\u00f1a +label.removegroup=Eliminar grupo +label.uploadStatus=Estado + +label.authorization=Estado de autorizaci\u00f3n +label.authorization.status.AUTHORIZED=Autorizado +label.authorization.status.DEAUTHORIZED=Desautorizado +label.authorization.status.NEVER_AUTHORIZED=Nunca autorizado +label.authorization.isdeleted=\u00bfEliminar? +label.authorization.deleted=Eliminado +label.authorization.actions=Acci\u00f3n + +deauthorize.dialog.deauthorize.confirm.ok=Desautorizar +deauthorize.dialog.deauthorize.confirm.cancel=Cancelar +deauthorize.dialog.cannot.deauthorize.admin=No puede desautorizar administradores +deauthorize.dialog.header=\u00bfEst\u00e1 seguro de que desea desautorizar ''{0}''? +deauthorize.dialog.message=
  No puede volver a autorizar a un usuario desautorizado. +deauthorize.dialog.checkbox.message=Comprendo que si desautorizo este usuario no puedo volver a autorizarlo.

+message.deauthorize.success=El usuario ha sido desautorizado correctamente. +message.deauthorize.failure=No se ha podido desautorizar el usuario. \n ''{0}'' + + +reauthorize.dialog.title=Volver a autorizar el usuario ''{0}'' +reauthorize.dialog.button.ok=Volver a autorizar +reauthorize.dialog.message=Env\u00ede el c\u00f3digo de autorizaci\u00f3n siguiente al equipo de soporte de Alfresco "{0}". Le enviar\u00e1n un fichero para cargar. +reauthorize.dialog.fail=Error en la nueva autorizaci\u00f3n (el c\u00f3digo de autorizaci\u00f3n no se ha aceptado o se ha producido un problema con el servidor) +reauthorize.dialog.success=Nueva autorizaci\u00f3n correcta + +panel.delete.header=Eliminar usuario +panel.delete.msg=Haga clic en Eliminar usuario para eliminar a este usuario. +panel.delete.note=Al eliminar un usuario, se eliminan sus permisos del repositorio. Si vuelve a crear un usuario con el mismo ID de un usuario eliminado, el nuevo usuario tendr\u00e1 acceso a los ficheros del usuario original pero no a sus permisos, ya que \u00e9stos se retiran cuando se elimina a un usuario. +panel.delete.fail=No se ha podido eliminar el usuario. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_fr.properties new file mode 100755 index 0000000000..761a689274 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_fr.properties @@ -0,0 +1,85 @@ +label.title-search=Recherche d'utilisateur +label.title-view=Profil de l'utilisateur +label.title-create=Nouvel utilisateur +label.title-update=Modifier un utilisateur +label.title-csvresults=Importer les r\u00e9sultats + +button.newuser=Nouvel utilisateur +button.uploaduser=Importer un fichier CSV d'utilisateurs +button.edituser=Modifier un utilisateur +button.deleteuser=Supprimer un utilisateur +button.createuser=Cr\u00e9er un utilisateur +button.createanother=Cr\u00e9er et d\u00e9marrer un autre +button.usedefault=Utiliser les valeurs par d\u00e9faut + +message.empty=Rechercher des utilisateurs +message.error=Un probl\u00e8me est survenu pendant la recherche. Aucun r\u00e9sultat trouv\u00e9. +message.noresults=Aucun r\u00e9sultat trouv\u00e9. +message.results=La recherche de ''{0}'' a retourn\u00e9 {1} r\u00e9sultat(s). +message.maxresults=Plus de {0} r\u00e9sultats trouv\u00e9s. Montrer les {0} premiers seulement. +message.getuser-failure=Impossible de r\u00e9cup\u00e9rer les d\u00e9tails pour l''utilisateur {0}. +message.create-success=Succ\u00e8s de la cr\u00e9ation du nouvel utilisateur. +message.create-failure=Impossible de cr\u00e9er l''utilisateur {0}. +message.create-user-exists=Impossible de cr\u00e9er l'utilisateur car le nom d'utilisateur existe d\u00e9j\u00e0. +message.password-failure=Impossible de configurer le mot de passe pour le nouvel utilisateur. +message.password-validate-failure=Les mots de passe saisis ne correspondent pas. +message.password-validate-length=Le mot de passe doit comporter au moins {0} caract\u00e8res. +message.password-validate-oldpw=L'ancien mot de passe est requis pour mettre \u00e0 jour l'utilisateur actuel. +message.delete-success=Succ\u00e8s de la suppression de l'utilisateur. +message.update-success=Succ\u00e8s de la mise \u00e0 jour de l'utilisateur. +message.update-failure=Impossible de mettre \u00e0 jour les d\u00e9tails pour l''utilisateur {0}. +message.clear-photo-failure=Impossible de r\u00e9initialiser la photo pour l'utilisateur. +message.authenticationdetails-failure=Impossible de r\u00e9cup\u00e9rer les informations d'authentification. + +message.csvupload.success={0} utilisateurs import\u00e9s avec succ\u00e8s. +message.csvupload.partialSuccess={0} utilisateurs import\u00e9s avec succ\u00e8s\u00a0; impossible d''importer {1} utilisateurs. +message.csvupload.failure=Aucun utilisateur n'a \u00e9t\u00e9 import\u00e9. +message.csvupload.error=Impossible d'importer le fichier. +message.csvupload.invalid=Le fichier CSV fourni n'\u00e9tait pas valide. +message.csvupload.error.details=Impossible de traiter le fichier import\u00e9 : + +label.quota=Quota +label.usage=Utilisation +label.moreuserinfo=En savoir plus sur cet utilisateur +label.aboutuser=\u00c0 propos de l'utilisateur +label.accountstatus=Statut du compte +label.enabled=Activ\u00e9 +label.disabled=D\u00e9sactiv\u00e9 +label.info=Informations +label.requiredfield=Champs Obligatoire +label.oldpassword=Ancien mot de passe +label.newpassword=Nouveau mot de passe +label.verifypassword=V\u00e9rifier le mot de passe +label.disableaccount=D\u00e9sactiver le compte +label.leaveblank=Laisser vide si vous ne voulez pas changer le mot de passe +label.removegroup=Supprimer le groupe +label.uploadStatus=Statut + +label.authorization=Statut d'autorisation +label.authorization.status.AUTHORIZED=Autoris\u00e9(e) +label.authorization.status.DEAUTHORIZED=Autorisation annul\u00e9e +label.authorization.status.NEVER_AUTHORIZED=Jamais autoris\u00e9(e) +label.authorization.isdeleted=Supprim\u00e9(e) ? +label.authorization.deleted=Supprim\u00e9(e) +label.authorization.actions=Action + +deauthorize.dialog.deauthorize.confirm.ok=Annuler l'autorisation +deauthorize.dialog.deauthorize.confirm.cancel=Annuler +deauthorize.dialog.cannot.deauthorize.admin=Impossible d'annuler l'autorisation des administrateurs +deauthorize.dialog.header=Etes-vous s\u00fbr de vouloir annuler l''autorisation de ''{0}'' ? +deauthorize.dialog.message=
  Impossible d''autoriser \u00e0 nouveau un utilisateur dont l''autorisation a \u00e9t\u00e9 annul\u00e9e. +deauthorize.dialog.checkbox.message=Je comprends qu'en annulant l'autorisation de cet utilisateur, je ne pourrai pas l'autoriser \u00e0 nouveau.

+message.deauthorize.success=L'autorisation de cet utilisateur a bien \u00e9t\u00e9 annul\u00e9e. +message.deauthorize.failure=Impossible d''annuler l''autorisation de cet utilisateur. \n ''{0}'' + + +reauthorize.dialog.title=Autoriser \u00e0 nouveau l''utilisateur ''{0}'' +reauthorize.dialog.button.ok=Autoriser \u00e0 nouveau +reauthorize.dialog.message=Veuillez fournir le code d''autorisation suivant \u00e0 l''\u00e9quipe d''assistance Alfresco "{0}". Elle vous indiquera un fichier \u00e0 importer. +reauthorize.dialog.fail=Impossible d'autoriser \u00e0 nouveau (le code d'autorisation n'a pas \u00e9t\u00e9 accept\u00e9 ou un probl\u00e8me est survenu sur le serveur) +reauthorize.dialog.success=L'utilisateur a bien \u00e9t\u00e9 autoris\u00e9 \u00e0 nouveau + +panel.delete.header=Supprimer un utilisateur +panel.delete.msg=Cliquez sur Supprimer un utilisateur pour supprimer cet utilisateur. +panel.delete.note=Lorsque vous supprimez un utilisateur, ses droits d'acc\u00e8s \u00e0 l'entrep\u00f4t sont r\u00e9voqu\u00e9s. Si vous cr\u00e9ez un utilisateur avec l'identifiant d'un utilisateur que vous avez supprim\u00e9 pr\u00e9c\u00e9demment, le nouvel utilisateur a acc\u00e8s aux fichiers de l'utilisateur d'origine mais n'h\u00e9rite pas de ses droits d'acc\u00e8s puisqu'ils ont \u00e9t\u00e9 annul\u00e9s lorsqu'il a \u00e9t\u00e9 supprim\u00e9. +panel.delete.fail=Impossible de supprimer l'utilisateur. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_it.properties new file mode 100755 index 0000000000..50c6f6c08b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_it.properties @@ -0,0 +1,85 @@ +label.title-search=Ricerca utenti +label.title-view=Profilo utente +label.title-create=Nuovo utente +label.title-update=Modifica utente +label.title-csvresults=Carica risultati + +button.newuser=Nuovo utente +button.uploaduser=Carica file CSV utente +button.edituser=Modifica utente +button.deleteuser=Elimina utente +button.createuser=Crea utente +button.createanother=Crea e avvia un altro +button.usedefault=Utilizza predefinito + +message.empty=Ricerca utenti +message.error=Si \u00e8 verificato un problema durante la ricerca: non \u00e8 stato trovato nessun risultato. +message.noresults=Nessun risultato trovato. +message.results=Ricerca di ''{0}'': {1} risultati trovati. +message.maxresults=Sono stati trovati pi\u00f9 di {0} risultati. Vengono mostrati solo i primi {0}. +message.getuser-failure=Impossibile recuperare i dettagli per l''utente {0}. +message.create-success=Il nuovo utente \u00e8 stato creato. +message.create-failure=Impossibile creare l''utente {0}. +message.create-user-exists=Impossibile creare l'utente perch\u00e9 il nome utente esiste gi\u00e0. +message.password-failure=Impossibile impostare la password per il nuovo utente. +message.password-validate-failure=I campi delle password non corrispondono. +message.password-validate-length=La password deve contenere almeno {0} caratteri. +message.password-validate-oldpw=E' necessaria la vecchia password per aggiornare l'utente attuale. +message.delete-success=L'utente \u00e8 stato eliminato. +message.update-success=L'utente \u00e8 stato aggiornato. +message.update-failure=Impossibile aggiornare i dettagli per l''utente {0}. +message.clear-photo-failure=Impossibile ripristinare la foto dell'utente. +message.authenticationdetails-failure=Impossibile recuperare i dettagli di autenticazione. + +message.csvupload.success={0} utenti caricati. +message.csvupload.partialSuccess={0} utenti caricati; impossibile caricare {1} utenti. +message.csvupload.failure=Nessun utente caricato. +message.csvupload.error=Impossibile caricare il file. +message.csvupload.invalid=Il file CSV fornito non \u00e8 valido. +message.csvupload.error.details=Impossibile elaborare il file: + +label.quota=Quota +label.usage=Uso +label.moreuserinfo=Altre informazioni su questo utente +label.aboutuser=Informazioni sull'utente +label.accountstatus=Stato account +label.enabled=Abilitato +label.disabled=Disabilitato +label.info=Informazioni +label.requiredfield=Campo richiesto +label.oldpassword=Vecchia password +label.newpassword=Nuova password +label.verifypassword=Verifica password +label.disableaccount=Disabilita account +label.leaveblank=Lasciare vuoto se non si desidera cambiare la password +label.removegroup=Rimuovi gruppo +label.uploadStatus=Stato + +label.authorization=Stato autorizzazione +label.authorization.status.AUTHORIZED=Autorizzato +label.authorization.status.DEAUTHORIZED=Autorizzazione revocata +label.authorization.status.NEVER_AUTHORIZED=Mai autorizzato +label.authorization.isdeleted=Eliminato? +label.authorization.deleted=Eliminato +label.authorization.actions=Azione + +deauthorize.dialog.deauthorize.confirm.ok=Revoca autorizzazione +deauthorize.dialog.deauthorize.confirm.cancel=Annulla +deauthorize.dialog.cannot.deauthorize.admin=Non \u00e8 possibile revocare l'autorizzazione degli amministratori +deauthorize.dialog.header=Revocare l''autorizzazione di ''{0}''? +deauthorize.dialog.message=
  Non sar\u00e0 possibile riautorizzare un utente a cui \u00e8 stata revocata l''autorizzazione. +deauthorize.dialog.checkbox.message=Ho capito che, una volta revocata l'autorizzazione di questo utente, non potr\u00f2 riautorizzarlo.

+message.deauthorize.success=L'autorizzazione dell'utente \u00e8 stata revocata. +message.deauthorize.failure=Impossibile revocare l''autorizzazione dell''utente. \n ''{0}'' + + +reauthorize.dialog.title=Riautorizza utente ''{0}'' +reauthorize.dialog.button.ok=Riautorizza +reauthorize.dialog.message=Comunicare il seguente codice di autorizzazione al supporto tecnico di Alfresco"{0}". Si ricever\u00e0 un file da caricare. +reauthorize.dialog.fail=Riautorizzazione non riuscita (il codice di autorizzazione non \u00e8 stato accettato o si \u00e8 verificato un problema con il server) +reauthorize.dialog.success=Riautorizzazione riuscita + +panel.delete.header=Elimina utente +panel.delete.msg=Fare clic su Elimina utente per rimuovere questo utente. +panel.delete.note=L'eliminazione di un utente rimuove le sue autorizzazioni dal repository. Se si crea un utente con lo stesso ID utente di un utente precedentemente eliminato, il nuovo utente ottiene l'accesso ai file dell'utente originale ma non le relative autorizzazioni in quanto queste vengono rimosse dopo l'eliminazione dell'utente. +panel.delete.fail=Impossibile eliminare l'utente. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_ja.properties new file mode 100755 index 0000000000..f1543fdb22 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_ja.properties @@ -0,0 +1,85 @@ +label.title-search=\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22 +label.title-view=\u30e6\u30fc\u30b6\u30fc\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb +label.title-create=\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc +label.title-update=\u30e6\u30fc\u30b6\u30fc\u306e\u7de8\u96c6 +label.title-csvresults=\u691c\u7d22\u7d50\u679c\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 + +button.newuser=\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc +button.uploaduser=\u30e6\u30fc\u30b6\u30fc\u306e CSV \u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 +button.edituser=\u30e6\u30fc\u30b6\u30fc\u306e\u7de8\u96c6 +button.deleteuser=\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664 +button.createuser=\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210 +button.createanother=\u9023\u7d9a\u4f5c\u6210 +button.usedefault=\u30c7\u30d5\u30a9\u30eb\u30c8\u3092\u4f7f\u7528\u3059\u308b + +message.empty=\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22 +message.error=\u691c\u7d22\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u691c\u7d22\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.noresults=\u691c\u7d22\u7d50\u679c\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +message.results=''{0}'' \u306e\u691c\u7d22 - {1} \u4ef6\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002 +message.maxresults=\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u304c {0} \u4ef6\u4ee5\u4e0a\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002 \u6700\u521d\u306e {0} \u4ef6\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +message.getuser-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u306e\u8a73\u7d30\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.create-success=\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002 +message.create-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.create-user-exists=\u540c\u3058\u540d\u524d\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u3059\u3067\u306b\u5b58\u5728\u3059\u308b\u305f\u3081\u3001\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.password-failure=\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.password-validate-failure=\u5165\u529b\u3057\u305f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u3066\u3044\u307e\u305b\u3093\u3002 +message.password-validate-length=\u30d1\u30b9\u30ef\u30fc\u30c9\u306f {0} \u6587\u5b57\u4ee5\u4e0a\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002 +message.password-validate-oldpw=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u66f4\u65b0\u3059\u308b\u306b\u306f\u3001\u53e4\u3044\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059\u3002 +message.delete-success=\u30e6\u30fc\u30b6\u30fc\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +message.update-success=\u30e6\u30fc\u30b6\u30fc\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002 +message.update-failure=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u306e\u8a73\u7d30\u60c5\u5831\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.clear-photo-failure=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u5199\u771f\u3092\u30ea\u30bb\u30c3\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.authenticationdetails-failure=\u8a8d\u8a3c\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 + +message.csvupload.success={0} \u4ef6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f\u3002 +message.csvupload.partialSuccess={0} \u4ef6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f\u304c\u3001{1} \u4ef6\u306f\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.csvupload.failure=\u30e6\u30fc\u30b6\u30fc\u306f\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.csvupload.error=\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +message.csvupload.invalid=\u6307\u5b9a\u3057\u305f CSV \u30d5\u30a1\u30a4\u30eb\u304c\u7121\u52b9\u3067\u3059\u3002 +message.csvupload.error.details=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: + +label.quota=\u30af\u30a9\u30fc\u30bf +label.usage=\u4f7f\u7528\u91cf +label.moreuserinfo=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u8a73\u7d30\u60c5\u5831 +label.aboutuser=\u30e6\u30fc\u30b6\u30fc\u306b\u3064\u3044\u3066 +label.accountstatus=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b9\u30c6\u30fc\u30bf\u30b9 +label.enabled=\u6709\u52b9 +label.disabled=\u7121\u52b9 +label.info=\u60c5\u5831 +label.requiredfield=\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9 +label.oldpassword=\u53e4\u3044\u30d1\u30b9\u30ef\u30fc\u30c9 +label.newpassword=\u65b0\u3057\u3044\u30d1\u30b9\u30ef\u30fc\u30c9 +label.verifypassword=\u65b0\u3057\u3044\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u5165\u529b +label.disableaccount=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7121\u52b9\u306b\u3059\u308b +label.leaveblank=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u306a\u3044\u5834\u5408\u306f\u7a7a\u6b04\u306e\u307e\u307e\u306b\u3057\u3066\u304f\u3060\u3055\u3044 +label.removegroup=\u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664 +label.uploadStatus=\u30b9\u30c6\u30fc\u30bf\u30b9 + +label.authorization=\u627f\u8a8d\u306e\u30b9\u30c6\u30fc\u30bf\u30b9 +label.authorization.status.AUTHORIZED=\u627f\u8a8d\u6e08\u307f +label.authorization.status.DEAUTHORIZED=\u627f\u8a8d\u53d6\u308a\u6d88\u3057\u6e08\u307f +label.authorization.status.NEVER_AUTHORIZED=\u672a\u627f\u8a8d +label.authorization.isdeleted=\u524a\u9664\u6e08\u307f\u3067\u3059\u304b? +label.authorization.deleted=\u524a\u9664\u6e08\u307f +label.authorization.actions=\u51e6\u7406 + +deauthorize.dialog.deauthorize.confirm.ok=\u627f\u8a8d\u306e\u53d6\u308a\u6d88\u3057 +deauthorize.dialog.deauthorize.confirm.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb +deauthorize.dialog.cannot.deauthorize.admin=\u7ba1\u7406\u8005\u306e\u627f\u8a8d\u3092\u53d6\u308a\u6d88\u3059\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093 +deauthorize.dialog.header=''{0}'' \u306e\u627f\u8a8d\u3092\u53d6\u308a\u6d88\u3057\u307e\u3059\u304b? +deauthorize.dialog.message=
   \u4e00\u5ea6\u627f\u8a8d\u3092\u53d6\u308a\u6d88\u3057\u305f\u30e6\u30fc\u30b6\u30fc\u3092\u518d\u627f\u8a8d\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093 +deauthorize.dialog.checkbox.message=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u627f\u8a8d\u3092\u53d6\u308a\u6d88\u3059\u3068\u518d\u627f\u8a8d\u3067\u304d\u306a\u304f\u306a\u308b\u3053\u3068\u306b\u540c\u610f\u3059\u308b

+message.deauthorize.success=\u30e6\u30fc\u30b6\u30fc\u306e\u627f\u8a8d\u304c\u53d6\u308a\u6d88\u3055\u308c\u307e\u3057\u305f\u3002 +message.deauthorize.failure=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u627f\u8a8d\u3092\u53d6\u308a\u6d88\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n ''{0}'' + + +reauthorize.dialog.title=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u306e\u518d\u627f\u8a8d +reauthorize.dialog.button.ok=\u518d\u627f\u8a8d +reauthorize.dialog.message=Alfresco \u30b5\u30dd\u30fc\u30c8\u30c1\u30fc\u30e0 "{0}" \u306b\u6b21\u306e\u627f\u8a8d\u30b3\u30fc\u30c9\u3092\u5831\u544a\u3059\u308b\u3068\u3001 \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002 +reauthorize.dialog.fail=\u518d\u627f\u8a8d\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f (\u627f\u8a8d\u30b3\u30fc\u30c9\u304c\u62d2\u5426\u3055\u308c\u305f\u304b\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f) +reauthorize.dialog.success=\u518d\u627f\u8a8d\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f + +panel.delete.header=\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664 +panel.delete.msg=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3059\u308b\u306b\u306f\u3001[\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664] \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002 +panel.delete.note=\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3059\u308b\u3068\u3001\u305d\u306e\u6a29\u9650\u304c\u30ea\u30dd\u30b8\u30c8\u30ea\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u524a\u9664\u3057\u305f\u30e6\u30fc\u30b6\u30fc\u3068\u540c\u3058\u30e6\u30fc\u30b6\u30fc ID \u3092\u4f7f\u3063\u3066\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3057\u305f\u5834\u5408\u3001\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc\u306f\u5143\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u3059\u304c\u3001\u5143\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664\u6642\u306b\u524a\u9664\u3055\u308c\u305f\u6a29\u9650\u306b\u306f\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3002 +panel.delete.fail=\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_nb.properties new file mode 100755 index 0000000000..ab60abac3f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_nb.properties @@ -0,0 +1,85 @@ +label.title-search=Brukers\u00f8k +label.title-view=Brukerprofil +label.title-create=Ny bruker +label.title-update=Rediger bruker +label.title-csvresults=Last opp resultater + +button.newuser=Ny bruker +button.uploaduser=Kan ikke laste opp CSV-fil +button.edituser=Rediger bruker +button.deleteuser=Slett bruker +button.createuser=Opprett bruker +button.createanother=Opprett og start en annen +button.usedefault=Bruk standardverdi + +message.empty=S\u00f8k etter brukere +message.error=Det oppsto en feil under s\u00f8ket - ingen resultater funnet. +message.noresults=Finner ingen resultater. +message.results=S\u00f8k etter ''{0}'' - {1} resultater funnet. +message.maxresults=Fant over {0} s\u00f8keresultater. Viser kun de {0} f\u00f8rste. +message.getuser-failure=Hentet ikke brukerdetaljer for brukeren {0}. +message.create-success=Opprettet en ny bruker. +message.create-failure=Mislyktes i \u00e5 opprette brukeren {0}. +message.create-user-exists=Mislyktes i \u00e5 opprette brukeren siden brukernavnet allerede finnes. +message.password-failure=Mislyktes i \u00e5 angi passordet for den nye brukeren. +message.password-validate-failure=Passordfelt samsvarer ikke. +message.password-validate-length=Passordet m\u00e5 v\u00e6re p\u00e5 minst {0} tegn. +message.password-validate-oldpw=Gamle passord kreves for \u00e5 oppdatere gjeldende bruker. +message.delete-success=Brukeren ble slettet. +message.update-success=Brukeren ble oppdatert. +message.update-failure=Mislyktes i \u00e5 oppdatere detaljene for brukeren {0}. +message.clear-photo-failure=Mislyktes i \u00e5 tilbakestille fotoet for brukeren. +message.authenticationdetails-failure=Mislyktes i \u00e5 hente autoriseringsdetaljer. + +message.csvupload.success={0} brukere ble lastet opp. +message.csvupload.partialSuccess={0} brukere ble lastet opp. Mislyktes i \u00e5 laste opp {1} brukere. +message.csvupload.failure=Ingen brukere ble lastet opp. +message.csvupload.error=Mislyktes i \u00e5 laste opp filen. +message.csvupload.invalid=Den leverte CSV-filen var ugyldig. +message.csvupload.error.details=Mislyktes i \u00e5 behandle den opplastede filen: + +label.quota=Kvote +label.usage=Bruk +label.moreuserinfo=Mer om denne brukeren +label.aboutuser=Om brukeren +label.accountstatus=Kontostatus +label.enabled=Aktivert +label.disabled=Deaktivert +label.info=Info +label.requiredfield=Obligatorisk felt +label.oldpassword=Gammelt passord +label.newpassword=Nytt passord +label.verifypassword=Bekreft passord +label.disableaccount=Deaktiver konto +label.leaveblank=La st\u00e5 tomt hvis du ikke vil endre passordet +label.removegroup=Fjern gruppe +label.uploadStatus=Status + +label.authorization=Autoriseringsstatus +label.authorization.status.AUTHORIZED=Autorisert +label.authorization.status.DEAUTHORIZED=Avautorisert +label.authorization.status.NEVER_AUTHORIZED=Aldri autorisert +label.authorization.isdeleted=Slettet? +label.authorization.deleted=Slettet +label.authorization.actions=Handling + +deauthorize.dialog.deauthorize.confirm.ok=Avautorisere +deauthorize.dialog.deauthorize.confirm.cancel=Avbryt +deauthorize.dialog.cannot.deauthorize.admin=Administratorer kan ikke avautoriseres +deauthorize.dialog.header=Er du sikker p\u00e5 at du vil avautorisere "{0}"? +deauthorize.dialog.message=
  Du kan ikke autorisere en avautorisert bruker p\u00e5 nytt. +deauthorize.dialog.checkbox.message=Jeg forst\u00e5r at hvis jeg avautoriserer denne brukeren, kan vedkommende ikke autoriseres p\u00e5 nytt.

+message.deauthorize.success=Brukeren er n\u00e5 avautorisert. +message.deauthorize.failure=Brukeren kan ikke avautoriseres. \n ''{0}'' + + +reauthorize.dialog.title=Autoriser brukeren ''{0}'' p\u00e5 nytt +reauthorize.dialog.button.ok=Autoriser p\u00e5 nytt +reauthorize.dialog.message=Gi f\u00f8lgende autoriseringskode til Alfrescos st\u00f8tteteam "{0}". Du f\u00e5r en fil som skal lastes opp. +reauthorize.dialog.fail=Mislykket ny autorisering (autoriseringskoden ble ikke godkjent, eller det oppstod en serverfeil) +reauthorize.dialog.success=Vellykket ny autorisering + +panel.delete.header=Slett bruker +panel.delete.msg=Trykk p\u00e5 Slett bruker for \u00e5 fjerne denne brukeren. +panel.delete.note=N\u00e5r du sletter en bruker, sletter du vedkommendes tillatelser fra databasen. Hvis du oppretter en bruker med samme bruker-ID som en tidligere slettet bruker, f\u00e5r den nye brukeren tilgang til den opprinnelige brukerens filer, men ikke vedkommendes tillatelser, da disse blir fjernet n\u00e5r brukeren slettes. +panel.delete.fail=Mislyktes i \u00e5 slette brukeren. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_nl.properties new file mode 100755 index 0000000000..c63c00fc89 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_nl.properties @@ -0,0 +1,85 @@ +label.title-search=Gebruiker zoeken +label.title-view=Gebruikersprofiel +label.title-create=Nieuwe gebruiker +label.title-update=Gebruiker bewerken +label.title-csvresults=Resultaten uploaden + +button.newuser=Nieuwe gebruiker +button.uploaduser=CSV-bestand gebruiker uploaden +button.edituser=Gebruiker bewerken +button.deleteuser=Gebruiker verwijderen +button.createuser=Gebruiker maken +button.createanother=Maken en nog \u00e9\u00e9n starten +button.usedefault=Standaard gebruiken + +message.empty=Gebruikers zoeken +message.error=Er is een probleem opgetreden tijdens de zoekopdracht - geen resultaten gevonden. +message.noresults=Geen resultaten gevonden. +message.results=Zoeken naar ''{0}'' - {1} resultaten gevonden. +message.maxresults=Meer dan {0} resultaten gevonden. Alleen eerste {0} tonen. +message.getuser-failure=Kan geen gegevens ophalen voor gebruiker {0}. +message.create-success=Nieuwe gebruiker is gemaakt. +message.create-failure=Kan gebruiker {0} niet maken. +message.create-user-exists=Kan de gebruiker niet maken omdat de gebruikersnaam al bestaat. +message.password-failure=Kan het wachtwoord voor de nieuwe gebruiker niet instellen. +message.password-validate-failure=Wachtwoordvelden komen niet overeen. +message.password-validate-length=Wachtwoord moet minimaal {0} tekens bevatten. +message.password-validate-oldpw=Het oude wachtwoord is nodig om de huidige gebruiker bij te werken. +message.delete-success=De gebruiker is verwijderd. +message.update-success=De gebruiker is bijgewerkt. +message.update-failure=Kan de gegevens voor gebruiker {0} niet bijwerken. +message.clear-photo-failure=Kan de foto van de gebruiker niet opnieuw instellen. +message.authenticationdetails-failure=Kan geen verificatiegegevens ophalen. + +message.csvupload.success={0} gebruikers zijn ge\u00fcpload. +message.csvupload.partialSuccess={0} gebruikers zijn ge\u00fcpload, kan {1} gebruikers niet uploaden. +message.csvupload.failure=Er zijn geen gebruikers ge\u00fcpload. +message.csvupload.error=Kan het bestand niet uploaden. +message.csvupload.invalid=Het opgegeven CSV-bestand is ongeldig. +message.csvupload.error.details=Kan het ge\u00fcploade bestand niet verwerken: + +label.quota=Quota +label.usage=Gebruik +label.moreuserinfo=Meer informatie over deze gebruiker +label.aboutuser=Info over gebruiker +label.accountstatus=Accountstatus +label.enabled=Ingeschakeld +label.disabled=Uitgeschakeld +label.info=Info +label.requiredfield=Verplicht veld +label.oldpassword=Oud wachtwoord +label.newpassword=Nieuw wachtwoord +label.verifypassword=Wachtwoord bevestigen +label.disableaccount=Account uitschakelen +label.leaveblank=Leeg laten als u het wachtwoord niet wilt wijzigen +label.removegroup=Groep verwijderen +label.uploadStatus=Status + +label.authorization=Autorisatiestatus +label.authorization.status.AUTHORIZED=Geautoriseerd +label.authorization.status.DEAUTHORIZED=Autorisatie ongedaan gemaakt +label.authorization.status.NEVER_AUTHORIZED=Nooit geautoriseerd +label.authorization.isdeleted=Verwijderd? +label.authorization.deleted=Verwijderd +label.authorization.actions=Actie + +deauthorize.dialog.deauthorize.confirm.ok=Autorisatie ongedaan maken +deauthorize.dialog.deauthorize.confirm.cancel=Annuleren +deauthorize.dialog.cannot.deauthorize.admin=U kunt de autorisatie van beheerders niet ongedaan maken +deauthorize.dialog.header=Weet u zeker dat u de autorisatie van ''{0}'' ongedaan wilt maken? +deauthorize.dialog.message=
  U kunt een gebruiker van wie de autorisatie ongedaan is gemaakt niet opnieuw autoriseren. +deauthorize.dialog.checkbox.message=Ik begrijp dat ik, als ik de autorisatie van deze gebruiker ongedaan maak, de gebruiker niet opnieuw kan autoriseren.

+message.deauthorize.success=De autorisatie van de gebruiker is ongedaan gemaakt. +message.deauthorize.failure=Kan de autorisatie van de gebruiker niet ongedaan maken. \n ''{0}'' + + +reauthorize.dialog.title=Gebruiker ''{0}'' opnieuw autoriseren +reauthorize.dialog.button.ok=Opnieuw autoriseren +reauthorize.dialog.message=Geef de volgende autorisatiecode door aan het Alfresco Support-team "{0}". U ontvangt dan van het team een bestand dat u moet uploaden. +reauthorize.dialog.fail=Opnieuw autoriseren is mislukt (de autorisatiecode is niet geaccepteerd of er was sprake van een serverprobleem) +reauthorize.dialog.success=Opnieuw autoriseren is voltooid + +panel.delete.header=Gebruiker verwijderen +panel.delete.msg=Klik op Gebruiker verwijderen om deze gebruiker te verwijderen. +panel.delete.note=Als een gebruiker wordt verwijderd, worden diens machtigingen uit de repository verwijderd. Als u een gebruiker maakt met dezelfde gebruikers-id als een eerder verwijderde gebruiker, krijgt de nieuwe gebruiker toegang tot de bestanden van de originele gebruiker, maar niet tot diens machtigingen omdat deze bij het verwijderen van de gebruiker worden verwijderd. +panel.delete.fail=Kan de gebruiker niet verwijderen. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_pt_BR.properties new file mode 100644 index 0000000000..cc91dffe12 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_pt_BR.properties @@ -0,0 +1,85 @@ +label.title-search=Pesquisa de usu\u00e1rio +label.title-view=Perfil de usu\u00e1rio +label.title-create=Novo usu\u00e1rio +label.title-update=Editar usu\u00e1rio +label.title-csvresults=Carregar resultados + +button.newuser=Novo usu\u00e1rio +button.uploaduser=Carregar arquivo CSV de usu\u00e1rio +button.edituser=Editar usu\u00e1rio +button.deleteuser=Excluir usu\u00e1rio +button.createuser=Criar usu\u00e1rio +button.createanother=Criar e iniciar outro +button.usedefault=Usar padr\u00e3o + +message.empty=Pesquisar usu\u00e1rios +message.error=Houve um problema durante a pesquisa - nenhum resultado encontrado. +message.noresults=Nenhum resultado encontrado. +message.results=Pesquisa de ''{0}'' - {1} resultados encontrados. +message.maxresults=Mais de {0} resultados de encontrados. Mostrar apenas os {0} primeiros. +message.getuser-failure=N\u00e3o foi poss\u00edvel recuperar detalhes para o usu\u00e1rio {0}. +message.create-success=Novo usu\u00e1rio criado com sucesso. +message.create-failure=N\u00e3o foi poss\u00edvel criar o usu\u00e1rio {0}. +message.create-user-exists=N\u00e3o foi poss\u00edvel criar o usu\u00e1rio porque o nome de usu\u00e1rio j\u00e1 existe. +message.password-failure=N\u00e3o foi poss\u00edvel definir a senha para o novo usu\u00e1rio. +message.password-validate-failure=Campos de senha n\u00e3o coincidem. +message.password-validate-length=Senha deve ter pelo menos {0} caracteres. +message.password-validate-oldpw=A antiga senha \u00e9 necess\u00e1ria para atualizar o usu\u00e1rio atual. +message.delete-success=Usu\u00e1rio exclu\u00eddo com sucesso. +message.update-success=Usu\u00e1rio atualizado com sucesso. +message.update-failure=N\u00e3o foi poss\u00edvel atualizar os detalhes para o usu\u00e1rio {0}. +message.clear-photo-failure=N\u00e3o foi poss\u00edvel redefinir a foto para o usu\u00e1rio. +message.authenticationdetails-failure=N\u00e3o foi poss\u00edvel recuperar os detalhes de autentica\u00e7\u00e3o. + +message.csvupload.success={0} usu\u00e1rios carregados com sucesso. +message.csvupload.partialSuccess={0} usu\u00e1rios carregados com sucesso, n\u00e3o foi poss\u00edvel carregar {1} usu\u00e1rios. +message.csvupload.failure=Nenhum usu\u00e1rio carregado. +message.csvupload.error=N\u00e3o foi poss\u00edvel carregar o arquivo. +message.csvupload.invalid=O arquivo CSV fornecido \u00e9 inv\u00e1lido. +message.csvupload.error.details=N\u00e3o foi poss\u00edvel processar o arquivo carregado: + +label.quota=Cota +label.usage=Uso +label.moreuserinfo=Mais sobre este usu\u00e1rio +label.aboutuser=Sobre o usu\u00e1rio +label.accountstatus=Status da conta +label.enabled=Ativado +label.disabled=Desativado +label.info=Informa\u00e7\u00f5es +label.requiredfield=Campo obrigat\u00f3rio +label.oldpassword=Senha antiga +label.newpassword=Nova senha +label.verifypassword=Verificar senha +label.disableaccount=Desativar conta +label.leaveblank=Deixar em branco se n\u00e3o desejar alterar a senha +label.removegroup=Remover grupo +label.uploadStatus=Status + +label.authorization=Estado de autoriza\u00e7\u00e3o +label.authorization.status.AUTHORIZED=Autorizado +label.authorization.status.DEAUTHORIZED=Desautorizado +label.authorization.status.NEVER_AUTHORIZED=Nunca autorizado +label.authorization.isdeleted=Exclu\u00eddo? +label.authorization.deleted=Exclu\u00eddo +label.authorization.actions=A\u00e7\u00e3o + +deauthorize.dialog.deauthorize.confirm.ok=Desautorizar +deauthorize.dialog.deauthorize.confirm.cancel=Cancelar +deauthorize.dialog.cannot.deauthorize.admin=Os administradores n\u00e3o podem ser desautorizados +deauthorize.dialog.header=Tem certeza de que deseja desautorizar ''{0}''? +deauthorize.dialog.message=
\u00a0\u00a0Voc\u00ea n\u00e3o pode reautorizar um usu\u00e1rio desautorizado. +deauthorize.dialog.checkbox.message=Entendo que se eu desautorizar este usu\u00e1rio n\u00e3o posso autoriz\u00e1-lo novamente.

+message.deauthorize.success=O usu\u00e1rio foi desautorizado com sucesso. +message.deauthorize.failure=N\u00e3o foi poss\u00edvel excluir o usu\u00e1rio + + +reauthorize.dialog.title=Reautorizar usu\u00e1rio ''{0}'' +reauthorize.dialog.button.ok=Reautorizar +reauthorize.dialog.message=Fornecer o seguinte c\u00f3digo de autoriza\u00e7\u00e3o para a equipe de suporte Alfresco "{0}". Eles lhe dar\u00e3o um arquivo para carregar. +reauthorize.dialog.fail=Falha na reautoriza\u00e7\u00e3o (O c\u00f3digo de autoriza\u00e7\u00e3o n\u00e3o foi aceito ou houve um problema do servidor) +reauthorize.dialog.success=Reautoriza\u00e7\u00e3o com sucesso + +panel.delete.header=Excluir usu\u00e1rio +panel.delete.msg=Clique em Excluir usu\u00e1rio para remover este usu\u00e1rio. +panel.delete.note=A exclus\u00e3o de um usu\u00e1rio remove as permiss\u00f5es dele do reposit\u00f3rio. Se voc\u00ea criar um usu\u00e1rio com a mesma ID de usu\u00e1rio de um usu\u00e1rio exclu\u00eddo anteriormente, o usu\u00e1rio novo obt\u00e9m acesso aos arquivos originais do anterior, mas n\u00e3o \u00e0s permiss\u00f5es, pois elas s\u00e3o removidas com a exclus\u00e3o do usu\u00e1rio. +panel.delete.fail=N\u00e3o foi poss\u00edvel excluir o usu\u00e1rio. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_ru.properties new file mode 100755 index 0000000000..606b8633d9 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_ru.properties @@ -0,0 +1,85 @@ +label.title-search=\u041f\u043e\u0438\u0441\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +label.title-view=\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +label.title-create=\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +label.title-update=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +label.title-csvresults=\u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 + +button.newuser=\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +button.uploaduser=\u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 CSV +button.edituser=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +button.deleteuser=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +button.createuser=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +button.createanother=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 +button.usedefault=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e + +message.empty=\u041f\u043e\u0438\u0441\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 +message.error=\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442. +message.noresults=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b. +message.results=\u041f\u043e\u0438\u0441\u043a ''{0}'' \u2014 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432: {1}. +message.maxresults=\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0431\u043e\u043b\u0435\u0435 {0}\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (-\u043e\u0432). \u0411\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 {0}. +message.getuser-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 {0}. +message.create-success=\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d. +message.create-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {0}. +message.create-user-exists=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0435\u0433\u043e \u0438\u043c\u044f \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442\u043e. +message.password-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +message.password-validate-failure=\u041f\u043e\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442. +message.password-validate-length=\u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: {0}. +message.password-validate-oldpw=\u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. +message.delete-success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d. +message.update-success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d. +message.update-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 {0}. +message.clear-photo-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +message.authenticationdetails-failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. + +message.csvupload.success=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 ({0}) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u044b. +message.csvupload.partialSuccess=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 ({0}) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u044b; \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439: {1}. +message.csvupload.failure=\u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d. +message.csvupload.error=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b. +message.csvupload.invalid=\u0423\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0444\u0430\u0439\u043b CSV. +message.csvupload.error.details=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b: + +label.quota=\u041a\u0432\u043e\u0442\u0430 +label.usage=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 +label.moreuserinfo=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 +label.aboutuser=\u041e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 +label.accountstatus=\u0421\u0442\u0430\u0442\u0443\u0441 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 +label.enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e +label.disabled=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e +label.info=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +label.requiredfield=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 +label.oldpassword=\u0421\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c +label.newpassword=\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c +label.verifypassword=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u044f +label.disableaccount=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c +label.leaveblank=\u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c +label.removegroup=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 +label.uploadStatus=\u0421\u0442\u0430\u0442\u0443\u0441 + +label.authorization=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 +label.authorization.status.AUTHORIZED=\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d(\u0430) +label.authorization.status.DEAUTHORIZED=\u0414\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d(\u0430) +label.authorization.status.NEVER_AUTHORIZED=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b(\u0430) \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d(\u0430) +label.authorization.isdeleted=\u0423\u0434\u0430\u043b\u0435\u043d(\u0430)? +label.authorization.deleted=\u0423\u0434\u0430\u043b\u0435\u043d(\u0430) +label.authorization.actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 + +deauthorize.dialog.deauthorize.confirm.ok=\u0414\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c +deauthorize.dialog.deauthorize.confirm.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 +deauthorize.dialog.cannot.deauthorize.admin=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 +deauthorize.dialog.header=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c ''{0}''? +deauthorize.dialog.message=
  \u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 reauthorize a deauthorized user. +deauthorize.dialog.checkbox.message=\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e/\u0435\u0435.

+message.deauthorize.success=\u0414\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. +message.deauthorize.failure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \n ''{0}'' + + +reauthorize.dialog.title=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ''{0}'' +reauthorize.dialog.button.ok=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f +reauthorize.dialog.message=\u0421\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0436\u0431\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Alfresco: "{0}". \u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u0441\u043b\u0443\u0436\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438. +reauthorize.dialog.fail=\u0421\u0431\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 (\u043a\u043e\u0434 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u0440\u0438\u043d\u044f\u0442, \u043b\u0438\u0431\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430) +reauthorize.dialog.success=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 + +panel.delete.header=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f +panel.delete.msg=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +panel.delete.note=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0442\u0435\u043c \u0436\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u0435\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043d\u043e \u043d\u0435 \u043a \u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. +panel.delete.fail=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_zh_CN.properties new file mode 100755 index 0000000000..28c6540f95 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/console/usersgroups/users.get_zh_CN.properties @@ -0,0 +1,85 @@ +label.title-search=\u7528\u6237\u641c\u7d22 +label.title-view=\u7528\u6237\u7b80\u51b5 +label.title-create=\u65b0\u5efa\u7528\u6237 +label.title-update=\u7f16\u8f91\u7528\u6237 +label.title-csvresults=\u4e0a\u4f20\u7ed3\u679c + +button.newuser=\u65b0\u5efa\u7528\u6237 +button.uploaduser=\u4e0a\u4f20\u7528\u6237 CSV \u6587\u4ef6 +button.edituser=\u7f16\u8f91\u7528\u6237 +button.deleteuser=\u5220\u9664\u7528\u6237 +button.createuser=\u521b\u5efa\u7528\u6237 +button.createanother=\u521b\u5efa\u548c\u542f\u52a8\u53e6\u4e00\u4e2a +button.usedefault=\u4f7f\u7528\u9ed8\u8ba4 + +message.empty=\u641c\u7d22\u7528\u6237 +message.error=\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u6211\u4eec\u9047\u5230\u95ee\u9898\uff0c\u672a\u627e\u5230\u7ed3\u679c\u3002 +message.noresults=\u672a\u627e\u5230\u7ed3\u679c\u3002 +message.results=\u641c\u7d22 ''{0}'' - \u627e\u5230\u4e86 {1} \u4e2a\u7ed3\u679c\u3002 +message.maxresults=\u627e\u5230\u8d85\u8fc7 {0} \u4e2a\u641c\u7d22\u7ed3\u679c\u3002 \u4ec5\u663e\u793a\u524d {0} \u6761\u3002 +message.getuser-failure=\u6211\u4eec\u65e0\u6cd5\u68c0\u7d22\u7528\u6237 {0} \u7684\u8be6\u7ec6\u4fe1\u606f\u3002 +message.create-success=\u5df2\u6210\u529f\u521b\u5efa\u65b0\u7528\u6237\u3002 +message.create-failure=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u7528\u6237 {0}\u3002 +message.create-user-exists=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u6b64\u7528\u6237\uff0c\u6b64\u7528\u6237\u540d\u5df2\u5b58\u5728\u3002 +message.password-failure=\u6211\u4eec\u65e0\u6cd5\u4e3a\u6b64\u65b0\u7528\u6237\u8bbe\u7f6e\u5bc6\u7801\u3002 +message.password-validate-failure=\u5bc6\u7801\u5b57\u6bb5\u4e0d\u5339\u914d\u3002 +message.password-validate-length=\u5bc6\u7801\u5fc5\u987b\u81f3\u5c11\u4e3a {0} \u4e2a\u5b57\u7b26\u3002 +message.password-validate-oldpw=\u66f4\u65b0\u5f53\u524d\u7528\u6237\u9700\u8981\u65e7\u5bc6\u7801\u3002 +message.delete-success=\u5df2\u6210\u529f\u5220\u9664\u6b64\u7528\u6237\u3002 +message.update-success=\u5df2\u6210\u529f\u66f4\u65b0\u6b64\u7528\u6237\u3002 +message.update-failure=\u6211\u4eec\u65e0\u6cd5\u66f4\u65b0\u7528\u6237 {0} \u7684\u8be6\u7ec6\u4fe1\u606f\u3002 +message.clear-photo-failure=\u6211\u4eec\u65e0\u6cd5\u4e3a\u6b64\u7528\u6237\u91cd\u8bbe\u7167\u7247\u3002 +message.authenticationdetails-failure=\u6211\u4eec\u65e0\u6cd5\u68c0\u7d22\u8eab\u4efd\u9a8c\u8bc1\u8be6\u7ec6\u4fe1\u606f\u3002 + +message.csvupload.success=\u5df2\u6210\u529f\u4e0a\u4f20 {0} \u4f4d\u7528\u6237\u3002 +message.csvupload.partialSuccess=\u5df2\u6210\u529f\u4e0a\u4f20 {0} \u7528\u6237\uff0c\u65e0\u6cd5\u4e0a\u4f20 {1} \u4f4d\u7528\u6237\u3002 +message.csvupload.failure=\u65e0\u7528\u6237\u4e0a\u4f20\u3002 +message.csvupload.error=\u6211\u4eec\u65e0\u6cd5\u4e0a\u4f20\u6b64\u6587\u4ef6\u3002 +message.csvupload.invalid=\u63d0\u4f9b\u7684 CSV \u6587\u4ef6\u65e0\u6548\u3002 +message.csvupload.error.details=\u6211\u4eec\u65e0\u6cd5\u5904\u7406\u6b64\u4e0a\u4f20\u6587\u4ef6: + +label.quota=\u914d\u989d +label.usage=\u4f7f\u7528\u91cf +label.moreuserinfo=\u6709\u5173\u6b64\u7528\u6237\u7684\u66f4\u591a\u4fe1\u606f +label.aboutuser=\u5173\u4e8e\u7528\u6237 +label.accountstatus=\u5e10\u6237\u72b6\u6001 +label.enabled=\u5df2\u542f\u7528 +label.disabled=\u5df2\u7981\u7528 +label.info=\u4fe1\u606f +label.requiredfield=\u5fc5\u586b\u5b57\u6bb5 +label.oldpassword=\u65e7\u5bc6\u7801 +label.newpassword=\u65b0\u5bc6\u7801 +label.verifypassword=\u9a8c\u8bc1\u5bc6\u7801 +label.disableaccount=\u7981\u7528\u5e10\u6237 +label.leaveblank=\u5982\u679c\u4e0d\u60f3\u66f4\u6539\u5bc6\u7801\uff0c\u4fdd\u7559\u7a7a\u767d +label.removegroup=\u79fb\u9664\u7fa4\u7ec4 +label.uploadStatus=\u72b6\u6001 + +label.authorization=\u6388\u6743\u72b6\u6001 +label.authorization.status.AUTHORIZED=\u5df2\u6388\u6743 +label.authorization.status.DEAUTHORIZED=\u5df2\u89e3\u9664\u6388\u6743 +label.authorization.status.NEVER_AUTHORIZED=\u4ece\u672a\u6388\u6743 +label.authorization.isdeleted=\u5df2\u5220\u9664\uff1f +label.authorization.deleted=\u5df2\u5220\u9664 +label.authorization.actions=\u64cd\u4f5c + +deauthorize.dialog.deauthorize.confirm.ok=\u89e3\u9664\u6388\u6743 +deauthorize.dialog.deauthorize.confirm.cancel=\u53d6\u6d88 +deauthorize.dialog.cannot.deauthorize.admin=\u60a8\u65e0\u6cd5\u89e3\u9664\u5bf9\u7ba1\u7406\u5458\u7684\u6388\u6743 +deauthorize.dialog.header=\u786e\u5b9a\u8981\u89e3\u9664\u5bf9 ''{0}'' \u7684\u6388\u6743\uff1f +deauthorize.dialog.message=
  \u60a8\u65e0\u6cd5 \u5bf9\u5df2\u89e3\u9664\u6388\u6743\u7684\u7528\u6237\u91cd\u65b0\u6388\u6743\u3002 +deauthorize.dialog.checkbox.message=\u6211\u77e5\u9053\uff0c\u5982\u679c\u6211\u89e3\u9664\u5bf9\u6b64\u7528\u6237\u7684\u6388\u6743\uff0c\u6211\u4e0d\u80fd\u5bf9\u4ed6\u4eec\u91cd\u65b0\u6388\u6743\u3002

+message.deauthorize.success=\u7528\u6237\u5df2\u88ab\u6210\u529f\u89e3\u9664\u6388\u6743\u3002 +message.deauthorize.failure=\u6211\u4eec\u65e0\u6cd5\u89e3\u9664\u5bf9\u7528\u6237\u7684\u6388\u6743\u3002\n''{0}'' + + +reauthorize.dialog.title=\u91cd\u65b0\u6388\u6743\u7528\u6237 ''{0}'' +reauthorize.dialog.button.ok=\u91cd\u65b0\u6388\u6743 +reauthorize.dialog.message=\u5411 Alfresco \u652f\u6301\u56e2\u961f "{0}" \u63d0\u4f9b\u4ee5\u4e0b\u6388\u6743\u4ee3\u7801\u3002 \u4ed6\u4eec\u5c06\u5411\u60a8\u63d0\u4f9b\u4e0a\u4f20\u6587\u4ef6\u3002 +reauthorize.dialog.fail=\u91cd\u65b0\u6388\u6743\u5931\u8d25\uff08\u6388\u6743\u4ee3\u7801\u672a\u88ab\u6388\u6743\u6216\u8005\u5b58\u5728\u670d\u52a1\u5668\u95ee\u9898\uff09 +reauthorize.dialog.success=\u91cd\u65b0\u6388\u6743\u6210\u529f + +panel.delete.header=\u5220\u9664\u7528\u6237 +panel.delete.msg=\u5355\u51fb\u5220\u9664\u7528\u6237\u4ee5\u79fb\u9664\u6b64\u7528\u6237\u3002 +panel.delete.note=\u5220\u9664\u7528\u6237\u4f1a\u4ece\u5b58\u50a8\u5e93\u4e2d\u5220\u9664\u4ed6\u4eec\u7684\u6743\u9650\u3002\u5982\u679c\u60a8\u521b\u5efa\u7684\u7528\u6237\u4e0e\u4e4b\u524d\u5220\u9664\u7684\u7528\u6237\u6709\u76f8\u540c\u7684\u7528\u6237ID\uff0c\u90a3\u4e48\u65b0\u7528\u6237\u53ef\u4ee5\u8bbf\u95ee\u539f\u6765\u7528\u6237\u7684\u6587\u4ef6\uff0c\u4f46\u662f\u4e0d\u518d\u4f1a\u4ee5\u539f\u6765\u7684\u6743\u9650\uff0c\u56e0\u4e3a\u8fd9\u4e9b\u6743\u9650\u5728\u4e4b\u524d\u5df2\u7ecf\u968f\u7740\u7528\u6237\u88ab\u5220\u9664\u4e86\u3002 +panel.delete.fail=\u6211\u4eec\u65e0\u6cd5\u5220\u9664\u6b64\u7528\u6237\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.config.xml new file mode 100644 index 0000000000..5d71482378 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.config.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.desc.xml new file mode 100644 index 0000000000..34046b20ed --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.desc.xml @@ -0,0 +1,5 @@ + + A view component for content in the repository + Displays a nodeRef + /components/content-viewer + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.head.ftl new file mode 100644 index 0000000000..69852211fe --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.head.ftl @@ -0,0 +1,2 @@ +<#include "../component.head.inc"> + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.html.ftl new file mode 100644 index 0000000000..0af090e9b4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.html.ftl @@ -0,0 +1,6 @@ +<#-- + The included content will automatically have the same parameters as this template. + In other words have access to the node and its content. +--> + +<#include "${viewer}"/> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.js new file mode 100644 index 0000000000..3ec14b4eab --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/content-viewer.get.js @@ -0,0 +1,94 @@ +// Load the config to know what viewer to use for each mimetype +var contentviewer = new XML(config.script); + +// Check mandatory parameters +var nodeRef = page.url.args.nodeRef; +if (nodeRef == null || nodeRef.length == 0) +{ + status.code = 400; + status.message = "Parameter 'nodeRef' is missing."; + status.redirect = true; +} + +// Call the repo for metadata +var json = remote.call("/api/metadata?nodeRef=" + nodeRef) +var node = JSON.parse(json); + +/** + * If no viewer is configured for the nodes mime-type display + * a fallback template with an explanation text + */ +var viewer = "viewers/no-viewer-exist.ftl"; +var preload = false; +var contentData = null; + +var content = contentviewer.content.(@mimetype==node.mimetype); +if (content.length() == 1) +{ + // Found a configured viewer for the mimetype + viewer = content.@viewer.toString(); + preload = (content.@preload.toString() == "true"); +} +else if (content.length() > 1) +{ + // Multiple viewers found for the same mimetype, throw an error + status.code = 500; + status.message = "Multiple viewers (" + content.@viewer.toString() + ") defined for the mime-type ${node.mimetype}"; + status.redirect = true; +} + +// property namespaces +var mcns = "{http://www.alfresco.org/model/content/1.0}"; +var msns = "{http://www.alfresco.org/model/system/1.0}"; + +// extract metadata +var storeType = node.properties[msns + "store-protocol"]; +var storeId = node.properties[msns + "store-identifier"]; +var nodeId = node.properties[msns + "node-uuid"]; +var name = node.properties[mcns + "name"]; + +var contentUrl = "/api/node/content/" +storeType+ "/" +storeId + "/" + nodeId + "?" + encodeURIComponent(name) +if (preload) +{ + /** + * This mimetype can be displayed inline and has therefore been configured + * to be loaded directly instead from the browser. + */ + contentData = remote.call(contentUrl); +} + +// Prepare model for template +model.viewer = viewer; +model.node = node; +model.contentData = contentData; +model.contentUrl = page.url.context + "/service" + contentUrl; + +// Set the width +model.width = "100%"; // default value +if (node.properties[mcns + "width"]) +{ + model.width = node.properties[mcns + "width"]; +} +else if (args.width) +{ + model.width = args.width; +} +else if (content.@width.toString().length > 0) +{ + model.width = content.@width.toString(); +} + +// Set the height +model.height = "100%"; // default value +if (node.properties[mcns + "height"]) +{ + model.height = node.properties[mcns + "height"]; +} +else if (args.height) +{ + model.height = args.height; +} +else if (content.@height.toString().length > 0) +{ + model.height = content.@height.toString(); +} diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/audio.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/audio.ftl new file mode 100644 index 0000000000..ecb47d3bcb --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/audio.ftl @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/html.ftl new file mode 100644 index 0000000000..51a16e9af1 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/html.ftl @@ -0,0 +1 @@ +${content} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/image.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/image.ftl new file mode 100644 index 0000000000..93a7913857 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/image.ftl @@ -0,0 +1 @@ + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/no-viewer-exist.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/no-viewer-exist.ftl new file mode 100644 index 0000000000..e29a60d023 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/no-viewer-exist.ftl @@ -0,0 +1,2 @@ +<#-- Localize this message --> +Can't display node [name] since there is no viewer for mime-type ${node.mimetype}. \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/text.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/text.ftl new file mode 100644 index 0000000000..6ddb5c2d04 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/text.ftl @@ -0,0 +1 @@ +
${contentData}
diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/video.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/video.ftl new file mode 100644 index 0000000000..e336d4d421 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/video.ftl @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/xml.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/xml.ftl new file mode 100644 index 0000000000..b6650c219c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/content-viewer/viewers/xml.ftl @@ -0,0 +1 @@ +${content} diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.desc.xml new file mode 100644 index 0000000000..553e18ca7f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.desc.xml @@ -0,0 +1,5 @@ + + create-content-mgr + Create Content Manager Component + /components/create-content/create-content-mgr + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.head.ftl new file mode 100644 index 0000000000..e9429f8b35 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.html.ftl new file mode 100644 index 0000000000..88c45bae5c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.html.ftl @@ -0,0 +1,24 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link href="${url.context}/res/components/create-content/create-content-mgr.css" group="create-content"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script src="${url.context}/res/components/create-content/create-content-mgr.js" group="create-content"/> + + +<@markup id="widgets"> + <@createWidgets group="create-content"/> + + +<@markup id="html"> + <@uniqueIdDiv> + <#-- + PLEASE NOTE: This section has been commented out because the title is now handled by the header component. +
+
${msg("create-content-mgr.heading")}
+
+ --> + + diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.js new file mode 100644 index 0000000000..755f96c6cc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.js @@ -0,0 +1,13 @@ +function main() { + // Widget instantiation metadata... + var widget = { + id : "CreateContentMgr", + name : "Alfresco.CreateContentMgr", + options : { + siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "", + isContainer: "true" == ((page.url.args.isContainer != null) ? page.url.args.isContainer : "false") + } + }; + model.widgets = [widget]; +} +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.properties new file mode 100644 index 0000000000..c7d916dd97 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Create Content +create-content-mgr.create.failed=Failed to create content diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_de.properties new file mode 100755 index 0000000000..d221c3ebd6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_de.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Inhalt erstellen +create-content-mgr.create.failed=Fehler beim Erstellen des Inhaltes diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_es.properties new file mode 100755 index 0000000000..20c755fa44 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_es.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Crear contenido +create-content-mgr.create.failed=No se pudo crear el contenido diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_fr.properties new file mode 100755 index 0000000000..a26ea3552b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_fr.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Cr\u00e9er un contenu +create-content-mgr.create.failed=Echec de la cr\u00e9ation du contenu diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_it.properties new file mode 100755 index 0000000000..8c52a1324c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_it.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Crea contenuto +create-content-mgr.create.failed=Impossibile creare il contenuto diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_ja.properties new file mode 100755 index 0000000000..002eee4620 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_ja.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u4f5c\u6210 +create-content-mgr.create.failed=\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_nb.properties new file mode 100755 index 0000000000..7cfb6e325d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_nb.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Opprett innhold +create-content-mgr.create.failed=Kunne ikke opprette innhold diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_nl.properties new file mode 100755 index 0000000000..df05ed13ba --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_nl.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Content maken +create-content-mgr.create.failed=Kan geen content maken diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_pt_BR.properties new file mode 100644 index 0000000000..8494a0a44d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_pt_BR.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=Criar conte\u00fado +create-content-mgr.create.failed=Falha ao criar conte\u00fado diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_ru.properties new file mode 100755 index 0000000000..43d7223341 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_ru.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 +create-content-mgr.create.failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_zh_CN.properties new file mode 100755 index 0000000000..3aefb35f0f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/create-content/create-content-mgr.get_zh_CN.properties @@ -0,0 +1,2 @@ +create-content-mgr.heading=\u521b\u5efa\u5185\u5bb9 +create-content-mgr.create.failed=\u521b\u5efa\u5185\u5bb9\u5931\u8d25 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.desc.xml new file mode 100644 index 0000000000..58fed2d215 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.desc.xml @@ -0,0 +1,7 @@ + + Save Customise Dashboard + Saves the result from Customise dashlets & layout components + + /components/dashboard/customise-dashboard + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.json.ftl new file mode 100644 index 0000000000..f81dc51f8d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.json.ftl @@ -0,0 +1,3 @@ +{ + "success": true +} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.json.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.json.js new file mode 100644 index 0000000000..39c341818a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashboard.post.json.js @@ -0,0 +1,96 @@ +/** + * Customise Dashboard component POST method + */ + +function main() +{ + // Get clients json request as a js object + var clientRequest = json.toString(); + var clientJSON = JSON.parse(clientRequest); + + // The dashboard we are modifiying + var dashboardPage = clientJSON.dashboardPage; + var newDashlets = clientJSON.dashlets; + + // Change the dashbpards template + var templateId = clientJSON.templateId; + sitedata.associateTemplate(templateId, dashboardPage); + + // Get existing dashlets/component bindings for the page + var oldComponents = sitedata.findComponents("page", null, dashboardPage, null); + if (oldComponents === undefined || oldComponents.length === 0) + { + oldComponents = []; + } + + // Unbind all components, old properties will be stored in the oldComponents list. + for (var oi = 0; oi < oldComponents.length; oi++) + { + var oldComponent = oldComponents[oi]; + var regionId = oldComponent.properties["region-id"]; + if (regionId.match("^component-\\d+-\\d+$")) + { + // Unbind the component if it has been delete or moved + var existingDashlet = null; + for (var ni = 0; ni < newDashlets.length; ni++) + { + var newDashlet = newDashlets[ni]; + if (newDashlet.originalRegionId == regionId) + { + existingDashlet = newDashlet; + break; + } + } + if (existingDashlet == null || existingDashlet.regionId != existingDashlet.originalRegionId) + { + // Delete dashlet if it has been removed or moved + sitedata.unbindComponent("page", regionId, dashboardPage); + } + } + } + + // Create bindings for new and moved dashlets. + var newDashlets = clientJSON.dashlets; + for (var ni = 0; ni < newDashlets.length; ni++) + { + var newDashlet = newDashlets[ni]; + if (newDashlet.originalRegionId) + { + if (newDashlet.originalRegionId != newDashlet.regionId) + { + // An existing/moved dashlet + var existingDashlet = null; + for (var oi = 0; oi < oldComponents.length; oi++) + { + var oldDashlet = oldComponents[oi]; + if (oldDashlet.properties["region-id"] == newDashlet.originalRegionId) + { + existingDashlet = oldDashlet; + break; + } + } + if (existingDashlet != null) + { + // Its an old component that has been moved, use object from the list so we don't loose the properties + var comp = sitedata.newComponent("page", newDashlet.regionId, dashboardPage); + for (var propertyKey in existingDashlet.properties) + { + comp.properties[propertyKey] = existingDashlet.properties[propertyKey]; + } + comp.properties["region-id"] = newDashlet.regionId; + comp.properties.url = newDashlet.url; + comp.save(); + } + } + } + else + { + // An new/added dashlet + var comp = sitedata.newComponent("page", newDashlet.regionId, dashboardPage); + comp.properties.url = newDashlet.url; + comp.save(); + } + } +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.desc.xml new file mode 100644 index 0000000000..eef50f9d9f --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.desc.xml @@ -0,0 +1,5 @@ + + Customise Dashlets + Customise dashlets component + /components/dashboard/customise-dashlets + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.html.ftl new file mode 100644 index 0000000000..3cb71e4176 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.html.ftl @@ -0,0 +1,127 @@ +<#-- + Note! + + This component uses key events. The component listens to key events for a + specific element that must have focus to trigger events. + Its possible to listen for global events, i.e. key events for the document + but since several key listening components might live on the same page + that can't be done. + + The browser gives focus to links or form elements, since the dashlets + are represented by "li"-tags they will not get focus. To achieve this + anyway a non visible "a"-tag is placed in each "li"-tag so we + can get focus and thereafter listen to individual key events. + + Inside the a element is a transparent gif with width and height of 100% + to make the browsers focus indication borders go around the whole dashlet. + + Since the cursor is changed using CSS selectors on the currently selected + element a div is in front of both the a element and the image is a div, + to make sure it becomes the selected element. + + --> + +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/dashboard/customise-dashlets.css" group="dashboard"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/js/alfresco-dnd.js" group="dashboard"/> + <@script type="text/javascript" src="${url.context}/res/components/dashboard/customise-dashlets.js" group="dashboard"/> + + +<@markup id="widgets"> + <@createWidgets group="dashboard"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+
+

${msg("header.dashlets")}

+
+
+
${msg("label.instructions")}
+
${msg("label.keyboard-instruction1")}
+
+ +
+
+
+ +
+
${msg("label.keyboard-instruction2")}
+
+
 
+ <#list columns as column> +
= currentLayout.noOfColumns)>style="display: none;"> +

${msg("header.column", column_index + 1)}

+
    + <#list column as dashlet> + <#if dashlet??> +
  • + + + + <#if dashlet.shortName?length < 26>${dashlet.shortName}<#else>${dashlet.shortName?substring(0, 24)}... +
    +
  • + + +
+
+ +
+   +
+
+
+ <#if showWelcomePanelOptions> +
+

${msg("header.welcomePreference")}

+
+
+ checked> +
+ checked> + +
+
+ +
+
+
+
+ + +
+
+
+
+
    + +
  • +
+
+
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.js new file mode 100644 index 0000000000..62b390a631 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.js @@ -0,0 +1,235 @@ +/** + * Customise Site Dashlets component GET method + */ + +function getNoOfColumns(template) +{ + var noOfColumns = 0; + while (template.properties["gridColumn" + (noOfColumns + 1)] !== null) + { + noOfColumns++; + } + return noOfColumns; +} + +function getUserGroups() +{ + var result = remote.connect("alfresco").get("/api/people/" + encodeURIComponent(user.name) + "?groups=true"); + if (result.status == status.STATUS_OK) + { + return JSON.parse(result.response).groups.map(function(group){ return group.itemName; }); + } + return []; +} + +function main() +{ + // Get available components of family/type dashlet + var webscripts; + if (args.dashboardType == "user") + { + webscripts = sitedata.findWebScripts("user-dashlet"); + } + else if (args.dashboardType == "site") + { + webscripts = sitedata.findWebScripts("site-dashlet"); + } + if (!webscripts) + { + webscripts = []; + } + var tmp = sitedata.findWebScripts("dashlet"); + if (tmp || tmp.length != 0) + { + webscripts = webscripts.concat(tmp); + } + + // Transform the webscripts to easy-to-access dashlet items for the template + var availableDashlets = []; + var usergroups; + for (var i = 0; i < webscripts.length; i++) + { + var webscript = webscripts[i]; + var uris = webscript.getURIs(); + var scriptId, scriptName, shortNameId, descriptionId; + if (uris !== null && uris.length > 0 && webscript.shortName !== null) + { + // Check if the webscript is limited to certain groups + var allowed = true; + for (var fi = 0; fi < webscript.familys.length; fi++) + { + if (webscript.familys[fi].indexOf("group:") == 0) + { + allowed = false; + var group = webscript.familys[fi].substring("group:".length).trim(); + group += ""; // make it of type "string" rather than "object" so that indexOf works + if (!usergroups) + { + usergroups = getUserGroups(); + } + if (usergroups.indexOf(group) != -1) + { + allowed = true; + break; + } + } + var showDashletValue = typeof showDashlet === "boolean" ? showDashlet : false; + if (!showDashletValue && + (webscript.getURIs()[0] == "/components/dashlets/rssfeed" || + webscript.getURIs()[0] == "/components/dashlets/addonsfeed")) + { + allowed = false; + } + } + + if (allowed) + { + // Use the webscript ID to generate a message bundle ID + // + // This should really be retrieved from an explicit value but the web scripts framework does not provide + // a means for storing message bundle IDs, and the web framework is not being used here. + scriptId = webscript.id; + scriptName = scriptId.substring(scriptId.lastIndexOf("/") + 1, scriptId.lastIndexOf(".")); + shortNameId = "dashlet." + scriptName + ".shortName"; + descriptionId = "dashlet." + scriptName + ".description"; + availableDashlets.push( + { + url: uris[0], + // msg.get(key) returns key if no matching value + shortName: (msg.get(shortNameId) != shortNameId ? msg.get(shortNameId) : webscript.shortName), + description: (msg.get(descriptionId) != descriptionId ? msg.get(descriptionId) : webscript.description) + }); + } + } + // else skip this webscript since it lacks uri or shortName + } + + var dashboardId, dashboardId; + if (args.dashboardType == "user") + { + dashboardId = "user/" + user.name + "/dashboard"; + dashboardUrl = "user/" + encodeURIComponent(user.name) + "/dashboard"; + } + else if (args.dashboardType == "site") + { + dashboardId = "site/" + page.url.templateArgs.site + "/dashboard"; + dashboardUrl = dashboardId; + } + + var components = sitedata.findComponents("page", null, dashboardId, null); + if (components === undefined || components.length === 0) + { + components = []; + } + + var welcomePanelEnabled = false; + + // Transform the webscripts to easy-to-access dashlet items for the template + var columns = [[], [], [], []]; + for (i = 0; i < components.length; i++) + { + var comp = components[i]; + + var regionId = comp.properties["region-id"], + theUrl = comp.properties.url; + if (regionId !== null && theUrl !== null) + { + // Create dashlet + var shortName = null, description; + for (var j = 0, d; j < availableDashlets.length; j++) + { + d = availableDashlets[j]; + if (d.url == theUrl) + { + shortName = d.shortName; + description = d.description; + break; + } + } + if (shortName != null) + { + var dashlet = + { + url: theUrl, + shortName: shortName, + description: description, + originalRegionId: regionId + }; + + // Use Java regex matching as it performs better. + var javaStr = new java.lang.String(regionId); + if (javaStr.matches(new java.lang.String("^component-\\d+-\\d+$"))) + { + // Place it in correct column and in a temporary row literal + var column = parseInt(regionId.substring(regionId.indexOf("-") + 1, regionId.lastIndexOf("-"))), + row = parseInt(regionId.substring(regionId.lastIndexOf("-") + 1)); + columns[column-1][row-1] = dashlet; + } + } + + if (regionId == "full-width-dashlet") + { + welcomePanelEnabled = true; + } + } + // else skip this component since it lacks regionId or shortName + } + + // clean undefined elements from columns + var cleanArray = function (actual) + { + var newArray = new Array(); + for(var i = 0; i < actual.length; i++) + { + if (actual[i]) + { + newArray.push(actual[i]); + } + } + return newArray; + } + + for (var i = 0; i < columns.length; i++) + { + columns[i] = cleanArray(columns[i]); + } + + // Get current template + var currentTemplate = sitedata.findTemplate(dashboardId), + currentNoOfColumns = getNoOfColumns(currentTemplate), + currentLayout = + { + templateId: currentTemplate.id, + noOfColumns: currentNoOfColumns, + description: currentTemplate.description + }; + + // Define the model for the template + model.availableDashlets = availableDashlets; + model.dashboardUrl = dashboardUrl; + model.dashboardId = dashboardId; + model.columns = columns; + model.currentLayout = currentLayout; + model.welcomePanelEnabled = welcomePanelEnabled; + model.showWelcomePanelOptions = args.dashboardType == "user"; + + // Widget instantiation metadata... + var customizeDashlets = { + id : "CustomiseDashlets", + name : "Alfresco.CustomiseDashlets", + options : { + currentLayout : { + templateId : currentTemplate.id, + noOfColumns : parseInt("" + currentNoOfColumns), + description : currentTemplate.description, + icon : url.context + "/res/components/dashboard/images/" + currentTemplate.id + ".png" + }, + dashboardUrl : model.dashboardUrl, + dashboardId : model.dashboardId, + welcomePanelEnabled: model.welcomePanelEnabled + } + }; + model.widgets = [customizeDashlets]; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.properties new file mode 100644 index 0000000000..c9eb95c9cd --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=Add Dashlets +link.close=Close + +header.column=Column {0} +header.welcomePreference=Get Started Panel + +welcomePanel.enabled=Show on dashboard +welcomePanel.disabled=Hide from dashboard + +section.myDashlets=My Dashlets +label.instructions=Drag and drop the available dashlets into a column to add them to your dashboard. You can also reorder the dashlets within the columns using drag and drop. +label.keyboard-instruction1=When using the keyboard, use the Tab key to move to the next dashlet. Select the dashlet and press Enter to add to column. Press the Esc key to deselect an item. +label.keyboard-instruction2=When using the keyboard, use the Tab key to select a dashlet. Use the arrow keys to move the selected dashlet. Press Escape to deselect an item. Press Delete to delete an item. + +button.addDashlets=Add Dashlets +button.hideDashlets=Hide Dashlets + +button.save=OK +alt.delete=Delete +help.trashcan=Drag dashlets here to remove them from a column + +message.saving=Saving configuration... +message.saveFailure=Could not save dashlets + +## Dashlet names and descriptions +dashlet.addons.shortName=Alfresco Add-ons RSS Feed +dashlet.addons.description=The latest news from Alfresco Add-ons. +dashlet.calendar.shortName=Site Calendar +dashlet.calendar.description=Lists the site events for the current month. +dashlet.cmisfeed.shortName=CMIS Feed +dashlet.cmisfeed.description=Display the contents of the CMIS introduction text and Blog feed +dashlet.colleagues.shortName=Site Members +dashlet.colleagues.description=Lists colleagues in the collaboration site +dashlet.docsummary.shortName=Site Content +dashlet.docsummary.description=Document summary component +dashlet.my-activities.shortName=My Activities +dashlet.my-activities.description=Lists recent activities for a given user. +dashlet.my-docs-editing.shortName=Content I'm Editing +dashlet.my-docs-editing.description=Content I Am Editing Dashlet +dashlet.my-profile.shortName=My Profile +dashlet.my-profile.description=Component used to display current user +dashlet.my-sites.shortName=My Sites +dashlet.my-sites.description=Component used to list sites a user belongs to +dashlet.my-tasks.shortName=My Tasks +dashlet.my-tasks.description=Dashlet to list tasks assigned to the current user +dashlet.my-workspaces.shortName=My Document Workspaces +dashlet.my-workspaces.description=Component used to list workspaces a user belongs to +dashlet.rssfeed.shortName=RSS Feed +dashlet.rssfeed.description=Display the contents of an RSS feed given a URL configuration parameter. +dashlet.site-activities.shortName=Site Activities +dashlet.site-activities.description=Lists recent activities for a given site. +dashlet.site-links.shortName=Site Links +dashlet.site-links.description=Component used to list links a user belongs to +dashlet.site-profile.shortName=Site Profile +dashlet.site-profile.description=Site profile component used in the collaboration site +dashlet.user-calendar.shortName=My Calendar +dashlet.user-calendar.description=Lists the site events for the current user. +dashlet.webview.shortName=Web View +dashlet.webview.description=Display the contents of a URI given a URI config parameter. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Display a wiki page, selected by the user. +dashlet.my-meeting-workspaces.shortName=My Meeting Workspaces +dashlet.my-meeting-workspaces.description=Component used to list meeting workspaces a user belongs to +dashlet.my-documents.shortName=My Documents +dashlet.my-documents.description=Dashlet to list documents associated with the current user +dashlet.imagesummary.shortName=Image Preview +dashlet.imagesummary.description=Image library thumbnail and preview dashlet component +dashlet.site-data-lists.shortName=Site Data Lists +dashlet.site-data-lists.description=Component used to show Data Lists in the site +dashlet.forum-summary.shortName=My Discussions +dashlet.forum-summary.description=Filtered discussion Forum summary +dashlet.saved-search.shortName=Saved Search +dashlet.saved-search.description=Saved Search Dashlet +dashlet.site-search.shortName=Site Search +dashlet.site-search.description=Site Search Dashlet +dashlet.site-notice.shortName=Site Notice +dashlet.site-notice.description=Add a custom notice for display to site users +dashlet.top-site-contributor-report.shortName=Site Contributor Breakdown +dashlet.top-site-contributor-report.description=Shows a visual breakdown of who's contributed most content to the site. +dashlet.site-content-report.shortName=Site File Type Breakdown +dashlet.site-content-report.description=Shows a visual breakdown of the site's different file types. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_de.properties new file mode 100755 index 0000000000..e039ed900a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_de.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=Dashlets hinzuf\u00fcgen +link.close=Schlie\u00dfen + +header.column=Spalte {0} +header.welcomePreference=Erste-Schritte-Fenster + +welcomePanel.enabled=Im Dashboard einblenden +welcomePanel.disabled=Aus Dashboard ausblenden + +section.myDashlets=Meine Dashlets +label.instructions=F\u00fcgen Sie Ihrem Dashboard die verf\u00fcgbaren Dashlets per Drag & Drop hinzu. Sie k\u00f6nnen Ihre Dashlets in den Spalten ebenfalls per Drag & Drop neu anordnen. +label.keyboard-instruction1=Bei Verwendung der Tastatur: Tabulatortaste dr\u00fccken, um zum n\u00e4chsten Dashlet zu gehen. Dashlet ausw\u00e4hlen und Eingabetaste dr\u00fccken, um etwas zur Spalte hinzuzuf\u00fcgen. Esc-Taste dr\u00fccken, um die Auswahl eines Elements aufzuheben. +label.keyboard-instruction2=Bei Verwendung der Tastatur: Tabulatortaste dr\u00fccken, um ein Dashlet auszuw\u00e4hlen. Mit den Pfeiltasten das ausgew\u00e4hlte Dashlet verschieben. Esc-Taste dr\u00fccken, um Auswahl eines Elements aufzuheben. Entf-Taste dr\u00fccken, um ein Element zu l\u00f6schen. + +button.addDashlets=Dashlets hinzuf\u00fcgen +button.hideDashlets=Dashlets ausblenden + +button.save=OK +alt.delete=L\u00f6schen +help.trashcan=Dashlets hierher verschieben, um sie aus einer Spalte zu entfernen + +message.saving=Speichere Konfiguration... +message.saveFailure=Dashlets konnten nicht gespeichert werden + +## Dashlet names and descriptions +dashlet.addons.shortName=RSS-Feed f\u00fcr Alfresco-Add-ons +dashlet.addons.description=Das Neueste \u00fcber die Alfresco-Add-ons. +dashlet.calendar.shortName=Site-Kalender +dashlet.calendar.description=Zeigt die Ereignisse f\u00fcr den aktuellen Monat an. +dashlet.cmisfeed.shortName=CMIS-Feed +dashlet.cmisfeed.description=Inhalte des CMIS-Einf\u00fchrungstextes und des Blog Feed anzeigen +dashlet.colleagues.shortName=Site-Mitglieder +dashlet.colleagues.description=Zeigt die Kollegen in der Collaboration-Site an +dashlet.docsummary.shortName=Site-Inhalt +dashlet.docsummary.description=Komponente zur Zusammenfassung von Dokumenten +dashlet.my-activities.shortName=Meine Aktivit\u00e4ten +dashlet.my-activities.description=Listet die letzten Aktivit\u00e4ten eines Benutzers auf. +dashlet.my-docs-editing.shortName=Inhalt, den ich editiere +dashlet.my-docs-editing.description=Inhalt, den ich bearbeite Dashlet +dashlet.my-profile.shortName=Mein Profil +dashlet.my-profile.description=Komponente, um den aktuellen Benutzer anzuzeigen +dashlet.my-sites.shortName=Meine Sites +dashlet.my-sites.description=Komponente, um die Sites anzuzeigen, in denen der Benutzer Mitglied ist +dashlet.my-tasks.shortName=Meine Aufgaben +dashlet.my-tasks.description=Dashlet, um die dem Benutzer zugewiesenen Aufgaben anzuzeigen +dashlet.my-workspaces.shortName=Meine Dokumenten-Arbeitsbereiche +dashlet.my-workspaces.description=Komponente, um die Arbeitsbereiche anzuzeigen, zu denen ein Benutzer geh\u00f6rt +dashlet.rssfeed.shortName=RSS-Feed +dashlet.rssfeed.description=Zeige die Inhalte eines RSS-Feeds bei vorgegebenem URL Konfigurationsparameter an. +dashlet.site-activities.shortName=Site-Aktivit\u00e4ten +dashlet.site-activities.description=Listet die letzten Aktivit\u00e4ten einer Site an. +dashlet.site-links.shortName=Links der Site +dashlet.site-links.description=Komponente zur Anzeige der Links, zu denen ein Benutzer geh\u00f6rt +dashlet.site-profile.shortName=Site-Profil +dashlet.site-profile.description=Komponente f\u00fcr das Site Profil, das in der Collaboration-Site verwendet wird +dashlet.user-calendar.shortName=Mein Kalender +dashlet.user-calendar.description=Zeigt die Ereignisse f\u00fcr den aktuellen Benutzer an. +dashlet.webview.shortName=Web-Ansicht +dashlet.webview.description=Zeige den Inhalt einer URI bei vorgegebenem URI Konfigurationsparameter an. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Zeige eine durch den Benutzer gew\u00e4hlte Wiki-Seite an. +dashlet.my-meeting-workspaces.shortName=Meine Meeting-Arbeitsbereiche +dashlet.my-meeting-workspaces.description=Komponente, um die Meeting-Arbeitsbereiche anzuzeigen, in denen ein Benutzer Mitglied ist +dashlet.my-documents.shortName=Meine Dokumente +dashlet.my-documents.description=Dashlet zur Listung der Dokumente, die mit dem aktuellen Benutzer verbunden sind +dashlet.imagesummary.shortName=Bildvorschau +dashlet.imagesummary.description=Miniaturansicht des Bildverzeichnisses und Komponente der Dashlet-Voranzeige +dashlet.site-data-lists.shortName=Datenlisten der Site +dashlet.site-data-lists.description=Komponente zur Anzeige der Datenliste der Site +dashlet.forum-summary.shortName=Meine Diskussionen +dashlet.forum-summary.description=Zusammenfassung gefiltertes Diskussionsforum +dashlet.saved-search.shortName=Gespeicherte Suche +dashlet.saved-search.description=Dashlet f\u00fcr gespeicherte Suche +dashlet.site-search.shortName=Site-Suche +dashlet.site-search.description=Dashlet f\u00fcr Site-Suche +dashlet.site-notice.shortName=Site-Hinweis +dashlet.site-notice.description=Hinweis zur Anzeige f\u00fcr Site-Benutzer hinzuf\u00fcgen +dashlet.top-site-contributor-report.shortName=\u00dcbersicht Site-Beitragender +dashlet.top-site-contributor-report.description=Gibt eine \u00dcbersicht dar\u00fcber, wer die meisten Inhalte zur Site beigetragen hat. +dashlet.site-content-report.shortName=\u00dcbersicht Dateityp auf Site +dashlet.site-content-report.description=Gibt eine \u00dcbersicht \u00fcber die verschiedenen Dateitypen auf der Site. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_es.properties new file mode 100755 index 0000000000..aeac733e18 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_es.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=A\u00f1adir dashlets +link.close=Cerrar + +header.column=Columna {0} +header.welcomePreference=Panel de introducci\u00f3n + +welcomePanel.enabled=Mostrar en panel de inicio +welcomePanel.disabled=Ocultar en el panel de inicio + +section.myDashlets=Mis Dashlets +label.instructions=Arrastre y suelte los dashlets disponibles en una columna para a\u00f1adirlos a su panel de inicio. Tambi\u00e9n puede reorganizar los dashlets dentro de las columnas arrastrando y soltando. +label.keyboard-instruction1=Con el teclado, utilice la tecla de tabulaci\u00f3n para pasar al siguiente dashlet. Seleccione el dashlet y pulse Intro para a\u00f1adir una columna. Pulse la tecla Esc para desmarcar un elemento. +label.keyboard-instruction2=Con el teclado, utilice la tecla de tabulaci\u00f3n para seleccionar un dashlet. Use las teclas de flecha para mover el dashlet seleccionado. Pulse Esc para desmarcar un elemento. Pulse Eliminar para eliminar un elemento. + +button.addDashlets=A\u00f1adir dashlets +button.hideDashlets=Ocultar dashlets + +button.save=Aceptar +alt.delete=Eliminar +help.trashcan=Arrastre los dashlets aqu\u00ed para retirarlos de una columna + +message.saving=Guardando la configuraci\u00f3n... +message.saveFailure=No se pudieron guardar los cambios en los dashlets + +## Dashlet names and descriptions +dashlet.addons.shortName=Canal RSS de complementos de Alfresco +dashlet.addons.description=Contenido m\u00e1s reciente de canales RSS de complementos de Alfresco. +dashlet.calendar.shortName=Calendario del sitio +dashlet.calendar.description=Lista los eventos del sitio para este mes. +dashlet.cmisfeed.shortName=Canal CMIS +dashlet.cmisfeed.description=Texto de introducci\u00f3n a CMIS y canal RSS del blog +dashlet.colleagues.shortName=Miembros del sitio +dashlet.colleagues.description=Lista de los miembros del sitio colaborativo +dashlet.docsummary.shortName=Contenido del sitio +dashlet.docsummary.description=Componente de resumen de documentos +dashlet.my-activities.shortName=Mis actividades +dashlet.my-activities.description=Lista de actividades recientes de un usuario dado. +dashlet.my-docs-editing.shortName=Contenidos que estoy editando +dashlet.my-docs-editing.description=Dashlet de Contenidos que estoy editando +dashlet.my-profile.shortName=Mi Perfil +dashlet.my-profile.description=Muestra resumen del usuario actual +dashlet.my-sites.shortName=Mis Sitios +dashlet.my-sites.description=Listado de sitios pertenecientes al usuario +dashlet.my-tasks.shortName=Mis Tareas +dashlet.my-tasks.description=Dashlet de tareas asignadas a un usuario +dashlet.my-workspaces.shortName=Mis Espacios de Documentos +dashlet.my-workspaces.description=Componente utilizado para listar los espacios de trabajo a los que pertenece un usuario +dashlet.rssfeed.shortName=Canal RSS +dashlet.rssfeed.description=Contenido de canal RSS a partir de un par\u00e1metro de configuraci\u00f3n URL. +dashlet.site-activities.shortName=Actividades del sitio +dashlet.site-activities.description=Lista de actividades recientes de un sitio dado. +dashlet.site-links.shortName=Enlaces del sitio +dashlet.site-links.description=Componente utilizado para listar los enlaces asociados a un usuario +dashlet.site-profile.shortName=Perfil del sitio +dashlet.site-profile.description=Componente de perfil de sitio utilizado en el sitio colaborativo +dashlet.user-calendar.shortName=Mi Calendario +dashlet.user-calendar.description=Lista los eventos del sitio para el usuario actual. +dashlet.webview.shortName=Vista Web +dashlet.webview.description=Contenido de una URI a partir de un par\u00e1metro de configuraci\u00f3n URI. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Muestra una p\u00e1gina wiki seleccionada por el usuario. +dashlet.my-meeting-workspaces.shortName=Mis Espacios de Reuni\u00f3n +dashlet.my-meeting-workspaces.description=Lista resumen de los Espacios de Reuni\u00f3n pertenecientes al usuario +dashlet.my-documents.shortName=Mis Documentos +dashlet.my-documents.description=Dashlet de documentos al usuario actual +dashlet.imagesummary.shortName=Vista previa de im\u00e1genes +dashlet.imagesummary.description=Miniaturas de la biblioteca de im\u00e1genes y previsualizaci\u00f3n de dashlets +dashlet.site-data-lists.shortName=Listas de datos del sitio +dashlet.site-data-lists.description=Componente usado para mostrar Listas de datos en el sitio +dashlet.forum-summary.shortName=Mis Discusiones +dashlet.forum-summary.description=Resumen del foro de discusi\u00f3n filtrado +dashlet.saved-search.shortName=B\u00fasqueda guardada +dashlet.saved-search.description=Dashlet de b\u00fasquedas guardadas +dashlet.site-search.shortName=B\u00fasquedas en el sitio +dashlet.site-search.description=Dashlet de b\u00fasquedas en el sitio +dashlet.site-notice.shortName=Aviso del sitio +dashlet.site-notice.description=A\u00f1ada un aviso personalizado para mostr\u00e1rselo a los usuarios del sitio +dashlet.top-site-contributor-report.shortName=Desglose del contribuidor del sitio +dashlet.top-site-contributor-report.description=Muestra un desglose visual del mayor contribuidor al sitio. +dashlet.site-content-report.shortName=Desglose del tipo de ficheros del sitio +dashlet.site-content-report.description=Muestra un desglose visual de los diferentes tipos de ficheros del sitio. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_fr.properties new file mode 100755 index 0000000000..57f5f4e021 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_fr.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=Ajouter des dashlets +link.close=Fermer + +header.column=Colonne {0} +header.welcomePreference=Panneau D\u00e9marrage + +welcomePanel.enabled=Afficher sur le tableau de bord +welcomePanel.disabled=Masquer sur le tableau de bord + +section.myDashlets=Mes dashlets +label.instructions=Glisser et d\u00e9poser les dashlets disponibles dans une colonne pour les ajouter \u00e0 votre tableau de bord. Vous pouvez aussi r\u00e9organiser les dashlets dans les colonnes en effectuant un glisser-d\u00e9poser. +label.keyboard-instruction1=A partir du clavier, utilisez la touche Tab pour passer au dashlet suivant. S\u00e9lectionnez le dashlet et appuyez sur Entr\u00e9e pour l'ajouter \u00e0 la colonne. Appuyez sur la touche Echap pour d\u00e9s\u00e9lectionner un \u00e9l\u00e9ment. +label.keyboard-instruction2=A partir du clavier, utilisez la touche Tab pour s\u00e9lectionner un dashlet. Utilisez les touches fl\u00e9ch\u00e9es pour d\u00e9placer le dashlet s\u00e9lectionn\u00e9. Appuyez sur Echap pour d\u00e9s\u00e9lectionner un \u00e9l\u00e9ment. Appuyez sur Suppr pour supprimer un \u00e9l\u00e9ment. + +button.addDashlets=Ajouter des dashlets +button.hideDashlets=Cacher les dashlets + +button.save=OK +alt.delete=Supprimer +help.trashcan=Faire glisser les dashlets ici pour les enlever d'une colonne + +message.saving=Enregistrement de la configuration... +message.saveFailure=Echec de l'enregistrement des dashlets + +## Dashlet names and descriptions +dashlet.addons.shortName=Flux d'actualit\u00e9s Alfresco addons +dashlet.addons.description=Affiche le contenu du flux RSS Alfresco addons. +dashlet.calendar.shortName=Calendrier du site +dashlet.calendar.description=Liste les \u00e9v\u00e9nements du site pour le mois en cours. +dashlet.cmisfeed.shortName=Flux CMIS +dashlet.cmisfeed.description=Affiche une introduction \u00e0 CMIS et le flux du blog associ\u00e9 +dashlet.colleagues.shortName=Membres du site +dashlet.colleagues.description=Liste les membres du site collaboratif +dashlet.docsummary.shortName=Contenu du site +dashlet.docsummary.description=Composant de r\u00e9sum\u00e9 des documents +dashlet.my-activities.shortName=Mes activit\u00e9s +dashlet.my-activities.description=Liste les activit\u00e9s r\u00e9centes pour un utilisateur donn\u00e9. +dashlet.my-docs-editing.shortName=Documents \u00e9dit\u00e9s par moi +dashlet.my-docs-editing.description=Dashlet d'affichage des documents que j'\u00e9dite +dashlet.my-profile.shortName=Mon profil +dashlet.my-profile.description=Composant utilis\u00e9 pour afficher l'utilisateur actuel +dashlet.my-sites.shortName=Mes sites +dashlet.my-sites.description=Composant pour lister les sites auxquels appartient un utilisateur +dashlet.my-tasks.shortName=Mes t\u00e2ches +dashlet.my-tasks.description=Dashlet listant les t\u00e2ches assign\u00e9es \u00e0 l'utilisateur actuel +dashlet.my-workspaces.shortName=Mes espaces documentaires +dashlet.my-workspaces.description=Composant listant les espaces de travail auxquels appartient un utilisateur +dashlet.rssfeed.shortName=Flux RSS +dashlet.rssfeed.description=Afficher le contenu d'un flux RSS pass\u00e9 en param\u00e8tre. +dashlet.site-activities.shortName=Activit\u00e9s du site +dashlet.site-activities.description=Liste les activit\u00e9s r\u00e9centes d'un site donn\u00e9. +dashlet.site-links.shortName=Liens du site +dashlet.site-links.description=Composant listant les liens associ\u00e9s \u00e0 un utilisateur +dashlet.site-profile.shortName=Profil du site +dashlet.site-profile.description=Composant d'affichage du profil d'un site collaboratif +dashlet.user-calendar.shortName=Mon calendrier +dashlet.user-calendar.description=Liste les \u00e9v\u00e9nements d'un site pour un utilisateur. +dashlet.webview.shortName=Vue web +dashlet.webview.description=Affiche le contenu d'une URL pass\u00e9e en param\u00e8tre. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Affiche une page de wiki s\u00e9lectionn\u00e9e par l'utilisateur. +dashlet.my-meeting-workspaces.shortName=Mes espaces de r\u00e9union +dashlet.my-meeting-workspaces.description=Composant listant les espaces de r\u00e9union auxquels appartient un utilisateur +dashlet.my-documents.shortName=Mes documents +dashlet.my-documents.description=Dashlet listant les documents associ\u00e9s \u00e0 l'utilisateur courant +dashlet.imagesummary.shortName=Pr\u00e9visualisation d'images +dashlet.imagesummary.description=Vignette de biblioth\u00e8que d'images et pr\u00e9visualisation de composant de dashlet +dashlet.site-data-lists.shortName=Listes de donn\u00e9es du site +dashlet.site-data-lists.description=Composant affichant des listes de donn\u00e9es sur le site +dashlet.forum-summary.shortName=Mes discussions +dashlet.forum-summary.description=R\u00e9sum\u00e9 filtr\u00e9 des discussions de forum +dashlet.saved-search.shortName=Recherche sauvegard\u00e9e +dashlet.saved-search.description=Dashlet des recherches sauvegard\u00e9es +dashlet.site-search.shortName=Recherche de sites +dashlet.site-search.description=Dashlet de recherche de sites +dashlet.site-notice.shortName=Remarque sur le site +dashlet.site-notice.description=Ajouter une remarque personnalis\u00e9e pour les utilisateurs du site +dashlet.top-site-contributor-report.shortName=R\u00e9partition des contributeurs du site +dashlet.top-site-contributor-report.description=Affiche une r\u00e9partition indiquant le principal contributeur du site. +dashlet.site-content-report.shortName=R\u00e9partition des types de fichiers du site +dashlet.site-content-report.description=Affiche une r\u00e9partition des diff\u00e9rents types de fichiers du site. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_it.properties new file mode 100755 index 0000000000..0519c8bcec --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_it.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlet + +section.addDashlets=Aggiungi dashlet +link.close=Chiudi + +header.column=Colonna {0} +header.welcomePreference=Pannello Per iniziare + +welcomePanel.enabled=Mostra nel pannello di controllo +welcomePanel.disabled=Nascondi dal pannello di controllo + +section.myDashlets=I miei dashlet +label.instructions=Trascinare e rilasciare in una colonna i dashlet disponibili per aggiungerli al pannello di controllo. \u00c8 anche possibile riordinare i dashlet all'interno delle colonne trascinandoli e rilasciandoli. +label.keyboard-instruction1=Se si utilizza la tastiera, premere Tab per passare al dashlet successivo. Selezionare il dashlet e premere Invio per aggiungerlo alla colonna. Premere Esc per deselezionare un elemento. +label.keyboard-instruction2=Se si utilizza la tastiera, premere Tab per selezionare un dashlet. Utilizzare i tasti freccia per spostare il dashlet selezionato. Premere Esc per deselezionare un elemento. Premere Canc per cancellare un elemento. + +button.addDashlets=Aggiungi dashlet +button.hideDashlets=Nascondi dashlet + +button.save=OK +alt.delete=Elimina +help.trashcan=Trascinare i dashlet qui per rimuoverli da una colonna + +message.saving=Salvataggio della configurazione in corso... +message.saveFailure=Impossibile salvare i dashlet + +## Dashlet names and descriptions +dashlet.addons.shortName=Feed RSS add-on di Alfresco +dashlet.addons.description=Contiene le ultime news sugli add-on di Alfresco. +dashlet.calendar.shortName=Calendario del sito +dashlet.calendar.description=Elenca gli eventi del sito per il mese attuale. +dashlet.cmisfeed.shortName=Feed CMIS +dashlet.cmisfeed.description=Visualizza il contenuto dell'introduzione a CMIS e il feed del blog +dashlet.colleagues.shortName=Membri del sito +dashlet.colleagues.description=Elenca i colleghi che hanno aderito al sito di collaborazione +dashlet.docsummary.shortName=Contenuto del sito +dashlet.docsummary.description=Componente per il riepilogo dei documenti +dashlet.my-activities.shortName=Le mie attivit\u00e0 +dashlet.my-activities.description=Elenca le attivit\u00e0 recenti di un determinato utente. +dashlet.my-docs-editing.shortName=Contenuto che sto modificando +dashlet.my-docs-editing.description=Dashlet del contenuto che viene modificato dall'utente +dashlet.my-profile.shortName=Il mio profilo +dashlet.my-profile.description=Componente utilizzato per visualizzare l'utente attuale +dashlet.my-sites.shortName=I miei siti +dashlet.my-sites.description=Componente utilizzato per elencare i siti a cui appartiene l'utente +dashlet.my-tasks.shortName=I miei compiti +dashlet.my-tasks.description=Dashlet utilizzato per elencare i compiti assegnati all'utente attuale +dashlet.my-workspaces.shortName=I miei spazi di lavoro per documenti +dashlet.my-workspaces.description=Componente utilizzato per elencare gli spazi di lavoro a cui appartiene l'utente +dashlet.rssfeed.shortName=Feed RSS +dashlet.rssfeed.description=Visualizza il contenuto di un feed RSS in base a un parametro di configurazione dell'URL specificato. +dashlet.site-activities.shortName=Attivit\u00e0 del sito +dashlet.site-activities.description=Elenca le attivit\u00e0 recenti di un determinato sito. +dashlet.site-links.shortName=Link del sito +dashlet.site-links.description=Componente utilizzato per elencare i link a cui appartiene l'utente +dashlet.site-profile.shortName=Profilo del sito +dashlet.site-profile.description=Componente del profilo del sito utilizzato nel sito di collaborazione +dashlet.user-calendar.shortName=Il mio calendario +dashlet.user-calendar.description=Elenca gli eventi del sito per l'utente attuale. +dashlet.webview.shortName=Visualizzazione web +dashlet.webview.description=Visualizza il contenuto di un URI in base a un parametro di configurazione specificato. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Visualizza una pagina wiki selezionata dall'utente. +dashlet.my-meeting-workspaces.shortName=I miei spazi di lavoro per riunioni +dashlet.my-meeting-workspaces.description=Componente utilizzato per elencare gli spazi di lavoro per riunioni a cui appartiene l'utente +dashlet.my-documents.shortName=I miei documenti +dashlet.my-documents.description=Dashlet contenente l'elenco dei documenti dell'utente attuale +dashlet.imagesummary.shortName=Anteprima immagine +dashlet.imagesummary.description=Dashlet contenente le miniature e l'anteprima per la libreria di immagini +dashlet.site-data-lists.shortName=Elenchi dati del sito +dashlet.site-data-lists.description=Componente utilizzato per mostrare gli elenchi dati nel sito +dashlet.forum-summary.shortName=Le mie discussioni +dashlet.forum-summary.description=Riepilogo del forum di discussione filtrato +dashlet.saved-search.shortName=Ricerca salvata +dashlet.saved-search.description=Dashlet delle ricerche salvate +dashlet.site-search.shortName=Ricerca sito +dashlet.site-search.description=Dashlet per cercare i siti +dashlet.site-notice.shortName=Notifica sito +dashlet.site-notice.description=Consente di aggiungere una notifica personalizzata per gli utenti del sito +dashlet.top-site-contributor-report.shortName=Analisi collaboratori del sito +dashlet.top-site-contributor-report.description=Mostra visivamente chi ha collaborato maggiormente al sito con pi\u00f9 contenuti. +dashlet.site-content-report.shortName=Analisi tipi di file del sito +dashlet.site-content-report.description=Mostra una suddivisione visiva dei diversi tipi di file che compongono il sito. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_ja.properties new file mode 100755 index 0000000000..4dbe5cd113 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_ja.properties @@ -0,0 +1,83 @@ +header.dashlets=\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 + +section.addDashlets=\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306e\u8ffd\u52a0 +link.close=\u9589\u3058\u308b + +header.column=\u5217 {0} +header.welcomePreference=[\u30b9\u30bf\u30fc\u30c8\u30ac\u30a4\u30c9] \u30d1\u30cd\u30eb + +welcomePanel.enabled=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306b\u8868\u793a\u3059\u308b +welcomePanel.disabled=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306b\u8868\u793a\u3057\u306a\u3044 + +section.myDashlets=\u3042\u306a\u305f\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +label.instructions=\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306b\u8ffd\u52a0\u3059\u308b\u306b\u306f\u3001\u8868\u793a\u3057\u305f\u3044\u5217\u306b\u30c9\u30e9\u30c3\u30b0 & \u30c9\u30ed\u30c3\u30d7\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \u30c9\u30e9\u30c3\u30b0 & \u30c9\u30ed\u30c3\u30d7\u3067\u5217\u5185\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306e\u9806\u756a\u3092\u5909\u3048\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002 +label.keyboard-instruction1=\u30ad\u30fc\u30dc\u30fc\u30c9\u3092\u4f7f\u3063\u3066\u3044\u308b\u5834\u5408\u306f\u3001Tab \u30ad\u30fc\u3092\u62bc\u3059\u3068\u6b21\u306e\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306b\u79fb\u52d5\u3067\u304d\u307e\u3059\u3002 \u5217\u306b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u8ffd\u52a0\u3059\u308b\u306b\u306f\u3001\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u9078\u629e\u3057\u3066 Enter \u30ad\u30fc\u3092\u62bc\u3057\u307e\u3059\u3002 \u30a2\u30a4\u30c6\u30e0\u306e\u9078\u629e\u3092\u89e3\u9664\u3059\u308b\u306b\u306f\u3001Esc \u30ad\u30fc\u3092\u62bc\u3057\u307e\u3059\u3002 +label.keyboard-instruction2=\u30ad\u30fc\u30dc\u30fc\u30c9\u3092\u4f7f\u3063\u3066\u3044\u308b\u5834\u5408\u306f\u3001Tab \u30ad\u30fc\u3092\u4f7f\u3063\u3066\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u9078\u629e\u3067\u304d\u307e\u3059\u3002 \u9078\u629e\u3057\u3066\u3044\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u79fb\u52d5\u3059\u308b\u306b\u306f\u3001\u77e2\u5370\u30ad\u30fc\u3092\u4f7f\u3044\u307e\u3059\u3002 \u30a2\u30a4\u30c6\u30e0\u306e\u9078\u629e\u3092\u89e3\u9664\u3059\u308b\u306b\u306f\u3001Esc \u30ad\u30fc\u3092\u62bc\u3057\u307e\u3059\u3002 \u30a2\u30a4\u30c6\u30e0\u3092\u524a\u9664\u3059\u308b\u306b\u306f\u3001Delete \u30ad\u30fc\u3092\u62bc\u3057\u307e\u3059\u3002 + +button.addDashlets=\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306e\u8ffd\u52a0 +button.hideDashlets=\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u96a0\u3059 + +button.save=OK +alt.delete=\u524a\u9664 +help.trashcan=\u5217\u304b\u3089\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u524a\u9664\u3059\u308b\u306b\u306f\u3001\u3053\u3053\u306b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u30c9\u30e9\u30c3\u30b0\u3057\u307e\u3059 + +message.saving=\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059... +message.saveFailure=\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f + +## Dashlet names and descriptions +dashlet.addons.shortName=Alfresco \u30a2\u30c9\u30aa\u30f3\u306e RSS \u30d5\u30a3\u30fc\u30c9 +dashlet.addons.description=Alfresco \u30a2\u30c9\u30aa\u30f3\u306e\u6700\u65b0\u30cb\u30e5\u30fc\u30b9\u3002 +dashlet.calendar.shortName=\u30b5\u30a4\u30c8\u306e\u30ab\u30ec\u30f3\u30c0\u30fc +dashlet.calendar.description=\u4eca\u6708\u306e\u30b5\u30a4\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.cmisfeed.shortName=CMIS \u30d5\u30a3\u30fc\u30c9 +dashlet.cmisfeed.description=CMIS \u306e\u7d39\u4ecb\u6587\u3068\u30d6\u30ed\u30b0\u30d5\u30a3\u30fc\u30c9\u306e\u5185\u5bb9\u3092\u8868\u793a\u3057\u307e\u3059 +dashlet.colleagues.shortName=\u30b5\u30a4\u30c8\u30e1\u30f3\u30d0\u30fc +dashlet.colleagues.description=\u30b3\u30e9\u30dc\u30ec\u30fc\u30b7\u30e7\u30f3\u30b5\u30a4\u30c8\u306e\u4ed6\u306e\u30e1\u30f3\u30d0\u30fc\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059 +dashlet.docsummary.shortName=\u30b5\u30a4\u30c8\u306e\u30b3\u30f3\u30c6\u30f3\u30c4 +dashlet.docsummary.description=\u6587\u66f8\u306e\u6982\u8981\u3092\u8868\u793a\u3057\u307e\u3059 +dashlet.my-activities.shortName=\u3042\u306a\u305f\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3 +dashlet.my-activities.description=\u7279\u5b9a\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.my-docs-editing.shortName=\u3042\u306a\u305f\u304c\u7de8\u96c6\u4e2d\u306e\u30b3\u30f3\u30c6\u30f3\u30c4 +dashlet.my-docs-editing.description=\u3042\u306a\u305f\u304c\u7de8\u96c6\u4e2d\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.my-profile.shortName=\u3042\u306a\u305f\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb +dashlet.my-profile.description=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.my-sites.shortName=\u3042\u306a\u305f\u306e\u30b5\u30a4\u30c8 +dashlet.my-sites.description=\u30e6\u30fc\u30b6\u30fc\u304c\u5c5e\u3059\u308b\u30b5\u30a4\u30c8\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.my-tasks.shortName=\u3042\u306a\u305f\u306e\u30bf\u30b9\u30af +dashlet.my-tasks.description=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u308b\u30bf\u30b9\u30af\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.my-workspaces.shortName=\u3042\u306a\u305f\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9 +dashlet.my-workspaces.description=\u30e6\u30fc\u30b6\u30fc\u304c\u5c5e\u3059\u308b\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.rssfeed.shortName=RSS \u30d5\u30a3\u30fc\u30c9 +dashlet.rssfeed.description=\u6307\u5b9a\u3057\u305f URL \u8a2d\u5b9a\u30d1\u30e9\u30e1\u30fc\u30bf\u306e RSS \u30d5\u30a3\u30fc\u30c9\u306e\u5185\u5bb9\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.site-activities.shortName=\u30b5\u30a4\u30c8\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3 +dashlet.site-activities.description=\u30b5\u30a4\u30c8\u306e\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.site-links.shortName=\u30b5\u30a4\u30c8\u306e\u30ea\u30f3\u30af +dashlet.site-links.description=\u30e6\u30fc\u30b6\u30fc\u306e\u30ea\u30f3\u30af\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.site-profile.shortName=\u30b5\u30a4\u30c8\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb +dashlet.site-profile.description=\u30b3\u30e9\u30dc\u30ec\u30fc\u30b7\u30e7\u30f3\u30b5\u30a4\u30c8\u306e\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.user-calendar.shortName=\u3042\u306a\u305f\u306e\u30ab\u30ec\u30f3\u30c0\u30fc +dashlet.user-calendar.description=\u30e6\u30fc\u30b6\u30fc\u304c\u5c5e\u3059\u308b\u30b5\u30a4\u30c8\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u3002 +dashlet.webview.shortName=Web \u30d3\u30e5\u30fc +dashlet.webview.description=\u6307\u5b9a\u3057\u305f URI \u8a2d\u5b9a\u30d1\u30e9\u30e1\u30fc\u30bf\u306e URI \u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=\u30e6\u30fc\u30b6\u30fc\u304c\u9078\u629e\u3057\u305f Wiki \u30da\u30fc\u30b8\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.my-meeting-workspaces.shortName=\u3042\u306a\u305f\u306e\u4f1a\u8b70\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9 +dashlet.my-meeting-workspaces.description=\u30e6\u30fc\u30b6\u30fc\u304c\u5c5e\u3059\u308b\u4f1a\u8b70\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.my-documents.shortName=\u3042\u306a\u305f\u306e\u6587\u66f8 +dashlet.my-documents.description=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u306b\u95a2\u9023\u3059\u308b\u6587\u66f8\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.imagesummary.shortName=\u753b\u50cf\u30d7\u30ec\u30d3\u30e5\u30fc +dashlet.imagesummary.description=\u753b\u50cf\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.site-data-lists.shortName=\u30b5\u30a4\u30c8\u306e\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8 +dashlet.site-data-lists.description=\u30b5\u30a4\u30c8\u306e\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3059\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.forum-summary.shortName=\u3042\u306a\u305f\u306e\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3 +dashlet.forum-summary.description=\u30d5\u30a3\u30eb\u30bf\u3057\u305f\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3\u30d5\u30a9\u30fc\u30e9\u30e0\u306e\u8981\u7d04 +dashlet.saved-search.shortName=\u4fdd\u5b58\u3057\u305f\u691c\u7d22\u6761\u4ef6 +dashlet.saved-search.description=\u4ee5\u524d\u306e\u691c\u7d22\u6761\u4ef6\u304c\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.site-search.shortName=\u30b5\u30a4\u30c8\u5185\u306e\u691c\u7d22 +dashlet.site-search.description=\u30b5\u30a4\u30c8\u306e\u691c\u7d22\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8 +dashlet.site-notice.shortName=\u30b5\u30a4\u30c8\u306e\u304a\u77e5\u3089\u305b +dashlet.site-notice.description=\u30b5\u30a4\u30c8\u30e6\u30fc\u30b6\u30fc\u3078\u306e\u304a\u77e5\u3089\u305b\u3092\u8ffd\u52a0\u3067\u304d\u307e\u3059 +dashlet.top-site-contributor-report.shortName=\u30b5\u30a4\u30c8\u306e\u6295\u7a3f\u8005\u306e\u5185\u8a33 +dashlet.top-site-contributor-report.description=\u3053\u306e\u30b5\u30a4\u30c8\u306b\u6700\u3082\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u6295\u7a3f\u3057\u305f\u4eba\u306e\u5185\u8a33\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +dashlet.site-content-report.shortName=\u30b5\u30a4\u30c8\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u7a2e\u985e\u306e\u5185\u8a33 +dashlet.site-content-report.description=\u30b5\u30a4\u30c8\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u7a2e\u985e\u306e\u5185\u8a33\u3092\u8868\u793a\u3057\u307e\u3059\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_nb.properties new file mode 100755 index 0000000000..5eef43e43a --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_nb.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=Legg til dashlets +link.close=Lukk + +header.column=Kolonne {0} +header.welcomePreference=Panel for \u00e5 sette i gang + +welcomePanel.enabled=Vis dashbordet +welcomePanel.disabled=Skjul fra dashbordet + +section.myDashlets=Mine dashlets +label.instructions=Dra og slipp tilgjengelige dashlets inn i en kolonne for \u00e5 legge dem til dashbordet. Du kan ogs\u00e5 sortere dashlets i kolonnene ved \u00e5 dra og slippe dem. +label.keyboard-instruction1=Bruk tabuleringstasten for \u00e5 flytte til neste dashlet hvis du bruker tastaturet. Velg dashlet, og trykk p\u00e5 Enter for \u00e5 legge til kolonne. Trykk p\u00e5 ESC-tasten for \u00e5 velge bort et element. +label.keyboard-instruction2=Bruk tabuleringstasten for \u00e5 velge en dashlet hvis du bruker tastaturet. Bruk pil-tasten for \u00e5 flytte den valgte dashlet. Trykk p\u00e5 ESC-tasten for velge bort et element. Trykk p\u00e5 DEL-tasten for \u00e5 slette et element. + +button.addDashlets=Legg til dashlets +button.hideDashlets=Skjul dashlets + +button.save=OK +alt.delete=Slett +help.trashcan=Dra dashlets her for \u00e5 fjerne dem fra en kolonne + +message.saving=Lagrer konfigurasjon... +message.saveFailure=Kan ikke lagre dashlets + +## Dashlet names and descriptions +dashlet.addons.shortName=Alfrescos RSS-feed for tilleggsprogrammer +dashlet.addons.description=Siste nyheter fra Alfresco-tilleggsprogrammer. +dashlet.calendar.shortName=Omr\u00e5dekalender +dashlet.calendar.description=Viser omr\u00e5dehendelser for gjeldende m\u00e5ned. +dashlet.cmisfeed.shortName=CMIS-feed +dashlet.cmisfeed.description=Vis innholdet til CMIS-innledningstekst og bloggfeed +dashlet.colleagues.shortName=Omr\u00e5demedlemmer +dashlet.colleagues.description=Viser kolleger p\u00e5 samarbeidsomr\u00e5det +dashlet.docsummary.shortName=Omr\u00e5deinnhold +dashlet.docsummary.description=Dokumentsammendragskomponent +dashlet.my-activities.shortName=Mine aktiviteter +dashlet.my-activities.description=Viser nylige aktiviteter for en bestemt bruker. +dashlet.my-docs-editing.shortName=Innhold jeg redigerer +dashlet.my-docs-editing.description=Dashlet for innhold jeg redigerer +dashlet.my-profile.shortName=Min profil +dashlet.my-profile.description=Komponent som brukes til \u00e5 vise gjeldende bruker +dashlet.my-sites.shortName=Mine omr\u00e5der +dashlet.my-sites.description=Komponent som brukes til \u00e5 vise omr\u00e5der som en bruker tilh\u00f8rer +dashlet.my-tasks.shortName=Mine oppgaver +dashlet.my-tasks.description=Dashlet for \u00e5 vise oppgaver som er tilordnet den gjeldende brukeren +dashlet.my-workspaces.shortName=Mine dokumentarbeidsomr\u00e5der +dashlet.my-workspaces.description=Komponent som brukes til \u00e5 vise arbeidsomr\u00e5der som en bruker tilh\u00f8rer +dashlet.rssfeed.shortName=RSS-feed +dashlet.rssfeed.description=Vis innholdet til en RSS-feed som har en URL-konfigurasjonsparameter. +dashlet.site-activities.shortName=Omr\u00e5deaktiviteter +dashlet.site-activities.description=Viser nylige aktiviteter for et bestemt omr\u00e5de. +dashlet.site-links.shortName=Omr\u00e5dekoblinger +dashlet.site-links.description=Komponent som brukes til \u00e5 listef\u00f8re koblinger som en bruker tilh\u00f8rer +dashlet.site-profile.shortName=Omr\u00e5deprofil +dashlet.site-profile.description=Omr\u00e5deprofilkomponent som brukes p\u00e5 samarbeidsomr\u00e5det +dashlet.user-calendar.shortName=Min kalender +dashlet.user-calendar.description=Viser omr\u00e5dehendelser for den gjeldende brukeren. +dashlet.webview.shortName=Webvisning +dashlet.webview.description=Viser innholdet til en URI som har en URI-konfigurasjonsparameter. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Vis en Wiki-side som er valgt av brukeren. +dashlet.my-meeting-workspaces.shortName=Mine m\u00f8tearbeidsomr\u00e5der +dashlet.my-meeting-workspaces.description=Komponent som brukes til \u00e5 vise m\u00f8tearbeidsomr\u00e5der som en bruker tilh\u00f8rer +dashlet.my-documents.shortName=Mine dokumenter +dashlet.my-documents.description=Dashlet for \u00e5 vise dokumenter som er knyttet til den gjeldende brukeren +dashlet.imagesummary.shortName=Bildeforh\u00e5ndsvisning +dashlet.imagesummary.description=Dashletkomponent for miniatyrbilde av bildebibliotek og forh\u00e5ndsvisning +dashlet.site-data-lists.shortName=Omr\u00e5dets datalister +dashlet.site-data-lists.description=Komponent som brukes til \u00e5 vise datalister p\u00e5 omr\u00e5det +dashlet.forum-summary.shortName=Mine diskusjoner +dashlet.forum-summary.description=Filtrert diskusjonsforum-oppsummering +dashlet.saved-search.shortName=Lagre s\u00f8k +dashlet.saved-search.description=Lagret s\u00f8kedashlet +dashlet.site-search.shortName=Omr\u00e5des\u00f8k +dashlet.site-search.description=Omr\u00e5des\u00f8kdashlet +dashlet.site-notice.shortName=Omr\u00e5demerknad +dashlet.site-notice.description=Legg til en personlig notis som skal vises til brukere p\u00e5 omr\u00e5det +dashlet.top-site-contributor-report.shortName=Liste over omr\u00e5debidragsytere +dashlet.top-site-contributor-report.description=Vis en synlig liste med hvem som er stedets st\u00f8rste bidragsyter. +dashlet.site-content-report.shortName=Liste over typer stedsfiler +dashlet.site-content-report.description=Det en synlig liste med stedets forskjellige filtyper. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_nl.properties new file mode 100755 index 0000000000..2f8c44c299 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_nl.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=Dashlets toevoegen +link.close=Sluiten + +header.column=Kolom {0} +header.welcomePreference=Deelvenster Aan de slag + +welcomePanel.enabled=Tonen op dashboard +welcomePanel.disabled=Verbergen op dashboard + +section.myDashlets=Mijn dashlets +label.instructions=Sleep de beschikbare dashlets naar een kolom om ze toe te voegen aan uw dashboard. U kunt de volgorde van de dashlets in de kolommen ook wijzigen door ze te slepen. +label.keyboard-instruction1=Bij gebruik van het toetsenbord drukt u op de Tab-toets om naar de volgende dashlet te gaan. Selecteer de dashlet en druk op Enter om een kolom toe te voegen. Druk op de Esc-toets om de selectie van een item op te heffen. +label.keyboard-instruction2=Bij gebruik van het toetsenbord drukt u op de Tab-toets om een dashlet te selecteren. Gebruik de pijltoetsen om de geselecteerde dashlet te verplaatsen. Druk op Escape om de selectie van een item op te heffen. Druk op Delete om een item te verwijderen. + +button.addDashlets=Dashlets toevoegen +button.hideDashlets=Dashlets verbergen + +button.save=OK +alt.delete=Verwijderen +help.trashcan=Sleep dashlets hierheen om ze uit een kolom te verwijderen + +message.saving=Configuratie opslaan... +message.saveFailure=Kan dashlets niet opslaan + +## Dashlet names and descriptions +dashlet.addons.shortName=RSS-feed Alfresco add-ons +dashlet.addons.description=Het laatste nieuws over Alfresco add-ons. +dashlet.calendar.shortName=Site-agenda +dashlet.calendar.description=Hiermee geeft u de sitegebeurtenissen voor de huidige maand weer. +dashlet.cmisfeed.shortName=CMIS-feed +dashlet.cmisfeed.description=Hiermee geeft u de inhoud weer van de CMIS-introductietekst en -blogfeed +dashlet.colleagues.shortName=Sitemedewerkers +dashlet.colleagues.description=Hiermee geeft u collega's van de samenwerkingssite weer +dashlet.docsummary.shortName=Sitecontent +dashlet.docsummary.description=Onderdeel van documentsamenvatting +dashlet.my-activities.shortName=Mijn activiteiten +dashlet.my-activities.description=Hiermee geeft u de recente activiteiten van een opgegeven gebruiker weer. +dashlet.my-docs-editing.shortName=Content die ik bewerk +dashlet.my-docs-editing.description=Dashlet Content die ik bewerk +dashlet.my-profile.shortName=Mijn profiel +dashlet.my-profile.description=Onderdeel waarmee de huidige gebruiker wordt weergegeven +dashlet.my-sites.shortName=Mijn sites +dashlet.my-sites.description=Onderdeel waarmee de sites worden weergegeven waarbij een gebruiker hoort +dashlet.my-tasks.shortName=Mijn taken +dashlet.my-tasks.description=Dashlet om taken weer te geven die zijn toegewezen aan de huidige gebruiker +dashlet.my-workspaces.shortName=Mijn documentwerkruimtes +dashlet.my-workspaces.description=Onderdeel waarmee de werkruimtes worden weergegeven waarbij een gebruiker hoort +dashlet.rssfeed.shortName=RSS-feed +dashlet.rssfeed.description=Hiermee geeft u de inhoud van een RSS-feed weer op basis van de opgegeven URL-configuratieparameter. +dashlet.site-activities.shortName=Site-activiteiten +dashlet.site-activities.description=Hiermee geeft u de recente activiteiten van een opgegeven site weer. +dashlet.site-links.shortName=Sitekoppelingen +dashlet.site-links.description=Onderdeel waarmee de koppelingen worden weergegeven waarbij een gebruiker hoort +dashlet.site-profile.shortName=Siteprofiel +dashlet.site-profile.description=Siteprofielonderdeel dat wordt gebruikt op de samenwerkingssite +dashlet.user-calendar.shortName=Mijn agenda +dashlet.user-calendar.description=Hiermee geeft u de sitegebeurtenissen weer voor de huidige gebruiker. +dashlet.webview.shortName=Webweergave +dashlet.webview.description=Hiermee geeft u de inhoud van een URI weer op basis van de opgegeven URI-configuratieparameter. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Hiermee geeft u een wiki-pagina weer die is geselecteerd door de gebruiker. +dashlet.my-meeting-workspaces.shortName=Mijn vergaderwerkruimtes +dashlet.my-meeting-workspaces.description=Onderdeel waarmee de vergaderwerkruimtes worden weergegeven waarbij een gebruiker hoort +dashlet.my-documents.shortName=Mijn documenten +dashlet.my-documents.description=Dashlet om documenten weer te geven die zijn gekoppeld aan de huidige gebruiker +dashlet.imagesummary.shortName=Afbeeldingspreview +dashlet.imagesummary.description=Miniatuur van afbeeldingsbibliotheek en previewdashletonderdeel +dashlet.site-data-lists.shortName=Site-gegevenslijsten +dashlet.site-data-lists.description=Onderdeel waarmee gegevenslijsten op de site worden weergegeven +dashlet.forum-summary.shortName=Mijn discussies +dashlet.forum-summary.description=Overzicht gefilterd discussieforum +dashlet.saved-search.shortName=Opgeslagen zoekopdracht +dashlet.saved-search.description=Dashlet voor opgeslagen zoekopdracht +dashlet.site-search.shortName=Site doorzoeken +dashlet.site-search.description=Dashlet voor doorzoeken van site +dashlet.site-notice.shortName=Sitebericht +dashlet.site-notice.description=Een aangepast bericht toevoegen voor gebruikers van de site +dashlet.top-site-contributor-report.shortName=Uitsplitsing sitebijdrager +dashlet.top-site-contributor-report.description=Geeft een visuele uitsplitsing weer van wie de meeste content heeft bijgedragen aan de site. +dashlet.site-content-report.shortName=Uitsplitsing sitebestandstypen +dashlet.site-content-report.description=Geeft een visuele uitsplitsing weer van de verschillende bestandstypen van de site. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_pt_BR.properties new file mode 100644 index 0000000000..5577b4fa6d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_pt_BR.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlets + +section.addDashlets=Adicionar dashlets +link.close=Fechar + +header.column=Coluna {0} +header.welcomePreference=Painel Iniciar + +welcomePanel.enabled=Mostrar no painel +welcomePanel.disabled=Ocultar do painel + +section.myDashlets=Meus dashlets +label.instructions=Arraste e solte os dashlets dispon\u00edveis para uma coluna a fim de adicion\u00e1-los ao seu painel. Tamb\u00e9m \u00e9 poss\u00edvel reordenar os dashlets dentro das colunas usando o recurso de arrastar e soltar. +label.keyboard-instruction1=Ao utilizar o teclado, use a tecla Tab para ir para a pr\u00f3xima dashlet. Selecione o dashlet e pressione Enter para adicionar na coluna. Pressione a tecla Esc para cancelar a sele\u00e7\u00e3o de um item. +label.keyboard-instruction2=Ao utilizar o teclado, use a tecla Tab para selecionar um dashlet. Use as teclas de seta para mover o dashlet selecionado. Pressione Escape para cancelar a sele\u00e7\u00e3o de um item. Pressione a tecla Delete para excluir um item. + +button.addDashlets=Adicionar dashlets +button.hideDashlets=Ocultar dashlets + +button.save=OK +alt.delete=Excluir +help.trashcan=Arraste os dashlets para c\u00e1 a fim de remov\u00ea-los de uma coluna + +message.saving=Salvando a configura\u00e7\u00e3o... +message.saveFailure=N\u00e3o foi poss\u00edvel salvar os dashlets + +## Dashlet names and descriptions +dashlet.addons.shortName=Feed RSS de Alfresco Add-ons +dashlet.addons.description=As \u00faltimas not\u00edcias de Alfresco Add-ons. +dashlet.calendar.shortName=Calend\u00e1rio do site +dashlet.calendar.description=Lista os eventos do site para o m\u00eas atual. +dashlet.cmisfeed.shortName=Feed CMIS +dashlet.cmisfeed.description=Exibe o conte\u00fado do texto de introdu\u00e7\u00e3o de CMIS e do feed de blog +dashlet.colleagues.shortName=Membros do site +dashlet.colleagues.description=Lista colegas no site de colabora\u00e7\u00e3o +dashlet.docsummary.shortName=Conte\u00fado do site +dashlet.docsummary.description=Componente de resumo do documento +dashlet.my-activities.shortName=Minhas atividades +dashlet.my-activities.description=Lista as atividades recentes de determinado usu\u00e1rio. +dashlet.my-docs-editing.shortName=Conte\u00fado que estou editando +dashlet.my-docs-editing.description=Dashlet de conte\u00fado que estou editando +dashlet.my-profile.shortName=Meu perfil +dashlet.my-profile.description=Componente usado para exibir o usu\u00e1rio atual +dashlet.my-sites.shortName=Meus sites +dashlet.my-sites.description=Componente usado para listar os sites aos quais um usu\u00e1rio pertence +dashlet.my-tasks.shortName=Minhas tarefas +dashlet.my-tasks.description=Dashlet para listar as tarefas atribu\u00eddas ao usu\u00e1rio atual +dashlet.my-workspaces.shortName=Meus espa\u00e7os de trabalho de documentos +dashlet.my-workspaces.description=Componente usado para listar os espa\u00e7os de trabalho aos quais um usu\u00e1rio pertence +dashlet.rssfeed.shortName=Feed RSS +dashlet.rssfeed.description=Exibe o conte\u00fado de um feed RSS levando em conta um par\u00e2metro de configura\u00e7\u00e3o de URL. +dashlet.site-activities.shortName=Atividades do site +dashlet.site-activities.description=Lista as atividades recentes de um determinado site. +dashlet.site-links.shortName=Links do site +dashlet.site-links.description=Componente usado para listar os links aos quais um usu\u00e1rio pertence +dashlet.site-profile.shortName=Perfil do site +dashlet.site-profile.description=Componente do perfil do site usado no site de colabora\u00e7\u00e3o +dashlet.user-calendar.shortName=Meu calend\u00e1rio +dashlet.user-calendar.description=Lista os eventos do site para o usu\u00e1rio atual. +dashlet.webview.shortName=Exibi\u00e7\u00e3o da Web +dashlet.webview.description=Exibe o conte\u00fado de um URI levando em conta um par\u00e2metro de configura\u00e7\u00e3o de URI. +dashlet.wiki.shortName=Wiki +dashlet.wiki.description=Exibe uma p\u00e1gina de wiki selecionada pelo usu\u00e1rio. +dashlet.my-meeting-workspaces.shortName=Meus espa\u00e7os de trabalho para reuni\u00e3o +dashlet.my-meeting-workspaces.description=Componente usado para listar os espa\u00e7os de trabalho para reuni\u00e3o aos quais um usu\u00e1rio pertence +dashlet.my-documents.shortName=Meus documentos +dashlet.my-documents.description=Dashlet que lista documentos associados ao usu\u00e1rio atual +dashlet.imagesummary.shortName=Visualiza\u00e7\u00e3o de imagem +dashlet.imagesummary.description=Componente de dashlet de visualiza\u00e7\u00e3o e miniatura da biblioteca de imagens +dashlet.site-data-lists.shortName=Listas de dados do site +dashlet.site-data-lists.description=Componente usado para mostrar as Listas de dados no site +dashlet.forum-summary.shortName=Minhas discuss\u00f5es +dashlet.forum-summary.description=Resumo do f\u00f3rum de discuss\u00e3o filtrado +dashlet.saved-search.shortName=Pesquisa salva +dashlet.saved-search.description=Dashlet de pesquisa salva +dashlet.site-search.shortName=Pesquisa do site +dashlet.site-search.description=Dashlet de pesquisa do site +dashlet.site-notice.shortName=Aviso de site +dashlet.site-notice.description=Adiciona uma mensagem personalizada para exibir aos usu\u00e1rios do site +dashlet.top-site-contributor-report.shortName=An\u00e1lise do colaborador do site +dashlet.top-site-contributor-report.description=Mostra um an\u00e1lise visual de quem colaborou com mais conte\u00fado para o site. +dashlet.site-content-report.shortName=An\u00e1lise do tipo de arquivo do site +dashlet.site-content-report.description=Mostra um an\u00e1lise visual dos tipos de arquivos diferentes do site. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_ru.properties new file mode 100755 index 0000000000..1416879f8d --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_ru.properties @@ -0,0 +1,83 @@ +header.dashlets=\u0414\u0430\u0448\u043b\u0435\u0442\u044b + +section.addDashlets=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0448\u043b\u0435\u0442\u044b +link.close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c + +header.column=\u0421\u0442\u043e\u043b\u0431\u0435\u0446 {0} +header.welcomePreference=\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c + +welcomePanel.enabled=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 +welcomePanel.disabled=\u0421\u043a\u0440\u044b\u0442\u044c \u0441 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b + +section.myDashlets=\u041c\u043e\u0438 \u0434\u0430\u0448\u043b\u0435\u0442\u044b +label.instructions=\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u0430\u0448\u043b\u0435\u0442\u044b \u0432 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u0432\u043e\u044e \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u044f, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0430\u0448\u043b\u0435\u0442\u043e\u0432 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435. +label.keyboard-instruction1=\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0434\u0430\u0448\u043b\u0435\u0442\u0443 \u0441\u043b\u0443\u0436\u0438\u0442 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Tab. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0448\u043b\u0435\u0442 \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Enter, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0442\u043e\u043b\u0431\u0435\u0446. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Esc, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. +label.keyboard-instruction2=\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0448\u043b\u0435\u0442\u0430 \u0441\u043b\u0443\u0436\u0438\u0442 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Tab. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0430\u0448\u043b\u0435\u0442\u0430 \u0441\u043b\u0443\u0436\u0430\u0442 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u0441\u043d\u044f\u0442\u0438\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Escape. \u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Delete. + +button.addDashlets=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0448\u043b\u0435\u0442\u044b +button.hideDashlets=\u0421\u043a\u0440\u044b\u0442\u044c \u0434\u0430\u0448\u043b\u0435\u0442\u044b + +button.save=OK +alt.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +help.trashcan=\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0434\u0430\u0448\u043b\u0435\u0442\u044b \u0441\u044e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 + +message.saving=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f... +message.saveFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u0448\u043b\u0435\u0442\u044b + +## Dashlet names and descriptions +dashlet.addons.shortName=RSS-\u043a\u0430\u043d\u0430\u043b Alfresco Add-ons +dashlet.addons.description=\u041d\u0435\u0434\u0430\u0432\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0441\u0430\u0439\u0442\u0430 Alfresco Add-ons. +dashlet.calendar.shortName=\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c \u0441\u0430\u0439\u0442\u0430 +dashlet.calendar.description=\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435. +dashlet.cmisfeed.shortName=\u041a\u0430\u043d\u0430\u043b CMIS +dashlet.cmisfeed.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u0432\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 CMIS \u0438 \u043a\u0430\u043d\u0430\u043b \u0431\u043b\u043e\u0433\u0430 +dashlet.colleagues.shortName=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 +dashlet.colleagues.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043b\u043b\u0435\u0433 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 +dashlet.docsummary.shortName=\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b +dashlet.docsummary.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u0432\u043e\u0434\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 +dashlet.my-activities.shortName=\u041c\u043e\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f +dashlet.my-activities.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +dashlet.my-docs-editing.shortName=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043c\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 +dashlet.my-docs-editing.description=\u0414\u0430\u0448\u043b\u0435\u0442 \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043c\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 +dashlet.my-profile.shortName=\u041c\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c +dashlet.my-profile.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 +dashlet.my-sites.shortName=\u041c\u043e\u0438 \u0441\u0430\u0439\u0442\u044b +dashlet.my-sites.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +dashlet.my-tasks.shortName=\u041c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 +dashlet.my-tasks.description=\u0414\u0430\u0448\u043b\u0435\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e +dashlet.my-workspaces.shortName=\u041c\u043e\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 +dashlet.my-workspaces.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +dashlet.rssfeed.shortName=RSS-\u043a\u0430\u043d\u0430\u043b +dashlet.rssfeed.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442 RSS-\u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 URL. +dashlet.site-activities.shortName=\u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0441\u0430\u0439\u0442\u0430 +dashlet.site-activities.description=\u0421\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430. +dashlet.site-links.shortName=\u0421\u0441\u044b\u043b\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 +dashlet.site-links.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 +dashlet.site-profile.shortName=\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0430\u0439\u0442\u0430 +dashlet.site-profile.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0441\u0430\u0439\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b +dashlet.user-calendar.shortName=\u041c\u043e\u0439 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c +dashlet.user-calendar.description=\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. +dashlet.webview.shortName=\u0412\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 +dashlet.webview.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442 URI \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 URI. +dashlet.wiki.shortName=\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a +dashlet.wiki.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. +dashlet.my-meeting-workspaces.shortName=\u041c\u043e\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0441\u0442\u0440\u0435\u0447 +dashlet.my-meeting-workspaces.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u0432\u0441\u0442\u0440\u0435\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +dashlet.my-documents.shortName=\u041c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b +dashlet.my-documents.description=\u0414\u0430\u0448\u043b\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c +dashlet.imagesummary.shortName=\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 +dashlet.imagesummary.description=\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441 \u044d\u0441\u043a\u0438\u0437\u0430\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0430\u0448\u043b\u0435\u0442\u0430 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 +dashlet.site-data-lists.shortName=\u0421\u043f\u0438\u0441\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u0430 +dashlet.site-data-lists.description=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 +dashlet.forum-summary.shortName=\u041c\u043e\u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f +dashlet.forum-summary.description=\u0421\u0432\u043e\u0434\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0444\u043e\u0440\u0443\u043c\u0430, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u0432\u0430\u0448\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c +dashlet.saved-search.shortName=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a +dashlet.saved-search.description=\u0414\u0430\u0448\u043b\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 +dashlet.site-search.shortName=\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0441\u0430\u0439\u0442\u0443 +dashlet.site-search.description=\u0414\u0430\u0448\u043b\u0435\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u0430\u0439\u0442\u0443 +dashlet.site-notice.shortName=\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 +dashlet.site-notice.description=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0430\u0439\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c +dashlet.top-site-contributor-report.shortName=\u0420\u0430\u0437\u0431\u0438\u0432\u043a\u0430 \u043f\u043e \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u0430\u0439\u0442\u0430 +dashlet.top-site-contributor-report.description=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0443 \u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e. +dashlet.site-content-report.shortName=\u0420\u0430\u0437\u0431\u0438\u0432\u043a\u0430 \u0441\u0430\u0439\u0442\u0430 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0444\u0430\u0439\u043b\u043e\u0432 +dashlet.site-content-report.description=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0443 \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0430\u0439\u0442\u0430. diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_zh_CN.properties new file mode 100755 index 0000000000..c6ba1f21d0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-dashlets.get_zh_CN.properties @@ -0,0 +1,83 @@ +header.dashlets=Dashlet + +section.addDashlets=\u6dfb\u52a0 Dashlet +link.close=\u5173\u95ed + +header.column=\u7b2c {0} \u5217 +header.welcomePreference=\u5f00\u59cb\u9762\u677f + +welcomePanel.enabled=\u5728\u4eea\u8868\u677f\u4e0a\u663e\u793a +welcomePanel.disabled=\u5728\u4eea\u8868\u677f\u4e2d\u9690\u85cf + +section.myDashlets=\u6211\u7684 Dashlet +label.instructions=\u5c06\u53ef\u7528 Dashlet \u62d6\u653e\u5230\u5217\u4e2d\uff0c\u7136\u540e\u5c06\u5176\u6dfb\u52a0\u5230\u60a8\u7684\u4eea\u8868\u677f\u3002 \u4e5f\u53ef\u5728\u5217\u5185\u4f7f\u7528\u62d6\u653e\u64cd\u4f5c\u91cd\u65b0\u4e3a Dashlet \u6392\u5e8f\u3002 +label.keyboard-instruction1=\u4f7f\u7528\u952e\u76d8\u65f6\uff0c\u4f7f\u7528 Tab \u952e\u79fb\u81f3\u4e0b\u4e00\u4e2a Dashlet\u3002 \u9009\u62e9 Dashlet \u5e76\u6309 Enter \u952e\u4ee5\u6dfb\u52a0\u81f3\u5217\u3002 \u6309 Esc \u952e\u4ee5\u53d6\u6d88\u9009\u62e9\u9879\u76ee\u3002 +label.keyboard-instruction2=\u4f7f\u7528\u952e\u76d8\u65f6\uff0c\u4f7f\u7528 Tab \u952e\u9009\u62e9\u4e00\u4e2a Dashlet\u3002 \u4f7f\u7528\u7bad\u5934\u952e\u79fb\u52a8\u9009\u5b9a\u7684 Dashlet\u3002 \u6309 Escape \u952e\u53d6\u6d88\u9009\u62e9\u9879\u76ee\u3002 \u6309 Delete \u952e\u5220\u9664\u9879\u76ee\u3002 + +button.addDashlets=\u6dfb\u52a0 Dashlet +button.hideDashlets=\u9690\u85cf Dashlet + +button.save=\u786e\u5b9a +alt.delete=\u5220\u9664 +help.trashcan=\u5c06 Dashlet \u62d6\u5230\u6b64\u5904\u5373\u53ef\u5c06\u5176\u4ece\u5217\u4e2d\u79fb\u9664 + +message.saving=\u6b63\u5728\u4fdd\u5b58\u914d\u7f6e... +message.saveFailure=\u65e0\u6cd5\u4fdd\u5b58 Dashlet + +## Dashlet names and descriptions +dashlet.addons.shortName=Alfresco Add-ons RSS \u8ba2\u9605\u6e90 +dashlet.addons.description=\u6765\u81ea Alfresco Add-ons \u7684\u6700\u65b0\u65b0\u95fb\u3002 +dashlet.calendar.shortName=\u7ad9\u70b9\u65e5\u5386 +dashlet.calendar.description=\u5217\u51fa\u5f53\u6708\u7684\u7ad9\u70b9\u4e8b\u4ef6\u3002 +dashlet.cmisfeed.shortName=CMIS \u8ba2\u9605\u6e90 +dashlet.cmisfeed.description=\u663e\u793a CMIS \u4ecb\u7ecd\u6587\u672c\u548c\u535a\u5ba2\u8ba2\u9605\u6e90\u7684\u5185\u5bb9 +dashlet.colleagues.shortName=\u7ad9\u70b9\u6210\u5458 +dashlet.colleagues.description=\u5217\u51fa\u5408\u4f5c\u7ad9\u70b9\u4e2d\u7684\u540c\u4e8b +dashlet.docsummary.shortName=\u7ad9\u70b9\u5185\u5bb9 +dashlet.docsummary.description=\u6587\u6863\u6458\u8981\u7ec4\u4ef6 +dashlet.my-activities.shortName=\u6211\u7684\u6d3b\u52a8 +dashlet.my-activities.description=\u5217\u51fa\u6307\u5b9a\u7528\u6237\u7684\u6700\u8fd1\u6d3b\u52a8\u3002 +dashlet.my-docs-editing.shortName=\u6211\u6b63\u5728\u7f16\u8f91\u7684\u5185\u5bb9 +dashlet.my-docs-editing.description=''\u6211\u6b63\u5728\u7f16\u8f91\u7684\u5185\u5bb9''Dashlet +dashlet.my-profile.shortName=\u6211\u7684\u4e2a\u4eba\u6863\u6848 +dashlet.my-profile.description=\u7528\u4e8e\u663e\u793a\u5f53\u524d\u7528\u6237\u7684\u7ec4\u4ef6 +dashlet.my-sites.shortName=\u6211\u7684\u7ad9\u70b9 +dashlet.my-sites.description=\u7528\u4e8e\u5217\u51fa\u7528\u6237\u6240\u5c5e\u7ad9\u70b9\u7684\u7ec4\u4ef6 +dashlet.my-tasks.shortName=\u6211\u7684\u4efb\u52a1 +dashlet.my-tasks.description=\u7528\u4e8e\u5217\u51fa\u4e3a\u5f53\u524d\u7528\u6237\u6240\u6307\u6d3e\u4efb\u52a1\u7684 Dashlet +dashlet.my-workspaces.shortName=\u6211\u7684\u6587\u6863\u5de5\u4f5c\u7a7a\u95f4 +dashlet.my-workspaces.description=\u7528\u4e8e\u5217\u51fa\u7528\u6237\u6240\u5c5e\u5de5\u4f5c\u7a7a\u95f4\u7684\u7ec4\u4ef6 +dashlet.rssfeed.shortName=RSS \u8ba2\u9605\u6e90 +dashlet.rssfeed.description=\u5728\u6307\u5b9a\u4e86 URL \u914d\u7f6e\u53c2\u6570\u7684\u60c5\u51b5\u4e0b\u663e\u793a RSS \u8ba2\u9605\u6e90\u7684\u5185\u5bb9\u3002 +dashlet.site-activities.shortName=\u7ad9\u70b9\u6d3b\u52a8 +dashlet.site-activities.description=\u5217\u51fa\u6307\u5b9a\u7ad9\u70b9\u7684\u6700\u8fd1\u6d3b\u52a8\u3002 +dashlet.site-links.shortName=\u7ad9\u70b9\u94fe\u63a5 +dashlet.site-links.description=\u7528\u4e8e\u5217\u51fa\u7528\u6237\u6240\u5c5e\u94fe\u63a5\u7684\u7ec4\u4ef6 +dashlet.site-profile.shortName=\u7ad9\u70b9\u914d\u7f6e\u6587\u4ef6 +dashlet.site-profile.description=\u5408\u4f5c\u7ad9\u70b9\u4e2d\u6240\u7528\u7ad9\u70b9\u914d\u7f6e\u6587\u4ef6\u7ec4\u4ef6 +dashlet.user-calendar.shortName=\u6211\u7684\u65e5\u5386 +dashlet.user-calendar.description=\u5217\u51fa\u5f53\u524d\u7528\u6237\u7684\u7ad9\u70b9\u4e8b\u4ef6\u3002 +dashlet.webview.shortName=Web \u89c6\u56fe +dashlet.webview.description=\u5728\u6307\u5b9a\u4e86 URI \u914d\u7f6e\u53c2\u6570\u7684\u60c5\u51b5\u4e0b\u663e\u793a URI \u7684\u5185\u5bb9\u3002 +dashlet.wiki.shortName=\u7ef4\u57fa +dashlet.wiki.description=\u663e\u793a\u7528\u6237\u6240\u9009\u7ef4\u57fa\u9875\u9762\u3002 +dashlet.my-meeting-workspaces.shortName=\u6211\u7684\u4f1a\u8bae\u5de5\u4f5c\u7a7a\u95f4 +dashlet.my-meeting-workspaces.description=\u7528\u4e8e\u5217\u51fa\u7528\u6237\u6240\u5c5e\u4f1a\u8bae\u5de5\u4f5c\u7a7a\u95f4\u7684\u7ec4\u4ef6 +dashlet.my-documents.shortName=\u6211\u7684\u6587\u6863 +dashlet.my-documents.description=\u7528\u4e8e\u5217\u51fa\u4e0e\u5f53\u524d\u7528\u6237\u5173\u8054\u7684\u6587\u6863\u7684 Dashlet +dashlet.imagesummary.shortName=\u56fe\u50cf\u9884\u89c8 +dashlet.imagesummary.description=\u56fe\u50cf\u5e93\u7f29\u7565\u56fe\u548c\u9884\u89c8 Dashlet \u7ec4\u4ef6 +dashlet.site-data-lists.shortName=\u7ad9\u70b9\u6570\u636e\u5217\u8868 +dashlet.site-data-lists.description=\u7528\u4e8e\u663e\u793a\u7ad9\u70b9\u4e2d\u7684\u6570\u636e\u5217\u8868\u7684\u7ec4\u4ef6 +dashlet.forum-summary.shortName=\u6211\u7684\u8ba8\u8bba +dashlet.forum-summary.description=\u7b5b\u9009\u8fc7\u7684\u8ba8\u8bba\u8bba\u575b\u6458\u8981 +dashlet.saved-search.shortName=\u5df2\u4fdd\u5b58\u641c\u7d22 +dashlet.saved-search.description=\u5df2\u4fdd\u5b58\u641c\u7d22 Dashlet +dashlet.site-search.shortName=\u7ad9\u70b9\u641c\u7d22 +dashlet.site-search.description=\u7ad9\u70b9\u641c\u7d22 Dashlet +dashlet.site-notice.shortName=\u7ad9\u70b9\u516c\u544a +dashlet.site-notice.description=\u6dfb\u52a0\u9762\u5411\u7ad9\u70b9\u7528\u6237\u7684\u81ea\u5b9a\u4e49\u516c\u544a +dashlet.top-site-contributor-report.shortName=\u7ad9\u70b9\u8d21\u732e\u8005\u660e\u7ec6 +dashlet.top-site-contributor-report.description=\u663e\u793a\u4e3a\u7ad9\u70b9\u8d21\u732e\u5185\u5bb9\u6700\u591a\u8005\u7684\u76f4\u89c2\u660e\u7ec6\u3002 +dashlet.site-content-report.shortName=\u7ad9\u70b9\u6587\u4ef6\u7c7b\u578b\u660e\u7ec6 +dashlet.site-content-report.description=\u663e\u793a\u7ad9\u70b9\u4e0d\u540c\u6587\u4ef6\u7c7b\u578b\u7684\u76f4\u89c2\u660e\u7ec6\u3002 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.desc.xml new file mode 100644 index 0000000000..0d3cd3d018 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.desc.xml @@ -0,0 +1,5 @@ + + Customise Dashboard Layout + Customise dashboard layout component + /components/dashboard/customise-layout + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.head.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.head.ftl new file mode 100644 index 0000000000..56c7097d25 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.head.ftl @@ -0,0 +1,3 @@ +<#-- PLEASE NOTE: +<#-- Use of .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. --> +<#-- Dependencies are now loaded through the use of the <@script> and <@link> tags in the main .html.ftl file. --> diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.html.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.html.ftl new file mode 100644 index 0000000000..0d311893c0 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.html.ftl @@ -0,0 +1,60 @@ +<@markup id="css" > + <#-- CSS Dependencies --> + <@link rel="stylesheet" type="text/css" href="${url.context}/res/components/dashboard/customise-layout.css" group="dashboard"/> + + +<@markup id="js"> + <#-- JavaScript Dependencies --> + <@script type="text/javascript" src="${url.context}/res/components/dashboard/customise-layout.js" group="dashboard"/> + + +<@markup id="widgets"> + <@createWidgets group="dashboard"/> + + +<@markup id="html"> + <@uniqueIdDiv> +
+ +
+

${msg("section.currentLayout")} + ${currentLayout.description} +

+
+
+
+ ${msg( +
+ +
+
+
+ +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.js new file mode 100644 index 0000000000..982f0efc66 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.js @@ -0,0 +1,95 @@ +/** + * Customise Site Layout component GET method + */ + +function getNoOfColumns(template) +{ + var noOfColumns = 0; + while (template.properties["gridColumn" + (noOfColumns + 1)] !== null) + { + noOfColumns++; + } + return noOfColumns; +} + +function main() +{ + // Get current template + var dashboardId; + if (args.dashboardType == "user") + { + dashboardId = "user/" + user.name + "/dashboard"; + } + else if (args.dashboardType == "site") + { + dashboardId = "site/" + page.url.templateArgs.site + "/dashboard"; + } + + // Hardcoded templates until proper service exists + var layouts = { + "dashboard-1-column" : { + templateId: "dashboard-1-column", + noOfColumns: 1, + description: msg.get("msg.template-1-column"), + icon: url.context + "/res/components/dashboard/images/dashboard-1-column.png" + }, + "dashboard-2-columns-wide-right" : { + templateId: "dashboard-2-columns-wide-right", + noOfColumns: 2, + description: msg.get("msg.template-2-columns-wide-right"), + icon: url.context + "/res/components/dashboard/images/dashboard-2-columns-wide-right.png" + }, + "dashboard-2-columns-wide-left" : { + templateId: "dashboard-2-columns-wide-left", + noOfColumns: 2, + description: msg.get("msg.template-2-columns-wide-left"), + icon: url.context + "/res/components/dashboard/images/dashboard-2-columns-wide-left.png"}, + "dashboard-3-columns" : { + templateId: "dashboard-3-columns", + noOfColumns: 3, + description: msg.get("msg.template-3-columns"), + icon: url.context + "/res/components/dashboard/images/dashboard-3-columns.png"}, + "dashboard-4-columns" : { + templateId: "dashboard-4-columns", + noOfColumns: 4, + description: msg.get("msg.template-4-columns"), + icon: url.context + "/res/components/dashboard/images/dashboard-4-columns.png"} + }; + + var currentTemplate = sitedata.findTemplate(dashboardId), + currentNoOfColumns = getNoOfColumns(currentTemplate), + currentTemplateDescription = "NONE"; + + for (var key in layouts) + { + if (layouts[key].templateId == currentTemplate.id) + { + currentTemplateDescription = layouts[key].description; + break; + } + } + + var currentLayout = + { + templateId: currentTemplate.id, + noOfColumns: currentNoOfColumns, + description: currentTemplateDescription, + icon : url.context + "/res/components/dashboard/images/" + currentTemplate.id + ".png" + }; + + // Prepare model for template + model.currentLayout = currentLayout; + model.layouts = layouts; + + var customizeDashlets = { + id : "CustomiseLayout", + name : "Alfresco.CustomiseLayout", + options : { + currentLayout : currentLayout, + layouts : layouts + } + }; + model.widgets = [customizeDashlets]; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.properties new file mode 100644 index 0000000000..eb163c3792 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get.properties @@ -0,0 +1,19 @@ +header.layout=Layout + +section.currentLayout=Current Layout: + +button.showLayouts=Change Layout +button.hideLayouts=Hide Layouts + +section.selectNewLayout=Select New Layout +label.layoutWarning=If the new layout has less columns than the current layout, columns are removed from right side. Any dashlets in those columns are removed. + +img.currentLayout=Current layout + +button.useCurrent=Cancel + +msg.template-1-column=One column +msg.template-2-columns-wide-right=Two columns: narrow left, wide right +msg.template-2-columns-wide-left=Two columns: wide left, narrow right +msg.template-3-columns=Three columns: wide centre +msg.template-4-columns=Four columns diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_de.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_de.properties new file mode 100755 index 0000000000..365ff6d4c5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_de.properties @@ -0,0 +1,19 @@ +header.layout=Layout + +section.currentLayout=Aktuelles Layout: + +button.showLayouts=Layout \u00e4ndern +button.hideLayouts=Layouts ausblenden + +section.selectNewLayout=Neues Layout ausw\u00e4hlen +label.layoutWarning=Falls das neue Layout \u00fcber weninger Spalten verf\u00fcgt als das aktuelle Layout, werden die Spalten von der rechten Seite beginnend entfernt. Alle Dashlets in diesen Splaten werden entfernt. + +img.currentLayout=Aktuelles Layout + +button.useCurrent=Abbrechen + +msg.template-1-column=Eine Spalte +msg.template-2-columns-wide-right=Zwei Spalten: links schmal, rechts breit +msg.template-2-columns-wide-left=Zwei Spalten: links breit, rechts schmal +msg.template-3-columns=Drei Spalten: breite Mitte +msg.template-4-columns=Vier Spalten diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_es.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_es.properties new file mode 100755 index 0000000000..4ee366b1d6 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_es.properties @@ -0,0 +1,19 @@ +header.layout=Esquema + +section.currentLayout=Esquema actual: + +button.showLayouts=Cambiar esquema +button.hideLayouts=Ocultar esquema + +section.selectNewLayout=Seleccionar nuevo esquema +label.layoutWarning=Si el nuevo esquema tiene menos columnas que el esquema actual, las columnas son removidas desde el lado derecho. Los dashlets que est\u00e9n en esas columnas tambi\u00e9n ser\u00e1n removidos. + +img.currentLayout=Esquema actual + +button.useCurrent=Cancelar + +msg.template-1-column=Una columna +msg.template-2-columns-wide-right=Dos columnas: izquierda estrecha, derecha ancha +msg.template-2-columns-wide-left=Dos columnas: izquierda ancha, derecha estrecha +msg.template-3-columns=Tres columnas: central ancha +msg.template-4-columns=Cuatro columnas diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_fr.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_fr.properties new file mode 100755 index 0000000000..91637365f5 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_fr.properties @@ -0,0 +1,19 @@ +header.layout=Disposition + +section.currentLayout=Disposition actuelle : + +button.showLayouts=Changer la disposition +button.hideLayouts=Cacher les dispositions + +section.selectNewLayout=S\u00e9lectionner une nouvelle disposition +label.layoutWarning=Si la nouvelle disposition compte moins de colonnes que la disposition actuelle, les colonnes seront supprim\u00e9es par la droite. Ainsi, tout dashlet qui serait actuellement dans ces colonnes supprim\u00e9es \u00e0 droite serait supprim\u00e9 de la nouvelle disposition. + +img.currentLayout=Disposition actuelle + +button.useCurrent=Annuler + +msg.template-1-column=Une colonne +msg.template-2-columns-wide-right=Deux colonnes : \u00e9troite \u00e0 gauche, large \u00e0 droite +msg.template-2-columns-wide-left=Deux colonnes : large \u00e0 gauche, \u00e9troite \u00e0 droite +msg.template-3-columns=Trois colonnes : large au centre +msg.template-4-columns=Quatre colonnes diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_it.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_it.properties new file mode 100755 index 0000000000..ccf9489509 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_it.properties @@ -0,0 +1,19 @@ +header.layout=Layout + +section.currentLayout=Layout attuale: + +button.showLayouts=Cambia layout +button.hideLayouts=Nascondi layout + +section.selectNewLayout=Seleziona nuovo layout +label.layoutWarning=Se nel nuovo layout sono presenti meno colonne rispetto a quello attuale, le colonne vengono rimosse dal lato destro. Vengono anche rimossi tutti i dashlet da queste colonne. + +img.currentLayout=Layout attuale + +button.useCurrent=Annulla + +msg.template-1-column=Una colonna +msg.template-2-columns-wide-right=Due colonne: stretta a sinistra, larga a destra +msg.template-2-columns-wide-left=Due colonne: larga a sinistra, stretta a destra +msg.template-3-columns=Tre colonne: larga al centro +msg.template-4-columns=Quattro colonne diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_ja.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_ja.properties new file mode 100755 index 0000000000..988766a211 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_ja.properties @@ -0,0 +1,19 @@ +header.layout=\u30ec\u30a4\u30a2\u30a6\u30c8 + +section.currentLayout=\u73fe\u5728\u306e\u30ec\u30a4\u30a2\u30a6\u30c8: + +button.showLayouts=\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u5909\u66f4 +button.hideLayouts=\u30ec\u30a4\u30a2\u30a6\u30c8\u3092\u96a0\u3059 + +section.selectNewLayout=\u65b0\u3057\u3044\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u9078\u629e +label.layoutWarning=\u65b0\u3057\u3044\u30ec\u30a4\u30a2\u30a6\u30c8\u306b\u542b\u307e\u308c\u3066\u3044\u308b\u5217\u306e\u6570\u304c\u73fe\u5728\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u3088\u308a\u5c11\u306a\u3044\u5834\u5408\u306f\u3001\u53f3\u5074\u304b\u3089\u5217\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 \u3053\u308c\u3089\u306e\u5217\u306b\u542b\u307e\u308c\u3066\u3044\u308b\u30c0\u30c3\u30b7\u30e5\u30ec\u30c3\u30c8\u306f\u3059\u3079\u3066\u524a\u9664\u3055\u308c\u307e\u3059\u3002 + +img.currentLayout=\u73fe\u5728\u306e\u30ec\u30a4\u30a2\u30a6\u30c8 + +button.useCurrent=\u30ad\u30e3\u30f3\u30bb\u30eb + +msg.template-1-column=1 \u5217 +msg.template-2-columns-wide-right=2 \u5217: \u5de6\u3092\u72ed\u304f\u3001\u53f3\u3092\u5e83\u304f +msg.template-2-columns-wide-left=2 \u5217: \u5de6\u3092\u5e83\u304f\u3001\u53f3\u3092\u72ed\u304f +msg.template-3-columns=3 \u5217: \u4e2d\u592e\u3092\u5e83\u304f +msg.template-4-columns=4 \u5217 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_nb.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_nb.properties new file mode 100755 index 0000000000..fe86ebe552 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_nb.properties @@ -0,0 +1,19 @@ +header.layout=Oppsett + +section.currentLayout=Gjeldende oppsett: + +button.showLayouts=Endre oppsett +button.hideLayouts=Skjul oppsett + +section.selectNewLayout=Velg nytt oppsett +label.layoutWarning=Hvis det nye oppsettet har f\u00e6rre kolonner enn det gjeldende oppsettet, vil kolonnene bli fjernet fra h\u00f8yre side. Alle dashleter i disse kolonnene vil bli fjernet. + +img.currentLayout=Gjeldende oppsett + +button.useCurrent=Avbryt + +msg.template-1-column=En kolonne +msg.template-2-columns-wide-right=To kolonner: smal venstre, bred h\u00f8yre +msg.template-2-columns-wide-left=To kolonner: bred venstre, smal h\u00f8yre +msg.template-3-columns=Tre kolonner: bred midte +msg.template-4-columns=Fire kolonner diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_nl.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_nl.properties new file mode 100755 index 0000000000..fa2e9ca86c --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_nl.properties @@ -0,0 +1,19 @@ +header.layout=Indeling + +section.currentLayout=Huidige lay-out: + +button.showLayouts=Lay-out wijzigen +button.hideLayouts=Lay-outs verbergen + +section.selectNewLayout=Nieuwe lay-out selecteren +label.layoutWarning=Als de nieuwe lay-out minder kolommen heeft dan de huidige lay-out, worden er vanaf de rechterkant kolommen verwijderd. Eventuele dashlets in die kolommen worden verwijderd. + +img.currentLayout=Huidige lay-out + +button.useCurrent=Annuleren + +msg.template-1-column=E\u00e9n kolom +msg.template-2-columns-wide-right=Twee kolommen: smalle links, brede rechts +msg.template-2-columns-wide-left=Twee kolommen: brede links, smalle rechts +msg.template-3-columns=Drie kolommen: brede in het midden +msg.template-4-columns=Vier kolommen diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_pt_BR.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_pt_BR.properties new file mode 100644 index 0000000000..046047e653 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_pt_BR.properties @@ -0,0 +1,19 @@ +header.layout=Layout + +section.currentLayout=Layout atual: + +button.showLayouts=Alterar layout +button.hideLayouts=Ocultar layouts + +section.selectNewLayout=Selecionar novo layout +label.layoutWarning=Se o novo layout tiver menos colunas do que o layout atual, ser\u00e3o removidas colunas do lado direito. Qualquer dashlet nessas colunas \u00e9 removido. + +img.currentLayout=Layout atual + +button.useCurrent=Cancelar + +msg.template-1-column=Uma coluna +msg.template-2-columns-wide-right=Duas colunas: estreito \u00e0 esquerda, largo \u00e0 direita +msg.template-2-columns-wide-left=Duas colunas: largo \u00e0 esquerda, estreito \u00e0 direita +msg.template-3-columns=Tr\u00eas colunas: centro largo +msg.template-4-columns=Quatro colunas diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_ru.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_ru.properties new file mode 100755 index 0000000000..4e04e29c06 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_ru.properties @@ -0,0 +1,19 @@ +header.layout=\u0421\u0445\u0435\u043c\u0430 + +section.currentLayout=\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430: + +button.showLayouts=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 +button.hideLayouts=\u0421\u043a\u0440\u044b\u0442\u044c \u0441\u0445\u0435\u043c\u044b + +section.selectNewLayout=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 +label.layoutWarning=\u0415\u0441\u043b\u0438 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439, \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0441 \u043f\u0440\u0430\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u0441\u0435 \u0434\u0430\u0448\u043b\u0435\u0442\u044b \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f. + +img.currentLayout=\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 + +button.useCurrent=\u041e\u0442\u043c\u0435\u043d\u0430 + +msg.template-1-column=\u041e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446 +msg.template-2-columns-wide-right=\u0414\u0432\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u0430: \u0443\u0437\u043a\u0438\u0439 \u0441\u043b\u0435\u0432\u0430, \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0441\u043f\u0440\u0430\u0432\u0430 +msg.template-2-columns-wide-left=\u0414\u0432\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u0430: \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0441\u043b\u0435\u0432\u0430, \u0443\u0437\u043a\u0438\u0439 \u0441\u043f\u0440\u0430\u0432\u0430 +msg.template-3-columns=\u0422\u0440\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430: \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 +msg.template-4-columns=\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_zh_CN.properties b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_zh_CN.properties new file mode 100755 index 0000000000..a312ad3ddc --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/customise-layout.get_zh_CN.properties @@ -0,0 +1,19 @@ +header.layout=\u5e03\u5c40 + +section.currentLayout=\u5f53\u524d\u5e03\u5c40: + +button.showLayouts=\u66f4\u6539\u5e03\u5c40 +button.hideLayouts=\u9690\u85cf\u5e03\u5c40 + +section.selectNewLayout=\u9009\u62e9\u65b0\u5e03\u5c40 +label.layoutWarning=\u5982\u679c\u65b0\u5e03\u5c40\u7684\u5217\u6bd4\u5f53\u524d\u5e03\u5c40\u5c11\uff0c\u5c06\u4ece\u53f3\u4fa7\u79fb\u9664\u5217\u3002 \u5c06\u79fb\u9664\u8fd9\u4e9b\u5217\u4e2d\u7684\u6240\u6709 Dashlet\u3002 + +img.currentLayout=\u5f53\u524d\u5e03\u5c40 + +button.useCurrent=\u53d6\u6d88 + +msg.template-1-column=\u4e00\u5217 +msg.template-2-columns-wide-right=\u4e24\u5217\uff1a\u5de6\u5217\u7a84\uff0c\u53f3\u5217\u5bbd +msg.template-2-columns-wide-left=\u4e24\u5217\uff1a\u5de6\u5217\u5bbd\uff0c\u53f3\u5217\u7a84 +msg.template-3-columns=\u4e09\u5217\uff1a\u4e2d\u5217\u5bbd +msg.template-4-columns=\u56db\u5217 diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.desc.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.desc.xml new file mode 100644 index 0000000000..749cd92082 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.desc.xml @@ -0,0 +1,7 @@ + + Welcome Panel Preference Save + Saves the welcome panel preference + + /components/dashboard/welcome-preference + user + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.json.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.json.ftl new file mode 100644 index 0000000000..db53df2a88 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.json.ftl @@ -0,0 +1,4 @@ +{ + "success": true, + "welcomePanelEnabled": ${welcomePanelEnabled} +} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.json.js b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.json.js new file mode 100644 index 0000000000..f304ec80c4 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashboard/welcome-preference.post.json.js @@ -0,0 +1,41 @@ +/** + * Welcome preference POST method + */ + +function main() +{ + + var clientRequest = json.toString(); + var clientJSON = JSON.parse(clientRequest); + + var welcomePanelEnabled = decodeURIComponent(clientJSON.welcomePanelEnabled); + var dashboardPage = "user/" + user.name + "/dashboard"; + var welcomePanelRegionId = "full-width-dashlet"; + + if (welcomePanelEnabled == "true") + { + var comp = sitedata.newComponent("page", welcomePanelRegionId, dashboardPage); + comp.properties.url = "/components/dashlets/dynamic-welcome"; + comp.properties.dashboardType = "user"; + comp.save(); + } + else + { + var oldComponents = sitedata.findComponents("page", null, dashboardPage, null); + // Unbind the full-width-dashlet (which will be the welcome for the dashboard + for (var oi = 0; oi < oldComponents.length; oi++) + { + var oldComponent = oldComponents[oi]; + var regionId = oldComponent.properties["region-id"]; + if (regionId == "full-width-dashlet") + { + sitedata.unbindComponent("page", regionId, dashboardPage); + break; + } + } + } + + model.welcomePanelEnabled = welcomePanelEnabled; +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashlets/activity-list.get.atomfeed.ftl b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashlets/activity-list.get.atomfeed.ftl new file mode 100644 index 0000000000..a387e5d09b --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashlets/activity-list.get.atomfeed.ftl @@ -0,0 +1,45 @@ +<#assign mode = args.mode!""> +<#if mode = "user"> + <#assign title=msg("atom.title.user", user.fullName?xml)> +<#else> + <#assign title=msg("atom.title.site", args["site"]?xml)> + +<#assign genericTitle=msg("title.generic")> + + + Alfresco (1.0) + + ${absurl(url.full)?xml} + ${title?xml} +<#if activities?exists && activities?size > 0> + ${activities[0].date.isoDate} + <#list activities as activity> + <#assign userLink="${activity.fullName?html}"> + <#assign itemLink="${activity.title?html}"> + <#assign siteTitle=siteTitles[activity.siteId]!activity.siteId> + <#assign siteLink="${siteTitle?html}"> + <#if activity.secondUserProfile??> + <#assign secondUserLink="${(activity.secondFullName!\"\")?html}"> + <#else> + <#assign secondUserLink=""> + + + <#assign detail = msg(activity.type, activity.title?xml, activity.fullName?xml, activity.custom0, activity.custom1, siteTitle?xml, (activity.secondFullName!"")?xml)> + <#if mode="user" && !activity.suppressSite><#assign detail=msg("in.site", detail, siteTitle?xml)> + <![CDATA[${detail}]]> + + ${activity.id} + ${activity.date.isoDate} + <#assign detailHTML = msg(activity.type, itemLink, userLink, activity.custom0, activity.custom1, siteLink, secondUserLink)> + <#if mode = "user" && !activity.suppressSite><#assign detailHTML = msg("in.site", detailHTML, siteLink)> + + + + + ${activity.fullName?xml} + ${absurl(activity.userProfile)?xml} + + + + + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashlets/activity-list.get.config.xml b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashlets/activity-list.get.config.xml new file mode 100644 index 0000000000..5f8ff75168 --- /dev/null +++ b/share/src/main/resources/alfresco/site-webscripts/org/alfresco/components/dashlets/activity-list.get.config.xml @@ -0,0 +1,55 @@ + + + + + + + ${head} + + + + + <#if outcome??> + <@region id=outcome scope="page"/> + <#else> + <@region id="components" scope="page"/> + + + + + + diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/reject-invite.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/reject-invite.ftl new file mode 100644 index 0000000000..d75dc16664 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/reject-invite.ftl @@ -0,0 +1,23 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="reject-invite" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/replication-job.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/replication-job.ftl new file mode 100644 index 0000000000..ef0071f038 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/replication-job.ftl @@ -0,0 +1,26 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> + <@region id="title" scope="page" /> +
+ + <@markup id="bd"> +
+ +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/repository.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/repository.ftl new file mode 100644 index 0000000000..d077581902 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/repository.ftl @@ -0,0 +1,57 @@ +<#include "include/alfresco-template.ftl" /> +<#include "include/documentlibrary.inc.ftl" /> +<@templateHeader> + <@markup id="location-hash"> + <@documentLibraryJS /> + + <@markup id="resizer"> + + + <@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/doclib-actions.js"> + + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="actions-common" scope="template" /> + <@region id="actions" scope="template" /> +
+
+ <@region id="filter" scope="template" /> + <@region id="tree" scope="template" /> + <@region id="categories" scope="template" /> + <@region id="tags" scope="template" /> +
+
+
+ <@region id="documentlist_v2" scope="template" /> +
+
+
+ + <@region id="html-upload" scope="template" /> + <@region id="flash-upload" scope="template" /> + <@region id="file-upload" scope="template" /> + <@region id="dnd-upload" scope="template" /> + <@region id="archive-and-download" scope="template"/> +
+ <@region id="doclib-custom" scope="template"/> + + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/rule-edit.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/rule-edit.ftl new file mode 100644 index 0000000000..c39aef3229 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/rule-edit.ftl @@ -0,0 +1,23 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="rule-edit" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/search.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/search.ftl new file mode 100644 index 0000000000..e3c990a15a --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/search.ftl @@ -0,0 +1,27 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+
+
+ <@region id="search" scope="page" /> +
+
+
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/sharedfiles.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/sharedfiles.ftl new file mode 100644 index 0000000000..94d2c81392 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/sharedfiles.ftl @@ -0,0 +1,57 @@ +<#include "include/alfresco-template.ftl" /> +<#include "include/documentlibrary.inc.ftl" /> +<@templateHeader> + <@markup id="location-hash"> + <@documentLibraryJS /> + + <@markup id="resizer"> + + + <@script type="text/javascript" src="${url.context}/res/modules/documentlibrary/doclib-actions.js"> + + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="actions-common" scope="template" /> + <@region id="actions" scope="template" /> +
+
+
+ <@region id="documentlist_v2" scope="template" /> +
+
+
+ <@region id="filter" scope="template" /> + <@region id="tree" scope="template" /> + <@region id="categories" scope="template" /> + <@region id="tags" scope="template" /> +
+
+ + <@region id="html-upload" scope="template" /> + <@region id="flash-upload" scope="template" /> + <@region id="file-upload" scope="template" /> + <@region id="dnd-upload" scope="template" /> + <@region id="archive-and-download" scope="template"/> +
+ <@region id="doclib-custom" scope="template"/> + + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/simple-guest.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/simple-guest.ftl new file mode 100644 index 0000000000..2851680685 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/simple-guest.ftl @@ -0,0 +1,12 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader/> + +<@templateBody type="alfresco-guest"> + <#if outcome??> + <@region id=outcome scope="page"/> + <#else> + <@region id="components" scope="page"/> + + + +<@templateFooter/> \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/simple.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/simple.ftl new file mode 100644 index 0000000000..a72f188014 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/simple.ftl @@ -0,0 +1,22 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> +
+ <@region id="share-header" scope="global" chromeless="true"/> + <@region id="title" scope="page"/> +
+
+ <#if outcome??> + <@region id=outcome scope="page"/> + <#else> + <@region id="components" scope="page"/> + +
+ + +<@templateFooter> +
+ <@region id="footer" scope="global"/> +
+ \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/site-finder.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/site-finder.ftl new file mode 100644 index 0000000000..3b90f261e4 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/site-finder.ftl @@ -0,0 +1,23 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="site-finder" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/site-groups.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/site-groups.ftl new file mode 100644 index 0000000000..d07e303b95 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/site-groups.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="membersbar" scope="template" /> + <@region id="site-groups" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/site-members.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/site-members.ftl new file mode 100644 index 0000000000..1ce8859dd1 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/site-members.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="membersbar" scope="template" /> + <@region id="site-members" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/site-redirect.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/site-redirect.ftl new file mode 100644 index 0000000000..4e20d7f3b4 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/site-redirect.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> + <@region id="site-redirect" scope="template" /> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="site-no-pages" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/start-workflow.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/start-workflow.ftl new file mode 100644 index 0000000000..05f7929b87 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/start-workflow.ftl @@ -0,0 +1,25 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ +
+ + + +<@templateFooter> + <@markup id="al-ft"> +
+ <@region id="footer" scope="global"/> +
+ + diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-cloud-auth.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/user-cloud-auth.ftl new file mode 100644 index 0000000000..e891e0b80d --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-cloud-auth.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="user-cloud-auth" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-content.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/user-content.ftl new file mode 100644 index 0000000000..f093ed49e3 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-content.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="user-content" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-notifications.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/user-notifications.ftl new file mode 100644 index 0000000000..5437fbd772 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-notifications.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="user-notifications" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-profile.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/user-profile.ftl new file mode 100644 index 0000000000..5a2dde4acd --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-profile.ftl @@ -0,0 +1,28 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="user-profile" scope="template" /> + <@region id="html-upload" scope="template" /> + <@region id="flash-upload" scope="template" /> + <@region id="file-upload" scope="template" /> + <@region id="dnd-upload" scope="template"/> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-profile.js b/share/src/main/resources/alfresco/templates/org/alfresco/user-profile.js new file mode 100644 index 0000000000..113762b0b5 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-profile.js @@ -0,0 +1,21 @@ +/** + * User Profile Template script + * + * This logic is used to ensure the profile page link points to a valid existing user - if not, the standard error page is shown. + */ +function main() +{ + var profileId = page.url.templateArgs["userid"]; + if (profileId != null) + { + // load user details for the profile from the repo + if (user.getUser(profileId) == null) + { + // If the user does not exist then we are going to intentionally throw an error that will force Surf + // to render the standard error page. + throw new Error("A user attempted to access a profile page that no longer exists or is invalid."); + } + } +} + +main(); \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-sites.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/user-sites.ftl new file mode 100644 index 0000000000..77d3d492f7 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-sites.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="user-sites" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/user-trashcan.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/user-trashcan.ftl new file mode 100644 index 0000000000..8c9be76f04 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/user-trashcan.ftl @@ -0,0 +1,24 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="user-trashcan" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/valid-user-site-access.lib.js b/share/src/main/resources/alfresco/templates/org/alfresco/valid-user-site-access.lib.js new file mode 100644 index 0000000000..28b307a7f1 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/valid-user-site-access.lib.js @@ -0,0 +1,62 @@ +/** + * Access test to ensure page is appropriate for the current user. + * + * - User Dashboard - user must be same user id as specified in the page view id + * - Site Dashboard - cannot view or modify a non-public private site + * + * @param siteManager True if the Site Dashboard test must be for SiteManager status + */ +function isValidUserOrSite(siteManager) +{ + var valid = true; + if (!user.isAdmin) + { + if (page.url.templateArgs.userid != null) + { + // User Dashboard - user must be same user as per page view id + valid = (user.name.toLowerCase() == page.url.templateArgs.userid.toLowerCase()); + } + else if (page.url.templateArgs.site != null) + { + valid = false; + + // Site Dashboard - cannot view/enter private site pages + var json = remote.call("/api/sites/" + page.url.templateArgs.site); + if (json.status == 200) + { + // Any 200 return from the call means the site was not Private or + // we are a valid member of a Private site. + var site = JSON.parse(json); + if (site.visibility != "MODERATED") + { + // Do we want to test for SiteManager role status? + valid = (!siteManager || isSiteManager(site)); + } + else + { + // If this site is Moderated - we need to see if we are a member to view dashboards etc. + json = remote.call("/api/sites/" + page.url.templateArgs.site + "/memberships/" + encodeURIComponent(user.name)); + if (json.status == 200) + { + // Any 200 return from the call means we are a member - else 404 is returned + valid = (!siteManager || isSiteManager(site)); + } + } + } + } + } + return valid; +} + +function isSiteManager(site) +{ + var managers = site.siteManagers; + for (var i = 0; i < managers.length; i++) + { + if (managers[i] == user.name) + { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/webview-default.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/webview-default.ftl new file mode 100644 index 0000000000..0c16157746 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/webview-default.ftl @@ -0,0 +1 @@ +<@region id="view" scope="template" /> diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/wiki-create.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/wiki-create.ftl new file mode 100644 index 0000000000..d731a0393b --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/wiki-create.ftl @@ -0,0 +1,25 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader> + <@templateHtmlEditorAssets /> + + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="createform" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/wiki-page.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/wiki-page.ftl new file mode 100644 index 0000000000..f0cd25915b --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/wiki-page.ftl @@ -0,0 +1,26 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader> + <@templateHtmlEditorAssets /> + + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+ <@region id="toolbar" scope="template" /> + <@region id="wikipage" scope="template" /> +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/wiki.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/wiki.ftl new file mode 100644 index 0000000000..99b3dd4034 --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/wiki.ftl @@ -0,0 +1,41 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader> + <@markup id="resizer"> + + + <@templateHtmlEditorAssets /> + + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> +
+ + <@markup id="bd"> +
+
+
+
+ <@region id="toolbar" scope="template" /> + <@region id="pagelist" scope="template" /> +
+
+
+ <@region id="filter" scope="template" /> + <@region id="tags" scope="template" /> +
+
+
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global" /> +
+ + \ No newline at end of file diff --git a/share/src/main/resources/alfresco/templates/org/alfresco/workflow-details.ftl b/share/src/main/resources/alfresco/templates/org/alfresco/workflow-details.ftl new file mode 100644 index 0000000000..01dd708fbd --- /dev/null +++ b/share/src/main/resources/alfresco/templates/org/alfresco/workflow-details.ftl @@ -0,0 +1,32 @@ +<#include "include/alfresco-template.ftl" /> +<@templateHeader /> + +<@templateBody> + <@markup id="alf-hd"> +
+ <@region scope="global" id="share-header" chromeless="true"/> + <@region id="title" scope="template"/> + <#if page.url.args.nodeRef??> + <@region id="path" scope="template"/> + +
+ + <@markup id="bd"> +
+ +
+ + + +<@templateFooter> + <@markup id="alf-ft"> +
+ <@region id="footer" scope="global"/> + <@region id="data-loader" scope="page" /> +
+ + diff --git a/share/src/main/resources/alfresco/templates/slingshot-region-chrome.ftl b/share/src/main/resources/alfresco/templates/slingshot-region-chrome.ftl new file mode 100644 index 0000000000..f25941f52a --- /dev/null +++ b/share/src/main/resources/alfresco/templates/slingshot-region-chrome.ftl @@ -0,0 +1,3 @@ +
+<@regionInclude/> +
\ No newline at end of file diff --git a/share/src/main/resources/alfresco/web-extension/custom-slingshot-application-context.xml.sample b/share/src/main/resources/alfresco/web-extension/custom-slingshot-application-context.xml.sample new file mode 100644 index 0000000000..70abbee700 --- /dev/null +++ b/share/src/main/resources/alfresco/web-extension/custom-slingshot-application-context.xml.sample @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/log4j2.properties b/share/src/main/resources/log4j2.properties new file mode 100644 index 0000000000..0574db31ed --- /dev/null +++ b/share/src/main/resources/log4j2.properties @@ -0,0 +1,68 @@ +# Set root logger level to error +rootLogger.level=error +rootLogger.appenderRef.stdout.ref=ConsoleAppender +rootLogger.appenderRef.rolling.ref=RollingAppender + +# All outputs currently set to be a ConsoleAppender. +appender.console.type=Console +appender.console.name=ConsoleAppender +appender.console.layout.type=PatternLayout +appender.console.layout.pattern=%d{ISO8601} %x %-5p [%c{3}] [%t] %replace{%m}{[\r\n]+}{}%n + +###### File appender definition ####### +appender.rolling.type=RollingFile +appender.rolling.name=RollingAppender +appender.rolling.fileName=share.log +appender.rolling.filePattern=share.log.%d{yyyy-MM-dd} +appender.rolling.layout.type=PatternLayout +appender.rolling.layout.pattern=%d{yyyy-MM-dd} %d{ABSOLUTE} %-5p [%c] [%t] %replace{%m}{[\r\n]+}{}%n +appender.rolling.policies.type = Policies +appender.rolling.policies.time.type=TimeBasedTriggeringPolicy +appender.rolling.policies.time.interval=1 + +# Spring +logger.springframework.name=org.springframework +logger.springframework.level=warn + +# Turn off Spring remoting warnings that should really be info or debug. +logger.springframework-remoting-support.name=org.springframework.remoting.support +logger.springframework-remoting-support.level=error +logger.springframework-util.name=org.springframework.util +logger.springframework-util.level=error + +# MyFaces +logger.apache-myfaces-util-DebugUtils.name=org.apache.myfaces.util.DebugUtils +logger.apache-myfaces-util-DebugUtils.level=info +logger.apache-myfaces-el-VariableResolverImpl.name=org.apache.myfaces.el.VariableResolverImpl +logger.apache-myfaces-el-VariableResolverImpl.level=error +logger.apache-myfaces-application-jsp-JspViewHandlerImpl.name=org.apache.myfaces.application.jsp.JspViewHandlerImpl +logger.apache-myfaces-application-jsp-JspViewHandlerImpl.level=error +logger.apache-myfaces-taglib.name=org.apache.myfaces.taglib +logger.apache-myfaces-taglib.level=error + +# Alfresco +logger.alfresco.name=org.alfresco +logger.alfresco.level=error +logger.alfresco-config.name=org.alfresco.config +logger.alfresco-config.level=warn +logger.alfresco-config-JndiObjectFactoryBean.name=org.alfresco.config.JndiObjectFactoryBean +logger.alfresco-config-JndiObjectFactoryBean.level=warn +logger.alfresco-web.name=org.alfresco.web +logger.alfresco-web.level=info + +# Web Framework +logger.springframework-extensions-webscripts.name=org.springframework.extensions.webscripts +logger.springframework-extensions-webscripts.level=info +logger.springframework-extensions-webscripts-ScriptLogger.name=org.springframework.extensions.webscripts.ScriptLogger +logger.springframework-extensions-webscripts-ScriptLogger.level=warn +logger.springframework-extensions-webscripts-ScriptDebugger.name=org.springframework.extensions.webscripts.ScriptDebugger +logger.springframework-extensions-webscripts-ScriptDebugger.level=off + +# Freemarker +# Note the freemarker.runtime logger is used to log non-fatal errors that are handled by Alfresco's retrying transaction handler +logger.freemarker-runtime.name=freemarker.runtime +logger.freemarker-runtime.level= + + + + diff --git a/share/src/main/resources/share-config.properties b/share/src/main/resources/share-config.properties new file mode 100644 index 0000000000..c0a8f8356b --- /dev/null +++ b/share/src/main/resources/share-config.properties @@ -0,0 +1,16 @@ +# Properties for AIMS +aims.enabled=false +aims.realm= +aims.resource= +aims.authServerUrl= +aims.sslRequired=external +aims.publicClient= +aims.autodetectBearerOnly= +aims.alwaysRefreshToken= +aims.principalAttribute=sub +aims.enableBasicAuth= + +# Properties for cookie attributes +# cookies.sameSite=Strict +# cookies.sameSite=Lax +# cookies.sameSite=None \ No newline at end of file diff --git a/share/src/main/resources/surf-config.xml b/share/src/main/resources/surf-config.xml new file mode 100644 index 0000000000..6e534169fc --- /dev/null +++ b/share/src/main/resources/surf-config.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GET + HEAD + PUT + POST + DELETE + OPTIONS + + + + + + + + + + + + \ No newline at end of file diff --git a/share/src/main/resources/web-application-config.xml b/share/src/main/resources/web-application-config.xml new file mode 100644 index 0000000000..7c9cc77198 --- /dev/null +++ b/share/src/main/resources/web-application-config.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/share/src/main/webapp/WEB-INF/surf.xml b/share/src/main/webapp/WEB-INF/surf.xml new file mode 100644 index 0000000000..d182a550d2 --- /dev/null +++ b/share/src/main/webapp/WEB-INF/surf.xml @@ -0,0 +1,107 @@ + + + + + + + + + component + 1.0 + Component + Component + + org.springframework.extensions.surf.types.AdvancedComponentImpl + + + + + + webframework.factory.pagemapper.slingshot + webframework.factory.user.slingshot + + + slingshot.site.configuration + slingshot-region-chrome + + + + + + login + slingshot-login + + + logout + slingshot-logout + + + + default + + + + region-nocomponent + nocomponent + + + page-error + jsp + /error500.jsp + + + + + + alfresco + + + production + + + + true + false + true + true + + + true + + + true + + false + + + + + true + + false + Alfresco + + + + + + + + + + + + + \ No newline at end of file diff --git a/share/src/main/webapp/WEB-INF/urlrewrite.xml b/share/src/main/webapp/WEB-INF/urlrewrite.xml new file mode 100644 index 0000000000..2745d32161 --- /dev/null +++ b/share/src/main/webapp/WEB-INF/urlrewrite.xml @@ -0,0 +1,46 @@ + + + + + + + ^/s/(.*) + /page/quickshare?id=$1 + + + + + ^/proxy/(.*) + /page/proxy/$1 + + + ^/service/(.*) + /page/$1 + + + ^/feedservice/(.*) + /page/feed/$1 + + + ^/system/(.*) + /page/system/$1 + + + + ^/noauth/(.*) + /page/$1 + + + ^/res/yui/uploader/assets/uploader.swf\?(.*) + uploader.swf + + + ^/yui/uploader/assets/uploader.swf\?(.*) + uploader.swf + + + ^/res/(.*) + /page/resource/$1 + + + \ No newline at end of file diff --git a/share/src/main/webapp/WEB-INF/web.xml b/share/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..5454f9acbe --- /dev/null +++ b/share/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,230 @@ + + + + Alfresco Project Slingshot + Alfresco Project Slingshot application + + + org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL + true + + + + + Spring config file location + contextConfigLocation + classpath:web-application-config.xml + + + + MT authentication support + MTAuthenticationFilter + org.alfresco.web.site.servlet.MTAuthenticationFilter + + + + Redirects view and service URLs to the dispatcher servlet. + UrlRewriteFilter + org.tuckey.web.filters.urlrewrite.UrlRewriteFilter + + + + + Share Identity Service filter. + AIMS Filter + org.alfresco.web.site.servlet.AIMSFilter + + + + Share SSO authentication support filter. + Authentication Filter + org.springframework.extensions.webscripts.servlet.BeanProxyFilter + + beanName + SSOAuthenticationFilter + + + + + CSRF Token filter. Checks for a session based CSRF token in request headers (or form parameters) based on config. + CSRF Token Filter + org.springframework.extensions.webscripts.servlet.CSRFFilter + + + + Security Headers filter. Adds security response headers based on config. + Security Headers Filter + org.springframework.extensions.webscripts.servlet.SecurityHeadersFilter + + + + + MTAuthenticationFilter + /page/* + + + MTAuthenticationFilter + /p/* + + + MTAuthenticationFilter + /proxy/* + + + + + AIMS Filter + /page/* + + + AIMS Filter + /p/* + + + AIMS Filter + /proxy/* + + + AIMS Filter + /service/* + + + + + Authentication Filter + /page/* + + + Authentication Filter + /p/* + + + Authentication Filter + /proxy/* + + + Authentication Filter + /service/* + + + + + CSRF Token Filter + /page/* + + + CSRF Token Filter + /p/* + + + CSRF Token Filter + /proxy/* + + + CSRF Token Filter + /service/* + + + + + Security Headers Filter + /page/* + + + Security Headers Filter + /p/* + + + Security Headers Filter + /proxy/* + + + Security Headers Filter + /service/* + + + Security Headers Filter + /s/* + + + + + UrlRewriteFilter + /proxy/* + + + UrlRewriteFilter + /service/* + + + UrlRewriteFilter + /feedservice/* + + + UrlRewriteFilter + /res/* + + + UrlRewriteFilter + /yui/* + + + UrlRewriteFilter + /system/* + + + UrlRewriteFilter + /s/* + + + UrlRewriteFilter + /noauth/* + + + + + org.springframework.web.context.ContextLoaderListener + + + + Spring Surf Dispatcher Servlet + org.springframework.web.servlet.DispatcherServlet + + contextAttribute + org.springframework.web.context.WebApplicationContext.ROOT + + + dispatchOptionsRequest + true + + 1 + + + + Spring Surf Dispatcher Servlet + /page/* + + + Spring Surf Dispatcher Servlet + /p/* + + + + 60 + + + + + index.jsp + + + + 500 + /error500.jsp + + + diff --git a/share/src/main/webapp/cmm/css/custom-model-manager.css b/share/src/main/webapp/cmm/css/custom-model-manager.css new file mode 100644 index 0000000000..f35a9256ea --- /dev/null +++ b/share/src/main/webapp/cmm/css/custom-model-manager.css @@ -0,0 +1,792 @@ +/* Headings */ +#CMM h2, +#CMM h3 { + font-family: 'Open Sans Bold'; + margin: 8px 0px; +} + +/* Labels */ +#CMM .alfresco-html-Label { + font-family: 'Open Sans Condensed', Arial, sans-serif; + font-size: 132%; +} +#CMM .alfresco-html-Label.status, +#CMM .alfresco-renderers-Property.status { + display: inline-block; + padding: 5px 20px; + border-radius: 3px; + background-color: #ccc; +} +#CMM .alfresco-html-Label.status.active, +#CMM .alfresco-renderers-Property.status.active { + background-color: #45a540; + color: #fff; +} +#CMM .alfresco-renderers-Property.status.active > span { + color: #fff; +} +#CMM .alfresco-renderers-Property.status { + padding: 1px 0 1px 6px; + width: 99px; + border-radius: 3px; +} + +/* Data list */ +#CMM .alfresco-lists-views-AlfListView.bordered > table > tbody > tr > td { + border-top: none; + border-bottom: none; +} + +#CMM td.nameColumn span.alfresco-renderers-Property span { + color: #006ca6; +} +#CMM td.nameColumn span.alfresco-renderers-Property span:hover { + text-decoration: underline; + color: #005684; +} + +#CMM .alfresco-lists-AlfList > div.info { + margin-left: 0; +} + +#CMM th { + font-family: 'Open Sans Bold'; +} + +#CMM .nameColumn { + width: 200px +} +#CMM .statusColumn { + width: 90px +} +#CMM .actionsColumn { + width: 90px +} +#CMM .parentColumn { +} + +#CMM #PROPERTIES_LIST .datatypeColumn { + width: 90px +} +#CMM #PROPERTIES_LIST .mandatoryColumn { + width: 160px +} +#CMM #PROPERTIES_LIST .multivalueColumn { + width: 90px +} + +#CMM .cmm-layout-CMMStackContainer .dijitStackContainer-dijitContentPane { + padding: 10px; +} + +#CMM .alfresco-layout-VerticalWidgets.verticalPalette .alfresco-buttons-AlfButton { + width: 100%; + margin-bottom: 8px; + background-color: #6e9e2d; + border: 1px solid #777; + border-radius: 4px; +} +#CMM .alfresco-layout-VerticalWidgets.verticalPalette .alfresco-buttons-AlfButton .dijitInline.dijitButtonText { + color: #fff; +} + +#CMM .alfresco-buttons-AlfButton { + padding: 2px; + margin: 0 15px 0 0; +} + +#CMM .alfresco-buttons-AlfButton.createButton, +#CMM .alfresco-buttons-AlfButton.createTypeButton, +#CMM .alfresco-buttons-AlfButton.createPropertyGroupButton, +#CMM .alfresco-buttons-AlfButton.createPropertyButton { + background-color: #0078be; + border: 1px solid #777; +} +#CMM .alfresco-buttons-AlfButton.createButton .dijitInline.dijitButtonText, +#CMM .alfresco-buttons-AlfButton.createTypeButton .dijitInline.dijitButtonText, +#CMM .alfresco-buttons-AlfButton.createPropertyGroupButton .dijitInline.dijitButtonText, +#CMM .alfresco-buttons-AlfButton.createPropertyButton .dijitInline.dijitButtonText { + color: #fff; +} + +#CMM .alfresco-buttons-AlfButton.createPropertyButton { + background-color: #0078be; + border: 1px solid #777; +} +#CMM .alfresco-buttons-AlfButton.createPropertyButton .dijitInline.dijitButtonText { + color: #fff; +} + +/* Model edit form */ +#CMM .nameField .dijitTextBox { + width: 20em; +} + +#CMM .descriptionField .dijitTextBox { + width: 50em; +} + +/* Icons used throughout */ +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-edit, +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-delete, +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-activate, +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-deactivate, +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-import, +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-export, +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-edit-form { + background-repeat: no-repeat; + height: 20px; + width: 20px; +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-edit { + background-image: url(./images/edit-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-delete { + background-image: url(./images/delete-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-activate { + background-image: url(./images/activate-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-deactivate { + background-image: url(./images/deactivate-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-edit-form { + background-image: url(./images/edit-form-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-search { + background-image: url(./images/search-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-import { + background-image: url(./images/import-16.png); +} +.alfresco-share .dijitIcon.dijitMenuItemIcon.cmm-icon-export { + background-image: url(./images/export-16.png); +} + +/* Editor */ +#FORM_EDITOR_CONSOLE #FORM_CANVAS { + margin: 0; + padding: 0; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS div.title-row { + display: none; +} + +#FORM_EDITOR_CONSOLE #PROPERTY_PALETTE { + min-width: 180px; + min-height: 42px; +} +#FORM_EDITOR_CONSOLE #PROPERTY_PALETTE > div.info { + margin: 0; +} +#FORM_EDITOR_CONSOLE #PROPERTY_PALETTE > div.info.data-loading { + margin: 16px 12px; +} +#FORM_EDITOR_CONSOLE #PROPERTY_PALETTE > div.info.rendered-view { + margin-top: -30px; +} +#FORM_EDITOR_CONSOLE #PROPERTY_PALETTE > div.info.rendered-view .alfresco-lists-views-AlfListView__no-data { + margin: 48px 10px; + max-width: 160px; +} +#FORM_EDITOR_CONSOLE #PROPERTY_PALETTE .palette { + border: none; + margin-top: 12px; +} + +#FORM_EDITOR_CONSOLE .alfresco-dnd-DragAndDropItems .palette { + margin: 0 5px 5px 0; + padding: 6px 0 0 6px; +} + +/* Non property palette */ +#FORM_EDITOR_CONSOLE #NON_PROPERTY_PALETTE .palette { + background-color: #eee; + margin-bottom: 0; + text-align: center; +} +#FORM_EDITOR_CONSOLE #NON_PROPERTY_PALETTE .dojoDndItem { + display: inline-block; +} +#FORM_EDITOR_CONSOLE #NON_PROPERTY_PALETTE .dojoDndItem .title { + display: none; +} +#FORM_EDITOR_CONSOLE #NON_PROPERTY_PALETTE .alfresco-dnd-DragAndDropItem.dragTemplate { + width: auto; +} + +/* Property menu */ +.alfresco-dnd-DragAndDropItem.dragTemplate span { + vertical-align: top !important; +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .title { + width: 120px; + word-break: break-word; +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon { + background-position: 2px 2px; +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-1cols { + background-image: url(./images/single-col-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-2cols { + background-image: url(./images/double-col-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-2cols-wide-left { + background-image: url(./images/double-col-wide-left-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-3cols { + background-image: url(./images/triple-col-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-text { + background-image: url(./images/text-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-mltext { + background-image: url(./images/textml-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-content { + background-image: url(./images/content-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-int { + background-image: url(./images/int-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-long { + background-image: url(./images/long-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-float { + background-image: url(./images/float-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-double { + background-image: url(./images/double-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-date { + background-image: url(./images/date-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-datetime { + background-image: url(./images/datetime-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-boolean { + background-image: url(./images/boolean-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-size { + background-image: url(./images/int-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-mimetype { + background-image: url(./images/content-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-taggable { + background-image: url(./images/single-col-16.png); +} +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate .icon.editor-categories { + background-image: url(./images/single-col-16.png); +} + +#FORM_EDITOR_CONSOLE .alfresco-dnd-DragAndDropItems .palette .dojoDndItem { + padding: 0; + border: none; +} +#FORM_EDITOR_CONSOLE .alfresco-dnd-DragAndDropItems .palette .alfresco-dnd-DragAndDropItem { + margin: 0px 4px 6px 2px; + border-radius: 3px; +} + +/* Inline property create button */ +#CMM #FORM_EDITOR_CONSOLE .inlinePropertyButton { + margin: 10px 8px; + border-radius: 3px; + border: 1px dashed #CCC; + padding: 5px 4px 5px 7px; + width: 162px; +} +#CMM #FORM_EDITOR_CONSOLE .inlinePropertyButton .dijitButtonNode { + padding: 0; +} +#CMM #FORM_EDITOR_CONSOLE .inlinePropertyButton .inlinePropertyButtonIcon { + width: 16px; + height: 16px; + background-image: url(./images/plus-16.png); + margin-right: 5px; +} + +/* Canvas layout*/ +#FORM_EDITOR_CONSOLE #FORM_EDITOR { + margin: 0 5px 5px 0; +} +#FORM_EDITOR_CONSOLE .alfresco-forms-controls-BaseFormControl > .control-row > .control { + margin: 0; +} +#FORM_CANVAS.alfresco-forms-controls-BaseFormControl > .control-row { + line-height: 10px; +} + +/* DnD indicators */ +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemBefore:before { + border-top: 2px dashed #0081c7; + content: ""; + position: absolute; + top: -8px; + bottom: 0; + left: 0; + right: 0; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemAfter:after { + border-bottom: 2px dashed #0081c7; + content: ""; + position: absolute; + top: 0; + bottom: -7px; + left: 0; + right: 0; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemBefore:before, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemBefore:before, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemBefore:before { + border-left: 2px dashed #0081c7; + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: -7px; + right: 0; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemAfter:after, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemAfter:after, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper .alfresco-dnd-DroppedItemWrapper.dojoDndItem.dojoDndItemOver.dojoDndItemAfter:after { + border-right: 2px dashed #0081c7; + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: -7px; +} + +/* DnD avatars - remove dojo template */ +body.claro > table.dojoDndAvatar, +body.claro.dojoDndMove > table.dojoDndAvatar { + border: none; + border-collapse: collapse; + background-color: transparent; + box-shadow: none; + padding: 0; + margin: 0; + min-width: 200px; + max-width: 400px; +} +body.claro > table.dojoDndAvatar tr.dojoDndAvatarHeader, +body.claro.dojoDndMove > table.dojoDndAvatar tr.dojoDndAvatarHeader { + display: none; +} +body.claro > table.dojoDndAvatar td, +body.claro.dojoDndMove > table.dojoDndAvatar td { + border: none; + padding: 0; + margin: 0; +} + +/* DnD avatars - colours during drag */ +body.claro > table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropItem.dragTemplate span, +body.claro > table.dojoDndAvatar tr.dojoDndAvatarItem td > .alfresco-dnd-DroppedItemWrapper span { + color: #0081c7; +} + +body.claro > table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropItem.dragTemplate, +body.claro > table.dojoDndAvatar tr.dojoDndAvatarItem td > .alfresco-dnd-DroppedItemWrapper { + border-color: #0081c7; + background-color: #f2fbff; +} + +/* DnD avatars - colours for canDrop */ +body.claro > table.dojoDndAvatar.dojoDndAvatarCanDrop tr.dojoDndAvatarItem td > .alfresco-dnd-DroppedItemWrapper span { + color: #333; +} +body.claro > table.dojoDndAvatar.dojoDndAvatarCanDrop tr.dojoDndAvatarItem td > .alfresco-dnd-DroppedItemWrapper { + border-color: #ccc; + background-color: #fff; + border-radius: 3px; +} + +/* DnD avatars - Items from the menus have slightly different classes */ +.dojoDndItem .alfresco-dnd-DragAndDropItem.dragTemplate { + box-shadow: none; +} +body.claro > table.dojoDndAvatar.dojoDndAvatarCanDrop tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropItem.dragTemplate span { + color: #333; +} +body.claro > table.dojoDndAvatar.dojoDndAvatarCanDrop tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropItem.dragTemplate { + border-color: #ccc; + background-color: #fff; + border-radius: 3px; +} + +table.dojoDndAvatar tr.dojoDndAvatarItem { + opacity: 1.0 !important; +} +table.dojoDndAvatar tr.dojoDndAvatarHeader td span { + display: none; +} +table.dojoDndAvatar tr.dojoDndAvatarItem td > .alfresco-dnd-DroppedItemWrapper { + margin: 5px; + border-radius: 3px; +} +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropTarget .previewPanel { + min-width: 200px; +} +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DragAndDropTarget .previewPanel { + padding: 8px 4px 4px 10px; +} + +/* Wrappers throughout their lifecycle */ +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper, +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DroppedItemWrapper { + margin: 5px 8px 10px 2px; + box-shadow: none; + transition: none; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper:last-of-type { + margin-bottom: 10px; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper > .actions, +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DroppedItemWrapper > .actions { + position: absolute; + top: 5px; + right: 5px; + margin: 0; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper > .dojoDndHandle, +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DroppedItemWrapper > .dojoDndHandle { + position: absolute; + top: 5px; + left: 5px; + margin: 0; + cursor: move; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper > .label { + position: absolute; + top: 4px; + left: 25px; + margin: 0; + font-size: 103%; + color: #000; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper > .control, +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DroppedItemWrapper > .control { + margin-top: 20px; + margin-bottom: 0; +} +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DroppedItemWrapper > .label { + position: relative; + top: 0; + margin: 0 0 0 20px; + font-size: 103%; + color: #000; +} + +/* Nested targets */ +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget .previewPanel { + max-width: 800px; + min-width: 800px; + min-height: 500px; + margin: 0; + box-shadow: none; + padding: 4px 0px 6px 6px; + border: 1px solid #ccc; +} +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropTarget .previewPanel { + margin: 0; + box-shadow: none; + padding: 6px 0 6px 6px; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget .previewPanel .previewPanel { + display: inline-block; + width: 100%; + min-height: 42px; + min-width: 758px; + padding: 6px 1px 0 7px; + background-image: none; + border: 1px dashed #ccc; +} +table.dojoDndAvatar tr.dojoDndAvatarItem .alfresco-dnd-DragAndDropTarget .previewPanel .previewPanel { + display: inline-block; + width: 100%; + padding: 6px 1px 0 7px; +} +.alfresco-dnd-DragAndDropTarget .alfresco-dnd-DragAndDropTarget { + padding-right: 10px; +} + +#FORM_EDITOR_CONSOLE .alfresco-dnd-DragAndDropItems .dojoDndItem.dojoDndItemAnchor, +#FORM_EDITOR_CONSOLE .alfresco-dnd-DragAndDropItems .dojoDndItem.dojoDndItemOver { + background-color: transparent; + border: none; +} + +#FORM_CANVAS.alfresco-forms-controls-BaseFormControl > .control-row .previewPanel { + line-height: 1.231; +} + +#FORM_EDITOR .buttons { + background-color: #eee; + padding: 6px 6px 6px 0px; + text-align: right; +} +#FORM_EDITOR .buttons .alfresco-buttons-AlfButton { + margin-right: 0; + margin-left: 15px; +} + +/* Title pane */ +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE { + position: absolute; + top: 116px; + left: 1004px; + z-index: 100; + width: 238px; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info { + background-color: #f5f5f5; + padding: 0 3px; + border-left: 1px solid #eee; + border-right: 1px solid #eee; + margin-bottom: 0; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info.first { + border-top: 1px solid #eee; + padding-bottom: 0; + margin-bottom: 0; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info.last { + border-bottom: 1px solid #eee; + padding-top: 0; + margin-bottom: 10px; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info div.title-row, +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info div.control-row { + height: 20px; + max-width: 160px !important; + text-align: right; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info div.title-row { + width: 48px; + display: inline-block; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info div.title-row > label { + font: inherit; + font-size: 12px; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info div.control-row div { + border: none; + background-color: transparent; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .edit-properties-info div.control-row div input { + font-style: italic; + padding-bottom: 3px; + text-overflow: ellipsis; +} +#FORM_EDITOR_CONSOLE #PROPERTIES_PANEL #ALF_DROPPED_ITEM_CONFIGURATION_TITLE_PANE .underborder { + border-bottom: 1px solid #eee; + padding-bottom: 13px; +} + +/* Properties panel */ +#PROPERTIES_PANEL .alfresco-forms-controls-BaseFormControl > .title-row { + width: auto; + text-align: left; + float: none; + display: inline-block; +} +#PROPERTIES_PANEL .alfresco-forms-controls-BaseFormControl > .title-row > label { + font-size: 13px; + line-height: normal; + margin-bottom: 0; +} +#PROPERTIES_PANEL .alfresco-forms-controls-BaseFormControl > .title-row > label:after { + content: ":"; +} +#PROPERTIES_PANEL .alfresco-forms-controls-BaseFormControl > .description-row > .description { + margin: 0; +} +#CMM #PROPERTIES_PANEL .cmm-forms-controls-SimpleStyle .alfresco-buttons-AlfButton { + padding: 0; +} + +/* Editor panel columns */ +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper { + background-color: #fff; + border-color: #ccc; + border-radius: 3px; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper.selected, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper.selected, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper.selected, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper.selected, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DragAndDropTarget .alfresco-dnd-DroppedItemWrapper.selected { + color: #0081c7; + border: 1px solid #0081c7; + border-radius: 3px; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumn .previewPanel .alfresco-dnd-DroppedItemWrapper, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumnWideLeft .previewPanel .alfresco-dnd-DroppedItemWrapper, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.tripleColumn .previewPanel .alfresco-dnd-DroppedItemWrapper { + float: left; + margin-bottom: 5px; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumn .previewPanel .alfresco-dnd-DroppedItemWrapper:last-of-type, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumnWideLeft .previewPanel .alfresco-dnd-DroppedItemWrapper:last-of-type, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.tripleColumn .previewPanel .alfresco-dnd-DroppedItemWrapper:last-of-type { + margin-bottom: 10px; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumn .previewPanel .alfresco-dnd-DroppedItemWrapper { + width: 47%; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumnWideLeft .previewPanel .alfresco-dnd-DroppedItemWrapper:nth-child(odd) { + width: 63%; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.doubleColumnWideLeft .previewPanel .alfresco-dnd-DroppedItemWrapper:nth-child(even) { + width: 30%; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DragAndDropTarget.tripleColumn .previewPanel .alfresco-dnd-DroppedItemWrapper { + width: 30%; +} + +/* Dropped widgets */ +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper .actions { + display: none; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DragAndDropTarget .alfresco-dnd-DroppedItemWrapper, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper { + background-color: #fff; + border-color: #ccc; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DragAndDropTarget .label, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DragAndDropTarget .label { + font-size: 100%; + color: #444; + position: static; + display: inline-block; + margin: 0; + padding: 0 20px; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.singleColumnWrapper > .dojoDndHandle { + background-image: url(./images/single-col-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper > .dojoDndHandle { + background-image: url(./images/double-col-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper > .dojoDndHandle { + background-image: url(./images/double-col-wide-left-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper > .dojoDndHandle { + background-image: url(./images/triple-col-16.png); +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.textWidget .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.textWidget .dojoDndHandle { + background-image: url(./images/text-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.contentWidget .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.contentWidget .dojoDndHandle { + background-image: url(./images/content-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.numericWidget .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.numericWidget .dojoDndHandle { + background-image: url(./images/numeric-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.dateWidget .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.dateWidget .dojoDndHandle { + background-image: url(./images/date-16.png); +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.booleanWidget .dojoDndHandle, +body > table.dojoDndAvatar .alfresco-dnd-DroppedItemWrapper.booleanWidget .dojoDndHandle { + background-image: url(./images/boolean-16.png); +} + +.alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DroppedItem { + display: none; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper .alfresco-dnd-DragAndDropTarget .alfresco-dnd-DroppedItemWrapper.dojoDndItem { + padding-bottom: 3px; + border-radius: 3px; +} + +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper .alfresco-dnd-DroppedItemWrapper .actions .action.up .image, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper .alfresco-dnd-DroppedItemWrapper .actions .action.up .image, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper .alfresco-dnd-DroppedItemWrapper .actions .action.up .image { + display: inline-block; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: url(./images/move-left.png) no-repeat; + width: 12px; + height: 13px; + padding-left: 12px; +} +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWrapper .alfresco-dnd-DroppedItemWrapper .actions .action.down .image, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.doubleColumnWideLeftWrapper .alfresco-dnd-DroppedItemWrapper .actions .action.down .image, +#FORM_EDITOR_CONSOLE #FORM_CANVAS .alfresco-dnd-DroppedItemWrapper.tripleColumnWrapper .alfresco-dnd-DroppedItemWrapper .actions .action.down .image { + display: inline-block; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: url(./images/move-right.png) no-repeat; + width: 12px; + height: 13px; + padding-left: 12px; +} + +#FORM_EDITOR_CONSOLE div.left-widgets { + background-color: #eee; + border: 1px solid #ccc; +} + +#FORM_EDITOR_CONSOLE .paletteLabel { + display: inline-block; + margin-top: 14px; + margin-left: 10px; + font-size: 13px; + font-family: 'Open Sans Bold'; +} + +#FORM_EDITOR_CONSOLE .layoutLabel { + position: absolute; + margin: 14px; + font-size: 13px; + font-family: 'Open Sans Bold'; +} + +#FORM_EDITOR_CONSOLE #FORM_EDITOR .layout-help-top { + position: absolute; + margin-left: 285px; + max-width: 305px; +} + +#FORM_EDITOR_CONSOLE #FORM_EDITOR .layout-help-left { + position: absolute; + margin-top: 200px; + max-width: 680px; +} + +#FORM_EDITOR_CONSOLE #FORM_EDITOR .layout-help-bottom { + position: absolute; + right: calc(100% - 980px); + bottom: calc(100% - 700px); + min-width: 300px; + max-width: 500px; +} \ No newline at end of file diff --git a/share/src/main/webapp/cmm/css/images/activate-16.png b/share/src/main/webapp/cmm/css/images/activate-16.png new file mode 100644 index 0000000000..c2c6951ef2 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/activate-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/any-16.png b/share/src/main/webapp/cmm/css/images/any-16.png new file mode 100644 index 0000000000..9d9a00a6f3 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/any-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/boolean-16.png b/share/src/main/webapp/cmm/css/images/boolean-16.png new file mode 100644 index 0000000000..21aecb9e69 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/boolean-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/columns-16.png b/share/src/main/webapp/cmm/css/images/columns-16.png new file mode 100644 index 0000000000..ce8cc61802 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/columns-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/content-16.png b/share/src/main/webapp/cmm/css/images/content-16.png new file mode 100644 index 0000000000..0057d22dc7 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/content-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/date-16.png b/share/src/main/webapp/cmm/css/images/date-16.png new file mode 100644 index 0000000000..1c76268cd3 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/date-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/datetime-16.png b/share/src/main/webapp/cmm/css/images/datetime-16.png new file mode 100644 index 0000000000..1c76268cd3 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/datetime-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/deactivate-16.png b/share/src/main/webapp/cmm/css/images/deactivate-16.png new file mode 100644 index 0000000000..c1904197fd Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/deactivate-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/delete-16.png b/share/src/main/webapp/cmm/css/images/delete-16.png new file mode 100644 index 0000000000..119057642e Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/delete-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/double-16.png b/share/src/main/webapp/cmm/css/images/double-16.png new file mode 100644 index 0000000000..3f38e5f5f9 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/double-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/double-col-16.png b/share/src/main/webapp/cmm/css/images/double-col-16.png new file mode 100644 index 0000000000..f1dfc05223 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/double-col-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/double-col-wide-left-16.png b/share/src/main/webapp/cmm/css/images/double-col-wide-left-16.png new file mode 100644 index 0000000000..d39a7cd92d Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/double-col-wide-left-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/edit-16.png b/share/src/main/webapp/cmm/css/images/edit-16.png new file mode 100644 index 0000000000..60a2a81efd Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/edit-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/edit-form-16.png b/share/src/main/webapp/cmm/css/images/edit-form-16.png new file mode 100644 index 0000000000..3307c2dbd2 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/edit-form-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/encrypted-16.png b/share/src/main/webapp/cmm/css/images/encrypted-16.png new file mode 100644 index 0000000000..7d84aa4ce4 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/encrypted-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/export-16.png b/share/src/main/webapp/cmm/css/images/export-16.png new file mode 100644 index 0000000000..47d8b8ebc6 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/export-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/float-16.png b/share/src/main/webapp/cmm/css/images/float-16.png new file mode 100644 index 0000000000..3f38e5f5f9 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/float-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/import-16.png b/share/src/main/webapp/cmm/css/images/import-16.png new file mode 100644 index 0000000000..d448600c3b Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/import-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/int-16.png b/share/src/main/webapp/cmm/css/images/int-16.png new file mode 100644 index 0000000000..3f38e5f5f9 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/int-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/long-16.png b/share/src/main/webapp/cmm/css/images/long-16.png new file mode 100644 index 0000000000..3f38e5f5f9 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/long-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/move-left.png b/share/src/main/webapp/cmm/css/images/move-left.png new file mode 100644 index 0000000000..467d9736fd Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/move-left.png differ diff --git a/share/src/main/webapp/cmm/css/images/move-right.png b/share/src/main/webapp/cmm/css/images/move-right.png new file mode 100644 index 0000000000..8fb75fa35e Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/move-right.png differ diff --git a/share/src/main/webapp/cmm/css/images/numeric-16.png b/share/src/main/webapp/cmm/css/images/numeric-16.png new file mode 100644 index 0000000000..3f38e5f5f9 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/numeric-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/plus-16.png b/share/src/main/webapp/cmm/css/images/plus-16.png new file mode 100644 index 0000000000..19a9f46cbb Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/plus-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/search-16.png b/share/src/main/webapp/cmm/css/images/search-16.png new file mode 100644 index 0000000000..834d1df661 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/search-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/single-col-16.png b/share/src/main/webapp/cmm/css/images/single-col-16.png new file mode 100644 index 0000000000..b6ba2e4f04 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/single-col-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/text-16.png b/share/src/main/webapp/cmm/css/images/text-16.png new file mode 100644 index 0000000000..0c843a303c Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/text-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/textml-16.png b/share/src/main/webapp/cmm/css/images/textml-16.png new file mode 100644 index 0000000000..0c843a303c Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/textml-16.png differ diff --git a/share/src/main/webapp/cmm/css/images/triple-col-16.png b/share/src/main/webapp/cmm/css/images/triple-col-16.png new file mode 100644 index 0000000000..4457f69949 Binary files /dev/null and b/share/src/main/webapp/cmm/css/images/triple-col-16.png differ diff --git a/share/src/main/webapp/components/admin/replication-job.css b/share/src/main/webapp/components/admin/replication-job.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/share/src/main/webapp/components/admin/replication-job.js b/share/src/main/webapp/components/admin/replication-job.js new file mode 100644 index 0000000000..9a36714796 --- /dev/null +++ b/share/src/main/webapp/components/admin/replication-job.js @@ -0,0 +1,559 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Replication Job Form component. + * + * @namespace Alfresco + * @class Alfresco.component.ReplicationJob + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + + /** + * ReplicationJob constructor. + * + * @param htmlId {String} The HTML id of the parent element + * @return {Alfresco.component.ReplicationJob} The new ReplicationJob instance + * @constructor + */ + Alfresco.component.ReplicationJob = function(htmlId) + { + Alfresco.component.ReplicationJob.superclass.constructor.call(this, "Alfresco.component.ReplicationJob", htmlId, ["button", "menu", "container", "json"]); + + // Initialise prototype properties + + // Decoupled event listeners + + return this; + }; + + /** + * Extend from Alfresco.component.Base + */ + YAHOO.extend(Alfresco.component.ReplicationJob, Alfresco.component.Base, + { + /** + * Form Runtime instance + * + * @property form + * @type Alfresco.forms.Form + */ + form: null, + + /** + * Form controls loaded deferred event utility instance + * + * @property controlsLoadedDeferred + * @type Alfresco.util.Deferred + */ + controlsLoadedDeferred: null, + + /** + * Payload property extracted from object picker control. + * + * @property payload + * @type Array + */ + payload: null, + + /** + * Transfer Target property extracted from object picker control. + * + * @property targetName + * @type String + */ + targetName: null, + + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Job Name - implies editing mode if set + * + * @property jobName + * @type string + */ + jobName: "", + + /** + * Payload property from an existing Job + * + * @property payload + * @type Array + */ + payload: [], + + /** + * Target Name from an existing Job + * + * @property targetName + * @type string + */ + targetName: "", + + /** + * Schedule Start from an existing Job + * + * @property scheduleStart + * @type string (iso8601 date) + */ + scheduleStart: "" + }, + + /** + * Evaluate create mode (rather than edit mode) + * + * @method isCreateMode + * @return {Boolean} true for create mode + */ + isCreateMode: function ReplicationJob_isCreateMode() + { + return (this.options.jobName == ""); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * + * @method onReady + */ + onReady: function ReplicationJob_onReady() + { + // Reference to self used by inline functions + var me = this; + + // "Create Job" button needs to be "submit" type + this.widgets.submitButton = Alfresco.util.createYUIButton(this, "form-submit", null, + { + type: "submit" + }); + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "form-cancel", this.onCancel); + + /* Defer initializing Forms Runtime until all controls loaded */ + this.controlsLoadedDeferred = new Alfresco.util.Deferred(["onPayloadControl", "onTransferTargetControl", "onScheduleStartControl"], + { + fn: this.onFormControlsLoaded, + scope: this + }); + + this.createPayloadControl(this.id + "-payloadContainer"); + this.createTransferTargetControl(this.id + "-transferTargetContainer"); + this.createScheduleStartControl(this.id + "-scheduleStartContainer"); + + this.widgets.scheduleCheckbox = Dom.get(this.id + "-scheduleEnabled"); + this.widgets.scheduleContainer = Dom.get(this.id + "-scheduleContainer"); + Event.addListener(this.widgets.scheduleCheckbox, "click", this.onScheduleChange, this, true); + + YAHOO.Bubbling.on("mandatoryControlValueUpdated", this.onDatePickerMandatoryControlValueUpdated, this); + YAHOO.Bubbling.on("registerValidationHandler", this.onRegisterValidationHandler, this); + }, + + /** + * Generate the Payload control + * + * @method createPayloadControl + * @param p_id {String} DOM ID of container element in which to render the control + */ + createPayloadControl: function ReplicationJob_createPayloadControl(p_id) + { + this.widgets.payload = new Alfresco.module.ControlWrapper(Alfresco.util.generateDomId()).setOptions( + { + name: "payload", + type: "association", + container: Dom.get(p_id), + label: this.msg("label.source-items"), + value: this.options.payload.join(","), + controlParams: + { + displayMode: "list", + multipleSelectMode: true + }, + fnValueChanged: + { + fn: function ReplicationJob_createPayloadControl_fnValueChanged(obj) + { + // Object Finder returns added and removed, but we need selected nodeRefs + this.payload = null; + if (obj.selectedItems.length > 0) + { + this.payload = obj.selectedItems; + } + }, + scope: this + } + }); + this.widgets.payload.render( + { + fn: function ReplicationJob_createPayloadControl_callback() + { + this.controlsLoadedDeferred.fulfil("onPayloadControl"); + }, + scope: this + }); + }, + + /** + * Generate the Transfer Target control + * + * @method createTransferTargetControl + * @param p_id {String} DOM ID of container element in which to render the control + */ + createTransferTargetControl: function ReplicationJob_createTransferTargetControl(p_id) + { + this.widgets.transferTarget = new Alfresco.module.ControlWrapper(Alfresco.util.generateDomId()).setOptions( + { + name: "targetName", + type: "association", + container: Dom.get(p_id), + label: this.msg("label.transfer-to"), + value: this.options.targetName, + controlParams: + { + startLocation: "/app:company_home/app:dictionary/app:transfers/app:transfer_groups/cm:default", + valueType: "xpath;/app:company_home/app:dictionary/app:transfers/app:transfer_groups//cm:%VALUE%" + }, + field: + { + endpointType: "trx:transferTarget", + endpointMany: false + }, + fnValueChanged: + { + fn: function ReplicationJob_createTransferTargetControl_fnValueChanged(obj) + { + // Object Finder returns nodeRefs by default, but we need the name for Transfer Target + this.targetName = null; + if (obj.selectedItems.length === 1) + { + this.targetName = obj.selectedItemsMetaData[obj.selectedItems[0]].name; + } + }, + scope: this + } + }); + this.widgets.transferTarget.render( + { + fn: function ReplicationJob_createTransferTargetControl_callback() + { + this.controlsLoadedDeferred.fulfil("onTransferTargetControl"); + }, + scope: this + }); + }, + + /** + * Generate the Schedule Start control + * + * @method createScheduleStartControl + * @param p_id {String} DOM ID of container element in which to render the control + */ + createScheduleStartControl: function ReplicationJob_createScheduleStartControl(p_id) + { + this.widgets.scheduleStart = new Alfresco.module.ControlWrapper(Alfresco.util.generateDomId()).setOptions( + { + name: "schedule.start.iso8601", + type: "date", + container: Dom.get(p_id), + label: this.msg("label.start-date"), + value: this.options.scheduleStart, + controlParams: + { + showTime: "true" + }, + field: + { + mandatory: true + } + }); + this.widgets.scheduleStart.render( + { + fn: function ReplicationJob_createScheduleStartControl_callback() + { + this.controlsLoadedDeferred.fulfil("onScheduleStartControl"); + }, + scope: this + }); + }, + + /** + * Form controls loaded deferred event handler + * + * @method onFormControlsLoaded + */ + onFormControlsLoaded: function ReplicationJob_onFormControlsLoaded() + { + var scope = this; + + // Form definition + this.form = new Alfresco.forms.Form(this.id + "-form"); + + // Validator - Name + this.form.addValidation(this.id + "-prop_name", Alfresco.forms.validation.mandatory, null, "blur"); + this.form.addValidation(this.id + "-prop_name", Alfresco.forms.validation.nodeName, null, "keyup"); + this.form.addValidation(this.id + "-prop_name", Alfresco.forms.validation.length, + { + max: 100, + crop: true + }, "keyup"); + + // Validator - Description + this.form.addValidation(this.id + "-prop_description", Alfresco.forms.validation.length, + { + max: 512, + crop: true + }, "keyup"); + + // Validator - Interval Count + this.form.addValidation(this.id + "-prop_intervalCount", Alfresco.forms.validation.length, + { + max: 4, + crop: true + }, "keyup"); + this.form.addValidation(this.id + "-prop_intervalCount", function ReplicationJob_onFormControlsLoaded_fnValidateIntervalCount(field, args, event, form, silent, message) + { + return !(scope.isScheduleEnabled() && isNaN(parseInt(field.value))); + }, null, "blur"); + + // Validator - Interval Period + this.form.addValidation(this.id + "-prop_intervalPeriod", function ReplicationJob_onFormControlsLoaded_fnValidateIntervalPeriod(field, args, event, form, silent, message) + { + return !(scope.isScheduleEnabled() && field.options[field.selectedIndex].value == "-"); + }, null, "change"); + + // Validator - Start Date + this.form.addValidation(this.widgets.scheduleStart.id + "_schedule.start.iso8601", function ReplicationJob_onFormControlsLoaded_fnValidateStartDate(field, args, event, form, silent, message) + { + return !(scope.isScheduleEnabled() && !Alfresco.forms.validation.mandatory(field, args, event, form, silent, message)); + }, null, "blur"); + + this.form.setSubmitElements(this.widgets.submitButton); + this.form.setAJAXSubmit(true, + { + successCallback: + { + fn: this.onSuccess, + scope: this + }, + failureCallback: + { + fn: this.onFailure, + scope: this + } + }); + this.form.setSubmitAsJSON(true); + this.form.setAjaxSubmitMethod(this.isCreateMode() ? "POST" : "PUT"); + + // Intercept data just before AJAX submission + this.form.doBeforeAjaxRequest = + { + fn: this.doBeforeAjaxRequest, + scope: this + }; + + // Initialise the form + this.form.init(); + + // Initialise schedule hidden div state + this.onScheduleChange(); + + // Focus name field + Dom.get(this.id + "-prop_name").focus(); + }, + + /** + * Interceptor just before Ajax request is sent + * + * @method doBeforeAjaxRequest + * @param p_config {object} Object literal containing request config + * @return {boolean} True to continue sending form, False to prevent it + */ + doBeforeAjaxRequest: function ReplicationJob_doBeforeAjaxRequest(p_config) + { + // Clean-up the auto-generated form output before ajax submission + p_config.dataObj.payload = this.payload || []; + delete p_config.dataObj["payload_added"]; + delete p_config.dataObj["payload_removed"]; + if (this.targetName !== null) + { + p_config.dataObj.targetName = this.targetName; + } + delete p_config.dataObj["targetName_added"]; + delete p_config.dataObj["targetName_removed"]; + p_config.dataObj["enabled"] = (p_config.dataObj["enabled"] == "true"); + if (!this.isScheduleEnabled()) + { + p_config.dataObj.schedule = null; + } + return true; + }, + + /** + * Schedule enabled evaluator + * + * @method isScheduleEnabled + */ + isScheduleEnabled: function ReplicationJob_isScheduleEnabled() + { + return (this.widgets.scheduleCheckbox.checked); + }, + + /** + * Schedule Checkbox onChange event handler + * + * @method onScheduleChange + */ + onScheduleChange: function ReplicationJob_onScheduleChange(p_event) + { + if (this.isScheduleEnabled()) + { + Dom.removeClass(this.widgets.scheduleContainer, "hidden"); + } + else + { + Dom.addClass(this.widgets.scheduleContainer, "hidden"); + } + + this.form.validate(); + }, + + /** + * Called when a date has been selected from a date picker. + * Will cause the forms validation to run. + * + * @method onDatePickerMandatoryControlValueUpdated + * @param layer + * @param args + */ + onDatePickerMandatoryControlValueUpdated: function ReplicationJob_onDatePickerMandatoryControlValueUpdated(layer, args) + { + this.form.validate(); + }, + + /** + * Register validation handler event handler + * + * @method onRegisterValidationHandler + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onRegisterValidationHandler: function ReplicationJob_onRegisterValidationHandler(layer, args) + { + // The date picker control needs to register validation handlers to check the + // validity of manually entered dates and times, we register our own handler in + // this case so we can also check whether the schedule is enabled or not. + + // extract the validation arguments + var validation = args[1]; + + // check the minimim required data is provided + if (validation && validation.fieldId) + { + var scope = this; + + // register our custom handler with the forms runtime instance + this.form.addValidation(validation.fieldId, function ReplicationJob_fnValidateDateTime(field, args, event, form, silent, message) + { + return !(scope.isScheduleEnabled() && !Alfresco.forms.validation.validDateTime(field, args, event, form, silent, message)); + }, validation.args, validation.when, validation.message); + } + }, + + /** + * Cancel button click handler. + * + * @method onCancel + * @param type {string} Event type + * @param args {object} Event arguments + */ + onCancel: function ReplicationJob_onCancel(type, args) + { + this._navigateForward(); + }, + + /** + * Success handler + * + * @method onSuccess + * @param response {object} The response from the ajax request + */ + onSuccess: function ReplicationJob_onSuccess(response) + { + this._navigateForward(response.json.data.name); + }, + + /** + * Failure handler + * + * @method onFailure + * @param response {object} The response from the ajax request + */ + onFailure: function ReplicationJob_onFailure(response) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("header." + this.isCreateMode() ? "create" : "edit"), + text: (response.json && response.json.message ? response.json.message : this.msg("message.unknown-error")) + }); + }, + + /** + * Navigate forward depending on the page outcome + * + * @method _navigateForward + * @param jobName {string} Optional job name parameter to pass forward + * @protected + */ + _navigateForward: function ReplicationJob__navigateForward(jobName) + { + var url = Alfresco.util.uriTemplate("consoletoolpage", + { + pageid: "admin-console", + toolid: "replication-jobs" + }); + + if (YAHOO.lang.isString(jobName)) + { + url += "?jobName=" + encodeURIComponent(jobName); + } + else if (history.length > 1) + { + // Do we have a browser history? If so, go back a page + history.go(-1); + } + + window.location.href = url; + } + }); +})(); diff --git a/share/src/main/webapp/components/blog/archive.js b/share/src/main/webapp/components/blog/archive.js new file mode 100644 index 0000000000..e647554d18 --- /dev/null +++ b/share/src/main/webapp/components/blog/archive.js @@ -0,0 +1,278 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * BlogPostListArchive component. + * + * @namespace Alfresco + * @class Alfresco.BlogPostListArchive + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * BlogPostListArchive constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.BlogPostListArchive} The new DoclistTags instance + * @constructor + */ + Alfresco.BlogPostListArchive = function(htmlId) + { + Alfresco.BlogPostListArchive.superclass.constructor.call(this, "Alfresco.BlogPostListArchive", htmlId); + + this.monthId = + { + id: 0, + months: {} + }; + + // Decoupled event listeners + YAHOO.Bubbling.on("archiveRefresh", this.onArchiveRefresh, this); + + return this; + }; + + YAHOO.extend(Alfresco.BlogPostListArchive, Alfresco.component.BaseFilter, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "blog" + */ + containerId: "blog" + }, + + /** + * Object literal used to generate unique tag ids + * + * @property tagId + * @type object + */ + monthId: null, + + /** + * Fired by YUI when parent element is available for scripting. + * Registers event handler on 'onTagRefresh' event. If a component wants to refresh + * the tags component, they need to fire this event. + * + * @method onReady + */ + onReady: function BlogPostListArchive_onReady() + { + Alfresco.BlogPostListArchive.superclass.onReady.call(this); + + var me = this; + + YAHOO.Bubbling.addDefaultAction(this.uniqueEventKey, function(layer, args) + { + var link = args[1].target; + if (link && !me.controlsDeactivated) + { + var liElem = Dom.getAncestorByTagName(link, 'li'); + var date = me._getMonthFromId(liElem.id); + YAHOO.Bubbling.fire("changeFilter", + { + filterId: "bymonth", + filterOwner: me.name, + filterData: + { + year: date.getFullYear(), + month: date.getMonth() + } + }); + } + return true; + }, true); + + // Kick-off tag population + if (this.options.siteId && this.options.containerId) + { + YAHOO.Bubbling.fire("archiveRefresh"); + } + }, + + + /** + * BUBBLING LIBRARY EVENT HANDLERS + * Disconnected event handlers for inter-component event notification + */ + + /** + * Fired when the currently active filter has changed + * @method onFilterChanged + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFilterChanged: function BlogPostListArchive_onFilterChanged(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.filterId !== null)) + { + if (obj.filterOwner == this.name) + { + // Remove the old highlight, as it might no longer be correct + if (this.selectedFilter !== null) + { + Dom.removeClass(this.selectedFilter, "selected"); + } + + var date = new Date(obj.filterData.year, obj.filterData.month, 1); + // Need to find the selectedFilter element, from the current filterId + this.selectedFilter = Dom.get(this._generateIdFromMonth(date)); + + // This component now owns the active filter + Dom.addClass(this.selectedFilter, "selected"); + } + else + { + // Currently filtering by something other than this component + if (this.selectedFilter !== null) + { + Dom.removeClass(this.selectedFilter, "selected"); + this.selectedFilter = null; + } + } + } + }, + + /** + * Function that gets called when another component fires "tagRefresh" + * Issues a request to retrieve the latest tag data. + * + * @method onArchiveRefresh + * @param layer {string} the event source + * @param args {object} arguments object + */ + onArchiveRefresh: function BlogPostListArchive_onArchiveRefresh(layer, args) + { + var timestamp = new Date().getTime(); + var url = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/blog/site/{site}/{container}/postspermonth?d=" + timestamp, + { + site: this.options.siteId, + container: this.options.containerId + }); + + Alfresco.util.Ajax.request( + { + method: Alfresco.util.Ajax.GET, + url: url, + successCallback: + { + fn: this.onArchiveRefresh_success, + scope: this + }, + failureCallback: + { + fn: this.onArchiveRefresh_success, + scope: this + } + }); + }, + + /** + * Event handler for when the tag data loads successfully. + * + * @method onArchiveRefresh_success + * @param response {object} Server response object + */ + onArchiveRefresh_success: function BlogPostListArchive_onArchiveRefresh_successs(response) + { + if (response && response.json && !YAHOO.lang.isUndefined(response.json.items)) + { + var html = ""; + var items = response.json.items; + for (var i = 0, j = items.length; i < j; i++) + { + var date = new Date(items[i].year, items[i].month, 1); + html += this._generateMonthMarkup(date); + } + + var eMonths = Dom.get(this.id + "-archive"); + eMonths.innerHTML = html; + } + }, + + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Generates the HTML for a month element. + * + * @method _generateMonthMarkup + * @param date {date} the date to render + */ + _generateMonthMarkup: function BlogPostListArchive__generateTagMarkup(date) + { + var html = '
  • '; + html += '' + Alfresco.util.formatDate(date, Alfresco.util.message("date-format.monthYear")) + ''; + html += '
  • '; + return html; + }, + + /** + * Generate ID alias for month, suitable for DOM ID attribute + * + * @method _generateIdFromMonth + * @param date {date} Date representing the month + * @return {string} A unique DOM-safe ID for the month + */ + _generateIdFromMonth: function BlogPostListArchive__generateMonthId(date) + { + return this.id + "-month-" + date.getTime(); + }, + + /** + * Returns the date object that got encoded into the id by _generateIdFromMonth. + * @method _getMonthFromId + * @param id an id encoded by _generateMonthId + * @return a date object + */ + _getMonthFromId: function BlogPostListArchive__getMonthFromId(id) + { + // get the date millis part + var millis = parseInt(id.substring((this.id + "-month-").length), 10); + return new Date(millis); + } + }); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/blog/blog-common.js b/share/src/main/webapp/components/blog/blog-common.js new file mode 100644 index 0000000000..1c3fcda054 --- /dev/null +++ b/share/src/main/webapp/components/blog/blog-common.js @@ -0,0 +1,125 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * This file defines functions used across different blog related components + */ + +Alfresco.util.blog = {}; + + +/** + * Generate the REST url for a given blog post + * + * @method Alfresco.util.blog.generatePublishingRestURL + * @param site {string} the site id + * @param container {string} the container id + * @param postId {string} the post id/name + * @return a REST url for publishing the post + */ +Alfresco.util.blog.generatePublishingRestURL = function generatePublishingRestURL(site, container, postId) +{ + return YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/blog/post/site/{site}/{container}/{postId}/publishing", + { + site: site, + container: container, + postId: postId + }); +}; + +/** + * Generate a view url for a given site, container and blog post id. + * + * @param postId the id/name of the post + * @return an url to access the post + */ +Alfresco.util.blog.generateBlogPostViewUrl = function generateBlogPostViewUrl(site, container, postId) +{ + var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "site/{site}/blog-postview?postId={postId}&listViewLinkBack=true", + { + site: site, + postId: postId + }); + return url; +}; + +/** + * Generates the status label text for a given blog post + */ +Alfresco.util.blog.generatePostStatusLabel = function generatePostStatusLabel(me, data) +{ + if (data.isDraft) + { + return "(" + me._msg("status.draft") + ")"; + } + else if (data.isUpdated || data.isPublished) + { + var status = ''; + if (data.isUpdated) + { + status += "(" + me._msg("status.updated") + ") "; + } + + if (data.isPublished) + { + if (data.outOfDate) + { + return status + "(" + me._msg("status.published.outofsync") + ")"; + } + else + { + return status + "(" + me._msg("status.published") + ")"; + } + } + else + { + return status; + } + } + else + { + // internally published, no status displayed + return ""; + } +}; + +/** + * Returns the html for the actions for a given blog post. + * @param me the object that holds the _msg method used for i18n + * @param data the blog post data + * @param tagName the tag name to use for the actions. This will either be div or span, depending + * whether the actions are for the simple or detailed view. + */ +Alfresco.util.blog.generateBlogPostActions = function generateBlogPostActions(me, data, tagName) +{ + var desc = ''; + // begin actions + desc += '
    '; + if (data.permissions.edit) + { + desc += '<' + tagName + ' class="onEditBlogPost">' + me._msg("action.edit") + ''; + } + if (data.permissions['delete']) + { + desc += '<' + tagName + ' class="onDeleteBlogPost">' + me._msg("action.delete") + ''; + } + desc += '
    '; + return desc; +}; + diff --git a/share/src/main/webapp/components/blog/blogdiscussions-common.js b/share/src/main/webapp/components/blog/blogdiscussions-common.js new file mode 100644 index 0000000000..c12562ff40 --- /dev/null +++ b/share/src/main/webapp/components/blog/blogdiscussions-common.js @@ -0,0 +1,355 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + + +/** + * Person related utility functions + * A person object consists of the following data: + * { + * username : "", + * firstName : "", + * lastName : "", + * avatarRef : "" + * } + * Only the username is mandatory + */ +Alfresco.util.people = {}; + +/** + * Generate html markup for the user profile page + * + * @method Alfresco.util.people.generateUserLink + * @param person {object} a person object + * @return {string} an html link pointing to the user profile. + */ +Alfresco.util.people.generateUserLink = function generateUserLink(person) +{ + return Alfresco.util.userProfileLink(person.username, Alfresco.util.people.generateUserDisplayName(person), 'class="theme-color-1"'); +}; + +/** + * Generate the display name for a user + * + * @method Alfresco.util.people.generateUserDisplayName + * @param person {object} a person object + * @return {string} the display name of the person + */ +Alfresco.util.people.generateUserDisplayName = function generateUserDisplayName(person) +{ + var displayName = person.username; + if ((person.firstName !== undefined && person.firstName.length > 0) || + (person.lastName !== undefined && person.lastName.length > 0)) + { + displayName = ''; + if (person.firstName !== undefined) + { + displayName = person.firstName + ' '; + } + if (person.lastName !== undefined) + { + displayName += person.lastName; + } + } + return displayName; +}; + +/** + * Generate the avatar image markup for a perrson + * + * @method Alfresco.util.people.generateUserAvatarImg + * @param person {object} a person object + * @return {string} the avatar name of the person + */ +Alfresco.util.people.generateUserAvatarImg = function generateUserAvatarImg(person) +{ + var avatarUrl; + if (person.avatarRef) + { + avatarUrl = Alfresco.constants.PROXY_URI + 'api/node/' + person.avatarRef.replace('://','/') + '/content/thumbnails/avatar?c=queue&ph=true'; + } + else + { + avatarUrl = Alfresco.constants.URL_RESCONTEXT + 'components/images/no-user-photo-64.png'; + } + return '' + person.username + '-avatar-image'; +}; + + +Alfresco.util.rollover = {}; + +/** + * Attaches mouseover/exit event listener to the passed element. + * + * @method Alfresco.util.rollover._attachRolloverListener + * @param elem the element to which to add the listeners + * @param mouseOverEventName the bubble event name to fire for mouse enter events + * @param mouseOutEventName the bubble event name to fire for mouse out events + */ +Alfresco.util.rollover._attachRolloverListener = function(elem, mouseOverEventName, mouseOutEventName) +{ + var eventElem = elem, relTarg; + + var mouseOverHandler = function(e) + { + // find the correct target element and check whether we only moved between + // subelements of the hovered element + if (!e) + { + e = window.event; + } + relTarg = (e.relatedTarget !== undefined) ? e.relatedTarget : e.fromElement; + while (relTarg && relTarg != eventElem && relTarg.nodeName != 'BODY') + { + relTarg = relTarg.parentNode; + } + if (relTarg == eventElem) + { + return; + } + + // the mouse entered the element, fire an event to inform about it + YAHOO.Bubbling.fire(mouseOverEventName, + { + event: e, + target: eventElem + }); + }; + + var mouseOutHandler = function(e) + { + // find the correct target element and check whether we only moved between + // subelements of the hovered element + if (!e) + { + e = window.event; + } + relTarg = (e.relatedTarget !== undefined) ? e.relatedTarget : e.toElement; + while (relTarg !== null && relTarg != eventElem && relTarg.nodeName != 'BODY') + { + relTarg = relTarg.parentNode; + } + if (relTarg == eventElem) + { + return; + } + + // the mouse exited the element, fire an event to inform about it + YAHOO.Bubbling.fire(mouseOutEventName, + { + event: e, + target: eventElem + }); + }; + + YAHOO.util.Event.addListener(elem, 'mouseover', mouseOverHandler); + YAHOO.util.Event.addListener(elem, 'mouseout', mouseOutHandler); +}; + +/** + * Register rollover listeners to elements identified by a class and tag name. + * + * @param htmlId the id of the component for which the listeners get registered. + * This id is used to distinguish events from different components. + * @param className the class name of elements to add the listener to + * @param tagName the tag name of elements to add the listener to. + */ +Alfresco.util.rollover.registerListenersByClassName = function(htmlId, className, tagName) +{ + var mouseEnteredBubbleEventName = 'onRolloverMouseEntered-' + htmlId; + var mouseExitedBubbleEventName = 'onRolloverMouseExited-' + htmlId; + var elems = YAHOO.util.Dom.getElementsByClassName(className, tagName); + for (var x = 0; x < elems.length; x++) + { + Alfresco.util.rollover._attachRolloverListener(elems[x], mouseEnteredBubbleEventName, mouseExitedBubbleEventName); + } +}; + + +/** + * Register handle functions that handle the mouse enter/exit events + * + * @param htmlId the id of the component for which the listeners got registered + * @param mouseEnteredFn the function to call for mouse entered events + * @param mouseExitedFunction the function to call for mouse exited events + * @param scope the object which is used as scope for the function execution + */ +Alfresco.util.rollover.registerHandlerFunctions = function(htmlId, mouseEnteredFn, mouseExitedFn, scope) +{ + // register bubble events + var mouseEnteredBubbleEventName = 'onRolloverMouseEntered-' + htmlId; + var mouseExitedBubbleEventName = 'onRolloverMouseExited-' + htmlId; + YAHOO.Bubbling.on(mouseEnteredBubbleEventName, mouseEnteredFn, scope); + YAHOO.Bubbling.on(mouseExitedBubbleEventName, mouseExitedFn, scope); +}; + + +/** + * Tags related funtions + */ +Alfresco.util.tags = {}; + +/** + * Register a tag handler for an object/component. + * + * The handler issues "tagSelected" bubble events when users click on a + * tag link on a page. + * + * @method Alfresco.util.tags.registerTagActionHandler + * @param scope {object} the holder of the tagId object that is used to map tag ids to tag names + */ +Alfresco.util.tags.registerTagActionHandler = function registerTagActionHandler(scope) +{ + // Hook tag clicks + var fnTagHandler = function fnTagHandler(layer, args) + { + var tag = this.rel; + YAHOO.Bubbling.fire("tagSelected", + { + tagName: tag + }); + args[1].stop = true; + return true; + }; + YAHOO.Bubbling.addDefaultAction("tag-link", fnTagHandler); +}; + +/** + * Generate ID alias for tag, suitable for DOM ID attribute + * + * @method generateTagId + * @param scope {object} instance that contains a tagId object (which stores the generated tag id mappings) + * @param tagName {string} Tag name + * @return {string} A unique DOM-safe ID for the tag + */ +Alfresco.util.tags.generateTagId = function generateTagId(scope, tagName) +{ + var id = 0; + var tagId = scope.tagId; + if (tagName in tagId.tags) + { + id = tagId.tags[tagName]; + } + else + { + tagId.id++; + id = tagId.tags[tagName] = tagId.id; + } + return scope.id + "-tagId-" + id; +}; + +/** + * Generate the html markup for a tag link. + * + * @method Alfresco.util.tags.generateTagLink + * @param scope {object} the object that holds the tagId object which is used to map tag ids to tag names + * @param tagName {string} the tag to create a link for + * @return {string} the markup for a tag + */ +Alfresco.util.tags.generateTagLink = function generateTagLink(scope, tagName) +{ + var encodedTagName = Alfresco.util.encodeHTML(tagName); + return '' + encodedTagName + ''; +}; + + +Alfresco.util.editor = {}; + +Alfresco.util.editor.getTextOnlyToolbarConfig = function(msg) +{ + var toolbar = + { + titlebar: false, + buttons: + [ + { + group: 'textstyle', label: msg("yuieditor.toolbar.group.font"), + buttons: + [ + { + type: 'push', + label: msg("yuieditor.toolbar.item.bold"), + value: 'bold' + }, + { + type: 'push', + label: msg("yuieditor.toolbar.item.italic"), + value: 'italic' + }, + { + type: 'push', + label: msg("yuieditor.toolbar.item.underline"), + value: 'underline' + }, + { + type: 'separator' + }, + { + type: 'color', + label: msg("yuieditor.toolbar.item.fontcolor"), + value: 'forecolor', + disabled: true + }, + { + type: 'color', + label: msg("yuieditor.toolbar.item.backgroundcolor"), + value: 'backcolor', + disabled: true + } + ] + }, + { + type: 'separator' + }, + { + group: 'indentlist', + label: msg("yuieditor.toolbar.group.lists"), + buttons: + [ + { + type: 'push', + label: msg("yuieditor.toolbar.item.createunorderedlist"), + value: 'insertunorderedlist' + }, + { + type: 'push', + label: msg("yuieditor.toolbar.item.createorderedlist"), + value: 'insertorderedlist' + } + ] + }, + { + type: 'separator' + }, + { + group: 'insertitem', + label: msg("yuieditor.toolbar.group.link"), + buttons: + [ + { + type: 'push', + label: msg("yuieditor.toolbar.item.link"), + value: 'createlink', + disabled: true + } + ] + } + ] + }; + return toolbar; +}; diff --git a/share/src/main/webapp/components/blog/commentlist.css b/share/src/main/webapp/components/blog/commentlist.css new file mode 100644 index 0000000000..120ab833e0 --- /dev/null +++ b/share/src/main/webapp/components/blog/commentlist.css @@ -0,0 +1,83 @@ +/** Comment list */ + +.commentFooter +{ + margin-top: 20px; +} + +.comment +{ + border-top: 1px dashed #b1b1b1; + margin: 0 20px; + padding: 10px; + display: inline-block; +} + +html>body .comment +{ + display: block; +} + +.comment-list +{ + margin-right: 10px; +} + +.comment-list .commentsListTitle +{ + float: left; + background: transparent url(../images/comment-16.png) no-repeat scroll 20px 50%; + font-size: 116%; + padding: 20px 0pt 20px 40px; +} + +.comment-list .paginator +{ + float: right; + margin: 0; +} + +.comment-list .align-right +{ + text-align: right; +} + +.comment-list .yui-pg-container +{ + padding: 20px 25px 20px 0; +} + +.editCommentForm +{ + margin: 20px; + padding: 20px; + border-top: 1px solid #b1b1b1; + background-color: #fafafa; +} + +/* YUI WYSIWYG editor styles */ + +.yuieditor strong +{ + font-weight: bold; +} + +.yuieditor em +{ + font-style: italic; +} + +.yuieditor ul, .yuieditor ol +{ + padding-left: 40px; +} + +.yuieditor ul li +{ + list-style-type: disc; +} + +.yuieditor ol li +{ + list-style-type: decimal; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/blog/commentlist.js b/share/src/main/webapp/components/blog/commentlist.js new file mode 100644 index 0000000000..03ef52b201 --- /dev/null +++ b/share/src/main/webapp/components/blog/commentlist.js @@ -0,0 +1,898 @@ +/** + * CommentList component. + * + * Displays a list of comments. + * + * @namespace Alfresco + * @class Alfresco.CommentList + */ +(function() +{ + + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * CommentList constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.CommentList} The new Comment instance + * @constructor + */ + Alfresco.CommentList = function Alfresco_CommentList(htmlId) + { + Alfresco.CommentList.superclass.constructor.call(this, "Alfresco.CommentList", htmlId, ["editor", "paginator"]); + + /* Initialise prototype properties */ + this.editData = + { + editDiv: null, + viewDiv: null, + row: -1, + data: null, + widgets: {} + }; + this.busy = false; + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("setCommentedNode", this.onSetCommentedNode, this); + YAHOO.Bubbling.on("refreshComments", this.onRefreshComments, this); + + return this; + }; + + YAHOO.extend(Alfresco.CommentList, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "" + */ + containerId: "", + + /** + * Node reference of the item to comment about + */ + itemNodeRef: null, + + /** + * Title of the item to comment about for activites service. + */ + activityTitle: null, + + /** + * Page for activities link. + */ + activityPage: null, + + /** + * Params for activities link. + */ + activityPageParams: null, + + /** + * Width to use for comment editor + */ + width: 700, + + /** + * Height to use for comment editor + */ + height: 180, + + /** + * Number of items per page + * + * @property pageSize + * @type int + */ + pageSize: 10 + }, + + /** + * Object containing data about the currently edited + * comment. + */ + editData: null, + + /** + * Comments data + */ + commentsData: null, + + /** + * Tells whether an action is currently ongoing. + * + * @property busy + * @type boolean + * @see _setBusy/_releaseBusy + */ + busy: null, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function CommentList_onReady() + { + var me = this; + // YUI Paginator definition + var paginator = new YAHOO.widget.Paginator( + { + containers: [this.id + "-paginator"], + rowsPerPage: this.options.pageSize, + initialPage: 1, + template: this.msg("pagination.template"), + pageReportTemplate: this.msg("pagination.template.page-report"), + previousPageLinkLabel : this.msg("pagination.previousPageLinkLabel"), + nextPageLinkLabel : this.msg("pagination.nextPageLinkLabel") + }); + paginator.subscribe('changeRequest', this.onPaginatorChange, this, true); + paginator.set('recordOffset', 0); + paginator.set('totalRecords', 0); + paginator.render(); + this.widgets.paginator = paginator; + + // Hook action events for the comments + var fnActionHandlerDiv = function CommentList_fnActionHandlerDiv(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + var action = owner.className; + //var target = args[1].target; + if (typeof me[action] == "function") + { + var commentElem = Dom.getAncestorByClassName(owner, 'comment'), + index = parseInt(commentElem.id.substring((me.id + '-comment-view-').length), 10); + + me[action].call(me, index); + args[1].stop = true; + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("blogcomment-action", fnActionHandlerDiv); + + // initialize the mouse over listener + Alfresco.util.rollover.registerHandlerFunctions(this.id, this.onCommentElementMouseEntered, this.onCommentElementMouseExited, this); + }, + + /** + * Called by the paginator when a user has clicked on next or prev. + * Dispatches a call to the server and reloads the comment list. + * + * @method onPaginatorChange + * @param state {object} An object describing the required page changing + */ + onPaginatorChange : function CommentList_onPaginatorChange(state) + { + this._loadCommentsList(state.recordOffset); + }, + + /** + * Called by another component to set the node for which comments should be displayed + * + * @method onSetCommentedNode + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (nodeRef, title, page, pageParams) + */ + onSetCommentedNode: function CommentList_onSetCommentedNode(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.nodeRef !== null) && (obj.title !== null) && (obj.page !== null)) + { + this.options.itemNodeRef = obj.nodeRef; + this.options.activityTitle = obj.title; + this.options.activityPage = obj.page; + this.options.activityPageParams = obj.pageParams; + this._loadCommentsList(0); + } + }, + + /** + * Forces the comments list to fresh by reloading the data from the server + * + * @method onRefreshComments + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (reason) + */ + onRefreshComments: function CommentList_onRefreshComments(layer, args) + { + if (this.options.itemNodeRef && this.options.activityTitle) + { + var p = this.widgets.paginator, + obj = args[1]; + + // Find appropriate index + var startIndex = 0, + tr = p.getTotalRecords(), + ps = this.options.pageSize; + + if (obj.reason == "deleted") + { + // Make sure we dont use n invalid startIndex now that one is removed + var newTotalPages = Math.floor((tr - 1) / ps) + (((tr - 1) % ps) > 0 ? 1 : 0), + currentPage = p.getCurrentPage(); + + if (newTotalPages < currentPage) + { + // the deletion was done of the last comment in the current page + currentPage = currentPage > 1 ? currentPage - 1 : 1; + } + var record = p.getPageRecords(currentPage); + startIndex = record ? record[0] : 0; + } + if (obj.reason == "created") + { + startIndex = Math.floor(tr/ps) * ps; + } + this._loadCommentsList(startIndex); + } + }, + + /** + * Loads the comments for the provided nodeRef and refreshes the UI + * + * @method _loadCommentsList + * @protected + * @param startIndex First comment to show + */ + _loadCommentsList: function CommentList__loadCommentsList(startIndex) + { + // construct the url to call + var url = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/node/{nodeRef}/comments", + { + nodeRef: this.options.itemNodeRef.replace(":/", "") + }); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + dataObj: + { + startIndex: startIndex, + pageSize: this.options.pageSize + }, + successCallback: + { + fn: this.loadCommentsSuccess, + scope: this + }, + failureMessage: this.msg("message.loadComments.failure") + }); + + }, + + /** + * Load comments ajax request success handler. + * + * @method loadCommentsSuccess + * @param response AJAX response object + */ + loadCommentsSuccess: function CommentsList_loadCommentsSuccess(response) + { + // make sure any edit data is cleared + this._hideEditView(); + + var comments = response.json.items; + + // Get the elements to update + var bodyDiv = Dom.get(this.id + "-body"), + titleDiv = Dom.get(this.id + "-title"), + commentDiv = Dom.get(this.id + "-comments"); + + // temporarily hide the container node + bodyDiv.setAttribute("style", "display:none"); + + // update the list name + if (comments.length > 0) + { + titleDiv.innerHTML = Alfresco.util.message("label.comments", this.name, + { + "0": comments.length, + "1": response.json.total + }); + } + else + { + titleDiv.innerHTML = Alfresco.util.message("label.noComments", this.name); + } + + // Update the list elements + var html = '', i, j; + for (i = 0, j = comments.length; i < j; i++) + { + html += this.renderComment(i, comments[i]); + } + commentDiv.innerHTML = html; + bodyDiv.removeAttribute("style"); + + // init mouse over + Alfresco.util.rollover.registerListenersByClassName(this.id, 'comment', 'div'); + + // keep a reference to the loaded data + this.commentsData = comments; + + // inform the create comment component of whether the user can create a comment + YAHOO.Bubbling.fire("setCanCreateComment", + { + canCreateComment: response.json.nodePermissions.create + }); + + this._updatePaginator(response.json.startIndex, response.json.total); + }, + + /** + * Called by loadCommentsSuccess when it has rendered the comments. + * Since this componenent listens for the event "setCommentedNode" that can be displayed + * before this component has created its own widgets and paginator it must wait until the paginator + * has been created and then update it. + * + * @method updatePaginator + * @param page {int} The page of comments in the paging list that is displayed + * @param total {int} The totla number of comments in the paging + */ + _updatePaginator: function CommentList__updatePaginator(page, total) + { + if (this.widgets && this.widgets.paginator) + { + this.widgets.paginator.set('recordOffset', page); + this.widgets.paginator.set('totalRecords', total); + } + else + { + YAHOO.lang.later(100, this, this._updatePaginator, [page, total]); + } + }, + + /** + * Edit comment action links handler. + * + * @method onEditComment + * @param row {object} Comment to edit + */ + onEditComment: function CommentList_onEditComment(row) + { + this._loadForm(row, this.commentsData[row]); + }, + + /** + * Delete comment action links handler. + * + * @method onDeleteComment + * @param row {object} Comment to delete + */ + onDeleteComment: function CommentList_onDeleteComment(row) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.confirm.delete.title"), + text: this.msg("message.confirm.delete"), + buttons: [ + { + text: this.msg("button.delete"), + handler: function CommentList_onDeleteComment_delete() + { + this.destroy(); + me._onDeleteCommentConfirm.call(me, row); + } + }, + { + text: this.msg("button.cancel"), + handler: function CommentList_onDeleteComment_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Delete comment confirmed. + * + * @method _onDeleteCommentConfirm + * @protected + * @param row {object} Comment to delete + */ + _onDeleteCommentConfirm: function CommentList__onDeleteCommentConfirm(row) + { + var data = this.commentsData[row]; + this._deleteComment(row, data); + }, + + // Action implementation + + /** + * Implementation of the comment deletion action + * + * @method _deleteComment + * @protected + * @param row {object} Comment to delete + * @param data {object} Comment data + */ + _deleteComment: function CommentList__deleteComment(row, data) + { + // show busy message + if (!this._setBusy(this.msg('message.wait'))) + { + return; + } + + // ajax request success handler + var success = function CommentList__deleteComment_success(response) + { + // remove busy message + this._releaseBusy(); + + // reload the comments list + YAHOO.Bubbling.fire("refreshComments", + { + reason: "deleted" + }); + }; + + // ajax request success handler + var failure = function CommentList__deleteComment_failure(response) + { + // remove busy message + this._releaseBusy(); + }; + + // construct the request url to delete the comment + var url = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/comment/node/{nodeRef}/?site={site}&itemTitle={itemTitle}&page={page}&pageParams={pageParams}", + { + site: this.options.siteId, + container: this.options.containerId, + nodeRef: data.nodeRef.replace(":/", ""), + itemTitle: encodeURIComponent(this.options.activityTitle), + page: encodeURIComponent(this.options.activityPage), + pageParams: encodeURIComponent(YAHOO.lang.JSON.stringify(this.options.activityPageParams)) + }); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "DELETE", + responseContentType : "application/json", + successMessage: this.msg("message.delete.success"), + successCallback: + { + fn: success, + scope: this + }, + failureMessage: this.msg("message.delete.failure"), + failureCallback: + { + fn: failure, + scope: this + } + }); + }, + + + // Form management + + /** + * Loads the comment edit form + * + * @method _loadForm + * @protected + * @param row {object} Comment to edit + * @param data {object} Comment data + */ + _loadForm: function CommentList__loadForm(row, data) + { + // we always load the template through an ajax request + var formId = this.id + "-edit-comment-" + row; + + // Load the UI template from the server + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "modules/blog/comments/edit-comment", + dataObj: + { + htmlid: formId + }, + successCallback: + { + fn: this.onFormLoaded, + scope: this, + obj: + { + formId: formId, + row: row, + data: data + } + }, + failureMessage: this.msg("message.loadeditform.failure"), + execScripts: true + }); + }, + + /** + * Event callback when comment form has been loaded + * + * @method onFormLoaded + * @param response {object} Server response from load form XHR request + * @param obj {object} Comment scope (row, data, formId) + */ + onFormLoaded: function CommentList_onFormLoaded(response, obj) + { + // get the data and formId of the loaded form + var row = obj.row, + data = obj.data, + formId = obj.formId; + + // make sure no other forms are displayed + this._hideEditView(); + + // find the right divs to insert the html into + var viewDiv = Dom.get(this.id + "-comment-view-" + row), + editDiv = Dom.get(this.id + "-comment-edit-" + row); + + // insert the html + editDiv.innerHTML = response.serverResponse.responseText; + + // insert current values into the form + var actionUrl = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/comment/node/{nodeRef}", + { + nodeRef: data.nodeRef.replace(':/', '') + }); + Dom.get(formId + "-form").setAttribute("action", actionUrl); + Dom.get(formId + "-site").setAttribute("value", this.options.siteId); + Dom.get(formId + "-container").setAttribute("value", this.options.containerId); + Dom.get(formId + "-itemTitle").setAttribute("value", this.options.activityTitle); + Dom.get(formId + "-page").setAttribute("value", this.options.activityPage); + Dom.get(formId + "-pageParams").setAttribute("value", YAHOO.lang.JSON.stringify(this.options.activityPageParams)); + Dom.get(formId + "-content").value = data.content; + + // show the form and hide the view + Dom.addClass(viewDiv, "hidden"); + Dom.removeClass(editDiv, "hidden"); + + // store the edit data locally + this.editData = + { + viewDiv: viewDiv, + editDiv: editDiv, + row: row, + widgets : {}, + formId: formId + }; + + // and finally register the form handling + this._registerEditCommentForm(row, data, formId); + }, + + /** + * Registers the form with the html (that should be available in the page) + * as well as the buttons that are part of the form. + * + * @method _registerEditCommentForm + * @protected + * @param row {object} Comment to edit + * @param data {object} Comment data + * @param formId {string} Form ID + */ + _registerEditCommentForm: function CommentList__registerEditCommentForm(row, data, formId) + { + // register the okButton + this.editData.widgets.okButton = new YAHOO.widget.Button(formId + "-submit", + { + type: "submit" + }); + + // register the cancel button + this.editData.widgets.cancelButton = new YAHOO.widget.Button(formId + "-cancel"); + this.editData.widgets.cancelButton.subscribe("click", this.onEditFormCancelButtonClick, this, true); + + // instantiate the simple editor we use for the form + this.editData.widgets.editor = new Alfresco.util.RichEditor(Alfresco.constants.HTML_EDITOR, formId + '-content', this.options.editorConfig); + this.editData.widgets.editor.addPageUnloadBehaviour(this.msg("message.unsavedChanges.comment")); + this.editData.widgets.editor.render(); + + // Add validation to the editor + var keyUpIdentifier = (Alfresco.constants.HTML_EDITOR === 'YAHOO.widget.SimpleEditor') ? 'editorKeyUp' : 'onKeyUp'; + this.editData.widgets.editor.subscribe(keyUpIdentifier, function (e) + { + /** + * Doing a form validation on every key stroke is process consuming, below we try to make sure we only do + * a form validation if it's necessarry. + * NOTE: Don't check for zero-length in commentsLength, due to HTML
    , tags, etc. possibly + * being present. Only a "Select all" followed by delete will clean all tags, otherwise leftovers will + * be there even if the form looks empty. + */ + if (this.editData.widgets.editor.getContent().length < 20 || !this.editData.widgets.commentForm.isValid()) + { + // Submit was disabled and something has been typed, validate and submit will be enabled + this.editData.widgets.editor.save(); + this.editData.widgets.commentForm.validate(); + } + }, this, true); + + // create the form that does the validation/submit + var commentForm = new Alfresco.forms.Form(formId + "-form"); + this.editData.widgets.commentForm = commentForm; + commentForm.addValidation(formId + "-content", Alfresco.forms.validation.mandatory, null); + commentForm.setSubmitElements(this.editData.widgets.okButton); + commentForm.setAjaxSubmitMethod(Alfresco.util.Ajax.PUT); + commentForm.setAJAXSubmit(true, + { + successMessage: this.msg("message.savecomment.success"), + successCallback: + { + fn: this.onEditFormSubmitSuccess, + scope: this + }, + failureMessage: this.msg("message.savecomment.failure"), + failureCallback: + { + fn: this.onEditFormSubmitFailure, + scope: this + } + }); + commentForm.setSubmitAsJSON(true); + commentForm.doBeforeFormSubmit = + { + fn: function(form, obj) + { + this.editData.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message("message.savecomment", this.name), + spanClass: "wait", + displayTime: 0 + }); + + this.editData.widgets.editor.disable(); + + //Put the HTML back into the text area + this.editData.widgets.editor.save(); + }, + scope: this + }; + commentForm.init(); + }, + + /** + * Edit form submit success handler + * + * @method onEditFormSubmitSuccess + * @param response {object} Ajax response object + */ + onEditFormSubmitSuccess: function CommentList_onEditFormSubmitSuccess(response) + { + this.editData.widgets.feedbackMessage.destroy(); + + // the response contains the new data for the comment. Render the comment html + // and insert it into the view element + this.commentsData[this.editData.row] = response.json.item; + this.editData.viewDiv.innerHTML = this.renderCommentView(this.editData.row, response.json.item); + + // hide the form and display an information message + this._hideEditView(); + }, + + /** + * Edit form submit failure handler + * + * @method onEditFormSubmitFailure + * @param response {object} Ajax response object + */ + onEditFormSubmitFailure: function CommentList_onEditFormSubmitFailure(response) + { + this.editData.widgets.feedbackMessage.destroy(); + this.editData.widgets.editor.disable(); + }, + + /** + * Form cancel button click handler + * + * @method onEditFormCancelButtonClick + */ + onEditFormCancelButtonClick: function CommentList_onEditFormCancelButtonClick() + { + this._hideEditView(); + }, + + /** + * Renders a comment element. + * Each comment element consists of an edit and a view div. + * + * @method renderComment + * @param index {int} Comment DOM index + * @param data {object} Comment data + */ + renderComment: function CommentList_renderComment(index, data) + { + // add a div for the comment edit form + var html = ''; + + // output the view + var rowClass = index % 2 === 0 ? "even" : "odd"; + html += '
    '; + html += this.renderCommentView(index, data); + html += '
    '; + + return html; + }, + + /** + * Renders the content of the comment view div. + * + * @method renderCommentView + * @param index {int} Comment DOM index + * @param data {object} Comment data + */ + renderCommentView: function CommentList_renderCommentView(index, data) + { + // actions + var html = '
    '; + if (data.permissions.edit) + { + html += ''; + } + if (data.permissions["delete"]) + { + html += ''; + } + html += '
    '; + + // avatar image + html += '
    ' + Alfresco.util.people.generateUserAvatarImg(data.author) + '
    '; + + // comment info and content + html += '
    '; + html += '
    ' + data.content + '
    '; + html += '
    '; + + // footer + html += '
    '; + html += ''; + html += '' + this.msg("comment.postedOn") + ': '; + html += Alfresco.util.formatDate(data.createdOn); + html += '
    '; + + return html; + }, + + /** + * Mouse enter event handler for list items + * + * @method onCommentElementMouseEntered + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (target) + */ + onCommentElementMouseEntered: function CommentList_onCommentElementMouseEntered(layer, args) + { + // find out whether the user has actions, otherwise we won't show an overlay + var id = args[1].target.id; + var index = id.substring((this.id + '-comment-view-').length); + var permissions = this.commentsData[index].permissions; + if (! (permissions.edit || permissions["delete"])) + { + return; + } + + var elem = args[1].target; + Dom.addClass(elem, 'over'); + }, + + /** + * Mouse leave event handler for list items + * + * @method onCommentElementMouseExited + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (target) + */ + onCommentElementMouseExited: function CommentList_onCommentElementMouseExited(layer, args) + { + var elem = args[1].target; + Dom.removeClass(elem, 'over'); + }, + + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Makes sure that all forms get removed and if available the hidden content + * elements displayed again. + * + * @method _hideEditView + * @protected + */ + _hideEditView: function CommentList__hideEditView() + { + if (this.editData.editDiv !== null) + { + // hide edit div and remove form + Dom.addClass(this.editData.editDiv, "hidden"); + this.editData.editDiv.innerHTML = ""; + this.editData.editDiv = null; + } + if (this.editData.viewDiv !== null) + { + // display view div + Dom.removeClass(this.editData.viewDiv, "hidden"); + this.editData.viewDiv = null; + } + }, + + /** + * Displays busyMessage popup if busy flag is currently unset + * + * @method _setBusy + * @protected + * @return true if the busy state was set, false if the component is already busy + */ + _setBusy: function CommentList__setBusy(busyMessage) + { + if (this.busy) + { + return false; + } + this.busy = true; + this.widgets.busyMessage = Alfresco.util.PopupManager.displayMessage( + { + text: busyMessage, + spanClass: "wait", + displayTime: 0 + }); + return true; + }, + + /** + * Removes the busy message and marks the component as non-busy + * + * @method _releaseBusy + * @protected + */ + _releaseBusy: function CommentList__releaseBusy() + { + if (this.busy) + { + this.widgets.busyMessage.destroy(); + this.busy = false; + return true; + } + else + { + return false; + } + } + }); +})(); diff --git a/share/src/main/webapp/components/blog/createcomment.css b/share/src/main/webapp/components/blog/createcomment.css new file mode 100644 index 0000000000..e290cd172f --- /dev/null +++ b/share/src/main/webapp/components/blog/createcomment.css @@ -0,0 +1,43 @@ +.addCommentForm +{ + border-top: 1px dashed #c2c2c2; + border-bottom: 1px solid #c2c2c2; + padding: 20px; +} + +.commentFormTitle +{ + font-size: 116%; + margin-bottom: 15px; +} + +.commentFormAction +{ + margin-top: 15px; +} + +/* YUI WYSIWYG editor styles */ +.yuieditor strong +{ + font-weight: bold; +} + +.yuieditor em +{ + font-style: italic; +} + +.yuieditor ul, .yuieditor ol +{ + padding-left: 40px; +} + +.yuieditor ul li +{ + list-style-type: disc; +} + +.yuieditor ol li +{ + list-style-type: decimal; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/blog/createcomment.js b/share/src/main/webapp/components/blog/createcomment.js new file mode 100644 index 0000000000..49f4cfce60 --- /dev/null +++ b/share/src/main/webapp/components/blog/createcomment.js @@ -0,0 +1,359 @@ +/** + * CreateComment component. + * + * @namespace Alfresco + * @class Alfresco.CreateComment + * @extends Alfresco.component.Base + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * CreateComment constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.CreateComment} The new CreateComment instance + * @constructor + */ + Alfresco.CreateComment = function Alfresco_CreateComment(htmlId) + { + Alfresco.CreateComment.superclass.constructor.call(this, "Alfresco.CreateComment", htmlId, ["event", "json", "editor"]); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("setCommentedNode", this.onSetCommentedNode, this); + YAHOO.Bubbling.on("setCanCreateComment", this.onSetCanCreateComment, this); + + return this; + }; + + YAHOO.extend(Alfresco.CreateComment, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + * @default "" + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "blog" + */ + containerId: "blog", + + /** + * Node reference of the item to comment about + * + * @property itemNodeRef + * @type string + * @default null + */ + itemNodeRef: null, + + /** + * Title of the item to comment about for activites service. + * + * @property activityTitle + * @type string + * @default null + */ + activityTitle: null, + + /** + * Page for activities link. + * + * @property activityPage + * @type string + * @default null + */ + activityPage: null, + + /** + * Params for activities link. + * + * @property activityPageParams + * @type object + * @default null + */ + activityPageParams: null, + + /** + * Width to use for comment editor + * + * @property width + * @type int + * @default 538 + */ + width: 538, + + /** + * Height to use for comment editor + * + * @property height + * @type int + * @default 250 + */ + height: 250, + + /** + * Tells whether the user can create comments. + * The component is not displayed unless this field is true + * + * @property canCreateComment + * @type boolean + * @default false + */ + canCreateComment: false + }, + + /** + * States whether the view has already been initialized + * + * @property initialized + * @type boolean + */ + initialized: false, + + /** + * Called by a bubble event to set the node for which comments should be displayed + * + * @method onSetCommentedNode + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (nodeRef, title, page, pageParams) + */ + onSetCommentedNode: function CreateComment_onSetCommentedNode(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.nodeRef !== null) && (obj.title !== null) && (obj.page !== null)) + { + this.options.itemNodeRef = obj.nodeRef; + this.options.activityTitle = obj.title; + this.options.activityPage = obj.page; + this.options.activityPageParams = obj.pageParams; + this.initializeCreateCommentForm(); + } + }, + + /** + * Called by a bubble event to set whether the user is allowed to comment. + * + * @method onSetCanCreateComment + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (canCreateComment) + */ + onSetCanCreateComment: function CreateComment_onSetCanCreateComment(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.canCreateComment !== null)) + { + this.options.canCreateComment = obj.canCreateComment; + this.initializeCreateCommentForm(); + } + }, + + /** + * Initializes the create comment form. + * + * @method initializeCreateCommentForm + */ + initializeCreateCommentForm: function CreateComment_initializeCreateCommentForm() + { + // only continue if the user is allowed to create a comment + if (!this.options.canCreateComment) + { + return; + } + + // return if we have already been initialized + if (this.initialized) + { + return; + } + this.initialized = true; + + // action url + var form = Dom.get(this.id + '-form'); + var actionUrl = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/node/{nodeRef}/comments", + { + nodeRef: this.options.itemNodeRef.replace(':/', '') + }); + form.setAttribute("action", actionUrl); + + // nodeRef + Dom.get(this.id + '-nodeRef').setAttribute("value", this.options.itemNodeRef); + + if (this.options.siteId.length > 0) + { + // site + Dom.get(this.id + '-site').setAttribute("value", this.options.siteId); + + // container + Dom.get(this.id + '-container').setAttribute("value", this.options.containerId); + } + + // itemTitle + Dom.get(this.id + '-itemTitle').setAttribute("value", this.options.activityTitle); + + // page + Dom.get(this.id + '-page').setAttribute("value", this.options.activityPage); + + // pageParams + Dom.get(this.id + '-pageParams').setAttribute("value", YAHOO.lang.JSON.stringify(this.options.activityPageParams)); + + // register the behaviour with the form and display it finally + this.registerCreateCommentForm(); + }, + + /** + * Registers the form with the html (that should be available in the page) + * as well as the buttons that are part of the form. + * + * @method registerCreateCommentForm + */ + registerCreateCommentForm: function CreateComment_registerCreateCommentForm() + { + // register the okButton + this.widgets.okButton = Alfresco.util.createYUIButton(this, "submit", null, + { + type: "submit", + disabled: true + }); + + // instantiate the simple editor we use for the form + this.widgets.editor = new Alfresco.util.RichEditor(Alfresco.constants.HTML_EDITOR,this.id + '-content', this.options.editorConfig); + this.widgets.editor.addPageUnloadBehaviour(this.msg("message.unsavedChanges.comment")); + this.widgets.editor.render(); + this.widgets.editor.save(); + + // Add validation to the rich text editor + var keyUpIdentifier = (Alfresco.constants.HTML_EDITOR === 'YAHOO.widget.SimpleEditor') ? 'editorKeyUp' : 'onKeyUp'; + this.widgets.editor.subscribe(keyUpIdentifier, function (e) + { + /** + * Doing a form validation on every key stroke is process consuming, below we try to make sure we only do + * a form validation if it's necessarry. + * NOTE: Don't check for zero-length in commentsLength, due to HTML
    , tags, etc. possibly + * being present. Only a "Select all" followed by delete will clean all tags, otherwise leftovers will + * be there even if the form looks empty. + */ + if (this.widgets.editor.getContent().length < 20 || !this.widgets.commentForm.isValid()) + { + // Submit was disabled and something has been typed, validate and submit will be enabled + this.widgets.editor.save(); + this.widgets.commentForm.validate() + } + }, this, true); + + // create the form that does the validation/submit + this.widgets.commentForm = new Alfresco.forms.Form(this.id + "-form"); + this.widgets.commentForm.addValidation(this.id + "-content", this._validateTextContent, null); + this.widgets.commentForm.setSubmitElements(this.widgets.okButton); + this.widgets.commentForm.setAJAXSubmit(true, + { + successMessage: this.msg("message.createcomment.success"), + successCallback: + { + fn: this.onCreateFormSubmitSuccess, + scope: this + }, + failureMessage: this.msg("message.createcomment.failure"), + failureCallback: + { + fn: function() + { + this.enableInputs(); + }, + scope: this + } + }); + + this.widgets.commentForm.setSubmitAsJSON(true); + this.widgets.commentForm.doBeforeFormSubmit = + { + fn: function(form, obj) + { + // Put the HTML back into the text area + this.widgets.editor.save(); + + this.widgets.editor.disable(); + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message("message.creating", this.name), + spanClass: "wait", + displayTime: 0 + }); + }, + scope: this + }; + this.widgets.commentForm.init(); + + // show the form + Dom.removeClass(this.id + '-form-container', 'hidden'); + }, + + /** + * Validate comment content + * + * @method _validateTextContent + * @param field {object} The element representing the field the validation is for + * @param args {object} + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @param silent {boolean} Determines whether the user should be informed upon failure + * @param message {string} Message to display when validation fails, maybe null + */ + _validateTextContent: function CreateComment__validateTextContent(field, args, event, form, silent, message) + { + var stripHTML = /<\S[^><]*>/g; + return YAHOO.lang.trim(field.value.replace(stripHTML, "")).length > 0; + }, + + /** + * Success handler for the form submit ajax request + * + * @method onCreateFormSubmitSuccess + * @param response {object} Ajax response object + */ + onCreateFormSubmitSuccess: function CreateComment_onCreateFormSubmitSuccess(response) + { + // clear the content of the comment editor + this.widgets.editor.clear(); + + // reload the comments list + YAHOO.Bubbling.fire("refreshComments", + { + reason: "created" + }); + + this.enableInputs(); + }, + + /** + * Reenables the inputs which got disabled as part of a comment submit + * + * @method enableInputs + */ + enableInputs: function CreateComment_enableInputs() + { + this.widgets.feedbackMessage.destroy(); + this.widgets.editor.enable(); + } + }); +})(); diff --git a/share/src/main/webapp/components/blog/postedit.js b/share/src/main/webapp/components/blog/postedit.js new file mode 100644 index 0000000000..68dfa9e4bc --- /dev/null +++ b/share/src/main/webapp/components/blog/postedit.js @@ -0,0 +1,582 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * BlogPostEdit component. + * + * Component provides blog post creation/edit functionality. + * + * @namespace Alfresco + * @class Alfresco.BlogPostEdit + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * BlogPostEdit constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.BlogPostEdit} The new Post instance + * @constructor + */ + Alfresco.BlogPostEdit = function(htmlId) + { + Alfresco.BlogPostEdit.superclass.constructor.call(this, "Alfresco.BlogPostEdit", htmlId, ["button", "menu", "json"]); + + // Initialise prototype properties + this.blogPostData = null; + this.performExternalPublish = false; + + return this; + }; + + YAHOO.extend(Alfresco.BlogPostEdit, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "blog" + */ + containerId: "blog", + + /** + * True if the component should be in edit mode. + * + * @property editMode + * @type boolean + * @default: false + */ + editMode: false, + + /** + * Id of the post to edit. Only relevant if editMode is true + * + * @property postId + * @type string + * @default: "" + */ + postId: "" + }, + + /** + * Stores the data of the currently edited blog post + */ + blogPostData: null, + + /** + * If true, an external publish/update will be executed after the post has been + * saved/updated. + */ + performExternalPublish: null, + + /** + * If true, the "message.publishExternal.failure" will be shown + * True, if trying to publish externaly, but external blog is not configured + */ + showNotConfiguredMessage: false, + + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function BlogPostEdit_onReady() + { + if (this.options.editMode) + { + // load the blog post data prior to initializing the form + this._loadBlogPostData(); + } + else + { + // directly initialize the form + this._initializeBlogPostForm(); + } + }, + + /** + * Loads the comments for the provided nodeRef and refreshes the ui + * + * @method _loadBlogPostData + * @private + */ + _loadBlogPostData: function BlogPostEdit__loadBlogPostData() + { + // ajax request success handler + var me = this; + var loadBlogPostDataSuccess = function BlogPostEdit__loadBlogPostData(response) + { + // set the blog data + var data = response.json.item; + me.blogPostData = data; + + // now initialize the form, which will use the data we just loaded + me._initializeBlogPostForm(); + }; + + // construct the request url + var url = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/blog/post/site/{site}/{container}/{postId}", + { + site : this.options.siteId, + container: this.options.containerId, + postId: this.options.postId + }); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "GET", + responseContentType: "application/json", + successCallback: + { + fn: loadBlogPostDataSuccess, + scope: this + }, + failureMessage: this.msg("message.loadpostdata.failure") + }); + }, + + /** + * Initializes the blog post form with create/edit dependent data. + * + * @method _initializeBlogPostForm + * @private + */ + _initializeBlogPostForm: function BlogPostEdit__initializeBlogPostForm() + { + // construct the actionUrl, which is different for creating/updating a post + var actionUrl, draft = true, title = "", content = ""; + if (this.options.editMode) + { + actionUrl = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/blog/post/node/{nodeRef}", + { + nodeRef: this.blogPostData.nodeRef.replace(":/", "") + }); + } + else + { + actionUrl = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/blog/site/{site}/{container}/posts", + { + site: this.options.siteId, + container: this.options.containerId + }); + } + Dom.get(this.id + "-form").setAttribute("action", actionUrl); + + // site and container + Dom.get(this.id + "-site").setAttribute("value", this.options.siteId); + Dom.get(this.id + "-container").setAttribute("value", this.options.containerId); + + // draft + if (this.options.editMode) + { + draft = this.blogPostData.isDraft; + } + Dom.get(this.id + "-draft").setAttribute("value", draft); + + // title + if (this.options.editMode) + { + title = this.blogPostData.title; + } + Dom.get(this.id + "-title").setAttribute("value", title); + + // content + if (this.options.editMode) + { + content = this.blogPostData.content; + } + Dom.get(this.id + "-content").value = content; + + // register the behaviour with the form and display the form + this._registerBlogPostForm(); + }, + + /** + * Registers the form logic + * + * @method _registerBlogPostForm + * @private + */ + _registerBlogPostForm: function BlogPostEdit__registerBlogPostForm() + { + // initialize the tag library + this.modules.tagLibrary = new Alfresco.module.TagLibrary(this.id); + this.modules.tagLibrary.setOptions( + { + siteId: this.options.siteId + }); + + // add the tags that are already set on the post + if (this.options.editMode && this.blogPostData.tags.length > 0) + { + this.modules.tagLibrary.setTags(this.blogPostData.tags); + } + + // create the Button + this.widgets.saveButton = new YAHOO.widget.Button(this.id + "-save-button", + { + type: "submit", + label: this.msg(this.options.editMode ? "action.update" : "action.saveAsDraft") + }); + + // publishing of a draft post button - only visible if post is a draft + if (!this.options.editMode || this.blogPostData.isDraft) + { + this.widgets.publishButton = Alfresco.util.createYUIButton(this, "publish-button", this.onFormPublishButtonClick); + Dom.removeClass(this.id + "-publish-button", "hidden"); + } + + // Cancel button + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "cancel-button", this.onFormCancelButtonClick); + + // Instantiate the simple editor we use for the form + this.widgets.editor = new Alfresco.util.RichEditor(Alfresco.constants.HTML_EDITOR, this.id + "-content", this.options.editorConfig); + this.widgets.editor.addPageUnloadBehaviour(this.msg("message.unsavedChanges.blog")); + this.widgets.editor.render(); + + // Create the form that does the validation/submit + this.widgets.postForm = new Alfresco.forms.Form(this.id + "-form"); + + // Title is mandatory + this.widgets.postForm.addValidation(this.id + "-title", Alfresco.forms.validation.mandatory, null, "blur"); + this.widgets.postForm.addValidation(this.id + "-title", Alfresco.forms.validation.length, + { + max: 256, + crop: true + }, "keyup"); + + if (this.widgets.publishButton) + { + this.widgets.postForm.setSubmitElements([this.widgets.saveButton, this.widgets.publishButton]); + } + else + { + this.widgets.postForm.setSubmitElements([this.widgets.saveButton]); + } + this.widgets.postForm.setAJAXSubmit(true, + { + successCallback: + { + fn: this.onFormSubmitSuccess, + scope: this + }, + failureMessage: this.msg("message.savepost.failure"), + failureCallback: + { + fn: this.onFormSubmitFailure, + scope: this + } + }); + if (this.options.editMode) + { + this.widgets.postForm.setAjaxSubmitMethod(Alfresco.util.Ajax.PUT); + } + this.widgets.postForm.setSubmitAsJSON(true); + this.widgets.postForm.doBeforeFormSubmit = + { + fn: function(form, obj) + { + //Put the HTML back into the text area + this.widgets.editor.save(); + + // disable ui elements + this.widgets.cancelButton.set("disabled", true); + + // update the tags set in the form + this.modules.tagLibrary.updateForm(this.id + "-form", "tags"); + + // show a wait message + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message(this.msg("message.submitting")), + spanClass: "wait", + displayTime: 0 + }); + }, + scope: this + }; + this.modules.tagLibrary.initialize(this.widgets.postForm); + this.widgets.postForm.init(); + + // finally display the form + Dom.removeClass(this.id + "-div", "hidden"); + Dom.get(this.id + "-title").focus(); + }, + + /** + * Publish button click handler + * + * @method onFormPublishButtonClick + */ + onFormPublishButtonClick: function BlogPostEdit_onFormPublishButtonClick(type, args) + { + // make sure we set the draft flag to false + Dom.get(this.id + "-draft").setAttribute("value", false); + + // submit the form + this.widgets.saveButton.fireEvent("click", + { + type: "click" + }); + }, + + /** + * Cancel button click handler + * + * @method onFormCancelButtonClick + */ + onFormCancelButtonClick: function BlogPostEdit_onFormCancelButtonClick(type, args) + { + // redirect to the page we came from + history.go(-1); + }, + + /** + * Form submit success handler + * + * @method onFormSubmitSuccess + */ + onFormSubmitSuccess: function BlogPostEdit_onFormSubmitSuccess(response) + { + // hide the wait message + this.widgets.feedbackMessage.destroy(); + + // check whether we have to do an external publich + if (this.performExternalPublish) + { + // show a new wait message + this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message(this.msg("message.postSavedNowPublish")), + spanClass: "wait", + displayTime: 0 + }); + + this.showNotConfiguredMessage = !response.json.metadata.externalBlogConfig; + + //var nodeRef = response.json.item.nodeRef; + var postId = response.json.item.name; + if (response.json.item.isPublished) + { + // perform an update + this.onUpdateExternal(postId); + } + else + { + // perform a publish + this.onPublishExternal(postId); + } + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.savepost.success") + }); + this._loadPostViewPage(response.json.item.name); + } + }, + + /** + * Reenables the inputs which got disabled as part of a comment submit + * + * @method onFormSubmitFailure + */ + onFormSubmitFailure: function BlogPostEdit_onFormSubmitFailure() + { + // enable the buttons + this.widgets.cancelButton.set("disabled", false); + + // hide the wait message + this.widgets.feedbackMessage.destroy(); + }, + + /** + * Publishes the blog post to an external blog. + * + * @method onPublishExternal + */ + onPublishExternal: function BlogPostEdit_onPublishExternal(postId) + { + // publish request success handler + var onPublished = function BlogPostEdit_onPublished(response) + { + this._loadPostViewPage(postId); + }; + + // publish request failure handler + var onPublishFailed = function BlogPostEdit_onPublishFailed(response) + { + // let the user know that the publish failed, then redirect to the view page + this.widgets.feedbackMessage.destroy(); + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.publishExternal.failure"), + buttons: [ + { + text: this.msg("button.ok"), + handler: function() + { + me._loadPostViewPage(postId); + }, + isDefault: true + }] + }); + + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + var amsg = this.msg("message.savepost.success"); + if (this.showNotConfiguredMessage) + { + amsg = this.msg("message.publishExternal.failure"); + } + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "publish" + }, + successMessage: amsg, + successCallback: + { + fn: onPublished, + scope: this + }, + failureCallback: + { + fn: onPublishFailed, + scope: this + } + }); + }, + + /** + * Updates the external published blog post. + * + * @method onUpdateExternal + */ + onUpdateExternal: function BlogPostEdit_onUpdateExternal(postId) + { + // update request success handler + var onUpdated = function BlogPostEdit_onUpdated(response) + { + this._loadPostViewPage(postId); + }; + + // update request failure handler + var onUpdateFailed = function BlogPostEdit_onUpdateFailed(response) + { + // let the user know that the publish failed, then redirect to the view page + this.widgets.feedbackMessage.destroy(); + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.updateExternal.failure"), + buttons: [ + { + text: this.msg("button.ok"), + handler: function() + { + me._loadPostViewPage(postId); + }, + isDefault: true + }] + }); + + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "update" + }, + successMessage: this.msg("message.updateExternal.success"), + successCallback: + { + fn: onUpdated, + scope: this + }, + failureCallback: + { + fn: onUpdateFailed, + scope: this + } + }); + }, + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Loads the blog post view page + * + * @method _loadPostViewPage + */ + _loadPostViewPage: function BlogPostEdit__loadPostViewPage(postId) + { + window.location = Alfresco.util.blog.generateBlogPostViewUrl(this.options.siteId, this.options.containerId, postId); + } + }); +})(); diff --git a/share/src/main/webapp/components/blog/postlist.css b/share/src/main/webapp/components/blog/postlist.css new file mode 100644 index 0000000000..8be34829b3 --- /dev/null +++ b/share/src/main/webapp/components/blog/postlist.css @@ -0,0 +1,312 @@ +.postlist-infobar +{ + border-bottom: thin solid #C6C6C6; + height: 3em; + margin: 0 -10px; + padding-right: 10px; + padding-top: 0.5em; + width: auto; +} + +.postlist-infobar div.hideable +{ + float: left; +} + +.postlist-infobar .hidden +{ + display: none; +} + +.postlist-infobar .listTitle +{ + font-weight: normal; + font-size: 123.1%; + color: #333333; + padding: 5px 14px; +} + +.postlist-infobar .paginator +{ + float: left; + text-align: center; +} + +.postlist-infobar .simple-view +{ + text-align: right; +} + +/* DataTable css */ + +.blog-postlist +{ + clear: left; + margin: 0 -8px; +} + +.blog-postlist table +{ + width: 100%; + border: none !important; +} + +.blog-postlist table thead +{ + display: none; +} + +.blog-postlist table .yui-dt-empty +{ + background-color: transparent; +} + +.blog-postlist table .yui-dt-liner +{ + padding: 0px; +} + +.blog-postlist .yui-dt-error +{ + background: red; + color: white; + font-weight: bold; + margin: 1em auto; + padding: 1em; +} + +.blog-postlist table .yui-dt-empty .yui-dt-liner, +.blog-postlist table .yui-dt-error .yui-dt-liner +{ + padding: 4px 10px; +} + + +.blog-postlist table tr.yui-dt-odd +{ + background-color: #fff; +} + +.blog-postlist table td +{ + border: none !important; +} + +.blog-postlist .row-separator +{ + border-bottom: 1px solid #c6c6c6; +} + +.blog-postlist tr.yui-dt-odd .node +{ + border-color: #EDF5FF; +} + +.alfresco-share .sticky-wrapper .blog-postlist .content ul, +.alfresco-share .sticky-wrapper .blog-postlist .content ol +{ + padding: 0.5em 0 0.5em 1.3em; +} + +.yuieditor ul li +{ + list-style-type: inherit; +} + +.yuieditor ol li +{ + list-style-type: inherit; +} + +/* List elements */ + +.blog-postlist .post +{ + padding: 0.25em 1em; +} + +.nodeEdit +{ + float: right; + margin: 10px 0 0 15px; + position: relative; + width: 11em; +} + +.nodeEdit div, .replyEdit div +{ + padding: 2px 0 2px 20px; + margin-bottom: 4px; +} + +.blog-postlist .simple .nodeEdit +{ + width: 300px; + text-align: right; + margin: 4px; +} + +.blog-postlist .simple .nodeContent +{ + min-height: 2em; +} + +.nodeEdit .action-link +{ + font-size: 93%; + line-height: 150%; + color: #2B6EB5; +} + +.nodeEdit .onViewNode +{ + background: url(../images/view-discussion-16.png) no-repeat scroll 0px 0px; + padding-left: 20px; +} + +.nodeEdit .onAddReply +{ + background: url(../images/reply-to-discussion-16.png) no-repeat scroll 0px 0px; + padding-left: 20px; +} + +.nodeEdit .onEditNode, +.nodeEdit .onEditReply, +.nodeEdit .onEditComment +{ + background: url(../images/edit-discussion-16.png) no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.nodeEdit .onEditBlogPost +{ + background: url(../images/edit-blog-16.png) no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.nodeEdit .onDeleteNode, +.nodeEdit .onDeleteReply, +.nodeEdit .onDeleteComment +{ + background: url('../images/delete-discussion-16.png') no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.nodeEdit .onDeleteBlogPost +{ + background: url('../images/delete-blog-16.png') no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.nodeEdit .onUpdateExternal +{ + background: url(../images/update-external-16.png) no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.nodeEdit .onPublishExternal +{ + background: url(../images/publish-external-16.png) no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.nodeEdit .onUnpublishExternal +{ + background: url(../images/unpublish-external-16.png) no-repeat scroll 0px 0px; + margin-right: 10px; + padding-left: 20px; +} + +.node .published +{ + margin: 5px 0 10px 0; +} + +.node .nodeTitle a +{ + font-size: 131%; + line-height: 130%; + color: #2b6eb5; +} + +.node .nodeStatus +{ + font-size: 131%; + line-height: 130%; +} + +.nodeAttrLabel +{ + color: #606060; +} + +.nodeAttrValue +{ + line-height: 130%; + color: #333333; +} + +.nodeAttrValue a +{ + color: #2b6eb5; +} + +.node .userLink +{ + font-weight: bold; + line-height: 150%; + color: #999999; +} + +.node .userLink a +{ + color: #2b6eb5; +} + +.nodeContent +{ + font-size: 100%; + line-height: 150%; + margin-right: 11em; + min-height: 6.5em; + padding-right: 2em; +} + +.nodeFooter +{ + background-color: #f8f8f8; + border-top: 1px dashed #c6c6c6; + border-bottom: 1px solid #c6c6c6; + clear: both; + padding: 4px; +} + +.nodeFooter .tagLabel +{ + background: transparent url(../images/tag-16.png) no-repeat scroll 0 0; + padding-left: 20px; +} + +.nodeFooter .separator +{ + border-right: 1px dotted #457A9C; + margin-right: 10px; + padding-left: 10px; +} + +.replyTo +{ + background: transparent url(../images/reply-to-discussion-16.png) no-repeat scroll 0 0; + padding-left: 20px; +} + +.spacer +{ + padding: 0.5em; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/blog/postlist.js b/share/src/main/webapp/components/blog/postlist.js new file mode 100644 index 0000000000..ca431d3c03 --- /dev/null +++ b/share/src/main/webapp/components/blog/postlist.js @@ -0,0 +1,1323 @@ +/** + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * BlogPostList component. + * + * @namespace Alfresco + * @class Alfresco.BlogPostList + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + + /** + * BlogPostList constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.BlogPostList} The new BlogPostList instance + * @constructor + */ + Alfresco.BlogPostList = function(htmlId) + { + /* Mandatory properties */ + this.name = "Alfresco.BlogPostList"; + this.id = htmlId; + + /* Initialise prototype properties */ + this.widgets = {}; + this.currentFilter = {}; + this.tagId = + { + id: 0, + tags: {} + }; + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "dom", "datasource", "datatable", "paginator", "event", "element"], this.onComponentsLoaded, this); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("tagSelected", this.onTagSelected, this); + YAHOO.Bubbling.on("blogConfigChanged", this.onBlogConfigChanged, this); + YAHOO.Bubbling.on("changeFilter", this.onChangeFilter, this); + YAHOO.Bubbling.on("blogpostlistRefresh", this.onBlogPostListRefresh, this); + YAHOO.Bubbling.on("deactivateAllControls", this.onDeactivateAllControls, this); + + return this; + }; + + Alfresco.BlogPostList.prototype = + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "blog" + */ + containerId: "blog", + + /** + * Initially used filter name and id. + */ + initialFilter: {}, + + /** + * Number of items per page + * + * @property pageSize + * @type int + */ + pageSize: 10, + + /** + * Flag indicating whether the list shows a detailed view or a simple one. + * + * @property simpleView + * @type boolean + */ + simpleView: false, + + /** + * Maximum length of post to show in list view + * + * @property maxContentLength + * @type int + * @default 512 + */ + maxContentLength: 512 + }, + + /** + * Current filter to filter blog post list. + * + * @property currentFilter + * @type object + */ + currentFilter: null, + + /** + * Object container for storing YUI widget instances. + * + * @property widgets + * @type object + */ + widgets: null, + + /** + * Object container for storing module instances. + * + * @property modules + * @type object + */ + modules: null, + + /** + * Object literal used to generate unique tag ids + * + * @property tagId + * @type object + */ + tagId: null, + + /** + * Tells whether an action is currently ongoing. + * + * @property busy + * @type boolean + * @see _setBusy/_releaseBusy + */ + busy: false, + + /** + * Offset of first record on page + * + * @property recordOffset + * @type int + * @default 0 + */ + recordOffset: 0, + + /** + * Total number of posts in the current view (across all pages) + * + * @property totalRecords + * @type int + * @default 0 + */ + totalRecords: 0, + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + */ + setOptions: function BlogPostList_setOptions(obj) + { + this.options = YAHOO.lang.merge(this.options, obj); + return this; + }, + + /** + * Set messages for this component. + * + * @method setMessages + * @param obj {object} Object literal specifying a set of messages + * @return {Alfresco.DocumentList} returns 'this' for method chaining + */ + setMessages: function BlogPostList_setMessages(obj) + { + Alfresco.util.addMessages(obj, this.name); + return this; + }, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function BlogPostList_onComponentsLoaded() + { + Event.onContentReady(this.id, this.onReady, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function BlogPostList_onReady() + { + // Reference to self used by inline functions + var me = this; + + // Simple view button + this.widgets.simpleView = Alfresco.util.createYUIButton(this, "simpleView-button", this.onSimpleView); + + // called by the paginator on state changes + var handlePagination = function BlogPostList_handlePagination(state, dt) + { + //me.currentPage = state.page; + me._updateBlogPostList( + { + page: state.page + }); + }; + + // YUI Paginator definition + this.widgets.paginator = new YAHOO.widget.Paginator( + { + containers: [this.id + "-paginator"], + rowsPerPage: this.options.pageSize, + initialPage: 1, + template: this._msg("pagination.template"), + pageReportTemplate: this._msg("pagination.template.page-report"), + previousPageLinkLabel: this._msg("pagination.previousPageLinkLabel"), + nextPageLinkLabel: this._msg("pagination.nextPageLinkLabel") + }); + + this.widgets.paginator.subscribe("changeRequest", handlePagination); + + // Hook action events for details view + var fnActionHandlerDiv = function BlogPostList_fnActionHandlerDiv(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + if (typeof me[owner.className] == "function") + { + args[1].stop = true; + me[owner.className].call(me, args[1].target.offsetParent, owner); + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("blogpost-action-link-div", fnActionHandlerDiv); + + // Hook action events for simple view + var fnActionHandlerSpan = function BlogPostList_fnActionHandlerSpan(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "span"); + if (owner !== null) + { + var action = owner.className; + var target = args[1].target; + if (typeof me[action] == "function") + { + me[action].call(me, target.offsetParent, owner); + args[1].stop = true; + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("blogpost-action-link-span", fnActionHandlerSpan); + + // DataSource definition + var uriBlogPostList = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/blog/site/{site}/{container}/posts", + { + site: this.options.siteId, + container: this.options.containerId + }); + this.widgets.dataSource = new YAHOO.util.DataSource(uriBlogPostList, + { + responseType: YAHOO.util.DataSource.TYPE_JSON, + connXhrMode: "queueRequests", + responseSchema: + { + resultsList: "items", + metaFields: + { + recordOffset: "startIndex", + totalRecords: "total", + metadata: "metadata", + totalRecordsUpper: 'totalRecordsUpper' + } + } + }); + + /** + * Blog post element. We only have a list and not an acutal table, there is therefore + * only one column renderer + * + * @method renderBlogPost + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + var renderBlogPost = function BlogPostList_renderBlogPost(elCell, oRecord, oColumn, oData) + { + // hide the parent temporarily as we first insert the structure and then the content + // to avoid problems caused by broken xhtml + Dom.addClass(elCell, 'hidden'); + + // fetch the data and pregenerate some values + var data = oRecord.getData(); + var postViewUrl = Alfresco.util.blog.generateBlogPostViewUrl(me.options.siteId, me.options.containerId, data.name); + var statusLabel = Alfresco.util.blog.generatePostStatusLabel(me, data); + //ALF-18527 + var authorLink = data.author.username; + // firstName is a mandatory field for user + if (typeof data.author.firstName != "undefined") + { + authorLink = Alfresco.util.people.generateUserLink(data.author); + } + + var html = ""; + // detailed view + if (!me.options.simpleView) + { + html += '
    '; + + // actions + html += Alfresco.util.blog.generateBlogPostActions(me, data, 'div'); + + // begin view + html += '
    '; + html += '' + $html(data.title) + ' '; + html += '' + statusLabel + ''; + html += '
    '; + if (!data.isDraft) + { + html += '' + me._msg("post.publishedOn") + ': '; + html += '' + Alfresco.util.formatDate(data.releasedOn) + ''; + html += ' '; + } + html += '' + me._msg("post.author") + ': '; + html += '' + authorLink + ''; + if (data.isPublished && data.postLink && data.postLink.length > 0) + { + html += ' '; + html += '' + me._msg("post.externalLink") + ': '; + html += '' + me._msg("post.clickHere") + ''; + } + html += '
    '; + html += '
    '; + html += '
    '; + // end view + + html += '
    '; + + // begin footer + html += '
    '; + html += '' + me._msg("post.replies") + ': '; + html += '(' + data.commentCount + ')'; + html += ' '; + html += '' + me._msg("post.read") + ''; + html += ' '; + + html += '' + me._msg("label.tags") +': '; + if (data.tags.length > 0) + { + for (var x=0; x < data.tags.length; x++) + { + if (x > 0) + { + html += ', '; + } + html += Alfresco.util.tags.generateTagLink(me, data.tags[x]); + } + } + else + { + html += '' + me._msg("post.noTags") + ''; + } + html += '
    '; + // end + } + + // simple view + else + { + // add a class to the parent div so that we can add a separator line in the simple view + Dom.addClass(elCell, 'row-separator'); + + html += '
    '; + + // begin actions + html += Alfresco.util.blog.generateBlogPostActions(me, data, 'span'); + + // begin view + html += '
    '; + html += '' + $html(data.title) + ' '; + html += '' + statusLabel + ''; + html += '
    '; + if (!data.isDraft) + { + html += '' + me._msg("post.publishedOn") + ': '; + html += '' + Alfresco.util.formatDate(data.releasedOn) + ''; + html += ' '; + } + html += '' + me._msg("post.author") + ': '; + html += '' + authorLink + ''; + if (data.isPublished && data.postLink && data.postLink.length > 0) + { + html += ' '; + html += '' + me._msg("post.externalLink") + ': '; + html += '' + me._msg("post.clickHere") + ''; + } + html += '
    '; + html += '
    '; + html += '
    '; + } + + // assign html + elCell.innerHTML = html; + + // finally add the content. We do this here to avoid a broken page layout, as + // data.content isn't valid xhtml. + if (!me.options.simpleView) + { + var contentElem = Dom.getElementsByClassName("content", "div", elCell); + if (contentElem.length == 1) + { + contentElem[0].innerHTML = data.content; + } + } + + // now show the element + Dom.removeClass(elCell, 'hidden'); + }; + + // DataTable column defintions + var columnDefinitions = [ + { + key: "blogposts", label: "BlogPosts", sortable: false, formatter: renderBlogPost + }]; + + // DataTable definition + this.widgets.dataTable = new YAHOO.widget.DataTable(this.id + "-postlist", columnDefinitions, this.widgets.dataSource, + { + initialLoad: false, + dynamicData: true, + MSG_EMPTY: this._msg("message.loading") + }); + + // Update totalRecords on the fly with value from server + this.widgets.dataTable.handleDataReturnPayload = function DL_handleDataReturnPayload(oRequest, oResponse, oPayload) + { + // Save totalRecords for Paginator update later + me.recordOffset = oResponse.meta.recordOffset; + me.totalRecords = oResponse.meta.totalRecords; + me.totalRecordsUpper = oResponse.meta.totalRecordsUpper; + + oPayload = oPayload || {}; + oPayload.recordOffset = oResponse.meta.recordOffset; + oPayload.totalRecords = oResponse.meta.totalRecords; + return oPayload; + } + + // Prevent the DataTable from updating the Paginator widget + this.widgets.dataTable.doBeforePaginatorChange = function DL_doBeforePaginatorChange(oPaginatorState) + { + return false; + } + + // Rendering complete event handler + this.widgets.dataTable.subscribe("renderEvent", function() + { + // Update the paginator if it's been created + this.widgets.paginator.setState( + { + recordOffset: this.recordOffset, + totalRecords: this.totalRecords + }); + if (this.totalRecordsUpper && this.totalRecordsUpper == true) + { + this.widgets.paginator.set("pageReportTemplate", this._msg("pagination.template.page-report.more")); + } + else + { + this.widgets.paginator.set("pageReportTemplate", this._msg("pagination.template.page-report")); + } + this.widgets.paginator.render(); + }, this, true); + + // Custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + // Hook tableMsgShowEvent to clear out fixed-pixel width on element (breaks resizer) + this.widgets.dataTable.subscribe("tableMsgShowEvent", function(oArgs) + { + // NOTE: Scope needs to be DataTable + this._elMsgTbody.parentNode.style.width = ""; + }); + + // Override abstract function within DataTable to set custom error message + this.widgets.dataTable.doBeforeLoadData = function BlogPostList_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.set("MSG_ERROR", response.message); + } + catch(e) + { + me._setDefaultDataTableErrors(me.widgets.dataTable); + } + } + else if (oResponse.results && !me.options.usePagination) + { + this.renderLoopSize = Alfresco.util.RENDERLOOPSIZE; + } + + // Must return true to have the "Loading..." message replaced by the error message + return true; + }; + + // Enable row highlighting + this.widgets.dataTable.subscribe("rowMouseoverEvent", this.onEventHighlightRow, this, true); + this.widgets.dataTable.subscribe("rowMouseoutEvent", this.onEventUnhighlightRow, this, true); + + // Load the new blog posts by default + var filterObj = YAHOO.lang.merge( + { + filterId: "new", + filterOwner: "Alfresco.BlogPostListFilter", + filterData: null + }, this.options.initialFilter); + YAHOO.Bubbling.fire("changeFilter", filterObj); + }, + + // Actions + + /** + * Action handler for the simple view toggle button + * + * @method onSimpleView + */ + onSimpleView: function BlogPostList_onSimpleView(e, p_obj) + { + this.options.simpleView = !this.options.simpleView; + p_obj.set("label", this._msg(this.options.simpleView ? "header.detailList" : "header.simpleList")); + + // refresh the list + YAHOO.Bubbling.fire("blogpostlistRefresh"); + Event.preventDefault(e); + }, + + /** + * Handler for the view blog post action links + * + * @method onViewBlogPost + * @param row {object} DataTable row representing post to be actioned + */ + onViewBlogPost: function BlogPostList_onViewNode(row) + { + var record = this.widgets.dataTable.getRecord(row); + window.location = this._generatePostViewUrl(record.getData('name')); + }, + + /** + * Handler for the edit blog post action links + * + * @method onEditBlogPost + * @param row {object} DataTable row representing post to be actioned + */ + onEditBlogPost: function BlogPostList_onEditBlogPost(row) + { + var record = this.widgets.dataTable.getRecord(row); + var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "site/{site}/blog-postedit?postId={postId}", + { + site: this.options.siteId, + postId: record.getData('name') + }); + window.location = url; + }, + + /** + * Handler for the delete blog post action links + * + * @method onDeleteBlogPost + * @param row {object} DataTable row representing post to be actioned + */ + onDeleteBlogPost: function BlogPostList_onDeleteBlogPost(row) + { + var record = this.widgets.dataTable.getRecord(row); + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this._msg("message.confirm.delete.title"), + text: this._msg("message.confirm.delete", $html(record.getData('title'))), + buttons: [ + { + text: this._msg("button.delete"), + handler: function BlogPostList_onDeleteBlogPost_delete() + { + this.destroy(); + me._deleteBlogPostConfirm.call(me, record.getData('name')); + } + }, + { + text: this._msg("button.cancel"), + handler: function BlogPostList_onDeleteBlogPost_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Handler for the publish external action links + * + * @method onPublishExternal + * @param row {object} DataTable row representing post to be actioned + */ + onPublishExternal: function BlogPostList_onPublishExternal(row) + { + var record = this.widgets.dataTable.getRecord(row); + this._publishExternal(record.getData('name')); + }, + + /** + * Handler for the update external action links + * + * @method onUpdateExternal + * @param row {object} DataTable row representing post to be actioned + */ + onUpdateExternal: function BlogPostList_onUpdateExternal(row) + { + var record = this.widgets.dataTable.getRecord(row); + this._updateExternal(record.getData('name')); + }, + + /** + * Handler for the unpublish external action links + * + * @method onUnpublishExternal + * @param row {object} DataTable row representing post to be actioned + */ + onUnpublishExternal: function BlogPostList_onUnpublishExternal(row) + { + var record = this.widgets.dataTable.getRecord(row); + this._unpublishExternal(record.getData('name')); + }, + + /** + * Tag selected handler + * + * @method onTagSelected + */ + onTagSelected: function BlogPostList_onTagSelected(layer, args) + { + var obj = args[1]; + if (obj && (obj.tagName !== null)) + { + var filterObj = + { + filterId: obj.tagName, + filterOwner: "Alfresco.BlogPostListTags", + filterData: null + }; + YAHOO.Bubbling.fire("changeFilter", filterObj); + } + }, + + /** + * On blog config changed h handler + * + * @method onTagSelected + */ + onBlogConfigChanged: function BlogPostList_onBlogConfigChanged(layer, args) + { + // refresh the list + this._updateBlogPostList(); + }, + + // Actions implementation + + /** + * Blog post deletion implementation + * + * @method _deleteBlogPostConfirm + * @param postId {string} the id of the blog post to delete + */ + _deleteBlogPostConfirm: function BlogPostList__deleteBlogPostConfirm(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onDeletedSuccess = function BlogPostList_deleteBlogPostConfirm_onDeletedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // reload the table data + this._updateBlogPostList(); + }; + + // get the url to call + var url = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/blog/post/site/{site}/{container}/{postId}?page=blog-postlist", + { + site: this.options.siteId, + container: this.options.containerId, + postId: encodeURIComponent(postId) + }); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "DELETE", + responseContentType : "application/json", + successMessage: this._msg("message.delete.success"), + successCallback: + { + fn: onDeletedSuccess, + scope: this + }, + failureMessage: this._msg("message.delete.failure"), + failureCallback: + { + fn: function(response) + { + this._releaseBusy(); + }, + scope: this + } + }); + }, + + /** + * Publishing of a blog post implementation + * + * @method _publishExternal + * @param postId {string} the id of the blog post to publish + */ + _publishExternal: function BlogPostList__publishExternal(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax call success handler + var onPublishedSuccess = function BlogPostList_onPublishedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // reload the table data + this._updateBlogPostList(); + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "publish" + }, + successMessage: this._msg("message.publishExternal.success"), + successCallback: + { + fn: onPublishedSuccess, + scope: this + }, + failureMessage: this._msg("message.publishExternal.failure"), + failureCallback: + { + fn: function(response) { this._releaseBusy(); }, + scope: this + } + }); + }, + + + /** + * Updating of an external published blog post implementation + * + * @method _updateExternal + * @param postId {string} the id of the blog post to update + */ + _updateExternal: function BlogPostList__updateExternal(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onUpdatedSuccess = function BlogPostList_onUpdatedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // reload the table data + this._updateBlogPostList(); + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "update" + }, + successMessage: this._msg("message.updateExternal.success"), + successCallback: + { + fn: onUpdatedSuccess, + scope: this + }, + failureMessage: this._msg("message.updateExternal.failure"), + failureCallback: + { + fn: function(response) { this._releaseBusy(); }, + scope: this + } + }); + }, + + + /** + * Unpublishing of an external published blog post implementation + * + * @method _unpublishExternal + * @param postId {string} the id of the blog post to update + */ + _unpublishExternal: function BlogPostList__onUnpublishExternal(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onUnpublishedSuccess = function BlogPostList_onUnpublishedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // reload the table data + this._updateBlogPostList(); + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "unpublish" + }, + successMessage: this._msg("message.unpublishExternal.success"), + successCallback: + { + fn: onUnpublishedSuccess, + scope: this + }, + failureMessage: this._msg("message.unpublishExternal.failure"), + failureCallback: + { + fn: function(response) + { + this._releaseBusy(); + }, + scope: this + } + }); + }, + + + // row highlighting + + /** + * Custom event handler to highlight row. + * + * @method onEventHighlightRow + * @param oArgs.event {HTMLEvent} Event object. + * @param oArgs.target {HTMLElement} Target element. + */ + onEventHighlightRow: function BlogPostList_onEventHighlightRow(oArgs) + { + // only highlight if we got actions to show + var record = this.widgets.dataTable.getRecord(oArgs.target.id); + // This event triggers for empty lists too, so record may be null. + if (record) + { + var permissions = record.getData('permissions'); + if (!(permissions.edit || permissions["delete"])) + { + return; + } + + var elem = Dom.getElementsByClassName('post', null, oArgs.target, null); + Dom.addClass(elem, 'over'); + } + }, + + /** + * Custom event handler to unhighlight row. + * + * @method onEventUnhighlightRow + * @param oArgs.event {HTMLEvent} Event object. + * @param oArgs.target {HTMLElement} Target element. + */ + onEventUnhighlightRow: function BlogPostList_onEventUnhighlightRow(oArgs) + { + var elem = Dom.getElementsByClassName('post', null, oArgs.target, null); + Dom.removeClass(elem, 'over'); + }, + + + /** + * BlogPostList Change filter event handler + * + * @method onChangeFilter + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (new filterId) + */ + onChangeFilter: function BlogPostList_onChangeFilter(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.filterId !== null)) + { + this.currentFilter = + { + filterId: obj.filterId, + filterOwner: obj.filterOwner, + filterData: obj.filterData + }; + this._updateBlogPostList( + { + page: 1 + }); + YAHOO.Bubbling.fire("filterChanged", this.currentFilter); + } + }, + + /** + * Deactivate All Controls event handler + * + * @method onDeactivateAllControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateAllControls: function BlogPostList_onDeactivateAllControls(layer, args) + { + var index, widget, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.widgets) + { + if (this.widgets.hasOwnProperty(index)) + { + fnDisable(this.widgets[index]); + } + } + }, + + /** + * Updates the list title considering the current active filter. + */ + updateListTitle: function BlogPostList_updateListTitle() + { + var elem = Dom.get(this.id + '-listtitle'); + var title = this._msg("title.postlist"); + + var filterOwner = this.currentFilter.filterOwner; + var filterId = this.currentFilter.filterId; + var filterData = this.currentFilter.filterData; + if (filterOwner == "Alfresco.BlogPostListFilter") + { + if (filterId == "all") + { + title = this._msg("title.allposts"); + } + if (filterId == "new") + { + title = this._msg("title.newposts"); + } + else if (filterId == "mydrafts") + { + title = this._msg("title.mydrafts"); + } + else if (filterId == "mypublished") + { + title = this._msg("title.mypublished"); + } + else if (filterId == "publishedext") + { + title = this._msg("title.publishedext"); + } + } + else if (filterOwner == "Alfresco.BlogPostListTags") + { + title = this._msg("title.bytag", $html(filterData)); + } + else if (filterOwner == "Alfresco.BlogPostListArchive" && filterId == "bymonth") + { + var date = new Date(filterData.year, filterData.month, 1); + var formattedDate = Alfresco.util.formatDate(date, this._msg("date-format.monthYear")); + title = this._msg("title.bymonth", formattedDate); + } + + elem.innerHTML = title; + }, + + + /** + * BlogPostList Refresh Required event handler + * + * @method onBlogPostListRefresh + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (unused) + */ + onBlogPostListRefresh: function BlogPostList_onBlogPostListRefresh(layer, args) + { + this._updateBlogPostList(); + }, + + /** + * Displays the provided busyMessage but only in case + * the component isn't busy set. + * + * @return true if the busy state was set, false if the component is already busy + */ + _setBusy: function BlogPostList__setBusy(busyMessage) + { + if (this.busy) + { + return false; + } + this.busy = true; + this.widgets.busyMessage = Alfresco.util.PopupManager.displayMessage( + { + text: busyMessage, + spanClass: "wait", + displayTime: 0 + }); + return true; + }, + + /** + * Removes the busy message and marks the component as non-busy + */ + _releaseBusy: function BlogPostList__releaseBusy() + { + if (this.busy) + { + if (this.widgets.busyMessage.destroyWithAnimationsStop != undefined) + { + this.widgets.busyMessage.destroyWithAnimationsStop(); + } + else + { + this.widgets.busyMessage.destroy(); + } + this.busy = false; + return true; + } + else + { + return false; + } + }, + + /** + * Gets a custom message + * + * @method _msg + * @param messageId {string} The messageId to retrieve + * @return {string} The custom message + * @private + */ + _msg: function BlogPostList_msg(messageId) + { + return Alfresco.util.message.call(this, messageId, "Alfresco.BlogPostList", Array.prototype.slice.call(arguments).slice(1)); + }, + + /** + * Resets the YUI DataTable errors to our custom messages + * NOTE: Scope could be YAHOO.widget.DataTable, so can't use "this" + * + * @method _setDefaultDataTableErrors + * @param dataTable {object} Instance of the DataTable + */ + _setDefaultDataTableErrors: function BlogPostList__setDefaultDataTableErrors(dataTable) + { + var msg = Alfresco.util.message; + dataTable.set("MSG_EMPTY", msg("message.empty", "Alfresco.BlogPostList")); + dataTable.set("MSG_ERROR", msg("message.error", "Alfresco.BlogPostList")); + }, + + /** + * Updates blog post list by calling data webscript with current site and filter information + * + * @method _updateBlogPostList + */ + _updateBlogPostList: function BlogPostList__updateBlogPostList(p_obj) + { + // show busy message + /*if (! this._setBusy(this._msg('message.wait'))) + { + return; + }*/ + + // Reset the custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + // ajax request success handler + var successHandler = function BlogPostList__updateBlogPostList_successHandler(sRequest, oResponse, oPayload) + { + // remove busy message + //this._releaseBusy(); + + this.widgets.dataTable.onDataReturnInitializeTable.call(this.widgets.dataTable, sRequest, oResponse, oPayload); + this.updateListTitle(); + }; + + // ajax request failure handler + var failureHandler = function BlogPostList__updateBlogPostList_failureHandler(sRequest, oResponse) + { + // remove busy message + //this._releaseBusy(); + + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(true); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.dataTable.set("MSG_ERROR", response.message); + this.widgets.dataTable.showTableMessage(Alfresco.util.encodeHTML(response.message), YAHOO.widget.DataTable.CLASS_ERROR); + if (oResponse.status == 404) + { + // Site or container not found - deactivate controls + YAHOO.Bubbling.fire("deactivateAllControls"); + } + } + catch(e) + { + this._setDefaultDataTableErrors(this.widgets.dataTable); + } + } + }; + + // get the url to call + this.widgets.dataSource.sendRequest(this._buildBlogPostListParams(p_obj || {}), + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Build URI parameter string for doclist JSON data webscript + * + * @method _buildDocListParams + * @param p_obj.page {string} Page number + * @param p_obj.pageSize {string} Number of items per page + */ + _buildBlogPostListParams: function BlogPostList__buildDocListParams(p_obj) + { + var params = + { + contentLength: this.options.maxContentLength, + fromDate: null, + toDate: null, + tag: null, + page: this.widgets.paginator.getCurrentPage() || "1", + pageSize: this.widgets.paginator.getRowsPerPage() + }; + + // Passed-in overrides + if (typeof p_obj == "object") + { + params = YAHOO.lang.merge(params, p_obj); + } + + // calculate the startIndex param + params.startIndex = (params.page-1) * params.pageSize; + + // check what url to call and with what parameters + var filterOwner = this.currentFilter.filterOwner; + var filterId = this.currentFilter.filterId; + var filterData = this.currentFilter.filterData; + + // check whether we got a filter or not + var url = "", + urlExt = "", + paramName; + + if (filterOwner == "Alfresco.BlogPostListFilter") + { + // latest only + if (filterId == "all") + { + url = ""; + } + if (filterId == "new") + { + url = "/new"; + } + else if (filterId == "mydrafts") + { + url = "/mydrafts"; + } + else if (filterId == "mypublished") + { + url = "/mypublished"; + } + else if (filterId == "publishedext") + { + url = "/publishedext"; + } + } + else if (filterOwner == "Alfresco.TagFilter") + { + params.tag = encodeURIComponent(filterData); + } + else if (filterOwner == "Alfresco.BlogPostListArchive" && filterId == "bymonth") + { + var fromDate = new Date(filterData.year, filterData.month, 1); + var toDate = new Date(filterData.year, filterData.month + 1, 1); + toDate = new Date(toDate.getTime() - 1); + params.fromDate = fromDate.getTime(); + params.toDate = toDate.getTime(); + } + else if (filterOwner == "Alfresco.BlogPostListTags" && filterId != null) + { + urlExt += "&" + filterId + "=" + encodeURIComponent(filterData); + } + + // build the url extension + for (paramName in params) + { + if (params[paramName] !== null) + { + urlExt += "&" + paramName + "=" + encodeURIComponent(params[paramName]); + } + } + if (urlExt.length > 0) + { + urlExt = urlExt.substring(1); + } + return url + "?" + urlExt; + } + }; +})(); diff --git a/share/src/main/webapp/components/blog/postview.css b/share/src/main/webapp/components/blog/postview.css new file mode 100644 index 0000000000..ea1e1d2e4c --- /dev/null +++ b/share/src/main/webapp/components/blog/postview.css @@ -0,0 +1,330 @@ + +/**************** + * NODE DETAIL * +*****************/ +.postview +{ + margin: 1.5em 0; + padding: 20px 10px; + display: inline-block; +} + +.node .authorPicture, .reply .authorPicture, .comment .authorPicture +{ + text-align: center; + margin-right: 10px; + width: 100px; + position: relative; + float: left; +} + +.topicview .nodeFooter, .postview .nodeFooter +{ + /* background: #F8FAFB; */ + background: transparent; + border: none; + margin-top: 5px; +} + +.topicview .nodeContent, .comment .nodeContent, .reply .nodeContent +{ + margin-left: 110px; +} + +.topicview .nodeFooter, .comment .commentFooter, .reply .nodeFooter +{ + margin-left: 110px; +} + + +/******** + * NODE * +*********/ + +html>body .node, .reply, .comment +{ + display: block; +} + +.node table td, +.reply table td, +.comment table td +{ + vertical-align: top; +} + +.node.simple +{ + padding: 5px; +} + +.node .published +{ + margin: 5px 0 10px 0; +} + +.node .nodeTitle a +{ + font-size: 131%; + line-height: 130%; + color: #2b6eb5; +} + +.node .nodeStatus { + font-size: 131%; + line-height: 130%; +} + +.nodeAttrLabel +{ + font-size: 100%; + line-height: 130%; + color: #606060; +} + +.nodeAttrValue +{ + font-size: 100%; + line-height: 130%; + color: #333333; +} + +.nodeAttrValue a +{ + color: #2b6eb5; +} + +.node .userLink +{ + font-size: 100%; + line-height: 150%; + color: #999999; +} + +.node .userLink a +{ + color: #2b6eb5; +} + +.nodeContent +{ + line-height: 150%; + margin-left: 1em; + margin-right: 5em; + padding-right: 2em; + overflow: auto; +} + +.nodeContent ul li +{ + list-style-type: inherit; +} + +.nodeContent ol li +{ + list-style-type: inherit; +} + +.nodeFooter +{ + background-color: #f8f8f8; + border-top: 1px dashed #c6c6c6; + border-bottom: 1px solid #c6c6c6; + padding: 1px; +} + +.nodeFooter .tagLabel +{ + background:transparent url(../images/tag-16.png) no-repeat scroll 0px 50%; + padding-left: 18px; +} + + +/************* + * EDIT BLOC * +**************/ +.nodeEdit +{ + float: right; + margin: 10px 0 0 15px; + position: relative; + width: 12em; +} + +.nodeEdit div, +.replyEdit div +{ + padding: 2px 19px; + margin-bottom: 4px; +} + +.node.simple .nodeEdit +{ + width: 200px; +} + +.nodeEdit .action-link +{ + font-size: 93%; + line-height: 150%; + color: #2B6EB5; +} + +.nodeEdit .onViewNode +{ + background: url(../images/view-discussion-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onAddReply +{ + background: url(../images/reply-to-discussion-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} +.nodeEdit .onEditNode, +.nodeEdit .onEditReply, +.nodeEdit .onEditComment +{ + background:url(../images/edit-discussion-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onEditBlogPost +{ + background:url(../images/edit-blog-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onDeleteNode, +.nodeEdit .onDeleteReply, +.nodeEdit .onDeleteComment +{ + background: url('../images/delete-discussion-16.png') no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onDeleteBlogPost +{ + background: url('../images/delete-blog-16.png') no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onUpdateExternal +{ + background: url(../images/update-external-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onPublishExternal +{ + background: url(../images/publish-external-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} + +.nodeEdit .onUnpublishExternal +{ + background: url(../images/unpublish-external-16.png) no-repeat scroll 0 2px; + padding-left: 20px; +} + +/* + * VISUAL APPEARANCE CUSTOMISATIONS + * + * Improve display of blog page content, since the default Share CSS is not optimised + * for large blocks of HTML. + */ + +.alfresco-share .sticky-wrapper .postview .content +{ + font-size: 1.2em; + /* Comment out the following line to make the page + take up the full screen width */ + max-width: 60em; + /* Make the text darker */ + color: #333333; + /* Increase line height to improve readability */ + line-height: 1.5em; +} + +.postview .content a +{ + /* Make links look like links */ + color: #6CA5CE; +} + +.postview .content h1 +{ + margin: 0.5em 0; + padding: 0 0 0.25em 0; + border-bottom: 1px solid #cccccc; +} + +.postview .content h2 +{ + padding-top: 0.5em 0; +} + +.postview .content h3, .postview .content h4, +.postview .content h5, .postview .content h6 +{ + padding: 0.5em 0; +} + +.alfresco-share .sticky-wrapper .postview .content p +{ + margin: 0.8em 0; +} + +.postview .content h1 a, .postview .content h2 a, +.postview .content h3 a, .postview .content h4 a, +.postview .content h5 a, .postview .content h6 a +{ + color: #333333; +} + +.postview .content h1 a:hover, .postview .content h2 a:hover, +.postview .content h3 a:hover, .postview .content h4 a:hover, +.postview .content h5 a:hover, .postview .content h6 a:hover +{ + color: #333333; + text-decoration: none; +} + +.alfresco-share .sticky-wrapper .postview .content ul, +.alfresco-share .sticky-wrapper .postview .content ol +{ + padding: 0.5em 0 0.5em 1em; +} + +.postview .content h1 + ul, +.postview .content h2 + ul, +.postview .content h3 + ul, +.postview .content h4 + ul, +.postview .content h5 + ul, +.postview .content h6 + ul, +.postview .content h1 + ol, +.postview .content h2 + ol, +.postview .content h3 + ol, +.postview .content h4 + ol, +.postview .content h5 + ol, +.postview .content h6 + ol +{ + padding-top: 1em; +} + +.postview .content ul li +{ +} + +.postview .content pre, +.postview .content code +{ + font-size: 0.9em; + line-height: 1.5em; + border: 1px solid #cccccc; + padding: 1em; + margin: 0.5em 0; + background-color: #f0f0f0; + overflow: auto; + max-height: 30em; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/blog/postview.js b/share/src/main/webapp/components/blog/postview.js new file mode 100644 index 0000000000..9a222c223e --- /dev/null +++ b/share/src/main/webapp/components/blog/postview.js @@ -0,0 +1,705 @@ +/** + * BlogPostView component. + * + * Component to view a blog post + * + * @namespace Alfresco + * @class Alfresco.BlogPostView + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * BlogPostView constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.BlogPostView} The new Post instance + * @constructor + */ + Alfresco.BlogPostView = function(htmlId) + { + /* Mandatory properties */ + this.name = "Alfresco.BlogPostView"; + this.id = htmlId; + + /* Initialise prototype properties */ + this.widgets = {}; + this.tagId = + { + id: 0, + tags: {} + }; + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["json", "connection", "event", "button", "menu"], this.onComponentsLoaded, this); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("tagSelected", this.onTagSelected, this); + + return this; + }; + + Alfresco.BlogPostView.prototype = + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "blog" + */ + containerId: "blog", + + /** + * Id of the displayed blog post. + */ + postId: "" + }, + + /** + * Stores the data displayed by this component + */ + blogPostData: null, + + /** + * Object container for storing YUI widget instances. + * + * @property widgets + * @type object + */ + widgets : null, + + /** + * Object literal used to generate unique tag ids + * + * @property tagId + * @type object + */ + tagId: null, + + /** + * Tells whether an action is currently ongoing. + * + * @property busy + * @type boolean + * @see setBusy/releaseBusy + */ + busy: false, + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + */ + setOptions: function BlogPostView_setOptions(obj) + { + this.options = YAHOO.lang.merge(this.options, obj); + return this; + }, + + /** + * Set messages for this component. + * + * @method setMessages + * @param obj {object} Object literal specifying a set of messages + * @return {Alfresco.BlogPostView} returns 'this' for method chaining + */ + setMessages: function BlogPostView_setMessages(obj) + { + Alfresco.util.addMessages(obj, this.name); + return this; + }, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function BlogPostView_onComponentsLoaded() + { + Event.onContentReady(this.id, this.onReady, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function BlogPostView_onReady() + { + var me = this; + + // Hook action events. + var fnActionHandlerDiv = function BlogPostView_fnActionHandlerDiv(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + var action = ""; + action = owner.className; + if (typeof me[action] == "function") + { + me[action].call(me, me.blogPostData.name); + args[1].stop = true; + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("blogpost-action-link-div", fnActionHandlerDiv); + + // Hook tag clicks + Alfresco.util.tags.registerTagActionHandler(this); + + // initialize the mouse over listener + Alfresco.util.rollover.registerHandlerFunctions(this.id, this.onPostElementMouseEntered, this.onPostElementMouseExited, this); + + // load the post data + this._loadBlogPostData(); + }, + + /** + * Loads the comments for the provided nodeRef and refreshes the ui + */ + _loadBlogPostData: function BlogPostView__loadBlogPostData() + { + // construct the request url + var url = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/blog/post/site/{site}/{container}/{postId}", + { + site : this.options.siteId, + container: this.options.containerId, + postId: this.options.postId + }); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + successCallback: + { + fn: this.loadBlogPostDataSuccess, + scope: this + }, + failureMessage: this._msg("message.loadpostdata.failure") + }); + }, + + /** + * Success handler for a blog post request. Updates the UI using the blog post data + * provided in the response object. + * + * @param response {object} the ajax request response + */ + loadBlogPostDataSuccess: function BlogPostView_loadCommentsSuccess(response) + { + // store the returned data locally + var data = response.json.item; + this.blogPostData = data; + + // get the container div to insert the the post into + var viewDiv = Dom.get(this.id + '-post-view-div'); + + // render the blog post and insert it into the div + var html = this.renderBlogPost(data); + viewDiv.innerHTML = html; + + // attach the rollover listeners + Alfresco.util.rollover.registerListenersByClassName(this.id, 'post', 'div'); + + // inform interested comment components about the loaded blog post + this.sendCommentedNodeEvent(); + }, + + /** + * Sends out a setCommentedNode bubble event. + */ + sendCommentedNodeEvent: function BlogPostView_sendCommentedNodeEvent() + { + var eventData = + { + nodeRef: this.blogPostData.nodeRef, + title: this.blogPostData.title, + page: "blog-postview", + pageParams: + { + postId: this.blogPostData.name + } + }; + YAHOO.Bubbling.fire("setCommentedNode", eventData); + }, + + /** + * Renders the blog post given a blog post data object returned by the server. + */ + renderBlogPost: function BlogPostView_renderBlogPost(data) + { + // preformat some values + var postViewUrl = Alfresco.util.blog.generateBlogPostViewUrl(this.options.siteId, this.options.containerId, data.name); + var statusLabel = Alfresco.util.blog.generatePostStatusLabel(this, data); + //ALF-18527 + var authorLink = data.author.username; + // firstName is a mandatory field for user + if (typeof data.author.firstName != "undefined") + { + authorLink = Alfresco.util.people.generateUserLink(data.author); + } + + var html = '
    '; + html += Alfresco.util.blog.generateBlogPostActions(this, data, 'div'); + + // content + html += '
    '; + html += '
    ' + $html(data.title) + ' '; + html += '' + statusLabel + ''; + html += '
    '; + + html += '
    '; + if (!data.isDraft) + { + html += '' + this._msg("post.publishedOn") + ': '; + html += '' + Alfresco.util.formatDate(data.releasedOn) + ''; + html += ' '; + } + + html += '' + this._msg("post.author") + ': '; + html += '' + authorLink + ''; + + if (data.isPublished && data.postLink !== undefined && data.postLink.length > 0) + { + html += ' '; + html += '' + this._msg("post.externalLink") + ': '; + html += '' + this._msg("post.clickHere") + ''; + } + + html += ' '; + html += '' + this._msg("label.tags") + ': '; + if (data.tags.length > 0) + { + for (var x=0; x < data.tags.length; x++) + { + if (x > 0) + { + html += ', '; + } + html += Alfresco.util.tags.generateTagLink(this, data.tags[x]); + } + } + else + { + html += '' + this._msg("post.noTags") + ''; + } + html += '
    '; + + html += '
    ' + data.content + '
    '; + html += '
    '; + return html; + }, + + + // Actions + + /** + * Tag selected handler. + * + * @method onTagSelected + * @param tagId {string} Tag name. + * @param target {HTMLElement} Target element clicked. + */ + onTagSelected: function BlogPostView_onTagSelected(layer, args) + { + var obj = args[1]; + if (obj && (obj.tagName !== null)) + { + var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "site/{site}/blog-postlist?filterId={filterId}&filterOwner={filterOwner}&filterData={filterData}", + { + site: this.options.siteId, + filterId: "tag", + filterOwner: "Alfresco.BlogPostListTags", + filterData: encodeURIComponent(obj.tagName) + }); + window.location = url; + } + }, + + /** + * Loads the edit post form and displays it instead of the content + * The div class should have the same name as the above function (onEditNode) + */ + onEditBlogPost: function BlogPostView_onEditNode(postId) + { + var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "site/{site}/blog-postedit?postId={postId}", + { + site: this.options.siteId, + postId: postId + }); + window.location = url; + }, + + /** + * Blog post deletion implementation + * + * @method onDeleteBlogPost + * @param postId {string} the id of the blog post to delete + */ + onDeleteBlogPost: function BlogPostView_onDeleteBlogPost(postId) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this._msg("message.confirm.delete.title"), + text: this._msg("message.confirm.delete", $html(this.blogPostData.title)), + buttons: [ + { + text: this._msg("button.delete"), + handler: function BlogPostList_onDeleteBlogPost_delete() + { + this.destroy(); + me._deleteBlogPostConfirm.call(me, me.blogPostData.name); + } + }, + { + text: this._msg("button.cancel"), + handler: function BlogPostList_onDeleteBlogPost_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Blog post deletion implementation + * + * @method _deleteBlogPostConfirm + * @param postId {string} the id of the blog post to delete + */ + _deleteBlogPostConfirm: function BlogPostView__deleteBlogPostConfirm(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onDeletedSuccess = function BlogPostList_onDeletedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // load the blog post list page + var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "site/{site}/blog-postlist", + { + site: this.options.siteId + }); + window.location = url; + }; + + // get the url to call + var url = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/blog/post/site/{site}/{container}/{postId}?page={page}", + { + site: this.options.siteId, + container: this.options.containerId, + postId: encodeURIComponent(postId), + page: "blog-postlist" + }); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "DELETE", + responseContentType : "application/json", + successMessage: this._msg("message.delete.success"), + successCallback: + { + fn: onDeletedSuccess, + scope: this + }, + failureMessage: this._msg("message.delete.failure"), + failureCallback: + { + fn: function(response) + { + this._releaseBusy(); + }, + scope: this + } + }); + }, + + + /** + * Publishing of a blog post + * + * @method onPublishExternal + * @param postId {string} the id of the blog post to publish + */ + onPublishExternal: function BlogPostView_onPublishExternal(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax call success handler + var onPublishedSuccess = function BlogPostList_onPublishedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // re-render the post + this.loadBlogPostDataSuccess(response); + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "publish" + }, + successMessage: this._msg("message.publishExternal.success"), + successCallback: + { + fn: onPublishedSuccess, + scope: this + }, + failureMessage: this._msg("message.publishExternal.failure"), + failureCallback: + { + fn: function(response) { this._releaseBusy(); }, + scope: this + } + }); + }, + + + /** + * Updating of an external published blog post implementation + * + * @method onUpdateExternal + * @param postId {string} the id of the blog post to update + */ + onUpdateExternal: function BlogPostView_onUpdateExternal(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onUpdatedSuccess = function BlogPostList_onUpdatedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // re-render the post + this.loadBlogPostDataSuccess(response); + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "update" + }, + successMessage: this._msg("message.updateExternal.success"), + successCallback: + { + fn: onUpdatedSuccess, + scope: this + }, + failureMessage: this._msg("message.updateExternal.failure"), + failureCallback: + { + fn: function(response) { this._releaseBusy(); }, + scope: this + } + }); + }, + + + /** + * Unpublishing of an external published blog post implementation + * + * @method onUnpublishExternal + * @param postId {string} the id of the blog post to update + */ + onUnpublishExternal: function BlogPostView_onUnpublishExternal(postId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onUnpublishedSuccess = function BlogPostList_onUnpublishedSuccess(response) + { + // remove busy message + this._releaseBusy(); + + // re-render the post + this.loadBlogPostDataSuccess(response); + }; + + // get the url to call + var url = Alfresco.util.blog.generatePublishingRestURL(this.options.siteId, this.options.containerId, postId); + + // execute ajax request + Alfresco.util.Ajax.request( + { + url: url, + method: "POST", + requestContentType : "application/json", + responseContentType : "application/json", + dataObj: + { + action : "unpublish" + }, + successMessage: this._msg("message.unpublishExternal.success"), + successCallback: + { + fn: onUnpublishedSuccess, + scope: this + }, + failureMessage: this._msg("message.unpublishExternal.failure"), + failureCallback: + { + fn: function(response) { this._releaseBusy(); }, + scope: this + } + }); + }, + + + // mouse hover functionality + + /** Called when the mouse enters into a list item. */ + onPostElementMouseEntered: function BlogPostView_onListElementMouseEntered(layer, args) + { + // make sure the user sees at least one action, otherwise we won't highlight + var permissions = this.blogPostData.permissions; + if (!(permissions.edit || permissions["delete"])) + { + return; + } + + Dom.addClass(args[1].target, 'over'); + }, + + /** Called whenever the mouse exits a list item. */ + onPostElementMouseExited: function BlogPostView_onListElementMouseExited(layer, args) + { + Dom.removeClass(args[1].target, 'over'); + }, + + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Displays the provided busyMessage but only in case + * the component isn't busy set. + * + * @return true if the busy state was set, false if the component is already busy + */ + _setBusy: function BlogPostList__setBusy(busyMessage) + { + if (this.busy) + { + return false; + } + this.busy = true; + this.widgets.busyMessage = Alfresco.util.PopupManager.displayMessage( + { + text: busyMessage, + spanClass: "wait", + displayTime: 0 + }); + return true; + }, + + /** + * Removes the busy message and marks the component as non-busy + */ + _releaseBusy: function BlogPostList__releaseBusy() + { + if (this.busy) + { + this.widgets.busyMessage.destroy(); + this.busy = false; + return true; + } + else + { + return false; + } + }, + + /** + * Gets a custom message + * + * @method _msg + * @param messageId {string} The messageId to retrieve + * @return {string} The custom message + * @private + */ + _msg: function BlogPostView_msg(messageId) + { + return Alfresco.util.message.call(this, messageId, "Alfresco.BlogPostView", Array.prototype.slice.call(arguments).slice(1)); + } + }; +})(); diff --git a/share/src/main/webapp/components/blog/toolbar.css b/share/src/main/webapp/components/blog/toolbar.css new file mode 100644 index 0000000000..0814e2d4e8 --- /dev/null +++ b/share/src/main/webapp/components/blog/toolbar.css @@ -0,0 +1,45 @@ + +.blog-toolbar .new-blog button +{ + background: transparent url(../images/new-blog-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +.blog-toolbar .new-blog .yui-button-disabled button +{ + background-image: url(../images/new-blog-16.png); +} + +.blog-toolbar .configure-blog button +{ + background: transparent url(../images/configure-blog-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +.blog-toolbar .new-blog .yui-button-disabled button +{ + background-image: url(../images/configure-blog-16.png); +} + +.blog-toolbar .rss-feed +{ + float: right; +} + +.blog-toolbar .rss-feed a +{ + background: transparent url(../images/feed-icon-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +.blog-toolbar .rss-feed .yui-button-disabled a +{ + background-image: url(../images/feed-icon-disabled-16.png); +} + +.blog-toolbar .hide +{ + display: none; + padding: 0; + width: 0; +} diff --git a/share/src/main/webapp/components/blog/toolbar.js b/share/src/main/webapp/components/blog/toolbar.js new file mode 100644 index 0000000000..f6a5b372c7 --- /dev/null +++ b/share/src/main/webapp/components/blog/toolbar.js @@ -0,0 +1,222 @@ +/* + *** Alfresco.BlogToolbar +*/ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + Alfresco.BlogToolbar = function(containerId) + { + this.name = "Alfresco.BlogToolbar"; + this.id = containerId; + this.widgets = {}; + this.modules = {}; + this.options = {}; + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "container", "connection"], this.onComponentsLoaded, this); + + // Decoupled event listeners + YAHOO.Bubbling.on("deactivateAllControls", this.onDeactivateAllControls, this); + + return this; + }; + + Alfresco.BlogToolbar.prototype = + { + /** + * Object container for storing YUI widget instances. + * + * @property widgets + * @type object + */ + widgets : null, + + /** + * Object container for storing module instances. + * + * @property modules + * @type object + */ + modules: null, + + /** + * Object container for initialization options + * + * @property options + * @type {object} object literal + */ + options: + { + /** + * Sets the current site for this component. + * + * @property siteId + * @type string + */ + siteId: null, + + /** + * The containerId in the current site + * + * @property containerId + * @type string + */ + containerId: null, + + /** + * Decides if the create button should be enabled or not + * + * @property allowCreate + * @type string + */ + allowCreate: null, + + /** + * Decides if the Configure button should be enabled or not + * + * @property allowConfigure + * @type string + */ + allowConfigure: null + }, + + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + * @return {Alfresco.DocumentList} returns 'this' for method chaining + */ + setOptions: function BlogToolbar_setOptions(obj) + { + this.options = YAHOO.lang.merge(this.options, obj); + return this; + }, + + /** + * Set messages for this component. + * + * @method setMessages + * @param obj {object} Object literal specifying a set of messages + * @return {Alfresco.DocListTree} returns 'this' for method chaining + */ + setMessages: function BlogToolbar_setMessages(obj) + { + Alfresco.util.addMessages(obj, this.name); + return this; + }, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function BlogToolbar_onComponentsLoaded() + { + Event.onContentReady(this.id, this.onReady, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Initialises components, including YUI widgets. + * + * @method onReady + */ + onReady: function BlogToolbar_onReady() + { + // Create button + this.widgets.createButton = Alfresco.util.createYUIButton(this, "create-button", this.onNewBlogClick, + { + disabled: !this.options.allowCreate + }); + + // Rss Feed button + this.widgets.rssFeedButton = Alfresco.util.createYUIButton(this, "rssFeed-button", null, + { + type: "link" + }); + + if (this.widgets.rssFeedButton !== null) + { + // initialize rss feed link + this._generateRSSFeedUrl(); + } + }, + + /** + * Dispatches the browser to the create blog post + * + * @method onNewBlogClick + * @param e {object} DomEvent + */ + onNewBlogClick: function BlogToolbar_onNewBlogClick(e) + { + window.location.href = Alfresco.constants.URL_PAGECONTEXT + "site/" + this.options.siteId + "/blog-postedit"; + }, + + /** + * Generates the HTML mark-up for the RSS feed link + * + * @method _generateRSSFeedUrl + * @private + */ + _generateRSSFeedUrl: function BlogToolbar__generateRSSFeedUrl() + { + var url = YAHOO.lang.substitute(Alfresco.constants.URL_FEEDSERVICECONTEXT + "components/blog/rss?site={site}", + { + site: this.options.siteId + }); + this.widgets.rssFeedButton.set("href", url); + }, + + /** + * Action handler for the configure blog button + */ + onConfigureBlog: function BlogToolbar_onConfigureBlog(e, p_obj) + { + // load the module if not yet done + if (!this.modules.configblog) + { + this.modules.configblog = new Alfresco.module.ConfigBlog(this.id + "-configblog"); + } + + this.modules.configblog.setOptions( + { + siteId: this.options.siteId, + containerId: this.options.containerId + }); + + this.modules.configblog.showDialog(); + + Event.preventDefault(e); + }, + + /** + * Deactivate All Controls event handler + * + * @method onDeactivateAllControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateAllControls: function BlogToolbar_onDeactivateAllControls(layer, args) + { + var index, widget, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.widgets) + { + if (this.widgets.hasOwnProperty(index)) + { + fnDisable(this.widgets[index]); + } + } + } + }; + +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/calendar/calendar-view-agenda.js b/share/src/main/webapp/components/calendar/calendar-view-agenda.js new file mode 100644 index 0000000000..8a14ac8f4e --- /dev/null +++ b/share/src/main/webapp/components/calendar/calendar-view-agenda.js @@ -0,0 +1,640 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * CalendarAgendaView base component. + * + * @namespace Alfresco + * @class Alfresco.CalendarAgendaView + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Selector = YAHOO.util.Selector, + fromISO8601 = Alfresco.util.fromISO8601, + toISO8601 = Alfresco.util.toISO8601, + formatDate = Alfresco.util.formatDate, + DateMath = YAHOO.widget.DateMath; + +YAHOO.lang.augmentObject(Alfresco.CalendarView.prototype, { + + /** + * INIT + */ + + /** + * Triggered after events have loaded - bind necessary Agenda specific events. + */ + initAgendaEvents: function CalendarAgendaView_initAgendaEvents() + { + var navEls = Dom.getElementsByClassName("agendaNav"); + // Unhide the nav, now it is usable + Dom.removeClass(navEls, "hidden"); + Event.addListener(navEls, "click", this.bind(this.onLoadEvents)); + }, + + /** + * CELL RENDERERS + */ + + /** + * Called by the DataTable to render the 'start' cell, which contains the event time and icon.. + * + * @method renderCellStart + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + * + */ + renderCellStart : function CalendarAgendaView_renderCellStart(elCell, oRecord, oColumn, oData) + { + var data = oRecord.getData(), + html = "", + start = formatDate(data.startAt.iso8601, this.msg("date-format.shortTime")), + end = formatDate(data.endAt.iso8601, this.msg("date-format.shortTime")); + + // build up cell content + if (data.isAllDay) + { + html = this.msg("label.all-day") + } else + { + var startDate = new Date(data.from.split('T')[0]), + endDate = new Date(data.to.split('T')[0]), + displayDate = new Date(data.renderDate); + if (Alfresco.CalendarHelper.isSameDay(startDate, displayDate) && (startDate < endDate)) + { + endDate.setHours(23,59,59,999); + end = formatDate(endDate.toISOString(), this.msg("date-format.shortTime")); + } else + if (Alfresco.CalendarHelper.isSameDay(endDate, displayDate) && (startDate < endDate)) + { + startDate.setHours(0,0,1,1); + start = formatDate(startDate.toISOString(), this.msg("date-format.shortTime")); + } + html = start + " - " + end + } + // write to DOM + elCell.innerHTML = html; + }, + + /** + * Called by the DataTable to render the 'start' cell, which contains the event name (what) and link to more info/edit box. + * + * @method renderCellName + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + * + */ + renderCellName : function CalendarAgendaView_renderCellName(elCell, oRecord, oColumn, oData) + { + var data = oRecord.getData(), + rel = this.getRel(data), + html = ""; + + // build up cell content + html = '' + data.name + ''; + + // write to DOM + elCell.innerHTML = html; + }, + + /** + * Called by the DataTable to render the 'description' cell, which contains the event description (notes). + * + * @method renderCellDescription + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + * + */ + renderCellDescription : function CalendarAgendaView_renderCellDescription(elCell, oRecord, oColumn, oData) + { + var data = oRecord.getData(), + html = this.truncate(data); //run truncation + + // write to DOM + elCell.innerHTML = html; + }, + + /** + * Called by the DataTable to render the 'location' cell, which contains the event location (where) and icon. + * + * @method renderCellLocation + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + * + */ + renderCellLocation : function CalendarAgendaView_renderCellLocation(elCell, oRecord, oColumn, oData) + { + var data = oRecord.getData(), + html = ""; + + // build up cell content + html = ''+ data.where + '' + if (data.where === "") + { + Dom.addClass(elCell, "empty"); + } + // write to DOM + elCell.innerHTML = html; + }, + + /** + * Called by the DataTable to render the 'actions' cell, which contains the action links. + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + * + */ + renderCellActions : function CalendarAgendaView_renderCellActions(elCell, oRecord, oColumn, oData) + { + var data = oRecord.getData(), + html = "", + actions = [], + rel = this.getRel(data), + template = '{label}', + write = false, + isEdit = false, + isDelete = false, + me = this; + + // build up cell content + write = this.options.permitToCreateEvents; + isEdit = data.permissions.isEdit; + isDelete = data.permissions.isDelete; + + // NOTE: DOM order (Delete, Edit, Info) is reverse of display order (Info, Edit, Delete), due to right float. + if (write && !data.isoutlook) { + // Delete + if (isDelete) { + actions.push(YAHOO.lang.substitute(template, + { + type:"deleteAction", + label: me.msg("agenda.action.delete.label"), + tooltip: me.msg("agenda.action.delete.tooltip") + })); + } + + // Edit + if (isEdit) { + actions.push(YAHOO.lang.substitute(template, + { + type:"editAction", + label: me.msg("agenda.action.edit.label"), + tooltip: me.msg("agenda.action.edit.tooltip") + })); + } + } + + // Info + actions.push(YAHOO.lang.substitute(template, + { + type:"infoAction summary", + label: me.msg("agenda.action.info.label"), + tooltip: me.msg("agenda.action.info.tooltip") + })); + + html = actions.join(" "); + + // write to DOM + elCell.innerHTML = html; + }, + + /** + * Render events to DOM + * + * Called by getEvents. Runs every time an event has been modified. + * Delegates actual rendering to other functions. (e.g. renderDay & DataTable cell renderers) + * + * @method addEvents + * @param {Object} events - processed array of view relevant events from getEvents() + */ + renderEvents : function CalendarAgendaView_renderEvents(events) + { + // using this.bind for inline function calls to ensure access to parent object. + var numEvents = 0, // number of events for this view (dates already validated server side), + grandParentEl = this.getCalendarContainer(), // this contains all the DataTables + data = {}, // alias + tag = this.options.tag || null, // which (if any) tag is selected? + sortedEvents = {}, //temporary array used for comparing the new events with and existing events + modifiedDates = [], // this array contains updates days which will be used by the renderer. + linkStart = '', // used in template below to wrap link text + linkEnd = '', // start/close tags seperated from template for i18n flexibility + noEventsId = this.options.id + "-noEvent", + noEventsNoEditTemplate ='
    '+ + '

    {noevents}

    '+ + '
    ', + noEventsEditTemplate = '
    '+ + '

    {noevents}

    '+ + '{link}'+ + '
    '; + + // set up Data + this.widgets.Data = this.widgets.Data || {}; // check object instantiation + data = this.widgets.Data; // alias the data + + // check events arg was supplied (if it was, update memory), else read from memory + if (events) + { + // if it was passed in, filter it for multiday events + events = this.filterMultiday(events); + this.events = events; + } else + { + events = this.events; + } + + // filter events for selected tag: + events = this.tagFilter(events); + + numEvents = events.length; + + // Set View Title. + this.updateTitle(); + + // sort the events from the passed parameter into the data object according to date (in big endian ISO format YYYY-MM-DD) + for (var i=0;i 0) + { + // Remove the default text/noEvent text if it exists (both live in same div) + var noEventsEl = Dom.get(noEventsId); + if(noEventsEl) + { + noEventsEl.parentNode.removeChild(noEventsEl); + } + + // loop through each of the sorted events and write to Data store & render if new data has been supplied. + for (date in sortedEvents) + { + var render = false; + + // check to see if data exists (and whether it was rendered) and if it does (and has), only update it if it has changed. + // Some dates have data but aren't rendered initially (e.g. multiday events that start before the view starts), but may + // need rendering this time. Rendering necessitates the dataTable object - hence the check. + if (data[date] && data[date].dataTable) + { + // Converting Objects to JSON strings to enable comparison + if (YAHOO.lang.JSON.stringify(data[date].events) != YAHOO.lang.JSON.stringify(sortedEvents[date].events)) + { + render = true; // day exists, but event data modified + data[date].events = sortedEvents[date].events; + } + } + else // day is new. + { + render = true; + data[date] = sortedEvents[date] + } + + // if it is new or has changed, update data and render. + if (render) + { + this.renderDay(date); // each day has a different data table to make it easier to render the day header & manage additional day/removing empty days. + } + } + } else + { + // Display noEvent text + var noEventsTemplate = (this.options.permitToCreateEvents)? noEventsEditTemplate : noEventsNoEditTemplate; // show different help text if the user can't create an event. + + grandParentEl.innerHTML = YAHOO.lang.substitute(noEventsTemplate, + { + link: this.msg("agenda.add-events", linkStart, linkEnd), + noevents: this.msg("agenda.no-events") + }); + } + + // These two functions need to be called the first time this is run only. + if (!this.eventsInitialised) + { + this.initAgendaEvents(); + this.eventsInitialised = true; + } + + // TODO: This should be triggered by the eventDataLoaded event. + // Has a DOM element been informing the user that data is being loaded? + if (this.loadingLabelBuffer && this.loadingEl) + { + this.loadingEl.innerHTML = this.loadingLabelBuffer; + this.loadingEl = this.loadingLabelBuffer = null; + } + }, + + /** + * Renders the DataTable and Title for each day. + * + * @method renderDay + * @param {String} date - the ISO Formatted (yyyy-mm-dd) string for the date to render + */ + renderDay: function CalendarAgendaView_renderDay(date) + { + var data = this.widgets.Data[date], + schema = + [ + {key: "start", formatter:this.bind(this.renderCellStart)}, // both the start and end times. + {key: "name", formatter:this.bind(this.renderCellName)}, + {key: "description", formatter:this.bind(this.renderCellDescription)}, + {key: "where", formatter:this.bind(this.renderCellLocation)}, + {key: "actions", formatter:this.bind(this.renderCellActions)} + ], + grandParentEl = this.getCalendarContainer(); + + // Check we have the data to work with, and that the date to be rendered is valid for the view. + // The events have already been filtered to ensure that a portion of them is valid for the current view, + // but some multiday events may extend (or begin) out side of the view parameters, so this filtering needs to occur again. + if (!data || !this.isValidDateForView(fromISO8601(date))) + { + return false; + } + + for (var i=0; i dateTime) + { + insertBeforeThisEl = kids[i]; + break; + } + } + + if (insertBeforeThisEl) + { + Dom.insertBefore(titleEl, insertBeforeThisEl); + Dom.insertBefore(parentEl, insertBeforeThisEl); + } + else // looks like this is the last date we've currently got, so stick it on the end. + { + grandParentEl.appendChild(titleEl); + grandParentEl.appendChild(parentEl); + } + + // instantiate the dataTable. + data.dataTable = new YAHOO.widget.DataTable(parentEl, schema, data.dataSource, + { + onEventHighlightRow: function(event, target){Dom.addClass(target, "yui-dt-highlight")} + }); + + // Note Event bindings occur automagically, so action links do not need to be bound to anything. + + //Add row hover effects. + data.dataTable.subscribe("rowMouseoverEvent", data.dataTable.onEventHighlightRow); + data.dataTable.subscribe("rowMouseoutEvent", data.dataTable.onEventUnhighlightRow); + }, + + /** + * Removes All HTML elements associated with a given date + * @param {string} date + */ + removeDay: function CalendarAgendaView(date) + { + var elements = Selector.query("[id$="+date+"]"); + for (i in elements) { + var rmEl = Dom.get(elements[i]); + rmEl.parentNode.removeChild(rmEl); + } + }, + + /** + * ACTION HANDLERS + */ + + /** + * Triggered when the previous/next links are clicked. + */ + onLoadEvents: function CalendarAgendaView_onLoadEvents(e) + { + // prevent multiple load events happening simultaneously. + if (!this.loadingEl) + { + var step = 30, // number of days to add each time + dayInMS = 24 * 60 * 60 * 1000; // milliseconds in one day + + // Let the user know we're loading new content + var target = Event.getTarget(e); + this.loadingLabelBuffer = target.innerHTML; // store for later so we can revert + this.loadingEl = target; + this.loadingEl.innerHTML = this.msg("message.loading"); + + // Update the start or end date as appropriate + if (YAHOO.util.Selector.test(this.loadingEl, 'a.previousEvents')) + { + this.options.startDate = new Date(this.options.startDate.getTime() - (step * dayInMS)); + } + else if (YAHOO.util.Selector.test(this.loadingEl, 'a.nextEvents')) + { + this.options.endDate = new Date(this.options.endDate.getTime() + (step * dayInMS)); + } + + // get a fresh list of events from server, this calls the render functions on success + this.getEvents(); + } + Event.preventDefault(e); + }, + + + /** + * UTIL METHODS + */ + + /** + * Returns the root element for the calendar DataTables & titles. + * + * @method getCalendarContainer + * @return {HTML Element} + */ + getCalendarContainer: function CalendarAgendaView_getCalendarContainer() + { + return Dom.get(this.options.id); + }, + + /** + * Updates the Agenda title with the new date and tags (if any) + * + * @method updateTitle + */ + updateTitle: function CalendarView_updateTitle() + { + + var startDate = this.options.startDate, + endDate = this.options.endDate, + startDateString = "", + withYear = this.msg("date-format.longDate"), + noYear = this.msg("date-format.longDateNoYear"), + endDateString = formatDate(endDate, withYear); + + // convert date objects to strings + // only show year in start date if it differs to end date. + if (startDate.getFullYear() === endDate.getFullYear()) + { + startDateString = formatDate(startDate, noYear); + } else + { + startDateString = formatDate(startDate, withYear) + } + + this.titleEl.innerHTML = this.msg("title.agenda", startDateString, endDateString); + + // add tag info to title, + tagTitleEl = Dom.getElementsByClassName('tagged', "span", this.titleEl); + if (tagTitleEl.length > 1) + { + this.titleEl.removeChild(tagTitleEl[0]); + } + if (this.options.tag) + { + tagTitleEl = Alfresco.CalendarHelper.renderTemplate('taggedTitle', + { + taggedWith: this.msg('label.tagged-with'), + tag: this.options.tag + }); + this.titleEl.appendChild(tagTitleEl); + } + }, + + /** + * Truncates the text after a set number of characters and adds the show more link + * + * Note: Breaks on previous word boundary and will not increase the visible string length + * - if the show more string added to the truncated text is greater than the original + * string, the original is used. + * + * @method truncate + * @param {string} text - the text to truncate + * @param {int} length - the number of characters to show before truncating. + * + */ + truncate : function CalendarAgendaView_truncate(event, length) + { + var showMore = this.msg("agenda.truncate.show-more"), + ellipsis = this.msg("agenda.truncate.ellipsis"), + truncateTo = parseInt(length) || parseInt(this.options.truncateLength) || 100, // use default and ensure int. + text = $html(event.description), + result = text, + resultReplace = ""; + + // don't truncate unless we need to. + // if we do truncate, we want to ensure that the overhead (showMore text and ellipsis) doesn't result in an actual + // increase in the string's length. + if (text.length > truncateTo + showMore.length + ellipsis.length) + { + result = text.substring(0,truncateTo); + // truncate to previous one. + resultReplace = result.replace(/\w+$/, ''); + // but ensure we don't remove the whole string if there are no word boundaries. + result = (resultReplace.length > 0)? resultReplace : result ; + + // add in ellipsis and the html wrapped show more string + result = '' + result + ellipsis + " " + '' + showMore + '.' + } + return result; + }, + + expandDescription: function CalendarAgendaView_expandDescription(el) + { + var event = this.getEventObj(el), + containerEl = el.parentNode, + text = $html(event.description), + showLess = '' + this.msg("agenda.truncate.show-less") + ''; + + containerEl.innerHTML = text + " " + showLess; + }, + + collapseDescription: function CalendarAgendaView_collapseDescription(el) + { + var event = this.getEventObj(el), + containerEl = el.parentNode + + containerEl.innerHTML = this.truncate(event); + } +}, true); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/calendar/calendar-view-fullCalendar.js b/share/src/main/webapp/components/calendar/calendar-view-fullCalendar.js new file mode 100644 index 0000000000..ddbadb6c63 --- /dev/null +++ b/share/src/main/webapp/components/calendar/calendar-view-fullCalendar.js @@ -0,0 +1,500 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * CalendarFullCalendar base component. + * + * @namespace Alfresco + * @class Alfresco.CalendarView + */ +( function() +{ + + /** + * Alfresco Slingshot aliases + */ + // Uses jQuery and FullCalendar functions for FullCalendar functions and YUI ones for Alfresco data + var fc = $.fullCalendar, + formatDate = fc.formatDate, + parseISO8601 = fc.parseISO8601, + addDays = fc.addDays, + applyAll = fc.applyAll, + $html = Alfresco.util.encodeHTML, + fromISO8601 = Alfresco.util.fromISO8601, + toISO8601 = Alfresco.util.toISO8601, + dateFormat = Alfresco.thirdparty.dateFormat, + History = YAHOO.util.History, + $jCalendar = ""; // Cache the jQuery selector. Populated in renderEvents after DOM has rendered. + document.jquery = $; // MNT-13070: IE replaces jQuery object with latest initialized + + YAHOO.lang.augmentObject(Alfresco.CalendarView.prototype, + { + + /** + * Converts Alfresco view type into FullCalendar view type + * + * Note: FullCalendar refers to views that include time slots as agenda views, Alfresco terminology for these views is "day" and "week" + * The FullCalendar agenda views are not to be confused with the Alfresco agenda view which is an event overview page. + * + * @method getFullCalendarViewType + * @param AlfrescoViewType {String} [day|week|month] + */ + getFullCalendarViewType: function CalendarFullCalendar_getFullCalendarViewType(AlfrescoViewType) + { + switch(AlfrescoViewType){ + case Alfresco.CalendarView.VIEWTYPE_DAY: + return this.options.fcOpts.dayView + case Alfresco.CalendarView.VIEWTYPE_WEEK: + return this.options.fcOpts.weekView + case Alfresco.CalendarView.VIEWTYPE_MONTH: + return this.options.fcOpts.monthView + } + }, + + /** + * Loads the jQuery Plugin Full Calendar, fetches the events and renders them. + * Called by CalendarView_render() + * + * @method renderEvents + */ + renderEvents: function CalendarFullCalendar_renderEvents() + { + // YUI History + var bookmarkedView = History.getBookmarkedState("view") || this.options.view, + bookmarkedDate = History.getBookmarkedState("date") || dateFormat(this.options.startDate, "yyyy-mm-dd"); + + // Register History Manager callbacks + History.register("view", bookmarkedView, function CalendarFullCalendar_onHistoryManagerViewNavigate(view) + { + this.onViewNav(view); + }, {}, this); + History.register("date", bookmarkedDate, function CalendarFullCalendar_onHistoryManagerDateNavigate(date) + { + this.onDateNav(date); + }, {}, this); + + // Initialize the browser history management library + try + { + History.initialize("yui-history-field", "yui-history-iframe"); + } + catch(e) + { + /* + * The only exception that gets thrown here is when the browser is + * not supported (Opera, or not A-grade) + */ + Alfresco.logger.error("Alfresco.CalendarView: Couldn't initialize HistoryManager.", e); + } + + // Prevent unnecessary DOM lookups and cache the jQuery object for the calendar container. + $jCalendar = document.jquery('#' + this.options.id); + + // invoke Full Calendar + this.initFullCalendar(); + + // Edit dialogue events + YAHOO.Bubbling.on("eventEdited", this.onEventEdited, this); + YAHOO.Bubbling.on("eventSaved", this.onEventSaved, this); + YAHOO.Bubbling.on("eventDeleted", this.onEventDeleted, this); + + // Tag events + YAHOO.Bubbling.on("tagSelected", this.onTagSelected, this); + + // Nav events. + YAHOO.Bubbling.on("todayNav", function CalendarFullCalendar_onTodayNav() + { + $jCalendar.fullCalendar("today"); + }, this); + + YAHOO.Bubbling.on("nextNav", function CalendarFullCalendar_onNextNav() + { + $jCalendar.fullCalendar("next"); + }, this); + + YAHOO.Bubbling.on("prevNav", function CalendarFullCalendar_onPrevNav() + { + $jCalendar.fullCalendar("prev"); + }, this); + + YAHOO.Bubbling.on("toggleWorkHours", this.onToggleWorkHours, this); + + YAHOO.Bubbling.on("viewChanged", function CalendarFullCalendar_onViewChanged(e, args) + { + // gets the view changed to from the index of the button in the event object of the passed in parameters + var view = Alfresco.util.ComponentManager.findFirst("Alfresco.CalendarToolbar").enabledViews[args[1].activeView]; + if (view === Alfresco.CalendarView.VIEWTYPE_AGENDA) + { + this.onViewChanged.apply(this, arguments); + } + else + { + History.navigate("view", view); + } + }, this); + + // Mini Calendar + YAHOO.Bubbling.on("dateChanged", function CalendarFullCalendar_onDateChanged(e, args) + { + History.navigate("date", dateFormat(args[1].date, "yyyy-mm-dd")); + }, this); + + // Override Resizer callback function (while keeping the old one): + var oldResizerFn = Alfresco.widget.Resizer.prototype.onResizeNotification + Alfresco.widget.Resizer.prototype.onResizeNotification = function CalendarFullCalendar_onResizeNotification() + { + oldResizerFn(); + $jCalendar.fullCalendar("render"); + } + + }, + + /** + * Invokes the jQuery FullCalendar initialisation and rendering + * + * @method initFullCalendar + * + */ + initFullCalendar: function CalendarFullCalendar_initFullCalendar() + { + var date = fromISO8601(History.getBookmarkedState("date")) || this.options.startDate, + view = History.getBookmarkedState("view") || this.options.view; + + // jQuery resets context so 'this' becomes the HTML element passed in, but we need a handle to the CalendarFullCalendar component: + var me = this; + + // Standard jQuery wrapper maintained for clarity + $(document).ready(function() + { + if (me.options.permitToCreateEvents) + { + $jCalendar.addClass("calendar-editable"); + } + // FullCalendar init, inc. inline function declarations. + $jCalendar.fullCalendar( + { + // Take view & date from settings: + defaultView: me.getFullCalendarViewType(view), + date: date.getDate(), + month: date.getMonth(), + year: date.getFullYear(), + + // Config: + weekMode: me.options.fcOpts.weekMode, + weekends: me.options.fcOpts.weekends, + allDaySlot: me.options.fcOpts.allDaySlot, + firstDay: parseInt(Alfresco.util.message("calendar.widget_config.start_weekday")), + firstHour: me.options.fcOpts.firstHour, + minTime: (me.options.fcOpts.showWorkHours) ? me.options.fcOpts.minTimeWorkHours : me.options.fcOpts.minTimeToggle, + maxTime: (me.options.fcOpts.showWorkHours) ? me.options.fcOpts.maxTimeWorkHours : me.options.fcOpts.maxTimeToggle, + aspectRatio: me.options.fcOpts.aspectRatio, + slotMinutes: me.options.fcOpts.slotMinutes, + disableDragging: me.options.fcOpts.disableDragging, + disableResizing: me.options.fcOpts.disableResizing, + + // This is treated as a maximum height for day and week views - if it's set too small, you'll get an internal scrollbar. + height: 2000, + + // Why would you want to ignoreTimezones? + ignoreTimezone: false, + + // Internationalisation: + monthNames: me.msg("months.long").split(","), + monthNamesShort: me.msg("months.short").split(","), + dayNames: me.msg("days.long").split(","), + dayNamesShort: me.msg("days.medium").split(","), + buttonText: + { + month: me.msg("label.month"), + week: me.msg("label.week"), + day: me.msg("label.day") + }, + allDayText: me.msg("label.all-day"), + timeFormat: + { + month: me.msg("fullCalendar.timeFormat.month"), + week: me.msg("fullCalendar.timeFormat.week"), + day: me.msg("fullCalendar.timeFormat.day") + }, + columnFormat: + { + month: me.msg("fullCalendar.columnFormat.month"), + week: me.msg("fullCalendar.columnFormat.week"), + day: me.msg("fullCalendar.columnFormat.day") + }, + titleFormat: + { + month: me.msg("fullCalendar.titleFormat.month"), + week: me.msg("fullCalendar.titleFormat.week"), + day: me.msg("fullCalendar.titleFormat.day") + }, + axisFormat: me.msg("fullCalendar.axisFormat"), + + // Remove header navigation and just show the title. Nav is handled by toolbar.js to remain consistent across views. + header: + { + left: 'title', + center: '', + right: '' + }, + + // Has the user got permissions to create events? + editable: me.options.permitToCreateEvents, + + // Define the event source as the Alfresco Calendar Event API + eventSources: + [ + { + url: Alfresco.constants.PROXY_URI + "calendar/events/" + me.options.siteId + "/user?repeating=all", + startParam: "from", + startParamFn: function(rangeStart) + { + return toISO8601(rangeStart).split('T')[0]; + }, + endParam: "to", + endParamFn: function(rangeEnd) + { + return toISO8601(rangeEnd).split('T')[0]; + }, + success: function(data) + { + var parsedEvents = []; + if (data.events) { + var filteredEvents = me.tagFilter(data.events); + + // trigger Mini Calendar's rendering: + YAHOO.Bubbling.fire("eventDataLoad", filteredEvents); + + $.each(filteredEvents, function(i, event) + { + // Map Alfresco Event object to FullCalendar Event Object (ensuring that existing properties are still present) + // Parse user input strings for XSS + parsedEvents.push(YAHOO.lang.augmentObject( + { + id: $html(event.name), + start: parseISO8601(event.startAt.iso8601), + end: parseISO8601(event.endAt.iso8601), + allDay: (event.allday === "true") ? true : false, + location: $html(event.where), + uri: "/calendar/event/" + me.options.siteId + "/" + $html(event.name) + "?date=" + event.startAt.iso8601.split("T")[0], + description: $html(event.description), + title: event.title, + where: $html(event.where), + url: Alfresco.constants.URL_CONTEXT + event.url + }, event)); + }); + } + + return parsedEvents; + }, + error: function(data) + { + if (data.status == 404) + { + Alfresco.util.PopupManager.displayPrompt( + { + title: me.msg("calendar.site-does-not-exist-title", me.options.siteId), + text: me.msg("calendar.site-does-not-exist"), + buttons: [ + { + text: me.msg("button.ok"), + handler: function () + { + this.destroy(); + }, + isDefault: true + }] + }); + } + } + } + ], + + // Trigger the Event Info Dialogue + eventClick: function CalendarFullCalendar_onEventClick(calEvent, jsEvent, view) + { + me.showDialog(jsEvent, calEvent); + return false; + }, + + // Update the event following drag and drop. + eventDrop: function CalendarFullCalendar_onEventDrop(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view) + { + me.updateEvent(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view); + }, + + eventResize: function CalendarFullCalendar_onEventResize(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view) + { + me.updateEvent(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view); + }, + + viewDisplay: function CalendarFullCalendar_onViewDisplay(view) + { + // reset height for month view to ensure use of aspect ratio so we get square boxes. + if (view.name === me.options.fcOpts.monthView) + { + $jCalendar.fullCalendar("option", "height", null); + } + }, + + dayClick: function CalendarFullCalendar_onDayClick(date, allDay, jsEvent, view) + { + // Only show add dialogue if user has create events permission. + if (me.options.permitToCreateEvents) + { + me.showAddDialog(date); + } + }, + + /** + * Triggered by FullCalendar after an event has been updated (e.g. by drag and drop) + * + * @method afterEventChange + * @param eventID - the unique ID of the event that has moved + */ + afterEventChange: function CalendarFullCalendar_afterEventChange(eventID) + { + // the filter returns an array for when multiple (e.g. repeated) events share an ID) + var events = $jCalendar.fullCalendar("clientEvents", eventID); + + // keep the Alfresco properties in sync w/ the event object ones. + for (var i=0; i < events.length; i++) + { + var event = events[i], + startISO8601 = toISO8601(event.start), + endISO8601 = toISO8601(event.end) || startISO8601; + event.startAt = + { + iso8601: startISO8601 + } + event.endAt = + { + iso8601: endISO8601 + } + } + } + + }); + + }); + }, + + /** + * Retrieves the events and refreshes the calendar + * + * @method getEvents + */ + getEvents: function CalendarFullCalendar_getEvents() + { + $jCalendar.fullCalendar("refetchEvents"); + + this.refreshTags(); + }, + + /** + * Updates an event following a drag interaction + * + * @method updateEvent + */ + updateEvent: function CalendarFullCalendar_updateEvent(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view) + { + // Map FullCalendar event object back to an Alfresco Event object: + // For now this is in the same format as the EventInfo form submits - except it uses the ISO8601 datetime strings to help with timezone support. + var end = event.end || event.start, // event.end is null for all day events that only span a single day + alfEvent = + { + desc: event.description, + docfolder: event.docfolder || "", + startAt: + { + iso8601: toISO8601(event.start) + }, + endAt: + { + iso8601: toISO8601(end) + }, + page: Alfresco.constants.PAGEID, + site: Alfresco.constants.SITE, + tags: (event.tags) ? event.tags.join() : [], + what: event.title, + where: event.where + }; + // allday property needs to be missing for it to be false. + if (event.allDay) + { + alfEvent.allday = "true"; + } + + Alfresco.util.Ajax.jsonPut( + { + url: Alfresco.constants.PROXY_URI + "calendar/event/" + Alfresco.constants.SITE + "/" + event.name, + dataObj: alfEvent, + failureCallback: + { + fn: revertFunc + } + }); + }, + + /** + * Triggered when the date gets changed + * this is usually when the mini calendar is clicked on + * + * @method onDateNav + * @param date {Date Object|ISO8601 compatible string} + */ + onDateNav: function CalendarFullCalendar_onDateNav(date) + { + if (typeof(date) === "string") + { + date = fromISO8601(date); + } + $jCalendar.fullCalendar("gotoDate", date); + }, + + /** + * Triggered when the view changes + * this is usually when the toolbar has been clicked on + * + * @method onViewNav + * @param view {string} ["day"|"week"|"month"] + */ + onViewNav: function CalendarFullCalendar_onViewNav(view) + { + $jCalendar.fullCalendar("changeView", this.getFullCalendarViewType(view)); + }, + + /** + * + * Toggles the display of Work Hours or not + * + * @method onToggleWorkHours + */ + onToggleWorkHours: function CalendarFullCalendar_onToggleWorkHours() + { + // Remove the Calendar + $jCalendar.fullCalendar("destroy"); + // Reverse the state of the showWorkHours option. + this.options.fcOpts.showWorkHours = (this.options.fcOpts.showWorkHours) ? false : true ; + // Rerender the Calendar + this.initFullCalendar(); + } + }, + true); +})(); diff --git a/share/src/main/webapp/components/calendar/calendar-view.js b/share/src/main/webapp/components/calendar/calendar-view.js new file mode 100644 index 0000000000..32b4eff486 --- /dev/null +++ b/share/src/main/webapp/components/calendar/calendar-view.js @@ -0,0 +1,1246 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * CalendarView base component. + * Provides common functionality for all Calendar views. + * + * @namespace Alfresco + * @class Alfresco.CalendarView + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Sel = YAHOO.util.Selector, + $html = Alfresco.util.encodeHTML, + fromISO8601 = Alfresco.util.fromISO8601, + toISO8601 = Alfresco.util.toISO8601, + dateFormat = Alfresco.thirdparty.dateFormat; + + /** + * CalendarView constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.CalendarView} The new CalendarView instance + * @constructor + */ + Alfresco.CalendarView = function CalendarView_constructor(htmlId) + { + this.id = htmlId; + Alfresco.CalendarView.superclass.constructor.call(this, "Alfresco.CalendarView", htmlId, ["calendar", "button", "resize", "datasource", "datatable", "history"]); + + return this; + }; + + YAHOO.extend(Alfresco.CalendarView, Alfresco.component.Base, + { + /** + * Object container for storing YUI widget instances. + * + * @property widgets + * @type object + */ + widgets: {}, + + /** + * Object container for storing module instances. + * + * @property modules + * @type object + */ + modules: {}, + + /** + * Object container for storing YUI pop dialog instances. + * + * @property popups + * @type object + */ + popups: {}, + + /** + * Object container for storing event handlers + * + * @property handlers + * @type object + */ + handlers: {}, + + /** + * Object container for data + * + * @property data + * @type object + */ + data: {}, + + /** + * View type - must be overridden by subclasses + * + * @property calendarView + * @type string + */ + calendarView: '', + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + * @return {object} returns 'this' for method chaining + */ + setOptions: function Base_setOptions(obj) + { + this.options = YAHOO.lang.merge(this.options, obj); + if (typeof this.options.startDate == "string") + { + this.options.startDate = Alfresco.util.fromISO8601(this.options.startDate); + } + if (typeof this.options.endDate == "string") + { + this.options.endDate = Alfresco.util.fromISO8601(this.options.endDate); + } + if (typeof this.options.titleDate == "string") + { + this.options.titleDate = Alfresco.util.fromISO8601(this.options.titleDate); + } + return this; + }, + + /** + * Initialises event handling All events are handled through event + * delegation via the onInteractionEvent handler + * + * @method initEvents + */ + initEvents: function CalendarView_initEvents() + { + Event.on(this.id, 'click', this.onInteractionEvent, this, true); + Event.on(this.id, 'dblclick', this.onInteractionEvent, this, true); + + YAHOO.Bubbling.on("eventEdited", this.onEventEdited, this); + YAHOO.Bubbling.on("eventEditedAfter", this.onAfterEventEdited, this); + YAHOO.Bubbling.on("eventSaved", this.onEventSaved, this); + YAHOO.Bubbling.on("eventSavedAfter", this.onAfterEventSaved, this); + YAHOO.Bubbling.on("eventDeleted", this.onEventDeleted, this); + YAHOO.Bubbling.on("eventDeletedAfter", this.onAfterEventDeleted, this); + + YAHOO.Bubbling.on("tagSelected", this.onTagSelected, this); + YAHOO.Bubbling.on("viewChanged", this.onViewChanged, this); + YAHOO.Bubbling.on("dateChanged", this.onCalSelect, this); + if (this.calendarView == Alfresco.CalendarView.VIEWTYPE_DAY | this.calendarView == Alfresco.CalendarView.VIEWTYPE_WEEK) + { + YAHOO.Bubbling.on("eventResized", this.onEventResized, this); + } + }, + + /** + * Retrieves events from server + * + * @method getEvents + * + */ + getEvents : function CalendarView_getEvents() + { + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "calendar/events/" + this.options.siteId + "/user", + dataObj: + { + from: toISO8601(this.options.startDate).split('T')[0], + to: toISO8601(this.options.endDate).split('T')[0], + repeating: "all" + }, + //filter out non relevant events for current view + successCallback: + { + fn: this.onEventsLoaded, + scope: this + }, + failureMessage: Alfresco.util.message("load.fail", "Alfresco.CalendarView") + }); + }, + + /** + * Renders view + * + * @method render + * + */ + render: function CalendarView_render() + { + if (this.calendarView === Alfresco.CalendarView.VIEWTYPE_AGENDA ) { + + // initialise DOM Event registration + this.initEvents(); + // Load events. Rest of init is handled by a call back from the event loading. + this.getEvents(dateFormat(this.options.startDate, 'yyyy-mm-dd')); + } else { + // FullCalendar handles event loading and callbacks, so call the function that triggers that. + this.renderEvents(); + } + }, + + displayMessage: function CalendarView_displayMessage(message, name) + { + Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message(message, name || this.name) + }); + }, + + /** + *Returns the Event Data object associated with the element passed in. + * + * @param data {object} either the HTML node of the event or the event data + */ + + getEventObj: function CalendarView_getEventObj(data) + { + // If we've got the HTML node, we can get the event object using parseRel + if (typeof(data.innerHTML) === "string") + { + return this.parseRel(data); + } + // Otherwise, assume it's the event object, so just send that back. + else + { + return data; + } + }, + + /** + * builds up the relationship string to store the event reference in the DOM. + * + * @param {Object} data + */ + getRel: function CalendarView_getRel(data) + { + //Just stores the ISO yyyy-mm-dd string and will use href from link to identify data + return data.from.split("T")[0]; + }, + + /** + * + * retrieves the event object based on the data in the rel string. + * + * @param {HTML element} element with a relationship to an event. + */ + parseRel: function CalendarView_parseRel(element) + { + var data = "", + date = "", + result = false; + + // If the passed in is a datatable container, it won't have a rel, so get the first a tag in it. + if (Sel.test(element, 'div.yui-dt-liner')) + { + element = Dom.getElementsByClassName("summary", "a", element.parentNode.parentNode)[0] + } + + // check the element has a rel tag supplied. + if (element.rel !== "" && element.rel !== undefined) + { + date = element.rel; + data = this.widgets.Data[date].events; + for (var i = 0; i < data.length; i++) + { + if (data[i].uri === "/calendar/event/" + element.href.split("/calendar/event/")[1]) // element.href needs hostname and port stripping. + { + result = data[i]; + } + } + } + return result; + }, + + /** + * Shows/hides the early hours of day (midnight till 7am) + * + * @method toggleEarlyTableRows + * + */ + toggleEarlyTableRows: function CalendarView_toggleEarlyTableRows() + { + + var triggerEl = YAHOO.util.Dom.get('collapseTrigger'); + this.earlyEls = YAHOO.util.Dom.getElementsByClassName('early', 'tr', triggerEl.parentNode); + var displayStyle = (YAHOO.env.ua.ie) ? 'block' : 'table-row'; + for (var i = 0; i < this.earlyEls.length; i++) + { + var el = this.earlyEls[i]; + YAHOO.util.Dom.setStyle(el, 'display', (this.isShowingEarlyRows) ? 'none' : displayStyle); + } + this.isShowingEarlyRows = !this.isShowingEarlyRows; + }, + + /** + * Handler for event retrieval when events are loaded from the server + * Used by agenda, day and week (i.e. not month view) + * + * @method onEventsLoaded + */ + onEventsLoaded: function CalendarView_onEventsLoaded(o) + { + var data = YAHOO.lang.JSON.parse(o.serverResponse.responseText).events; + var siteEvents = []; + var events = []; + var comparisonFn = null; + var viewStartDate = this.options.startDate; + var viewEndDate = this.options.endDate; + var site = this.options.siteId; + + // Trigger Mini Calendar's rendering before filtering the events + YAHOO.Bubbling.fire("eventDataLoad",data); + + for (var i = 0; i < data.length; i++) + { + var ev = data[i]; + + // Escape User Input Strings to avoid XSS + ev.title = $html(ev.title); + ev.where = $html(ev.where); + ev.description = $html(ev.description); + + if (ev.site == site) + { + siteEvents.push(ev); + } + } + data = siteEvents; + comparisonFn = function() + { + + return function(eventDate, endDate) + { + // Event can: Start before and finish after display dates + var eventSurroundsView = (eventDate <= viewStartDate && viewEndDate <= endDate); + // or: start during + var startDuring = (eventDate >= viewStartDate && eventDate < viewEndDate); + // or: finish during + var endDuring = (endDate >= viewStartDate && endDate < viewEndDate); + return (eventSurroundsView || startDuring || endDuring); + }; + }.apply(this); + + for (var i = 0; i < data.length; i++) + { + // TODO: Make this format consistent across calendar views and API. + var ev = data[i]; + var date = fromISO8601(ev.startAt.iso8601); + var endDate = fromISO8601(ev.endAt.iso8601); + if (comparisonFn(date, endDate)) + { + var datum = {}; + + // Legacy properties (to be factored out or rolled up over time) + datum.desc = ev.description || ''; + datum.name = ev.title; + datum.isoutlook = ev.isoutlook == "true" ? "isoutlook" : ""; + datum.contEl = 'div'; + // MNT-9021 fix. Parsing date with toISO8601 in order to convert the date to one with a local timezone offset + datum.from = toISO8601(date); + datum.to = toISO8601(endDate); + datum.uri = '/calendar/event/' + this.options.siteId + '/' + ev.name + '?date=' + ev.startAt.iso8601; + datum.hidden = ''; + datum.allday = ''; + datum.isMultiDay = (!Alfresco.CalendarHelper.isSameDay(date, endDate)); + datum.isAllDay = (ev.allday == "true") ? true : false; + datum.el = 'div'; + + datum.key = datum.from.split(":")[0] + ':00'; + + // Merge in standard event properties - allowing legacy values to override standards + datum = YAHOO.lang.merge(ev, datum) + + events.push(datum); + } + } + + this.renderEvents(events); + }, + + /** + * Adds events to view + * + * @method add + * @param {String} id Identifier of event + * @param {Object} o Event Object + * @return {Boolean} Status of add operation + */ + add: function CalendarView_add(id, o) + { + this.add(id, o); + }, + + /** + * Removes events from view + * + * @method remove + * @param {String} id Identifier of event + * @return {Boolean} Status of removal operation + */ + remove: function CalendarView_remove(id) + { + this.remove(id); + }, + + /** + * Updates specified event + * + * @method update + * + * @param {String} id Identifier of event + * @param {Object} o Event Object + * @return {Boolean} Status of update operation + */ + update: function CalendarView_update(id, o) + { + this.data.update(o); + }, + + /** + * Filters the array of events for multiday events + * For each Multiday event, it: + * - Creates an event for every day in the period. + * - If not All day: + * - the first day's display end time is set to: 00:00 + * - the middle days are marked as multiday + * - the last day's start time is: 00:00 + * - Adds cloned tag. + * + * This is only used by the Agenda view + * + * @method filterMultiday + * @param events {Array} Array of event objects + */ + filterMultiday: function CalendarView_filterMultiday(events) + { + var DateMath = YAHOO.widget.DateMath; + + for (var i=0, numEvents=events.length;i= this.options.startDate.getTime()) && (date.getTime() < this.options.endDate.getTime()); + }, + + // HANDLERS + + /** + * Updates date field in dialog when date in selected in popup calendar + * + * @method onDateSelected + * @param e {object} Event object + * @param args {object} Event argument object + */ + onDateSelected: function CalendarView_onDateSelected(e, args) + { + if (this.currPopUpCalContext) + { + // ugly + for (var i = 1; i < args[0][0].length; i++) + { + args[0][0][i] = Alfresco.CalendarHelper.padZeros(args[0][0][i]); + } + Dom.get(this.currPopUpCalContext).value = args[0][0].join('-'); + // add one hour as default + if (this.currPopUpCalContext === 'dtend') + { + Dom.get(this.currPopUpCalContext + 'time').value = YAHOO.widget.DateMath.add(fromISO8601(Dom.get('dtstart').value + 'T' + Dom.get('dtstarttime').value), YAHOO.widget.DateMath.HOUR, 1).format(dateFormat.masks.isoTime); + + } + } + }, + // HANDLERS + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function CalendarView_onReady() + { + this.calendarView = this.options.view; + this.startDate = (YAHOO.lang.isString(this.options.startDate)) ? fromISO8601(this.options.startDate) : this.options.startDate; + this.container = Dom.get(this.id); + this.containerRegion = Dom.getRegion(this.container); + this.isShowingEarlyRows = true; + this.titleEl = Dom.get('calTitle'); + + // Patch YAHOO.widget.DateMath to support Hours, mins and seconds + if (!YAHOO.widget.DateMath.HOUR) + { + YAHOO.widget.DateMath.add = function() + { + var origAddFunc = YAHOO.widget.DateMath.add; + YAHOO.widget.DateMath.HOUR = 'H'; + YAHOO.widget.DateMath.SECOND = 'S'; + YAHOO.widget.DateMath.MINUTE = 'Mn'; + return function(date, field, amount) + { + + switch (field) + { + case YAHOO.widget.DateMath.MONTH: + case YAHOO.widget.DateMath.DAY: + case YAHOO.widget.DateMath.YEAR: + case YAHOO.widget.DateMath.WEEK: + return origAddFunc.apply(YAHOO.widget.DateMath, arguments); + break; + case YAHOO.widget.DateMath.HOUR: + var newHour = date.getHours() + amount; + var day = 0; + if (newHour < 0) + { + while (newHour < 0) + { + newHour += 24; + day -= 1; + + } + // newHour = 23; + } + if (newHour > 24) + { + while (newHour > 24) + { + newHour -= 24; + day += 1; + + } + } + YAHOO.widget.DateMath._addDays(date, day); + date.setHours(newHour); + break; + case YAHOO.widget.DateMath.MINUTE: + date.setMinutes(date.getMinutes() + amount); + break; + case YAHOO.widget.DateMath.SECOND: + date.setMinutes(date.getSeconds() + amount); + + } + return date; + }; + }(); + } + + this.render(); + }, + + /** + * Event Delegation handler. Delegates to correct handlers using CSS selectors + * + * @method onInteractionEvent + * @param o{object} DomEvent + * @param args {array} event arguments + */ + onInteractionEvent: function CalendarView_onInteractionEvent(o, args) + { + // TODO: refactor this if/else list into an event trigger with listeners. + + var elTarget, e; + // if loop added for DataTable event trigger which passes event and target as single object in 1st param + if (typeof(o.event) === "object" && typeof(o.target) === "object") + { + e = o.event; + elTarget = o.target; + } + else //old style (non DataTable trigger), event as first object, target not included. + { + e = o; + elTarget = Event.getTarget(e); + } + + // Check for event type. + // repeated if loops are now a series of else if loops to prevent all selectors being attempted. Matching of multiple selectors is not recommended. + if (e.type === 'mouseover') + { + if (Sel.test(elTarget, 'div.' + this.dragGroup)) + { + Dom.addClass(elTarget, 'highlight'); + if (this.options.permitToCreateEvents) + { + if (!Dom.hasClass(elTarget, 'disabled')) + { + elTarget.appendChild(this.addButton); + } + } + } + } + else if (e.type === 'mouseout') + { + if (Sel.test(elTarget, 'div.' + this.dragGroup)) + { + Dom.addClass(elTarget, 'highlight'); + } + } + else if (e.type === 'click') + { + // Show or hide wee hours? + if (Sel.test(elTarget, 'a#collapseTriggerLink')) + { + this.toggleEarlyTableRows(); + Event.preventDefault(e); + } + // are we adding a new event? + else if (Sel.test(elTarget, 'button#addEventButton') || Sel.test(elTarget.offsetParent, 'button#addEventButton') || Sel.test(elTarget, 'a.addEvent')) + { + this.showAddDialog(); + Event.preventDefault(e); + } + // a.summary = a click on the event title. Therefore into Event Info mode. + else if (Sel.test(elTarget, 'a.summary') || Sel.test(elTarget, 'div.yui-dt-liner') ) + { + this.showDialog(e, elTarget); + } + // Someone clicked the 'show more events in Month View' link. + else if (Sel.test(elTarget, 'li.moreEvents a')) + { + this.onShowMore(e, args, elTarget); + } + //Agenda View show more + else if (Sel.test(elTarget, 'a.showMore')) + { + this.expandDescription(elTarget); + Event.preventDefault(e); + } + else if (Sel.test(elTarget, 'a.showLess')) + { + this.collapseDescription(elTarget); + Event.preventDefault(e); + } + // Delete this event link in Agenda DataTable + else if (Sel.test(elTarget, "a.deleteAction")) + { + this.deleteDialog(e, elTarget); + } + // Edit event link in Agenda DataTable. + else if (Sel.test(elTarget, "a.editAction")) + { + this.editDialog(e, elTarget); + } + } + }, + + /** + * Handler for when today button is clicked + * + * @method onTodayNav + * + */ + onTodayNav: function CalendarView_onTodayNav() + { + var today = new Date(); + var params = Alfresco.util.getQueryStringParameters(); + params.date = today.getFullYear() + '-' + Alfresco.CalendarHelper.padZeros((~ ~ (1 * (today.getMonth()))) + 1) + '-' + Alfresco.CalendarHelper.padZeros(today.getDate()); + window.location = window.location.href.split('?')[0] + Alfresco.util.toQueryString(params); + }, + + /** + * Handler for when calendar view is changed (agenda button is clicked) + * + * @method onViewChanged + * + */ + onViewChanged: function CalendarView_onViewChanged() + { + + var params = Alfresco.util.getQueryStringParameters(), + dateBookmark = this.getDateFromUrl(); + params.view = Alfresco.util.ComponentManager.findFirst("Alfresco.CalendarToolbar").enabledViews[arguments[1][1].activeView]; + if (dateBookmark !== "") + { + params.date = dateBookmark; + } + // Remove both current parameters and current bookmarks + var navURL = window.location.href.split('?')[0].split('#')[0], + paramsString = Alfresco.util.toQueryString(params); + + if (params.view === "agenda") + { + // Add params as query string for Agenda + navURL += paramsString; + + } else + { + // Otherwise add as a URL Fragment for CalendarView + navURL += paramsString.replace("?", "#"); + } + + // Send the user there: + window.location = navURL; + }, + + /** + * Handler for when date mini calendar is selected + * + * @method onNav + * @param e {Object} + * @param args {Object} + * + */ + onCalSelect: function CalendarView_onCalSelect(e, args) + { + var date = args[1].date; + var params = Alfresco.util.getQueryStringParameters(); + params.date = dateFormat(date, 'yyyy-mm-dd'); + var newLoc = window.location.href.split('?')[0] + Alfresco.util.toQueryString(params); + window.location = newLoc; + }, + /** + * Handler for when a tag is selected + * + * @method onTagSelected + * + */ + onTagSelected: function CalendarView_onTagSelected(e, args) + { + var tagName = arguments[1][1].tagname; + + // all tags + if (tagName == Alfresco.util.message('label.all-tags', 'Alfresco.TagComponent')) + { + this.options.tag = null; + } + else + { + this.options.tag = tagName; + } + this.updateTitle(); + this.getEvents(); + }, + + /** + * Handler for eventEdited event. Updates event in DOM in response to updated event data. + * + * @method onEventEdited + * + * @param e {object} event object + * @param o {object} new event data + */ + onEventEdited : function CalendarView_onEventEdited(e,o) + { + this.getEvents() + YAHOO.Bubbling.fire("eventEditedAfter"); + }, + + /** + * Handler for when event is saved + * + * @method onEventSaved + * + * @param o {object} response object + */ + onEventSaved : function CalendarView_onEventSaved(o) + { + this.getEvents(); + var result = YAHOO.lang.JSON.parse(o.serverResponse.responseText); + if (!result.error) + { + YAHOO.Bubbling.fire("eventSavedAfter"); + this.displayMessage('message.created.success',this.name); + } + else + { + this.onEventSaveFailed(); + } + }, + + /** + * Triggered when an event can't be created + * + * @method: onEventSaveFailed + */ + onEventSaveFailed: function CalendarView_onEventSaveFailed() + { + Alfresco.util.PopupManager.displayMessage( + { + text: Alfresco.util.message('message.created.failure', this.name) + }); + }, + + /** + * Handler for when an event is deleted + * + * @method onEventDeleted + */ + onEventDeleted : function CalendarView_onEventDeleted() + { + this.getEvents(); + YAHOO.Bubbling.fire("eventDeletedAfter"); + this.msg('message.deleted.success', this.name); + }, + + onAfterEventSaved: function CalendarView_onAfterEventSaved(e, args) + { + // Refresh the tag component + this.refreshTags(); + + // Confirm success to the user + this.displayMessage('message.created.success', this.name); + }, + + onAfterEventDeleted: function CalendarView_onAfterEventDeleted(e, args) + { + this.refreshTags(); + this.displayMessage('message.deleted.success', this.name); + }, + + onAfterEventEdited: function CalendarView_onAfterEventDeleted(e, args) + { + // Refresh the tag component + this.refreshTags(); + }, + + refreshTags: function CalendarView_refreshTags() + { + YAHOO.lang.later(500, YAHOO.Bubbling, 'fire', 'tagRefresh'); + }, + + /** + * Stub function - to be overridden on the view level (e.g. by CalendarAgendaView_updateTitle) + */ + updateTitle: function CalendarView_updateTitle() + { + return; + }, + + /** + * + * takes the event list and removes any items that aren't tagged with the currently selected tag. + * + * @method tagFilter + * + * @param {Object} events + */ + tagFilter: function CalendarView_tagFilter(events) + { + var filteredEvents = [], + tagName = this.options.tag; + + // early exit if there is no selected tagName + if (!tagName) + { + return events; + } else + { + for (var i = 0, l = events.length; i < l; i++) + { + var eventTags = events[i].tags + // TODO: Remove this check once we have a consistent event object + if (typeof(eventTags) === "string") + { + eventTags = eventTags.split(","); + } + if (Alfresco.util.arrayContains(eventTags, tagName)) + { + filteredEvents.push(events[i]); + } + } + return filteredEvents; + } + } + }); + Alfresco.CalendarView.VIEWTYPE_WEEK = 'week'; + Alfresco.CalendarView.VIEWTYPE_MONTH = 'month'; + Alfresco.CalendarView.VIEWTYPE_DAY = 'day'; + Alfresco.CalendarView.VIEWTYPE_AGENDA = 'agenda'; +})(); + +/** + * Alfresco.CalendarHelper. Helper object consisting of useful helper methods + * + * @constructor + */ +Alfresco.CalendarHelper = (function Alfresco_CalendarHelper() +{ + var Dom = YAHOO.util.Dom, + fromISO8601 = Alfresco.util.fromISO8601, + toISO8601 = Alfresco.util.toISO8601, + dateFormat = Alfresco.thirdparty.dateFormat; + var templates = []; + + return { + + /** + * Pads specified value with zeros if value is less than 10 + * + * @method padZeros + * + * @param value {Object} value to pad + * @return {String} padded value + */ + padZeros: function Alfresco_CalendarHelper_padZeros(value) + { + return (value < 10) ? '0' + value : value; + }, + + /** + * Converts a date string in the input field to a date object. + * + * @method getDateFromField + * + * @param field {DOM Object} input element + * @return d {Date} + */ + getDateFromField: function Alfresco_CalendarHelper_getDateFromField(field) + { + var dateString = Dom.getAttribute(field, "rel"); + var d = (dateString !== "") ? fromISO8601(dateString) : new Date(); + return d; + }, + + /** + * Formats the date + * + * @param date {Date} + * @param field {DOM Object} DOM object of element + */ + writeDateToField: function Alfresco_CalendarHelper_writeDateToField(date, field) + { + var formattedDate = dateFormat(date, Alfresco.util.message("date-format.fullDate")); + field.value = formattedDate; + Dom.setAttribute(field, "rel", toISO8601(date)); + }, + + /** + * Add an template using specified name as a reference + */ + addTemplate: function Alfresco_CalendarHelper_addTemplate(name, template) + { + templates[name] = template; + }, + + /** + * Retreives specified template + * + * @method getTemplate + * @param name {string} Name of template to retrieve + * @return {string} template + */ + getTemplate: function Alfresco_CalendarHelper_getTemplate(name) + { + return templates[name]; + }, + + /** + * renders template as a DOM HTML element. Element is *not* added to document + * + * @param name Name of template to render + * @param data Data to render template against + * @return HTMLElement Newly created div + */ + renderTemplate: function Alfresco_CalendarHelper_renderTemplate(name, data) + { + var el = document.createElement('div'); + if (templates[name] && el) + { + var el = YAHOO.lang.isString(el) ? Dom.get(el) : el; + var template = templates[name]; + var div = document.createElement('div'); + if (data) + { + template = YAHOO.lang.substitute(template, data); + } + + div.innerHTML = template; + el.appendChild(div.firstChild); + + return el.lastChild; + } + }, + + /** + * Checks to see if the two dates are the same + * + * @method isSameDay + * @param {Date|string} dateOne (either JS Date Object or ISO8601 date string) + * @param {Date|string} dateTwo + * + * @return {Boolean} flag indicating if the dates are the same or not + */ + isSameDay: function Alfresco_CalendarHelper_isSameDay(dateOne, dateTwo) + { + if (typeof(dateOne) === "string") + { + dateOne = fromISO8601(dateOne); + } + if (typeof(dateTwo) === "string") + { + dateTwo = fromISO8601(dateTwo); + } + return (dateOne.getDate() === dateTwo.getDate() && dateOne.getMonth() === dateTwo.getMonth() && dateOne.getFullYear() === dateTwo.getFullYear()); + }, + + /** + * @method isAllDay + * @param {Object} eventData event data object + * + * @return {Boolean} flag indicating whether event is a timed event or not + */ + isAllDay: function Alfresco_CalendarHelper_isTimedEvent(eventData) + { + var isSameDay = this.isSameDay(eventData.from, eventData.to); + var isMidnight = (eventData.end == eventData.start && "00:00") ? true : false; + return (!isSameDay && isMidnight); + } + }; +})(); + +Alfresco.CalendarHelper.addTemplate('vevent', '<{el} class="vevent {allday} {hidden} {isoutlook} theme-bg-color-1 theme-border-2"> ' + +'<{contEl}>' + +'

    ' + +'{start} - ' + +'{end}' + +'

    ' + +'

    {desc}

    ' + +'{name}' + +'{where}' + +'{duration}' + +'{tags}' + +'' + +''); +Alfresco.CalendarHelper.addTemplate('agendaDay', '

    {date}

    '); + +Alfresco.CalendarHelper.addTemplate('agendaDayItem', '
  • {start} - {end}' + +'{name}
  • '); +Alfresco.CalendarHelper.addTemplate('createEventButton', ''); +Alfresco.CalendarHelper.addTemplate('taggedTitle', "{taggedWith} '{tag}'"); \ No newline at end of file diff --git a/share/src/main/webapp/components/calendar/calendar.css b/share/src/main/webapp/components/calendar/calendar.css new file mode 100644 index 0000000000..4f668ea60a --- /dev/null +++ b/share/src/main/webapp/components/calendar/calendar.css @@ -0,0 +1,1599 @@ +tr.odd td +{ + background-color: #f8f8f8; +} + +tr.even td +{ + background-color: #FFFFFF; +} + +#week-view +{ + border: 1px solid #c0c0c0; +} + +#week-view th +{ + height: 2em; + text-align: center; + vertical-align: middle; +} + +#week-view th a +{ + text-decoration: none; +} + +#week-view .label +{ + text-align: center; +} + +.yui-content +{ + background: #FFFFFF; +} + +#month-view +{ + width: 100%; + border-collapse: collapse; +} + +#month-view th +{ + text-align: center; + border-bottom: 1px solid #CCCCCC; + font-weight: normal; + color: #000000; +} + +#month-view td +{ + height: 80px; + width: 14%; + vertical-align: top; + margin: 0; + padding: 0; + border: 1px solid #CCCCCC; +} + +div.dayLabel +{ + text-align: right; + padding-right: 5px; + margin: 0; +} + +div.dayLabel a +{ + text-decoration: none; + color: #000000; +} + +div.cal-event-entry +{ + font-size: 11px; + padding-left: 5px; + color: #000000; +} + +#monthLabel +{ + font-weight: bold; + text-align: center; +} + +div.boxOutline +{ + margin: 0; + overflow: hidden; +} + +.today +{ + background-color: #FFFFCC; +} + +#calendarcontainer +{ + padding: 10px; + width: 182px; +} + +#calendarmenu +{ + border: 1px solid #bfbfbf; + position: absolute; + overflow: visible; +} + +#calendarendpicker a, +#calendarpicker a +{ + background: url(images/calendar-16.png) center center no-repeat; + text-align: left; + text-indent: -10em; + overflow: hidden; + *margin-left: 10em; /* For IE */ + *padding: 0 0.7em; /* For IE */ + *vertical-align: top; /* For IE */ + white-space: nowrap; +} + +#year-field +{ + width: 3em; +} + +#datefields +{ + border: solid 1px #666; + padding: .5em; +} + +#calendarpicker, +#calendarendpicker +{ + vertical-align: middle; +} + +#calendar-view +{ + visibility: hidden; +} + +#calendar-view .date-title +{ + color: #000; + font-size: 146.5%; + padding: 0.3em 0 0.7em 0.5em; + text-align: center; +} + +#calTitle +{ + font-size: 146%; + color: #333; + padding: 0.5em; + border-bottom: 1px solid #D4D4D4; + margin-left: -10px; +} + +#calTitle span.tagged +{ + color: #808080; + margin-left: 0.5em; + font-size: 90%; +} + +/* Styles calendar dashlet */ + +.yui-skin-sam .yui-calendar td.event +{ + background-color: #999; +} + +.yui-skin-default .yui-calendar td.calcell.today a +{ + background-color: #FFFFCC; + color: #000000; +} + +.yui-skin-default .yui-calendar td.calcell.today +{ + background-color: #FFFFFF; +} + + +.yui-skin-default .yui-calendar td.calcell.today.calcellhover +{ + background-color: #000000; +} + +.yui-skin-default .yui-calendar td.calcell.today.calcellhover a +{ + color: #000000; +} + +/* Day view styles */ + +div.timeLabel +{ + border-bottom: 2px solid #c0c0c0; + height: 30px; + padding-right: 1px; + padding-top: 4px; + text-align: center; + width: 56px; +} + +div.timeLabel.last +{ + border-bottom: none; +} + +#timeLabels +{ + float: left; + width: 57px; + border-right: 1px solid black; +} + +div.dayEventsView +{ + float: left; + font-size: 11px; + text-align: left; + position: relative; + height: 100px; +} + +#dayContainer +{ + float: left; + width: 100%; + border: 1px solid #a0a0a0; +} + +div.dayEvent +{ + position: absolute; + font-size: 11px; + text-align: left; + border: 1px solid black; + width: 80px; +} + +/* Styling for the agenda view */ + +div.dayheader +{ + width: auto; + border-bottom: 1px solid #000; + font-size: 16px; + font-weight: bold; + margin-bottom: 5px; +} + +table.daytable +{ + width: auto; +} + +table.daytable td.timelabel +{ + width: 7%; +} + +table.daytable td +{ + font-size: 12px; + color: #333; + text-align: left; + padding: 2px; +} + +div.no-agenda-items +{ + padding: 1em; +} + +div.agenda-item +{ + margin-top: 20px; + margin-bottom: 20px; +} + +div.agenda-item div.cal-event-entry +{ + color: #333; + font-size: 108%; + padding: 2px; + text-align: left; +} + +div.cal-event-entry a +{ + text-decoration: none; +} + +div.calendar-currentMonth +{ + margin-right: 15px; + text-align: center; + clear: left; +} + +.calendar-bar .align-right +{ + text-align: right; +} + +.agendaview thead { + display: none; +} + +/* Override default textfield width for start and end time textfields */ + +span.eventTime input[type="text"] +{ + width: 5em; +} + +.eventDeselect +{ + opacity: 0.4; + filter: alpha(opacity=40); +} + +span.eventTime label +{ + padding-right: 4px; +} + +/* The top spacing should go on the table in order to prevent a large whitespace while content is loading. */ + +#calendar +{ + margin: 0 10px; + padding: 5px; +} + +#calendar table +{ + margin: 0.5em 0 1em; +} + +.alfresco-share .yui-calcontainer +{ + background-color: #fff; + border: none; +} + +.alfresco-share .yui-navset .yui-content, +.alfresco-share .yui-navset .yui-navset-top .yui-content +{ + border-color: #a0a0a0; +} + +/** + Margin and padding on body element + can introduce errors in determining + element position and are not recommended; + we turn them off as a foundation for YUI + CSS treatments. +*/ + +body +{ + margin: 0; + padding: 0; +} + +.vcalendar table +{ + width: 100%; + border: 1px solid #EAEAEA; + border-width: 1px 0; +} + +.calendar.monthview td +{ + height: 10.1em; +/* width:9.1em; */ + border: 1px solid #EAEAEA; + border-width: 1px 1px 0 0; + padding: 0; + z-index: 0; + max-width: 10em; + overflow: hidden; +} + +.calendar.monthview div.day, +.monthview div.day +{ + height: 100%; + width: 100%; +} + +.calendar td.disabled +{ + background-color: #F3F7FB; +} + +.calendar td.disabled div +{ + background-color: #F3F7FB; + color: #999; + height: 100%; +} + +.calendar td a.dayLabel +{ + text-align: right; +/* float:right; */ + display: block; + margin: 0.7em 0.7em 0 0; + font-size: 85%; + color: #000; + text-decoration: none; + clear: both; +} + +.calendar.weekview thead th, +.calendar.monthview thead th +{ + height: 2.5em; + border: 1px solid #EAEAEA; + border-width: 0 1px 0 0; + text-align: center; + font-weight: normal; + font-size: 100%; +} + +.calendar.weekview thead th +{ + border-width: 0 0 1px 1px; +} + +.calendar.weekview tbody th +{ + border-width: 0 0 1px 0; + vertical-align: top; +/* height:4.5em; */ +} + +.calendar.weekview th +{ + background: none #fff; + border: 1px solid #EAEAEA; +} + +ul.dayEvents +{ +/* margin: 0 0.6em; */ + padding: 0; + font-size: 85%; + clear: both; + z-index: 1; +} + +ul.dayEvents li +{ + padding-left: 0.5em; + list-style-type: disc; + list-style-position: inside; + cursor: pointer; + font-size: 107%; +/* border:1px solid black; */ +} + +ul.dayEvents li,ul.dayEvents li a +{ + text-decoration: none; +} + +ul.dayEvents li a:hover +{ + text-decoration: underline; +} + +ul.dayEvents li.moreEvents +{ + list-style: none; + font-weight: bold; + text-align: center; + bottom: 3px; + *margin-top: 0; + font-size: 107%; +} + +.monthview ul.dayEvents li.vevent div +{ + display: inline; +} + +.calendar.monthview ul +{ + *zoom: 1; +} + +.calendar.monthview ul.showing +{ + z-index: 1; + position: absolute; + height: auto; + min-height: 10em; + border-bottom: 1px solid #EAEAEA; + width: 100%; + top: 13px; + *top: 22px; +} + +.calendar.monthview ul.showing li.moreEvents +{ + margin-top: 1em; +} + +.calendar.monthview td .highlight +{ + position: relative; +} + +.calendar.monthview td .highlight #addEventButton +{ + bottom: 10px; + right: 10px; + position: absolute; + text-indent: 0; + border: none; + width: 3em; + background: none; + cursor: pointer; +} + +/* TODO add background images for chevrons; no need to be in markup */ + +div.allday +{ + margin: 0; + padding: 0; + color: #fff; + clear: both; + float: left; + width: 100%; + font-size: 85%; +} + +div.allday, div.allday a +{ + text-decoration: none; +} + +.dayview table +{ + width: 100%; + border: 1px solid #EAEAEA; + border-width: 2px 0; + border-collapse: separate; +} + +.dayview th +{ + vertical-align: top; + width: 4em; + color: #999; + font-weight: normal; + border-right: 1px solid #EAEAEA; +} + +.dayview th, +.dayview td +{ + border-bottom: 2px solid #EAEAEA; +} + +.dayview tr.alldayRow +{ + height: 4em; +} + +div.fifteen +{ + height: 1.06em; +} + +div.thirty +{ + height: 2.12em; +} + +div.hour1 +{ + height: 4.6em; +} + +div.hour2 +{ + height: 9.2em; +} + +div.hour3 +{ + height: 13.8em; +} + +div.hour4 +{ + height: 18.4em; +} + +.dayview .day .hourSegment:last-child +{ + border: none; +} + +.vcalendar.dayview .vevent .dtstart +{ + margin: 0.5em 0.25em; + display: inline-block; +} + +.vcalendar.dayview .vevent a.summary +{ + margin-left: 0.4em; +} + +.vcalendar.dayview .vevent .dtstart, +.vcalendar.dayview .vevent .dtend +{ + position: static; + text-indent: 0; + font-weight: bold; +} + +.dayview div.vevent +{ + background: none; + border-width: 0 0 0 10px; + border-style: solid; + width: 99.3%; +} + +.vcalendar div.weekview div.vevent p.dates +{ + position: static; + text-indent: 0; + padding-top: 0; + display: inline; + font-weight: bold; + *vertical-align: middle; +} + +.dayview div.vevent div +{ + height: 100%; +} + +.dayview div.vevent div.yui-resize-handle +{ + height: 5px; + border: 0; + -moz-opacity: 0; + filter: alpha(opacity=0); + opacity: 0; +} + +.dayview div.vevent div.yui-resize-handle-b-active, +.weekview div.vevent.allday div, +.dayview div.vevent.allday div +{ + -moz-opacity: 1.0; + filter: alpha(opacity=100); + opacity: 1.0; +} + +/* Week view specific css */ + +.calendar.weekview tbody tr.alldayRow th +{ + vertical-align: middle; +} + +.calendar.weekview tbody tr.alldayRow td div.target +{ + height: 8em; +/* width:100%; */ +} + +.current +{ + background-color: #FFFEDF; +} + +.calendar.weekview tbody td +{ + width: auto; + min-width: 105px; +/* width:inherit; */ + padding: 0; +/* text-align:right; */ + font-size: 100%; + color: #999; + margin-right: 0.5em; +} + +.calendar.weekview tbody tr.alldayRow th +{ + height: 1em; + width: 105px; +/* position:relative; */ +} + +.dayview h2, +.weekview h2 +{ + font-weight: normal; + font-size: 100%; + margin: 2px auto; + text-align: center; + width: 100%; +} + +tr.alldayRow +{ + height: 8em; +} + +tr.alldayRow td +{ + height: auto; + margin: 4em 0; + vertical-align: top; + border-bottom: 1px solid #EAEAEA; +} + +.calendar.weekview tbody tr.alldayRow td +{ + border-left: 1px dashed #EAEAEA; + height: 52px; +} + +.calendar.weekview tbody tr.alldayRow td.last +{ + border-right: none; +} + +.vcalendar .vevent .location, +.vcalendar .vevent .description, +.vcalendar .vevent .duration, +.vcalendar .vevent .category, +.vcalendar .multipleAllDay .location, +.vcalendar .multipleAllDay .description, +.vcalendar .multipleAllDay .duration, +.vcalendar .multipleAllDay .category, +.vcalendar div.vevent .offset, +#addEventButton, +ul.dayEvents li.hidden, +.agendaview .vevent .location, +.agendaview .vevent .duration, +.agendaview .vevent .description, +.agendaview .vevent .category, +div.vevent.allday p.dates +{ + position: absolute; + text-indent: -999em; + line-height: 0px; +} + +.vcalendar div.vevent.allday p.dates, +.vcalendar div.multipleAllDay.allday p.dates, +.monthview .vevent p.dates +{ + display: none; +} + +.vcalendar .vevent .dtstart, +.vcalendar .vevent .dtend, +.vcalendar .vevent .location, +.vcalendar .vevent .description, +.vcalendar .vevent .summary, +.vcalendar .vevent p +{ + text-decoration: none; +} + +div.allday a, +div.multipleAllDay, +div.vevent * +{ + color: #FFF; + font-size: 100%; +} + +div.multipleAllDay, +div.vevent +{ +/* text-align: right; */ +/* position:absolute; */ +/* right:0; */ + color: #fff; + width: inherit; + font-size: 85%; + cursor: pointer; +} + +.weekview div.vevent, .dayview div.vevent div +{ + -moz-opacity: .80; + filter: alpha(opacity=80); + opacity: .80; +} + +.weekview .alldayRow div.vevent +{ + -moz-opacity: 1.0; + filter: alpha(opacity=100); + opacity: 1.0; +} + +.weekview div.vevent div +{ + margin: 0 0.5em; + padding: 0.5em 0; +} + +.weekview .vevent +{ +/* padding:0.5em 0 0.5em 0.5em; */ + position: absolute; +/* background-color:#2B6EB5;*/ + overflow: hidden; +} + +/* for week view and non allday events */ + +.weekview .vevent .dtstart, +.weekview .vevent .dtend, +.weekview .vevent p +{ + text-indent: 0; + position: static; + font-weight: bold; +} + +.ie .hourSegment +{ + height: 26px; +} + +.hourSegment +{ + min-height: 50%; + height: 25px; + cursor: pointer; + border-bottom: 1px solid #EAEAEA; +/* position:relative; */ +} + +.hourSegment.last +{ + border: none; +} + +.weekview div.day, +.dayview div.day +{ +/* height:3.5em; */ + border: 1px solid #EAEAEA; + border-width: 0 1px 2px 1px; +} + +.dayview div.day +{ + border-bottom: 0; +} + +div.vevent.allday, +div.multipleAllDay.allday +{ + position: static; + width: 100%; + font-size: 100%; + border-left: 0; +} + +div.multipleAllDay.allday div, +div.vevent.allday div +{ + padding: 5px; +} + +div.allday, +div.multipleAllDay +{ + border: 1px solid white; + border-width: 1px 0 0 0; +} + +div.hourSegment .vevent +{ + position: absolute; + z-index: 3; +} + +.hour +{ + height: 52px; +} + +#ygddfdiv +{ + background-color: #fff; +} + +.weekview .vevent p.dates, +.dayview .vevent p.dates +{ + display: block; + padding: 0; + vertical-align: top; +} + +/* agenda view */ + +.agendaview +{ + border-bottom: 1px solid #D4D4D4; + margin-left: -10px; +} + +.agendaview h1 +{ + border-bottom: 1px solid #D4D4D4; + height: auto; + padding: 0 1em; +} + +.agendaview h2 +{ + border-bottom: 1px solid #D4D4D4; + display: block; + padding: 0.5em 1em 0.1em; + font-size: 100%; + font-weight: bold; + margin: 1em 0 0; +} + +.agendaview h1 +{ + font-weight: normal; + margin: 0; + font-size: 121%; +} + +.agendaview ul +{ + list-style: none; + margin: 1em 0 1em 1.3em; + padding: 0; +} + +div.agendaview ul li +{ + margin-bottom: 0.5em; + background: none; +} + +.agendaview ul a +{ + text-decoration: none; +} + +.agendaview ul a:hover +{ + text-decoration: underline; +} + +.agendaview ul span.dtstart, +.agendaview ul span.dtend +{ + font-weight: bold; +} + +.agendaview ul a.summary +{ + margin-left: 1em; +} + +.agendaview div.allday +{ + width: 7.1em; + margin-right: 0.9em; +} + +.agendaview p.dates +{ + display: inline; +} + +.agendaview .allday p.dates +{ + margin: 0; + padding: 0; + width: 6em; + display: -moz-inline-stack; + display: inline-block; + zoom: 1; + *display: inline; +} + +.agendaview .allday p.dates span +{ + display: none; +} + +/* IE7 doesn't hover unless this rule is applied */ + +.ie .yui-resize .yui-resize-handle +{ + border: 1px solid transparent; +} + +.ie .yui-resize .yui-resize-handle-inner-b +{ + height: 100%; +} + +/* Dialog */ + +#calendarDialog +{ + display: none; +} + +.yui-skin-sam .yui-dialog .ft span.default button +{ + color: #000; +} + +#calPopup_c +{ + position: absolute; + width: 14em; +} + +#calPopup_c table +{ + border: 0; +} + +#calendarDialog legend +{ + font-weight: bold; + margin: 0; + padding: 0; +} + +#calendarDialog fieldset +{ + border: 0; + border-bottom: 1px dashed black; + padding: 0.5em 0; + margin: 0.5em 0; +} + +#calendarDialog fieldset div +{ + margin: 0.5em 0; +} + +#calendarDialog label +{ + float: left; + width: 7em; +} + +#calendarDialog label.time +{ + width: auto; + float: none; +/* margin-right: 0.5em; */ +} + +#calendarDialog #dtstarttime, +#calendarDialog #dtendtime +{ + width: 6em; +} + +#calendarDialog input, +#calendarDialog textarea +{ + width: 80%; +} + +#calendarDialog input.date +{ + width: 60%; +} + +#calendarDialog fieldset div div.inside +{ + margin: 0 0 0 7em; +} + +#calendarDialog fieldset div span +{ + color: #4DA1CF; +} + +.invalid +{ + background-color: #4DA1CF; +} + +/* dialog */ + +.taglibrary .title +{ + clear: left; +} + +.create-event.yui-panel .yui-gd .yui-u +{ + width: 70%; +} + +.create-event.yui-panel .yui-gd .yui-u.first +{ + width: 20%; + text-align: right; +} + +.create-event.yui-panel .yui-gd .wide +{ + width: 95%; + *width: 94%; +} + +.create-event.yui-panel .yui-g h2 +{ + width: 21%; + text-align: right; + font-size: 114%; +} + +#calendarendpicker, +#calendarpicker +{ + background: none; + border: 0; +} + +#calendarendpicker span, +#calendarpicker span +{ + border: 0; +} + +#calendarendpicker a, +#calendarpicker a +{ + background: transparent url(images/calendar-16-2.png) no-repeat scroll 5px 3px; + *background-position: 0 0; +} + +/* Mini calendar stylings */ + +.alfresco-share .yui-calendar .calnavright, +.alfresco-share .yui-calendar .calnavleft +{ + height: auto; + width: 30px; + top: -3px; +} + +.alfresco-share .yui-calendar .calnavright +{ + background: url(images/cal-next-but.png) no-repeat; + *height: 21px; +} + +.alfresco-share .yui-calendar .calnavleft +{ + background: url(images/cal-prev-but.png) no-repeat; + *height: 21px; +} + +.alfresco-share div.calendar-currentMonth .yui-button +{ + background: url(images/toolbar-unchecked-gradient.gif) 0 0; +} + +.alfresco-share div.calendar-currentMonth .yui-button-checked +{ + background: url(images/toolbar-checked-gradient.gif) 0 0; +} + +.alfresco-share div.calendar-currentMonth .yui-link-button a +{ + color: #464646; +} + +.yui-skin-default div.calendar-currentMonth .yui-link-button a +{ + color: #464646; +} + +#collapseTrigger td +{ + padding: 0.5em; + text-align: center; + border-bottom: 1px solid #EAEAEA; +} +tr.early { + /*display:none;*/ +} + +/* Agenda view styles */ + +#divCalendarContent +{ + border-left-width: 0; + margin-left: 223px; /* This gets overridden by Alfresco.widget.resizer, but default here prevents jumping during page load. */ +} + +#divCalendarContent h2.dayTitle +{ + margin-top: 1em; +} + +#divCalendarContent .yui-dt table +{ + border-width: 0; + width: 100%; +} + +.yui-dt-data:focus +{ + outline: none; +} + +#divCalendarContent .yui-dt td +{ + border: none; + vertical-align: top; + border-bottom: 1px solid white; +} + +#divCalendarContent .yui-dt-col-start +{ + width: 16%; +} + +#divCalendarContent .yui-dt-col-name +{ + width: 22%; +} + +#divCalendarContent .yui-dt-col-where +{ + width: 20%; +} + +#divCalendarContent .yui-dt-col-desc +{ + width: 28%; +} + +#divCalendarContent .yui-dt-col-actions +{ + width: 14%; +} + +/* The default body padding prevents the side bar from joining up at the bottom, and default margin at the side. remove them */ + +#bd +{ + padding-bottom: 0; + margin: auto -10px; +} + +#divCalendarContent .yui-dt-col-start div +{ + padding-left: 38px; + background: url("images/calendarEntry.png") no-repeat 15px 8px; +} + +.yui-dt-col-actions a +{ + display: block; + float: left; + width: 20px; + height: 16px; + text-indent: -999em; + background: transparent no-repeat 2px; + margin-right: 5px; + border: 1px solid transparent; +} + +#divCalendarContent .yui-dt-col-where .yui-dt-liner +{ + background: url("images/location.png") no-repeat 15px 8px; + padding-left: 36px; +} + +#divCalendarContent .yui-dt-col-where .yui-dt-liner.empty +{ + background-image: none; +} + +#divCalendarContent .infoAction, +#divCalendarContent .editAction, +#divCalendarContent .deleteAction +{ + float: right; + display: none; +} + +#divCalendarContent .yui-dt-highlighted .infoAction, +#divCalendarContent .yui-dt-highlighted .editAction, +#divCalendarContent .yui-dt-highlighted .deleteAction +{ + display: block; +} + +#divCalendarContent .infoAction +{ + background-image: url("images/eventInfo.png"); +} + +#divCalendarContent .editAction +{ + background-image: url("images/editEvent.png"); +} + +#divCalendarContent .deleteAction +{ + background-image: url("images/deleteEvent.png"); +} + +.previousEvents, +.nextEvents +{ + display: block; + padding: 5px; + margin: 0.5em; +} + +.previousEvents, +.nextEvents +{ + float: right; +} + +.eventCount +{ + font-size: 70%; +} + +.alfresco-share tr.yui-dt-odd, +.alfresco-share tr.yui-dt-even +{ + background-color: transparent; +} + +.alfresco-share .yui-dt-liner +{ + padding: 8px 10px; +} + +a.showMore, +a.showLess +{ + font-size: 90%; +} + +.ical-feed .yui-button +{ + float: right; +} + +.instructionTitle +{ + display: block; + font-family: Helvetica,Arial,sans-serif; + font-size: 167%; + margin-bottom: 20px; + margin-top: 10px; +} + +div.noEvent +{ + margin: 1.5em; + padding-bottom: 1.5em; +} + +div.noEvent span +{ + font-size: 120%; +} + +div.noEvent a.addEvent +{ + background: transparent url("images/addeventsketch.png") top left no-repeat; + padding: 18px 0 18px 56px; +} + +div.filter.tags +{ + padding-left: 15px; +} + +#divCalendarFilters +{ + width: 215px; +} + +/* Turn off default border/bg on mini calendar title */ + +.yui-skin-default .yui-calendar a.calnav, +.yui-skin-default .yui-calendar a.calnav:hover +{ + background: none; + border: none; +} + +/* Popup Cal close button */ + +.yui-skin-default .yui-calcontainer .title +{ + background: none; + padding: 0; +} + +/* Prevent long descriptions from breaking the layout: */ + +#eventInfoPanel +{ + overflow-x: hidden; + word-wrap: break-word; +} + +#eventInfoPanel .descriptionOverflow +{ + max-height: 10em; + overflow-y: auto; + word-wrap: normal; +} + +/* FullCalendar Overrides */ + +div.fullCalendar +{ + color:#333333; +} + +div.fullCalendar .fc-content +{ + left: -9px; +} + +div.fullCalendar .fc-header-title h2 +{ + padding: 6px 0; + font-size:146%; + font-weight: normal; +} + +div.fullCalendar th +{ + padding: 2px 0; +} + +div.fullCalendar .fc-widget-header, +div.fullCalendar .fc-widget-content +{ + border-color: #EAEAEA; +} + +div.fullCalendar a.fc-event:hover +{ + text-decoration: none; + color:inherit; +} + +/* Remove pseudo rounded corners */ +div.fullCalendar .fc-event-allday .fc-event-inner, +div.fullCalendar .fc-view-month .fc-event-multiday .fc-event-inner +{ + border: none; + margin: 0; + line-height:1.8em; +} + +div.fullCalendar .fc-event-time +{ + font-weight: bold; + padding: 0 0 0 5px; +} + +div.fullCalendar .fc-view-month .fc-event-time +{ + padding: 0; +} + +div.fullCalendar .fc-view-month .fc-event-multiday .fc-event-time +{ + padding-left: 5px; +} + +div.fullCalendar .fc-event-title +{ + padding: 0 0 0 5px; +} + +div.fullCalendar .fc-agenda-days .fc-event-title +{ + padding-top:2px; +} + +div.fullCalendar .fc-event-vert .fc-event-bg +{ + opacity: 0.2; +} + +.fc-grid .fc-day-number +{ + cursor: pointer; + float: none; + margin: 0 4px 0 2px; + margin: 0 2px; + padding: 0; + width: auto; +} + +.fc-grid .fc-other-month .fc-day-number { + color: #CACACA; + opacity: 1; +} + +/* Only show the edit icon if the user has the right permissions (denoted by the calendar-editable class) */ +.calendar-editable .fc-grid .fc-widget-content:hover .fc-day-number +{ + background: url("images/add-event-16-2.png") no-repeat right 3px; +} + +.fc-event-vert .ui-resizable-s +{ + text-indent: -9999px; +} + +.fc-content .fc-view-month .fc-event-skin +{ + font-size: 12px; +} + +/* This is needed to place all YUI generated content above the events. */ +.yuimenu +{ + z-index:50 !important; +} + +/* Work hours button */ +.calendar-bar div.flat-button.work-hours +{ + padding: 0; + float:left; + margin-top: 8px; +} + +.calendar-bar .work-hours .yui-button span.first-child +{ + background: url("images/work-hours-off-16.png") no-repeat 5px 5px; +} + +.calendar-bar .work-hours .yui-button-checked span.first-child +{ + background: url("images/work-hours-on-16.png") no-repeat 5px 5px; +} + +div.calendar-bar div.flat-button.work-hours span.yui-checkbox-button-checked +{ + background-color: transparent; +} + +div.calendar-bar div.flat-button.work-hours span.yui-checkbox-button-disabled +{ + opacity: 0.3; +} +/* Remove Bold headings */ +.yui-skin-default .yui-calendar .calheader, +.yui-skin-default .yui-calendar .calweekdaycell, +div.fullCalendar th.fc-widget-header +{ + font-weight: normal; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/calendar/calendar.js b/share/src/main/webapp/components/calendar/calendar.js new file mode 100644 index 0000000000..794e0fd37a --- /dev/null +++ b/share/src/main/webapp/components/calendar/calendar.js @@ -0,0 +1,250 @@ +/** + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/* + *** Alfresco.Calendar + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + Alfresco.Calendar = function(htmlId) + { + this.name = "Alfresco.Calendar"; + this.id = htmlId; + + /* Register this component */ + Alfresco.util.ComponentManager.register(this); + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["calendar", "button", "treeview"], this.onComponentsLoaded, this); + + return this; + } + + Alfresco.Calendar.prototype = + { + /** + * AddEvent module instance. + * + * @property eventDialog + * @type Alfresco.module.AddEvent + */ + eventDialog: null, + + /** + * A reference to the YAHOO calendar component. + * + * @property calendar + * @type YAHOO.widget.Calendar + */ + calendar: null, + + /** + * Sets the current site for this component. + * + * @property siteId + * @type string + */ + setSiteId: function(siteId) + { + this.siteId = siteId; + return this; + }, + + /** + * Set messages for this component + * + * @method setMessages + * @param obj {object} Object literal specifying a set of messages + */ + setMessages: function(obj) + { + Alfresco.util.addMessages(obj, this.name); + return this; + }, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function() + { + Event.onContentReady(this.id, this.init, this, true); + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Initialises components, including YUI widgets. + * + * @method init + */ + init: function() + { + /* Add Event Button */ + Alfresco.util.createYUIButton(this, "thisMonth-button", this.onThisMonthClick); + + // Separate the (initial) rendering of the calendar from the data loading. + // If for some reason the data fails to load, the calendar will still display. + var navConfig = Alfresco.util.getCalendarControlConfiguration(); + this.calendar = new YAHOO.widget.Calendar("calendar", { navigator:navConfig }); + // Set localised properties + Alfresco.util.calI18nParams(this.calendar); + var calView = Alfresco.util.ComponentManager.findFirst('Alfresco.CalendarView'); + if (calView) + { + var startDate = calView.options.startDate; + this.calendar.setMonth(startDate.getMonth()); + this.calendar.setYear(startDate.getFullYear()); + } + this.calendar.render(); + this.calendar.selectEvent.subscribe(this.onDateSelected, this, true); + + // Register for changes to the calendar data + YAHOO.Bubbling.on("eventDataLoad", this.onEventDataLoad, this); + YAHOO.Bubbling.on("eventSaved", this.onEventSaved, this); + }, + + /** + * Calendar date selected event handler + * + * @method onDateSelected + * @param p_type {string} Event type + * @param p_args {array} Event arguments + * @param p_obj {object} Object passed back from subscribe method + */ + onDateSelected: function (p_type, p_args, p_obj) + { + var selected = p_args[0]; + var selDate = this.calendar.toDate(selected[0]); + YAHOO.Bubbling.fire("dateChanged", + { + date: selDate + }) + }, + + /* + * This method is called when the "eventSaved" event is fired; this + * usually occurs when an event is successfully created. The calendar + * updates its view to hightlight the date of the event. + * + * @method onEventSaved + * @param e {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onEventSaved: function(e, args) + { + var params = args[1]; + if (params && params.from) + { + var from = params.from; + var selectedDates = this.calendar.getSelectedDates(); + + dates.push(Alfresco.util.formatDate(Alfresco.thirdparty.fromISO8601(from), "mm/dd/yyyy")); + + this.calendar.cfg.setProperty("selected", dates.join(",")); + this.calendar.render(); + + Alfresco.util.PopupManager.displayMessage( + { + text: this._msg("message.add.success", params.name) + }); + } + }, + + /* + * This method is called when the "eventDataLoad" event is fired; this + * usually occurs when the page first loads. The calendar data is retrieved + * and is used to update the view with the corresponding events. + * + * @method onEventDataLoad + * @param e {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onEventDataLoad: function(e, args) + { + var events = args[1]; + if (events) + { + + var selectedDates = []; + + for (var i=0;i. + */ + +/** + * Alfresco.EventInfo + */ + +// TODO: Event element IDs need cleaning up. + + +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Selector = YAHOO.util.Selector, + Event = YAHOO.util.Event, + KeyListener = YAHOO.util.KeyListener, + $combine = Alfresco.util.combinePaths, + $html = Alfresco.util.encodeHTML, + fromISO8601 = Alfresco.util.fromISO8601, + toISO8601 = Alfresco.util.toISO8601, + formatDate = Alfresco.util.formatDate, + // These help with the confusing scope levels here, to be defined later. + EventInfo, + EditDialog, + CalendarView; + + Alfresco.EventInfo = function(containerId) + { + this.name = "Alfresco.EventInfo"; + this.id = containerId; + + this.panel = null; + + /* Load YUI Components */ + Alfresco.util.YUILoaderHelper.require(["button", "container", "connection"], this.onComponentsLoaded, this); + + return this; + }; + + Alfresco.EventInfo.prototype = + { + /** + * EventInfo instance. + * + * @property panel + * @type Alfresco.EventInfo + */ + panel: null, + + /** + * A reference to the current event. + * + * @property event + * @type object + */ + event: null, + + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * Callback called when the event info panel is closed. + * + * @property onClose callback object with fn, scopt & obj attributes + * @type {object} + */ + onClose: null, + eventUri: null, + displayDate: null + }, + + /** + * Set multiple initialization options at once. + * + * @method setOptions + * @param obj {object} Object literal specifying a set of options + */ + setOptions: function EventInfo_setOptions(obj) + { + this.options = YAHOO.lang.merge(this.options, obj); + return this; + }, + + /** + * Fired by YUILoaderHelper when required component script files have + * been loaded into the browser. + * + * @method onComponentsLoaded + */ + onComponentsLoaded: function EventInfo_onComponentsLoaded() + { + /* Shortcut for dummy instance */ + if (this.id === null) + { + return; + } + }, + + /** + * Renders the event info panel. + * + * @method show + * @param event {object} JavaScript object representing an event + */ + show: function EventInfo_show(event) + { + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/calendar/info", + dataObj: + { + "htmlid": this.id, + "uri": event.uri + }, + + successCallback: + { + fn: this.templateLoaded, + scope: this + }, + failureMessage: "Could not load event info panel", + execScripts: true + }); + + this.event = event; + }, + + /** + * Fired when the event info panel has loaded successfully. + * + * @method templateLoaded + * @param response {object} DomEvent + */ + templateLoaded: function EventInfo_templateLoaded(response) + { + var div = Dom.get("eventInfoPanel"); + div.innerHTML = response.serverResponse.responseText; + + this.panel = Alfresco.util.createYUIPanel(div, + { + width: "35em", + zIndex: 10 + }); + this.widgets = this.widgets || {}; + // Buttons + this.widgets.deleteButton = Alfresco.util.createYUIButton(this, "delete-button", this.onDeleteClick); + this.widgets.editButton = Alfresco.util.createYUIButton(this, "edit-button", this.onEditClick); + this.widgets.cancelButton = Alfresco.util.createYUIButton(this, "cancel-button", this.onCancelClick); + this.widgets.escapeListener = new KeyListener(document, + { + keys: KeyListener.KEY.ESCAPE + }, + { + fn: function(id, keyEvent) + { + this.onCancelClick(); + }, + scope: this, + correctScope: true + }); + this.widgets.escapeListener.enable(); + if (Dom.get(this.id+"-edit-available") == null) + { + if (this.widgets.deleteButton) + { + this.widgets.deleteButton.set("disabled", true); + } + if (this.widgets.editButton) + { + this.widgets.editButton.set("disabled", true); + } + + } + //convert iso date to readable human text + var dateElIds = [this.id+'-startdate',this.id+'-enddate']; + for (var i=0,len=dateElIds.length;i
    element (breaks resizer) + this.widgets.dataTable.subscribe("tableMsgShowEvent", function(oArgs) + { + // NOTE: Scope needs to be DataTable + this._elMsgTbody.parentNode.style.width = ""; + }); + + // Override abstract function within DataTable to set custom error message + this.widgets.dataTable.doBeforeLoadData = function DiscussionsTopicList_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + me.widgets.dataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + me._setDefaultDataTableErrors(me.widgets.dataTable); + } + } + else if (oResponse.results && !me.options.usePagination) + { + this.renderLoopSize = Alfresco.util.RENDERLOOPSIZE; + } + + // Must return true to have the "Loading..." message replaced by the error message + return true; + } + + // Enable row highlighting + this.widgets.dataTable.subscribe("rowMouseoverEvent", this.onEventHighlightRow, this, true); + this.widgets.dataTable.subscribe("rowMouseoutEvent", this.onEventUnhighlightRow, this, true); + + // issue a filterChanged bubble event to load the list and to + // update the other components on the page + var filterObj = YAHOO.lang.merge( + { + filterId: "new", + filterOwner: "Alfresco.DiscussionsTopicListFilter", + filterData: null + }, this.options.initialFilter); + YAHOO.Bubbling.fire("changeFilter", filterObj); + }, + + /** + * Action handler for the simple view toggle button + */ + onSimpleView: function DiscussionsTopicList_onSimpleView(e, p_obj) + { + this.options.simpleView = !this.options.simpleView; + p_obj.set("label", this._msg(this.options.simpleView ? "header.detailList" : "header.simpleList")); + + // update the list + YAHOO.Bubbling.fire("topiclistRefresh"); + Event.preventDefault(e); + }, + + /** + * Handler for the view topic action links + * + * @method onActionDelete + * @param row {object} DataTable row representing file to be actioned + */ + onViewTopic: function DiscussionsTopicList_onViewTopic(row) + { + var record = this.widgets.dataTable.getRecord(row); + window.location = Alfresco.util.discussions.getTopicViewPage(this.options.siteId, this.options.containerId, record.getData('name')); + }, + + /** + * Handler for the edit topic action links + */ + onEditTopic: function DiscussionsTopicList_onEditTopic(row) + { + var record = this.widgets.dataTable.getRecord(row); + var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "site/{site}/discussions-createtopic?topicId={topicId}", + { + site: this.options.siteId, + topicId: record.getData('name') + }); + window.location = url; + }, + + /** + * Tag selected handler (document details) + * + * @method onTagSelected + * @param tagId {string} Tag name. + * @param target {HTMLElement} Target element clicked. + */ + onTagSelected: function DiscussionsTopicList_onTagSelected(layer, args) + { + var obj = args[1]; + if (obj && (obj.tagName !== null)) + { + var filterObj = + { + filterId: obj.tagName, + filterOwner: "Alfresco.TagFilter", + filterData: null + }; + YAHOO.Bubbling.fire("changeFilter", filterObj); + } + }, + + /** + * Handler for the delete topic action links. + */ + onDeleteTopic: function DiscussionsTopicList_onDeleteTopic(row) + { + var record = this.widgets.dataTable.getRecord(row); + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this._msg("message.confirm.delete.title"), + text: this._msg("message.confirm.delete", $html(record.getData('title'))), + buttons: [ + { + text: this._msg("button.delete"), + handler: function DiscussionsTopicList_onDeleteTopic_delete() + { + this.destroy(); + me._deleteTopicConfirm.call(me, record.getData('name')); + } + }, + { + text: this._msg("button.cancel"), + handler: function DiscussionsTopicList_onDeleteTopic_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + + var elements = Dom.getElementsByClassName('yui-button', 'span', 'prompt'); + Dom.addClass(elements[0], 'alf-primary-button'); + }, + + /** + * Delete a topic. + * + * @param topicId {string} the id of the topic to delete + */ + _deleteTopicConfirm: function DiscussionsTopicList__deleteTopicConfirm(topicId) + { + // show busy message + if (! this._setBusy(this._msg('message.wait'))) + { + return; + } + + // ajax request success handler + var onDeleted = function DiscussionsTopicList__deleteTopic_onDeleted(response) + { + // remove busy message + this._releaseBusy(); + + // reload the table + this._updateDiscussionsTopicList(); + }; + + // construct the url to call + var url = YAHOO.lang.substitute(Alfresco.constants.PROXY_URI + "api/forum/post/site/{site}/{container}/{topicId}?page=discussions-topicview", + { + site: this.options.siteId, + container: this.options.containerId, + topicId: encodeURIComponent(topicId) + }); + + // execute the request + Alfresco.util.Ajax.request( + { + url: url, + method: "DELETE", + responseContentType : "application/json", + successMessage: this._msg("message.delete.success"), + successCallback: + { + fn: onDeleted, + scope: this + }, + failureMessage: this._msg("message.delete.failure"), + failureCallback: + { + fn: function(response) + { + this._releaseBusy(); + }, + scope: this + } + }); + }, + + /** + * Custom event handler to highlight row. + * + * @method onEventHighlightRow + * @param oArgs.event {HTMLEvent} Event object. + * @param oArgs.target {HTMLElement} Target element. + */ + onEventHighlightRow: function DiscussionsTopicList_onEventHighlightRow(oArgs) + { + // only highlight if we got actions to show + var record = this.widgets.dataTable.getRecord(oArgs.target.id); + if (record) + { + var permissions = record.getData('permissions'); + if (!(permissions.edit || permissions["delete"])) + { + return; + } + } + var elem = Dom.getElementsByClassName('topic', null, oArgs.target, null); + Dom.addClass(elem, 'over'); + }, + + /** + * Custom event handler to unhighlight row. + * + * @method onEventUnhighlightRow + * @param oArgs.event {HTMLEvent} Event object. + * @param oArgs.target {HTMLElement} Target element. + */ + onEventUnhighlightRow: function DiscussionsTopicList_onEventUnhighlightRow(oArgs) + { + var elem = Dom.getElementsByClassName('topic', null, oArgs.target, null); + Dom.removeClass(elem, 'over'); + }, + + /** + * DiscussionsTopicList View change filter event handler + * + * @method onChangeFilter + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (new filterId) + */ + onChangeFilter: function DiscussionsTopicList_onChangeFilter(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.filterId !== null)) + { + // Should be a filterId in the arguments + this.currentFilter = + { + filterId: obj.filterId, + filterOwner: obj.filterOwner, + filterData: obj.filterData + }; + this._updateDiscussionsTopicList( + { + page: 1 + }); + YAHOO.Bubbling.fire("filterChanged", this.currentFilter); + } + }, + + /** + * Deactivate All Controls event handler + * + * @method onDeactivateAllControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateAllControls: function DiscussionsTopicList_onDeactivateAllControls(layer, args) + { + var index, widget, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.widgets) + { + if (this.widgets.hasOwnProperty(index)) + { + fnDisable(this.widgets[index]); + } + } + }, + + /** + * Update the list title. + */ + updateListTitle: function DiscussionsTopicList_updateListTitle() + { + var elem = Dom.get(this.id + '-listtitle'), + title = this._msg("title.generic"), + filterOwner = this.currentFilter.filterOwner, + filterId = this.currentFilter.filterId, + filterData = this.currentFilter.filterData; + + if (filterOwner == "Alfresco.TopicListFilter") + { + if (filterId == "new") + { + title = this._msg("title.newtopics"); + } + if (filterId == "hot") + { + title = this._msg("title.hottopics"); + } + else if (filterId == "all") + { + title = this._msg("title.alltopics"); + } + else if (filterId == "mine") + { + title = this._msg("title.mytopics"); + } + } + else if (filterOwner == "Alfresco.TagFilter") + { + title = this._msg("title.bytag", $html(filterData)); + } + + elem.innerHTML = title; + }, + + /** + * DiscussionsTopicList Refresh Required event handler + * + * @method onDiscussionsTopicListRefresh + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (unused) + */ + onDiscussionsTopicListRefresh: function DiscussionsTopicList_onDiscussionsTopicListRefresh(layer, args) + { + this._updateDiscussionsTopicList({}); + }, + + /** + * Displays the provided busyMessage but only in case + * the component isn't busy set. + * + * @return true if the busy state was set, false if the component is already busy + */ + _setBusy: function BlogPostList__setBusy(busyMessage) + { + if (this.busy) + { + return false; + } + this.busy = true; + this.widgets.busyMessage = Alfresco.util.PopupManager.displayMessage( + { + text: busyMessage, + spanClass: "wait", + displayTime: 0 + }); + return true; + }, + + /** + * Removes the busy message and marks the component as non-busy + */ + _releaseBusy: function BlogPostList__releaseBusy() + { + if (this.busy) + { + if (this.widgets.busyMessage.destroyWithAnimationsStop != undefined) + { + this.widgets.busyMessage.destroyWithAnimationsStop(); + } + else + { + this.widgets.busyMessage.destroy(); + } + this.busy = false; + return true; + } + else + { + return false; + } + }, + + /** + * Gets a custom message + * + * @method _msg + * @param messageId {string} The messageId to retrieve + * @return {string} The custom message + * @private + */ + _msg: function DiscussionsTopicList_msg(messageId) + { + return Alfresco.util.message.call(this, messageId, "Alfresco.DiscussionsTopicList", Array.prototype.slice.call(arguments).slice(1)); + }, + + /** + * Resets the YUI DataTable errors to our custom messages + * NOTE: Scope could be YAHOO.widget.DataTable, so can't use "this" + * + * @method _setDefaultDataTableErrors + * @param dataTable {object} Instance of the DataTable + */ + _setDefaultDataTableErrors: function DiscussionsTopicList__setDefaultDataTableErrors(dataTable) + { + var msg = Alfresco.util.message; + dataTable.set("MSG_EMPTY", msg("message.empty", "Alfresco.DiscussionsTopicList")); + dataTable.set("MSG_ERROR", msg("message.error", "Alfresco.DiscussionsTopicList")); + }, + + /** + * Updates topic list by calling data webscript with current site and filter information + * + * @method _updateDiscussionsTopicList + */ + _updateDiscussionsTopicList: function DiscussionsTopicList__updateDiscussionsTopicList(p_obj) + { + // Reset the custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + var successHandler = function DiscussionsTopicList__updateDiscussionsTopicList_successHandler(sRequest, oResponse, oPayload) + { + //this.currentPath = successPath; + this.widgets.dataTable.onDataReturnInitializeTable.call(this.widgets.dataTable, sRequest, oResponse, oPayload); + this.updateListTitle(); + } + + var failureHandler = function DiscussionsTopicList__updateDiscussionsTopicList_failureHandler(sRequest, oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(true); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + this.widgets.dataTable.set("MSG_ERROR", response.message); + this.widgets.dataTable.showTableMessage(Alfresco.util.encodeHTML(response.message), YAHOO.widget.DataTable.CLASS_ERROR); + if (oResponse.status == 404) + { + // Site or container not found - deactivate controls + YAHOO.Bubbling.fire("deactivateAllControls"); + } + } + catch(e) + { + this._setDefaultDataTableErrors(this.widgets.dataTable); + } + } + } + + // get the url to call + this.widgets.dataSource.sendRequest(this._buildParams(p_obj || {}), + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Build URI parameter string for doclist JSON data webscript + * + * @method _buildDocListParams + * @param p_obj.page {string} Page number + * @param p_obj.pageSize {string} Number of items per page + */ + _buildParams: function DiscussionsTopicList__buildParams(p_obj) + { + var params = + { + contentLength: this.options.maxContentLength, + tag: null, + page: this.widgets.paginator.getCurrentPage() || "1", + pageSize: this.widgets.paginator.getRowsPerPage() + } + + // Passed-in overrides + if (typeof p_obj == "object") + { + params = YAHOO.lang.merge(params, p_obj); + } + + // add the pageSize param + params.startIndex = (params.page-1) * params.pageSize; + + // check what url to call and with what parameters + var filterOwner = this.currentFilter.filterOwner; + var filterId = this.currentFilter.filterId; + var filterData = this.currentFilter.filterData; + + // check whether we got a filter or not + var url = ""; + if (filterOwner == "Alfresco.TopicListFilter") + { + // latest only + if (filterId == "all") + { + url = ""; + } + if (filterId == "new") + { + url = "/new"; + } + else if (filterId == "hot") + { + url = "/hot" + } + else if (filterId == "mine") + { + url = "/myposts" + } + } + else if (filterOwner == "Alfresco.TagFilter") + { + params.tag = encodeURIComponent(filterData); + } + + // build the url extension + var urlExt = ""; + for (paramName in params) + { + if (params[paramName] !== null) + { + urlExt += "&" + paramName + "=" + encodeURIComponent(params[paramName]); + } + } + if (urlExt.length > 0) + { + urlExt = urlExt.substring(1); + } + return url + "?" + urlExt; + } + }; +})(); diff --git a/share/src/main/webapp/components/document-details/document-actions.css b/share/src/main/webapp/components/document-details/document-actions.css new file mode 100644 index 0000000000..e23d62eb8f --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-actions.css @@ -0,0 +1,27 @@ +.document-actions .doclist +{ + visibility: visible; +} + +.document-actions .doclist .action-set +{ + margin-top: 1em; +} + +.document-actions .doclist .action-set a, +.document-actions .doclist .action-set a:visited +{ + border: 1px solid #fafafa; +} + +.document-actions .doclist .action-set a:active, +.document-actions .doclist .action-set a:hover +{ + background-color: #fff; + text-decoration: none; +} + +.document-actions .doclist .action-set div +{ + padding: 0.3em; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/document-details/document-actions.js b/share/src/main/webapp/components/document-details/document-actions.js new file mode 100644 index 0000000000..2c8c104a9f --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-actions.js @@ -0,0 +1,705 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document actions component. + * + * @namespace Alfresco + * @class Alfresco.DocumentActions + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths, + $siteURL = Alfresco.util.siteURL; + + /** + * DocumentActions constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentActions} The new DocumentActions instance + * @constructor + */ + Alfresco.DocumentActions = function(htmlId) + { + Alfresco.DocumentActions.superclass.constructor.call(this, "Alfresco.DocumentActions", htmlId, ["button"]); + + // Initialise prototype properties + this.actionsView = "details"; + + // Decoupled event listeners + YAHOO.Bubbling.on("filesPermissionsUpdated", this.doRefresh, this); + YAHOO.Bubbling.on("metadataRefresh", this.doRefresh, this); + YAHOO.Bubbling.on("registerAction", this.onRegisterAction, this); + + return this; + }; + + /** + * Retrieves the redirection path to list parent folder's content + * + * @param {String} path The local path + * @param {String} siteId Id of the current site + */ + function DocumentActions_getParentLocation(path, siteId) + { + // Update the path for My Files and Shared Files... + if (Alfresco.constants.PAGECONTEXT == "mine" || Alfresco.constants.PAGECONTEXT == "shared") + { + // Get rid of the first "/" + var tmpPath = path.substring(1); + if (Alfresco.constants.PAGECONTEXT == "mine") + { + tmpPath = tmpPath.substring(tmpPath.indexOf("/") + 1); + } + var slashIndex = tmpPath.indexOf("/"); + if (slashIndex != -1) + { + path = tmpPath.substring(slashIndex); + } + else + { + path = ""; + } + } + + var callbackUrl = "", + encodedPath = path.length > 1 ? "?path=" + encodeURIComponent(path) : ""; + + // Work out the correct Document Library to return to... + if (Alfresco.constants.PAGECONTEXT == "mine") + { + callbackUrl = "myfiles"; + } + else if (Alfresco.constants.PAGECONTEXT == "shared") + { + callbackUrl = "sharedfiles"; + } + else + { + callbackUrl = Alfresco.util.isValueSet(siteId) ? "documentlibrary" : "repository"; + } + + var result = callbackUrl + encodedPath; + + return result; + } + + /** + * Extend Alfresco.component.Base + */ + YAHOO.extend(Alfresco.DocumentActions, Alfresco.component.Base); + + /** + * Augment prototype with Actions module + */ + YAHOO.lang.augmentProto(Alfresco.DocumentActions, Alfresco.doclib.Actions); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.DocumentActions.prototype, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Reference to the current document + * + * @property nodeRef + * @type string + */ + nodeRef: null, + + /** + * Current siteId, if any. + * + * @property siteId + * @type string + */ + siteId: null, + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "documentLibrary" + */ + containerId: "documentLibrary", + + /** + * Valid inline edit mimetypes + * Currently allowed are plain text, HTML and XML only + * + * @property inlineEditMimetypes + * @type object + */ + inlineEditMimetypes: + { + "text/plain": true, + "text/html": true, + "text/xml": true + }, + + /** + * Root node + * + * @property rootNode + * @type string + */ + rootNode: "alfresco://company/home", + + /** + * Replication URL Mapping details + * + * @property replicationUrlMapping + * @type object + */ + replicationUrlMapping: {}, + + /** + * JSON representation of document details + * + * @property documentDetails + * @type object + */ + documentDetails: null, + + /** + * Whether the Repo Browser is in use or not + * + * @property repositoryBrowsing + * @type boolean + */ + repositoryBrowsing: true + }, + + /** + * The data for the document + * + * @property recordData + * @type object + */ + recordData: null, + + /** + * Metadata returned by doclist data webscript + * + * @property doclistMetadata + * @type object + * @default null + */ + doclistMetadata: null, + + /** + * Path of asset being viewed - used to scope some actions (e.g. copy to, move to) + * + * @property currentPath + * @type string + */ + currentPath: null, + + /** + * Event handler called when "onReady" + * + * @method: onReady + */ + onReady: function DocumentActions_onReady() + { + var me = this; + + // Asset data + this.recordData = this.options.documentDetails.item; + this.doclistMetadata = this.options.documentDetails.metadata; + this.currentPath = this.recordData.location.path; + + // Populate convenience property + this.recordData.jsNode = new Alfresco.util.Node(this.recordData.node); + + // Retrieve the actionSet for this record + var record = this.recordData, + node = record.node, + actions = record.actions, + actionsEl = Dom.get(this.id + "-actionSet"), + actionHTML = "", + actionsSel; + + record.actionParams = {}; + for (var i = 0, ii = actions.length; i < ii; i++) + { + if (i + 1 < ii && actions[i].subgroup != actions[i + 1].subgroup) + { + actions[i]["lastActionInSubgroup"] = true; + } + + actionHTML += this.renderAction(actions[i], record); + } + + // Token replacement (actionUrls is re-used further down) + var actionUrls = this.getActionUrls(record); + actionsEl.innerHTML = YAHOO.lang.substitute(actionHTML, actionUrls); + + Dom.addClass(actionsEl, "action-set"); + Dom.setStyle(actionsEl, "visibility", "visible"); + + var displayName = record.displayName, + downloadUrl = actionUrls.downloadUrl; + + // Hook action events + var fnActionHandler = function DocumentActions_fnActionHandler(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + if (typeof me[owner.id] === "function") + { + args[1].stop = true; + try + { + me[owner.id].call(me, me.recordData, owner); + } + catch (e) + { + Alfresco.logger.error("DocumentActions_fnActionHandler", owner.id, e); + } + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("action-link", fnActionHandler, true); + + // DocLib Actions module + this.modules.actions = new Alfresco.module.DoclibActions(); + + // Prompt auto-download (after Edit Offline action)? + if (window.location.hash == "#editOffline") + { + window.location.hash = ""; + + var isEditingCanceled = false; + YAHOO.Bubbling.on("editingCanceled", function(layer, args) + { + if (record.workingCopy.sourceNodeRef == args[1].record.workingCopy.sourceNodeRef) + { + isEditingCanceled = true; + } + }, this); + + if (YAHOO.env.ua.ie > 6) + { + // MSIE7 blocks the download and gets the wrong URL in the "manual download bar" + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.edit-offline.success", displayName), + text: this.msg("message.edit-offline.success.ie7"), + buttons: [ + { + text: this.msg("button.download"), + handler: function DocumentActions_oAEO_success_download() + { + window.open(downloadUrl, "_blank"); + this.destroy(); + }, + isDefault: true + }, + { + text: this.msg("button.close"), + handler: function DocumentActions_oAEO_success_close() + { + this.destroy(); + } + }] + }); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.edit-offline.success", displayName) + }); + // Kick off the download 3 seconds after the confirmation message + YAHOO.lang.later(3000, this, function() + { + if (!isEditingCanceled) + { + window.location = downloadUrl; + } + }); + } + } + + if (window.location.hash == "#editCancelled") + { + window.location.hash = ""; + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.edit-cancel.success", displayName) + }); + } + + if (window.location.hash == "#unlockDocument") + { + window.location.hash = ""; + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.unlock-document.success", displayName) + }); + } + + if (window.location.hash == "#newVersionUpload") + { + window.location.hash = ""; + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.new-version-upload.success") + }); + } + }, + + /** + * Edit Offline. + * + * @override + * @method onActionEditOffline + * @param asset {object} Object literal representing file or folder to be actioned + */ + onActionEditOffline: function DocumentActions_onActionEditOffline(asset) + { + var displayName = asset.displayName, + nodeRef = new Alfresco.util.NodeRef(asset.nodeRef); + + this.modules.actions.genericAction( + { + success: + { + callback: + { + fn: function DocumentActions_oAEO_success(data) + { + this.recordData.jsNode.setNodeRef(data.json.results[0].nodeRef); + window.location = this.getActionUrls(this.recordData).documentDetailsUrl + "#editOffline"; + }, + scope: this + } + }, + failure: + { + message: this.msg("message.edit-offline.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: "checkout/node/{nodeRef}", + params: + { + nodeRef: nodeRef.uri + } + } + }); + }, + + /** + * Cancel editing. + * + * @override + * @method onActionCancelEditing + * @param asset {object} Object literal representing file or folder to be actioned + */ + onActionCancelEditing: function DocumentActions_onActionCancelEditing(asset) + { + var displayName = asset.displayName, + nodeRef = new Alfresco.util.NodeRef(asset.nodeRef), + parentLocation = DocumentActions_getParentLocation(asset.location.path, this.options.siteId); + + this.modules.actions.genericAction( + { + success: + { + callback: + { + fn: function DocumentActions_oACE_success(data) + { + var oldNodeRef = this.recordData.jsNode.nodeRef.nodeRef, + newNodeRef = data.json.results[0].nodeRef; + this.recordData.jsNode.setNodeRef(newNodeRef); + if(this.recordData.parent && this.recordData.parent.nodeRef == newNodeRef) + { + window.location = asset.parent.nodeRef ? $siteURL(parentLocation) : Alfresco.constants.URL_CONTEXT; + } + else + { + window.location = this.getActionUrls(this.recordData).documentDetailsUrl + "#editCancelled"; + } + + // ALF-16598 fix, page is not refreshed if only hash was changed, force page reload for cancel online editing + if (oldNodeRef == newNodeRef) + { + window.location.reload(); + } + }, + scope: this + } + }, + failure: + { + message: this.msg("message.edit-cancel.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: "cancel-checkout/node/{nodeRef}", + params: + { + nodeRef: nodeRef.uri + } + } + }); + + YAHOO.Bubbling.fire("editingCanceled", + { + record: asset + }); + }, + + /** + * Unlock document. + * + * @override + * @method onActionCancelEditing + * @param asset {object} + */ + onActionUnlockDocument: function DocumentActions_onActionUnlockDocument(asset) + { + var displayName = asset.displayName, + nodeRef = new Alfresco.util.NodeRef(asset.nodeRef); + + this.modules.actions.genericAction( + { + success: + { + callback: + { + fn: function DocumentActions_oACE_success(data) + { + var oldNodeRef = this.recordData.jsNode.nodeRef.nodeRef, + newNodeRef = data.json.results[0].nodeRef; + this.recordData.jsNode.setNodeRef(newNodeRef); + window.location = this.getActionUrls(this.recordData).documentDetailsUrl + "#unlockDocument"; + if (oldNodeRef == newNodeRef) + { + window.location.reload(); + } + }, + scope: this + } + }, + failure: + { + message: this.msg("message.unlock-document.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: "unlock-document/node/{nodeRef}", + params: + { + nodeRef: nodeRef.uri + } + } + }); + + YAHOO.Bubbling.fire("editingCanceled", + { + record: asset + }); + }, + + /** + * Upload new version. + * + * @override + * @method onActionUploadNewVersion + * @param asset {object} Object literal representing the file to be actioned upon + */ + onActionUploadNewVersion: function DocumentActions_onActionUploadNewVersion(asset) + { + var displayName = asset.displayName, + nodeRef = new Alfresco.util.NodeRef(asset.nodeRef), + version = asset.version; + + if (!this.fileUpload) + { + this.fileUpload = Alfresco.getFileUploadInstance(); + } + + // Show uploader for multiple files + var description = this.msg("label.filter-description", displayName), + extensions = "*"; + + if (displayName && new RegExp(/[^\.]+\.[^\.]+/).exec(displayName)) + { + // Only add a filtering extension if filename contains a name and a suffix + extensions = "*" + displayName.substring(displayName.lastIndexOf(".")); + } + + if (asset.workingCopy && asset.workingCopy.workingCopyVersion) + { + version = asset.workingCopy.workingCopyVersion; + } + + var singleUpdateConfig = + { + updateNodeRef: nodeRef.toString(), + updateFilename: displayName, + updateVersion: version, + suppressRefreshEvent: true, + overwrite: true, + filter: [ + { + description: description, + extensions: extensions + }], + mode: this.fileUpload.MODE_SINGLE_UPDATE, + onFileUploadComplete: + { + fn: this.onNewVersionUploadCompleteCustom, + scope: this + }, + newVersion: true, + jsNode : asset.jsNode + }; + if (Alfresco.util.isValueSet(this.options.siteId)) + { + singleUpdateConfig.siteId = this.options.siteId; + singleUpdateConfig.containerId = this.options.containerId; + } + this.fileUpload.show(singleUpdateConfig); + }, + + /** + * Called from the uploader component after a the new version has been uploaded. + * + * @method onNewVersionUploadCompleteCustom + * @param complete {object} Object literal containing details of successful and failed uploads + */ + onNewVersionUploadCompleteCustom: function DocumentActions_onNewVersionUploadCompleteCustom(complete) + { + this.recordData.jsNode.setNodeRef(complete.successful[0].nodeRef); + var mydocumentDetailsUrl = this.getActionUrls(this.recordData).documentDetailsUrl + "#newVersionUpload"; + var oldNodeRef = this.recordData.jsNode.nodeRef.nodeRef, + newNodeRef = this.recordData.nodeRef; + + Alfresco.Share.postActivity(this.options.siteId, "org.alfresco.documentlibrary.file-updated", complete.successful[0].fileName, "document-details?nodeRef="+complete.successful[0].nodeRef, + { + fileName: complete.successful[0].fileName, + nodeRef: complete.successful[0].nodeRef + + }, function() { + window.location = mydocumentDetailsUrl; + if (oldNodeRef == newNodeRef) + { + window.location.reload(); + } + }); + + }, + + /** + * Delete Asset confirmed. + * + * @override + * @method _onActionDeleteConfirm + * @param asset {object} Object literal representing file or folder to be actioned + * @private + */ + _onActionDeleteConfirm: function DocumentActions__onActionDeleteConfirm(asset) + { + var path = asset.location.path, + fileName = asset.fileName, + displayName = asset.displayName, + nodeRef = new Alfresco.util.NodeRef(asset.nodeRef), + parentLocation = DocumentActions_getParentLocation(path, this.options.siteId); + + this.modules.actions.genericAction( + { + success: + { + activity: + { + siteId: this.options.siteId, + activityType: "file-deleted", + page: "documentlibrary", + activityData: + { + fileName: fileName, + path: path, + nodeRef: nodeRef.toString() + } + }, + callback: + { + fn: function DocumentActions_oADC_success(data) + { + window.location = asset.parent.nodeRef ? $siteURL(parentLocation) : Alfresco.constants.URL_CONTEXT; + } + } + }, + failure: + { + message: this.msg("message.delete.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.DELETE, + name: "file/node/{nodeRef}", + params: + { + nodeRef: nodeRef.uri + } + } + }); + }, + + /** + * Refresh component in response to metadataRefresh event + * + * @method doRefresh + */ + doRefresh: function DocumentActions_doRefresh() + { + YAHOO.Bubbling.unsubscribe("filesPermissionsUpdated", this.doRefresh, this); + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + this.refresh('components/document-details/document-actions?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : '')); + } + }, true); +})(); diff --git a/share/src/main/webapp/components/document-details/document-details-panel.css b/share/src/main/webapp/components/document-details/document-details-panel.css new file mode 100644 index 0000000000..810c9e2b02 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-details-panel.css @@ -0,0 +1,17 @@ +.document-details-panel +{ + background-color: #FAFAFA; + border-top: 1px solid #CCCCCC; + padding: 1em 0 1em 1em; +} + +.document-details-panel .panel-body +{ + padding: 1em 1em 0; +} + +.document-details-panel .form-container .form-fields +{ + border-bottom: none; + padding: 1em 1em 0; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/document-details/document-links.css b/share/src/main/webapp/components/document-details/document-links.css new file mode 100644 index 0000000000..14306121c3 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-links.css @@ -0,0 +1,21 @@ +.document-links .link-info +{ + padding: 0 1em 1em 0; +} + +.document-links h3 +{ + margin-bottom: 0.5em; +} + +.document-links .link-info input +{ + width: 100%; + padding: 0.4em; + display: block; +} + +.document-links .link-info a +{ + margin-left: 0.5em; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/document-details/document-links.js b/share/src/main/webapp/components/document-details/document-links.js new file mode 100644 index 0000000000..5b584d1b44 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-links.js @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document links component. + * + * @namespace Alfresco + * @class Alfresco.DocumentLinks + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Selector = YAHOO.util.Selector; + + /** + * DocumentLinks constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentLinks} The new DocumentLinks instance + * @constructor + */ + Alfresco.DocumentLinks = function(htmlId) + { + Alfresco.DocumentLinks.superclass.constructor.call(this, "Alfresco.DocumentLinks", htmlId, []); + + // Initialise prototype properties + this.hasClipboard = window.clipboardData && window.clipboardData.setData; + + return this; + }; + + YAHOO.extend(Alfresco.DocumentLinks, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Reference to the current document + * + * @property nodeRef + * @type string + */ + nodeRef: null, + + /** + * Current siteId, if any. + * + * @property siteId + * @type string + */ + siteId: null + }, + + /** + * Does the browser natively support clipboard data? + * + * @property hasClipboard + * @type boolean + */ + hasClipboard: null, + + /** + * + * + * @method: onReady + */ + onReady: function DocumentLinks_onReady() + { + // Display copy links + if (this.hasClipboard) + { + Dom.removeClass(Selector.query("a.hidden", this.id), "hidden"); + } + + // Make sure text fields auto select the text on focus + Event.addListener(Selector.query("input", this.id), "focus", this._handleFocus); + + // Prefix some of the urls with values from the client + Dom.get(this.id + "-page").value = document.location.href; + }, + + /** + * called when the "onCopyLinkClick" link has been clicked. + * Tries to copy URLs to the system clipboard. + * + * @method onCopyLinkClick + * @param rel {string} The Dom Id of the element holding the URL to copy + */ + onCopyLinkClick: function DocumentLinks_onCopyLinkClick(rel, anchor) + { + var link = Dom.getPreviousSibling(anchor); + window.clipboardData.setData("Text", link.value); + }, + + /** + * Event handler used to select text in the field when focus is received + * + * @method _handleFocus + */ + _handleFocus: function DocumentLinks__handleFocus() + { + this.select(); + } + }); +})(); diff --git a/share/src/main/webapp/components/document-details/document-metadata.css b/share/src/main/webapp/components/document-details/document-metadata.css new file mode 100644 index 0000000000..3a78d0b1ae --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-metadata.css @@ -0,0 +1,4 @@ +.document-metadata-header h2 .edit +{ + background-image: url(../images/edit-16.png); +} diff --git a/share/src/main/webapp/components/document-details/document-metadata.js b/share/src/main/webapp/components/document-details/document-metadata.js new file mode 100644 index 0000000000..a22289b1f1 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-metadata.js @@ -0,0 +1,181 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentMetadata + * + * @namespace Alfresco + * @class Alfresco.DocumentMetadata + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + formatDate = Alfresco.util.formatDate, + fromISO8601 = Alfresco.util.fromISO8601; + + /** + * DocumentMetadata constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentMetadata} The new DocumentMetadata instance + * @constructor + */ + Alfresco.DocumentMetadata = function DocumentMetadata_constructor(htmlId) + { + Alfresco.DocumentMetadata.superclass.constructor.call(this, "Alfresco.DocumentMetadata", htmlId); + + // Decoupled event listeners + YAHOO.Bubbling.on("metadataRefresh", this.doRefresh, this); + + return this; + }; + + YAHOO.extend(Alfresco.DocumentMetadata, Alfresco.component.Base, + { + + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * The nodeRefs to load the form for. + * + * @property nodeRef + * @type string + * @required + */ + nodeRef: null, + + /** + * The current site (if any) + * + * @property site + * @type string + */ + site: null, + + /** + * The form id for the form to use. + * + * @property destination + * @type string + */ + formId: null + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Template initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function DocumentMetadata_onReady() + { + // Load the form + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/form", + dataObj: + { + htmlid: this.id + "-formContainer", + itemKind: "node", + itemId: this.options.nodeRef, + formId: this.options.formId, + mode: "view" + }, + successCallback: + { + fn: this.onFormLoaded, + scope: this + }, + failureMessage: this.msg("message.failure"), + scope: this, + execScripts: true + }); + }, + + /** + * Called when a workflow form has been loaded. + * Will insert the form in the Dom. + * + * @method onFormLoaded + * @param response {Object} + */ + onFormLoaded: function DocumentMetadata_onFormLoaded(response) + { + var formEl = Dom.get(this.id + "-formContainer"), + me = this; + formEl.innerHTML = response.serverResponse.responseText; + + function exifDate(date) { + const inputDate = new Date(date); + const originalDate = new Date(inputDate.toISOString().slice(0, -1)); + var pre = "GMT"; + var exifDateTime = originalDate.toString().slice(0, originalDate.toString().lastIndexOf(pre)); + return exifDateTime; + } + + Dom.getElementsByClassName("viewmode-value-date", "span", formEl, function() + { + var fieldLabel = Dom.getAttribute(this, "field-label"); + var fieldValue; + var showTime; + var dateFormat; + var theDate; + var ignoreTime; + if(fieldLabel === "Date and Time"){ + fieldValue = Dom.getAttribute(this, "data-date-iso8601"); + showTime = Dom.getAttribute(this, "data-show-time"), + dateFormat = (showTime=='false') ? me.msg("date-format.defaultDateOnly") : me.msg("date-format.default"), + theDate = fieldValue; + this.innerHTML = exifDate(theDate, dateFormat); + } + else{ + fieldValue = Dom.getAttribute(this, "data-date-iso8601"), + showTime = Dom.getAttribute(this, "data-show-time"), + dateFormat = (showTime=='false') ? me.msg("date-format.defaultDateOnly") : me.msg("date-format.default"), + // MNT-9693 - Pass the ignoreTime flag + ignoreTime = showTime == 'false', + theDate = fromISO8601(fieldValue, ignoreTime); + this.innerHTML = formatDate(theDate, dateFormat); + } + }); + }, + + /** + * Refresh component in response to metadataRefresh event + * + * @method doRefresh + */ + doRefresh: function DocumentMetadata_doRefresh() + { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + this.refresh('components/document-details/document-metadata?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : '') + (this.options.formId ? '&formId={formId}' : '')); + } + }); + +})(); diff --git a/share/src/main/webapp/components/document-details/document-permissions.css b/share/src/main/webapp/components/document-details/document-permissions.css new file mode 100644 index 0000000000..0cbfeccbf0 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-permissions.css @@ -0,0 +1,4 @@ +.document-permissions h2 .edit +{ + background-image: url(../documentlibrary/actions/document-manage-permissions-16.png); +} diff --git a/share/src/main/webapp/components/document-details/document-permissions.js b/share/src/main/webapp/components/document-details/document-permissions.js new file mode 100644 index 0000000000..92e28907d6 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-permissions.js @@ -0,0 +1,133 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document permissions component. + * + * @namespace Alfresco + * @class Alfresco.DocumentPermissions + */ +(function() +{ + /** + * DocumentPermissions constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentPermissions} The new DocumentPermissions instance + * @constructor + */ + Alfresco.DocumentPermissions = function(htmlId) + { + Alfresco.DocumentPermissions.superclass.constructor.call(this, "Alfresco.DocumentPermissions", htmlId); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("filesPermissionsUpdated", this.doRefresh, this); + + return this; + }; + + /** + * Extend Alfresco.component.Base + */ + YAHOO.extend(Alfresco.DocumentPermissions, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Reference to the current document + * + * @property nodeRef + * @type string + */ + nodeRef: null, + + /** + * Current siteId, if any. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * The display name of the current document, will be used in the manage permissions panel. + * + * @property displayName + * @type string + */ + displayName: null, + + /** + * The permission roles for the groups on this document. + * + * @property roles + * @type Array + */ + roles: null + }, + + /** + * Called when the onManagePermissionsClick link has been clicked, will display the manage permissions dialog. + * + * @method onManagePermissionsClick + */ + onManagePermissionsClick: function DocumentPermissions_onManagePermissionsClick() + { + if (!this.modules.permissions) + { + this.modules.permissions = new Alfresco.module.DoclibPermissions(this.id + "-permissions"); + } + + this.modules.permissions.setOptions( + { + siteId: this.options.siteId, + files: + { + displayName: this.options.displayName, + node: + { + nodeRef: this.options.nodeRef, + permissions: + { + roles: this.options.roles + } + } + } + }).showDialog(); + }, + + /** + * Called when the "filesPermissionsUpdated" has been fired from the manage permissions dialog. + * Will refresh this component. + * + * @method doRefresh + */ + doRefresh: function DocumentPermissions_doRefresh() + { + YAHOO.Bubbling.unsubscribe("filesPermissionsUpdated", this.doRefresh, this); + this.refresh('components/document-details/document-permissions?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : '')); + } + }); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/document-details/document-tags.css b/share/src/main/webapp/components/document-details/document-tags.css new file mode 100644 index 0000000000..cc2d13cb05 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-tags.css @@ -0,0 +1,15 @@ +.document-tags .tag +{ + border-radius: 8px; + display: inline-block; + font-size: 93%; + margin: 1px 0.5em 1px 0; + padding: 2px 8px; + zoom: 1; + border-radius: 8px; +} + +.document-tags h2 .edit +{ + background-image: url(../images/edit-16.png); +} diff --git a/share/src/main/webapp/components/document-details/document-tags.js b/share/src/main/webapp/components/document-details/document-tags.js new file mode 100644 index 0000000000..f4881e5468 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-tags.js @@ -0,0 +1,101 @@ +/** + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentTags + * + * @namespace Alfresco + * @class Alfresco.DocumentTags + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * DocumentTags constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentTags} The new DocumentTags instance + * @constructor + */ + Alfresco.DocumentTags = function DocumentTags_constructor(htmlId) + { + Alfresco.DocumentTags.superclass.constructor.call(this, "Alfresco.DocumentTags", htmlId); + + // Decoupled event listeners + YAHOO.Bubbling.on("metadataRefresh", this.doRefresh, this); + + return this; + }; + + YAHOO.extend(Alfresco.DocumentTags, Alfresco.component.Base, + { + + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * The nodeRefs to load the form for. + * + * @property nodeRef + * @type string + * @required + */ + nodeRef: null, + + /** + * Current siteId, if any. + * + * @property siteId + * @type string + */ + siteId: "" + }, + + /** + * Fired by YUI when parent element is available for scripting. + * Template initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function DocumentTags_onReady() + { + }, + + /** + * Refresh component in response to metadataRefresh event + * + * @method doRefresh + */ + doRefresh: function DocumentTags_doRefresh() + { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + this.refresh('components/document-details/document-tags?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : '')); + } + }); +})(); diff --git a/share/src/main/webapp/components/document-details/document-versions.css b/share/src/main/webapp/components/document-details/document-versions.css new file mode 100644 index 0000000000..06b88da0b5 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-versions.css @@ -0,0 +1,99 @@ +.document-versions .version-panel-left +{ + float: left; +} + +.document-versions .version-panel-right +{ + border-left: 1px solid #ccc; + margin-left: 2.5em; + padding-left: 0.5em; +} + +.document-versions .h4 +{ + clear: both; +} + +.document-versions .version-list +{ + margin-bottom: 1.5em; + margin-top: 0.5em; +} + +.document-versions h2 .edit +{ + background-image: url(images/document-upload-new-version-16.png); +} + +.document-versions .version-list h3 +{ + margin-bottom: 0.5em; + word-wrap: break-word; +} + +.document-versions .version-list h3 .document-version +{ + margin-right: 0.8em; +} + +.document-versions .actions +{ + float: right; + width: 5em; + text-align: right; +} + +.document-versions .current-version .actions +{ + display: none; +} + +.document-versions .actions a +{ + background-repeat: no-repeat; + background-position: left; + padding: 0.5em; + text-decoration: none; +} + +.document-versions .actions a.download +{ + background-image: url(images/document-download-16.png); +} + +.document-versions .actions a.historicProperties +{ + background-image: url(images/document-view-metadata-16.png); +} + +.document-versions .actions a.revert +{ + background-image: url(images/revert-16.png); +} + +.document-versions .version-details-left +{ + float: left; +} + +.document-versions .version-details-right +{ + margin-left: 40px; + word-wrap: break-word; +} + +.document-versions .alfresco-datatable td +{ + border-bottom: medium none !important; +} + +.document-versions .alfresco-datatable td .yui-dt-liner +{ + padding: 4px 0 10px; +} + +div.revert-version.yui-panel div.hd +{ + padding-right: 32px; +} diff --git a/share/src/main/webapp/components/document-details/document-versions.js b/share/src/main/webapp/components/document-details/document-versions.js new file mode 100644 index 0000000000..0eaaddd9b6 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-versions.js @@ -0,0 +1,420 @@ +/** + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document Details Version component. + * + * @namespace Alfresco + * @class Alfresco.DocumentVersions + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Selector = YAHOO.util.Selector; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $userProfileLink = Alfresco.util.userProfileLink, + $userAvatar = Alfresco.Share.userAvatar; + + /** + * DocumentVersions constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentVersions} The new component instance + * @constructor + */ + Alfresco.DocumentVersions = function DocumentVersions_constructor(htmlId) + { + Alfresco.DocumentVersions.superclass.constructor.call(this, "Alfresco.DocumentVersions", htmlId, ["datasource", "datatable", "paginator", "history", "animation"]); + + YAHOO.Bubbling.on("metadataRefresh", this.doRefresh, this); + return this; + }; + + YAHOO.extend(Alfresco.DocumentVersions, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type {object} object literal + */ + options: + { + /** + * Reference to the current document + * + * @property nodeRef + * @type string + */ + nodeRef: null, + + /** + * Current siteId, if any. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * The name of container that the node lives in, will be used when uploading new versions. + * + * @property containerId + * @type string + */ + containerId: null, + + /** + * JSON representation of document details + * + * @property documentDetails + * @type object + */ + documentDetails: null, + + /** + * Tells if the user may upload a new version or revert the document. + * + * @property allowNewVersionUpload + * @type string + */ + allowNewVersionUpload: false + }, + + /** + * The latest version of the document + * + * @property latestVersion + * @type {Object} + */ + latestVersion: null, + + /** + * A cached copy of the version history to limit duplicate calls. + * + * @property versionCache + * @type {Object} XHR response object + */ + versionCache: null, + + /** + * The data source URL stem + * + * @property dataSourceURLStem + * @type string + */ + dataSourceURLStem: Alfresco.constants.PROXY_URI + "api/version", + + /** + * Fired by YUI when parent element is available for scripting + * + * @method onReady + */ + onReady: function DocumentVersions_onReady() + { + var containerElement = Dom.get(this.id + "-olderVersions"); + if (!containerElement) + { + return; + } + + this.widgets.alfrescoDataTable = new Alfresco.util.DataTable( + { + dataSource: + { + url: this.dataSourceURLStem + "?nodeRef=" + this.options.nodeRef, + doBeforeParseData: this.bind(function(oRequest, oFullResponse) + { + // Versions are returned in an array but must be placed in an object to be able to be parse by yui + // Also skip the first version since that is the current version + this.latestVersion = oFullResponse.splice(0, 1)[0]; + Dom.get(this.id + "-latestVersion").innerHTML = this.getDocumentVersionMarkup(this.latestVersion); + + // Cache the version data for other components (e.g. HistoricPropertiesViewer) + this.versionCache = oFullResponse; + + return ( + { + "data" : oFullResponse + }); + }) + }, + dataTable: + { + container: this.id + "-olderVersions", + columnDefinitions: + [ + { key: "version", sortable: false, formatter: this.bind(this.renderCellVersion) } + ], + config: + { + MSG_EMPTY: this.msg("message.noVersions") + } + } + }); + + this.widgets.alfrescoDataTable.getDataTable().subscribe("renderEvent", function() + { + this.resizeHistoryDetails(); + }, this, this); + + Event.addListener(window, "resize", function() + { + this.resizeHistoryDetails(); + }, this, true); + }, + + /** + * Resize Event handler to resize the version history comment area dynamically + * See MNT-9909 - to handle long comments without breaks in words. + */ + resizeHistoryDetails: function DocumentVersions_resizeHistoryDetails() + { + // adjusts the filename container DIV to a size relative to the container width + var width = (Dom.getViewportWidth() * 0.25) + "px", + nodes = YAHOO.util.Selector.query('h3.thin', this.id + "-body"); + for (var i=0; i'; + html += ''; + html += '
    '; + html += '

    ' + $html(doc.name) + '

    '; + html += ' '; + if (this.options.allowNewVersionUpload) + { + html += '  '; + } + html += '  '; + html += '  '; + html += ' '; + html += '
    '; + html += '
    '; + html += '
    ' + html += $userAvatar(doc.creator.userName, 32); + html += '
    '; + html += '
    '; + html += $userProfileLink(doc.creator.userName, doc.creator.firstName + ' ' + doc.creator.lastName, 'class="theme-color-1"') + ' '; + html += Alfresco.util.relativeTime(Alfresco.util.fromISO8601(doc.createdDateISO)) + '
    '; + html += ((doc.description || "").length > 0) ? $html(doc.description, true) : '(' + this.msg("label.noComment") + ')'; + html += '
    '; + html += '
    '; + html += '
    '; + + html += '
    '; + return html; + }, + + /** + * Called when a "onRevertVersionClick" link has been clicked for a version. + * Will display the revert version dialog. + * + * @method onRevertVersionClick + * @param version + */ + onRevertVersionClick: function DocumentVersions_onRevertVersionClick(version) + { + // Find the version through the index and display the revert dialog for the version + Alfresco.module.getRevertVersionInstance().show( + { + filename: this.latestVersion.name, + nodeRef: this.options.nodeRef, + version: version, + onRevertVersionComplete: + { + fn: this.onRevertVersionComplete, + scope: this + } + }); + }, + + /** + * Fired by the Revert Version component after a successful revert. + * Will display a message and reload the page. + * + * @method onRevertVersionComplete + */ + onRevertVersionComplete: function DocumentVersions_onRevertVersionComplete() + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.revertComplete") + }); + + // MNT-9235: Firing this event, because 'Alfresco.WebPreview' module + // is isolated and this action modifies content of current node + // without reloading of the page (ALF-6621)... + YAHOO.Bubbling.fire("previewChangedEvent"); + + // Fire metadatarefresh so components may refresh themselves + YAHOO.Bubbling.fire("metadataRefresh", {}); + }, + + /** + * Called when a "onViewHistoricPropertiesClick" link has been clicked for a version. + * Will display the Properties dialogue for that version. + * + * @method onViewHistoricPropertiesClick + * @param version + */ + onViewHistoricPropertiesClick: function DocumentVersions_onViewHistoricPropertiesClick(nodeRef) + { + + // Call the Hictoric Properties Viewer Module + Alfresco.module.getHistoricPropertiesViewerInstance().show( + { + filename: this.latestVersion.name, + currentNodeRef: this.options.nodeRef, + latestVersion: this.latestVersion, + nodeRef: nodeRef + }); + + }, + + + + /** + * Called when the "onUploadNewVersionClick" link has been clicked. + * Will display the upload dialog in new version mode. + * + * @method onUploadNewVersionClick + */ + onUploadNewVersionClick: function DocumentVersions_onUploadNewVersionClick() + { + var jsNode = new Alfresco.util.Node(this.options.documentDetails.item.node); + + if (!this.modules.fileUpload) + { + this.modules.fileUpload = Alfresco.getFileUploadInstance(); + } + + var current = this.latestVersion, + displayName = current.name, + extensions = "*"; + + if (displayName && new RegExp(/[^\.]+\.[^\.]+/).exec(displayName)) + { + // Only add a filtering extension if filename contains a name and a suffix + extensions = "*" + displayName.substring(displayName.lastIndexOf(".")); + } + + this.modules.fileUpload.show( + { + siteId: this.options.siteId, + containerId: this.options.containerId, + updateNodeRef: this.options.nodeRef, + updateFilename: displayName, + updateVersion: current.label, + overwrite: true, + suppressRefreshEvent: true, + filter: [ + { + description: this.msg("label.filter-description", displayName), + extensions: extensions + }], + mode: this.modules.fileUpload.MODE_SINGLE_UPDATE, + onFileUploadComplete: + { + fn: this.onNewVersionUploadComplete, + scope: this + }, + newVersion: true, + jsNode: jsNode + }); + }, + + /** + * Called when the upload new version dialog is finished uploading the new version. + * Will display succes or failure and repload the page if everything went ok. + * + * @method onNewVersionUploadComplete + */ + onNewVersionUploadComplete: function DocumentVersions_onNewVersionUploadComplete(complete) + { + + if (complete.failed.length == 0 && complete.successful.length > 0) + { + Alfresco.Share.postActivity(this.options.siteId, "org.alfresco.documentlibrary.file-updated", complete.successful[0].fileName, "document-details?nodeRef="+complete.successful[0].nodeRef, + { + fileName: complete.successful[0].fileName, + nodeRef: complete.successful[0].nodeRef + + }); + + // ALF-13561 fix, refresh page using correct nodeRef + YAHOO.lang.later(0, this, function() + { + window.location = window.location.href.split("?")[0] + "?nodeRef=" + complete.successful[0].nodeRef; + }); + } + }, + + /** + * Refresh component in response to metadataRefresh event + * + * @method doRefresh + */ + doRefresh: function DocumentVersions_doRefresh() + { + YAHOO.Bubbling.unsubscribe("metadataRefresh", this.doRefresh, this); + this.refresh('components/document-details/document-versions?nodeRef={nodeRef}' + (this.options.siteId ? '&site={siteId}' : '')); + } + }); +})(); diff --git a/share/src/main/webapp/components/document-details/document-workflows.css b/share/src/main/webapp/components/document-details/document-workflows.css new file mode 100644 index 0000000000..033af77093 --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-workflows.css @@ -0,0 +1,37 @@ +.document-workflows h2 .edit +{ + background-image: url(../documentlibrary/actions/document-assign-workflow-16.png); +} + +.document-workflows .workflow img +{ + float: left; + margin-top: 0.2em; + min-height: 3em; + padding-right: 1em; + line-height: 3em; + text-align: center; +} + +.document-workflows .workflow +{ + padding: 0.5em 0.5em 1em; + margin-bottom: 0.5em; + border-bottom: 1px dashed #ddd; +} + +.document-workflows .workflow-last +{ + border-bottom: medium none; + margin-bottom: 0; +} + +.document-workflows .workflow .details +{ + margin-left: 2em; +} + +.document-workflows .workflow .title +{ + margin-top: 0.3em; +} diff --git a/share/src/main/webapp/components/document-details/document-workflows.js b/share/src/main/webapp/components/document-details/document-workflows.js new file mode 100644 index 0000000000..46df844d4b --- /dev/null +++ b/share/src/main/webapp/components/document-details/document-workflows.js @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document Details WOrkflow component. + * + * @namespace Alfresco + * @class Alfresco.DocumentWorkflows + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $siteURL = Alfresco.util.siteURL; + + /** + * DocumentWorkflows constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocumentWorkflows} The new component instance + * @constructor + */ + Alfresco.DocumentWorkflows = function DocumentWorkflows_constructor(htmlId) + { + Alfresco.DocumentWorkflows.superclass.constructor.call(this, "Alfresco.DocumentWorkflows", htmlId, []); + return this; + }; + + YAHOO.extend(Alfresco.DocumentWorkflows, Alfresco.component.Base, + { + options: + { + /** + * Reference to the current document + * + * @property nodeRef + * @type string + */ + nodeRef: null, + + /** + * Current siteId, if any. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * Reference to the parent which will be used when POSTing to the start workflow page. + * + * @property destination + * @type string + */ + destination: null + }, + + /** + * Assign Workflow click handler + * + * @method onAssignWorkflowClick + */ + onAssignWorkflowClick: function DocumentWorkflows_onAssignWorkflowClick() + { + Alfresco.util.navigateTo($siteURL("start-workflow"), "POST", + { + selectedItems: this.options.nodeRef, + destination: this.options.destination + }); + } + }); +})(); diff --git a/share/src/main/webapp/components/document-details/images/document-download-16.png b/share/src/main/webapp/components/document-details/images/document-download-16.png new file mode 100644 index 0000000000..961de1cd9d Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/document-download-16.png differ diff --git a/share/src/main/webapp/components/document-details/images/document-upload-new-version-16.png b/share/src/main/webapp/components/document-details/images/document-upload-new-version-16.png new file mode 100644 index 0000000000..6f0a2b879e Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/document-upload-new-version-16.png differ diff --git a/share/src/main/webapp/components/document-details/images/document-view-metadata-16.png b/share/src/main/webapp/components/document-details/images/document-view-metadata-16.png new file mode 100644 index 0000000000..7297034dde Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/document-view-metadata-16.png differ diff --git a/share/src/main/webapp/components/document-details/images/publish-16.png b/share/src/main/webapp/components/document-details/images/publish-16.png new file mode 100644 index 0000000000..5da3e59d96 Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/publish-16.png differ diff --git a/share/src/main/webapp/components/document-details/images/revert-16.png b/share/src/main/webapp/components/document-details/images/revert-16.png new file mode 100644 index 0000000000..ed6a814570 Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/revert-16.png differ diff --git a/share/src/main/webapp/components/document-details/images/status-CANCELLED.png b/share/src/main/webapp/components/document-details/images/status-CANCELLED.png new file mode 100644 index 0000000000..94e76ae0a5 Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/status-CANCELLED.png differ diff --git a/share/src/main/webapp/components/document-details/images/status-COMPLETED.png b/share/src/main/webapp/components/document-details/images/status-COMPLETED.png new file mode 100644 index 0000000000..055b714c2c Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/status-COMPLETED.png differ diff --git a/share/src/main/webapp/components/document-details/images/status-FAILED.png b/share/src/main/webapp/components/document-details/images/status-FAILED.png new file mode 100644 index 0000000000..b948e85fb5 Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/status-FAILED.png differ diff --git a/share/src/main/webapp/components/document-details/images/status-IN_PROGRESS.png b/share/src/main/webapp/components/document-details/images/status-IN_PROGRESS.png new file mode 100644 index 0000000000..47d87744f6 Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/status-IN_PROGRESS.png differ diff --git a/share/src/main/webapp/components/document-details/images/status-SCHEDULED.png b/share/src/main/webapp/components/document-details/images/status-SCHEDULED.png new file mode 100644 index 0000000000..47262e3541 Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/status-SCHEDULED.png differ diff --git a/share/src/main/webapp/components/document-details/images/unpublish-16.png b/share/src/main/webapp/components/document-details/images/unpublish-16.png new file mode 100644 index 0000000000..8da0cd727f Binary files /dev/null and b/share/src/main/webapp/components/document-details/images/unpublish-16.png differ diff --git a/share/src/main/webapp/components/document-details/path.css b/share/src/main/webapp/components/document-details/path.css new file mode 100644 index 0000000000..4d4372cef2 --- /dev/null +++ b/share/src/main/webapp/components/document-details/path.css @@ -0,0 +1,98 @@ +.path-nav +{ + padding: 8px; + padding-left: 10px; + border-bottom: 1px solid #b6b6b6; + margin-right: -10px; + margin-left: -10px; +} + +.path-nav .heading +{ + font-weight: bold; + font-size: 100%; + color: #8e8e8e; +} + +.path-nav .path-link +{ + color: #112d4a; + font-size: 100%; + line-height: 1.4em; +} + +.path-nav span.folder +{ + background-image: url(../documentlibrary/images/folder-open-16.png); + background-position: left 50%; + background-repeat: no-repeat; + padding: 2px 0 2px 20px; +} + +.path-nav span.self +{ + background-image: url(../documentlibrary/images/folder-closed-16.png); + background-position: left 50%; + background-repeat: no-repeat; + padding: 2px 0 2px 20px; +} + +.path-nav .separator +{ + border: medium none; + padding: 0 0.5em; +} + +.status-banner +{ + background-color: #ffffe0; + clear: left; + color: #888; + font-weight: bold; + margin: 0 -10px; + padding: 4px 0px; + text-align: center; +} + +.status-banner span +{ + background-repeat: no-repeat; + line-height: 1.5em; + padding-left: 20px; +} + +.status-banner .editing +{ + background-image: url(../documentlibrary/images/editing-indicator-16.png); +} +.status-banner .lock-owner +{ + background-image: url(../documentlibrary/images/lock-owner-indicator-16.png); +} +.status-banner .locked +{ + background-image: url(../documentlibrary/images/locked-indicator-16.png); +} + +.icon-type +{ + border-bottom: 1px solid #ccc; + line-height: 48px; + margin-right: -10px; + margin-left: -10px; + min-height: 48px; + padding: 0.5em 1em; +} + +.icon-type img +{ + vertical-align: middle; +} + +.icon-type .type +{ + font-size: 131%; + padding-left: 1em; + position: relative; + top: 3px; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/document-details/path.js b/share/src/main/webapp/components/document-details/path.js new file mode 100644 index 0000000000..421e8c7553 --- /dev/null +++ b/share/src/main/webapp/components/document-details/path.js @@ -0,0 +1,263 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document and Folder path component. + * + * @namespace Alfresco + * @class Alfresco.component.Path + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths, + $siteURL = Alfresco.util.siteURL, + $userProfile = Alfresco.util.userProfileLink; + + /** + * Path constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.component.Path} The new Path instance + * @constructor + */ + Alfresco.component.Path = function(htmlId) + { + Alfresco.component.Path.superclass.constructor.call(this, "Alfresco.component.Path", htmlId); + + /* Decoupled event listeners */ + YAHOO.Bubbling.on("documentDetailsAvailable", this.onDocumentDetailsAvailable, this); + YAHOO.Bubbling.on("folderDetailsAvailable", this.onFolderDetailsAvailable, this); + YAHOO.Bubbling.on("nodeDetailsAvailable", this.onNodeDetailsAvailable, this); + + return this; + }; + + YAHOO.extend(Alfresco.component.Path, Alfresco.component.Base, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Root page to create links to. + * + * @property rootPage + * @type string + * @default "documentlibrary" + */ + rootPage: "documentlibrary", + + /** + * Root label ID. The I18N property of the document library root container. + * + * @property rootLabelId + * @type string + * @default "path.documents" + */ + rootLabelId: "path.documents", + + /** + * Flag indicating whether to show folder icon type. + * + * @property showIconType + * @type boolean + * @default: true + */ + showIconType: true + }, + + /** + * Event handler called when the "documentDetailsAvailable" event is received + * + * @method: onDocumentDetailsAvailable + */ + onDocumentDetailsAvailable: function Path_onDocumentDetailsAvailable(layer, args) + { + var docData = args[1].documentDetails, + pathHtml, + rootLink = this.options.rootPage, + pathUrl = "", + folders = [], + href; + + var path = docData.location.path; + + // Document Library root node + if (path.length < 2) + { + pathHtml = '' + this.msg(this.options.rootLabelId) + ''; + } + else + { + pathHtml = '' + this.msg(this.options.rootLabelId) + ''; + folders = path.substring(1, path.length).split("/"); + + if (folders.length > 0) + { + pathHtml += ' > '; + } + + for (var x = 0, y = folders.length; x < y; x++) + { + pathUrl += "/" + folders[x]; + href = rootLink + (y - x < 2 ? "?file=" + encodeURIComponent(docData.fileName) + "&path=" : "?path=") + encodeURIComponent(pathUrl); + pathHtml += '' + $html(folders[x]) + ''; + + if (y - x > 1) + { + pathHtml += ' > '; + } + } + } + + Dom.setStyle(this.id + "-defaultPath", "display", "none"); + Dom.get(this.id + "-path").innerHTML = pathHtml; + + Dom.addClass(this.id + "-status", "hidden"); + + if (docData.custom && (docData.custom.isWorkingCopy || docData.custom.hasWorkingCopy)) + { + var bannerMsg, bannerStatus; + + if (docData.lockedByUser && docData.lockedByUser !== "") + { + var lockedByLink = $userProfile(docData.lockedByUser, docData.lockedBy, 'class="theme-color-1"'); + + /* Working Copy handling */ + if (docData.lockedByUser === Alfresco.constants.USERNAME) + { + // Locked / Working Copy handling + bannerStatus = docData.actionSet === "lockOwner" ? "lock-owner" : "editing"; + bannerMsg = this.msg("banner." + bannerStatus); + } + else + { + bannerStatus = "locked"; + bannerMsg = this.msg("banner.locked", lockedByLink); + } + } + + if (bannerMsg) + { + Dom.get(this.id + "-status").innerHTML = '' + bannerMsg + ''; + Dom.removeClass(this.id + "-status", "hidden"); + } + + YAHOO.Bubbling.fire("recalculatePreviewLayout"); + } + }, + + /** + * Event handler called when the "folderDetailsAvailable" event is received + * + * @method: onFolderDetailsAvailable + */ + onFolderDetailsAvailable: function Path_onFolderDetailsAvailable(layer, args) + { + var folderData = args[1].folderDetails, + pathHtml = "", + rootLink = this.options.rootPage, + pathUrl = "/", + folders = [], + href; + + var path = folderData.location.path; + + // Document Library root node + if (path == "/" && folderData.location.file.length > 0) + { + pathHtml = '' + this.msg(this.options.rootLabelId) + ''; + } + else + { + pathHtml = '' + this.msg(this.options.rootLabelId) + ''; + } + + path = $combine(path, folderData.location.file); + if (path.length > 1) + { + folders = path.substring(1, path.length).split("/"); + pathHtml += ' > '; + + for (var x = 0, y = folders.length; x < y; x++) + { + pathUrl += folders[x]; + href = rootLink + (y - x == 2 ? "?file=" + encodeURIComponent(folderData.fileName) + "&path=" : "?path=") + encodeURIComponent(pathUrl); + pathHtml += '' + $html(folders[x]) + ''; + + if (y - x > 1) + { + pathHtml += ' > '; + pathUrl += "/"; + } + } + } + + Dom.setStyle(this.id + "-defaultPath", "display", "none"); + Dom.get(this.id + "-path").innerHTML = pathHtml; + + if (this.options.showIconType) + { + Alfresco.util.populateHTML( + [this.id + "-iconType", YAHOO.lang.substitute('{type}', + { + iconContext: Alfresco.constants.URL_RESCONTEXT + "components/documentlibrary/images/", + icon: folderData.type, + type: this.msg("type." + folderData.type, $html(folderData.displayName)) + })] + ); + } + }, + + /** + * Event handler called when the "nodeDetailsAvailable" event is received + * + * @method: onNodeDetailsAvailable + */ + onNodeDetailsAvailable: function Path_onNodeDetailsAvailable(layer, args) + { + var nodeData = args[1].nodeDetails, + newArgs = args; + + if (nodeData.isFolder) + { + newArgs[1].folderDetails = nodeData; + this.onFolderDetailsAvailable(layer, newArgs); + } + else + { + newArgs[1].documentDetails = nodeData; + this.onDocumentDetailsAvailable(layer, newArgs); + } + } + }); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/actions-util.js b/share/src/main/webapp/components/documentlibrary/actions-util.js new file mode 100644 index 0000000000..9202d422d9 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/actions-util.js @@ -0,0 +1,42 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document Library and Document Details Actions Utility Methods + * + * @namespace Alfresco.util + */ + +(function() +{ + /** + * YUI Library aliases + */ + var Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $combine = Alfresco.util.combinePaths, + $relativeTime = Alfresco.util.relativeTime; + + YAHOO.lang.augmentObject(Alfresco.util, + { + }, true); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/actions.css b/share/src/main/webapp/components/documentlibrary/actions.css new file mode 100644 index 0000000000..f267d7f5b3 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/actions.css @@ -0,0 +1,45 @@ +.doclist .action-set div +{ + margin: 0; +} + +.doclist a.action-link, +.doclist a.simple-link, +.doclist a.show-more +{ + background-position: 4px 1px; + background-repeat: no-repeat; + border: 1px solid transparent; + display: block; + min-height: 16px; + padding: 2px 0 2px 24px; +} + +.doclist div.action-set a:active, +.doclist div.action-set a:hover, +.doclist div.action-set .highlighted +{ + background-color: #fff; + border: 1px solid #2b6eb5; + text-decoration: none; +} + +.requestDeleteRemote-checkBox +{ + margin-top: 10px; +} + +.requestDeleteRemote-text +{ + position: relative; + right: -5px; + top: -2px; +} + +.folder-actions .doclist .action-set div.alf-action-group-end, +.document-actions .doclist .action-set div.alf-action-group-end +{ + padding-bottom: 0.5em; + margin-bottom: 0.2em; + border-bottom: 1px solid #BFBFBF; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/actions.js b/share/src/main/webapp/components/documentlibrary/actions.js new file mode 100644 index 0000000000..f8891825c6 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/actions.js @@ -0,0 +1,2203 @@ +/** + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Document Library Actions module + * + * @namespace Alfresco.doclib + * @class Alfresco.doclib.Actions + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths, + $siteURL = Alfresco.util.siteURL, + $isValueSet = Alfresco.util.isValueSet; + + /** + * Alfresco.doclib.Actions implementation + */ + Alfresco.doclib.Actions = {}; + Alfresco.doclib.Actions.prototype = + { + /** + * Current actions view type: set by owning class to "browse" or "details". + * + * @property actionsView + * @type string + */ + actionsView: null, + + /** + * Register a Document Library action via Bubbling event + * + * @method onRegisterAction + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (actionName, fn) + */ + onRegisterAction: function dlA_onRegisterAction(layer, args) + { + var obj = args[1]; + if (obj && $isValueSet(obj.actionName) && $isValueSet(obj.fn)) + { + this.registerAction(obj.actionName, obj.fn); + } + else + { + Alfresco.logger.error("DL_onRegisterAction: Custom action registion invalid: " + obj); + } + }, + + /** + * Register a Document Library action + * + * @method registerAction + * @param actionName {string} Action name + * @param fn {function} Handler function + * @return {boolean} Success status of registration + */ + registerAction: function DL_registerAction(actionName, fn) + { + if ($isValueSet(actionName) && $isValueSet(fn)) + { + this.constructor.prototype[actionName] = fn; + return true; + } + return false; + }, + + /** + * Renders a single action for a given record. + * Callers should then use + *
    +       *    YAHOO.lang.substitute(actionHTML, this.getActionUrls(record))
    +       * 
    + * on the final concatenated HTML for multiple actions to populate placeholder URLs. + * + * @method renderAction + * @param p_action {object} Object literal representing the node + * @param p_record {string} Optional siteId override for site-based locations + * @return {string} HTML containing action markup + */ + renderAction: function dlA_renderAction(p_action, p_record) + { + var urlContext = Alfresco.constants.URL_RESCONTEXT + "components/documentlibrary/actions/", + iconStyle = 'style="background-image:url(' + urlContext + '{icon}-16.png)" ', + actionTypeMarkup = + { + "link": '', + "pagelink": '', + "javascript": '' + }; + + // Store quick look-up for client-side actions + p_record.actionParams[p_action.id] = p_action.params; + + var markupParams = + { + "id": p_action.id, + "icon": p_action.icon, + "label": $html(Alfresco.util.substituteDotNotation(this.msg(p_action.label), p_record)), + "additionalCssClasses" : p_action.additionalCssClasses ? " " + p_action.additionalCssClasses : "" + }; + + if (p_action.lastActionInSubgroup) + { + markupParams.additionalCssClasses = " alf-action-group-end"; + } + + // Parameter substitution for each action type + if (p_action.type === "link") + { + if (p_action.params.href) + { + markupParams.href = Alfresco.util.substituteDotNotation(p_action.params.href, p_record); + markupParams.target = p_action.params.target ? "target=\"" + p_action.params.target + "\"" : ""; + } + else + { + Alfresco.logger.warn("Action configuration error: Missing 'href' parameter for actionId: ", p_action.id); + } + } + else if (p_action.type === "pagelink") + { + if (p_action.params.page) + { + markupParams.pageUrl = Alfresco.util.substituteDotNotation(p_action.params.page, p_record); + + /** + * If the page starts with a "{" character we're going to assume it's a placeholder variable + * that will be resolved by the getActionsUrls() function. In which case, we do not want to + * use the $siteURL() function here as that will result in a double-prefix. + */ + if (p_action.params.page.charAt(0) !== "{") + { + var recordSiteName = $isValueSet(p_record.location.site) ? p_record.location.site.name : null; + markupParams.pageUrl = $siteURL(markupParams.pageUrl, + { + site: recordSiteName + }); + } + } + else + { + Alfresco.logger.warn("Action configuration error: Missing 'page' parameter for actionId: ", p_action.id); + } + } + else if (p_action.type === "javascript") + { + if (p_action.params["function"]) + { + markupParams.jsfunction = p_action.params["function"]; + } + else + { + Alfresco.logger.warn("Action configuration error: Missing 'function' parameter for actionId: ", p_action.id); + } + } + + return YAHOO.lang.substitute(actionTypeMarkup[p_action.type], markupParams); + }, + + /** + * The urls to be used when creating links in the action cell + * + * @method getActionUrls + * @param recordData {object} Object literal representing the node + * @param siteId {string} Optional siteId override for site-based locations + * @return {object} Object literal containing URLs to be substituted in action placeholders + */ + getActionUrls: function dlA_getActionUrls(record, siteId) + { + var jsNode = record.jsNode, + nodeRef = jsNode.isLink ? jsNode.linkedNode.nodeRef : jsNode.nodeRef, + nodeRef = jsNode.isLink && !$isValueSet(nodeRef) ? "invalidlink" : nodeRef, + strNodeRef = nodeRef.toString(), + nodeRefUri = nodeRef.uri, + contentUrl = jsNode.contentURL, + workingCopy = record.workingCopy || {}, + recordSiteId = $isValueSet(record.location.site) ? record.location.site.name : null, + fnPageURL = Alfresco.util.bind(function(page) + { + return Alfresco.util.siteURL(page, + { + site: YAHOO.lang.isString(siteId) ? siteId : recordSiteId + }); + }, this), + actionUrls = + { + downloadUrl: $combine(Alfresco.constants.PROXY_URI, contentUrl) + "?a=true", + viewUrl: $combine(Alfresco.constants.PROXY_URI, contentUrl) + "\" target=\"_blank", + documentDetailsUrl: fnPageURL("document-details?nodeRef=" + strNodeRef), + folderDetailsUrl: fnPageURL("folder-details?nodeRef=" + strNodeRef), + editMetadataUrl: fnPageURL("edit-metadata?nodeRef=" + strNodeRef), + inlineEditUrl: fnPageURL("inline-edit?nodeRef=" + strNodeRef), + managePermissionsUrl: fnPageURL("manage-permissions?nodeRef=" + strNodeRef), + manageTranslationsUrl: fnPageURL("manage-translations?nodeRef=" + strNodeRef), + workingCopyUrl: fnPageURL("document-details?nodeRef=" + (workingCopy.workingCopyNodeRef || strNodeRef)), + workingCopySourceUrl: fnPageURL("document-details?nodeRef=" + (workingCopy.sourceNodeRef || strNodeRef)) + }; + + actionUrls.sourceRepositoryUrl = this.viewInSourceRepositoryURL(record, actionUrls) + "\" target=\"_blank"; + + return actionUrls; + }, + + + /** + * Helper for actions of type "javascript" to get the node's action descriptor with params resolved (unless resolve is set to false). + * + * @method getAction + * @param record {object} Object literal representing one file or folder to be actioned + * @param owner {HTMLElement} The action html element + * @param resolve {Boolean} (Optional) Set to false if the action param's {} shouldn't get resolved + */ + getAction: function dlA_getAction(record, owner, resolve) + { + // Sets the actionId to the first class name rather than the full class name which can include additional classes + var actionId = owner.className.match(/([^\s])*/)[0]; + var action = Alfresco.util.findInArray(record.actions, actionId, "id") || {}; + + if (resolve === false) + { + // Return action without resolved parameters + return action; + } + else + { + // Resolve action's parameters before returning them + action = Alfresco.util.deepCopy(action); + var params = action.params || {}; + for (var key in params) + { + params[key] = YAHOO.lang.substitute(params[key], record, function getActionParams_substitute(p_key, p_value, p_meta) + { + return Alfresco.util.findValueByDotNotation(record, p_key); + }); + } + return action; + } + }, + + /** + * Tries to get a common parent nodeRef for an action that requires one. + * + * @method getParentNodeRef + * @param record {object} Object literal representing one file or folder to be actioned + * @return {string|null} Parent nodeRef or null + */ + getParentNodeRef: function dlA_getParentNodeRef(record) + { + var nodeRef = null; + + if (YAHOO.lang.isArray(record)) + { + try + { + nodeRef = this.doclistMetadata.parent.nodeRef; + } + catch (e) + { + nodeRef = null; + } + + if (nodeRef === null) + { + for (var i = 1, j = record.length, sameParent = true; i < j && sameParent; i++) + { + sameParent = (record[i].parent.nodeRef == record[i - 1].parent.nodeRef) + } + + nodeRef = sameParent ? record[0].parent.nodeRef : this.doclistMetadata.container; + } + } + else + { + nodeRef = record.parent.nodeRef; + } + + return nodeRef; + }, + + /** + * Record metadata. + * + * @override + * @method onActionDetails + * @param record {object} Object literal representing one file or folder to be actioned + */ + onActionDetails: function dlA_onActionDetails(record) + { + var scope = this, + nodeRef = record.nodeRef, + jsNode = record.jsNode; + + // Intercept before dialog show + var doBeforeDialogShow = function dlA_onActionDetails_doBeforeDialogShow(p_form, p_dialog) + { + // Dialog title + var fileSpan = '' + $html(record.displayName) + ''; + + Alfresco.util.populateHTML( + [ p_dialog.id + "-dialogTitle", scope.msg("edit-details.title", fileSpan) ] + ); + + // Edit metadata link button + this.widgets.editMetadata = Alfresco.util.createYUIButton(p_dialog, "editMetadata", null, + { + type: "link", + label: scope.msg("edit-details.label.edit-metadata"), + href: $siteURL("edit-metadata?nodeRef=" + nodeRef) + }); + }; + + var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&mode={mode}&submitType={submitType}&formId={formId}&showCancelButton=true", + { + itemKind: "node", + itemId: nodeRef, + mode: "edit", + submitType: "json", + formId: "doclib-simple-metadata" + }); + + // Using Forms Service, so always create new instance + var editDetails = new Alfresco.module.SimpleDialog(this.id + "-editDetails-" + Alfresco.util.generateDomId()); + + editDetails.setOptions( + { + width: "auto", + zIndex: 1001, // This needs to be high so it works in full screen mode + templateUrl: templateUrl, + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + }, + onSuccess: + { + fn: function dlA_onActionDetails_success(response) + { + // Reload the node's metadata + var webscriptPath = "components/documentlibrary/data"; + if ($isValueSet(this.options.siteId)) + { + webscriptPath += "/site/" + encodeURIComponent(this.options.siteId) + } + Alfresco.util.Ajax.request( + { + url: $combine(Alfresco.constants.URL_SERVICECONTEXT, webscriptPath, "/node/", jsNode.nodeRef.uri) + "?view=" + this.actionsView, + successCallback: + { + fn: function dlA_onActionDetails_refreshSuccess(response) + { + var record = response.json.item + record.jsNode = new Alfresco.util.Node(response.json.item.node); + + // Fire "renamed" event + YAHOO.Bubbling.fire(record.node.isContainer ? "folderRenamed" : "fileRenamed", + { + file: record + }); + + // Fire "tagRefresh" event + YAHOO.Bubbling.fire("tagRefresh"); + + // Display success message + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.details.success") + }); + + // Refresh the document list... + this._updateDocList.call(this); + }, + scope: this + }, + failureCallback: + { + fn: function dlA_onActionDetails_refreshFailure(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.details.failure") + }); + }, + scope: this + } + }); + }, + scope: this + }, + onFailure: + { + fn: function dLA_onActionDetails_failure(response) + { + var failureMsg = this.msg("message.details.failure"); + if (response.json && (response.json.message.indexOf("Failed to persist field 'prop_cm_name'") !== -1 || response.json.message.indexOf("already exists") !== -1)) + { + failureMsg = this.msg("message.details.failure.name"); + } + Alfresco.util.PopupManager.displayMessage( + { + text: failureMsg, + zIndex: editDetails.zIndex + }, editDetails.dialog.body); + }, + scope: this + } + }).show(); + }, + + /** + * Locate record. + * + * @method onActionLocate + * @param record {object} Object literal representing one file or folder to be actioned + */ + onActionLocate: function dlA_onActionLocate(record) + { + var jsNode = record.jsNode, + path = record.location.path, + repoPath = record.location.repoPath, + file, + recordSiteName = $isValueSet(record.location.site) ? record.location.site.name : null; + if (jsNode.isLink) + { + file = $isValueSet(jsNode.linkedNode.properties) ? jsNode.linkedNode.properties.name : null; + if(file === null) { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.actions.failure.locate") + }); + } + } + else + { + file = record.displayName; + } + + if ($isValueSet(this.options.siteId) && recordSiteName !== this.options.siteId) + { + window.location = $siteURL((recordSiteName === null ? "repository" : "documentlibrary") + "?file=" + encodeURIComponent(file) + "&path=" + encodeURIComponent(path), + { + site: recordSiteName + }); + } + else if ((Alfresco.constants.PAGECONTEXT == "shared" && repoPath != "/Shared") || (Alfresco.constants.PAGECONTEXT == "mine" && repoPath != "/")) + { + window.location = "/share/page/repository?file=" + encodeURIComponent(file) + "&path=" + encodeURIComponent(repoPath); + } + else + { + this.options.highlightFile = file; + + // Change active filter to path + YAHOO.Bubbling.fire("changeFilter", + { + filterId: "path", + filterData: path + }); + } + }, + + /** + * Delete record. + * + * @method onActionDelete + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionDelete: function dlA_onActionDelete(record) + { + var me = this, + jsNode = record.jsNode, + content = jsNode.isContainer ? "folder" : "document", + displayName = record.displayName, + zIndex = 0; + + var deleteRemoteFile = ""; + + var displayPromptText = this.msg("message.confirm.delete", displayName); + + if (this.fullscreen !== undefined && ( this.fullscreen.isWindowOnly || Dom.hasClass(this.id, 'alf-fullscreen'))) + { + zIndex = 1000; + } + + //MNT-11084 : Full screen/window view: Actions works incorrectly; + var parent = undefined; + if (Dom.hasClass(this.id, 'alf-true-fullscreen')) + { + parent = Dom.get(this.id); + } + + var buttons = + [ + { + text: this.msg("button.delete"), + handler: function dlA_onActionDelete_delete() + { + this.destroy(); + me._onActionDeleteConfirm.call(me, record); + } + }, + { + text: this.msg("button.cancel"), + handler: function dlA_onActionDelete_cancel() + { + this.destroy(); + }, + isDefault: true + } + ]; + + + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("actions." + content + ".delete"), + + text: displayPromptText + deleteRemoteFile, + noEscape: true, + buttons: buttons, + zIndex: zIndex + }, parent); + }, + + /** + * Delete record confirmed. + * + * @method _onActionDeleteConfirm + * @param record {object} Object literal representing the file or folder to be actioned + * @private + */ + _onActionDeleteConfirm: function dlA__onActionDeleteConfirm(record) + { + var jsNode = record.jsNode, + path = record.location.path, + fileName = record.location.file, + filePath = $combine(path, fileName), + displayName = record.displayName, + nodeRef = jsNode.nodeRef, + parentNodeRef = this.getParentNodeRef(record); + var display = + { + zIndex: this.fullscreen !== undefined && ( Dom.hasClass(this.id, 'alf-true-fullscreen') || Dom.hasClass(this.id, 'alf-fullscreen')) ? 1000 : 0, + parentElement: Dom.hasClass(this.id, 'alf-true-fullscreen') ? Dom.get(this.id) : undefined + } + + this.modules.actions.genericAction( + { + success: + { + activity: + { + siteId: this.options.siteId, + activityType: jsNode.isContainer ? "folder-deleted" : "file-deleted", + page: "documentlibrary", + activityData: + { + fileName: fileName, + path: path, + nodeRef: nodeRef.toString(), + parentNodeRef: parentNodeRef.toString() + } + }, + event: + { + name: jsNode.isContainer ? "folderDeleted" : "fileDeleted", + obj: + { + path: filePath + } + }, + display : display, + message: this.msg("message.delete.success", displayName), + callback: + { + fn: function successDeleteCallback(response, obj) + { + if (this.totalRecords) + { + this.totalRecords -= response.json.successCount; + } + }, + scope: this + } + }, + failure: + { + display : display, + message: this.msg("message.delete.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.DELETE, + name: "file/node/{nodeRef}", + params: + { + nodeRef: nodeRef.uri + } + }, + wait: + { + message: this.msg("message.multiple-delete.please-wait") + } + }); + }, + + /** + * Edit Offline. + * NOTE: Placeholder only, clients MUST implement their own editOffline action + * + * @method onActionEditOffline + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionEditOffline: function dlA_onActionEditOffline(record) + { + Alfresco.logger.error("onActionEditOffline", "Abstract implementation not overridden"); + }, + + /** + * Valid online edit mimetypes, mapped to application ProgID. + * Currently allowed are Microsoft Office 2003 and 2007 mimetypes for Excel, PowerPoint and Word only + * + * @property onlineEditMimetypes + * @type object + */ + onlineEditMimetypes: + { + "application/msword": "Word.Document", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "Word.Document", + "application/vnd.ms-word.document.macroenabled.12": "Word.Document", + "application/vnd.openxmlformats-officedocument.wordprocessingml.template": "Word.Document", + "application/vnd.ms-word.template.macroenabled.12": "Word.Document", + "application/rtf":"Word.Document", + + "application/vnd.ms-powerpoint": "PowerPoint.Slide", + "application/vnd.openxmlformats-officedocument.presentationml.presentation": "PowerPoint.Slide", + "application/vnd.ms-powerpoint.presentation.macroenabled.12": "PowerPoint.Slide", + "application/vnd.openxmlformats-officedocument.presentationml.slideshow": "PowerPoint.Slide", + "application/vnd.ms-powerpoint.slideshow.macroenabled.12": "PowerPoint.Slide", + "application/vnd.openxmlformats-officedocument.presentationml.template": "PowerPoint.Slide", + "application/vnd.ms-powerpoint.template.macroenabled.12": "PowerPoint.Slide", + "application/vnd.ms-powerpoint.addin.macroenabled.12": "PowerPoint.Slide", + "application/vnd.openxmlformats-officedocument.presentationml.slide": "PowerPoint.Slide", + "application/vnd.ms-powerpoint.slide.macroEnabled.12": "PowerPoint.Slide", + + "application/vnd.ms-excel": "Excel.Sheet", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "Excel.Sheet", + "application/vnd.openxmlformats-officedocument.spreadsheetml.template": "Excel.Sheet", + "application/vnd.ms-excel.sheet.macroenabled.12": "Excel.Sheet", + "application/vnd.ms-excel.template.macroenabled.12": "Excel.Sheet", + "application/vnd.ms-excel.addin.macroenabled.12": "Excel.Sheet", + "application/vnd.ms-excel.sheet.binary.macroenabled.12": "Excel.Sheet", + "application/vnd.visio": "Visio.Drawing", + "application/vnd.visio2013": "Visio.Drawing", + "application/vnd.ms-visio.drawing.macroenabled.main+xml": "Visio.Drawing", + "application/vnd.ms-visio.drawing.main+xml": "Visio.Drawing", + "application/vnd.ms-visio.stencil.macroenabled.main+xml": "Visio.Drawing", + "application/vnd.ms-visio.stencil.main+xml": "Visio.Drawing", + "application/vnd.ms-visio.template.macroenabled.main+xml": "Visio.Drawing", + "application/vnd.ms-visio.template.main+xml": "Visio.Drawing" + }, + + /** + * Edit Online. + * + * @method onActionEditOnline + * @param record {object} Object literal representing file or folder to be actioned + */ + onActionEditOnline: function dlA_onActionEditOnline(record) + { + //MNT-8609 Edit online fails for files which URL is too long + if (!$isValueSet(record.onlineEditUrl)) + { + record.onlineEditUrl = Alfresco.util.onlineEditUrl(this.doclistMetadata.custom.vtiServer, record.location); + } + + + // Check if either the URL's length or the encoded URL's length is greater than 256 (see MNT-13279): + if (record.onlineEditUrl.length > 256 || (encodeURI(record.onlineEditUrl)).length > 256) + { + //Try to use alternate edit online URL: http://{host}:{port}/{context}/_IDX_SITE_{site_uuid}/_IDX_NODE_{document_uuid}/{document_name} + Alfresco.util.Ajax.request( + { + method: Alfresco.util.Ajax.GET, + url: Alfresco.constants.PROXY_URI+"/api/sites/" + record.location.site.name, + successCallback: + { + fn: function(response) + { + var siteUUID = response.json.node.split("/").pop(); + var docUUID = record.nodeRef.split("/").pop(); + record.onlineEditUrl = record.onlineEditUrl.split(record.location.site.name)[0] + "_IDX_SITE_" + siteUUID + "/_IDX_NODE_" + docUUID + "/" + record.displayName; + if (record.onlineEditUrl.length > 256) + { + var ext = record.displayName.split(".").pop(); + var recordName = record.displayName.split(".")[0]; + var exceed = record.onlineEditUrl.length - 256; + record.onlineEditUrl = record.onlineEditUrl.replace(record.displayName, recordName.substring(0, recordName.length - exceed - 1) + "." + ext); + } + if (encodeURI(record.onlineEditUrl).length > 256) + { + // If we get here it might be that the filename contains a lot of space characters that (when converted to %20) + // would lead to a total encoded URL length that's greater than 256 characters. + // Since it's a very rare case we'll just reduce the record's display name (from the URL) + // to a (presumably) safe size of 5 characters plus extension. + var ext = record.displayName.split(".").pop(); + var recordName = record.onlineEditUrl.split("/").pop(); + var recordNameReduced = recordName.split(".")[0].substring(0, 5) + "." + ext; + record.onlineEditUrl = record.onlineEditUrl.replace(recordName, recordNameReduced); + } + this.actionEditOnlineInternal(record); + }, + scope: this + }, + failureCallback: + { + fn: function(response) + { + this.actionEditOnlineInternal(record); + }, + scope: this + } + }); + } + else + { + this.actionEditOnlineInternal(record); + } + }, + + actionEditOnlineInternal: function dlA_onActionEditOnline(record) + { + if (record.onlineEditUrl.length > 256 || encodeURI(record.onlineEditUrl).length > 256) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.edit-online.office.path.failure") + }); + } + else if (this._launchOnlineEditor(record)) + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.edit-online.office.failure") + }); + } + }, + + /** + * Opens the appropriate Microsoft Office application for online editing. + * Supports: Microsoft Office 2003, 2007 & 2010. + * + * @method Alfresco.util.sharePointOpenDocument + * @param record {object} Object literal representing file or folder to be actioned + * @return {boolean} True if the action was completed successfully, false otherwise. + */ + _launchOnlineEditor: function dlA__launchOnlineEditor(record) + { + var controlProgID = "SharePoint.OpenDocuments", + jsNode = record.jsNode, + loc = record.location, + mimetype = jsNode.mimetype, + appProgID = null, + activeXControl = null, + extensionMap = + { + doc: "application/msword", + docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + docm: "application/vnd.ms-word.document.macroenabled.12", + dotx: "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + dotm: "application/vnd.ms-word.template.macroenabled.12", + rtf: "application/rtf", + + vsd: "application/vnd.visio", + vss: "application/vnd.visio", + vst: "application/vnd.visio", + vsdx: "application/vnd.ms-visio.drawing.main+xml", + vsdm: "application/vnd.ms-visio.drawing.macroenabled.main+xml", + vssx: "application/vnd.ms-visio.stencil.main+xml", + vssm: "application/vnd.ms-visio.stencil.macroenabled.main+xml", + vstx: "application/vnd.ms-visio.template.main+xml", + vstm: "application/vnd.ms-visio.template.macroenabled.main+xml", + + ppt: "application/vnd.ms-powerpoint", + pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation", + pptm: "application/vnd.ms-powerpoint.presentation.macroenabled.12", + ppsx: "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + ppsm: "application/vnd.ms-powerpoint.slideshow.macroenabled.12", + potx: "application/vnd.openxmlformats-officedocument.presentationml.template", + potm: "application/vnd.ms-powerpoint.template.macroenabled.12", + ppam: "application/vnd.ms-powerpoint.addin.macroenabled.12", + sldx: "application/vnd.openxmlformats-officedocument.presentationml.slide", + sldm: "application/vnd.ms-powerpoint.slide.macroEnabled.12", + + xls: "application/vnd.ms-excel", + xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + xlsm: "application/vnd.ms-excel.sheet.macroenabled.12", + xltm: "application/vnd.ms-excel.template.macroenabled.12", + xlam: "application/vnd.ms-excel.addin.macroenabled.12", + xlsb: "application/vnd.ms-excel.sheet.binary.macroenabled.12" + }; + + if (!Alfresco.util.validLocationForOnlineEdit(loc)) + { + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("actions.editOnline.invalid", loc.file) + }); + return true; + } + + // Try to resolve the record to an application ProgID; by mimetype first, then file extension. + if (this.onlineEditMimetypes.hasOwnProperty(mimetype)) + { + appProgID = this.onlineEditMimetypes[mimetype]; + } + else + { + var extn = Alfresco.util.getFileExtension(record.location.file); + if (extn !== null) + { + extn = extn.toLowerCase(); + if (extensionMap.hasOwnProperty(extn)) + { + mimetype = extensionMap[extn]; + if (this.onlineEditMimetypes.hasOwnProperty(mimetype)) + { + appProgID = this.onlineEditMimetypes[mimetype]; + } + } + } + } + + if (appProgID !== null) + { + // Ensure we have the record's onlineEditUrl populated + if (!$isValueSet(record.onlineEditUrl)) + { + record.onlineEditUrl = Alfresco.util.onlineEditUrl(this.doclistMetadata.custom.vtiServer, loc); + } + + if (YAHOO.env.ua.ie > 0) + { + return this._launchOnlineEditorIE(controlProgID, record, appProgID); + } + + if ((YAHOO.env.ua.chrome > 0) && !Alfresco.util.isSharePointPluginInstalled()) + { + var extn = Alfresco.util.getFileExtension(loc.file); + if (null !== extn) + { + var protocolHandler = this.getProtocolForFileExtension(extn.toLowerCase()); + return this._launchOnlineEditorChrome(protocolHandler, record.onlineEditUrl); + } + } + + if (Alfresco.util.isSharePointPluginInstalled()) + { + return this._launchOnlineEditorPlugin(record, appProgID); + } + else + { + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("actions.editOnline.failure", loc.file) + }); + return false; + } + } + + // No success in launching application via ActiveX control; launch the WebDAV URL anyway + return window.open(record.onlineEditUrl, "_blank"); + }, + + _launchOnlineEditorChrome: function dlA__launchOnlineEditorChrome(protocolHandler, url) + { + location.href = protocolHandler + ':ofe%7Cu%7C' + url; + }, + + getProtocolForFileExtension: function(fileExtension) + { + var msProtocolNames = + { + 'doc' : 'ms-word', + 'docx' : 'ms-word', + 'docm' : 'ms-word', + 'dot' : 'ms-word', + 'dotx' : 'ms-word', + 'dotm' : 'ms-word', + 'rtf' : 'ms-word', + 'vsd': 'ms-visio', + 'vss': 'ms-visio', + 'vst': 'ms-visio', + 'vsdx': 'ms-visio', + 'vsdm': 'ms-visio', + 'vssx': 'ms-visio', + 'vssm': 'ms-visio', + 'vstx': 'ms-visio', + 'vstm': 'ms-visio', + 'xls' : 'ms-excel', + 'xlsx' : 'ms-excel', + 'xlsb' : 'ms-excel', + 'xlsm' : 'ms-excel', + 'xlt' : 'ms-excel', + 'xltx' : 'ms-excel', + 'xltm' : 'ms-excel', + 'xlsm' : 'ms-excel', + 'ppt' : 'ms-powerpoint', + 'pptx' : 'ms-powerpoint', + 'pot' : 'ms-powerpoint', + 'potx' : 'ms-powerpoint', + 'potm' : 'ms-powerpoint', + 'pptm' : 'ms-powerpoint', + 'potm' : 'ms-powerpoint', + 'pps' : 'ms-powerpoint', + 'ppsx' : 'ms-powerpoint', + 'ppam' : 'ms-powerpoint', + 'ppsm' : 'ms-powerpoint', + 'sldx' : 'ms-powerpoint', + 'sldm' : 'ms-powerpoint', + }; + return msProtocolNames[fileExtension]; + }, + + /** + * Opens the appropriate Microsoft Office application for online editing. + * Supports: Microsoft Office 2003, 2007 & 2010. + * + * @method Alfresco.util.sharePointOpenDocument + * @param record {object} Object literal representing file or folder to be actioned + * @return {boolean} True if the action was completed successfully, false otherwise. + */ + _launchOnlineEditorIE: function dlA__launchOnlineEditorIE(controlProgID, record, appProgID) + { + // Try each version of the SharePoint control in turn, newest first + try + { + if (appProgID === "Visio.Drawing") + throw ("Visio should be invoked using activeXControl.EditDocument2."); + activeXControl = new ActiveXObject(controlProgID + ".3"); + return activeXControl.EditDocument3(window, record.onlineEditUrl, true, appProgID); + } + catch(e) + { + try + { + activeXControl = new ActiveXObject(controlProgID + ".2"); + return activeXControl.EditDocument2(window, record.onlineEditUrl, appProgID); + } + catch(e1) + { + try + { + activeXControl = new ActiveXObject(controlProgID + ".1"); + return activeXControl.EditDocument(record.onlineEditUrl, appProgID); + } + catch(e2) + { + // Do nothing + } + } + } + return false; + }, + + /** + * Opens the appropriate Microsoft Office application for online editing. + * Supports: Microsoft Office 2010 & 2011 for Mac. + * + * @method Alfresco.util.sharePointOpenDocument + * @param record {object} Object literal representing file or folder to be actioned + * @return {boolean} True if the action was completed successfully, false otherwise. + */ + _launchOnlineEditorPlugin: function dlA__launchOnlineEditorPlugin(record, appProgID) + { + var plugin = document.getElementById("SharePointPlugin"); + if (plugin == null && Alfresco.util.isSharePointPluginInstalled()) + { + var pluginMimeType = null; + if (YAHOO.env.ua.webkit && Alfresco.util.isBrowserPluginInstalled("application/x-sharepoint-webkit")) + pluginMimeType = "application/x-sharepoint-webkit"; + else + pluginMimeType = "application/x-sharepoint"; + var pluginNode = document.createElement("object"); + pluginNode.id = "SharePointPlugin"; + pluginNode.type = pluginMimeType; + pluginNode.width = 0; + pluginNode.height = 0; + pluginNode.style.setProperty("visibility", "hidden", ""); + document.body.appendChild(pluginNode); + plugin = document.getElementById("SharePointPlugin"); + + if (!plugin) + { + return false; + } + } + + try + { + if (appProgID === "Visio.Drawing") + throw ("Visio should be invoked using activeXControl.EditDocument2."); + return plugin.EditDocument3(window, record.onlineEditUrl, true, appProgID); + } + catch(e) + { + try + { + return plugin.EditDocument2(window, record.onlineEditUrl, appProgID); + } + catch(e1) + { + try + { + return plugin.EditDocument(record.onlineEditUrl, appProgID); + } + catch(e2) + { + return false; + } + } + } + }, + + /** + * Edit Online with AOS. + * + * @method onActionEditOnlineAos + * @param record {object} Object literal representing file or folder to be actioned + */ + onActionEditOnlineAos: function dlA_onActionEditOnlineAos(record) + { + var internalEditOnlineAos = function dlA_internalEditOnlineAos(response) + { + var jsonNode = JSON.parse(response.serverResponse.responseText); + if (jsonNode) + { + var node = jsonNode.item.node; + if (node.isLocked) + { + var checkedOut = Alfresco.util.arrayContains(node.aspects,"cm:checkedOut"); + var lockOwner = node.properties["cm:lockOwner"]; + var differentLockOwner = lockOwner.userName !== Alfresco.constants.USERNAME; + + // If locked for offline editing, ask for user's confirmation to continue with online editing + if (checkedOut && differentLockOwner) + { + this._onAlreadyLockedConfirmation(record, lockOwner); + } + else if (differentLockOwner) + { + this._onAlreadyOnlineLockedConfirmation(record, lockOwner); + } + else + { + this._triggerEditOnlineAos(record); + } + } + else + { + this._triggerEditOnlineAos(record); + } + } + }; + + // Populate the node details before triggering the action, in case the isLocked state changed + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.PROXY_URI + "slingshot/doclib2/node/" + record.nodeRef.replace('://', '/'), + successCallback: + { + fn: internalEditOnlineAos, + scope: this + } + }); + }, + + _onAlreadyLockedConfirmation: function dlA_onAlreadyLockedConfirmation(record, lockOwner) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg('message.edit-online-aos.edit_offline_locked.title', lockOwner.displayName.length > 0 ? lockOwner.displayName : lockOwner.userName ), + text: this.msg('message.edit-online-aos.edit_offline_locked.message'), + buttons: [ + { + text: this.msg('message.edit-online-aos.edit_offline_locked.confirm'), + handler: function dlA_onAlreadyLockedConfirmation_confirm() + { + this.destroy(); + me._triggerEditOnlineAos(record); + } + }, + { + text: this.msg('message.edit-online-aos.edit_offline_locked.cancel'), + handler: function dlA_onAlreadyLockedConfirmation_cancel() + { + this.destroy(); + }, + isDefault: true + } + ] + }); + }, + + _onAlreadyOnlineLockedConfirmation: function dlA_onAlreadyOnlineLockedConfirmation(record, lockOwner) + { + var me = this; + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg('message.edit-online-aos.edit_locked.title', lockOwner.displayName.length > 0 ? lockOwner.displayName : lockOwner.userName ), + text: this.msg('message.edit-online-aos.edit_locked.message'), + buttons: [ + { + text: this.msg('message.edit-online-aos.edit_locked.button_dismiss'), + handler: function dlA_onAlreadyOnlineLockedConfirmation_cancel() + { + this.destroy(); + }, + isDefault: true + } + ] + }); + }, + + _triggerEditOnlineAos: function dlA_triggerEditOnlineAos(record) + { + if (!$isValueSet(record.onlineEditUrlAos)) + { + record.onlineEditUrlAos = Alfresco.util.onlineEditUrlAos(this.doclistMetadata.custom.aos, record); + } + + var fileExtension = Alfresco.util.getFileExtension(record.location.file); + fileExtension = fileExtension != null ? fileExtension.toLowerCase() : fileExtension; + var protocolHandler = this.getProtocolForFileExtension(fileExtension); + + if(protocolHandler === undefined) + { + Alfresco.logger.error("onActionEditOnlineAos", "No protocol handler available for file extension."); + return; + } + + var officeLauncher = new EmbeddedOfficeLauncher(); + + if(officeLauncher.isIOS()) + { + this._aos_launchOfficeOnIos(officeLauncher, protocolHandler, record.onlineEditUrlAos); + return; + } + + // detect if we are on a supported operating system + if(!officeLauncher.isWin() && !officeLauncher.isMac()) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg('message.edit-online-aos.no_supported_environment') + }); + return; + } + + // if we have a working PlugIn (ActiveX or NPAPI), use it. Otherwise we use the protocol handler (e.g. Chrome w/o PlugIn) + if(officeLauncher.isAvailable()) + { + this._aos_launchOfficeByPlugin(officeLauncher, record.onlineEditUrlAos); + } + else + { + this._aos_tryToLaunchOfficeByMsProtocolHandler(officeLauncher, protocolHandler, record.onlineEditUrlAos); + } + + return; + }, + + _aos_launchOfficeByPlugin: function dlA__aos_launchOfficeByPlugin(officeLauncher, url) + { + var checker, dlg; + var isNotIE = (officeLauncher.isFirefox() || officeLauncher.isChrome() || officeLauncher.isSafari()); + if (!officeLauncher.EditDocument(url)) + { + // check if the Plug-In has been blocked + if (officeLauncher.isControlNotActivated() && isNotIE) + { + checker = window.setInterval(function() + { + if (officeLauncher.isControlActivated()) + { + window.clearInterval(checker); + dlg.destroy(); + window.setTimeout(function() + { + if (!officeLauncher.EditDocument(url)) + { + if (officeLauncher.getLastControlResult() !== -2) + { + var errorDetails = officeLauncher.getLastControlResult() !== false ? ' (Error code: ' + officeLauncher.getLastControlResult() + ')' : ''; + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg('message.edit-online-aos.starting_office_failed') + errorDetails + }); + } + } + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + }, 50); + } + }, 250); + var dlg = new YAHOO.widget.SimpleDialog('prompt', + { + close: false, + constraintoviewport: true, + draggable: false, + effect: null, + modal: true, + visible: true, + zIndex: 9999 + }); + var dlgMessageKey = 'message.edit-online-aos.plugin_blocked.body.firefox'; + if(officeLauncher.isFirefox()) + { + dlgMessageKey = 'message.edit-online-aos.plugin_blocked.body.firefox'; + } + else if(officeLauncher.isChrome()) + { + dlgMessageKey = 'message.edit-online-aos.plugin_blocked.body.chrome'; + } + else if(officeLauncher.isSafari()) + { + dlgMessageKey = 'message.edit-online-aos.plugin_blocked.body.safari'; + } + dlg.setHeader(this.msg('message.edit-online-aos.plugin_blocked.caption')); + dlg.setBody(this.msg(dlgMessageKey)); + dlg.cfg.queueProperty('buttons', [ { + text: this.msg('message.edit-online-aos.plugin_blocked.button_dismiss'), + handler: function() { + window.clearInterval(checker); + this.destroy(); + }, + isDefault: true + }]); + dlg.render(document.body); + dlg.center(); + dlg.show(); + } + else + { + if (officeLauncher.getLastControlResult() !== -2) + { + // error message only required if user did not cancel (result === -2) + var errorDetails = officeLauncher.getLastControlResult() !== false ? ' (Error code: ' + officeLauncher.getLastControlResult() + ')' : ''; + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg('message.edit-online-aos.starting_office_failed') + errorDetails + }); + } + } + } + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + }, + + _aos_tryToLaunchOfficeByMsProtocolHandler: function dlA__aos_tryToLaunchOfficeByMsProtocolHandler(officeLauncher, protocolHandler, url) + { + location.href = protocolHandler + ':ofe%7Cu%7C' + url; + }, + + _aos_launchOfficeOnIos: function dlA__aos_launchOfficeOnIos(officeLauncher, protocolHandler, url) + { + var protocolUrl = protocolHandler + ':ofe%7Cu%7C' + officeLauncher.encodeUrl(url); + var iframe = document.createElement('iframe'); + iframe.setAttribute('style', 'display: none; height: 0; width: 0;'); + document.getElementsByTagName('body')[0].appendChild(iframe); + iframe.src = protocolUrl; + }, + + getProtocolForFileExtension: function(fileExtension) + { + var msProtocolNames = + { + 'doc' : 'ms-word', + 'docx' : 'ms-word', + 'docm' : 'ms-word', + 'dot' : 'ms-word', + 'dotx' : 'ms-word', + 'dotm' : 'ms-word', + 'rtf' : 'ms-word', + 'vsd': 'ms-visio', + 'vss': 'ms-visio', + 'vst': 'ms-visio', + 'vsdx': 'ms-visio', + 'vsdm': 'ms-visio', + 'vssx': 'ms-visio', + 'vssm': 'ms-visio', + 'vstx': 'ms-visio', + 'vstm': 'ms-visio', + 'xls' : 'ms-excel', + 'xlsx' : 'ms-excel', + 'xlsb' : 'ms-excel', + 'xlsm' : 'ms-excel', + 'xlt' : 'ms-excel', + 'xltx' : 'ms-excel', + 'xltm' : 'ms-excel', + 'xlsm' : 'ms-excel', + 'ppt' : 'ms-powerpoint', + 'pptx' : 'ms-powerpoint', + 'pot' : 'ms-powerpoint', + 'potx' : 'ms-powerpoint', + 'potm' : 'ms-powerpoint', + 'pptm' : 'ms-powerpoint', + 'potm' : 'ms-powerpoint', + 'pps' : 'ms-powerpoint', + 'ppsx' : 'ms-powerpoint', + 'ppam' : 'ms-powerpoint', + 'ppsm' : 'ms-powerpoint', + 'sldx' : 'ms-powerpoint', + 'sldm' : 'ms-powerpoint', + }; + return msProtocolNames[fileExtension]; + }, + + /** + * Simple Repo Action. + * + * Accepts the following declarations from the config: + * + * action - The name of the repo action (i.e. extract-metadata) + * success - The name of the callback function + * successMessage - The msg key to use when the repo action succeded (i.e. message.extract-metadata.success) + * failure - The name of the callback function + * failureMessage - The msg key to use when the repo action failed (i.e. message.extract-metadata.failure) + * * - All remaining parameters will be treated as repo action parameters + * + * Example: + * + * onActionSimpleRepoAction + * add-features + * rd:status + * addAspectExample.success + * addAspectExample.failure + * + * + * @method onActionSimpleRepoAction + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionSimpleRepoAction: function dlA_onActionSimpleRepoAction(record, owner) + { + //ACE-2470 : Clone: Clicking multiple times the simple Workflow approval menu item gives unexpected results. + if (owner.title.indexOf("_deactivated") == -1) + { + // Get action params + var params = this.getAction(record, owner).params, + displayName = record.displayName, + namedParams = ["function", "action", "success", "successMessage", "failure", "failureMessage", "async"], + repoActionParams = {}; + + for (var name in params) + { + if (params.hasOwnProperty(name) && !Alfresco.util.arrayContains(namedParams, name)) + { + repoActionParams[name] = params[name]; + } + } + + //Deactivate action + var ownerTitle = owner.title; + owner.title = owner.title + "_deactivated"; + + var async = params.async ? "async=" + params.async : null; + + // Prepare genericAction config + var config = + { + success: + { + event: + { + name: "metadataRefresh", + obj: record + } + }, + failure: + { + message: this.msg(params.failureMessage, displayName), + fn: function showAction() + { + owner.title = ownerTitle; + }, + scope: this + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + stem: Alfresco.constants.PROXY_URI + "api/", + name: "actionQueue", + queryString: async + }, + config: + { + requestContentType: Alfresco.util.Ajax.JSON, + dataObj: + { + actionedUponNode: record.nodeRef, + actionDefinitionName: params.action, + parameterValues: repoActionParams + } + } + }; + + // Add configured success callbacks and messages if provided + if (YAHOO.lang.isFunction(this[params.success])) + { + config.success.callback = + { + fn: this[params.success], + obj: record, + scope: this + }; + } + if (params.successMessage) + { + config.success.message = this.msg(params.successMessage, displayName); + } + + // Acd configured failure callback and message if provided + if (YAHOO.lang.isFunction(this[params.failure])) + { + config.failure.callback = + { + fn: this[params.failure], + obj: record, + scope: this + }; + } + if (params.failureMessage) + { + config.failure.message = this.msg(params.failureMessage, displayName); + } + + // Execute the repo action + this.modules.actions.genericAction(config); + } + }, + + /** + * Form Dialog Action. + * + * Accepts declarations in share config xml for the following names: + * success - The name of the callback function + * successMessage - The msg key to use when the repo action succeded (i.e. message.extract-metadata.success) + * failure - The name of the callback function + * failureMessage - The msg key to use when the repo action failed (i.e. message.extract-metadata.failure) + * ...and any other parameter mathing the properties for GET /service/components/form webscript + * i.e itemid, itemkind, mode etc... + * + * @method onActionFormDialog + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionFormDialog: function dlA_onActionFormDialog(record, owner) + { + var config = this.generateConfigForFormDialogAction(record, owner); + + // Finally display form as dialog + Alfresco.util.PopupManager.displayForm(config); + }, + + /** + * Form Dialog Action with disabling submit buttons. + * + * Accepts declarations in share config xml for the following names: + * success - The name of the callback function + * successMessage - The msg key to use when the repo action succeded (i.e. message.extract-metadata.success) + * failure - The name of the callback function + * failureMessage - The msg key to use when the repo action failed (i.e. message.extract-metadata.failure) + * ...and any other parameter mathing the properties for GET /service/components/form webscript + * i.e itemid, itemkind, mode etc... + * + * @method onActionFormDialog + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionFormDialogWithSubmitDisable: function dlA_onActionFormDialogWithSubmitDisable(record, owner) + { + var config = this.generateConfigForFormDialogAction(record, owner); + + config.properties.disableSubmitButton = true; + + // Finally display form as dialog + Alfresco.util.PopupManager.displayForm(config); + }, + + generateConfigForFormDialogAction: function dlA_generateConfigForFormDialogAction(record, owner) + { + // Get action & params and start create the config for displayForm + var action = this.getAction(record, owner), + params = action.params, + config = + { + title: this.msg(action.label) + }, + displayName = record.displayName; + + // Make sure we don't pass the function as a form parameter + delete params["function"]; + + // Add configured success callback + var success = params["success"]; + delete params["success"]; + config.success = + { + fn: function(response, obj) + { + // Invoke callback if configured and available + if (YAHOO.lang.isFunction(this[success])) + { + this[success].call(this, response, obj); + } + + // Fire metadataRefresh so other components may update themselves + YAHOO.Bubbling.fire("metadataRefresh", obj); + }, + obj: record, + scope: this + }; + + // Add configure success message + if (params.successMessage) + { + config.successMessage = this.msg(params.successMessage, displayName); + delete params["successMessage"]; + } + + // Add configured failure callback + if (YAHOO.lang.isFunction(this[params.failure])) + { + config.failure = + { + fn: this[params.failure], + obj: record, + scope: this + }; + delete params["failure"]; + } + // Add configure success message + if (params.failureMessage) + { + config.failureMessage = this.msg(params.failureMessage, displayName); + delete params["failureMessage"]; + } + + // Use the remaining properties as form properties + config.properties = params; + + return config; + }, + + /** + * Upload new version. + * + * @method onActionUploadNewVersion + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionUploadNewVersion: function dlA_onActionUploadNewVersion(record) + { + var jsNode = record.jsNode, + displayName = record.displayName, + nodeRef = jsNode.nodeRef, + version = record.version; + + if (!this.fileUpload) + { + this.fileUpload = Alfresco.getFileUploadInstance(); + } + + // Show uploader for multiple files + var description = this.msg("label.filter-description", displayName), + extensions = "*"; + + if (displayName && new RegExp(/[^\.]+\.[^\.]+/).exec(displayName)) + { + // Only add a filtering extension if filename contains a name and a suffix + extensions = "*" + displayName.substring(displayName.lastIndexOf(".")); + } + + if (record.workingCopy && record.workingCopy.workingCopyVersion) + { + version = record.workingCopy.workingCopyVersion; + } + + var zIndex = 0; + if (this.fullscreen !== undefined && ( this.fullscreen.isWindowOnly || Dom.hasClass(this.id, 'alf-fullscreen'))) + { + zIndex = 1000; + } + + var singleUpdateConfig = + { + updateNodeRef: nodeRef.toString(), + updateFilename: displayName, + updateVersion: version, + overwrite: true, + filter: [ + { + description: description, + extensions: extensions + }], + mode: this.fileUpload.MODE_SINGLE_UPDATE, + onFileUploadComplete: + { + fn: this.onNewVersionUploadComplete, + scope: this + }, + newVersion: true, + jsNode: jsNode + }; + + this.fileUpload.options.zIndex = zIndex; + + if ($isValueSet(this.options.siteId)) + { + singleUpdateConfig.siteId = this.options.siteId; + singleUpdateConfig.containerId = this.options.containerId; + } + this.fileUpload.show(singleUpdateConfig); + }, + + /** + * Handles creating activity events after file upload completion + * + * @method _uploadComplete + * @protected + * @param complete {object} Object literal containing details of successful and failed uploads + * @param uploadType {String} Either "added" or "updated" depending on the file action + */ + _uploadComplete: function dlA__uploadComplete(complete, uploadType) + { + var success = complete.successful.length, activityData, file; + if (success > 0) + { + if (success < (this.options.groupActivitiesAt || 5)) + { + // Below cutoff for grouping Activities into one + for (var i = 0; i < success; i++) + { + file = complete.successful[i]; + activityData = + { + fileName: file.fileName, + nodeRef: file.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "file-" + uploadType, "document-details", activityData); + } + } + else + { + // grouped into one message + activityData = + { + fileCount: success, + path: this.currentPath, + parentNodeRef: this.doclistMetadata.parent.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "files-" + uploadType, "documentlibrary", activityData); + } + } + }, + + /** + * Called from the uploader component after one or more files have been uploaded. + * + * @method onFileUploadComplete + * @param complete {object} Object literal containing details of successful and failed uploads + */ + onFileUploadComplete: function dlA_onFileUploadComplete(complete) + { + this._uploadComplete(complete, "added"); + }, + + /** + * Called from the uploader component after one or more files have been updated. + * + * @method onNewVersionUploadComplete + * @param complete {object} Object literal containing details of successful and failed uploads + */ + onNewVersionUploadComplete: function dlA_onNewVersionUploadComplete(complete) + { + this._uploadComplete(complete, "updated"); + }, + + /** + * Cancel editing. + * + * @method onActionCancelEditing + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionCancelEditing: function dlA_onActionCancelEditing(record) + { + var displayName = record.displayName; + + this.modules.actions.genericAction( + { + success: + { + event: + { + name: "metadataRefresh" + }, + message: this.msg("message.edit-cancel.success", displayName) + }, + failure: + { + message: this.msg("message.edit-cancel.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: "cancel-checkout/node/{nodeRef}", + params: + { + nodeRef: record.jsNode.nodeRef.uri + } + } + }); + + YAHOO.Bubbling.fire("editingCanceled", + { + record: record + }); + }, + + /** + * Unlock document + * + * @method onActionUnlockDocument + * @param record {object} + */ + onActionUnlockDocument: function dlA_onActionUnlockDocument(record) + { + var displayName = record.displayName; + + this.modules.actions.genericAction( + { + success: + { + event: + { + name: "metadataRefresh" + }, + message: this.msg("message.unlock-document.success", displayName) + }, + failure: + { + message: this.msg("message.unlock-document.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: "unlock-document/node/{nodeRef}", + params: + { + nodeRef: record.jsNode.nodeRef.uri + } + } + }); + }, + + /** + * Copy single document or folder. + * + * @method onActionCopyTo + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionCopyTo: function dlA_onActionCopyTo(record) + { + this._copyMoveTo("copy", record); + }, + + /** + * Link single document or folder. + * + * @method onActionLinkTo + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionLinkTo: function dlA_onActionCopyTo(record) + { + this._copyMoveTo("link", record); + }, + + /** + * Move single document or folder. + * + * @method onActionMoveTo + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionMoveTo: function dlA_onActionMoveTo(record) + { + this._copyMoveTo("move", record); + }, + + /** + * Unzip a single archive. + * + * @method onActionUnzipTo + * @param record {object} Object literal representing the archive to be actioned + */ + onActionUnzipTo: function dlA_onActionUnzipTo(record) + { + this._copyMoveTo("unzip", record); + }, + + /** + * Copy/Move To implementation. + * + * @method _copyMoveTo + * @param mode {String} Operation mode: copy|move + * @param record {object} Object literal representing the file or folder to be actioned + * @private + */ + _copyMoveTo: function dlA__copyMoveTo(mode, record) + { + // Check mode is an allowed one + if (!mode in + { + copy: true, + move: true, + unzip: true + }) + { + throw new Error("'" + mode + "' is not a valid Copy/Move to mode."); + } + + if (!this.modules.copyMoveTo) + { + this.modules.copyMoveTo = new Alfresco.module.DoclibCopyMoveTo(this.id + "-copyMoveTo"); + } + + var DLGF = Alfresco.module.DoclibGlobalFolder; + + var allowedViewModes = + [ + DLGF.VIEW_MODE_RECENT_SITES, + DLGF.VIEW_MODE_FAVOURITE_SITES, + DLGF.VIEW_MODE_SITE, + DLGF.VIEW_MODE_SHARED + ]; + + if (this.options.repositoryBrowsing === true) + { + allowedViewModes.push(DLGF.VIEW_MODE_REPOSITORY); + } + + allowedViewModes.push(DLGF.VIEW_MODE_USERHOME); + + var zIndex = 0; + if (this.fullscreen !== undefined && ( this.fullscreen.isWindowOnly || Dom.hasClass(this.id, 'alf-fullscreen'))) + { + zIndex = 1000; + } + + var parentElement = undefined; + if (Dom.hasClass(this.id, 'alf-true-fullscreen')) + { + parentElement = Dom.get(this.id); + } + + this.modules.copyMoveTo.setOptions( + { + allowedViewModes: allowedViewModes, + mode: mode, + siteId: this.options.siteId, + containerId: this.options.containerId, + path: this.currentPath, + files: record, + /* Fix for MNT-12432. Do not overwrite this.modules.copyMoveTo.options.rootNode option if repoBrowsing is enabled. Could cause Repository tab view inconsistency */ + rootNode: this.options.repositoryBrowsing ? this.modules.copyMoveTo.options.rootNode : this.options.rootNode, + repositoryRoot: this.options.repositoryRoot, + parentId: this.getParentNodeRef(record), + zIndex: zIndex, + parentElement : parentElement ? parentElement : undefined + }).showDialog(); + }, + + /** + * Assign workflow. + * + * @method onActionAssignWorkflow + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionAssignWorkflow: function dlA_onActionAssignWorkflow(record) + { + var nodeRefs = "", + destination = this.getParentNodeRef(record); + + if (YAHOO.lang.isArray(record)) + { + for (var i = 0, il = record.length; i < il; i++) + { + nodeRefs += (i === 0 ? "" : ",") + record[i].nodeRef; + } + } + else + { + nodeRefs = record.nodeRef; + } + var postBody = + { + selectedItems: nodeRefs + }; + if (destination) + { + postBody.destination = destination; + } + Alfresco.util.navigateTo($siteURL("start-workflow"), "POST", postBody); + }, + + /** + * Set permissions on a single document or folder. + * + * @method onActionManagePermissions + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionManagePermissions: function dlA_onActionManagePermissions(record) + { + if (!this.modules.permissions) + { + this.modules.permissions = new Alfresco.module.DoclibPermissions(this.id + "-permissions"); + } + + this.modules.permissions.setOptions( + { + siteId: this.options.siteId, + containerId: this.options.containerId, + path: this.currentPath, + files: record + }).showDialog(); + }, + + /** + * Take Ownership. + * + * @method onActionTakeOwnership + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionTakeOwnership: function dlA_onActionTakeOwnership(record, owner) + { + var me = this, + jsNode = record.jsNode, + content = jsNode.isContainer ? "folder" : "document", + displayName = record.displayName, + zIndex = 0; + + var displayPromptText = this.msg("message.confirm.take-ownership", displayName); + + if (this.fullscreen !== undefined && ( this.fullscreen.isWindowOnly || Dom.hasClass(this.id, 'alf-fullscreen'))) + { + zIndex = 1000; + } + + //MNT-11084 : Full screen/window view: Actions works incorrectly; + var parent = undefined; + var container = Dom.get(this.id); + var ua = navigator.userAgent.toLowerCase(); + if ((ua.indexOf('gecko') != -1 || ua.indexOf('safari')!=-1) && ua.indexOf('chrome')==-1) + { + parent = container; + } + + var buttons = + [ + { + text: this.msg("button.take-ownership"), + handler: function dlA_onActionTakeOwnership_confirm() + { + this.destroy(); + me.onActionSimpleRepoAction.call(me, record, owner); + } + }, + { + text: this.msg("button.cancel"), + handler: function dlA_onActionTakeOwnership_cancel() + { + this.destroy(); + }, + isDefault: true + } + ]; + + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.confirm.take-ownership.title"), + text: displayPromptText, + noEscape: true, + buttons: buttons + }); + }, + + /** + * Manage aspects. + * + * @method onActionManageAspects + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionManageAspects: function dlA_onActionManageAspects(record) + { + if (!this.modules.aspects) + { + this.modules.aspects = new Alfresco.module.DoclibAspects(this.id + "-aspects"); + } + + this.modules.aspects.setOptions( + { + file: record + }).show(); + }, + + /** + * Change Type + * + * @method onActionChangeType + * @param record {object} Object literal representing the file or folder to be actioned + */ + onActionChangeType: function dlA_onActionChangeType(record) + { + var jsNode = record.jsNode, + currentType = jsNode.type, + displayName = record.displayName, + actionUrl = Alfresco.constants.PROXY_URI + $combine("slingshot/doclib/type/node", jsNode.nodeRef.uri); + + var doSetupFormsValidation = function dlA_oACT_doSetupFormsValidation(p_form) + { + // Validation + p_form.addValidation(this.id + "-changeType-type", function fnValidateType(field, args, event, form, silent, message) + { + return field.options[field.selectedIndex].value !== "-"; + }, null, "change", null, { validationType: "mandatory" }); + }; + + // Always create a new instance + this.modules.changeType = new Alfresco.module.SimpleDialog(this.id + "-changeType").setOptions( + { + width: "30em", + templateUrl: Alfresco.constants.URL_SERVICECONTEXT + "modules/documentlibrary/change-type?currentType=" + encodeURIComponent(currentType), + actionUrl: actionUrl, + doSetupFormsValidation: + { + fn: doSetupFormsValidation, + scope: this + }, + firstFocus: this.id + "-changeType-type", + onSuccess: + { + fn: function dlA_onActionChangeType_success(response) + { + YAHOO.Bubbling.fire("metadataRefresh", + { + highlightFile: displayName + }); + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.change-type.success", displayName) + }); + }, + scope: this + }, + onFailure: + { + fn: function dlA_onActionChangeType_failure(response) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.change-type.failure", displayName) + }); + }, + scope: this + } + }); + this.modules.changeType.show(); + }, + + /** + * View in source Repository URL helper + * + * @method viewInSourceRepositoryURL + * @param record {object} Object literal representing the file or folder to be actioned + * @param actionUrls {object} Action urls for this record + */ + viewInSourceRepositoryURL: function dlA_viewInSourceRepositoryURL(record, actionUrls) + { + var node = record.node, + repoId = record.location.repositoryId, + urlMapping = this.options.replicationUrlMapping, + siteUrl; + + if (!repoId || !urlMapping || !urlMapping[repoId]) + { + return "#"; + } + + // Generate a URL to the relevant details page + siteUrl = node.isContainer ? actionUrls.folderDetailsUrl : actionUrls.documentDetailsUrl; + // Strip off this webapp's context as the mapped one might be different + siteUrl = siteUrl.substring(Alfresco.constants.URL_CONTEXT.length); + + return $combine(urlMapping[repoId], "/", siteUrl); + }, + + /** + * Helper method for getting the MemberNodeRefs from an object + * + * @method getMemberNodeRefs + * @param record {object} Object literal representing one file or folder to be actioned + * @return {object} An array of MemberNodeRefs + */ + getMemberNodeRefs: function dlA_onGetMemberNodeRefs(record) + { + var memberNodeRefs = new Array(); + if (YAHOO.lang.isArray(record)) + { + for (var i in record) + { + memberNodeRefs.push(record[i].nodeRef); + } + } + else + { + memberNodeRefs.push(record.nodeRef); + } + return memberNodeRefs; + }, + + /** + * Triggers the archiving and download of a single folders contents + * + * @method onActionFolderDownload + * @param record {object} Object literal representing the folder to be actioned + */ + onActionFolderDownload: function dlA_onActionFolderDownload(record) { + + var downloadDialog = Alfresco.getArchiveAndDownloadInstance(), + config = { nodesToArchive: [{"nodeRef": record.nodeRef}], + archiveName: record.fileName }; + downloadDialog.show(config); + }, + + /** + * Triggers the archiving and download of the currently selected documents/folders. + * + * @method onActionDownload + * @param record {array} The list of selected records. + */ + onActionDownload: function dla_onActionDownload(record) { + var downloadDialog = Alfresco.getArchiveAndDownloadInstance(), + config = { nodesToArchive: [] }; + + if (record.length == 1) + { + config.nodesToArchive.push({"nodeRef": record[0].nodeRef}); + config.archiveName = record[0].fileName; + } + else + { + for (var i=0; i. + */ + +/** + * Repository DocumentList TreeView component. + * + * @namespace Alfresco + * @class Alfresco.DocListCategories + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths; + + /** + * Records DocumentList TreeView constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocListCategories} The new DocListCategories instance + * @constructor + */ + Alfresco.DocListCategories = function DLT_constructor(htmlId) + { + Alfresco.DocListCategories.superclass.constructor.call(this, htmlId); + + // Re-register with our own name + this.name = "Alfresco.DocListCategories"; + Alfresco.util.ComponentManager.reregister(this); + + // Category filterId + this.filterId = "category"; + + // Register with Filter Manager + Alfresco.util.FilterManager.register(this.name, this.filterId); + + return this; + }; + + YAHOO.extend(Alfresco.DocListCategories, Alfresco.DocListTree, + { + /** + * PRIVATE FUNCTIONS + */ + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + */ + _buildTreeNodeUrl: function DLT__buildTreeNodeUrl(path) + { + var nodeRef = new Alfresco.util.NodeRef(this.options.nodeRef), + uriTemplate ="slingshot/doclib/categorynode/node/" + $combine(encodeURI(nodeRef.uri), Alfresco.util.encodeURIPath(path)); + + return Alfresco.constants.PROXY_URI + uriTemplate + "?perms=false&children=" + this.options.evaluateChildFolders; + } + }); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/documentlist-view-detailed.js b/share/src/main/webapp/components/documentlibrary/documentlist-view-detailed.js new file mode 100644 index 0000000000..2b259dc1a8 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist-view-detailed.js @@ -0,0 +1,1138 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentListViewRenderer component. + * + * @namespace Alfresco + * @class Alfresco.DocumentListViewRenderer + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $isValueSet = Alfresco.util.isValueSet; + + /** + * ViewRenderer constructor. + * + * @param name {String} The name of the viewRenderer + * @return {Alfresco.DocumentListViewRenderer} The new ViewRenderer instance + * @constructor + */ + Alfresco.DocumentListViewRenderer = function(name, parentDocumentList, commonComponentStyle) + { + /* + * Initialise prototype properties + */ + this.name = name; + this.parentDocumentList = parentDocumentList; + this.parentElementIdSuffix = "-documents"; + this.rowClassName = "yui-dt-rec"; + this.actionsCssClassName = this.name; + this.actionsColumnWidth = 200; + this.actionsSplitAtModifier = 1; + this.thumbnailColumnWidth = 100; + this.buttonElementIdSuffix = "-" + this.name + "View"; + this.buttonCssClass = this.name + "-view"; + this.metadataBannerViewName = this.name; + this.metadataLineViewName = this.name; + if (commonComponentStyle != null) + { + this.folderIconConfig = YAHOO.lang.JSON.parse(commonComponentStyle).browse.folder; + } + else + { + this.folderIconConfig = {}; + } + return this; + }; + + Alfresco.DocumentListViewRenderer.prototype = + { + + /** + * Performs any setup needed immediately after registration + * + * @method setupRenderer + * @param scope {object} The DocumentList object + */ + setupRenderer: function DL_VR_setupRenderer(scope) + { + Dom.addClass(scope.id + this.buttonElementIdSuffix, this.buttonCssClass); + }, + + /** + * Render the view using the given scope (documentList), request and response. + * + * @method renderView + * @param scope {object} The DocumentList object + * @param sRequest {string} Original request + * @param oResponse {object} Response object + * @param oPayload {MIXED} (optional) Additional argument(s) + */ + renderView: function DL_VR_renderView(scope, sRequest, oResponse, oPayload) + { + YAHOO.util.Dom.setStyle(scope.id + this.parentElementIdSuffix, 'display', ''); + scope.widgets.dataTable.onDataReturnInitializeTable.call(scope.widgets.dataTable, sRequest, oResponse, oPayload); + }, + + /** + * Performs any teardown or visual changes to deselect this view in the interface + * + * @method destroyView + * @param scope {object} The DocumentList object + * @param sRequest {string} Original request + * @param oResponse {object} Response object + * @param oPayload {MIXED} (optional) Additional argument(s) + */ + destroyView: function DL_VR_destroyView(scope, sRequest, oResponse, oPayload) + { + YAHOO.util.Dom.setStyle(scope.id + this.parentElementIdSuffix, 'display', 'none'); + }, + + /** + * Selector custom datacell formatter + * + * @method renderCellSelected + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellSelected: function DL_VR_renderCellSelected(scope, elCell, oRecord, oColumn, oData) + { + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + var jsNode = oRecord.getData("jsNode"), + nodeRef = jsNode.nodeRef, + name = oRecord.getData("displayName"), + checkbox = document.createElement("input"), + label = document.createElement("label"); + checkbox.id = "checkbox-" + oRecord.getId(); + checkbox.type = "checkbox"; + checkbox.name = "fileChecked"; + checkbox.value = nodeRef; + checkbox.checked = scope.selectedFiles[nodeRef] ? true : false; + + label.id = "label_for_" + checkbox.id; + label.style.fontSize="0em"; + label.innerHTML = (checkbox.checked ? scope.msg("checkbox.uncheck") : scope.msg("checkbox.check")) + " " + name; + label.setAttribute("for", checkbox.id); + elCell.innerHTML = ''; + elCell.appendChild(label); + elCell.appendChild(checkbox); + Event.addListener(checkbox, "click", function(e) + { + label.innerHTML = (checkbox.checked ? scope.msg("checkbox.uncheck") : scope.msg("checkbox.check")) + " " + name; + }, checkbox, true); + + // MNT-12522 + var row = Dom.getAncestorByTagName(elCell, "tr"); + Event.addListener(checkbox, "focus", function() + { + _unhighlightRows(this); + this.onEventHighlightRow({target : row}); + }, this.parentDocumentList, true); + + new YAHOO.util.KeyListener(checkbox, + { + keys : YAHOO.util.KeyListener.KEY.TAB, + shift : true + }, + { + fn : function() + { + _unhighlightRows(this); + var previous = Dom.getPreviousSibling(row); + if (previous !== null) + { + this.onEventHighlightRow({target : previous}); + } + }, + scope : this.parentDocumentList, + correctScope : true + }, "keydown").enable(); + + function _unhighlightRows(scope) + { + var highlightedRows = Dom.getElementsByClassName("yui-dt-highlighted", "tr", Dom.getAncestorByTagName(row, "tbody")); + for (var i = 0; i < highlightedRows.length; i++) + { + scope.onEventUnhighlightRow({target : highlightedRows[i]}); + } + } + }, + + /** + * Status custom datacell formatter + * + * @method renderCellStatus + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellStatus: function DL_VR_renderCellStatus(scope, elCell, oRecord, oColumn, oData) + { + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + var record = oRecord.getData(), + node = record.jsNode, + indicators = record.indicators, + indicator, label, desc = ""; + + if (indicators && indicators.length > 0) + { + for (var i = 0, ii = indicators.length; i < ii; i++) + { + indicator = indicators[i]; + // Note: deliberate bypass of scope.msg() function + label = Alfresco.util.message(indicator.label, scope.name, indicator.labelParams); + label = Alfresco.util.substituteDotNotation(label, record); + + desc += '
    '; + + if (indicator.action) + { + desc += ''; + } + + desc += '' + indicator.id + ''; + if (indicator.action) + { + desc += ''; + } + desc += '
    '; + } + } + + elCell.innerHTML = desc; + }, + + /** + * Render the thumbnail cell + * + * @method renderCellThumbnail + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellThumbnail: function DL_VR_renderCellThumbnail(scope, elCell, oRecord, oColumn, oData) + { + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + name = record.displayName, + isContainer = node.isContainer, + isLink = node.isLink, + extn = name.substring(name.lastIndexOf(".")), + imgId = node.nodeRef.nodeRef; // DD added + + var containerTarget; // This will only get set if thumbnail represents a container + + if (window.location.href.search(/\/sharedfiles/) != -1 && record.location.path.search("/Shared") == 0) + { + record.location.path = record.location.path.substring(7); + } + + oColumn.width = this.thumbnailColumnWidth; + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + if (isContainer || (isLink && node.linkedNode.isContainer)) + { + elCell.innerHTML = '' + (isLink ? '' : '') + (scope.dragAndDropEnabled ? '' : '') + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + ''; + containerTarget = new YAHOO.util.DDTarget(imgId); // Make the folder a target + } + else + { + elCell.innerHTML = '' + (isLink ? '' : '') + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + '' + extn + ''; + } + var dnd = new Alfresco.DnD(imgId, scope); + }, + + /** + * Returns icon resource URL for specified {node} parameter. + * @param node {object} - container node object + * @returns icon resource URL for specified {node} parameter. + */ + getFolderIcon : function DL_VR_getFolderIcon(node) + { + var filterChain = new Alfresco.CommonComponentIconFilterChain(node, this.folderIconConfig, this.getDefaultFolderIcon(), this.getIconSize()); + var folderIconStr = filterChain.createIconResourceName(); + return Alfresco.constants.URL_RESCONTEXT + folderIconStr; + }, + /** + * Default icon resource path string for this view. + * @returns {String} + */ + getDefaultFolderIcon : function DL_VR_getDefaultFolderIcon() + { + return "components/documentlibrary/images/folder-64.png"; + }, + /** + * Default icon size for this view. + * @returns {String} + */ + getIconSize : function DL_VR_getIconSize() + { + return "64x64"; + }, + + /** + * Description/detail custom datacell formatter + * + * @method renderCellDescription + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellDescription: function DL_VR_renderCellDescription(scope, elCell, oRecord, oColumn, oData) + { + var desc = "", i, j, + record = oRecord.getData(), + jsNode = record.jsNode, + properties = jsNode.properties, + isContainer = jsNode.isContainer, + isLink = jsNode.isLink, + title = "", + titleHTML = "", + version = "", + canComment = jsNode.permissions.user.CreateChildren; + + if (jsNode.isLink) + { + // Link handling + // MNT-11988: Renaming links is not working correctly + oRecord.setData("displayName", record.fileName.replace(/(.url)$/,"")); + } + else if (properties.title && properties.title !== record.displayName && scope.options.useTitle) + { + // Use title property if it's available. Supressed for links. + titleHTML = '(' + $html(properties.title) + ')'; + } + + // Version display + if (!jsNode.hasAspect("cm:workingcopy") && $isValueSet(record.version) && !jsNode.isContainer && !jsNode.isLink) + { + version = '' + $html(record.version) + ''; + } + + /** + * Render using metadata template + */ + record._filenameId = Alfresco.util.generateDomId(); + + var metadataTemplate = record.metadataTemplate; + if (metadataTemplate) + { + /* Banner */ + if (YAHOO.lang.isArray(metadataTemplate.banners)) + { + var fnRenderBanner = function fnRenderBanner_substitute(p_key, p_value, p_meta) + { + var label = (p_meta !== null ? scope.msg(p_meta) + ': ': ''), + value = ""; + + // render value from properties or custom renderer + if (scope.renderers.hasOwnProperty(p_key) && typeof scope.renderers[p_key] === "function") + { + value = scope.renderers[p_key].call(scope, record, label); + } + else + { + if (jsNode.hasProperty(p_key)) + { + value = '' + label + scope.renderProperty(jsNode.properties[p_key]) + ''; + } + } + + return value; + }; + + var html, banner; + for (i = 0, j = metadataTemplate.banners.length; i < j; i++) + { + banner = metadataTemplate.banners[i]; + if (!$isValueSet(banner.view) || banner.view == this.metadataBannerViewName) + { + html = YAHOO.lang.substitute(banner.template, scope.renderers, fnRenderBanner); + if ($isValueSet(html)) + { + desc += '
    ' + html + '
    '; + } + } + } + } + + /* Title */ + if (YAHOO.lang.isString(metadataTemplate.title)) + { + var fnRenderTitle = function fnRenderTitle_substitute(p_key, p_value, p_meta) + { + var label = (p_meta !== null ? '' + scope.msg(p_meta) + ': ': ''), + value = ""; + + // render value from properties or custom renderer + if (scope.renderers.hasOwnProperty(p_key) && typeof scope.renderers[p_key] === "function") + { + value = scope.renderers[p_key].call(scope, record, label); + } + else + { + if (jsNode.hasProperty(p_key)) + { + value = '
    ' + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record); + value += label + scope.renderProperty(jsNode.properties[p_key]) + '
    '; + } + } + + return value; + }; + + desc += YAHOO.lang.substitute(metadataTemplate.title, scope.renderers, fnRenderTitle); + } + else + { + // Insitu editing for title (filename) + if (jsNode.hasPermission("Write") && !jsNode.isLocked && !jsNode.hasAspect("cm:workingcopy")) + { + scope.insituEditors.push( + { + context: record._filenameId, + params: + { + type: "textBox", + nodeRef: jsNode.nodeRef.toString(), + name: "prop_cm_name", + value: record.fileName, + fnSelect: function fnSelect(elInput, value) + { + // If the file has an extension, omit it from the edit selection + var extnPos = value.lastIndexOf(Alfresco.util.getFileExtension(value)) - 1; + if (extnPos > 0) + { + Alfresco.util.selectText(elInput, 0, extnPos); + } + else + { + elInput.select(); + } + }, + validations: [ + { + type: Alfresco.forms.validation.length, + args: { min: 1, max: 255, crop: true }, + when: "keyup", + message: scope.msg("validation-hint.length.min.max", 1, 255) + }, + { + type: Alfresco.forms.validation.nodeName, + when: "keyup", + message: scope.msg("validation-hint.nodeName") + }], + title: scope.msg("tip.insitu-rename"), + errorMessage: scope.msg("message.insitu-edit.name.failure") + }, + callback: + { + fn: scope._insituCallback, + scope: scope, + obj: record + } + }); + } + + desc += '

    ' + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record); + desc += $html(record.displayName) + '' + titleHTML + version + '

    '; + } + + if (YAHOO.lang.isArray(metadataTemplate.lines)) + { + var fnRenderTemplate = function fnRenderTemplate_substitute(p_key, p_value, p_meta) + { + var label = (p_meta !== null ? '' + scope.msg(p_meta) + ': ': ''), + value = ""; + + // render value from properties or custom renderer + if (scope.renderers.hasOwnProperty(p_key) && typeof scope.renderers[p_key] === "function") + { + value = scope.renderers[p_key].call(scope, record, label); + } + else + { + if (jsNode.hasProperty(p_key)) + { + value = '' + label + scope.renderProperty(jsNode.properties[p_key]) + ''; + } + } + + return value; + }; + + var html, line; + for (i = 0, j = metadataTemplate.lines.length; i < j; i++) + { + line = metadataTemplate.lines[i]; + if (!$isValueSet(line.view) || line.view == this.metadataLineViewName) + { + html = YAHOO.lang.substitute(line.template, scope.renderers, fnRenderTemplate); + if ($isValueSet(html)) + { + desc += '
    ' + html + '
    '; + } + } + } + } + } + + elCell.innerHTML = desc; + + Event.on(Dom.getElementsByClassName("banner-more-info-link", "span", elCell), "click", function showMoreInfoLinkClick(event) + { + }, {}, scope); + }, + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellActions: function DL_VR_renderCellActions(scope, elCell, oRecord, oColumn, oData) + { + oColumn.width = this.actionsColumnWidth; + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + Dom.addClass(elCell.parentNode, oRecord.getData("type")); + + elCell.innerHTML = ''; + }, + + /** + * Returns actions custom datacell formatter + * + * @method fnRenderCellProperty + */ + fnRenderCellProperty: function DL_fnRenderCellProperty() + { + var scope = this; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellProperty(elCell, oRecord, oColumn, oData) + { + scope.renderCellProperty(scope, elCell, oRecord, oColumn, oData); + }; + }, + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellProperty: function DL_VR_renderCellProperty(scope, elCell, oRecord, oColumn, oData) + { + // this.renderers[propertyName] = renderer + // this.parentDocumentList.renderers + + if (typeof this.parentDocumentList.renderers[oColumn.field] === "function") + { + elCell.innerHTML = this.parentDocumentList.renderers[oColumn.field].call(this.parentDocumentList, oRecord.getData(), ""); + } + else + { + // IMPLEMENTATION NOTES: + // It is possible to check for renderers mapped to a property without the namespace (e.g. "description" instead of + // "cm:description"). However, the renderers were intended to work with metadata line templates which have been registered + // with names such as "tags" rather than "cm:taggable". Therefore this function supports either genuine data properties + // (such as "cm:name") or template renderers (such as "tags" and "size") but makes no attempt to map between the two. + // However, example code is commented out below in case it is decided that this would actually be desirable... +// var namespaceLessProp = oColumn.field.substring(oColumn.field.indexOf(":") + 1); +// if (typeof this.parentDocumentList.renderers[namespaceLessProp] === "function") +// { +// elCell.innerHTML = this.parentDocumentList.renderers[namespaceLessProp].call(this.parentDocumentList, oRecord.getData(), ""); +// } + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + propertyValue = properties[oColumn.field]; + if (propertyValue != null) + { + elCell.innerHTML = '' + this.parentDocumentList.renderProperty(propertyValue) + ''; + } + } + }, + + /** + * Returns actions custom datacell formatter + * + * @method fnRenderCellLinkProperty + */ + fnRenderCellLinkProperty: function DL_fnRenderCellLinkProperty() + { + var scope = this; + + /** + * Actions custom datacell formatter + * + * @method renderCellLinkProperty + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellLinkProperty(elCell, oRecord, oColumn, oData) + { + scope.renderCellLinkProperty(scope, elCell, oRecord, oColumn, oData); + }; + }, + + /** + * Actions custom datacell formatter + * + * @method renderCellLinkProperty + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + renderCellLinkProperty: function DL_VR_renderCellLinkProperty(scope, elCell, oRecord, oColumn, oData) + { + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + propertyValue = properties[oColumn.field]; + if (propertyValue != null) + { + elCell.innerHTML = '' + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope.parentDocumentList, record) + this.parentDocumentList.renderProperty(propertyValue) + '' + } + }, + + /** + * Get the dataTable record identifier, i.e. yui-recXX, from the given row element. + * + * @method getDataTableRecordIdFromRowElement + * @param scope {object} The DocumentList object + * @param rowElement {HTMLElement} row element. + * @return {String} the dataTable recordId + */ + getDataTableRecordIdFromRowElement: function DL_VR_getDataTableRecordIdFromRowElement(scope, rowElement) + { + if (scope != null && rowElement != null) + { + var element = rowElement; + if (!Dom.hasClass(rowElement, this.rowClassName)) + { + element = Dom.getAncestorByClassName(rowElement, this.rowClassName); + } + return element !== null ? element.id : null; + } + }, + + /** + * Get the row element from the given dataTable record. + * + * @method getRowElementFromDataTableRecordId + * @param scope {object} The DocumentList object + * @param oRecord {object} + * @return {HTMLElement} row element + */ + getRowElementFromDataTableRecord: function DL_VR_getRowElementFromDataTableRecordId(scope, oRecord) + { + if (scope != null && oRecord != null) + { + return scope.widgets.dataTable.getTrEl(oRecord); + } + }, + + /** + * Get the row's selection element, i.e. checkbox, from the given dataTable record. + * + * @method getRowSelectElementFromDataTableRecord + * @param scope {object} The DocumentList object + * @param oRecord {object} + * @return {HTMLElement} row element + */ + getRowSelectElementFromDataTableRecord: function DL_VR_getRowSelectElementFromDataTableRecord(scope, oRecord) + { + if (scope != null && oRecord != null) + { + return Dom.get("checkbox-" + oRecord.getId()); + } + }, + + /** + * Custom event handler to highlight row. + * + * @method onEventHighlightRow + * @param scope {object} The DocumentList object + * @param oArgs.event {HTMLEvent} Event object. + * @param oArgs.target {HTMLElement} Target element. + * @param rowElement {HTMLElement} row element, optionally force a target other than event's + */ + onEventHighlightRow: function DL_VR_onEventHighlightRow(scope, oArgs, rowElement) + { + // Call through to get the row highlighted by YUI + scope.widgets.dataTable.onEventHighlightRow.call(scope.widgets.dataTable, oArgs); + + var targetElement; + if (rowElement) + { + targetElement = rowElement; + } + else + { + targetElement = oArgs.target; + } + + // elActions is the element id of the active table cell where we'll inject the actions + var elActions = Dom.get(scope.id + "-actions-" + targetElement.id); + + // Inject the correct action elements into the actionsId element + if (elActions && elActions.firstChild === null) + { + // Retrieve the actionSet for this record + var oRecord = scope.widgets.dataTable.getRecord(this.getDataTableRecordIdFromRowElement(scope, targetElement)); + if (oRecord !== null) + { + var record = oRecord.getData(), + jsNode = record.jsNode, + actions = record.actions, + actionsEl = document.createElement("div"), + actionHTML = "", + actionsSel; + + record.actionParams = {}; + for (var i = 0, ii = actions.length; i < ii; i++) + { + actionHTML += scope.renderAction(actions[i], record); + } + + // Token replacement - action Urls + actionsEl.innerHTML = YAHOO.lang.substitute(actionHTML, scope.getActionUrls(record)); + + // Simple or detailed view + Dom.addClass(actionsEl, "action-set"); + Dom.addClass(actionsEl, this.actionsCssClassName); + + // Need the "More >" container? + actionsSel = YAHOO.util.Selector.query("div", actionsEl); + if (actionsSel.length > scope.options.actionsSplitAt + this.actionsSplitAtModifier) + { + var moreContainer = Dom.get(scope.id + "-moreActions").cloneNode(true), + containerDivs = YAHOO.util.Selector.query("div", moreContainer); + + // Insert the two necessary DIVs before the third action item + Dom.insertBefore(containerDivs[0], actionsSel[scope.options.actionsSplitAt]); + Dom.insertBefore(containerDivs[1], actionsSel[scope.options.actionsSplitAt]); + + // Now make action items three onwards children of the 2nd DIV + var index, moreActions = actionsSel.slice(scope.options.actionsSplitAt); + for (index in moreActions) + { + if (moreActions.hasOwnProperty(index)) + { + containerDivs[1].appendChild(moreActions[index]); + } + } + } + + elActions.appendChild(actionsEl); + } + } + + if (!Dom.hasClass(document.body, "masked")) + { + scope.currentActionsMenu = elActions; + // Show the actions + Dom.removeClass(elActions, "hidden"); + } + }, + + /** + * Custom event handler to unhighlight row. + * + * @method onEventUnhighlightRow + * @param scope {object} The DocumentList object + * @param oArgs.event {HTMLEvent} Event object. + * @param oArgs.target {HTMLElement} Target element. + * @param rowElement {HTMLElement} row element, optionally force a target other than event's + */ + onEventUnhighlightRow: function DL_VR_onEventUnhighlightRow(scope, oArgs, rowElement) + { + // Call through to get the row unhighlighted by YUI + scope.widgets.dataTable.onEventUnhighlightRow.call(scope.widgets.dataTable, oArgs); + + var targetElement; + if (rowElement) + { + targetElement = rowElement; + } + else + { + targetElement = oArgs.target; + } + + var elActions = Dom.get(scope.id + "-actions-" + (targetElement.id)); + + // Don't hide unless the More Actions drop-down is showing, or a dialog mask is present + if (elActions || Dom.hasClass(document.body, "masked")) + { + if (scope.hideMoreActionsFn) + { + scope.hideMoreActionsFn.call(this); + } + // Just hide the action links, rather than removing them from the DOM + Dom.addClass(elActions, "hidden"); + } + }, + + /** + * Show more actions pop-up. + * + * @method onActionShowMore + * @param scope {object} The DocumentList object + * @param record {object} Object literal representing file or folder to be actioned + * @param elMore {element} DOM Element of "More Actions" link + */ + onActionShowMore: function DL_VR_onActionShowMore(scope, record, elMore) + { + // Fix "More Actions" hover style + Dom.addClass(elMore.firstChild, "highlighted"); + + // Get the pop-up div, sibling of the "More Actions" link + var elMoreActions = Dom.getNextSibling(elMore); + + // MNT-11703, MNT-12137 Menus disappearing off bottom of screen when clicking on more in list view + var scrollY = window.scrollY; + if (scrollY === undefined) + { + scrollY = document.documentElement.scrollTop; + } + + var visibleHeight = Dom.getViewportHeight() - (Dom.getY(elMore) - scrollY + elMore.offsetHeight); + + Dom.removeClass(elMoreActions, "hidden"); + + if (elMoreActions.offsetHeight > visibleHeight) + { + Dom.setY(elMoreActions, Dom.getY(elMore) - (elMoreActions.offsetHeight + 1)); + } + + var rBorderMoreX = Dom.getX(elMore) + elMore.offsetWidth; + var rBorderMoreActionsX = Dom.getX(elMoreActions) + elMoreActions.offsetWidth; + if (rBorderMoreX != rBorderMoreActionsX) + { + Dom.setX(elMoreActions, (Dom.getX(elMore) + elMore.offsetWidth - elMoreActions.offsetWidth)); + }; + + scope.hideMoreActionsFn = function DL_oASM_fnHidePopup() + { + scope.hideMoreActionsFn = null; + + Dom.removeClass(elMore.firstChild, "highlighted"); + Dom.addClass(elMoreActions, "hidden"); + }; + }, + + /** + * File or folder renamed event handler + * + * @method onFileRenamed + * @param scope {object} The DocumentList object + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onFileRenamed: function DL_VR_onFileRenamed(scope, layer, args) + { + var obj = args[1]; + if (obj && (obj.file !== null)) + { + var recordFound = scope._findRecordByParameter(obj.file.node.nodeRef, "nodeRef"); + if (recordFound !== null) + { + scope.widgets.dataTable.updateRow(recordFound, obj.file); + var el = scope.widgets.dataTable.getTrEl(recordFound); + Alfresco.util.Anim.pulse(el); + } + } + }, + + /** + * Highlight file event handler + * Used when a component (including the DocList itself on loading) wants to scroll to and highlight a file + * + * @method onHighlightFile + * @param scope {object} The DocumentList object + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (filename to be highlighted) + */ + onHighlightFile: function DL_VR_onHighlightFile(scope, layer, args) + { + var obj = args[1]; + if ((obj !== null) && ($isValueSet(obj.fileName))) + { + Alfresco.logger.debug("DL_VR_onHighlightFile: ", obj.fileName); + var recordFound = scope._findRecordByParameter(obj.fileName, "displayName"); + if (recordFound !== null) + { + // Scroll the record into view and highlight it + var el = this.getRowElementFromDataTableRecord(scope, recordFound), + yPos = Dom.getY(el); + + if (YAHOO.env.ua.ie > 0) + { + yPos = yPos - (document.body.clientHeight / 3); + } + else + { + yPos = yPos - (window.innerHeight / 3); + } + window.scrollTo(0, yPos); + Alfresco.util.Anim.pulse(el); + scope.options.highlightFile = null; + } + } + }, + + /** + * Sets the given message HTML as the text string of the YUI datatable + * + * @method _setEmptyDataSourceMessage + * @param scope {object} The DocumentList object + * @param messageHtml {string} the message HTML + */ + _setEmptyDataSourceMessage: function DL_VR_setEmptyDataSourceMessage(scope, messageHtml) + { + scope.widgets.dataTable.set("MSG_EMPTY", messageHtml); + }, + + /** + * Constructs the display of upload indicators and instructions for empty spaces. + * + * @method renderEmptyDataSourceHtml + * @param scope {object} The DocumentList object + * @param permissions {object} the current user's permissions + */ + renderEmptyDataSourceHtml: function DL_VR_renderEmptyDataSourceHtml(scope, permissions) + { + var me = scope; + + // Work out the current status of the document list (this will be used to determine what user assistance + // is provided if the doc list is empty, or appears as empty)... + var itemCounts = me.doclistMetadata.itemCounts, + empty = (itemCounts.documents === 0 && itemCounts.folders === 0), + hiddenFolders = (itemCounts.documents === 0 && !me.options.showFolders && itemCounts.folders > 0); + + // Define a re-usable function for seting IDs... + // Get the children of the supplied node and append "-instance" to any child nodes that have an + // "id" attribute in the template. This ensures that the clone has a unique ID within the + // page and can be accurately targeted later (i.e. to add event listeners to). + var updateIDs = function DL_updateIDs(node) + { + var children = Dom.getChildren(node); + for (var i = 0, ii = children.length; i < ii; i++) + { + if (children[i].id !== null && children[i].id !== "") + { + children[i].id += "-instance"; + } + } + }; + + // In documentlist.lib.ftl there are a number of DOM structures that are not displayed, these can + // cloned to display the relevant information to the user based on content, display options, site + // ownership and access rights. All of theses DOM "snippets" need to be added to a main container + // which controls the overall display (of borders, etc). + var template = Dom.get(me.id + "-main-template"), + main = template.cloneNode(true), + container = Dom.getFirstChild(main), + templateInstance = null, + elements = null; + + if (permissions) + { + me._userCanUpload = me.doclistMetadata.parent.permissions.user.CreateChildren && YAHOO.env.ua.mobile === null; + + // Only allow drag and drop behaviour if the filter is changed to an actual + // path (if the filter is anything else such as tags then there won't be a specific + // location to upload to!)... + me._removeDragAndDrop(); + if (me.currentFilter.filterId === "path" || me.currentFilter.filterId === "favourites") + { + me._addDragAndDrop(); + } + + if (me._userCanUpload && me.dragAndDropEnabled) + { + Dom.addClass(container, "docListInstructionsWithDND"); + } + else + { + Dom.addClass(container, "docListInstructions"); + } + + // Work out what to display based on the boolean values calculated earlier... + if (empty && !me._userCanUpload) + { + // If folder is empty, there are no hidden folders and the user cannot upload, then show the no items info... + template = Dom.get(me.id + "-no-items-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + container.appendChild(templateInstance); + } + else if (hiddenFolders) + { + // ...or, if there are hidden subfolders then show the option to reveal them... + template = Dom.get(me.id + "-hidden-subfolders-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + updateIDs(templateInstance); + elements = Dom.getElementsByClassName("docListLinkedInstruction", "a", templateInstance); + if (elements.length == 1) + { + elements[0].innerHTML = me.msg("show.folders", itemCounts.folders); + } + container.appendChild(templateInstance); + } + else if (empty && me._userCanUpload && me.dragAndDropEnabled) + { + // ...or, if the folder is empty, there are no hidden folders, the user can upload AND the browser supports + // the DND process, show the HTML5 DND instructions... + template = Dom.get(me.id + "-dnd-instructions-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + container.appendChild(templateInstance); + } + else if (empty && me._userCanUpload && !me.dragAndDropEnabled) + { + // ...but if the folder is empty, there are no hidden folders, the user can upload BUT the browser does + // NOT support the DND process then just show the standard upload instructions... + template = Dom.get(me.id + "-upload-instructions-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + updateIDs(templateInstance); + container.appendChild(templateInstance); + } + + if (empty && me._userCanUpload && me.dragAndDropEnabled) + { + // Clone the other options node... + template = Dom.get(me.id + "-other-options-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + container.appendChild(templateInstance); + + if (empty && me._userCanUpload) + { + if (me.dragAndDropEnabled) + { + // Show the standard upload other options node... + template = Dom.get(me.id + "-standard-upload-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + updateIDs(templateInstance); + container.appendChild(templateInstance); + } + + // Show the New Folder other options node... + template = Dom.get(me.id + "-new-folder-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + updateIDs(templateInstance); + container.appendChild(templateInstance); + } + } + } + else + { + Dom.addClass(container, "docListInstructions"); + + // Work out what to display based on the boolean values calculated earlier... + if (hiddenFolders) + { + // If there are hidden subfolders then show the option to reveal them... + template = Dom.get(me.id + "-hidden-subfolders-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + updateIDs(templateInstance); + elements = Dom.getElementsByClassName("docListLinkedInstruction", "a", templateInstance); + if (elements.length == 1) + { + elements[0].innerHTML = me.msg("show.folders", itemCounts.folders); + } + container.appendChild(templateInstance); + } + else + { + // Show the no items info... + template = Dom.get(me.id + "-no-items-template"); + templateInstance = template.cloneNode(true); + Dom.removeClass(templateInstance, "hidden"); + container.appendChild(templateInstance); + } + } + + // Add a node in with a style of "clear" set to both to ensure that the main div is given + // a height to accomodate the floated content... + var clearingNode = document.createElement("div"); + Dom.setStyle(clearingNode, "clear", "both"); + container.appendChild(clearingNode); + + this._setEmptyDataSourceMessage(me, main.innerHTML); + } + + }; + +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/documentlist-view-filmstrip.js b/share/src/main/webapp/components/documentlibrary/documentlist-view-filmstrip.js new file mode 100644 index 0000000000..e6094ebab4 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist-view-filmstrip.js @@ -0,0 +1,912 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * @module DocumentLibrary + */ + +/** + * Filmstrip view extension of DocumentListViewRenderer component. + * + * @namespace Alfresco + * @class Alfresco.DocumentListFilmstripViewRenderer + * @extends Alfresco.DocumentListGalleryViewRenderer + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Anim = YAHOO.util.Anim; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + var DND_CONTAINER_ID = 'ygddfdiv', + DETAIL_PANEL_WIDTH = '377px', + DETAIL_PANEL_OFFSET = [-42, 25], + NAV_ITEM_WIDTH = 120, + NAV_ITEM_PADDING_X = 4, + NAV_PADDING_X = 52, + NAV_HEIGHT = 112, + HEADER_HEIGHT = 50, + SHARE_DOCLIB_HEADER_FOOTER_HEIGHT = 315, + FILMSTRIP_WINDOW_RESIZE_CHECK_TIME = 50, + FILMSTRIP_WINDOW_RESIZE_MIN_TIME = 200, + CAROUSEL_CONTENT_MIN_HEIGHT = 372, + WEB_PREVIEWER_HEIGHT, + itemHeaderHeight, + MIMETYPE_PREFIX_IMAGE = "image/"; + + /** + * FilmstripViewRenderer constructor. + * + * @param name {String} The name of the FilmstripViewRenderer + * @return {Alfresco.DocumentListFilmstripViewRenderer} The new FilmstripViewRenderer instance + * @constructor + */ + Alfresco.DocumentListFilmstripViewRenderer = function(name, parentDocumentList, commonComponentStyle) + { + Alfresco.DocumentListFilmstripViewRenderer.superclass.constructor.call(this, name, parentDocumentList, commonComponentStyle); + this.parentElementIdSuffix = "-filmstrip"; + this.windowResizeCheckTime = FILMSTRIP_WINDOW_RESIZE_CHECK_TIME; + this.windowResizeMinTime = FILMSTRIP_WINDOW_RESIZE_MIN_TIME; + return this; + }; + + /** + * Extend from Alfresco.DocumentListViewRenderer + */ + YAHOO.extend(Alfresco.DocumentListFilmstripViewRenderer, Alfresco.DocumentListGalleryViewRenderer); + + /** + * Generates a filmstrip item nav id from the given dataTable record + * + * @method getFilmstripNavItemId + * @param scope {object} The DocumentList object + * @param oRecord {object} data table record + * @return {string} the filmstrip nav item id + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripNavItemId = function DL_FVR_getFilmstripNavItemId(oRecord) + { + if (this.documentList != null && oRecord != null) + { + return this.documentList.id + '-filmstrip-nav-item-' + oRecord.getId(); + } + }; + + /** + * Gets an existing filmstrip item nav from the given dataTable record + * + * @method getFilmstripNavItem + * @param scope {object} The DocumentList object + * @param oRecord {object} data table record + * @param elCell {HTMLElement} the data table cell asking for the gallery item (optional) + * @return {object} the filmstrip nav item + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripNavItem = function DL_FVR_getFilmstripNavItem(oRecord, elCell) + { + if (this.documentList != null && oRecord != null) + { + var filmstripNavItemId = this.getFilmstripNavItemId(oRecord); + var filmstripNavItem = Dom.get(filmstripNavItemId); + if (filmstripNavItem === null && elCell != null) + { + // AJAX call must have updated the table, change our ID as well + var rowElement = Dom.getAncestorByTagName(elCell, 'tr'); + var oldFilmstripNavItemId = this.documentList.id + '-filmstrip-nav-item-' + rowElement.id; + filmstripNavItem = document.getElementById(oldFilmstripNavItemId); + if (filmstripNavItem !== null) + { + filmstripNavItem.setAttribute('id', filmstripNavItemId); + } + } + return filmstripNavItem; + } + }; + + /** + * Gets the filmstrip nav item's thumbnail element from the given filmstrip nav item + * + * @method getFilmstripNavItemThumbnailElement + * @param filmstripNavItem {HTMLElement} The filmstrip nav item object + * @return {HTMLElement} the filmstrip nav item thumbnail element + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripNavItemThumbnailElement = function DL_FVR_getFilmstripNavItemThumbnailElement(filmstripNavItem) + { + if (filmstripNavItem != null) + { + return Dom.getFirstChild(filmstripNavItem); + } + }; + + /** + * Gets the filmstrip nav item's label element from the given filmstrip nav item + * + * @method getFilmstripNavItemLabelElement + * @param filmstripNavItem {HTMLElement} The filmstrip nav item object + * @return {HTMLElement} the filmstrip nav item label element + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripNavItemLabelElement = function DL_FVR_getFilmstripNavItemLabelElement(filmstripNavItem) + { + if (filmstripNavItem != null) + { + var filmstripNavItemThumbnailDiv = this.getFilmstripNavItemThumbnailElement(filmstripNavItem); + return Dom.getChildren(filmstripNavItemThumbnailDiv)[0]; + } + }; + + /** + * Gets the filmstrip carousel element ID + * + * @method getFilmstripCarouselContainerId + * @param scope {Object} The document list object + * @return {String} the filmstrip carousel element ID + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripCarouselContainerId = function DL_FVR_getFilmstripCarouselContainerId(scope) + { + if (scope != null) + { + return scope.id + '-filmstrip-carousel'; + } + }; + + /** + * Gets the filmstrip nav element + * + * @method getFilmstripNavElement + * @param scope {Object} The document list object + * @return {HTMLElement} the filmstrip nav element + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripNavElement = function DL_FVR_getFilmstripNavElement(scope) + { + if (scope != null) + { + return Dom.get(scope.id + '-filmstrip-nav'); + } + }; + + /** + * Gets the filmstrip nav carousel element ID + * + * @method getFilmstripNavCarouselContainerId + * @param scope {Object} The document list object + * @return {String} the filmstrip nav carousel element ID + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getFilmstripNavCarouselContainerId = function DL_FVR_getFilmstripNavCarouselContainerId(scope) + { + if (scope != null) + { + return scope.id + '-filmstrip-nav-carousel'; + } + }; + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.getRowItemLabelElement + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getRowItemLabelElement = function DL_FVR_getRowItemLabelElement(rowItem) + { + if (rowItem != null) + { + var filmstripItemHeaderDiv = this.getRowItemHeaderElement(rowItem); + return Dom.getChildren(filmstripItemHeaderDiv)[2]; + } + }; + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.getRowItemActionsElement + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getRowItemActionsElement = function DL_FVR_getRowItemActionsElement(rowItem) + { + if (rowItem) + { + var galleryItemDetailDiv = this.getRowItemDetailElement(rowItem); + return Dom.getChildren(Dom.getFirstChild(galleryItemDetailDiv))[1]; + } + }; + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.getRowItemStatusElement + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getRowItemStatusElement = function DL_FVR_getRowItemStatusElement(rowItem) + { + if (rowItem != null) + { + var galleryItemDetailDiv = this.getRowItemDetailElement(rowItem); + return Dom.getChildren(Dom.getFirstChild(galleryItemDetailDiv))[0]; + } + }; + + /** + * Gets the filmstrip item's info button element from the given filmstrip item + * + * @method getRowItemInfoButtonElement + * @param filmstripItem {HTMLElement} The filmstrip item object + * @return {HTMLElement} the filmstrip item info button element + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.getRowItemInfoButtonElement = function DL_FVR_getRowItemInfoButtonElement(rowItem) + { + if (rowItem != null) + { + var filmstripItemHeaderDiv = this.getRowItemHeaderElement(rowItem); + return Dom.getChildren(filmstripItemHeaderDiv)[1]; + } + }; + + /** + * Handler for click of a filmstrip content nav item + * + * @method onClickFilmstripContentNavItem + * @param scope {Object} The document list object + * @param index {Number} The index of the nav item + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.onClickFilmstripContentNavItem = function DL_FVR_onClickFilmstripContentNavItem(scope, index) + { + if (scope != null && index != null) + { + scope.widgets.filmstripCarousel.scrollTo(index, false); + } + }; + + /** + * Handler for new filmstrip main content item + * + * @method onFilmstripMainContentChanged + * @param scope {Object} The document list object + * @param index {Number} The index of the nav item + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.onFilmstripMainContentChanged = function DL_FVR_onFilmstripMainContentChanged(scope, index) + { + if (scope != null) + { + this.destroyWebPreview(scope, index); + this.renderWebPreview(scope, index); + var pageNum = scope.widgets.filmstripNavCarousel.getPageForItem(index) - 1; + var currentPage = scope.widgets.filmstripNavCarousel.get('currentPage'); + if (pageNum != currentPage) + { + var firstOnPage = scope.widgets.filmstripNavCarousel.getFirstVisibleOnPage(pageNum + 1); + scope.widgets.filmstripNavCarousel.scrollTo(firstOnPage, true); + } + } + }; + + /** + * Handler for hiding header and content nav elements + * + * @method onToggleHeaderAndNav + * @param scope {Object} The document list object + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.onToggleHeaderAndNav = function DL_FVR_onToggleHeaderAndNav(scope) + { + if (scope != null) + { + var viewRendererInstance = this; + var container = Dom.get(scope.id + this.parentElementIdSuffix); + var currentPage = scope.widgets.filmstripCarousel.get('currentPage'); + var filmstripItem = Dom.getFirstChild(scope.widgets.filmstripCarousel.getElementForItem(currentPage)); + var header = this.getRowItemHeaderElement(filmstripItem); + var filmstripNav = this.getFilmstripNavElement(scope); + var headerAnim, navAnim; + if (!Dom.hasClass(container, 'alf-filmstrip-content-only')) + { + navAnim = new Anim(filmstripNav, { bottom: {to: -NAV_HEIGHT} }, 0.2); + headerAnim = new Anim(header, { top: {to: -HEADER_HEIGHT} }, 0.2); + headerAnim.onComplete.subscribe(function() { + Dom.addClass(container, 'alf-filmstrip-content-only'); + }); + } + else + { + Dom.setStyle(header, 'top', '-' + HEADER_HEIGHT + 'px'); + Dom.removeClass(container, 'alf-filmstrip-content-only'); + navAnim = new Anim(filmstripNav, { bottom: {to: 0} }, 0.2); + headerAnim = new Anim(header, { top: {to: 0} }, 0.2); + headerAnim.onComplete.subscribe(function() { + // Manually set all other headers + var i, j, otherFilmstripItemHeader, otherFilmstripItems = scope.widgets.filmstripCarousel.getElementForItems(); + for (i = 0, j = otherFilmstripItems.length; i < j; i++) + { + otherFilmstripItemHeader = viewRendererInstance.getRowItemHeaderElement(Dom.getFirstChild(otherFilmstripItems[i])); + Dom.setStyle(otherFilmstripItemHeader, 'top', '0px'); + } + }); + } + headerAnim.animate(); + navAnim.animate(); + } + }; + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.setupRenderer + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.setupRenderer = function DL_FVR_setupRenderer(scope) + { + Dom.addClass(scope.id + this.buttonElementIdSuffix, this.buttonCssClass); + + this.documentList = scope; + + var container = Dom.get(scope.id + this.parentElementIdSuffix); + + var viewRendererInstance = this; + + // TODO slide in and out of header and content nav here + + // On mouseover show the select checkbox and detail pull down + Event.delegate(container, 'mouseover', function DL_GVR_onGalleryItemMouseOver(event, matchedEl, container) + { +// Dom.addClass(matchedEl, 'alf-hover'); + viewRendererInstance.onEventHighlightRow(scope, event, matchedEl); + }, 'div.' + this.rowClassName, this); + + // On mouseout hide the select checkbox and detail pull down +// Event.delegate(container, 'mouseout', function DL_GVR_onGalleryItemMouseOut(event, matchedEl, container) +// { +// Dom.removeClass(matchedEl, 'alf-hover'); +// }, 'div.' + this.rowClassName, this); + + // On click of detail pull down show detail panel + Event.delegate(container, 'click', function DL_GVR_infoPopup(event, matchedEl, container) + { + viewRendererInstance.onShowGalleryItemDetail(scope, viewRendererInstance, event, matchedEl, container); + }, '.alf-show-detail', this); + + // On click of handle toggle header and nav + Event.addListener(Dom.get(scope.id + '-filmstrip-nav-handle'), 'click', function(e) + { + viewRendererInstance.onToggleHeaderAndNav(scope); + }); + + // On click of select checkbox + Event.delegate(container, 'click', function DL_GVR_selectCheckboxClicked(event, matchedEl, container) + { + var eventTarget = Event.getTarget(event); + scope.selectedFiles[eventTarget.value] = eventTarget.checked; + YAHOO.Bubbling.fire("selectedFilesChanged"); + }, '.alf-select input', this); + + YAHOO.Bubbling.on("selectedFilesChanged", function(layer, args) { + this.onSelectedFilesChanged(scope); + }, this); + YAHOO.Bubbling.on('webPreviewSetupComplete', function(layer, args) + { + var galleryItemDivs = Dom.getElementsByClassName('alf-gallery-item', 'div'); + if (galleryItemDivs != null && galleryItemDivs.length > 0) + { + var webPreviewDivs = Dom.getElementsByClassName('WebPreviewer', 'div'); + if (webPreviewDivs != null && webPreviewDivs.length > 0) + { + var previewHeight = parseInt(galleryItemDivs[0].style.height) - 46; + webPreviewDivs[0].style.height = previewHeight + 'px'; + } + } + var headerHeight = getHeaderHeight(); + setImagePreviewMargin(headerHeight); + }, this); + }; + + function setImagePreviewMargin(itemHeaderHeight) + { + var imagePreviewElements = Dom.getElementsByClassName('previewer Image'); + + if (imagePreviewElements.length == 0) + { + imagePreviewElements = Dom.getElementsByClassName('previewer WebPreviewer Image'); + + if (imagePreviewElements.length > 0) + { + imagePreviewElements[0].getElementsByTagName("img")[0].style.marginTop = itemHeaderHeight + "px"; + } + } + else + { + imagePreviewElements[0].style.marginTop = itemHeaderHeight + "px"; + } + } + + function renderImagePreview() + { + var itemHeaderHeight = getHeaderHeight(); + // MNT-10678 fix. Set CAROUSEL_CONTENT_MIN_HEIGHT according web flash preview height. + var webPreviewersRealDivs = Dom.getElementsByClassName('real', 'div'); + + if (webPreviewersRealDivs.length !== 0) + { + // WEB_PREVIEWER_HEIGHT = webPreviewersRealDivs[0].offsetHeight; + CAROUSEL_CONTENT_MIN_HEIGHT = WEB_PREVIEWER_HEIGHT + itemHeaderHeight; + } + + setImagePreviewMargin(itemHeaderHeight); + } + + function getHeaderHeight() + { + // Get the div for preview header + var elements = Dom.getElementsByClassName('alf-header'); + var previewHeaderElement; + //itemHeaderHeight; + for (var i = 0; i < elements.length; i++) + { + if (elements[i].id.indexOf('-item-header-yui-') > 0) + { + previewHeaderElement = elements[i]; + break; + } + } + return previewHeaderElement.offsetHeight; + } + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.destroyView + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.destroyView = function DL_GVR_destroyView(scope, sRequest, oResponse, oPayload) + { + this.restoreDataTable(scope); + var filmstripCarousel = Dom.get(this.getFilmstripCarouselContainerId(scope)); + if (filmstripCarousel != null) + { + Dom.get(this.getFilmstripCarouselContainerId(scope)).innerHTML = ''; + Dom.get(this.getFilmstripNavCarouselContainerId(scope)).innerHTML = ''; + } + this.destroyWebPreview(scope); + Dom.addClass(Dom.get(scope.id + this.parentElementIdSuffix), 'hidden'); + Dom.addClass(Dom.get(scope.id + this.parentElementEmptytIdSuffix), 'hidden'); + var dndContainer = Dom.get(DND_CONTAINER_ID); + Dom.removeClass(dndContainer, 'alf-filmstrip-dragging'); + if (this.windowResizeCallback) + { + Event.removeListener(window, 'resize', this.windowResizeCallback); + } + }; + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.renderView + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.renderView = function DL_FVR_renderView(scope, sRequest, oResponse, oPayload) + { + this.overrideDataTable(scope); + + var viewRendererInstance = this; + + // Call the dataTable render to setup the dataTable.recordSet + scope.widgets.dataTable.onDataReturnInitializeTable.call( + scope.widgets.dataTable, sRequest, oResponse, oPayload); + + var container = Dom.get(scope.id + this.parentElementIdSuffix); + var oRecordSet = scope.widgets.dataTable.getRecordSet(); + + var emptyContainer = Dom.get(scope.id + this.parentElementEmptytIdSuffix); + if (oRecordSet.getLength() == 0) + { + // No records, display the empty container and exit + Dom.removeClass(emptyContainer, 'hidden'); + Dom.setStyle(emptyContainer, 'height', 'auto'); + scope.widgets.dataTable.fireEvent('tableMsgShowEvent', {html: emptyContainer.innerHTML}); + return; + } + Dom.addClass(emptyContainer, 'hidden'); + + // Hide the container while we build it + Dom.setStyle(container, 'opacity', 0); + + var filmstripMainContent = Dom.get(scope.id + '-filmstrip-main-content'); + var carouselContainerId = this.getFilmstripCarouselContainerId(scope); + var carouselContainer = Dom.get(carouselContainerId); + carouselContainer.innerHTML = ''; + var carouselList = document.createElement('ol'); + carouselContainer.appendChild(carouselList); + + var filmstripNav = Dom.get(scope.id + '-filmstrip-nav'); + + var navCarouselContainerId = this.getFilmstripNavCarouselContainerId(scope); + var navCarouselContainer = Dom.get(navCarouselContainerId); + navCarouselContainer.innerHTML = ''; + var navCarouselList = document.createElement('ol'); + navCarouselContainer.appendChild(navCarouselList); + + Dom.addClass(container, 'alf-gallery'); + Dom.addClass(container, 'alf-filmstrip'); + Dom.removeClass(container, 'hidden'); + + var containerWidth = parseInt(Dom.getComputedStyle(container, 'width')); + // Set a 3:2 aspect ratio if we have room + var itemHeight = Math.floor((2 / 3) * containerWidth); + var maxItemHeight = Dom.getViewportHeight() - SHARE_DOCLIB_HEADER_FOOTER_HEIGHT; + if (Dom.hasClass(Dom.get(scope.id), 'alf-fullscreen')) + { + maxItemHeight = Dom.getViewportHeight(); + } + if ((maxItemHeight >= 0) && (itemHeight > maxItemHeight)) + { + itemHeight = maxItemHeight; + } + + var filmstripItemTemplate = Dom.get(scope.id + '-filmstrip-item-template'), + filmstripNavItemTemplate = Dom.get(scope.id + '-filmstrip-nav-item-template'), + filmstripItem = null, + filmstripNavItem = null, + filmstripListItem = null, + filmstripNavListItem = null; + + var oRecord, record, i, j; + for (i = 0, j = oRecordSet.getLength(); i < j; i++) + { + oRecord = oRecordSet.getRecord(i); + record = oRecord.getData(); + + filmstripListItem = document.createElement('li'); + carouselList.appendChild(filmstripListItem); + + filmstripNavListItem = document.createElement('li'); + navCarouselList.appendChild(filmstripNavListItem); + + // Append a filmstrip item div + var filmstripItemId = this.getRowItemId(oRecord); + filmstripItem = filmstripItemTemplate.cloneNode(true); + Dom.removeClass(filmstripItem, 'hidden'); + filmstripItem.setAttribute('id', filmstripItemId); + filmstripItem.style.width = containerWidth + 'px'; + filmstripItem.style.height = itemHeight + 'px'; + filmstripListItem.appendChild(filmstripItem); + + // Append a filmstrip item nav div + var filmstripNavItemId = this.getFilmstripNavItemId(oRecord); + filmstripNavItem = filmstripNavItemTemplate.cloneNode(true); + Dom.removeClass(filmstripNavItem, 'hidden'); + filmstripNavItem.setAttribute('id', filmstripNavItemId); + filmstripNavItem.style.width = NAV_ITEM_WIDTH + 'px'; + Event.addListener(filmstripNavItem, 'click', function(i) + { return function(e) + { YAHOO.Bubbling.fire('filmstripNavItemClicked', { index: i }) }; + }(i), this, true); + filmstripNavListItem.appendChild(filmstripNavItem); + + var galleryItemThumbnailDiv = this.getRowItemThumbnailElement(filmstripItem); + var galleryItemHeaderDiv = this.getRowItemHeaderElement(filmstripItem); + var galleryItemDetailDiv = this.getRowItemDetailElement(filmstripItem); + var galleryItemActionsDiv = this.getRowItemActionsElement(filmstripItem); + + // Set the item header id + galleryItemHeaderDiv.setAttribute('id', scope.id + '-item-header-' + oRecord.getId()); + + // Suffix of the content actions div id must match the onEventHighlightRow target id + galleryItemActionsDiv.setAttribute('id', scope.id + '-actions-' + filmstripItemId); + + // Only render the web-preview for the first filmstrip item and images(only if configured so) + if (i == 0 || (!this.documentList.options.filmstripImageLazyLoading && + record.node.mimetype != null && + record.node.mimetype.substring(0, MIMETYPE_PREFIX_IMAGE.length) == MIMETYPE_PREFIX_IMAGE)) + { + this.destroyWebPreview(scope, i); + this.renderWebPreview(scope, i); + } + + var filmstripNavItemThumbnailDiv = this.getFilmstripNavItemThumbnailElement(filmstripNavItem); + + // Render the thumbnail for the filmstrip nav item + this.renderCellThumbnail( + scope, + filmstripNavItemThumbnailDiv, + oRecord, + filmstripItem, + null, + '', + 'doclib'); + + // TODO - YUI carousel does not like variable widths +// var filmstripNavItemWidth = parseInt(Dom.getComputedStyle(filmstripNavItemThumbnailDiv, 'width')); +// filmstripItem.style.width = filmstripNavItemWidth; + + // Add the drag and drop + var imgId = record.jsNode.nodeRef.nodeRef; + var dnd = new Alfresco.DnD(imgId, scope); + + var galleryItemInfoButtonDiv = this.getRowItemInfoButtonElement(filmstripItem); + // Create a YUI Panel with a relative context of its associated galleryItem + galleryItemDetailDiv.panel = new YAHOO.widget.Panel(galleryItemDetailDiv, + { + visible:false, draggable:false, close:false, constraintoviewport: true, + underlay: 'none', width: DETAIL_PANEL_WIDTH, + context: [filmstripItem, 'tr', 'tr', null, DETAIL_PANEL_OFFSET] + }); + }; + + scope.widgets.filmstripCarousel = new YAHOO.widget.Carousel(this.getFilmstripCarouselContainerId(scope), { + animation: { speed: 0.2 }, + numVisible: 1, + navigation: + { + prev: scope.id + '-filmstrip-nav-main-previous', + next: scope.id + '-filmstrip-nav-main-next' + } + }); + scope.widgets.filmstripCarousel.render(); + scope.widgets.filmstripCarousel.show(); + scope.widgets.filmstripCarousel.focus(); + + var numNavItemsVisible = Math.floor((containerWidth - (NAV_PADDING_X * 2)) / (NAV_ITEM_WIDTH + NAV_ITEM_PADDING_X)); + scope.widgets.filmstripNavCarousel = new YAHOO.widget.Carousel(this.getFilmstripNavCarouselContainerId(scope), { + animation: { speed: 0.5 }, + numVisible: numNavItemsVisible, + navigation: + { + prev: scope.id + '-filmstrip-nav-previous', + next: scope.id + '-filmstrip-nav-next' + } + }); + scope.widgets.filmstripNavCarousel.render(); + scope.widgets.filmstripNavCarousel.show(); + + // Add the content navigation handling + YAHOO.Bubbling.on('filmstripNavItemClicked', function(layer, args) + { + this.onClickFilmstripContentNavItem(scope, args[1].index); + }, this); + scope.widgets.filmstripCarousel.on('pageChange', function (ev) + { + viewRendererInstance.onFilmstripMainContentChanged(scope, ev); + }); + + var dndContainer = Dom.get(DND_CONTAINER_ID); + Dom.addClass(dndContainer, 'alf-filmstrip-dragging'); + + this.currentResizeCallback = function(e) + { + viewRendererInstance.resizeView(scope, sRequest, oResponse, oPayload); + }; + this.setupWindowResizeListener(); + + renderImagePreview(); + + // MNT-10678 fix. Fix for small screen resolutions. Setting up the minimal height for Carousel Content div. + var carouselContentDivs = Dom.getElementsByClassName('yui-carousel-element'); + // set the carousel height + carouselContentDivs[0].style.minHeight = CAROUSEL_CONTENT_MIN_HEIGHT + "px"; + + var galeryItems = Dom.getElementsByClassName('alf-gallery-item'); + + for (var i = 0; i < galeryItems.length; i++) + { + if (galeryItems[i].className.indexOf('hidden') < 0) + { + galeryItems[i].style.minHeight = CAROUSEL_CONTENT_MIN_HEIGHT + "px"; + } + } + + // hide scrol panel for the carousel element when it's hidden. + var filmstripNavDiv = Dom.get(scope.id+ '-filmstrip'); + filmstripNavDiv.style.overflow = "hidden"; + + var fadeIn = new YAHOO.util.Anim(container, { + opacity: + { + from: 0, + to: 1 + } + }, 0.4, YAHOO.util.Easing.easeOut); + fadeIn.animate(); + }; + + Alfresco.DocumentListFilmstripViewRenderer.prototype.renderWebPreview = function DL_FVR_renderWebPreview(scope, index) + { + var containerTarget; // This will only get set if thumbnail represents a container + + var oRecordSet = scope.widgets.dataTable.getRecordSet(); + + if (oRecordSet.getLength() > 0) + { + var oRecord = oRecordSet.getRecord(index); + var record = oRecord.getData(); + var filmstripItemId = this.getRowItemId(oRecord); + var filmstripItem = document.getElementById(filmstripItemId); + var galleryItemThumbnailDiv = this.getRowItemThumbnailElement(filmstripItem); + + WEB_PREVIEWER_HEIGHT = galleryItemThumbnailDiv.offsetHeight; + + var thumbnail = this.getThumbnail( + scope, galleryItemThumbnailDiv, oRecord, null, null, '-filmstrip-main-content'); + + if (thumbnail.isContainer) + { + if (!document.getElementById(thumbnail.id)) + { + galleryItemThumbnailDiv.innerHTML += '' + (thumbnail.isLink ? '' : '') + + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + thumbnail.html + ''; + } + } + else + { + // Image web preview may still be present so only render if web-preview doesn't exist + var galleryItemThumbnailDivChildren = Dom.getElementsByClassName('web-preview', 'div', galleryItemThumbnailDiv); + if (galleryItemThumbnailDivChildren == null || galleryItemThumbnailDivChildren.length == 0) + { + var nodeRefToUse = record.nodeRef; + if(thumbnail.isLink && record.node.linkedNode && record.node.linkedNode.nodeRef) + { + nodeRefToUse = record.node.linkedNode.nodeRef; + } + // Render the web-preview for the filmstrip item + Alfresco.util.loadWebscript( + { + url: Alfresco.constants.URL_SERVICECONTEXT + "components/preview/web-preview", + properties: { nodeRef: nodeRefToUse }, + target: galleryItemThumbnailDiv + }); + } + } + } + }; + + Alfresco.DocumentListFilmstripViewRenderer.prototype.destroyWebPreview = function DL_FVR_destroyWebPreview(scope, index) + { + var previewRealDivs = Dom.getElementsByClassName('real', 'div'); + if (previewRealDivs != null) + { + for (i = 0, j = previewRealDivs.length; i < j; i++) + { + if (Dom.hasClass(previewRealDivs[i], 'web-preview')) + { + previewRealDivs[i].parentNode.removeChild(previewRealDivs[i]); + } + } + } + var previewDivs = Dom.getElementsByClassName('WebPreviewer', 'div'); + if (previewDivs != null) + { + for (i = 0, j = previewDivs.length; i < j; i++) + { + if (Dom.hasClass(previewDivs[i], 'previewer')) + { + previewDivs[i].parentNode.parentNode.parentNode.removeChild(previewDivs[i].parentNode.parentNode); + } + } + } + } + + + Alfresco.DocumentListFilmstripViewRenderer.prototype.resizeView = function DL_FVR_resizeView(scope, sRequest, oResponse, oPayload) + { + var container = Dom.get(scope.id + this.parentElementIdSuffix); + // Ignore if true full screen resizing due to conflicting firing times + if (!Dom.hasClass(container, 'alf-true-fullscreen')) + { + var currentPage = scope.widgets.filmstripCarousel.get('currentPage'); + this.renderView(scope, sRequest, oResponse, oPayload); + // Wait for carousel to render + setTimeout(function() + { + scope.widgets.filmstripCarousel.scrollTo(currentPage, false); + }, 50); + } + } + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.onSelectedFilesChanged + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.onSelectedFilesChanged = function DL_FVR_onSelectedFilesChanged(scope) + { + // Set all selected decorators + var oRecordSet = scope.widgets.dataTable.getRecordSet(), oRecord, record, jsNode, nodeRef, filmstripNavItem, i, j; + var anySelected = false; + for (i = 0, j = oRecordSet.getLength(); i < j; i++) + { + oRecord = oRecordSet.getRecord(i); + jsNode = oRecord.getData("jsNode"); + nodeRef = jsNode.nodeRef; + filmstripNavItem = this.getFilmstripNavItem(oRecord); + var isChecked = scope.selectedFiles[nodeRef]; + if (isChecked) + { + Dom.addClass(filmstripNavItem, 'alf-selected'); + anySelected = true; + } + else + { + Dom.removeClass(filmstripNavItem, 'alf-selected'); + } + } + + // If any have been selected add indicator to the parent container + var container = Dom.get(scope.id + this.parentElementIdSuffix); + if (anySelected) + { + if (!Dom.hasClass(container, 'alf-selected')) + { + Dom.addClass(container, 'alf-selected'); + } + } + else + { + Dom.removeClass(container, 'alf-selected'); + } + } + + /** + * Override to prevent rendering of the navigation link + * + * @see Alfresco.DocumentListFilmstripViewRenderer.renderCellThumbnail + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.renderCellThumbnail = function DL_FVR_renderCellThumbnail(scope, elCell, oRecord, oColumn, oData, imgIdSuffix, renditionName) + { + var containerTarget; // This will only get set if thumbnail represents a container + + var thumbnail = this.getThumbnail(scope, elCell, oRecord, oColumn, oData, imgIdSuffix, renditionName); + var record = oRecord.getData(); + + // Just add the data table thumbnail once + if (!document.getElementById(thumbnail.id)) + { + if (thumbnail.isContainer || (thumbnail.isLink && record.jsNode.linkedNode.isContainer)) + { + elCell.innerHTML += '' + (thumbnail.isLink ? '' : '') + + (scope.dragAndDropEnabled ? '' : '') + thumbnail.html; + containerTarget = new YAHOO.util.DDTarget(thumbnail.id); // Make the folder a target + } + else + { + elCell.innerHTML += '' + (thumbnail.isLink ? '' : '') + thumbnail.html + ''; + } + var thumbnailElement = document.getElementById(thumbnail.id); + if (thumbnailElement) + { + var tempImg = new Image(); + tempImg.onload = function() + { + if(tempImg.width > tempImg.height) + { + Dom.addClass(thumbnailElement, 'alf-landscape'); + } + } + tempImg.src = thumbnailElement.src; + } + } + }; + + /** + * @see Alfresco.DocumentListGalleryViewRenderer.renderCellDescription + */ + Alfresco.DocumentListFilmstripViewRenderer.prototype.renderCellDescription = function DL_FVR_renderCellDescription(scope, elCell, oRecord, oColumn, oData) + { + Alfresco.DocumentListGalleryViewRenderer.superclass.renderCellDescription.call(this, scope, elCell, oRecord, oColumn, oData); + var filmstripItem = this.getRowItem(oRecord, elCell); + // Check for null galleryItem due to ALF-15529 + if (filmstripItem !== null) + { + // Copy description + var filmstripItemDetailDescriptionElement = this.getRowItemDetailDescriptionElement(filmstripItem).innerHTML = elCell.innerHTML; + // Clear out the table cell so there's no conflicting HTML IDs + elCell.innerHTML = ''; + // Add a simple display label + this.getRowItemLabelElement(filmstripItem).innerHTML = $html(oRecord.getData().displayName); + } + // Add a simple display label for the nav item + var filmstripNavItem = this.getFilmstripNavItem(oRecord, elCell); + if (filmstripNavItem !== null) + { + this.getFilmstripNavItemLabelElement(filmstripNavItem).innerHTML = $html(oRecord.getData().displayName); + } + }; + + +})(); + diff --git a/share/src/main/webapp/components/documentlibrary/documentlist-view-gallery.js b/share/src/main/webapp/components/documentlibrary/documentlist-view-gallery.js new file mode 100644 index 0000000000..a6c9f058e9 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist-view-gallery.js @@ -0,0 +1,1154 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * @module DocumentLibrary + */ + +/** + * Gallery view extension of DocumentListViewRenderer component. + * + * @namespace Alfresco + * @class Alfresco.DocumentListGalleryViewRenderer + * @extends Alfresco.DocumentListViewRenderer + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Anim = YAHOO.util.Anim; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Preferences + */ + var PREFERENCES_DOCLIST = "org.alfresco.share.documentList", + PREF_GALLERY_COLUMNS = PREFERENCES_DOCLIST + ".galleryColumns", + DND_CONTAINER_ID = 'ygddfdiv'; + + // Other constants + var DEFAULT_GALLERY_COLUMNS = 7, // Only used if option is undefined + DETAIL_PANEL_WIDTH = '397px', + DETAIL_PANEL_OFFSET = [-40, -20], + DETAIL_PANEL_DEFAULT_TIMEOUT = 700, + WINDOW_RESIZE_CHECK_TIME = 20, + WINDOW_RESIZE_MIN_TIME = 100, + ANIMATE_ON_WINDOW_RESIZE = false, + ANIMATE_ON_COLUMN_CHANGE = true; + + /** + * GalleryViewRenderer constructor. + * + * @param name {String} The name of the GalleryViewRenderer + * @return {Alfresco.DocumentListGalleryViewRenderer} The new GalleryViewRenderer instance + * @constructor + */ + Alfresco.DocumentListGalleryViewRenderer = function(name, parentDocumentList, commonComponentStyle, galleryColumns) + { + Alfresco.DocumentListGalleryViewRenderer.superclass.constructor.call(this, name, parentDocumentList, commonComponentStyle); + this.parentElementIdSuffix = "-gallery"; + this.parentElementEmptytIdSuffix = "-gallery-empty"; + this.rowClassName = "alf-gallery-item"; + this.infoPanelClassName = "alf-detail"; + this.metadataBannerViewName = "detailed"; + this.metadataLineViewName = "detailed"; + this.galleryColumns = galleryColumns; + this.infoPanelPopupTimeout = DETAIL_PANEL_DEFAULT_TIMEOUT; + this.windowResizeCheckTime = WINDOW_RESIZE_CHECK_TIME; + this.windowResizeMinTime = WINDOW_RESIZE_MIN_TIME; + this.documentList = null; + return this; + }; + + /** + * Extend from Alfresco.DocumentListViewRenderer + */ + YAHOO.extend(Alfresco.DocumentListGalleryViewRenderer, Alfresco.DocumentListViewRenderer); + + /** + * Generates a row item HTML ID from the given dataTable record + * + * @method getRowItemId + * @param oRecord {object} data table record + * @return {string} the row HTML item ID + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemId = function DL_GVR_getRowItemId(oRecord) + { + if (this.documentList != null && oRecord != null) + { + return this.documentList.id + '-gallery-item-' + oRecord.getId(); + } + }; + + /** + * Gets the row item HTML element from the given dataTable record, checking and fixing any IDs changed by AJAX calls + * to the dataTable as well + * + * @method getRowItem + * @param oRecord {object} data table record + * @param elCell {HTMLElement} the data table cell asking for the gallery item (optional) + * @return {HTMLElement} the row item + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItem = function DL_GVR_getRowItem(oRecord, elCell) + { + if (this.documentList != null && oRecord != null) + { + var galleryItemId = this.getRowItemId(oRecord); + // Yahoo.util.Dom.get does not work here for some reason + var galleryItem = document.getElementById(galleryItemId); + if (galleryItem === null && elCell != null) + { + // AJAX call must have updated the table, change our ID as well + var rowElement = Dom.getAncestorByTagName(elCell, 'tr'); + var oldGalleryItemId = this.documentList.id + '-gallery-item-' + rowElement.id; + galleryItem = document.getElementById(oldGalleryItemId); + if (galleryItem !== null) + { + galleryItem.setAttribute('id', galleryItemId); + } + } + return galleryItem; + } + }; + + /** + * Generates a row item select id from the given dataTable record + * + * @method getRowItemSelectId + * @param oRecord {object} data table record + * @return {string} the row item select control ID + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemSelectId = function DL_GVR_getRowItemSelectId(oRecord) + { + if (oRecord != null) + { + return 'checkbox-' + oRecord.getId() + '-gallery-item'; + } + }; + + /** + * Gets the row item's detail popup panel element from the given row item + * + * @method getRowItemDetailElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item detail element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemDetailElement = function DL_GVR_getRowItemDetailElement(rowItem) + { + if (rowItem != null) + { + var galleryItemDetailElement = Dom.getChildren(rowItem)[1]; + // YUI may have added its container + if (Dom.hasClass(galleryItemDetailElement, 'yui-panel-container')) + { + galleryItemDetailElement = Dom.getFirstChild(galleryItemDetailElement); + } + return galleryItemDetailElement; + } + }; + + /** + * Gets the row item's detail description element from the given row item + * + * @method getRowItemDetailDescriptionElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item detail description element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemDetailDescriptionElement = function DL_GVR_getRowItemDetailDescriptionElement(rowItem) + { + if (rowItem != null) + { + var galleryItemDetailDiv = this.getRowItemDetailElement(rowItem); + return Dom.getChildren(Dom.getFirstChild(galleryItemDetailDiv))[3]; + } + }; + + /** + * Gets the row item's detail thumbnail element from the given row item + * + * @method getRowItemDetailThumbnailElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item detail thumbnail element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemDetailThumbnailElement = function DL_GVR_getRowItemDetailThumbnailElement(rowItem) + { + if (rowItem != null) + { + var galleryItemDetailDiv = this.getRowItemDetailElement(rowItem); + return Dom.getFirstChild(Dom.getFirstChild(galleryItemDetailDiv)); + } + }; + + /** + * Gets the row item's thumbnail element from the given row item + * + * @method getRowItemThumbnailElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item thumbnail element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemThumbnailElement = function DL_GVR_getRowItemThumbnailElement(rowItem) + { + if (rowItem != null) + { + return Dom.getFirstChild(rowItem); + } + }; + + /** + * Gets the row item's header element from the given row item + * + * @method getRowItemHeaderElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item header element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemHeaderElement = function DL_GVR_getRowItemHeaderElement(rowItem) + { + if (rowItem != null) + { + var galleryItemThumbnailDiv = this.getRowItemThumbnailElement(rowItem); + return Dom.getFirstChild(galleryItemThumbnailDiv); + } + }; + + /** + * Gets the row item's selection element from the given row item + * + * @method getRowItemSelectElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item selection element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemSelectElement = function DL_GVR_getRowItemSelectElement(rowItem) + { + if (rowItem != null) + { + var galleryItemHeaderElement = this.getRowItemHeaderElement(rowItem); + return Dom.getFirstChild(galleryItemHeaderElement); + } + }; + + /** + * Gets the row item's label element from the given row item + * + * @method getRowItemLabelElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item label element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemLabelElement = function DL_GVR_getRowItemLabelElement(rowItem) + { + if (rowItem != null) + { + var galleryItemThumbnailDiv = this.getRowItemThumbnailElement(rowItem); + return Dom.getChildren(galleryItemThumbnailDiv)[1]; + } + }; + + /** + * Gets the row item's status element from the given row item + * + * @method getRowItemStatusElement + * @param rowItem {HTMLElement} The row item object + * @return {HTMLElement} the row item status element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemStatusElement = function DL_GVR_getRowItemStatusElement(rowItem) + { + if (rowItem != null) + { + var galleryItemDetailDiv = this.getRowItemDetailElement(rowItem); + return Dom.getChildren(Dom.getFirstChild(galleryItemDetailDiv))[1]; + } + }; + + /** + * Gets the row item's actions element from the given row item + * + * @method getRowItemActionsElement + * @param rowItemscope.services.preferences.get(); {HTMLElement} The row item object + * @return {HTMLElement} the row item actions element + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowItemActionsElement = function DL_GVR_getRowItemActionsElement(rowItem) + { + if (rowItem != null) + { + var galleryItemDetailDiv = this.getRowItemDetailElement(rowItem); + return Dom.getChildren(Dom.getFirstChild(galleryItemDetailDiv))[2]; + } + }; + + // Override some of the standard ViewRenderer methods + + Alfresco.DocumentListGalleryViewRenderer.prototype.getDataTableRecordIdFromRowElement = function DL_GVR_getDataTableRecordIdFromRowElement(scope, rowElement) + { + var elementId = Alfresco.DocumentListGalleryViewRenderer.superclass.getDataTableRecordIdFromRowElement.call(this, scope, rowElement); + if (elementId != null) + { + return elementId.replace(scope.id + '-gallery-item-', ''); + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowElementFromDataTableRecord = function DL_GVR_getRowElementFromDataTableRecord(scope, oRecord) + { + var galleryItemId = this.getRowItemId(oRecord); + // Yahoo.util.Dom.get does not work here for some reason + return document.getElementById(galleryItemId); + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.getRowSelectElementFromDataTableRecord = function DL_GVR_getRowSelectElementFromDataTableRecord(scope, oRecord) + { + var selectId = this.getRowItemSelectId(oRecord); + return Dom.get(selectId); + }; + + /** + * Sets up the gallery item hover delegates. + * + * @method setupItemHovers + * @param scope {HTMLElement} The document list object + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.setupItemHovers = function DL_GVR_setupItemHovers(scope) + { + var container = Dom.get(scope.id + this.parentElementIdSuffix); + + // On mouseover show the select checkbox and detail pull down + Event.delegate(container, 'mouseover', Alfresco.DocumentListGalleryViewRenderer.onMouseOverItem, + 'div.' + this.rowClassName, this); + + // On mouseout hide the select checkbox and detail pull down + Event.delegate(container, 'mouseout', Alfresco.DocumentListGalleryViewRenderer.onMouseOutItem, + 'div.' + this.rowClassName, this); + } + + /** + * Tear down of the gallery item hover delegates. + * + * @method destroyItemHovers + * @param scope {HTMLElement} The document list object + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.destroyItemHovers = function DL_GVR_destroyItemHovers(scope) + { + var container = Dom.get(scope.id + this.parentElementIdSuffix); + + Event.removeDelegate(container, 'mouseover', + Alfresco.DocumentListGalleryViewRenderer.onMouseOverItem); + + Event.removeDelegate(container, 'mouseout', + Alfresco.DocumentListGalleryViewRenderer.onMouseOutItem); + } + + Alfresco.DocumentListGalleryViewRenderer.prototype.setupRenderer = function DL_GVR_setupRenderer(scope) + { + Alfresco.DocumentListGalleryViewRenderer.superclass.setupRenderer.call(this, scope); + + this.documentList = scope; + + var container = Dom.get(scope.id + this.parentElementIdSuffix); + + this.galleryColumnsChangedEvent = new YAHOO.util.CustomEvent("galleryViewColumnsChangedCE"); + YAHOO.Bubbling.subscribe("galleryViewColumnsChanged", function(layer, args) { + this.galleryColumnsChangedEvent.fire(); + }, this); + + this.setupItemHovers(scope); + + var viewRendererInstance = this; + + // On click of detail pull down show detail panel + Event.delegate(container, 'click', function DL_GVR_infoPopup(event, matchedEl, container) + { + viewRendererInstance.onShowGalleryItemDetail(scope, viewRendererInstance, event, matchedEl, container); + }, '.alf-show-detail', this); + + // On click of select checkbox + Event.delegate(container, 'click', function DL_GVR_selectCheckboxClicked(event, matchedEl, container) + { + var eventTarget = Event.getTarget(event); + scope.selectedFiles[eventTarget.value] = eventTarget.checked; + YAHOO.Bubbling.fire("selectedFilesChanged"); + }, '.alf-select input', this); + + YAHOO.Bubbling.on("selectedFilesChanged", function(layer, args) { + this.onSelectedFilesChanged(scope); + }, this); + + + this.galleryColumns = Alfresco.util.findValueByDotNotation(scope.services.preferences.get(), PREF_GALLERY_COLUMNS); + if (!this.galleryColumns) + { + this.galleryColumns = DEFAULT_GALLERY_COLUMNS; + } + + this.setupGalleryColumnsSlider(scope, this); + }; + + /** + * Override the standard dataTable since calls in Alfresco.DnD which are closely tied to it + * at the moment. + * TODO - Remove once https://issues.alfresco.com/jira/browse/ALF-15384 is implemented + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.overrideDataTable = function DL_GVR_overrideDataTable(scope) + { + var viewRendererInstance = this; + if (scope.widgets.dataTable) + { + if (scope.widgets.dataTable.getRecord != scope.widgets.dataTable.getHiddenRecord) + { + // Save the normal getRecord method + scope.widgets.dataTable.getVisibleRecord = scope.widgets.dataTable.getRecord; + // Define a new method which also checks for hidden elements + scope.widgets.dataTable.getHiddenRecord = function getHiddenRecord(row) + { + var oRecord = scope.widgets.dataTable.getVisibleRecord(row); + if (oRecord == null) + { + if (typeof row === "string") + { + oRecord = scope.widgets.dataTable.getVisibleRecord(row + '-hidden'); + } + else if (row) + { + oRecord = scope.widgets.dataTable.getVisibleRecord(row.id + '-hidden'); + } + } + return oRecord; + } + // Replace the getRecord function + scope.widgets.dataTable.getRecord = scope.widgets.dataTable.getHiddenRecord; + } + if (scope.widgets.dataTable.getContainerEl != scope.widgets.dataTable.getGalleryContainerEl) + { + // Save the normal getContainerEl method + scope.widgets.dataTable.origGetContainerEl = scope.widgets.dataTable.getContainerEl; + // Define a new method which returns the gallery container + scope.widgets.dataTable.getGalleryContainerEl = function getGalleryContainer() + { + return Dom.get(scope.id + viewRendererInstance.parentElementIdSuffix); + } + // Replace the getContainerEl method + scope.widgets.dataTable.getContainerEl = scope.widgets.dataTable.getGalleryContainerEl; + } + } + }; + + /** + * Restore the dataTable to its normal getContainerEl function + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.restoreDataTable = function DL_GVR_restoreDataTable(scope) + { + if (scope.widgets.dataTable.getContainerEl == scope.widgets.dataTable.getGalleryContainerEl) + { + // Restore the getContainerEl method + scope.widgets.dataTable.getContainerEl = scope.widgets.dataTable.origGetContainerEl; + } + }; + + /** + * Render the gallery view using the existing dataTable + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.renderView = function DL_GVR_renderView(scope, sRequest, oResponse, oPayload) + { + this.overrideDataTable(scope); + + var viewRendererInstance = this; + + // Call the dataTable render to setup the dataTable.recordSet + scope.widgets.dataTable.onDataReturnInitializeTable.call( + scope.widgets.dataTable, sRequest, oResponse, oPayload); + + var container = Dom.get(scope.id + this.parentElementIdSuffix); + var oRecordSet = scope.widgets.dataTable.getRecordSet(); + + if (oRecordSet.getLength() == 0) + { + // No records, display the empty container and exit + var emptyContainer = Dom.get(scope.id + this.parentElementEmptytIdSuffix); + container.innerHTML = emptyContainer.innerHTML; + Dom.getFirstChild(emptyContainer).innerHTML = ''; + scope.widgets.dataTable.fireEvent('tableMsgShowEvent', { html: container.innerHTML }); + Dom.removeClass(container, 'alf-gallery'); + Dom.removeClass(container, 'hidden'); + Dom.setStyle(container, 'height', 'auto'); + return; + } + + // Clear the gallery div and hide while we build it + container.innerHTML = ''; + Dom.setStyle(container, 'opacity', 0); + Dom.addClass(container, 'alf-gallery'); + Dom.removeClass(container, 'hidden'); + + var galleryItemTemplate = Dom.get(scope.id + '-gallery-item-template'), + galleryItem = null; + + var oRecord, record, i, j; + for (i = 0, j = oRecordSet.getLength(); i < j; i++) + { + oRecord = oRecordSet.getRecord(i); + record = oRecord.getData(); + + // Append a gallery item div + var galleryItemId = this.getRowItemId(oRecord); + galleryItem = galleryItemTemplate.cloneNode(true); + Dom.removeClass(galleryItem, 'hidden'); + galleryItem.setAttribute('id', galleryItemId); + container.appendChild(galleryItem); + + var galleryItemThumbnailDiv = this.getRowItemThumbnailElement(galleryItem); + var galleryItemHeaderDiv = this.getRowItemHeaderElement(galleryItem); + var galleryItemDetailDiv = this.getRowItemDetailElement(galleryItem); + var galleryItemActionsDiv = this.getRowItemActionsElement(galleryItem); + + // Set the item header id + galleryItemHeaderDiv.setAttribute('id', scope.id + '-item-header-' + oRecord.getId()); + + // Suffix of the content actions div id must match the onEventHighlightRow target id + galleryItemActionsDiv.setAttribute('id', scope.id + '-actions-' + galleryItemId); + + // Render the thumbnail within the gallery item + this.renderCellThumbnail( + scope, + galleryItemThumbnailDiv, + oRecord, + galleryItem, + null, + ''); + + // Add the drag and drop + var imgId = record.jsNode.nodeRef.nodeRef; + var dnd = new Alfresco.DnD(imgId, scope); + + // Create a YUI Panel with a relative context of its associated galleryItem + galleryItemDetailDiv.panel = new YAHOO.widget.Panel(galleryItemDetailDiv, + { + visible:false, draggable:false, close:false, constraintoviewport: true, + underlay: 'none', width: DETAIL_PANEL_WIDTH, + context: [galleryItem, 'tl', 'tl', [this.galleryColumnsChangedEvent], DETAIL_PANEL_OFFSET] + }); + }; + + scope.widgets.galleryColumnsSlider.initialize(); + + this.currentResizeCallback = function(e) + { + viewRendererInstance.resizeView(scope, sRequest, oResponse, oPayload); + }; + this.setupWindowResizeListener(); + }; + + /** + * Clear the gallery view container + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.destroyView = function DL_GVR_destroyView(scope, sRequest, oResponse, oPayload) + { + this.restoreDataTable(scope); + Dom.get(scope.id + this.parentElementIdSuffix).innerHTML = ''; + Dom.addClass(Dom.get(scope.id + this.parentElementIdSuffix), 'hidden'); + Dom.addClass(Dom.get(scope.id + "-gallery-slider"), 'hidden'); + // Clear the columns class on drag and drop + var dndContainer = Dom.get(DND_CONTAINER_ID); + columnOptions = [3, 4, 7, 10]; + for ( var i = 0; i < columnOptions.length; i++) { + Dom.removeClass(dndContainer, 'alf-gallery-columns-' + columnOptions[i]); + } + if (this.windowResizeCallback) + { + Event.removeListener(window, 'resize', this.windowResizeCallback); + } + }; + + /** + * Handler for a click on a thumbnail once in select mode + * + * @method onSelectModeImgClicked + * @param event {Event} The click event + * @param matchedEl {HTMLElement} the element that was clicked + * @param container {HTMLElement} the parent container (the entire gallery) + */ + Alfresco.DocumentListGalleryViewRenderer.onSelectModeImgClicked = function DL_GVR_onSelectModeImgClicked(event, matchedEl, container, scope) + { + var galleryItem = Dom.getAncestorByClassName(matchedEl, scope.rowClassName); + var selectDiv = Dom.getElementsByClassName('alf-select', 'div', galleryItem)[0]; + var selectCheckbox = Dom.getFirstChild(selectDiv); + selectCheckbox.checked = !selectCheckbox.checked; + scope.documentList.selectedFiles[selectCheckbox.value] = selectCheckbox.checked; + YAHOO.Bubbling.fire("selectedFilesChanged"); + }; + + /** + * Handler for mouse over a gallery item + * + * @method onMouseOverItem + * @param event {Event} The click event + * @param matchedEl {HTMLElement} the element that was clicked + * @param container {Object} the parent container (the entire gallery) + * @param viewRendererInstance {Object} the view renderer instance + */ + Alfresco.DocumentListGalleryViewRenderer.onMouseOverItem = function DL_GVR_onMouseOverItem(event, matchedEl, container, viewRendererInstance) + { + Dom.addClass(matchedEl, 'alf-hover'); + viewRendererInstance.onEventHighlightRow(viewRendererInstance.documentList, event, matchedEl); + }; + + /** + * Handler for mouse out of a gallery item + * + * @method onMouseOutItem + * @param event {Event} The click event + * @param matchedEl {HTMLElement} the element that was clicked + * @param container {Object} the parent container (the entire gallery) + * @param viewRendererInstance {Object} the view renderer instance + */ + Alfresco.DocumentListGalleryViewRenderer.onMouseOutItem = function DL_GVR_onMouseOutItem(event, matchedEl, container, viewRendererInstance) + { + Dom.removeClass(matchedEl, 'alf-hover'); + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.onActionShowMore = function DL_GVR_onActionShowMore(scope, record, elMore) + { + Alfresco.DocumentListGalleryViewRenderer.superclass.onActionShowMore.call(this, scope, record, elMore); + var fnHideMoreActions = function DL_GVR_fnHideMoreActions() + { + if (scope.hideMoreActionsFn) + { + scope.hideMoreActionsFn.call(this); + } + }; + var elMoreActions = Dom.getNextSibling(elMore); + Event.on(elMoreActions, "mouseleave", fnHideMoreActions, elMoreActions); + }; + + /** + * Handler for selection of a gallery items + * + * @method onSelectedFilesChanged + * @param scope {object} The DocumentList object + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.onSelectedFilesChanged = function DL_GVR_onSelectedFilesChanged(scope) + { + // Set all selected decorators + var oRecordSet = scope.widgets.dataTable.getRecordSet(), oRecord, record, jsNode, nodeRef, galleryItem, i, j; + var anySelected = false; + for (i = 0, j = oRecordSet.getLength(); i < j; i++) + { + oRecord = oRecordSet.getRecord(i); + jsNode = oRecord.getData("jsNode"); + nodeRef = jsNode.nodeRef; + galleryItem = this.getRowElementFromDataTableRecord(scope, oRecord); + isChecked = scope.selectedFiles[nodeRef]; + if (isChecked) + { + Dom.addClass(galleryItem, 'alf-selected'); + anySelected = true; + } + else + { + Dom.removeClass(galleryItem, 'alf-selected'); + } + } + + // If any have been selected add indicator to the parent container + var container = Dom.get(scope.id + this.parentElementIdSuffix); + if (anySelected) + { + if (!Dom.hasClass(container, 'alf-selected')) + { + Dom.addClass(container, 'alf-selected'); + } + } + else + { + Dom.removeClass(container, 'alf-selected'); + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.renderCellSelected = function DL_GVR_renderCellSelected(scope, elCell, oRecord, oColumn, oData) + { + var galleryItem = this.getRowItem(oRecord, elCell); + // Check for null galleryItem due to ALF-15529 + if (galleryItem != null) + { + var galleryItemSelectDiv = this.getRowItemSelectElement(galleryItem); + var jsNode = oRecord.getData("jsNode"), + nodeRef = jsNode.nodeRef, + name = oRecord.getData("displayName"), + checkbox = document.createElement("input"), + label = document.createElement("label"); + + var checkboxId = this.getRowItemSelectId(oRecord); + + checkbox.id = checkboxId; + checkbox.type = "checkbox"; + checkbox.name = "fileChecked"; + checkbox.value = nodeRef; + checkbox.checked = scope.selectedFiles[nodeRef] ? true : false; + + label.id = "label_for_" + checkbox.id; + label.style.fontSize="0em"; + label.innerHTML = (checkbox.checked ? scope.msg("checkbox.uncheck") : scope.msg("checkbox.check")) + " " + name; + label.setAttribute("for", checkbox.id); + galleryItemSelectDiv.innerHTML = ''; + galleryItemSelectDiv.appendChild(label); + galleryItemSelectDiv.appendChild(checkbox); + YAHOO.Bubbling.on("selectedFilesChanged", function(e) + { + if (Dom.get(label.id)) + { + Dom.get(label.id).innerHTML = (scope.selectedFiles[nodeRef] ? scope.msg("checkbox.uncheck") : scope.msg("checkbox.check")) + " " + name; + } + }); + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.getThumbnail = function DL_GVR_getThumbnail(scope, elCell, oRecord, oColumn, oData, imgIdSuffix, renditionName) + { + if (imgIdSuffix == null) + { + imgIdSuffix = "-hidden"; + } + if (renditionName == null) + { + renditionName = "imgpreview"; + } + + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + name = record.displayName, + isContainer = node.isContainer, + isLink = node.isLink, + extn = name.substring(name.lastIndexOf(".")), + imgId = node.nodeRef.nodeRef + imgIdSuffix, // DD added + imgHtml; + + if (isContainer || (isLink && node.linkedNode.isContainer)) + { + imgHtml = ''; + } + else + { + imgHtml = '' + $html(extn) + ''; + } + return { id: imgId, html: imgHtml, isContainer: isContainer, isLink: isLink }; + }; + /** + * Default icon resource path string for this view. + * @returns {String} + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getDefaultFolderIcon = function DL_GVR_getDefaultFolderIcon() + { + return "components/documentlibrary/images/folder-256.png"; + }; + /** + * Default icon size for this view. + * @returns {String} + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.getIconSize = function DL_GVR_getIconSize() + { + return "256x256"; + }; + + /** + * Render a thumbnail for a given oRecord + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.renderCellThumbnail = function DL_GVR_renderCellThumbnail(scope, elCell, oRecord, oColumn, oData, imgIdSuffix, renditionName) + { + var containerTarget; // This will only get set if thumbnail represents a container + + var thumbnail = this.getThumbnail(scope, elCell, oRecord, oColumn, oData, imgIdSuffix, renditionName); + var record = oRecord.getData(); + + // Just add the data table thumbnail once + if (!document.getElementById(thumbnail.id)) + { + if (thumbnail.isContainer || (thumbnail.isLink && record.jsNode.linkedNode.isContainer)) + { + elCell.innerHTML += '' + (thumbnail.isLink ? '' : '') + + (scope.dragAndDropEnabled ? '' : '') + + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + thumbnail.html + ''; + containerTarget = new YAHOO.util.DDTarget(thumbnail.id); // Make the folder a target + } + else + { + elCell.innerHTML += '' + (thumbnail.isLink ? '' : '') + + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + thumbnail.html + ''; + } + var thumbnailElement = document.getElementById(thumbnail.id); + if (thumbnailElement) + { + var tempImg = new Image(); + tempImg.onload = function() + { + if(tempImg.width > tempImg.height) + { + Dom.addClass(thumbnailElement, 'alf-landscape'); + } + } + tempImg.src = thumbnailElement.src; + } + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.renderCellStatus = function DL_GVR_renderCellStatus(scope, elCell, oRecord, oColumn, oData) + { + Alfresco.DocumentListGalleryViewRenderer.superclass.renderCellStatus.call(this, scope, elCell, oRecord, oColumn, oData); + var galleryItem = this.getRowItem(oRecord, elCell); + // Check for null galleryItem due to ALF-15529 + if (galleryItem != null) + { + // Copy status + var galleryItemStatusElement = this.getRowItemStatusElement(galleryItem).innerHTML = elCell.innerHTML; + // Clear out the table cell so there's no conflicting HTML IDs + elCell.innerHTML = ''; + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.renderCellDescription = function DL_GVR_renderCellDescription(scope, elCell, oRecord, oColumn, oData) + { + Alfresco.DocumentListGalleryViewRenderer.superclass.renderCellDescription.call(this, scope, elCell, oRecord, oColumn, oData); + var galleryItem = this.getRowItem(oRecord, elCell); + // Check for null galleryItem due to ALF-15529 + if (galleryItem != null) + { + // Copy description + var galleryItemDetailDescriptionElement = this.getRowItemDetailDescriptionElement(galleryItem).innerHTML = elCell.innerHTML; + // Clear out the table cell so there's no conflicting HTML IDs + elCell.innerHTML = ''; + // Add a simple display label + this.getRowItemLabelElement(galleryItem).innerHTML = + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, oRecord.getData()) + $html(oRecord.getData().displayName) + ''; + var galleryItemDetailThumbnailElement = this.getRowItemDetailThumbnailElement(galleryItem); + // Only set panel thumbnail if it's currently empty + if (galleryItemDetailThumbnailElement.innerHTML == '') + { + var thumbnail = this.getThumbnail(scope, elCell, oRecord, oColumn, oData, '-detail'); + this.getRowItemDetailThumbnailElement(galleryItem).innerHTML = thumbnail.html; + } + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype.onFileRenamed = function DL_GVR_onFileRenamed(scope, layer, args) + { + var obj = args[1]; + if (obj && (obj.file !== null)) + { + var recordFound = scope._findRecordByParameter(obj.file.node.nodeRef, "nodeRef"); + if (recordFound !== null) + { + scope.widgets.dataTable.updateRow(recordFound, obj.file); + var galleryItemId = this.getRowItemId(recordFound); + Alfresco.util.Anim.pulse(galleryItemId); + } + } + }; + + /** + * Does the work of actually resizing the view after resize events have stopped. Extensions + * will usually override this method rather than onWindowResize or checkWindowResizeTime. + * + * @method onWindowResize + * @param scope {object} The DocumentList object + * @param sRequest {string} Original request + * @param oResponse {object} Response object + * @param oPayload {MIXED} (optional) Additional argument(s) + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.resizeView = function DL_GVR_resizeView(scope, sRequest, oResponse, oPayload) + { + var container = Dom.get(scope.id + this.parentElementIdSuffix); + var numColumns = scope.widgets.galleryColumnsSlider.getColumnValue(); + scope.widgets.galleryColumnsSlider.setGalleryViewColumns(container, numColumns, ANIMATE_ON_WINDOW_RESIZE); + } + + /** + * Timer check of resize to make sure resize has stopped, i.e. windowResizeMinTime has elapsed + * + * @method checkWindowResizeTime + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.checkWindowResizeTime = function DL_GVR_checkWindowResizeTime() + { + var viewRendererInstance = this; + var now = Date.now(); + if (now - this.lastResize < viewRendererInstance.windowResizeMinTime) { + this.resizeTimer = setTimeout(function() + { + viewRendererInstance.checkWindowResizeTime() + }, viewRendererInstance.windowResizeCheckTime); + } else { + clearTimeout(this.resizeTimer); + this.resizeTimer = this.lastResize = 0; + // Only call resize if the width has actually changed + if (this.currentViewportWidth != Dom.getViewportWidth()) + { + this.currentResizeCallback(); + this.currentViewportWidth = Dom.getViewportWidth(); + } + } + }; + + /** + * Handler for window resize. Uses a timer to only fire on stop of resize. + * + * @method onWindowResize + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.onWindowResize = function DL_GVR_onWindowResize() + { + var viewRendererInstance = this; + this.lastResize = Date.now(); + this.resizeTimer = this.resizeTimer || + setTimeout(function() + { + viewRendererInstance.checkWindowResizeTime() + }, viewRendererInstance.windowResizeCheckTime); + }; + + /** + * Sets up the event listener for window resizing + * + * @method setupWindowResizeListener + */ + Alfresco.DocumentListGalleryViewRenderer.prototype.setupWindowResizeListener = function DL_GVR_setupWindowResizeListener() + { + var isIOS = ( navigator.userAgent.match(/(iPad|iPhone|iPod)/i) ? true : false ); + if (!isIOS) + { + var viewRendererInstance = this; + this.currentViewportWidth = Dom.getViewportWidth(); + if (viewRendererInstance.windowResizeCallback) + { + Event.removeListener(window, 'resize', viewRendererInstance.windowResizeCallback); + } + viewRendererInstance.windowResizeCallback = function(e) + { + viewRendererInstance.onWindowResize(); + }; + Event.addListener(window, "resize", viewRendererInstance.windowResizeCallback); + } + }; + + Alfresco.DocumentListGalleryViewRenderer.prototype._setEmptyDataSourceMessage = function DL_GVR_setEmptyDataSourceMessage(scope, messageHtml) + { + var emptyContainer = Dom.get(scope.id + this.parentElementEmptytIdSuffix); + Dom.getFirstChild(emptyContainer).innerHTML = messageHtml; + } + + // Add some methods for the gallery columns slider + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.DocumentListGalleryViewRenderer.prototype, + { + /** + * Setup the number of columns slider + * + * @method setupGalleryColumnsSlider + * @param scope {object} The DocumentList object + * @param galleryViewRenderer {object} The DocumentListViewRenderer + */ + setupGalleryColumnsSlider: function DL_GVR_setupGalleryColumnsSlider(scope, galleryViewRenderer) + { + var container = Dom.get(scope.id + this.parentElementIdSuffix); + + scope.widgets.galleryColumnsSlider = YAHOO.widget.Slider.getHorizSlider( + scope.id + "-gallery-slider-bg", scope.id + "-gallery-slider-thumb", 0, 60, 20); + + scope.widgets.galleryColumnsSlider.animate = true; + + scope.widgets.galleryColumnsSlider.subscribe("change", function(offsetFromStart) + { + var numColumns = scope.widgets.galleryColumnsSlider.getColumnValue(); + scope.widgets.galleryColumnsSlider.setGalleryViewColumns(container, numColumns, true); + scope.widgets.galleryColumnsSlider.setColumnsPreference(numColumns); + }); + + // Additional slider methods + + scope.widgets.galleryColumnsSlider.initialize = function() + { + Dom.removeClass(Dom.get(scope.id + "-gallery-slider"), 'hidden'); + var initialPixelValue = scope.widgets.galleryColumnsSlider.getPixelValue(galleryViewRenderer.galleryColumns); + scope.widgets.galleryColumnsSlider.setValue(initialPixelValue, true, true, true); + scope.widgets.galleryColumnsSlider.setGalleryItemDimensions(container, galleryViewRenderer.galleryColumns, true); + }; + + scope.widgets.galleryColumnsSlider.getColumnValue = function() + { + switch(scope.widgets.galleryColumnsSlider.getValue()) + { + case 0: + return 10; + case 20: + return 7; + case 40: + return 4; + case 60: + return 3; + } + }; + scope.widgets.galleryColumnsSlider.getPixelValue = function(realValue) + { + switch(realValue) + { + case 10: + return 0; + case 7: + return 20; + case 4: + return 40; + case 3: + return 60; + } + }; + + scope.widgets.galleryColumnsSlider.setGalleryItemDimensions = function _setGalleryItemDimensions(container, numColumns, animate) + { + if (numColumns == null) { + numColumns = scope.widgets.galleryColumnsSlider.getColumnValue(); + } + + // Set calculated gallery container height + var numItems = scope.widgets.dataTable.getRecordSet().getLength(); + var numRows = Math.ceil(numItems / numColumns); + var galleryWidth = parseInt(Dom.getComputedStyle(container, 'width')); + var galleryItemWidth = Math.floor(galleryWidth / numColumns) * 0.92; // account for margins + var galleryHeight = galleryItemWidth * numRows * 1.13; + + Dom.setStyle(container, 'opacity', 0); + Dom.setStyle(container, 'height', galleryHeight + 'px'); + + // Clear then add the corresponding columns class to container and drag and drop + var dndContainer = Dom.get(DND_CONTAINER_ID); + columnOptions = [3, 4, 7, 10]; + for ( var i = 0; i < columnOptions.length; i++) { + Dom.removeClass(container, 'alf-gallery-columns-' + columnOptions[i]); + Dom.removeClass(dndContainer, 'alf-gallery-columns-' + columnOptions[i]); + } + Dom.addClass(container, 'alf-gallery-columns-' + numColumns); + Dom.addClass(dndContainer, 'alf-gallery-columns-' + numColumns); + + // Set gallery items' height to calculated width for square + var galleryItems = Dom.getChildren(container); + Dom.batch(galleryItems, function(el) { Dom.setStyle(el, 'height', galleryItemWidth + 'px'); }); + + if (animate) + { + if (!scope.widgets.galleryColumnsSlider.fadeInAnimation) + { + scope.widgets.galleryColumnsSlider.fadeInAnimation = new YAHOO.util.Anim( + container, { opacity: {from: 0, to: 1 } }, 0.4, YAHOO.util.Easing.easeOut); + } + scope.widgets.galleryColumnsSlider.fadeInAnimation.animate(); + } + else + { + Dom.setStyle(container, 'opacity', 1); + } + } + + scope.widgets.galleryColumnsSlider.setGalleryViewColumns = function _setGalleryViewColumns(container, numColumns, animate) + { + scope.widgets.galleryColumnsSlider.setGalleryItemDimensions(container, numColumns, animate); + YAHOO.Bubbling.fire("galleryViewColumnsChanged"); + }; + + scope.widgets.galleryColumnsSlider.setColumnsPreference = function _setColumnsPreference(numColumns) + { + if (numColumns == null) { + numColumns = scope.widgets.galleryColumnsSlider.getColumnValue(); + } + galleryViewRenderer.galleryColumns = numColumns; + scope.services.preferences.set(PREF_GALLERY_COLUMNS, numColumns); + }; + }, + + onShowGalleryItemDetail: function DL_GVR_onShowGalleryItemDetail(scope, galleryViewRenderer, event, matchedEl, container) + { + var galleryItem = Dom.getAncestorByClassName(matchedEl, galleryViewRenderer.rowClassName); + var galleryItemDetailDiv = Dom.getElementsByClassName(galleryViewRenderer.infoPanelClassName, null, galleryItem)[0]; + + Dom.setStyle(galleryItemDetailDiv, 'display', ''); + + // MNT-10678 fix. Set the heigher z-index for galleryItemDetailDiv panel. + // Make the panel in front of other elements. I.e. in filmstrip view make galleryItemDetailDiv panel in front + // of the 'Nex' navigation button. + var panelOldZIndex = galleryItemDetailDiv.panel.cfg.getProperty('zIndex'), + panelNewZIndex = 3; + galleryItemDetailDiv.panel.cfg.setProperty("zIndex", panelNewZIndex); + + galleryItemDetailDiv.panel.render(); + galleryItemDetailDiv.panel.show(galleryItemDetailDiv.panel); + + // Hide pop-up timer function + var fnHideDetailPanel = function DL_GVR_fnHideDetailPanel() + { + galleryViewRenderer.onEventUnhighlightRow(scope, event, galleryItem); + galleryItemDetailDiv.panel.hide(galleryItemDetailDiv.panel); + Dom.setStyle(galleryItemDetailDiv, 'display', 'none'); + + // set the previous z-index for galleryItemDetailDiv panel. + galleryItemDetailDiv.panel.cfg.setProperty("zIndex", panelOldZIndex); + }; + + // Initial after-click hide timer - 4x the mouseOut timer delay + if (galleryItemDetailDiv.hideTimerId) + { + window.clearTimeout(galleryItemDetailDiv.hideTimerId); + } + galleryItemDetailDiv.hideTimerId = window.setTimeout(fnHideDetailPanel, galleryViewRenderer.infoPanelPopupTimeout * 4); + + // Mouse over handler + var onMouseOver = function DL_GVR__onMouseOver(e, obj) + { + // Clear any existing hide timer + if (obj.hideTimerId) + { + window.clearTimeout(obj.hideTimerId); + obj.hideTimerId = null; + } + }; + + // Mouse out handler + var onMouseOut = function DLSM_onMouseOut(e, obj) + { + var elTarget = Event.getTarget(e); + var related = elTarget.relatedTarget; + + // In some cases we should ignore this mouseout event + if ((related !== obj) && (!Dom.isAncestor(obj, related))) + { + if (obj.hideTimerId) + { + window.clearTimeout(obj.hideTimerId); + } + obj.hideTimerId = window.setTimeout(fnHideDetailPanel, galleryViewRenderer.infoPanelPopupTimeout / 100); + } + }; + + Event.on(galleryItemDetailDiv, "mouseover", onMouseOver, galleryItemDetailDiv); + Event.on(galleryItemDetailDiv, "mouseout", onMouseOut, galleryItemDetailDiv); + } + + }); + +})(); + diff --git a/share/src/main/webapp/components/documentlibrary/documentlist-view-simple.js b/share/src/main/webapp/components/documentlibrary/documentlist-view-simple.js new file mode 100644 index 0000000000..8e4e137613 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist-view-simple.js @@ -0,0 +1,135 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentListSimpleViewRenderer component which extends DocumentListViewRenderer + * + * @namespace Alfresco + * @class Alfresco.DocumentListSimpleViewRenderer + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * SimpleViewRenderer constructor. + * + * @param name {String} The name of the SimpleViewRenderer + * @return {Alfresco.DocumentListSimpleViewRenderer} The new SimpleViewRenderer instance + * @constructor + */ + Alfresco.DocumentListSimpleViewRenderer = function(name, parentDocumentList, commonComponentStyle) + { + Alfresco.DocumentListSimpleViewRenderer.superclass.constructor.call(this, name, parentDocumentList, commonComponentStyle); + this.actionsColumnWidth = 80; + this.actionsSplitAtModifier = 0; + return this; + }; + + /** + * Extend from Alfresco.DocumentListViewRenderer + */ + YAHOO.extend(Alfresco.DocumentListSimpleViewRenderer, Alfresco.DocumentListViewRenderer); + + /** + * Override Alfresco.DocumentListViewRenderer.renderCellThumbnail with a simple icon and preview + */ + Alfresco.DocumentListSimpleViewRenderer.prototype.renderCellThumbnail = function DL_SVR_renderCellThumbnail(scope, elCell, oRecord, oColumn, oData) + { + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + name = record.displayName, + isContainer = node.isContainer, + isLink = node.isLink, + extn = name.substring(name.lastIndexOf(".")), + imgId = node.nodeRef.nodeRef; // DD added + + var containerTarget; // This will only get set if thumbnail represents a container + + oColumn.width = 40; + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + if (isContainer || (isLink && node.linkedNode.isContainer)) + { + elCell.innerHTML = '' + (isLink ? '' : '') + (scope.dragAndDropEnabled ? '' : '') + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + ''; + containerTarget = new YAHOO.util.DDTarget(imgId); // Make the folder a target + } + else + { + var id = scope.id + '-preview-' + oRecord.getId(); + var fileIcon = Alfresco.util.getFileIcon(name); + if (fileIcon == "generic-file-32.png") + { + fileIcon = Alfresco.util.getFileIconByMimetype(node.mimetype); + } + elCell.innerHTML = '' + (isLink ? '' : '') + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + '' + extn + ''; + // Preview tooltip + scope.previewTooltips.push(id); + } + var dnd = new Alfresco.DnD(imgId, scope); + }; + + /** + * Default icon resource path string for this view. + * @returns {String} + */ + Alfresco.DocumentListSimpleViewRenderer.prototype.getDefaultFolderIcon = function DL_SVR_getDefaultFolderIcon() + { + return "components/documentlibrary/images/folder-32.png"; + }; + /** + * Default icon size for this view. + * @returns {String} + */ + Alfresco.DocumentListSimpleViewRenderer.prototype.getIconSize = function DL_SVR_getIconSize() + { + return "32x32"; + }; + /** + * Override Alfresco.DocumentListViewRenderer.setupRenderer to setup preview tooltip + */ + Alfresco.DocumentListSimpleViewRenderer.prototype.setupRenderer = function DL_SVR_setupRenderer(scope) + { + Dom.addClass(scope.id + this.buttonElementIdSuffix, this.buttonCssClass); + // Tooltip for thumbnail in Simple View + scope.widgets.previewTooltip = new YAHOO.widget.Tooltip(scope.id + "-previewTooltip", + { + width: "108px" + }); + scope.widgets.previewTooltip.contextTriggerEvent.subscribe(function(type, args) + { + var context = args[0], + oRecord = scope.widgets.dataTable.getRecord(context.id), + record = oRecord.getData(); + + this.cfg.setProperty("text", ''); + }); + }; + +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/documentlist-view-table.css b/share/src/main/webapp/components/documentlibrary/documentlist-view-table.css new file mode 100644 index 0000000000..5f73791899 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist-view-table.css @@ -0,0 +1,232 @@ + +.doclist .simple-detailed .table-view span.first-child +{ + background-image: url(images/table-view-off-16.png); +} + +.doclist .simple-detailed .table-view.yui-button-checked span.first-child +{ + background-image: url(images/table-view-on-16.png); +} + +/* Actions: table view */ + +.doclist .alf-table div.action-set > div +{ + float: left; +} + +.doclist .alf-table div.action-set div.onActionShowMore +{ + clear: both; + float: none; +} + +.doclist .alf-table div.action-set a.action-link span, +.doclist .alf-table div.action-set a.simple-link span +{ + display: none; +} +.doclist .alf-table div.action-set a.action-link, +.doclist .alf-table div.action-set a.simple-link, +.doclist .alf-table div.action-set a.show-more { + padding: 0 0 0 24px; +} + +.doclist .alf-table div.action-set div.more-actions +{ + margin-left: -142px; +} + +.doclist .alf-table div.action-set div.more-actions div +{ + float: none; +} + +.doclist .alf-table div.action-set div.more-actions a.action-link span, +.doclist .alf-table div.action-set div.more-actions a.simple-link span +{ + display: block; +} + +.doclist .documents.alf-table { + overflow: scroll; +} + +.doclist .documents.alf-table thead { + display: table-header-group; +} +.doclist .documents.alf-table thead .yui-dt-col-nodeRef .yui-dt-label { + display: none; +} +.doclist .documents.alf-table thead .yui-dt-col-status .yui-dt-label { + display: none; +} +.doclist .documents.alf-table thead .yui-dt-col-thumbnail .yui-dt-label { + display: none; +} +.doclist .documents.alf-table thead .yui-dt-col-fileName .yui-dt-label { + padding-left: 20px; +} +.doclist .documents.alf-table thead .alf-editable .yui-dt-label { + padding-left: 20px; +} + +.doclist .documents.alf-table .filename { + font-size: inherit; + padding-bottom: 0; +} +.doclist .documents.alf-table .filename .title, .doclist .documents.alf-table .yui-dt-col-fileName .detail { + display: none; +} + +.doclist .documents.alf-table .yui-dt-liner { + padding: 2px 4px; + min-height: 18px; +} + +.doclist .documents.alf-table td.yui-dt-col-actions .yui-dt-liner { + padding-top: 0; + padding-bottom: 0; +} +.doclist .documents.alf-table .yui-dt-col-thumbnail .yui-dt-liner { + text-align: inherit; + width: 16px; +} +.doclist .documents.alf-table .thumbnail span.link, +.doclist .documents.alf-table .folder span.link +{ + background: url(images/link-16.png) no-repeat; + height: 16px; + width: 16px; + position: absolute; +} + +.doclist .documents.alf-table .thumbnail { + width: 16px; + height: 16px; + padding-top: 0; +} +.doclist .documents.alf-table .thumbnail img { + width: 16px; + min-height: 16px; +} +.doclist .documents.alf-table .folder-small img { + width: 16px; + min-height: 16px; +} +.doclist .documents.alf-table .alf-nowrap .yui-dt-liner { + white-space: nowrap; +} + +.doclist .documents.alf-table .detail { + line-height: inherit; + min-height: inherit; + padding-bottom: 0; + padding-left: 0; +} +.doclist .documents.alf-table .alf-editable .detail { + padding-left: 20px; +} +.doclist .documents.alf-table .status { + height: 16px; +} + +.alf-table-config-button +{ + float: right; +} +.doclist .documents.alf-table .alf-table-config-button +{ + visibility: visible; +} +.doclist .alf-table-config-button span.first-child { + background-image: url(images/table-config.png); + background-position: 50% 50%; + background-repeat: no-repeat; + min-height: 16px; + padding: 0 2px; +} +.doclist .alf-table-config-button span.first-child button { + padding: none; +} + +.alf-table-config-dialog +{ + visibility: hidden; +} + +.alf-table-config-dialog.yui-panel .bd +{ + color: inherit !important; + padding: 10px 16px 16px 16px; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + border: 1px solid #444; + overflow: scroll; +} +.alf-table-config-dialog.yui-panel .hd { + border: none; + background: none; + line-height: 1; +} +.alf-table-config-dialog .dt-dlg-pickercol { + clear: both; + padding: 0.25em 0; + border-bottom: 1px solid #CCC; + height: 2em; +} +.alf-table-config-dialog .dt-dlg-pickerkey { + float: left; + line-height: 2; +} +.alf-table-config-dialog .dt-dlg-pickerbtns { + float: right; +} +.alf-table-config-dialog .yui-radio-button-checked button { + color: #CCC; +} + +.doclist .documents.alf-table.yui-dt .yui-dt-data td { + border-bottom: 1px solid #EEE; + border-right: 1px solid #EEE; + background: none; +} +.doclist .documents.alf-table.yui-dt th.yui-dt-hidden, .doclist .documents.alf-table.yui-dt td.yui-dt-hidden { + border-right: none; + display: none; +} + +.doclist .yui-gb .yui-u, +.doclist .yui-g .yui-gb .yui-u, +.doclist .yui-gb .yui-g, +.doclist .yui-gb .yui-gb, +.doclist .yui-gb .yui-gc, +.doclist .yui-gb .yui-gd, +.doclist .yui-gb .yui-ge, +.doclist .yui-gb .yui-gf, +.doclist .yui-gc .yui-u, +.doclist .yui-gc .yui-g, +.doclist .yui-gd .yui-u { + width: 39% !important; +} +.doclist .yui-gc div.first, +.doclist .yui-gd .yui-u { + width: 58% !important; +} + +/* Ensure that the edit pencil appears within the table */ +.alf-table .insitu-edit { + margin-left: 0; +} + +.alf-table .insitu-edit + span { + margin-left: 20px; +} +.alf-table .insitu-edit + form > input { + margin-left: 20px; +} diff --git a/share/src/main/webapp/components/documentlibrary/documentlist-view-table.js b/share/src/main/webapp/components/documentlibrary/documentlist-view-table.js new file mode 100644 index 0000000000..afe99df05c --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist-view-table.js @@ -0,0 +1,438 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * @module DocumentLibrary + */ + +/** + * Table view extension of DocumentListViewRenderer component. + * + * @namespace Alfresco + * @class Alfresco.DocumentListTableViewRenderer + * @extends Alfresco.DocumentListViewRenderer + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Anim = YAHOO.util.Anim; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $isValueSet = Alfresco.util.isValueSet; + + var DND_CONTAINER_ID = 'ygddfdiv'; + + /** + * TableViewRenderer constructor. + * + * @param name {String} The name of the TableViewRenderer + * @return {Alfresco.DocumentListTableViewRenderer} The new TableViewRenderer instance + * @constructor + */ + Alfresco.DocumentListTableViewRenderer = function(name, parentDocumentList, commonComponentStyle, jsonConfig) + { + Alfresco.DocumentListTableViewRenderer.superclass.constructor.call(this, name, parentDocumentList, commonComponentStyle); + this.actionsColumnWidth = 160; + this.actionsSplitAtModifier = 0; + if (jsonConfig != null) + { + this.jsonConfig = jsonConfig; + this.additionalJsonConfig = YAHOO.lang.JSON.parse(jsonConfig); + } + else + { + this.additionalJsonConfig = {}; + } + return this; + }; + + /** + * Extend from Alfresco.DocumentListViewRenderer + */ + YAHOO.extend(Alfresco.DocumentListTableViewRenderer, Alfresco.DocumentListViewRenderer); + + /** + * @method getConfigWidth + * @param propColumn {object} + */ + Alfresco.DocumentListTableViewRenderer.prototype.getConfigWidth = function(propColumn) + { + var width = null; + var rawWidth = propColumn.width; + if (rawWidth != null) + { + width = parseInt(rawWidth); + if (width === NaN) + { + width = null; + } + } + return width; + }; + + /** + * @see Alfresco.DocumentListViewRenderer.renderView + */ + Alfresco.DocumentListTableViewRenderer.prototype.renderView = function DL_SVR_renderView(scope, sRequest, oResponse, oPayload) + { + // Add a class to help with CSS selectors... + var container = Dom.get(scope.id + this.parentElementIdSuffix); + Dom.addClass(container, 'alf-table'); + + var viewRendererInstance = this; + + scope.widgets.dataTable.set('draggableColumns', false); + + var container = Dom.get(scope.id + this.parentElementIdSuffix); + var oRecordSet = scope.widgets.dataTable.getRecordSet(); + Dom.addClass(container, 'alf-table'); + Dom.removeClass(Dom.get(scope.id + "-table-config-button-container"), 'hidden'); + + // Always hide the fileName column... + // This has been done due to time-constraints and the issues surrounding the other views (most notably the detailed + // and simple views) changing the widths of the fileName field. The simplest solution was to just always hide this + // field and rely on the JSON blob to add in columns that identify the item. + scope.widgets.dataTable.hideColumn("fileName"); + + // Not all of the columns are properties, the selector, indicators and actions are not properties and + // need to be handled by specific configuration defined in the JSON BLOB... + if (this.additionalJsonConfig != null) + { + // Add/remove actions column as appropriate + if (this.additionalJsonConfig.actions != null && this.additionalJsonConfig.actions.show == "false") + { + scope.widgets.dataTable.hideColumn("actions"); + } + else + { + scope.widgets.dataTable.showColumn("actions"); + } + + // Add/remove the indicators column... + if (this.additionalJsonConfig.indicators != null && this.additionalJsonConfig.indicators.show == "false") + { + scope.widgets.dataTable.hideColumn("status"); + } + else + { + scope.widgets.dataTable.showColumn("status"); + } + + // Add/remove the selection box column... + if (this.additionalJsonConfig.selector != null && this.additionalJsonConfig.selector.show == "false") + { + scope.widgets.dataTable.hideColumn("nodeRef"); + } + else + { + scope.widgets.dataTable.showColumn("nodeRef"); + } + + // Add/remove the thumbnail column... + if (this.additionalJsonConfig.thumbnail != null && this.additionalJsonConfig.thumbnail.show == "false") + { + scope.widgets.dataTable.hideColumn("thumbnail"); + } + else + { + scope.widgets.dataTable.showColumn("thumbnail"); + } + + // If a JSON blob has been provided then is should define the columns that need to be + // rendered in the detailed view. Iterate over this configuration and add in the columns + // defined making use of the data provided... + if (this.additionalJsonConfig.propertyColumns != null && + this.additionalJsonConfig.propertyColumns.length != null) + { + for (var i=0; i 0) + { + try + { + scope.widgets.dataTable._elThead.children[0].children[2].children[0].style.width = "16px"; + } + catch (e) + { + // Deliberately swallowing any generated exceptions without remorse. + } + + } + + Dom.setStyle(elCell, "width", oColumn.width + "px"); + Dom.setStyle(elCell.parentNode, "width", oColumn.width + "px"); + + if (isContainer || (isLink && node.linkedNode.isContainer)) + { + elCell.innerHTML = '' + (isLink ? '' : '') + (scope.dragAndDropEnabled ? '' : '') + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + ''; + } + else + { + var id = scope.id + '-preview-' + oRecord.getId(); + elCell.innerHTML = '' + (isLink ? '' : '') + Alfresco.DocumentList.generateFileFolderLinkMarkup(scope, record) + '' + extn + ''; + + // Preview tooltip + scope.previewTooltips.push(id); + } + }; + /** + * Default icon resource path string for this view. + * @returns {String} + */ + Alfresco.DocumentListTableViewRenderer.prototype.getDefaultFolderIcon = function DL_SVR_getDefaultFolderIcon() + { + return "components/documentlibrary/images/folder-32.png"; + }; + /** + * Default icon size for this view. + * @returns {String} + */ + Alfresco.DocumentListTableViewRenderer.prototype.getIconSize = function DL_SVR_getIconSize() + { + return "32x32"; + }; + /** + * @see Alfresco.DocumentListViewRenderer.destroyView + */ + Alfresco.DocumentListTableViewRenderer.prototype.destroyView = function DL_SVR_destroyView(scope, sRequest, oResponse, oPayload) + { + Alfresco.DocumentListTableViewRenderer.superclass.destroyView.call(this, scope, sRequest, oResponse, oPayload); + + // This gets called even before the view has first been created, so we need to ensure we have the original + // set of columns so that they can be restored for the benefit of other views... + if (!this.originalColumnDefinitions) + { + // Save the originalColumnDefinitions + this.originalColumnDefinitions = []; + var columnDefinitions = scope.widgets.dataTable.getColumnSet().getDefinitions(); + for (var i = 0; i < columnDefinitions.length; i++) + { + this.originalColumnDefinitions[i] = columnDefinitions[i]; + } + } + + var container = Dom.get(scope.id + this.parentElementIdSuffix); + Dom.removeClass(container, 'alf-table'); + Dom.addClass(Dom.get(scope.id + "-table-config-button-container"), 'hidden'); + + + // Rebuild the original columns... + if (this.originalColumnDefinitions) + { + // Ensure that all the "core" columns are displayed again (these columns are the ones that + // were defined by the original detailed view and need to be in place for the other views + // to continue to work... + scope.widgets.dataTable.showColumn("nodeRef"); + scope.widgets.dataTable.showColumn("status"); + scope.widgets.dataTable.showColumn("thumbnail"); + scope.widgets.dataTable.showColumn("fileName"); + scope.widgets.dataTable.showColumn("actions"); + + // Remove all the current columns (except for those core columns)... + var currentColumnDefinitions = []; + var currentColumnDefinitionsCall = scope.widgets.dataTable.getColumnSet().getDefinitions(); + + // currentColumnDefinitionsCall changes during iteration + // therefore we use countdown + for (var i = currentColumnDefinitionsCall.length-1; i >= 0 ; i--) + { + switch (currentColumnDefinitionsCall[i].key) + { + case "nodeRef": + case "status": + case "thumbnail": + case "fileName": + case "actions": + break; + default: + scope.widgets.dataTable.removeColumn(currentColumnDefinitionsCall[i].key); + } + } + + // Add back in any of the original columns that have since been deleted (typically this + // won't actually add anything back)... + for (var i = 0; i < this.originalColumnDefinitions.length; i++) + { + switch (this.originalColumnDefinitions[i].key) + { + case "nodeRef": + case "status": + case "thumbnail": + case "fileName": + case "actions": + break; + default: + scope.widgets.dataTable.insertColumn(this.originalColumnDefinitions[i]); + } + } + } + }; + + /** + * Generic string custom datacell formatter + * + * @method renderCellGenericString + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + Alfresco.DocumentListTableViewRenderer.prototype.renderCellGenericString = function DL_SVR_renderCellGenericString(elCell, oRecord, oColumn, oData) + { + var record = oRecord.getData(), + node = record.jsNode, + properties = node.properties, + propertyValue = properties[oColumn.field]; + if (propertyValue != null) + { + elCell.innerHTML = '' + propertyValue + ''; + } + }; + + /** + * Uses a defined metadata 'line' template and renderer as a custom datacell formatter + * + * @method renderCellMetadataLineRenderer + * @param scope {object} The DocumentList object + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + * @param line {object} the metadata 'line' object + */ + Alfresco.DocumentListTableViewRenderer.prototype.renderCellMetadataLineRenderer = function DL_SVR_renderCellMetadataLineRenderer(scope, elCell, oRecord, oColumn, oData, line) + { + var desc = "", i, j, + record = oRecord.getData(), + jsNode = record.jsNode; + + var fnRenderTemplate = function fnRenderTemplate_substitute(p_key, p_value, p_meta) + { + var label = (p_meta !== null ? '' + scope.msg(p_meta) + ': ': ''), + value = ""; + + // render value from properties or custom renderer + if (scope.renderers.hasOwnProperty(p_key) && typeof scope.renderers[p_key] === "function") + { + value = scope.renderers[p_key].call(scope, record, label); + } + else + { + if (jsNode.hasProperty(p_key)) + { + value = '' + label + $html(jsNode.properties[p_key]) + ''; + } + } + + return value; + }; + + var html; + if (!$isValueSet(line.view) || line.view == this.metadataLineViewName) + { + html = YAHOO.lang.substitute(line.template, scope.renderers, fnRenderTemplate); + if ($isValueSet(html)) + { + desc += '
    ' + html + '
    '; + } + } + + elCell.innerHTML = desc; + }; + +})(); + diff --git a/share/src/main/webapp/components/documentlibrary/documentlist.css b/share/src/main/webapp/components/documentlibrary/documentlist.css new file mode 100644 index 0000000000..fce2d1aeac --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist.css @@ -0,0 +1,1504 @@ +.doclist +{ + clear: both; + /* visibility: hidden; */ +} + +.doclist a:hover +{ + text-decoration: none; +} + +.doclist .align-center +{ + text-align: center; +} + +.doclist .align-right +{ + text-align: right; +} + +/* DocList bar */ + +.doclist .doclist-bar +{ + border-bottom: 1px solid #d9d9d9; + margin: 0 -10px; + padding: 4px 0.5em 2px; +} + +.doclist .doclist-bar-bottom +{ + border-top: 1px solid #d9d9d9; + display: none; +} + +.doclist span.separator +{ + border-right: 1px dotted #c7ccce; + border-top: medium none; + left: -2px; + margin: 0 4px; + padding: 2px 0; + position: relative; + top: -4px; + vertical-align: bottom; +} + +/* DocList bar Buttons and Paginator */ + +.doclist .doclist-bar .file-select +{ + float: left; + width: 15%; +} + +.doclist .doclist-bar .paginator +{ + float: left; + margin: 0; + padding: 4px 0; + text-align: center; + width: 80%; +} + +.doclist .doclist-bar .yui-pg-current +{ + margin-right: 0; +} + +/* DocList bar Select menu */ + +.doclist .file-select .yuimenuitemlabel span +{ + background-position: 2px 50%; + background-repeat: no-repeat; + cursor: pointer; + display: block; + margin-left: -4px; + min-height: 16px; + padding: 2px 0px 1px 24px; +} + +.doclist .file-select .selectAll +{ + background-image: url(images/select-all-16.png); +} + +.doclist .file-select .selectNone +{ + background-image: url(images/select-none-16.png); +} + +.doclist .file-select .selectInvert +{ + background-image: url(images/select-invert-16.png); +} + +.doclist .file-select .selectFolders +{ + background-image: url(images/select-folders-16.png); +} + +.doclist .file-select .selectDocuments +{ + background-image: url(images/select-documents-16.png); +} + +/* DocList bar right-hand section */ + +.doclist .sort-direction, +.doclist .sort-field, +.doclist .show-folders, +.doclist .simple-detailed +{ + float: right; +} + +.doclist .show-folders span.first-child, +.doclist .simple-detailed span.first-child +{ + background-position: 50% 50%; + background-repeat: no-repeat; + min-height: 16px; + padding: 0 2px; +} + +.doclist .show-folders span.first-child button +{ + padding: 0 14px; +} + +.doclist .sort-direction span.yui-button +{ + margin-right: 0; +} + +.doclist .sort-direction span.first-child +{ + background-image: url(images/sort-ascending-16.png); + background-position: 50% 50%; + background-repeat: no-repeat; + min-height: 16px; + padding: 0 2px; +} + +.doclist .sort-direction .sort-descending span.first-child +{ + background-image: url(images/sort-descending-16.png); +} + +.doclist .sort-field span.yui-button +{ + margin-left: 0; +} + +.doclist .sort-field button +{ + padding-left: 4px; +} + +.doclist .show-folders +{ + margin-right: 4px; +} + +.doclist .show-folders span.first-child, +.doclist .show-folders-image +{ + background-image: url(images/folders-hide-16.png); +} + +.doclist .show-folders .yui-button-checked span.first-child +{ + background-image: url(images/folders-show-16.png); +} + +.doclist .show-folders .separator +{ + margin-left: 0; +} + +.doclist .simple-detailed .yui-button +{ + margin-left: 0; + margin-right: 0; +} + +.doclist .simple-detailed .simple-view span.first-child +{ + background-image: url(images/simple-view-off-16.png); +} + +.doclist .simple-detailed .simple-view.yui-button-checked span.first-child +{ + background-image: url(images/simple-view-on-16.png); +} + +.doclist .simple-detailed .detailed-view span.first-child +{ + background-image: url(images/detailed-view-off-16.png); +} + +.doclist .simple-detailed .detailed-view.yui-button-checked span.first-child +{ + background-image: url(images/detailed-view-on-16.png); +} + +/* Inline "Show Folders" action */ + +.doclist .show-folders-image +{ + background-position: 0px 3px; + cursor: pointer; + display: inline-block; + height: 16px; + width: 16px; +} + +/* Forms */ + +.form-container .form-fields +{ + border-bottom: medium none; + padding: 1em 1em 0em 1em; +} + +/* Details Form */ + +.form-container .edit-metadata a, +.form-container .edit-metadata a:visited +{ + background: transparent url(actions/document-edit-metadata-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +/* Data Table */ + +.doclist .documents table +{ + border: medium none; + width: 100%; +} + +.doclist .documents thead +{ + display: none; +} + +.doclist .documents tbody +{ + outline: none; +} + +.doclist .documents .yui-dt table +{ + border: none; +} + +body .doclist tr.yui-dt-highlighted +{ + cursor: auto; +} + +.doclist tr.yui-dt-odd +{ + background-color: #ffffff; +} + +.doclist tr.yui-dt-odd.yui-dt-highlighted td.yui-dt-last, +.doclist tr.yui-dt-even.yui-dt-highlighted td.yui-dt-last +{ + border-left: 1px solid #c5e6e9; +} + +.doclist .documents.yui-dt .yui-dt-data td +{ + border-bottom: 1px dashed #d9d9d9; + border-right: medium none; + vertical-align: top; +} + +.doclist .documents.yui-dt .yui-dt-data .yui-dt-last td +{ + border-bottom: medium none; +} + +.doclist .documents.yui-dt tr.yui-dt-first td +{ + border-top: medium none; +} + +.doclist .documents.yui-dt td.yui-dt-last +{ + border-left: 1px solid #fff; + vertical-align: middle; +} + +.doclist .yui-dt-liner +{ + padding: 4px; +} + +.doclist .yui-dt-col-thumbnail .yui-dt-liner +{ + text-align: center; +} + +.doclist .documents.yui-dt tr.yui-dt-first td.yui-dt-empty +{ + border-right: medium none; + cursor: default; +} + +.doclist .yui-dt-error +{ + background: red; + color: white; + font-weight: bold; + margin: 1em auto; + padding: 1em; +} + +/* This rule is vital to workaround a Firefox mouseout bug */ + +.doclist .yui-dt-col-4 +{ + overflow: visible; +} + +/* Cell Renderers */ + +.doclist span.folder +{ + display: block; + position: relative; +} + +.doclist .documents .icon32 +{ + cursor: pointer; + display: block; + min-height: 32px; +} + +.doclist .documents .icon32 span.link, +.doclist .documents .folder-small span.link +{ + background: url(images/link-16.png) no-repeat; + height: 16px; + width: 16px; + position: absolute; +} + +.doclist .documents .folder-small span.droppable +{ + background: url(../images/drop-arrow-left-small.png) no-repeat; + display: none; + height: 14px; + position: absolute; + width: 34px; + z-index: 1; + margin-left: 20px; +} + +.doclist .documents .thumbnail, +.doclist .documents .folder +{ + cursor: pointer; + display: block; + height: 100px; + overflow: hidden; + padding-top: 2px; + position: relative; + width: 100px; +} + +.doclist .documents .thumbnail span.link, +.doclist .documents .folder span.link +{ + background: url(images/link-32.png) no-repeat; + height: 32px; + width: 32px; + position: absolute; +} + +.doclist .documents .folder span.droppable +{ + background: url(../images/drop-arrow-left-large.png) no-repeat; + display: none; + height: 25px; + position: absolute; + width: 60px; + z-index: 1; + margin-left: 40px; +} + +.doclist .documents .filename +{ + font-size: 131%; + font-weight: normal; + padding-bottom: 0.2em; + padding-left: 20px; + word-wrap: break-word; +} + +.doclist .documents .filename span.title +{ + color: #606060; + font-size: 82%; + padding-left: 0.7em; +} + +.doclist .documents .filename span.document-version +{ + margin-left: 0.8em; + padding: 1px; + position: relative; + top: -2px; + visibility: hidden; +} + +.doclist .documents .yui-dt-highlighted .filename span.document-version +{ + visibility: visible; +} + +.doclist .documents +{ + color: #333333; + margin: 0 -10px 0 -8px; +} + +.doclist .documents a +{ + color: #2B6EB5; + cursor: pointer; +} + +.doclist .documents a:active, +.doclist .documents a:hover +{ + text-decoration: underline; +} + +.doclist .documents .rename-file +{ + background-color: #e8e8e8; + border: 1px solid #808080; + cursor: pointer; + float: left; + margin-left: 2em; + position: relative; + top: -2px; +} + +.doclist .documents .detail +{ + clear: left; + line-height: 1.5em; + min-height: 1.5em; + padding-bottom: 0.2em; + padding-left: 20px; +} + +.doclist .documents .detail .faded +{ + color: #aaa; +} + +.doclist .documents .detail em +{ + color: #606060; + font-style: normal; + font-weight: normal +} + +.doclist .documents .detail span.item +{ + margin-right: 1.6em; +} + +.doclist .documents .detail span.item-social +{ + line-height: 1.2em; + margin-right: 0.8em; + margin-top: 0.4em; +} + +.doclist .documents .detail span.item-simple +{ + padding-right: 0.5em; +} + +.doclist .documents .detail span.tag +{ + margin: 1px 0; +} + +/* Categories */ + +.doclist .documents .detail span.category-item +{ + background-image: url(images/category-16.png); + background-position: 0px 2px; + background-repeat: no-repeat; + margin-right: 0; + padding-bottom: 2px; + padding-left: 18px; +} + +/* Social tagging customisations */ + +.doclist .documents .detail a.comment +{ + background-image: url(../images/comment-16.png); +} + +/* Document Info Banner */ + +.doclist .info-banner +{ + background-color: #ffffe0; + background-image: url(images/warning-16.png); + background-position: 6px 4px; + background-repeat: no-repeat; + border: 1px solid #ffca7a; + clear: left; + font-weight: bold; + margin-bottom: 4px; + padding: 5px 0px 3px 28px; +} + +.doclist .banner-more-info-link +{ + color: #4F94C9; + cursor: pointer; + float: right; + font-size: 85%; + font-weight: normal; + padding-right: 10px; +} + +/* Tags */ + +.doclist .documents .detail a.tag-link +{ + border-radius: 8px; + font-size: 93%; + margin-right: 0.5em; + padding: 2px 8px; + border-radius: 8px; +} + +/* Actions Rollover */ + +.doclist .documents .hidden +{ + visibility: hidden; +} + +/* Actions */ + +.doclist div.more-actions +{ + background-color: #fff; + border: 1px solid #2b6eb5; + clear: left; + margin-left: -22px; + margin-top: 1px; + position: absolute; + width: 220px; + z-index: 1; +} + +.doclist .more-actions a.action-link, +.doclist .more-actions a.simple-link +{ + border: 1px solid transparent; +} + +.doclist .more-actions a:active, +.doclist .more-actions a:hover +{ + background-color: #2b6eb5; + border: 1px solid #2b6eb5; + color: #fff; +} + +/* Actions: Simple view */ + +.doclist div.simple div +{ + float: left; +} + +.doclist div.simple div.onActionShowMore +{ + clear: both; + float: none; +} + +.doclist div.simple a.action-link span, +.doclist div.simple a.simple-link span +{ + display: none; +} + +.doclist div.simple div.more-actions +{ + margin-left: -142px; +} + +.doclist div.simple div.more-actions div +{ + float: none; +} + +.doclist div.simple div.more-actions a.action-link span, +.doclist div.simple div.more-actions a.simple-link span +{ + display: block; +} + +/* Actions: Icons */ + +.doclist .action-set a +{ + background-image: url(actions/default-16.png); +} + +.doclist .internal-show-more a +{ + background-image: url(images/plus-sign-16.png); +} + +/* Drag and Drop */ + +.dndFolderHighlight span.droppable +{ + display: block !important; +} + +.dndFolderHighlight img +{ + background-color: #dceaf4; + outline: 2px solid #4F94C9; + padding: 2px; + position: relative; + top: -2px; +} + +.dndDocListHighlight +{ + outline: 2px solid #4F94C9; + outline-offset: -2px; +} + +.docListInstructions +{ + background-color: white; + color: #515D6B; + padding: 10px; +} + +.docListInstructionsWithDND +{ + background-color: white; + border: 1px dashed #73B4DA; + color: #515D6B; + padding: 10px; +} + +.docListInstructionColumn +{ + float: left; + width: 45%; +} + +.docListInstructionColumnRightBorder +{ + border-right: 1px solid #D9D9D9; + padding-right: 30px; + margin-right: 10px; +} + +.docListInstructions > div +{ + clear: both; +} + +.docListInstructionImage +{ + float: left; + padding: 0 10px; + vertical-align: middle; +} + +.docListLinkedInstruction +{ + cursor: pointer; +} + +.docListInstructionTitle +{ + display: block; + font-size: 167%; + margin-top: 10px; + margin-bottom: 10px; + padding-left: 10px; +} + +.docListInstructionText +{ + font-size: 123%; + margin-top: 10px; + display: block; +} + +.docListInstructionTextSmall +{ + margin-top: 15px; + display: block; +} + +.docListOtherOptions +{ + display: block; + font-size: 146.5%; + margin-top: 10px; + padding-left: 10px; + padding-top: 30px; +} + +.docListOtherOptionsImage +{ + padding: 10px 6px 0 10px; + vertical-align: middle; +} + +.docListOtherOptionsText +{ + font-size: 108%; + margin-top: 10px; +} + +.inlineTagReadOnly +{ + background-color: #DCEAF4; + color: #4F94C9; + padding: 0.1em, 0.3em; + margin-right: 0.5em; +} + +.inlineTagEdit +{ + border: 1px solid #C5D6E2; + font-weight: normal; + padding: 0.3em; + background-color: white; +} + +.inlineTagEditTag +{ + background-color: #EEE; + color: #333;; + padding: 0.1em 0.3em; + margin-right: 0.3em; + margin-bottom: 0.3em; + display: inline-block; + cursor: pointer; +} + +.inlineTagEditTagPrimed +{ + background-color: #DCEAF4; + color: #4F94C9; +} + +.inlineTagEditTag img +{ + vertical-align: bottom; + padding-bottom: 0.2em; + margin-left: 0.3em; +} + +.inlineTagEdit input[type="text"]:focus +{ + outline: none; +} + +.inlineTagEdit input[type="text"] +{ + width: inherit; + position: static; + border: none; +} + +.inlineTagEditTagSelection +{ + vertical-align: bottom; + padding-bottom: 0.2em; + margin-left: 0.3em; +} + +.inlineTagEditAutoCompleteWrapper +{ + padding-bottom:2em; + width: 12em; +} + +.inlineTagEditAutoComplete +{ + width: inherit !important; +} + +.inlineTagEditAutoComplete .yui-ac-content +{ + border: 1px solid #C5D6E2 !important; +} + +.inlineTagEditAutoComplete li.yui-ac-highlight +{ + background-color: #DCEAF4 !important; + color: #515D6B !important; +} + + +/* Gallery View */ + +.doclist .simple-detailed .gallery-view span.first-child +{ + background-image: url(images/gallery-view-off-16.png); +} + +.doclist .simple-detailed .gallery-view.yui-button-checked span.first-child +{ + background-image: url(images/gallery-view-on-16.png); +} + +.alf-gallery +{ + overflow: auto; + padding: 6px; +} + +.alf-gallery-item +{ + margin: 0.4%; + float: left; + width: 12.9%; + padding: 2px; +} + + +.alf-gallery.alf-selected .alf-gallery-item +{ + -moz-opacity: 0.40; + opacity: .40; + filter: alpha(opacity=40); +} +.alf-gallery.alf-selected .alf-gallery-item-thumbnail +{ + filter: alpha(opacity=40); +} + +.alf-gallery .alf-gallery-item.alf-hover +{ + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; +} +.alf-gallery .alf-gallery-item.alf-hover .alf-gallery-item-thumbnail +{ + filter: alpha(opacity=100) !important; +} + +.alf-gallery-item.alf-selected +{ + border: 2px solid #3D6FDB; + padding: 0; + -webkit-box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-box-shadow: 0px 0px 6px rgba(0,81,255,1); + box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; +} +.alf-gallery-item.alf-selected .alf-gallery-item-thumbnail +{ + filter: alpha(opacity=100) !important; +} + +.doclist .alf-gallery span.folder +{ + height: 100%; +} + +.alf-gallery-item .alf-gallery-item-thumbnail +{ + height: 100%; + border: none; + overflow: hidden; + position: relative; +} + +.alf-gallery-item .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-img +{ + width: 100%; + min-height: 100%; +} +.alf-gallery-item .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-img.alf-landscape +{ + width: inherit; + min-height: inherit; + height: 100%; + min-width: 100%; +} +.alf-gallery-item .alf-gallery-item-thumbnail .folder .alf-gallery-item-thumbnail-img +{ + background: transparent; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)"; /* IE8 */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF); /* IE6 & 7 */ + zoom: 1; +} +.alf-gallery-item .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-folder-img +{ + height: 68%; + min-width: 68%; +} + +.alf-gallery-item .alf-header +{ + color: white; + padding: 0 4%; + position: absolute; + font-size: 1.2em; + width: 100%; + white-space: nowrap; + background: url("../images/black-50-transparency.png") repeat !important; + z-index: 1; + visibility: hidden; + margin: 0 !important; +} +.alf-gallery-item.alf-hover .alf-header, +.alf-selected .alf-gallery-item .alf-header +{ + visibility: visible !important; +} + +.alf-gallery-item .alf-select +{ + float: left; + position: absolute; + top: 50%; + margin-top: -10px; + height: 16px; + left: 4%; +} + +.alf-gallery-item .alf-show-detail +{ + float: right; + position: relative; + right: 2%; + top: 52%; + background-image: url(images/show-detail.png); + background-repeat: no-repeat; + padding: 0px 0px 0px 16px; + margin-top: -8px; + line-height: 16px; + text-decoration: none !important; +} + +.alf-gallery-item .alf-separator +{ + margin: 12px 18px; + height: 1px; + background-color: #595959; +} + +.alf-gallery-item .alf-status +{ + float: left; + margin-left: 20px; +} + +.alf-gallery-item .alf-actions +{ + padding: 0 14px; + float: right; +} +.alf-gallery-item .alf-actions a:focus +{ + outline: none; +} + +.alf-gallery-item .alf-description +{ +} +.alf-gallery-item .alf-description a:focus +{ + outline: none !important; +} + +.alf-gallery-item .alf-detail +{ + visibility: hidden; +} + +.alf-gallery .yui-panel .bd +{ + color: inherit !important; + padding: 20px 4px 16px 4px; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + border: 1px solid #444; +} +.alf-gallery .yui-panel-container +{ + left: 0; +} + +.alf-gallery-item .alf-detail .alf-detail-thumbnail +{ + padding: 0 20px; +} +.alf-gallery-item .alf-detail .alf-detail-thumbnail img +{ + max-width: 350px; + max-height: 265px; +} +.alf-gallery-item .alf-detail .detail span.item-social:last-child +{ + margin-right: 0; +} + +.doclist div.gallery a.action-link span, +.doclist div.gallery a.simple-link span +{ + display: none; +} +.doclist div.gallery div.more-actions div +{ + float: none; +} +.doclist div.gallery div.more-actions a.action-link span, +.doclist div.gallery div.more-actions a.simple-link span +{ + display: block; +} +.doclist .action-set.gallery div +{ + float: left; +} + +.alf-gallery-item .alf-label +{ + color: white; + padding: 12px; + position: absolute; + bottom: 0; + font-size: 1.2em; + background: url("../images/black-50-transparency.png") repeat; + width: 100%; + white-space: nowrap; + text-shadow: 1px 1px #333333; + z-index: 1; +} + +.alf-gallery-item .alf-label a, +.alf-gallery-item .alf-label a:visited +{ + color: white !important; + text-decoration: none !important; +} + +.alf-gallery-item .alf-label a:hover +{ + text-decoration: underline !important; + background: none !important; +} + +.alf-gallery-item .alf-label h3 +{ + font-weight: normal; +} +.alf-gallery-item .alf-label .detail +{ + display: none; +} +.alf-gallery-item .alf-label .document-version +{ + display: none; +} +.doclist .documents.alf-gallery .filename span.document-version +{ + visibility: inherit; +} + +.alf-gallery-columns-3 .alf-gallery-item +{ + width: 31.5%; + margin: 0.6%; +} +.alf-gallery-columns-3 .alf-gallery-item .alf-label +{ + font-size: 1.3em; + padding: 1.3em 0.8em; +} +.alf-gallery-columns-3 .alf-gallery-item .alf-header +{ + height: 3em; +} +#ygddfdiv.alf-gallery-columns-3 img +{ + max-width: 390px; + min-width: 270px +} +.alf-gallery-columns-4 .alf-gallery-item +{ + width: 23.5%; + margin: 0.5%; +} +.alf-gallery-columns-4 .alf-gallery-item .alf-label +{ + font-size: 1.2em; + padding: 1.2em 0.75em; +} +.alf-gallery-columns-4 .alf-gallery-item .alf-header +{ + height: 2.5em; +} +#ygddfdiv.alf-gallery-columns-4 img +{ + max-width: 290px; + min-width: 200px; +} +.alf-gallery-columns-7 .alf-gallery-item +{ + width: 12.9%; + margin: 0.4%; +} +.alf-gallery-columns-7 .alf-gallery-item .alf-label +{ + font-size: 0.85em; + padding: 0.95em 0.7em; +} +.alf-gallery-columns-7 .alf-gallery-item .alf-header +{ + height: 1.75em; +} +#ygddfdiv.alf-gallery-columns-7 img +{ + width: 160px; + min-width: 110px; +} +.alf-gallery-columns-10 .alf-gallery-item +{ + width: 8.9%; + margin: 0.3%; +} +.alf-gallery-columns-10 .alf-gallery-item .alf-label +{ + font-size: 0.75em; + padding: 0.8em 0.65em; +} +.alf-gallery-columns-10 .alf-gallery-item .alf-header +{ + height: 1.35em; +} +#ygddfdiv.alf-gallery-columns-10 img +{ + max-width: 100px; + min-width: 70px; +} + +.alf-gallery-slider +{ + float: right; + margin: 4px 4px 2px 0; +} +.alf-gallery-slider-bg +{ + position: relative; + width: 68px !important; + height: 16px !important; + float: left; + margin-right: 5px; + background-position: 3px !important; +} +.alf-gallery-slider-bg:focus +{ + outline: none; +} +.alf-gallery-slider-thumb +{ + position: absolute; + left: 0; + top: 0 !important; +} +.alf-gallery-slider-small +{ + float: left; + position: relative; + left: 1px; + height: 16px; +} +.alf-gallery-slider-large +{ + float: left; + height: 16px; + position: relative; + top: -1px; +} + +/* Filmstrip View */ + +.doclist .simple-detailed .filmstrip-view span.first-child +{ + background-image: url(images/filmstrip-view-off-16.png); +} + +.doclist .simple-detailed .filmstrip-view.yui-button-checked span.first-child +{ + background-image: url(images/filmstrip-view-on-16.png); +} + +.alf-gallery.alf-filmstrip { + padding: 0px; + position: relative; +} + +.alf-filmstrip .alf-gallery-item { + float: none; + margin: 0; + padding: 0; +} + +.alf-filmstrip .yui-carousel-element +{ + margin: 0; +} + +.alf-filmstrip .yui-carousel-element li { + margin: 0 !important; + border: none !important; + outline: none !important; +} +.alf-filmstrip .yui-carousel, .alf-filmstrip .yui-carousel-vertical { + border: none !important; +} +.alf-filmstrip .yui-carousel-nav { + display: none; +} +.alf-filmstrip-main-nav-button { + position: absolute; + top: 42%; +} +.alf-filmstrip-nav-buttons { + position: absolute; + top: 6px; + width: 100%; +} +.alf-filmstrip-nav-button { + z-index: 2; +} +.alf-filmstrip-nav-button.yui-carousel-first-button-disabled, .alf-filmstrip-nav-button.yui-carousel-button-disabled { + visibility: hidden !important; +} +.alf-filmstrip-nav-prev { + float: left; + margin-left: 10px; +} +.alf-filmstrip-nav-next { + float: right; + margin-right: 10px; +} +.alf-filmstrip-main-nav-button.alf-filmstrip-nav-prev { + margin-left: 25px; + +} +.alf-filmstrip-main-nav-button.alf-filmstrip-nav-next { + margin-right: 25px; + right: 0; +} + +.alf-filmstrip .alf-gallery-item-thumbnail { + position: relative; + height: 100%; + overflow: hidden; +} +.alf-filmstrip .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-img { + height: 100%; + min-width: inherit; + width: inherit; +} + +.alf-filmstrip .alf-gallery-item .alf-header +{ + color: white; + padding: 12px; + position: absolute; + top: 0; + font-size: 1.2em; + background: url("../images/black-50-transparency.png") repeat; + width: 100%; + text-shadow: 1px 1px #333333; + z-index: 2; + visibility: visible; +} + +.alf-filmstrip .alf-gallery-item .alf-select +{ + float: left; + margin-right: 15px; + position: relative; + margin-top: 2px; + left: 0; +} + +.alf-filmstrip .alf-gallery-item .alf-label +{ + float: left; + z-index: auto; + position: relative; + width: auto; + bottom: inherit; + background: none; + padding: 0; +} + +.alf-filmstrip .alf-gallery-item .alf-show-detail +{ + right: 3%; + margin-top: 2px; + margin-right: 0; +} + +.alf-filmstrip .alf-gallery-item .alf-detail.yui-panel +{ + z-index: 2; +} + +.alf-filmstrip .web-preview .Image img +{ + max-width: none; + height: 100%; +} + +.alf-filmstrip .alf-gallery-item-thumbnail .alf-header ~ div, +.alf-filmstrip .web-preview, +.alf-filmstrip .web-preview .previewer +{ + height: 100%; +} + +.alf-filmstrip .web-preview .previewer.WebPreviewer +{ + height: 90%; +} + +.web-preview.real +{ + margin-top: 46px; + z-index: 1; +} + +.doclist div.filmstrip a.action-link span, +.doclist div.filmstrip a.simple-link span +{ + display: none; +} +.doclist div.filmstrip div.more-actions div +{ + float: none; +} +.doclist div.filmstrip div.more-actions a.action-link span, +.doclist div.filmstrip div.more-actions a.simple-link span +{ + display: block; +} +.doclist .action-set.filmstrip div +{ + float: left; +} + +.alf-filmstrip-nav { + width: 100%; + position: absolute; + bottom: 0; + background: url("../images/black-50-transparency.png") repeat; + z-index: 2; + height: 112px; +} +.alf-filmstrip-nav .yui-carousel { + margin: 0 auto; + z-index: 2; +} +.alf-filmstrip-nav .alf-filmstrip-nav-handle { + z-index: 2; + position: absolute; + left: 47.5%; + top: -12px; + height: 12px; + width: 60px; + background: url("images/filmstrip-nav-handle-down.png"); +} + +.alf-filmstrip-nav-item { + padding: 4px; +} +.alf-filmstrip-nav-item:focus { + outline: none; +} +.alf-gallery.alf-filmstrip .alf-gallery-item +{ + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border: none; +} + +.alf-filmstrip-nav-item.alf-selected .alf-filmstrip-nav-item-thumbnail +{ + border: 2px solid #3D6FDB; + padding: 0; + -webkit-box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-box-shadow: 0px 0px 6px rgba(0,81,255,1); + box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; + height: 100px; +} + +.alf-filmstrip-nav-item .alf-filmstrip-nav-item-thumbnail { + position: relative; + height: 98px; + overflow: hidden; + width: 100px; + padding: 2px; +} +.alf-filmstrip-nav-item .alf-filmstrip-nav-item-thumbnail .alf-gallery-item-thumbnail-img +{ + width: 102px; + min-height: 102px; +} +.alf-filmstrip-nav-item .alf-filmstrip-nav-item-thumbnail .alf-gallery-item-thumbnail-img.alf-landscape +{ + width: auto; + min-height: inherit; + height: 102px; + min-width: 102px; +} + +#ygddfdiv.alf-filmstrip-dragging img +{ + max-height: 100px; +} +.alf-filmstrip-nav-item .alf-label +{ + color: white; + padding: 0.7em; + font-size: 0.9em; + position: absolute; + bottom: 0; + background: url("../images/black-50-transparency.png") repeat; + width: 100%; + text-shadow: 1px 1px #333333; + text-align: left; + z-index: 2; + visibility: visible; +} +.alf-filmstrip-nav-item .alf-label a, +.alf-filmstrip-nav-item .alf-label a:visited +{ + color: white !important; + text-decoration: none !important; +} + +.alf-filmstrip-nav-item .alf-label a:hover +{ + text-decoration: underline !important; + background: none !important; +} + +.alf-filmstrip.alf-filmstrip-content-only .alf-filmstrip-nav { + bottom: -112px !important; +} +.alf-filmstrip.alf-filmstrip-content-only .alf-gallery-item .alf-header { + top: -50px !important; +} +.alf-filmstrip.alf-filmstrip-content-only .alf-filmstrip-nav .alf-filmstrip-nav-handle { + background: url("images/filmstrip-nav-handle-up.png"); +} + diff --git a/share/src/main/webapp/components/documentlibrary/documentlist.js b/share/src/main/webapp/components/documentlibrary/documentlist.js new file mode 100644 index 0000000000..0c5db449b9 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist.js @@ -0,0 +1,4937 @@ +/** + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentList component. + * + * @namespace Alfresco + * @class Alfresco.DocumentList + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + DDM = YAHOO.util.DragDropMgr; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $links = Alfresco.util.activateLinks, + $combine = Alfresco.util.combinePaths, + $userProfile = Alfresco.util.userProfileLink, + $siteURL = Alfresco.util.siteURL, + $date = function $date(date, format) { return Alfresco.util.formatDate(Alfresco.util.fromISO8601(date), format); }, + $relTime = Alfresco.util.relativeTime, + $isValueSet = Alfresco.util.isValueSet; + + /** + * Preferences + */ + var PREFERENCES_DOCLIST = "org.alfresco.share.documentList", + PREF_SORT_ASCENDING = PREFERENCES_DOCLIST + ".sortAscending", + PREF_SORT_FIELD = PREFERENCES_DOCLIST + ".sortField", + PREF_SHOW_FOLDERS = PREFERENCES_DOCLIST + ".showFolders", + PREF_HIDE_NAVBAR = PREFERENCES_DOCLIST + ".hideNavBar", + PREF_SIMPLE_VIEW = PREFERENCES_DOCLIST + ".simpleView", // deprecated + PREF_VIEW_RENDERER = PREFERENCES_DOCLIST + ".viewRendererName", // viewRender was previously simpleView + PREF_GALLERY_COLUMNS = PREFERENCES_DOCLIST + ".galleryColumns"; + + /** + * Polyfill for ES6 String.prototype.startsWith() (IE11 compatibility) + * @see MNT-16389 + */ + if (!String.prototype.startsWith) + { + String.prototype.startsWith = function(searchString, position) + { + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; + } + + /** + * Document Library Drag and Drop object declaration. + */ + Alfresco.DnD = function(id, docLib, sGroup, config) + { + Alfresco.DnD.superclass.constructor.call(this, id, sGroup, config); + var el = this.getDragEl(); + Dom.setStyle(el, "opacity", 0.67); + this.docLib = docLib; + }; + + /** + * Extend the default YUI drag and drop proxy object to handle DocumentLibrary move operations. + */ + YAHOO.extend(Alfresco.DnD, YAHOO.util.DDProxy, + { + /** + * A flag used to indicate whether or not an asynchronous move operation request is in progress. + */ + _inFlight: false, + + /** + * Handles the beginning of a drag operation by setting up the proxy image element. + */ + startDrag: function DL_DND_startDrag(x, y) + { + var dragEl = this.getDragEl(); + var clickEl = this.getEl(); + Dom.setStyle(clickEl, "visibility", "hidden"); + var proxyImg = document.createElement("img"); + proxyImg.src = clickEl.src; + dragEl.removeChild(dragEl.firstChild); + dragEl.appendChild(proxyImg); + Dom.setStyle(dragEl, "border", "none"); + }, + + /** + * Handles the end of the drag operation. Because the move operation is asynchronous + * it is not know if the operation has been a success at the time this function is + * invoked so it uses the _inFlight variable to check whether or not a valid drop + * target was used. + * + * @param The event object + */ + endDrag: function DL_DND_endDrag(e) + { + if (!this._inFlight) + { + var srcEl = this.getEl(); + var proxy = this.getDragEl(); + this.animateResult(proxy, srcEl); + } + }, + + /** + * Animates an object to move it to the location of a target object. This should typically + * be animating the proxy object to return to its source. + * + * @param objectToAnimate The object to animate + * @param animationTarget The object to create a motion animation to + */ + animateResult: function DL_DND_animateResult(objectToAnimate, animationTarget) + { + Dom.setStyle(objectToAnimate, "visibility", ""); + var a = new YAHOO.util.Motion( + objectToAnimate, { + points: { + to: Dom.getXY(animationTarget) + } + }, + 0.2, + YAHOO.util.Easing.easeOut + ); + var proxyid = objectToAnimate.id; + var thisid = this.id; + + a.onComplete.subscribe(function() { + Dom.setStyle(proxyid, "visibility", "hidden"); + Dom.setStyle(thisid, "visibility", ""); + }); + a.animate(); + }, + + /** + * Handles a drop operation by determining whether or not a valid drop has been performed (e.g. + * a document or folder onto a folder - NOT a document) and then fires a request to perform + * the move operation. + * + * @param e The event object + * @param id The id of the element that the proxy has been dropped onto + */ + onDragDrop: function DL_DND_onDragDrop(e, id) + { + var dropTarget = Dom.get(id); + if (DDM.interactionInfo.drop.length > 0) + { + // See if the element exists within the table... + if (Dom.isAncestor(this.docLib.widgets.dataTable.getContainerEl(), dropTarget)) + { + // If the drop target is contained within the data table then process "normally"... + var targetRecord = this.docLib.widgets.dataTable.getRecord(Dom.get(id)), + targetNode = targetRecord.getData(); + + if (targetNode.node.isContainer) + { + // Indicate that a request is about to be made - this will prevent the endDrag + // function from animating the proxy to return to its source... + this._inFlight = true; + + // Make sure we handle linked folders... + var nodeRef; + if (targetNode.node.isLink) + { + nodeRef = new Alfresco.util.NodeRef(targetNode.node.linkedNode.nodeRef); + } + else + { + nodeRef = new Alfresco.util.NodeRef(targetNode.node.nodeRef); + } + + // Move the document/folder... + this._performMove(nodeRef, targetNode.location.path + "/" + targetNode.location.file); + } + } + else if (Dom.hasClass(dropTarget, "documentDroppable")) + { + // The "documentDroppable" class is not defined in any CSS files but is simply used as + // a marker to indicate that the element can be used as a document drop target. Only + // documents are dragged and dropped onto these elements should result in the drop + // target request being fired (it's possible that an element could be specified as a + // YUI drag and drop target for the purposes of controlling drag events without actually + // allowing drops to occur + var fpanel = Dom.get("alf-filters"), + offset = (fpanel ? parseInt(fpanel.style.width, 10) : 160); + + // MNT-19306 + // If the current x co-ordinate of the mouse pointer is NOT greater than the width + // of the tree element, or this is a breadcrumb, then we SHOULD move folder/documents. + // otherwise do NOT move folder/documents. + if (e.clientX <= offset || Dom.hasClass(dropTarget, "crumb")) + { + var payload = + { + elementId: id, + callback: this.onDropTargetOwnerCallBack, + scope: this + } + YAHOO.Bubbling.fire("dropTargetOwnerRequest", payload); + } + + this._inFlight = true; + this._setFailureTimeout(); + } + } + }, + + /** + * Moves the document or folder associated with the drag proxy to the nodeRef supplied. This + * method is either called when dropping onto the DocumentList directly or onto any other + * valid drop target that can process "dropTargetOwnerRequest" events. + * + * @method _performMove + * @property nodeRef The nodeRef onto which the proxy should be moved. + */ + _performMove: function DL_DND__performMove(nodeRef, path) + { + // Set variables required for move... + var toMoveRecord = this.docLib.widgets.dataTable.getRecord(this.getEl()), + webscriptName = "move-to/node/{nodeRef}", + multipleFiles = []; + + multipleFiles.push(this.getEl().id); + + // Success callback function: + // If the operation succeeded then update the tree and refresh the document list. + var fnSuccess = function DLCMT__onOK_success(p_data) + { + this._inFlight = false; // Indicate that a request is no longer "in-flight" + + var result, + successCount = p_data.json.successCount, + failureCount = p_data.json.failureCount; + + // Did the operation NOT succeed? + if (!p_data.json.overallSuccess) + { + this.animateResult(this.getDragEl(), this.getEl()); + Alfresco.util.PopupManager.displayMessage( + { + text: this.docLib.msg("message.file-dnd-move.failure") + }); + Dom.removeClass(this.dragFolderHighlight, "dndFolderHighlight"); + return; + } + + // Refresh the document list... + this.docLib._updateDocList.call(this.docLib); + + // Update the tree if a folder has been moved... + var moved = toMoveRecord.getData(); + if (moved.node.isContainer) + { + YAHOO.Bubbling.fire("folderMoved", + { + multiple: true, + nodeRef: moved.nodeRef, + destination: path + }); + } + }; + // destination: targetNode.location.path + "/" + targetNode.location.file + + // Failure callback function: + // If the move operation has failed then animate the proxy to return it to the + // location from which it was dragged. Also, post a failure message. + var fnFailure = function DLCMT__onOK_failure(p_data) + { + this._inFlight = false; // Indicate that a request is no longer "in-flight" + this.animateResult(this.getDragEl(), this.getEl()); + Alfresco.util.PopupManager.displayMessage( + { + text: this.docLib.msg("message.file-dnd-move.failure") + }); + Dom.removeClass(this.dragFolderHighlight, "dndFolderHighlight"); + }; + + // Make the request to move the dragged object to the target + this.docLib.modules.actions.genericAction( + { + success: + { + callback: + { + fn: fnSuccess, + scope: this + } + }, + failure: + { + callback: + { + fn: fnFailure, + scope: this + } + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: webscriptName, + params: + { + nodeRef: nodeRef.uri + } + }, + wait: + { + message: this.docLib.msg("message.please-wait") + }, + config: + { + requestContentType: Alfresco.util.Ajax.JSON, + dataObj: + { + nodeRefs: multipleFiles, + parentId: this.docLib.doclistMetadata.parent.nodeRef + } + } + }); + }, + + /** + * The id of the current window timeout. This should only be non-null if a proxy has been + * dropped onto a valid drop target that was NOT part of the DocumentList DataTable widget. + * This id is used to clear the current timeout associated with a drop if the target owner + * responds with the node ref. + * + * @property _currTimeoutId + * @type int + */ + _currTimeoutId: null, + + /** + * Callback function that is included in the payload of the "dropTargetOwnerRequest" event. + * This can then be used by a subscriber to the event that claims ownership of the target to + * generate the move using the associated nodeRef. + * + * @method onDropTargetOwnerCallBack + * @property nodeRef The nodeRef to move the dragged object to. + */ + onDropTargetOwnerCallBack: function DL_DND_onDropTargetOwnerCallBack(nodeRef, path) + { + // Clear the timeout that was set... + this._clearTimeout(); + + // Move the document/folder... + var node = new Alfresco.util.NodeRef(nodeRef); + this._performMove(node, path); + }, + + /** + * Clears the timeout that is set when a proxy is dropped onto a valid drop target that is + * NOT part of the DocumentList DataTable widget. This clears the timeout, resets the timeout + * id to null and removes the inflight status of the drop operation. + * + * @method _clearTimeout + */ + _clearTimeout: function DL_DND__clearTimeout() + { + if (this._currTimeoutId != null) + { + window.clearTimeout(this._currTimeoutId); + this._currTimeoutId = null; + this._inFlight = false; + } + }, + + /** + * Creates a timeout for handling drops onto valid drop targets that are NOT part of the + * DocumentList DataTable widget. This method is called after firing a "dropTargetOwnerRequest" + * to wait for the owner of the target to respond with the nodeRef associated with the target. + * If a response is not sent then a failure will be registered. + * + * @method _setFailureTimeout + */ + _setFailureTimeout: function DL_DND__setFailureTimeout() + { + // Clear any previous timeout... + this._clearTimeout(); + var _this = this; + this._currTimeoutId = window.setTimeout(function() + { + // An attempt was made to drop a document or folder into a document - NOT a folder + _this.animateResult(_this.getDragEl(), _this.getEl()); + _this._inFlight = false + _this._currTimeoutId = null; + }, 500); + }, + + /** + * If the element the proxy has been dragged over is a folder, then style class indicating + * that it is a viable drop target is added. + * + * @param e The event object + * @param id The id of the element that the proxy has been dragged over + */ + onDragOver: function DL_DND_onDragOver(e, id) + { + var destEl = Dom.get(id); + if (destEl.tagName == "IMG" || destEl.className == "droppable") + { + this.dragFolderHighlight = Dom.getAncestorByClassName(destEl, "folder"); + Dom.addClass(this.dragFolderHighlight, "dndFolderHighlight"); + } + else if (Dom.hasClass(destEl, "documentDroppableHighlights")) + { + // Fire an event indicating a document drag over + var payload = + { + elementId: id, + event: e + } + YAHOO.Bubbling.fire("documentDragOver", payload); + } + }, + + /** + * If the element the proxy has been dragged out of is a folder, then style class indicating + * that it is a viable drop target is removed. + * + * @param e The event object + * @param id The id of the element that the proxy has been dragged out of + */ + onDragOut: function DL_DND_onDragOut(e, id) + { + var destEl = Dom.get(id); + if (destEl.tagName == "IMG" || destEl.className == "droppable") + { + this.dragFolderHighlight = Dom.getAncestorByClassName(destEl, "folder"); + Dom.removeClass(this.dragFolderHighlight, "dndFolderHighlight"); + } + else if (Dom.hasClass(destEl, "documentDroppableHighlights")) + { + // Fire an event indicating a document drag out + var payload = + { + elementId: id, + event: e + } + YAHOO.Bubbling.fire("documentDragOut", payload); + } + } + }); + + /** + * DocumentList constructor. + * + * @param htmlId {String} The HTML id of the parent element + * @return {Alfresco.DocumentList} The new DocumentList instance + * @constructor + */ + Alfresco.DocumentList = function(htmlId) + { + Alfresco.DocumentList.superclass.constructor.call(this, "Alfresco.DocumentList", htmlId, ["button", "menu", "container", "datasource", "datatable", "paginator", "json", "history"]); + + /* + * Initialise prototype properties + */ + this.currentPath = ""; + this.currentPage = 1; + this.totalRecords = 0; + this.totalRecordsUpper = null; + this.hideMoreActionsFn = null; + this.state = + { + actionEditOfflineActive: false + }; + this.currentFilter = + { + filterId: "path", + filterData: "" + }; + this.actions = {}; + this.selectedFiles = {}; + this.afterDocListUpdate = []; + this.doclistMetadata = {}; + this.previewTooltips = []; + this.insituEditors = []; + this.dynamicControls = []; + this.sortControls = []; + this.dragAndDropAllowed = true; + this.dragAndDropEnabled = false; + this.dragEventRefCount = 0; + this.actionsView = "browse"; + this.renderers = {}; + this.viewRenderers = {}; + this.dataSourceUrl = $combine(Alfresco.constants.URL_SERVICECONTEXT, "components/documentlibrary/data/doclist/"); + + /** + * Decoupled event listeners + */ + // Specific event handlers + YAHOO.Bubbling.on("activateDynamicControls", this.onActivateDynamicControls, this); + YAHOO.Bubbling.on("activateSortControls", this.onActivateSortControls, this); + YAHOO.Bubbling.on("deactivateAllControls", this.onDeactivateAllControls, this); + YAHOO.Bubbling.on("deactivateDynamicControls", this.onDeactivateDynamicControls, this); + YAHOO.Bubbling.on("deactivateSortControls", this.onDeactivateSortControls, this); + YAHOO.Bubbling.on("metadataRefresh", this.onDocListRefresh, this); + YAHOO.Bubbling.on("fileRenamed", this.onFileRenamed, this); + YAHOO.Bubbling.on("changeFilter", this.onChangeFilter, this); + YAHOO.Bubbling.on("filterChanged", this.onFilterChanged, this); + YAHOO.Bubbling.on("folderCreated", this.onDocListRefresh, this); + YAHOO.Bubbling.on("nodeCreated", this.onDocListRefresh, this); + YAHOO.Bubbling.on("folderRenamed", this.onFileRenamed, this); + YAHOO.Bubbling.on("highlightFile", this.onHighlightFile, this); + YAHOO.Bubbling.on("registerRenderer", this.onRegisterRenderer, this); + YAHOO.Bubbling.on("registerViewRenderer", this.onRegisterViewRenderer, this); + YAHOO.Bubbling.on("registerAction", this.onRegisterAction, this); + YAHOO.Bubbling.on("resizerChanged", this.onResizerChanged, this); + // File actions which may be part of a multi-file action set + YAHOO.Bubbling.on("fileCopied", this.onFileAction, this); + YAHOO.Bubbling.on("fileDeleted", this.onFileAction, this); + YAHOO.Bubbling.on("fileMoved", this.onFileAction, this); + YAHOO.Bubbling.on("fileLinkCreated", this.onFileAction, this); + YAHOO.Bubbling.on("filePermissionsUpdated", this.onFileAction, this); + YAHOO.Bubbling.on("folderCopied", this.onFileAction, this); + YAHOO.Bubbling.on("folderDeleted", this.onFileAction, this); + YAHOO.Bubbling.on("folderMoved", this.onFileAction, this); + YAHOO.Bubbling.on("folderPermissionsUpdated", this.onFileAction, this); + // Multi-file actions + YAHOO.Bubbling.on("filesCopied", this.onDocListRefresh, this); + YAHOO.Bubbling.on("filesDeleted", this.onDocListRefresh, this); + YAHOO.Bubbling.on("filesMoved", this.onDocListRefresh, this); + YAHOO.Bubbling.on("filesLinkCreated", this.onDocListRefresh, this); + YAHOO.Bubbling.on("filesPermissionsUpdated", this.onDocListRefresh, this); + + return this; + }; + + /** + * Extend from Alfresco.component.Base + */ + YAHOO.extend(Alfresco.DocumentList, Alfresco.component.Base); + + /** + * Augment prototype with Actions module + */ + YAHOO.lang.augmentProto(Alfresco.DocumentList, Alfresco.doclib.Actions); + + /** + * Custom field generator functions + */ + + /** + * Generate "changeFilter" event mark-up suitable for element attribute. + * + * @method generateFilterMarkup + * @param filter {object} Object literal containing new filter parameters + * @return {string} Mark-up for use in node attribute + */ + Alfresco.DocumentList.generateFilterMarkup = function DL_generateFilterMarkup(filter) + { + var filterObj = Alfresco.util.cleanBubblingObject(filter); + return YAHOO.lang.substitute("{filterOwner}|{filterId}|{filterData}|{filterDisplay}", filterObj, function(p_key, p_value, p_meta) + { + return typeof p_value === "undefined" ? "" : window.escape(p_value); + }); + }; + + /** + * Generate "changeFilter" event mark-up specifically for path changes + * + * @method generatePathMarkup + * @param locn {object} Location object containing path and folder name to navigate to + * @return {string} Mark-up for use in node attribute + */ + Alfresco.DocumentList.generatePathMarkup = function DL_generatePathMarkup(locn) + { + return Alfresco.DocumentList.generateFilterMarkup( + { + filterId: "path", + filterData: $combine(locn.path, locn.file) + }); + }; + + /** + * Generate "changeFilter" event mark-up specifically for category changes + * + * @method generateCategoryMarkup + * @param category {Array} category[0] is name, category[1] is qnamePath + * @return {string} Mark-up for use in node attribute + */ + Alfresco.DocumentList.generateCategoryMarkup = function DL_generateCategoryMarkup(category) + { + return Alfresco.DocumentList.generateFilterMarkup( + { + filterId: "category", + filterData: $combine(category[1], category[0]) + }); + }; + + /** + * Generate URL for a file- or folder-link that may be located within a different Site + * + * @method generateFileFolderLinkMarkup + * @param record {object} Item record + * @return {string} Mark-up for use in node attribute + *
    +    *       Folders: Navigate into the folder (ajax)
    +    *       Documents: Navigate to the details page (page)
    +    *    Links: Same site (or Repository mode)
    +    *       Links to folders: Navigate into the folder (ajax)
    +    *       Links to documents: Navigate to the details page (page)
    +    *    Links: Different site
    +    *       Links to folders: Navigate into the site & folder (page)
    +    *       Links to documents: Navigate to the details page within the site (page)
    +    * 
    + */ + Alfresco.DocumentList.generateFileFolderLinkMarkup = function DL_generateFileFolderLinkMarkup(scope, record) + { + var jsNode = record.jsNode, + recordSite = Alfresco.DocumentList.getRecordSite(record), + currentSite = scope.options.siteId, + recordPath = record.location.path, + recordRepoPath = record.location.repoPath, + html; + + if (jsNode.isLink) + { + var fileName = $isValueSet(jsNode.linkedNode.properties) ? jsNode.linkedNode.properties.name : null; + var linkedNodeIsContainer = jsNode.linkedNode.isContainer; + + if (!linkedNodeIsContainer && (Alfresco.constants.PAGECONTEXT == "shared" || Alfresco.constants.PAGECONTEXT == "mine")) { + if (jsNode.linkedNode.nodeRef != undefined) { + + var strNodeRef = jsNode.linkedNode.nodeRef.toString(); + html = window.location.protocol + "//" + window.location.host + Alfresco.constants.URL_PAGECONTEXT + "document-details?nodeRef=" + strNodeRef; + } + else + { + Alfresco.logger.debug("The original document was deleted! So the node reference is null!"); + } + } + else if (linkedNodeIsContainer) + { + if ($isValueSet(scope.options.siteId) && record.location.site) + { + html = $siteURL("documentlibrary?path=" + encodeURIComponent(recordPath + (recordPath != "/" ? "/" : "") + fileName), + { + site: record.location.site.name + }); + } + else + { + html = window.location.protocol + "//" + window.location.host + Alfresco.constants.URL_PAGECONTEXT + "repository?path=" + encodeURIComponent(recordRepoPath + (recordRepoPath != "/" ? "/" : "") + fileName); + } + } + else + { + if ($isValueSet(scope.options.siteId) && record.location.site && record.location.site.name !== scope.options.siteId) + { + html = scope.getActionUrls(record, record.location.site.name).documentDetailsUrl; + } + else + { + html = scope.getActionUrls(record).documentDetailsUrl; + } + } + } + else + { + if (jsNode.isContainer) + { + // fix for MNT-15347 - browsing non primary folders from another site + if (currentSite !== "" && recordSite !== null && currentSite !== recordSite) + { + recordPath = scope.currentPath; + } + if (record.parent.isContainer || record.node.isContainer) + { + // handle folder parent node + var location = {}; + location.path = recordPath; + location.file = record.location.file; + html = '#" class="filter-change" rel="' + Alfresco.DocumentList.generatePathMarkup(location); + } + else if (recordPath === "/") + { + // handle Repository root parent node (special store_root type - not a folder) + html = '#" class="filter-change" rel="' + Alfresco.DocumentList.generateFilterMarkup( + { + filterId: "path", + filterData: $combine(recordPath, "") + }); + } + else + { + // handle unknown parent node types + html = '#'; + } + } + else + { + var actionUrls = scope.getActionUrls(record); + html = actionUrls.documentDetailsUrl; + } + } + + return ''; + }; + + /** + * Extracts record site name + * repoPath for documents within a site has following format : "/Sites/sitename/documentLibrary/*" + * + * @method _getRecordSite + * @param record + * @return site name if document record is within a site, otherwise null + */ + Alfresco.DocumentList.getRecordSite = function DL_getRecordSite(record) + { + var repoPath = record.location.repoPath, + sites = "/Sites/", + docLibrary = "/documentLibrary", + docLibraryIndex = repoPath.indexOf(docLibrary); + + if (repoPath.startsWith(sites) && docLibraryIndex > -1 && docLibraryIndex == repoPath.indexOf("/", sites.length)) + { + return repoPath.substring(sites.length, docLibraryIndex); + } + return null; + }; + + /** + * Generate URL to thumbnail image + * + * @method generateThumbnailUrl + * @param record {object} File record + * @param renditionName {string} the named thumbnail rendition to grab, default is doclib + * @return {string} URL to thumbnail + */ + Alfresco.DocumentList.generateThumbnailUrl = function DL_generateThumbnailUrl(record, renditionName) + { + var jsNode = record.jsNode, + nodeRef = jsNode.isLink ? jsNode.linkedNode.nodeRef : jsNode.nodeRef; + if (jsNode.isLink && !nodeRef) + { + // broken link has no thumbnail + return ''; + } + if (renditionName == null) + renditionName = "doclib"; + return Alfresco.util.generateThumbnailUrl(jsNode, renditionName); + }; + + /** + * Generate "Favourite" UI + * + * @method generateFavourite + * @param scope {object} DocumentLibrary instance + * @param record {object} File record + * @return {string} HTML mark-up for Favourite UI + */ + Alfresco.DocumentList.generateFavourite = function DL_generateFavourite(scope, record) + { + var jsNode = record.jsNode, + i18n = "favourite." + (jsNode.isContainer ? "folder." : "document."), + html = ""; + + if (record.isFavourite) + { + html = ''; + } + else + { + html = '' + scope.msg(i18n + "add.label") + ''; + } + + return html; + }; + + /** + * Generate "Likes" UI + * + * @method generateLikes + * @param scope {object} DocumentLibrary instance + * @param record {object} File record + * @return {string} HTML mark-up for Likes UI + */ + Alfresco.DocumentList.generateLikes = function DL_generateLikes(scope, record) + { + var node = record.node, + likes = record.likes, + i18n = "like." + (node.isContainer ? "folder." : "document."), + html = ""; + + if (likes.isLiked) + { + html = ''; + } + else + { + html = ''; + } + + html += ''; + + return html; + }; + + /** + * Generate "Comments" UI + * + * @method generateComments + * @param scope {object} DocumentLibrary instance + * @param record {object} File record + * @return {string} HTML mark-up for Comments UI + */ + Alfresco.DocumentList.generateComments = function DL_generateComments(scope, record) + { + var node = record.node, + actionUrls = scope.getActionUrls(record), + url = actionUrls[node.isContainer ? "folderDetailsUrl" : "documentDetailsUrl"] + "#comment", + i18n = "comment." + (node.isContainer ? "folder." : "document."); + + var hasComments = (node.properties["fm:commentCount"] !== undefined); + + var html = '' + scope.msg(i18n + "label") + ''; + if (hasComments) + { + html += '' + $html(node.properties["fm:commentCount"]) + ''; + } + return html; + }; + + /** + * Generate "Quickshare" UI + * + * @method generateQuickShare + * @param scope {object} DocumentLibrary instance + * @param record {object} File record + * @return {string} HTML mark-up for Comments UI + */ + Alfresco.DocumentList.generateQuickShare = function DL_generateQuickShare(scope, record) + { + // Create QuickShare widget (will returns its own markup) + return new Alfresco.QuickShare().setOptions({ + nodeRef: record.jsNode.nodeRef, + displayName: record.displayName + }).display(record.jsNode.properties.qshare_sharedId, record.jsNode.properties.qshare_sharedBy); + }; + + /** + * Generate User Profile link + * + * @method generateUserLink + * @param scope {object} DocumentLibrary instance + * @param oUser {object} Object literal container user data + * @return {string} HTML mark-up for user profile link + */ + Alfresco.DocumentList.generateUserLink = function DL_generateUserLink(scope, oUser) + { + if (oUser.isDeleted === true) + { + return '' + scope.msg("details.user.deleted", $html(oUser.userName)) + ''; + } + return $userProfile(oUser.userName, YAHOO.lang.trim(oUser.firstName + " " + oUser.lastName)); + }; + + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.DocumentList.prototype, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Flag indicating whether sort direction is ascending (true) or descending (false) + * + * @property sortAscending + * @type boolean + */ + sortAscending: true, + + /** + * Flag indicating whether folders are visible or not. + * + * @property showFolders + * @type boolean + */ + showFolders: false, + + /** + * Flag indicating whether the list shows a detailed view or a simple one. + * + * @property simpleView + * @type boolean + * @deprecated use viewRendererName instead + */ + simpleView: null, + + /** + * Indicates which viewRenderer to use when displaying the content set. + * + * Similar to the previous boolean switch called simpleView. + * + * @property viewRendererName + * @type string + * @default "detailed" + */ + viewRendererName: "detailed", + + /** + * An array containing the order of the viewRenderer keys + * + * @property viewRendererNames + * @type array + * @default ["simple", "detailed", "gallery"] + */ + viewRendererNames: [ "simple", "detailed", "gallery" ], + + /** + * @property viewRenderers + * @type array + * @default [] + */ + viewRenderers: [], + + /** + * Flag indicating whether pagination is available or not. + * + * @property usePagination + * @type boolean + * @default false + */ + usePagination: false, + + /** + * Current siteId. Not used in Repository working mode. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container. Not used in Repository working mode. + * + * @property containerId + * @type string + * @default "documentLibrary" + */ + containerId: "documentLibrary", + + /** + * Current root node. Not used in Site working mode. + * + * @property rootNode + * @type string + */ + rootNode: null, + + /** + * Initial page to show on load (otherwise taken from URL hash). + * + * @property initialPage + * @type int + */ + initialPage: 1, + + /** + * Number of items per page + * + * @property pageSize + * @type int + */ + pageSize: 50, + + /** + * Initial filter to show on load. + * + * @property initialFilter + * @type object + */ + initialFilter: {}, + + /** + * Delay before showing "loading" message for slow data requests + * + * @property loadingMessageDelay + * @type int + * @default 1000 + */ + loadingMessageDelay: 1000, + + /** + * FileName to highlight on initial DataTable render. + * + * @property highlightFile + * @type string + */ + highlightFile: null, + + /** + * Holds IDs to register preview tooltips with. + * + * @property previewTooltips + * @type array + */ + previewTooltips: null, + + /** + * Holds IDs to register insitu editors with. + * + * @property insituEditors + * @type array + */ + insituEditors: null, + + /** + * Number of multi-file uploads before grouping the Activity Post + * + * @property groupActivitiesAt + * @type int + * @default 5 + */ + groupActivitiesAt: 5, + + /** + * Valid inline edit mimetypes + * Currently allowed are plain text, HTML and XML only + * + * @property inlineEditMimetypes + * @type object + */ + inlineEditMimetypes: + { + "text/plain": true, + "text/html": true, + "text/xml": true + }, + + /** + * Replication URL Mapping details + * + * @property replicationUrlMapping + * @type object + */ + replicationUrlMapping: {}, + + /** + * Flag to indicate the list may be updated as a results of a REST API call + * + * @property listUpdated + * @type boolean + */ + listUpdated: false, + + /** + * Whether the Repo Browser is in use or not + * + * @property repositoryBrowsing + * @type boolean + */ + repositoryBrowsing: true, + + /** + * Whether the cm:title property is in use or not + * + * @property useTitle + * @type boolean + */ + useTitle: true, + + /** + * Whether the user viewing the document library is a manager of the site. + * + * @property userIsSiteManager + * @type boolean + */ + userIsSiteManager: false, + + /** + * Where to insert the "More..." actions split + * + * @property actionsSplitAt + * @type number + * @default 3 + */ + actionsSplitAt: 3, + + /** + * DND file system folder drag processing limit + * + * @property dndMaxFileLimit + * @type number + * @default 0 + */ + dndMaxFileLimit: 0 + }, + + /** + * Keeps track of different states + */ + state: + { + /** + * True if an an edit offline ajax call is in process + * + * @property: actionEditOfflineActive + * @type: boolean + * @default: false + */ + actionEditOfflineActive: false + }, + + /** + * Current path being browsed. + * + * @property currentPath + * @type string + */ + currentPath: null, + + /** + * Current page being browsed. + * + * @property currentPage + * @type int + * @default 1 + */ + currentPage: null, + + /** + * Total number of records (documents + folders) in the currentPath. + * + * @property totalRecords + * @type int + * @default 0 + */ + totalRecords: null, + + /** + * Current filter to filter document list. + * + * @property currentFilter + * @type object + */ + currentFilter: null, + + /** + * FileUpload module instance. + * + * @property fileUpload + * @type Alfresco.FileUpload + */ + fileUpload: null, + + /** + * Object container for storing action markup elements. + * + * @property actions + * @type object + */ + actions: null, + + /** + * Object literal of selected states for visible files (indexed by nodeRef). + * + * @property selectedFiles + * @type object + */ + selectedFiles: null, + + /** + * Current actions menu being shown + * + * @property currentActionsMenu + * @type object + * @default null + */ + currentActionsMenu: null, + + /** + * "More Actions" pop-up handler + * + * @property hideMoreActionsFn + * @type function + * @default null + */ + hideMoreActionsFn: null, + + /** + * Deferred function calls for after a document list update + * + * @property afterDocListUpdate + * @type array + */ + afterDocListUpdate: null, + + /** + * Metadata returned by doclist data webscript + * + * @property doclistMetadata + * @type object + * @default null + */ + doclistMetadata: null, + + /** + * Dynamic controls that take part in the deactivateDynamicControls event + * + * @property dynamicControls + * @type array + */ + dynamicControls: null, + + /** + * List of controls that are related to sorting - they can be enabled or disabled + * as a group depending on the filter that is currently displayed to the user. + * + * @property sortControls + * @type array + */ + sortControls: null, + + /** + * Indicates whether or not we allow the HTML5 drag and drop capability + * + * @property dragAndDropAllowed + * @type boolean + */ + dragAndDropAllowed: null, + + /** + * Indicates whether or not the browser supports the HTML5 drag and drop capability + * + * @property dragAndDropEnabled + * @type boolean + */ + dragAndDropEnabled: null, + + /** + * Drag and drop dragEnter / dragLeave event reference counter + * + * @property dragEventRefCount + * @type number + */ + dragEventRefCount: null, + + /** + * Tracks currently highlighted folder when dragging files + * + * @property dragFolderHighlight + * @type boolean + */ + dragFolderHighlight: null, + + /** + * Registered metadata renderers. + * Register new renderers via registerRenderer() or "registerRenderer" bubbling event + * + * @property renderers + * @type object + */ + renderers: null, + + /** + * Registered view renderers. + * Register new renderers via registerviewRenderer() or "registerViewRenderer" bubbling event + * + * @property viewRenderers + * @type array + */ + viewRenderers: null, + + /** + * Indicates whether or not the current user has permission to upload documents. This is initialised to + * false and will remain that way until it is updated by the _setupDataSource function. + * + * @property _userCanUpload + * @type boolean + * @default false + */ + _userCanUpload: false, + + /** + * Fired by YUI when parent element is available for scripting. + * Initial History Manager event registration + * + * @method onReady + */ + onReady: function DL_onReady() + { + // Reference to self used by inline functions + var me = this; + + // Detect whether or not HTML5 drag and drop is supported... + this.dragAndDropEnabled = this.dragAndDropAllowed && ('draggable' in document.createElement('span')) && YAHOO.env.ua.mobile === null; + + // If the viewRenderer in the user preference is no longer available, use first available + // Also determine the index value of the selected viewRenderer from viewRendererNames + var isViewRendererAvailable = false; + var selectedViewRendererIndex = 1; + for (var i = 0, ii = this.options.viewRendererNames.length; i < ii; i++) + { + if (this.options.viewRendererNames[i] === this.options.viewRendererName) + { + isViewRendererAvailable = true; + selectedViewRendererIndex = i; + break; + } + } + if (!isViewRendererAvailable && this.options.viewRendererNames.length > 0) + { + this.options.viewRendererName = this.options.viewRendererNames[0]; + } + + // Keep a local copy of the users view preference... we need to ensure that this is kept up-to-date + // as preferences are set to ensure we can switch back to the user preference if when the path changes + // from a container with no default view to a container without a default view... + this.userPreferredView = this.options.viewRendererName; + + // Set-up default metadata renderers + this._setupMetadataRenderers(); + + // Set-up YUI History Managers + this._setupHistoryManagers(); + + // This checks to see whether or not the toolbar are in the template... + // It has been intentionally placed in a conditional section as the Dojo based DocumentList widget that wraps + // this one intentionally removes the toolbar. Checking the existing of the main
    element in the template + // we are able to have this one JavaScript file work in both YUI and Dojo widgets without error + if (Dom.get(this.id + "-doclistBar")) + { + // Sort Direction button + this.widgets.sortAscending = Alfresco.util.createYUIButton(this, "sortAscending-button", this.onSortAscending); + if (this.widgets.sortAscending !== null) + { + this.widgets.sortAscending.set("title", this.msg(this.options.sortAscending ? "button.sort.descending" : "button.sort.ascending")); + if (!this.options.sortAscending) + { + Dom.addClass(this.widgets.sortAscending.get("element"), "sort-descending"); + } + this.sortControls.push(this.widgets.sortAscending); + } + + // Sort Field menu button + this.widgets.sortField = Alfresco.util.createYUIButton(this, "sortField-button", this.onSortField, { + type: "menu", + menu: "sortField-menu", + lazyloadmenu: false + }); + if (this.widgets.sortField !== null) + { + this.sortControls.push(this.widgets.sortField); + + // Set the initial menu label + var menuItems = this.widgets.sortField.getMenu().getItems(), + index; + + for (index in menuItems) + { + if (menuItems.hasOwnProperty(index)) + { + if (menuItems[index].value === this.options.sortField) + { + this.widgets.sortField.set("label", menuItems[index].cfg.getProperty("text") + " " + Alfresco.constants.MENU_ARROW_SYMBOL); + break; + } + } + } + } + + // Hide/Show Folders button + this.widgets.showFolders = Alfresco.util.createYUIButton(this, "showFolders-button", this.onShowFolders, { + type: "checkbox", + checked: this.options.showFolders + }); + if (this.widgets.showFolders !== null) + { + this.widgets.showFolders.set("title", this.msg(this.options.showFolders ? "button.folders.hide" : "button.folders.show")); + this.dynamicControls.push(this.widgets.showFolders); + } + + // ViewRenderer Select List button, HTML id not renamed yet for backwards compatibility + if (Dom.get(this.id + "-simpleDetailed")) + { + this.widgets.viewRendererSelect = new YAHOO.widget.ButtonGroup(this.id + "-simpleDetailed"); + if (this.widgets.viewRendererSelect !== null) + { + this.widgets.viewRendererSelect.check(selectedViewRendererIndex); + this.widgets.viewRendererSelect.on("checkedButtonChange", this.onViewRendererSelect, this.widgets.viewRendererSelect, this); + this.dynamicControls.push(this.widgets.viewRendererSelect); + } + } + + // File Select menu button + this.widgets.fileSelect = Alfresco.util.createYUIButton(this, "fileSelect-button", this.onFileSelect, { + type: "menu", + menu: "fileSelect-menu" + }); + if (this.widgets.fileSelect !== null) + { + this.dynamicControls.push(this.widgets.fileSelect); + } + + if (Dom.get(this.id + "-options-button")) + { + this.widgets.optionsMenu = Alfresco.util.createYUIButton(this, "options-button", this.onOptionSelect, { + type: "menu", + menu: "options-menu" + }); + if (this.widgets.optionsMenu !== null) + { + this.dynamicControls.push(this.widgets.optionsMenu); + } + } + } + + // Services + this.services.preferences = new Alfresco.service.Preferences(); + this.services.likes = new Alfresco.service.Ratings(Alfresco.service.Ratings.LIKES); + + // Set-up default view renderers + this._setupViewRenderers(); + + // DataSource set-up and event registration + this._setupDataSource(); + + // DataTable set-up and event registration + this._setupDataTable(); + + // Hook action events + var fnActionHandler = function DL_fnActionHandler(layer, args) + { + // Hide the "more actions" menu to avoid double clicking + // ACE-849 + if (me.hideMoreActionsFn) + { + me.hideMoreActionsFn.call(me); + } + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + if (typeof me[owner.id] === "function") + { + args[1].stop = true; + var elIdentifier = args[1].target; + if (typeof me.viewRenderers[me.options.viewRendererName] === "object") + { + elIdentifier = me.viewRenderers[me.options.viewRendererName].getDataTableRecordIdFromRowElement(me, args[1].target); + } + var record = me.widgets.dataTable.getRecord(elIdentifier).getData(); + me[owner.id].call(me, record, owner); + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("action-link", fnActionHandler); + YAHOO.Bubbling.addDefaultAction("show-more", fnActionHandler); + + // Hook like/unlike events + var fnLikesHandler = function DL_fnLikesHandler(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + me.onLikes.call(me, args[1].target.offsetParent, owner); + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("like-action", fnLikesHandler); + + // Hook favourite document/folder events + var fnFavouriteHandler = function DL_fnFavouriteHandler(layer, args) + { + var owner = YAHOO.Bubbling.getOwnerByTagName(args[1].anchor, "div"); + if (owner !== null) + { + me.onFavourite.call(me, args[1].target.offsetParent, owner); + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("favourite-action", fnFavouriteHandler); + + // Hook filter change events + var fnChangeFilterHandler = function DL_fnChangeFilterHandler(layer, args) + { + var owner = args[1].anchor; + if (owner !== null) + { + var filter = owner.rel, + filters, + filterObj = {}; + if (filter && filter !== "") + { + args[1].stop = true; + filters = filter.split("|"); + filterObj = + { + filterOwner: window.unescape(filters[0] || ""), + filterId: window.unescape(filters[1] || ""), + filterData: window.unescape(filters[2] || ""), + filterDisplay: window.unescape(filters[3] || "") + }; + Alfresco.logger.debug("DL_fnChangeFilterHandler", "changeFilter =>", filterObj); + YAHOO.Bubbling.fire("changeFilter", filterObj); + } + } + return true; + }; + YAHOO.Bubbling.addDefaultAction("filter-change", fnChangeFilterHandler); + + // DocLib Actions module + this.modules.actions = new Alfresco.module.DoclibActions(); + + // Resize event handler - adjusts the filename container DIV to a size relative to the container width + Event.addListener(window, "resize", this._resizeRowContainers, this, true); + + // Continue only when History Manager fires its onReady event + YAHOO.util.History.onReady(this.onHistoryManagerReady, this, true); + + // Initialize the browser history management library + try + { + YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe"); + } + catch(e) + { + /* + * The only exception that gets thrown here is when the browser is + * not supported (Opera, or not A-grade) + */ + Alfresco.logger.error(this.name + ": Couldn't initialize HistoryManager.", e); + this.onHistoryManagerReady(); + } + + var documentListFullScreen = new Alfresco.widget.FullScreen(this.id); + this.fullscreen = documentListFullScreen; + YAHOO.util.Event.addListener(Dom.get(this.id + '-fullscreen-exit-button'), 'click', function(e) + { + documentListFullScreen.toggleFullScreen(); + }); + YAHOO.Bubbling.on("fullScreenEnterComplete", function(layer, args) + { + if (args[1] && args[1].eventGroup == this.id && + (typeof this.viewRenderers[this.options.viewRendererName] === "object") && + this.viewRenderers[this.options.viewRendererName].currentResizeCallback) + { + this.viewRenderers[this.options.viewRendererName].currentResizeCallback(); + } + }, this); + YAHOO.Bubbling.on("fullScreenExitComplete", function(layer, args) + { + if (args[1] && args[1].eventGroup == this.id && + (typeof this.viewRenderers[this.options.viewRendererName] === "object") && + this.viewRenderers[this.options.viewRendererName].currentResizeCallback) + { + this.viewRenderers[this.options.viewRendererName].currentResizeCallback(); + } + }, this); + + // Remove the display:none style set in the documentlist_v2.lib.ftl that ensure the options menu DIV + // isn't shown before styles are applied to it... + Dom.setStyle(this.id + "-options-menu", "display", "inherit"); + + YAHOO.Bubbling.fire("postDocumentListOnReady", + { + scope: this, + eventGroup: this.id + }); + }, + + /** + * Insitu Editor callback function + * + * @method _insituCallback + * @protected + * @param response {object} AJAX response + * @param record {YAHOO.widget.Record} Record for the item being edited + */ + _insituCallback: function DL__insituCallback(response, record) + { + // Reload the node's metadata + var jsNode = record.jsNode, + nodeRef = jsNode.nodeRef, + webscriptPath = "components/documentlibrary/data", + libraryRootParam = ""; + if ($isValueSet(this.options.siteId)) + { + // Site mode + webscriptPath += "/site/" + encodeURIComponent(this.options.siteId) + } + else + { + // Repository mode + libraryRootParam = "&libraryRoot=" + encodeURIComponent(this.options.rootNode.toString()); + } + Alfresco.util.Ajax.request( + { + url: Alfresco.constants.URL_SERVICECONTEXT + webscriptPath + "/node/" + nodeRef.uri + + "?filter=" + encodeURIComponent(this.currentFilter.filterId) + + "&view=" + this.actionsView + "&noCache=" + new Date().getTime() + + libraryRootParam, + successCallback: + { + fn: function DL_insituCallback_refreshSuccess(response) + { + response.json.item.jsNode = new Alfresco.util.Node(response.json.item.node); + YAHOO.Bubbling.fire(jsNode.isContainer ? "folderRenamed" : "fileRenamed", + { + file: response.json.item + }); + // Prevent hide call which briefly shows stale data + return false; + }, + scope: this + }, + failureCallback: + { + fn: function DL_insituCallback_refreshFailure(response) + { + // No-op for now + }, + scope: this + } + }); + }, + + + /** + * DataTable Cell Renderers + */ + + /** + * Returns selector custom datacell formatter + * + * @method fnRenderCellSelected + */ + fnRenderCellSelected: function DL_fnRenderCellSelected() + { + var scope = this; + + /** + * Selector custom datacell formatter + * + * @method renderCellSelected + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellSelected(elCell, oRecord, oColumn, oData) + { + if (typeof scope.viewRenderers[scope.options.viewRendererName] === "object") + { + scope.viewRenderers[scope.options.viewRendererName].renderCellSelected(scope, elCell, oRecord, oColumn, oData); + } + }; + }, + + /** + * Returns status custom datacell formatter + * + * @method fnRenderCellStatus + */ + fnRenderCellStatus: function DL_fnRenderCellStatus() + { + var scope = this; + + /** + * Status custom datacell formatter + * + * @method renderCellStatus + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellStatus(elCell, oRecord, oColumn, oData) + { + if (typeof scope.viewRenderers[scope.options.viewRendererName] === "object") + { + scope.viewRenderers[scope.options.viewRendererName].renderCellStatus(scope, elCell, oRecord, oColumn, oData); + } + }; + }, + + /** + * Returns thumbnail custom datacell formatter + * + * @method fnRenderCellThumbnail + */ + fnRenderCellThumbnail: function DL_fnRenderCellThumbnail() + { + var scope = this; + + /** + * Thumbnail custom datacell formatter + * + * @method renderCellThumbnail + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellThumbnail(elCell, oRecord, oColumn, oData) + { + if (typeof scope.viewRenderers[scope.options.viewRendererName] === "object") + { + scope.viewRenderers[scope.options.viewRendererName].renderCellThumbnail(scope, elCell, oRecord, oColumn, oData); + } + }; + }, + + /** + * Returns description/detail custom datacell formatter + * + * @method fnRenderCellDescription + */ + fnRenderCellDescription: function DL_fnRenderCellDescription() + { + var scope = this; + + /** + * Description/detail custom datacell formatter + * + * @method renderCellDescription + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellDescription(elCell, oRecord, oColumn, oData) + { + if (typeof scope.viewRenderers[scope.options.viewRendererName] === "object") + { + scope.viewRenderers[scope.options.viewRendererName].renderCellDescription(scope, elCell, oRecord, oColumn, oData); + } + }; + }, + + /** + * Returns actions custom datacell formatter + * + * @method fnRenderCellActions + */ + fnRenderCellActions: function DL_fnRenderCellActions() + { + var scope = this; + + /** + * Actions custom datacell formatter + * + * @method renderCellActions + * @param elCell {object} + * @param oRecord {object} + * @param oColumn {object} + * @param oData {object|string} + */ + return function DL_renderCellActions(elCell, oRecord, oColumn, oData) + { + if (typeof scope.viewRenderers[scope.options.viewRendererName] === "object") + { + scope.viewRenderers[scope.options.viewRendererName].renderCellActions(scope, elCell, oRecord, oColumn, oData); + } + }; + }, + + /** + * Renders a node property value as best as it can using the rules described below: + * + * String - As is + * boolean - As is + * Number - As is + * Object - Will be inspected for the following attributes: + * - iso8601: Will format and render date using systems default format + * - displayName & username: Will render the displayName as a user profile link + * - displayName: Will render the displayName + * - title: Will render the title + * - name: Will render the name + * Array - Number of items in the array + * + * Note! This method should be used as a last resort when no specific property renderers have been registered + * for the property. + * + * @method renderProperty + * @param property + * return {String} html escaped string + */ + renderProperty: function(property) + { + if (YAHOO.lang.isString(property)) + { + return $html(property); + } + else if (YAHOO.lang.isArray(property)) + { + var rp = this.renderProperty; + return property.reduce(function(previousValue, currentValue) { + return rp(previousValue) + ", " + rp(currentValue); + }); + } + else if (YAHOO.lang.isBoolean(property)) + { + return property; + } + else if (YAHOO.lang.isNumber(property)) + { + return property; + } + else if (YAHOO.lang.isObject(property)) + { + if (property.hasOwnProperty("iso8601")) + { + return $date(property.iso8601); + } + else if (property.hasOwnProperty("userName") && property.hasOwnProperty("displayName")) + { + return Alfresco.util.userProfileLink(property.userName, property.displayName); + } + else if (property.hasOwnProperty("displayName")) + { + return $html(property.displayName || ""); + } + else if (property.hasOwnProperty("title")) + { + return $html(property.title || ""); + } + else if (property.hasOwnProperty("name")) + { + return $html(property.name || ""); + } + } + return ""; + }, + + /** + * Register a metadata renderer via Bubbling event + * + * @method onRegisterRenderer + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (property name, rendering function) + */ + onRegisterRenderer: function DL_onRegisterRenderer(layer, args) + { + var obj = args[1]; + if (obj && $isValueSet(obj.propertyName) && $isValueSet(obj.renderer)) + { + this.registerRenderer(obj.propertyName, obj.renderer); + } + else + { + Alfresco.logger.error("DL_onRegisterRenderer: Custom renderer registion invalid: " + obj); + } + }, + + /** + * Register a view renderer via Bubbling event + * + * @method onRegisterViewRenderer + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (property name, rendering function) + */ + onRegisterViewRenderer: function DL_onRegisterViewRenderer(layer, args) + { + var obj = args[1]; + if (obj && $isValueSet(obj.renderer)) + { + this.registerViewRenderer(obj.renderer); + } + else + { + Alfresco.logger.error("DL_onRegisterViewRenderer: Custom view renderer registion invalid: " + obj); + } + }, + + /** + * Register a metadata renderer + * + * @method registerRenderer + * @param propertyName {string} Property name to attach this renderer to + * @param renderer {function} Rendering function + * @return {boolean} Success status of registration + */ + registerRenderer: function DL_registerRenderer(propertyName, renderer) + { + if ($isValueSet(propertyName) && $isValueSet(renderer)) + { + this.renderers[propertyName] = renderer; + return true; + } + return false; + }, + + /** + * Register a view renderer and call its setupRenderer method + * + * @method registerViewRenderer + * @param renderer {object} Rendering object + * @return {boolean} Success status of registration + */ + registerViewRenderer: function DL_registerViewRenderer(renderer) + { + if ($isValueSet(renderer)) + { + this.viewRenderers[renderer.name] = renderer; + this.viewRenderers[renderer.name].setupRenderer(this); + return true; + } + return false; + }, + + /** + * Configure standard metadata renderers + * + * @method _setupMetadataRenderers + */ + _setupMetadataRenderers: function DL__setupMetadataRenderers() + { + var supressComponentConfig = {}; + if (this.options.suppressComponent) + { + supressComponentConfig = JSON.parse(this.options.suppressComponent); + } + this.registerRenderer("i18nLabel", function(record, label) + { + // Just return the label, removing the trailing ": " + return label.replace(/:\s$/, ""); + }); + + /** + * Locked / Working Copy banner + */ + this.registerRenderer("lockBanner", function(record, label) + { + var properties = record.jsNode.properties, + bannerUser = properties.lockOwner || properties.workingCopyOwner, + bannerLink = Alfresco.DocumentList.generateUserLink(this, bannerUser), + isContainer = record.jsNode.isContainer, + nodeTypePrefix = "details.banner.", + html = ""; + + if (isContainer) + { + nodeTypePrefix += "folder." + } + + /* Working Copy handling */ + if (record.workingCopy && bannerUser.userName === Alfresco.constants.USERNAME) + { + html = this.msg(nodeTypePrefix + (record.workingCopy.isWorkingCopy ? "editing" : "lock-owner")); + } + else + { + if (bannerUser.userName === Alfresco.constants.USERNAME) + { + html = this.msg(nodeTypePrefix + "lock-owner"); + } + else + { + html = this.msg(nodeTypePrefix + "locked", bannerLink); + } + } + return html; + }); + + this.registerRenderer("syncFailed", function(record, label) + { + return '' + this.msg("details.banner.sync-failed"); + }); + + this.registerRenderer("syncTransientError", function(record, label) + { + return '' + this.msg("details.banner.sync-transient-error"); + }); + + /** + * Date + */ + this.registerRenderer("date", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + html = ""; + + var suppressDate = Alfresco.util.isSuppressed(record.node, supressComponentConfig.date.browse.folder); + + if (!suppressDate) + { + var dateI18N = "modified", dateProperty = properties.modified.iso8601; + if (record.workingCopy && record.workingCopy.isWorkingCopy) + { + dateI18N = "editing-started"; + } + else if (dateProperty === properties.created.iso8601) + { + dateI18N = "created"; + } + html = '' + label + this.msg("details." + dateI18N + "-by", $relTime(dateProperty), Alfresco.DocumentList.generateUserLink(this, properties.modifier)) + ''; + } + return html; + }); + + /** + * File size + */ + this.registerRenderer("size", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + html = ""; + + if (!jsNode.isContainer && !jsNode.isLink) + { + html += '' + label + Alfresco.util.formatFileSize(jsNode.size) + ''; + } + + return html; + }); + + /** + * Version + */ + this.registerRenderer("name", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + html = ""; + + // Insitu editing for title (filename) + if (jsNode.hasPermission("Write") && !jsNode.isLocked && !jsNode.hasAspect("cm:workingcopy")) + { + this.insituEditors.push( + { + // The "___" looks a bit weird, but it's just to avoid clashes with the another instance of the + // a filename insitu editor that is guaranteed to be on the page this renderer is used in a + // table view (which is quite likely)... Note that the DOM fragment created below also uses it + // they need to match... + context: "___" + record._filenameId, + params: + { + type: "textBox", + nodeRef: jsNode.nodeRef.toString(), + name: "prop_cm_name", + value: record.fileName, + fnSelect: function fnSelect(elInput, value) + { + // If the file has an extension, omit it from the edit selection + var extnPos = value.lastIndexOf(Alfresco.util.getFileExtension(value)) - 1; + if (extnPos > 0) + { + Alfresco.util.selectText(elInput, 0, extnPos); + } + else + { + elInput.select(); + } + }, + validations: [ + { + type: Alfresco.forms.validation.length, + args: { min: 1, max: 255, crop: true }, + when: "keyup", + message: this.msg("validation-hint.length.min.max", 1, 255) + }, + { + type: Alfresco.forms.validation.nodeName, + when: "keyup", + message: this.msg("validation-hint.nodeName") + }], + title: this.msg("tip.insitu-rename"), + errorMessage: this.msg("message.insitu-edit.name.failure") + }, + callback: + { + fn: this._insituCallback, + scope: this, + obj: record + } + }); + } + + // The "___" is explained in a comment further up... don't change it though. + html += '' + Alfresco.DocumentList.generateFileFolderLinkMarkup(this, record); + html += $html(record.displayName) + ''; + return html; + }); + + + /** + * Version + */ + this.registerRenderer("version", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + html = ""; + + if (!jsNode.isContainer && !jsNode.isLink) + { + html += '' + label + record.version + ''; + } + + return html; + }); + + /** + * Description + */ + this.registerRenderer("description", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + id = Alfresco.util.generateDomId(), + html = '' + label + this.msg("details.description.none") + ''; + + // Description non-blank? + if (properties.description && properties.description !== "") + { + html = '' + label + $links($html(properties.description)) + ''; + } + + return html; + }); + + /** + * File mimetype + */ + this.registerRenderer("mimetype", function(record, label) + { + var jsNode = record.jsNode, + html = "", + mimetypeDisplayName = ""; + + if (!jsNode.isContainer && !jsNode.isLink) + { + if(typeof jsNode.mimetypeDisplayName !== "undefined") + { + mimetypeDisplayName = jsNode.mimetypeDisplayName; + } + else + { + mimetypeDisplayName = this.msg("label.mimetype.unknown"); + } + html += '' + label + mimetypeDisplayName + ''; + } + + return html; + }); + + /** + * Tags + */ + this.registerRenderer("tags", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + id = Alfresco.util.generateDomId(), + html = ""; + + var suppressTagsFolder = Alfresco.util.isSuppressed(record.node, supressComponentConfig.tags.browse.folder); + var suppressTagsFile = Alfresco.util.isSuppressed(record.node, supressComponentConfig.tags.browse.file); + if(!suppressTagsFolder && ! suppressTagsFile) + { + var tags = jsNode.tags, tag; + if (jsNode.hasAspect("cm:taggable") && tags.length > 0) + { + for (var i = 0, j = tags.length; i < j; i++) + { + tag = $html(tags[i]); + html += '' + tag + ''; + } + } + else + { + html += '' + label + this.msg("details.tags.none") + ''; + } + + if (jsNode.hasPermission("Write") && !jsNode.isLocked) + { + // Add the tags insitu editor + this.insituEditors.push( + { + context: id, + params: + { + type: "tagEditor", + nodeRef: jsNode.nodeRef.toString(), + name: "prop_cm_taggable", + value: record.node.properties["cm:taggable"], + validations: [ + { + type: Alfresco.forms.validation.nodeName, + when: "keyup", + message: this.msg("validation-hint.nodeName") + }, + { + type: Alfresco.forms.validation.length, + args: { min: 1, max: 255, crop: true, ignoreEmpty: true }, + when: "keyup", + message: this.msg("validation-hint.length.min.max", 1, 255) + }], + title: this.msg("tip.insitu-tag"), + errorMessage: this.msg("message.insitu-edit.tag.failure") + }, + callback: + { + fn: this._insituCallback, + scope: this, + obj: record + } + }); + } + + return '' + label + html + ''; + } + return ""; + }); + + /** + * Categories + */ + this.registerRenderer("categories", function(record, label) + { + var jsNode = record.jsNode, + properties = jsNode.properties, + html = ""; + + if (jsNode.hasAspect("cm:generalclassifiable")) + { + var categories = jsNode.categories, category; + html += ' ' + label; + if (categories.length > 0) + { + for (var i = 0, j = categories.length; i < j; i++) + { + category = categories[i]; + html += '' + $html(category[0]) + '' + (j - i > 1 ? ", " : ""); + } + } + else + { + html += '' + label + this.msg("details.categories.none") + ''; + } + html += ''; + } + + return html; + }); + + /** + * Social + */ + this.registerRenderer("social", function(record) + { + var jsNode = record.jsNode, + html = ""; + var supressSocialFolder = Alfresco.util.isSuppressed(record.node, supressComponentConfig.social.browse.folder); + var supressSocialFile = Alfresco.util.isSuppressed(record.node, supressComponentConfig.social.browse.file); + + if (!supressSocialFolder && !supressSocialFile) + { + /* Favourite / Likes / Comments */ + html += ''; + html += ''; + if (jsNode.permissions.user.CreateChildren) + { + html += ''; + } + if (!record.node.isContainer && Alfresco.constants.QUICKSHARE_URL) + { + html += '' + Alfresco.DocumentList.generateQuickShare(this, record) + ''; + } + } + return html; + }); + }, + + /** + * Configure standard view renderers + * + * @method _setupViewRenderers + */ + _setupViewRenderers: function DL__setupViewRenderers() + { + for (var i=0; i 0) + { + messageEl[0].colSpan=100; + } + + // Update totalRecords on the fly with value from server + this.widgets.dataTable.handleDataReturnPayload = function DL_handleDataReturnPayload(oRequest, oResponse, oPayload) + { + me.totalRecords = oResponse.meta.totalRecords; + me.totalRecordsUpper = oResponse.meta.totalRecordsUpper; + return oResponse.meta; + }; + + // Custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + // Hook tableMsgShowEvent to clear out fixed-pixel width on
    element (breaks resizer) + this.widgets.dataTable.subscribe("tableMsgShowEvent", function(oArgs) + { + // NOTE: Scope needs to be DataTable + this._elMsgTbody.parentNode.style.width = ""; + + // Check to see whether or not the message is the HTML5 drag and drop instructions. This + // will be set if there are no documents or folders in the displayed location. If the HTML5 + // drag and drop instructions are shown then we want to attach events to the "upload" and + // "share" images... + if (oArgs.html && oArgs.html.indexOf("docListInstructions") !== -1) + { + var toolbar = Alfresco.util.ComponentManager.findFirst("Alfresco.DocListToolbar"); + if (toolbar !== null) + { + // This code is reliant upon the template in documentlist.lib.ftl not being changed. + // It allows us to attach events to the image and anchor, but not the remaining text. + var standardUpload = Dom.get(me.id + "-standard-upload-link-template-instance"); + if (standardUpload !== null) + { + var standardUploadChildren = Dom.getChildren(standardUpload); + Event.addListener(standardUploadChildren[0], "click", toolbar.onFileUpload, toolbar, true); + Event.addListener(Dom.getFirstChild(standardUploadChildren[1]), "click", toolbar.onFileUpload, toolbar, true); + } + var newFolder = Dom.get(me.id + "-new-folder-link-template-instance"); + if (newFolder !== null) + { + var newFolderChildren = Dom.getChildren(newFolder); + Event.addListener(newFolderChildren[0], "click", toolbar.onNewFolder, toolbar, true); + Event.addListener(Dom.getFirstChild(newFolderChildren[1]), "click", toolbar.onNewFolder, toolbar, true); + } + } + + // See if the document list contains instructions on showing hidden sub-folders and if + // it does, attach the appropriate events to the relevant nodes... + var showFolders = Dom.get(me.id + "-show-folders-template-instance"); + if (showFolders !== null) + { + var showFoldersFunc = function fnShowFolders() + { + // Find new menu item, see MNT-10195 + var menuItemElement = Dom.getElementsByClassName("showFolders")[0]; + + me.options.showFolders = true; + menuItemElement.innerHTML = this.msg("button.folders.hide"); + Dom.replaceClass(menuItemElement, "showFolders", "hideFolders"); + me.services.preferences.set(PREF_SHOW_FOLDERS, me.options.showFolders); + YAHOO.Bubbling.fire("metadataRefresh"); + }; + var showFoldersChildren = Dom.getChildren(showFolders); + Event.addListener(showFoldersChildren[0], "click", showFoldersFunc, me, true); + Event.addListener(showFoldersChildren[1], "click", showFoldersFunc, me, true); + } + } + }); + + this.widgets.dataTable.sortColumn = function(oColumn, sDir) + { + // Get the current sort information... + var sSortDir = this.getColumnSortDir(oColumn); + var oSortedBy = this.get("sortedBy") || {}; + var bSorted = (oSortedBy.key === oColumn.key) ? true : false; + + var oState = this.getState(); + oState.sortedBy = { + key: oColumn.key, + dir: sSortDir + }; + this.set('sortedBy', oState.sortedBy); + + // Determine the direction in terms that the documentlist widget understands... + var direction = "ascending"; + if (sSortDir != "yui-dt-asc") + { + direction = "descending"; + } + + // Call a function to perform the sort... + me.onSortFieldEvent(oColumn.field, direction); + }; + + // Override abstract function within DataTable to set custom error message + this.widgets.dataTable.doBeforeLoadData = function DL_doBeforeLoadData(sRequest, oResponse, oPayload) + { + if (oResponse.error) + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + me.widgets.dataTable.set("MSG_ERROR", response.message); + } + catch(e) + { + me._setDefaultDataTableErrors(me.widgets.dataTable); + } + } + else if (oResponse.results.length === 0) + { + // We don't get an renderEvent for an empty recordSet, but we'd like one anyway + Dom.setStyle(me.widgets.dataTable._elThead, "display", "none"); + this.fireEvent("renderEvent", + { + type: "renderEvent" + }); + } + else + { + // Add an Alfresco.util.Node instance to each result + for (var i = 0, ii = oResponse.results.length; i < ii; i++) + { + oResponse.results[i].jsNode = new Alfresco.util.Node(oResponse.results[i].node); + } + } + + // Must return true to have the "Loading..." message replaced by the error message + return true; + }; + + // File checked handler + this.widgets.dataTable.subscribe("checkboxClickEvent", function DL_checkboxClickEvent(e) + { + var id = e.target.value; + this.selectedFiles[id] = e.target.checked; + YAHOO.Bubbling.fire("selectedFilesChanged"); + }, this, true); + + // Rendering complete event handler + this.widgets.dataTable.subscribe("renderEvent", function DL_renderEvent() + { + Alfresco.logger.debug("DataTable renderEvent"); + + // If we're in a smart folder and there's no records shown, ensure create folder link isn't visible. + var toolbar = Alfresco.util.ComponentManager.findFirst("Alfresco.DocListToolbar") + if (toolbar && toolbar.isVirtualFolder()) + { + Dom.addClass(this.id + "-new-folder-link-template-instance", "hidden"); + } + + // IE6 fix for long filename rendering issue + if (0 < YAHOO.env.ua.ie && YAHOO.env.ua.ie < 7) + { + var ie6fix = this.widgets.dataTable.getTableEl().parentNode; + //noinspection SillyAssignmentJS + ie6fix.className = ie6fix.className; + } + + // Update the paginator if it's been created + if (this.widgets.paginator) + { + Alfresco.logger.debug("Setting paginator state: page=" + this.currentPage + ", totalRecords=" + this.totalRecords); + + this.widgets.paginator.setState( + { + page: this.currentPage, + totalRecords: this.totalRecords + }); + + if (this.totalRecordsUpper) + { + this.widgets.paginator.set("pageReportTemplate", this.msg("pagination.template.page-report.more")); + } + else + { + this.widgets.paginator.set("pageReportTemplate", this.msg("pagination.template.page-report")); + } + + this.widgets.paginator.render(); + } + + // Need to highlight a file now the data is available? + if (this.options.highlightFile) + { + YAHOO.Bubbling.fire("highlightFile", + { + fileName: window.unescape(this.options.highlightFile) + }); + } + else if (this.listUpdated) + { + // Scroll up (only) to the top of the documents + var yPos = Dom.getY(this.id + "-documents"), + yScroll = YAHOO.env.ua.ie > 0 ? ((document.compatMode && document.compatMode !== "BackCompat") ? document.documentElement : document.body).scrollTop : window.scrollY; + + if (yScroll > yPos) + { + window.scrollTo(0, yPos); + } + } + + // Deferred functions specified? + var i, j; + for (i = 0, j = this.afterDocListUpdate.length; i < j; i++) + { + this.afterDocListUpdate[i].call(this); + } + this.afterDocListUpdate = []; + + // Register preview tooltips + if (typeof this.widgets.previewTooltip !== "undefined") + { + this.widgets.previewTooltip.cfg.setProperty("context", this.previewTooltips); + } + + // Register insitu editors + var iEd; + for (i = 0, j = this.insituEditors.length; i < j; i++) + { + iEd = this.insituEditors[i]; + Alfresco.util.createInsituEditor(iEd.context, iEd.params, iEd.callback); + } + + this.widgets.dataTable.set("renderLoopSize", this.options.usePagination ? 16 : Alfresco.util.RENDERLOOPSIZE); + }, this, true); + + // Enable row highlighting + this.widgets.dataTable.subscribe("rowMouseoverEvent", this.onEventHighlightRow, this, true); + this.widgets.dataTable.subscribe("rowMouseoutEvent", this.onEventUnhighlightRow, this, true); + + // Enable actions on indicators + Event.delegate(this.id, "click", function DL__setupDataTable_onIndicatorAction(event, target) + { + var action = target.getAttribute("data-action"), + rec = me.widgets.dataTable.getRecord(target), + record; + + // MNT-10630 Sync Info Link is not working on Gallery View of document library page. + if (rec == null) + { + var id = me.currentActionsMenu.id; + var records = me.widgets.dataTable.getRecordSet( )._records; + for (i = 0; i < records.length; i++) + { + if (id.indexOf(records[i]._sId) > 0) + { + rec = me.widgets.dataTable.getRecord(records[i]._sId); + target = rec._sId; + } + } + } + + if (rec != null) + { + record = rec.getData(); + } + + // Look for method in Alfresco.DocumentList or Global scopes & call it with the record as the only param + if (YAHOO.lang.isFunction(me[action])) + { + me[action].call(me, record, target); + } else if (YAHOO.lang.isFunction(window[action])) + { + window[action](record, target); + } + }, "a.indicator-action"); + + // Feature detection for drag and drop support (by not attempting to attach the drag events + // to anything we can prevent attempted uploads happening - this is particularly important + // with IE8 which would otherwise render the highlights, but not process the upload). + if (this.dragAndDropEnabled) + { + // Disable drop for the document body (we're then going to do a specific override on the DocumentList nodes) + Event.addListener(document.body, "dragenter", this._swallowDragEnter, this, true); + Event.addListener(document.body, "dragover", this._swallowDragOver, this, true); + Event.addListener(document.body, "drop", this._swallowDragDrop, this, true); + Event.addListener(document.body, "dragstart", this._swallowDragStart, this, true); + } + }, + + /** + * Removes HTML5 drag and drop listeners from the document list. + * + * @method _removeDragAndDrop + */ + _removeDragAndDrop: function DL__removeDragAndDrop() + { + if (this.dragAndDropEnabled) + { + // Make the entire DocumentList available for dropping files for uploading onto. + try + { + // Add listeners to the HTML5 drag and drop events fired from the entire doc list + var doclist = Dom.get(this.id + "-dl-body"); + Event.removeListener(doclist, "dragenter"); + Event.removeListener(doclist, "dragover"); + Event.removeListener(doclist, "dragleave"); + Event.removeListener(doclist, "drop"); + } + catch(exception) + { + Alfresco.logger.error("_removeDragAndDrop: The following exception occurred: ", exception); + } + } + }, + + /** + * Adds HTML5 drag and drop listeners to the document list. + * + * @method _addDragAndDrop + */ + _addDragAndDrop: function DL__addDragAndDrop() + { + if (this._userCanUpload && this.dragAndDropEnabled) + { + // Make the entire DocumentList available for dropping files for uploading onto. + try + { + // Add listeners to the HTML5 drag and drop events fired from the entire doc list + var doclist = Dom.get(this.id + "-dl-body"); + Event.addListener(doclist, "dragenter", this.onDocumentListDragEnter, this, true); + Event.addListener(doclist, "dragover", this.onDocumentListDragOver, this, true); + Event.addListener(doclist, "dragleave", this.onDocumentListDragLeave, this, true); + Event.addListener(doclist, "drop", this.onDocumentListDrop, this, true); + } + catch(exception) + { + Alfresco.logger.error("_addDragAndDrop: The following exception occurred: ", exception); + } + } + }, + + /** + * Fired when an object starts getting dragged. The event is swallowed because we only want to + * allow drag and drop events that begin outside the browser window (e.g. for files). This prevents + * users attempting to drag and drop the document and folder images as if they could re-arrange + * the document lib structure. + * + * @param e {object} HTML5 drag and drop event + * @method _swallowDragStart + */ + _swallowDragStart: function DL__swallowDragStart(e) + { + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dragged onto any node in the document body (unless the node has + * been explicitly overridden to invoke another function). Swallows the event. + * + * @param e {object} HTML5 drag and drop event + * @method _swallowDragEnter + */ + _swallowDragEnter: function DL__swallowDragEnter(e) + { + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dragged over any node in the document body (unless the node has + * been explicitly overridden to invoke another function). Updates the drag behaviour to + * indicate that drops are not allowed and then swallows the event. + * + * @param e {object} HTML5 drag and drop event + * @method _swallowDragOver + */ + _swallowDragOver: function DL__swallowDragOver(e) + { + e.dataTransfer.dropEffect = "none"; + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dropped onto any node in the document body (unless the node has + * been explicitly overridden to invoke another function). Swallows the event to prevent + * default browser behaviour (i.e. attempting to open the file). + * + * @param e {object} HTML5 drag and drop event + * @method _swallowDrop + */ + _swallowDrop: function DL__swallowDrop(e) + { + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dragged into the DocumentList DOM element and then again when dragged into a Folder + * icon image DOM element. + * + * @param e {object} HTML5 drag and drop event + * @method onDocumentListDragEnter + */ + onDocumentListDragEnter: function DL_onDocumentListDragEnter(e) + { + // Providing that the drop target a (or a child node of a ) in the DocumentList data table then a record + // will be returned from this call. If nothing is returned then we cannot proceed with the file upload operation. + var el = e.target, + oRecord = this.widgets.dataTable.getRecord(el), + column = this.widgets.dataTable.getColumn(el), + containerEl = this.widgets.dataTable.getContainerEl(), + node; + + if (oRecord && column && (el.tagName == "IMG" || el.className == "droppable") && column.getKey() == "thumbnail") + { + node = oRecord.getData("jsNode"); + if (node && node.isContainer) + { + this.dragFolderHighlight = Dom.getAncestorByClassName(el, "folder"); + Dom.addClass(this.dragFolderHighlight, "dndFolderHighlight"); + Dom.removeClass(containerEl, "dndDocListHighlight"); + } + } + else + { + // Firefox is a bit buggy with it's enter/leave event matching + this.dragEventRefCount = Math.min(++this.dragEventRefCount, 2); + Dom.addClass(containerEl, "dndDocListHighlight"); + if (this.dragFolderHighlight) + { + Dom.removeClass(this.dragFolderHighlight, "dndFolderHighlight"); + this.dragFolderHighlight = null; + } + } + + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dragged into the DocumentList DOM element and then again when dragged into a Folder + * icon image DOM element. + * + * @param e {object} HTML5 drag and drop event + * @method onDocumentListDragOver + */ + onDocumentListDragOver: function DL_onDocumentListDragOver(e) + { + // Firefox 3.6 set effectAllowed = "move" for files, however the "copy" effect is more accurate for uploads + e.dataTransfer.dropEffect = Math.floor(YAHOO.env.ua.gecko) === 1 ? "move" : "copy"; + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dragged out of the DocumentList DOM element or the Folder icon image DOM element. + * + * @param e {object} HTML5 drag and drop event + * @method onDocumentListDragLeave + */ + onDocumentListDragLeave: function DL_onDocumentListDragLeave(e) + { + // Providing that the drop target a (or a child node of a ) in the DocumentList data table then a record + // will be returned from this call. If nothing is returned then we cannot proceed with the file upload operation. + var el = e.target, + oRecord = this.widgets.dataTable.getRecord(el), + oColumn = this.widgets.dataTable.getColumn(el), + record = oRecord ? oRecord.getData() : null; + + if (oRecord && oColumn && (el.tagName == "IMG" || el.className == "droppable") && record.node.isContainer && oColumn.getKey() == "thumbnail") + { + // Ignore the folder dragLeave event + } + else + { + if (--this.dragEventRefCount === 0) + { + Dom.removeClass(this.widgets.dataTable.getContainerEl(), "dndDocListHighlight"); + } + } + + e.stopPropagation(); + e.preventDefault(); + }, + + /** + * Fired when an object is dropped onto the DocumentList DOM element. + * Checks that files are present for upload, determines the target (either the current document list or + * a specific folder rendered in the document list and then calls on the DNDUpload singleton component + * to perform the upload. + * + * @param e {object} HTML5 drag and drop event + * @method onDocumentListDrop + */ + onDocumentListDrop: function DL_onDocumentListDrop(e) + { + try + { + // Only perform a file upload if the user has *actually* dropped some files! + if (e.dataTransfer.files !== undefined && e.dataTransfer.files !== null && e.dataTransfer.files.length > 0) + { + // We need to get the upload progress dialog widget so that we can display it. + // The function called has been added to file-upload.js and ensures the dialog is a singleton. + var progressDialog = Alfresco.getDNDUploadProgressInstance(); + + var continueWithUpload = true; + + // Perform some checks on based on the browser and selected files to ensure that we will + // support the upload request. + if (progressDialog.uploadMethod === progressDialog.INMEMORY_UPLOAD) + { + // Add up the total size of all selected files to see if they exceed the maximum allowed. + // If the user has requested to upload too large a file or too many files in one operation + // then generate an error dialog and abort the upload... + var totalRequestedUploadSize = 0; + + j = e.dataTransfer.files.length; + for (i = 0; i < j; i++) + { + totalRequestedUploadSize += e.dataTransfer.files[i].size; + } + if (totalRequestedUploadSize > progressDialog.getInMemoryLimit()) + { + continueWithUpload = false; + Alfresco.util.PopupManager.displayPrompt( + { + text: progressDialog.msg("inmemory.uploadsize.exceeded", Alfresco.util.formatFileSize(progressDialog.getInMemoryLimit())) + }); + } + } + + // If all tests are passed... + if (continueWithUpload) + { + // Initialise the target directory as the current path represented by the current rendering of the DocumentList. + // If we determine that the user has actually dropped some files onto the a folder icon (which we're about to check + // for) then we'll change this value to be that of the folder targeted... + var directory = this.currentPath, + directoryName = directory.substring(directory.lastIndexOf("/") + 1), + parentNodeRef = this.doclistMetadata.parent ? this.doclistMetadata.parent.nodeRef : null, + destination = parentNodeRef; + + // Providing that the drop target a (or a child node of a ) in the DocumentList data table then a record + // will be returned from this call. If nothing is returned then we cannot proceed with the file upload operation. + var oRecord = this.widgets.dataTable.getRecord(e.target); + if (oRecord !== null) + { + // Dropped onto a folder icon? + var oColumn = this.widgets.dataTable.getColumn(e.target), + record = oRecord.getData(); + + if ((e.target.tagName == "IMG" || e.target.className == "droppable") && record.jsNode.isContainer) + { + var location = record.location; + directoryName = location.file; + // Site mode + directory = $combine(location.path, location.file); + // Repository mode + destination = record.nodeRef; + } + // else: The file(s) were not not dropped onto a folder icon, so we will just upload to the current path + } + // else: If a record is not returned, then it means that we dropped into an empty folder. + + // Remove all the highlighting + Dom.removeClass(this.widgets.dataTable.getTrEl(e.target), "dndFolderHighlight"); + Dom.removeClass(this.widgets.dataTable.getContainerEl(), "dndDocListHighlight"); + + var emptyDirs = []; + var multiUploadConfig = + { + uploadDirectoryName: directoryName, + parentNodeRef: parentNodeRef, + filter: [], + mode: progressDialog.MODE_MULTI_UPLOAD, + thumbnails: "doclib", + onFileUploadComplete: + { + fn: function DD_onFileUploadComplete(complete) + { + // create empty folder as required + if (emptyDirs.length !== 0) + { + var dataObj = { + destination: destination, + paths: emptyDirs + }; + Alfresco.util.Ajax.jsonRequest({ + method: "POST", + url: Alfresco.constants.PROXY_URI + "slingshot/doclib2/mkdir", + dataObj: dataObj + }); + } + + // call existing handler (defined in actions.js) + this.onFileUploadComplete(complete); + }, + scope: this + } + }; + + // Extra parameters depending on current mode + if ($isValueSet(this.options.siteId)) + { + multiUploadConfig.siteId = this.options.siteId; + multiUploadConfig.containerId = this.options.containerId; + multiUploadConfig.uploadDirectory = directory; + } + else + { + multiUploadConfig.destination = destination; + } + + var dndMaxFileLimit = this.options.dndMaxFileLimit; + var fnWalkFileSystem = function DL__walkFileSystem(directory, callback, error) { + + callback.limit = dndMaxFileLimit; + callback.pending = callback.pending || 0; + callback.files = callback.files || []; + callback.dirmap = callback.dirmap || {}; + + // get a dir reader and cleanup file path + var reader = directory.createReader(), + relativePath = directory.fullPath.replace(/^\//, ""); + + var repeatReader = function DL__walkFileSystem_repeatReader() { + + // about to start an async callback function + callback.pending++; + + reader.name = directory.name; + reader.readEntries(function DL__walkFileSystem_readEntries(entries) { + + // processing an async callback function + callback.pending--; + + entries.forEach(function(entry) { + if (entry.isFile) + { + // about to start an async callback function + callback.pending++; + + entry.file(function(File) { + switch (File.name.toLowerCase()) + { + // ignore file droppings from various OSes + case "thumbs.db": + case "desktop.ini": + case ".ds_store": + break; + + default: + { + if (callback.dirmap[directory.fullPath]) + { + callback.dirmap[directory.fullPath].push(entry.name); + } + + // add the relativePath property to each file - this can be used to rebuild the contents of + // a nested tree folder structure if an appropriate API is available to do so + File.relativePath = relativePath; + callback.files.push(File); + if (callback.limit && callback.files.length > callback.limit) + { + throw new Error("Maximum dnd file limit reached: " + callback.limit); + } + } + } + + // processing an async callback function + if (--callback.pending === 0) + { + // fall out here if last item processed is a file entry + callback(callback.files, callback.dirmap); + } + }, error); + } + else + { + callback.dirmap[entry.fullPath] = []; + fnWalkFileSystem(entry, callback, error); + } + }); + + // the reader API is a little esoteric,from the MDN docs: + // "Continue calling readEntries() until an empty array is returned. + // You have to do this because the API might not return all entries in a single call." + if (entries.length !== 0) + { + repeatReader(); + } + + // fall out here if last item processed is a dir entry e.g. empty dir + if (callback.pending === 0) + { + callback(callback.files, callback.dirmap); + } + }, error); + }; + repeatReader(); + }; + + // Function to show uploader for multiple files + var fnAddSelectedFiles = function DL_fnAddSelectedFiles(files) { + multiUploadConfig.files = files; + progressDialog.show(multiUploadConfig); + }; + + var items = e.dataTransfer.items || [], firstEntry; + if (items[0] && items[0].webkitGetAsEntry && (firstEntry = items[0].webkitGetAsEntry())) + { + // detected uploading of folders structure (only supported by Chrome >= 21) + // NOTE: FireFox partially implemented this API in FireFox 50 - see + // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry/filesystem + // https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API/Firefox_support + // but it is not complete, filesystem.root does not work correctly - so need to iterate each item + var list = []; + if (YAHOO.env.ua.gecko) + { + Object.keys(items).forEach(function(key) { + list.push(items[key].webkitGetAsEntry().filesystem.root); + }, this); + } + else + { + list.push(firstEntry.filesystem.root); + } + list.forEach(function(item) { + fnWalkFileSystem(item, function(fs, dirs) { + // collect empty dirs + Object.keys(dirs).forEach(function(key) { + if (dirs[key].length === 0) { + emptyDirs.push(key); + } + }); + + // collapse folder list by removing folders with empty parents - we want empty leaf nodes only + for (var d, n=0; n", this.options.initialFilter); + YAHOO.Bubbling.fire("changeFilter", YAHOO.lang.merge( + { + doclistFirstTimeNav: true + }, this.options.initialFilter)); + + // Finally show the component body here to prevent UI artifacts on YUI button decoration + Dom.setStyle(this.id + "-dl-body", "visibility", "visible"); + }, + + /** + * Public functions + * + * Functions designed to be called form external sources + */ + + /** + * Public function to get array of selected files + * + * @method getSelectedFiles + * @return {Array} Currently selected files + */ + getSelectedFiles: function DL_getSelectedFiles() + { + var files = [], + oRecordSet = this.widgets.dataTable.getRecordSet(), + oRecord, node, i, j; + + for (i = 0, j = oRecordSet.getLength(); i < j; i++) + { + oRecord = oRecordSet.getRecord(i); + node = oRecord.getData("node"); + if (this.selectedFiles[node.nodeRef]) + { + files.push(oRecord.getData()); + } + } + + return files; + }, + + /** + * Public function to select files by specified groups + * + * @method selectFiles + * @param p_selectType {string} Can be one of the following: + *
    +       * selectAll - all documents and folders
    +       * selectNone - deselect all
    +       * selectInvert - invert selection
    +       * selectDocuments - select all documents
    +       * selectFolders - select all folders
    +       * 
    + */ + selectFiles: function DL_selectFiles(p_selectType) + { + var containerElement; + if (typeof this.viewRenderers[this.options.viewRendererName] === "object") + { + containerElement = Dom.get(this.id + this.viewRenderers[this.options.viewRendererName].parentElementIdSuffix); + } + var oRecordSet = this.widgets.dataTable.getRecordSet(), + checks = YAHOO.util.Selector.query('input[type="checkbox"]', containerElement), + len = checks.length, + oRecord, record, i, fnCheck; + + switch (p_selectType) + { + case "selectAll": + fnCheck = function chkSelectAll(record, isChecked) + { + return true; + }; + break; + + case "selectNone": + fnCheck = function chkSelectNone(record, isChecked) + { + return false; + }; + break; + + case "selectInvert": + fnCheck = function chkSelectInvert(record, isChecked) + { + return !isChecked; + }; + break; + + case "selectDocuments": + fnCheck = function chkSelectDocuments(record, isChecked) + { + return !(record.node.isContainer); + }; + break; + + case "selectFolders": + fnCheck = function chkSelectDocuments(record, isChecked) + { + return record.node.isContainer; + }; + break; + + default: + fnCheck = function chkDefault(record, isChecked) + { + return isChecked; + }; + } + + for (i = 0; i < len; i++) + { + oRecord = oRecordSet.getRecord(i); + record = oRecord.getData(); + this.selectedFiles[record.nodeRef] = checks[i].checked = fnCheck(record, checks[i].checked); + } + + YAHOO.Bubbling.fire("selectedFilesChanged"); + }, + + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * Sort direction button click handler + * + * @method onSortAscending + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onSortAscending: function DL_onSortAscending(e, p_obj) + { + // Clear sort information when the sort button is clicked (this shouldn't + // be called when the table view sorts via column header click)... + this.widgets.dataTable.set("sortedBy", null); + + this.options.sortAscending = !this.options.sortAscending; + this.widgets.sortAscending.set("title", this.msg(this.options.sortAscending ? "button.sort.descending" : "button.sort.ascending")); + if (this.options.sortAscending) + { + Dom.removeClass(this.widgets.sortAscending.get("element"), "sort-descending"); + } + else + { + Dom.addClass(this.widgets.sortAscending.get("element"), "sort-descending"); + } + this.services.preferences.set(PREF_SORT_ASCENDING, this.options.sortAscending); + YAHOO.Bubbling.fire("metadataRefresh"); + if (e) + { + Event.preventDefault(e); + } + }, + + /** + * Sort direction event handler + * + * @method onSortEvent + * @param direction {string} The direction to sort (if not "descending" will be "ascending") + */ + onSortEvent: function DL_onSortEvent(direction) + { + this.options.sortAscending = (direction != "descending"); + this.services.preferences.set(PREF_SORT_ASCENDING, this.options.sortAscending); + YAHOO.Bubbling.fire("metadataRefresh"); + }, + + /** + * Sort Field select button click handler + * + * @method onSortField + * @param sType {string} Event type, e.g. "click" + * @param aArgs {array} Arguments array, [0] = DomEvent, [1] = EventTarget + * @param p_obj {object} Object passed back from subscribe method + */ + onSortField: function DL_onSortField(sType, aArgs, p_obj) + { + // Clear sort information when the sort button is clicked (this shouldn't + // be called when the table view sorts via column header click)... + this.widgets.dataTable.set("sortedBy", null); + + var domEvent = aArgs[0], + eventTarget = aArgs[1]; + + if (eventTarget) + { + var me = this; + this.options.sortField = eventTarget.value; + this.widgets.sortField.set("label", eventTarget.cfg.getProperty("text") + " " + Alfresco.constants.MENU_ARROW_SYMBOL); + this.services.preferences.set(PREF_SORT_FIELD, this.options.sortField, { + successCallback: + { + fn: function() + { + // Default sort order configured? + var title = eventTarget.srcElement.getAttribute("title"); + if (title === "true" || title === "false") + { + me.options.sortAscending = (title === "false"); + // onSortAscending will fire the metadatRefresh event + me.onSortAscending(); + } + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + } + } + }); + } + Event.preventDefault(domEvent); + }, + + /** + * Sort Field select event handler + * + * @method onSortFieldEvent + * @param field {string} The field + * @param direction {string} The direction to sort the field in + */ + onSortFieldEvent: function DL_onSortFieldEvent(field, direction) { + this.options.sortField = field; + var me = this; + this.services.preferences.set(PREF_SORT_FIELD, field, { + successCallback: + { + fn: function() + { + // Default sort order configured? + if (direction) + { + me.options.sortAscending = (direction === "ascending"); + // onSortAscending will fire the metadatRefresh event + me.onSortEvent(direction); + } + else + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + } + } + }); + }, + + /** + * Show/Hide folders button checked handler + * + * @method onShowFolders + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onShowFolders: function DL_onShowFolders(e, p_obj) + { + this.options.showFolders = this.widgets.showFolders.get("checked"); + this.widgets.showFolders.set("title", this.msg(this.options.showFolders ? "button.folders.hide" : "button.folders.show")); + this.services.preferences.set(PREF_SHOW_FOLDERS, this.options.showFolders); + YAHOO.Bubbling.fire("metadataRefresh"); + if (e) + { + Event.preventDefault(e); + } + }, + + /** + * Show/Hide folders event handler (added to support wrapped widget) + * + * @method onShowFoldersEvent + * @param showFolders {boolean} Whether or not to show folders + */ + onShowFoldersEvent: function DL_onShowFoldersEvent(showFolders) + { + this.options.showFolders = showFolders + this.services.preferences.set(PREF_SHOW_FOLDERS, this.options.showFolders); + YAHOO.Bubbling.fire("metadataRefresh"); + }, + + /** + * Select viewRenderer list buttongroup click handler + * + * @method onViewRendererSelect + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onViewRendererSelect: function DL_onViewRendererSelect(e, p_obj) + { + // Clear previous sort data... + this.widgets.dataTable.set("sortedBy", null); + + // Get the name of the viewRenderer from the order array as YUI button likes to work with an index + this.options.viewRendererName = this.options.viewRendererNames[e.newValue.index]; + this.userPreferredView = this.options.viewRendererName; + this.services.preferences.set(PREF_VIEW_RENDERER, this.options.viewRendererName); + YAHOO.Bubbling.fire("metadataRefresh"); + if (e) + { + Event.preventDefault(e); + } + }, + + /** + * Select viewRenderer event handler + * + * @method onViewRendererSelectEvent + * @param view {string} The name of the view to render + */ + onViewRendererSelectEvent: function DL_onViewRendererSelectEvent(view) + { + // Get the name of the viewRenderer from the order array as YUI button likes to work with an index + var foundView = false; + for (var i=0; i 6) + { + // MSIE7 blocks the download and gets the wrong URL in the "manual download bar" + Alfresco.util.PopupManager.displayPrompt( + { + title: this.msg("message.edit-offline.success", displayName), + text: this.msg("message.edit-offline.success.ie7"), + buttons: [ + { + text: this.msg("button.download"), + handler: function DL_oAEO_success_download() + { + window.open(downloadUrl, "_blank"); + this.destroy(); + }, + isDefault: true + }, + { + text: this.msg("button.close"), + handler: function DL_oAEO_success_close() + { + this.destroy(); + } + }] + }); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.edit-offline.success", displayName) + }); + // Kick off the download 3 seconds after the confirmation message + YAHOO.lang.later(3000, this, function() + { + if (!isEditingCanceled) + { + window.location = downloadUrl; + } + }); + } + }; + this.afterDocListUpdate.push(fnAfterUpdate); + }, + scope: this + } + }, + failure: + { + callback: + { + fn: function DL_oAEO_failure() + { + this.state.actionEditOfflineActive = false; + }, + scope: this + }, + message: this.msg("message.edit-offline.failure", displayName) + }, + webscript: + { + method: Alfresco.util.Ajax.POST, + name: "checkout/node/{nodeRef}", + params: + { + nodeRef: nodeRef.uri + } + } + }); + } + }, + + /** + * BUBBLING LIBRARY EVENT HANDLERS FOR PAGE EVENTS + * Disconnected event handlers for inter-component event notification + */ + + /** + * MNT-10180: if current page of DocList to update + * is empty then go to the first page of the DocList + */ + _checkIfUpdatedPageIsEmpty: function DL__checkIfUpdatedPageIsEmpty() + { + var pageOffset = (this.currentPage - 1) * this.options.pageSize; + if (pageOffset >= this.totalRecords) + { + this.widgets.paginator.setPage(1); + this.currentPage = 1; + } + }, + + /** + * MNT-13640: remove selection from file after move/copy action + */ + _unselectFile: function DL__unselectFile(obj) + { + var objAction = obj.action; + if (objAction && (objAction == "fileCopied" || objAction == "fileMoved" || objAction == "folderCopied" || objAction == "folderMoved" || objAction == "fileLinkCreated")) + { + if (this.selectedFiles[obj.nodeRef]) + { + this.selectedFiles[obj.nodeRef] = false; + } + } + }, + + /** + * Generic file action event handler + * + * @method onFileAction + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onFileAction: function DL_onFileAction(layer, args) + { + var obj = args[1]; + if (obj) + { + this._unselectFile(obj); + if (!obj.multiple) + { + this._checkIfUpdatedPageIsEmpty(); + this._updateDocList.call(this); + } + } + }, + + /** + * File or folder renamed event handler + * + * @method onFileRenamed + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onFileRenamed: function DL_onFileRenamed(layer, args) + { + if (typeof this.viewRenderers[this.options.viewRendererName] === "object") + { + this.viewRenderers[this.options.viewRendererName].onFileRenamed(this, layer, args); + } + }, + + /** + * MNT-15900: Share: Items remain selected at source destination after Copy action + */ + _unselectCopiedFiles: function DL__unselectCopiedFiles(obj) + { + if ((obj.action == "filesCopied" || obj.action == "filesLinkCreated" )&& obj.sourceFilesObj && obj.sourceFilesObj.nodeRefs) + { + var copiedFiles = obj.sourceFilesObj.nodeRefs; + for (var i = 0, j = copiedFiles.length ; i < j; i++) + { + if (this.selectedFiles[copiedFiles[i]]) + { + this.selectedFiles[copiedFiles[i]] = false; + } + } + } + }, + + /** + * DocList Refresh Required event handler + * + * @method onDocListRefresh + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (unused) + */ + onDocListRefresh: function DL_onDocListRefresh(layer, args) + { + var obj = args[1]; + this._unselectCopiedFiles(obj); + if (obj && (obj.highlightFile !== null)) + { + this.options.highlightFile = obj.highlightFile; + } + this._checkIfUpdatedPageIsEmpty(); + this._updateDocList.call(this); + }, + + /** + * DocList View change filter request event handler + * + * @method onChangeFilter + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (new filterId) + */ + onChangeFilter: function DL_onChangeFilter(layer, args) + { + var obj = args[1]; + + if ((obj !== null) && (obj.filterId !== null)) + { + // Should be a filter in the arguments + var filter = Alfresco.util.cleanBubblingObject(obj), + strFilter = window.escape($html(obj.filterId)) + + (typeof obj.filterData !== "undefined" ? + "|" + window.escape(obj.filterData) + (typeof obj.filterDisplay !== "undefined" ? "|" + window.escape(obj.filterDisplay) : "") : + ""); + + Alfresco.logger.debug("DL_onChangeFilter: ", filter); + // Only allow drag and drop behaviour if the filter is changed to an actual + // path (if the filter is anything else such as tags then there won't be a specific + // location to upload to!)... + this._removeDragAndDrop(); + if (obj.filterId === "path" || obj.filterId === "favourites") + { + this._addDragAndDrop(); + } + + // Flag to indicate the list will likely change + this.listUpdated = true; + + var objNav = + { + filter: $html(strFilter) + }; + + // Initial navigation won't fire the History event. + // multiNavigate won't do anything if the filter is the same, so trigger an update instead, see ACE-2000. + if (obj.doclistFirstTimeNav || strFilter === YAHOO.util.History.getCurrentState("filter") ) + { + this._updateDocList.call(this, + { + filter: filter, + page: this.currentPage + }); + } + else + { + if (this.options.usePagination) + { + this.currentPage = 1; + objNav.page = "1"; + } + + Alfresco.logger.debug("DL_onChangeFilter: objNav = ", objNav); + + // Do we think the history state will change? + if (this.options.highlightFile && objNav.filter === YAHOO.util.History.getCurrentState("filter")) + { + YAHOO.Bubbling.fire("highlightFile", + { + fileName: this.options.highlightFile + }); + } + + YAHOO.util.History.multiNavigate(objNav); + } + } + }, + + /** + * DocList View Filter changed event handler + * + * @method onFilterChanged + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (new filterId) + */ + onFilterChanged: function DL_onFilterChanged(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.filterId !== null)) + { + obj.filterOwner = obj.filterOwner || Alfresco.util.FilterManager.getOwner(obj.filterId); + + // Should be a filterId in the arguments + this.currentFilter = Alfresco.util.cleanBubblingObject(obj); + Alfresco.logger.debug("DL_onFilterChanged: ", this.currentFilter); + } + }, + + /** + * Highlight file event handler + * Used when a component (including the DocList itself on loading) wants to scroll to and highlight a file + * + * @method onHighlightFile + * @param layer {object} Event fired (unused) + * @param args {array} Event parameters (filename to be highlighted) + */ + onHighlightFile: function DL_onHighlightFile(layer, args) + { + if (typeof this.viewRenderers[this.options.viewRendererName] === "object") + { + this.viewRenderers[this.options.viewRendererName].onHighlightFile(this, layer, args); + } + }, + + /** + * Deactivate All Controls event handler + * + * @method onDeactivateAllControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateAllControls: function DL_onDeactivateAllControls(layer, args) + { + var index, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.widgets) + { + if (this.widgets.hasOwnProperty(index)) + { + fnDisable(this.widgets[index]); + } + } + }, + + /** + * Deactivate Dynamic Controls event handler + * Only deactivates specifically defined controls. + * + * @method onDeactivateDynamicControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateDynamicControls: function DL_onDeactivateDynamicControls(layer, args) + { + var index, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.dynamicControls) + { + if (this.dynamicControls.hasOwnProperty(index)) + { + fnDisable(this.dynamicControls[index]); + } + } + }, + + /** + * Deactivate Sort Controls event handler + * Only deactivates specifically defined controls. + * + * @method onDeactivateSortControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateSortControls: function DL_onDeactivateSortControls(layer, args) + { + var index, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.sortControls) + { + if (this.sortControls.hasOwnProperty(index)) + { + fnDisable(this.sortControls[index]); + } + } + }, + + /** + * Activate Sort Controls event handler + * (Re-)Activates controls taking part in dynamic deactivation + * + * @method onActivateSortControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onActivateSortControls: function DL_onActivateSortControls(layer, args) + { + var index, fnEnable = Alfresco.util.enableYUIButton; + for (index in this.sortControls) + { + if (this.sortControls.hasOwnProperty(index)) + { + fnEnable(this.sortControls[index]); + } + } + }, + + /** + * Activate Dynamic Controls event handler + * (Re-)Activates controls taking part in dynamic deactivation + * + * @method onActivateDynamicControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onActivateDynamicControls: function DL_onActivateDynamicControls(layer, args) + { + var index, fnEnable = Alfresco.util.enableYUIButton; + for (index in this.dynamicControls) + { + if (this.dynamicControls.hasOwnProperty(index)) + { + fnEnable(this.dynamicControls[index]); + } + } + }, + + /** + * Like/Unlike event handler + * + * @method onLikes + * @param row {HTMLElement} DOM reference to a TR element (or child thereof) + */ + onLikes: function DL_onLikes(row) + { + var elIdentifier = row; + if (typeof this.viewRenderers[this.options.viewRendererName] === "object") + { + elIdentifier = this.viewRenderers[this.options.viewRendererName].getDataTableRecordIdFromRowElement(this, row); + } + var oRecord = this.widgets.dataTable.getRecord(elIdentifier), + record = oRecord.getData(), + nodeRef = record.jsNode.nodeRef, + likes = record.likes; + + likes.isLiked = !likes.isLiked; + likes.totalLikes += (likes.isLiked ? 1 : -1); + + var responseConfig = + { + successCallback: + { + fn: function DL_onLikes_success(event, p_nodeRef) + { + var data = event.json.data; + if (data) + { + // Update the record with the server's value + var oRecord = this._findRecordByParameter(p_nodeRef, "nodeRef"), + record = oRecord.getData(), + node = record.node, + likes = record.likes; + + likes.totalLikes = data.ratingsCount; + this.widgets.dataTable.updateRow(oRecord, record); + + // Post to the Activities Service on the "Like" action + if (likes.isLiked) + { + var activityData = + { + fileName: record.fileName, + nodeRef: node.nodeRef + }; + if (node.isContainer) + { + this.modules.actions.postActivity(this.options.siteId, "folder-liked", "folder-details", activityData); + } + else + { + this.modules.actions.postActivity(this.options.siteId, "file-liked", "document-details", activityData); + } + } + } + }, + scope: this, + obj: nodeRef.toString() + }, + failureCallback: + { + fn: function DL_onLikes_failure(event, p_nodeRef) + { + // Reset the flag to it's previous state + var oRecord = this._findRecordByParameter(p_nodeRef, "nodeRef"), + record = oRecord.getData(), + likes = record.likes; + + likes.isLiked = !likes.isLiked; + likes.totalLikes += (likes.isLiked ? 1 : -1); + this.widgets.dataTable.updateRow(oRecord, record); + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.save.failure", record.displayName) + }); + }, + scope: this, + obj: nodeRef.toString() + } + }; + + if (likes.isLiked) + { + this.services.likes.set(nodeRef, 1, responseConfig); + } + else + { + this.services.likes.remove(nodeRef, responseConfig); + } + this.widgets.dataTable.updateRow(oRecord, record); + }, + + /** + * Handler to set/reset favourite for document or folder + * + * @method onFavourite + * @private + * @param row {HTMLElement} DOM reference to a TR element (or child thereof) + * @param prefKey {String} The preferences key + */ + onFavourite: function DL_onFavourite(row) + { + var elIdentifier = row; + if (typeof this.viewRenderers[this.options.viewRendererName] === "object") + { + elIdentifier = this.viewRenderers[this.options.viewRendererName].getDataTableRecordIdFromRowElement(this, row); + } + var oRecord = this.widgets.dataTable.getRecord(elIdentifier), + record = oRecord.getData(), + node = record.node, + nodeRef = node.nodeRef; + + record.isFavourite = !record.isFavourite; + this.widgets.dataTable.updateRow(oRecord, record); + + var fnPref = record.isFavourite ? "favouriteDocumentOrFolder" : "unFavouriteDocumentOrFolder"; + var responseConfig = + { + failureCallback: + { + fn: function DL_oFD_failure(event, p_oRow) + { + // Reset the flag to it's previous state + var oRecord = this.widgets.dataTable.getRecord(p_oRow), + record = oRecord.getData(), + node = record.node; + + record.isFavourite = !record.isFavourite; + this.widgets.dataTable.updateRow(oRecord, record); + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.save.failure", record.displayName) + }); + }, + scope: this, + obj: row + } + }; + this.services.preferences[fnPref].call(this.services.preferences, node, responseConfig); + }, + + /** + * Handler to inform of a resize to resizable panel + * + * @method onResizerChanged + * @private + */ + onResizerChanged: function DL_onResizerChanged() + { + this._resizeRowContainers(); + }, + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Helper to resize the container elements for each row to ensure the wrapping + * of long filenames is correctly maintained when the window or filters panel is resized. + * + * @method _resizeRowContainers + */ + _resizeRowContainers: function DL__resizeRowContainers(width) + { + if (!YAHOO.lang.isNumber(width)) + { + var fpanel = Dom.get("alf-filters"), + offset = (fpanel ? parseInt(fpanel.style.width, 10) : 160) + 390, + width = (Dom.getViewportWidth() - offset) + "px"; + } + else + { + // Width supplied, no action required. + width = (width - 390) + "px"; + } + var nodes = YAHOO.util.Selector.query('h3.filename', this.id + "-documents"); + for (var i=0; i 0) + { + removeViewOption = removeViewSpan[0].parentNode.parentNode; + } + var setViewSpan = Dom.getElementsByClassName("setDefaultView"); + var setViewOption = null; + if (setViewSpan.length > 0) + { + setViewOption = setViewSpan[0].parentNode.parentNode; + } + + if (this.options.userIsSiteManager || + (this.doclistMetadata.parent.properties != null && + this.doclistMetadata.parent.properties["cm:creator"].userName == Alfresco.constants.USERNAME)) + { + // If the user is either the site manager or the creator of the container... + if (this.doclistMetadata.parent.properties != null && + this.doclistMetadata.parent.properties["app:defaultViewId"] != null && + this.doclistMetadata.parent.properties["app:defaultViewId"] != "") + { + // Update the option labels for setting default views... + for (var i=0; i' + $html(this.msg("message.loading")) + '', + noEscape: true + }); + + if (YAHOO.env.ua.ie > 0) + { + this.loadingMessageShowing = true; + } + else + { + loadingMessage.showEvent.subscribe(function() + { + this.loadingMessageShowing = true; + }, this, true); + } + } + }; + + // Reset the custom error messages + this._setDefaultDataTableErrors(this.widgets.dataTable); + + // Reset preview tooltips array + this.previewTooltips = []; + + this.insituEditors = []; + + // More Actions menu no longer relevant + this.hideMoreActionsFn = null; + + // Slow data webscript message + this.loadingMessageShowing = false; + timerShowLoadingMessage = YAHOO.lang.later(this.options.loadingMessageDelay, this, fnShowLoadingMessage); + + var destroyLoaderMessage = function DL__uDL_destroyLoaderMessage() + { + if (timerShowLoadingMessage) + { + // Stop the "slow loading" timed function + timerShowLoadingMessage.cancel(); + timerShowLoadingMessage = null; + } + + if (loadingMessage) + { + if (this.loadingMessageShowing) + { + // Safe to destroy + loadingMessage.destroy(); + loadingMessage = null; + } + else + { + // Wait and try again later. Scope doesn't get set correctly with "this" + YAHOO.lang.later(100, me, destroyLoaderMessage); + } + } + }; + + var successHandler = function DL__uDL_successHandler(sRequest, oResponse, oPayload) + { + destroyLoaderMessage(); + // Updating the Doclist may change the file selection + var fnAfterUpdate = function DL__uDL_sH_fnAfterUpdate() + { + YAHOO.Bubbling.fire("activateDynamicControls"); + YAHOO.Bubbling.fire("selectedFilesChanged"); + this.listUpdated = false; + if (this.currentFilter.filterId == "recentlyModified" || this.currentFilter.filterId == "recentlyAdded") + { + YAHOO.Bubbling.fire("deactivateSortControls"); + } + else + { + YAHOO.Bubbling.fire("activateSortControls"); + } + }; + this.afterDocListUpdate.push(fnAfterUpdate); + + Alfresco.logger.debug("currentFilter was:", this.currentFilter, "now:", successFilter); + Alfresco.logger.debug("currentPage was [" + this.currentPage + "] now [" + successPage + "]"); + this.currentFilter = successFilter; + this.currentPage = successPage; + var pathChanged = false; + if (successFilter.filterId === "path") + { + Alfresco.logger.debug("currentPath was [" + this.currentPath + "] now [" + successFilter.filterData + "]"); + pathChanged = (this.currentPath != successFilter.filterData); + this.currentPath = successFilter.filterData; + } + + delete successFilter.doclistFirstTimeNav; + YAHOO.Bubbling.fire("filterChanged", successFilter); + + // Ensure that the correct view is selected for the current folder/user preference... + this._updateDefaultViewOptions(pathChanged); + + // Call destroy view on all viewRenderers then renderView on the selected view + for (var i = 0, ii = this.options.viewRendererNames.length; i < ii; i++) + { + if (typeof this.viewRenderers[this.options.viewRendererNames[i]] === "object") + { + this.viewRenderers[this.options.viewRendererNames[i]].destroyView(this, sRequest, oResponse, oPayload); + } + } + if (typeof this.viewRenderers[this.options.viewRendererName] === "object") + { + this.viewRenderers[this.options.viewRendererName].renderView(this, sRequest, oResponse, oPayload); + } + else + { + // TODO Display message that no view renderers are available and render detailed anyway + } + }; + + var failureHandler = function DL__uDL_failureHandler(sRequest, oResponse) + { + destroyLoaderMessage(); + // Clear out deferred functions + this.afterDocListUpdate = []; + + if (oResponse.status === 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(true); + } + else + { + try + { + if (oResponse.status === 404) + { + // Folder not found (via the HTTP "404 Not Found" response) - deactivate dynamic controls only + YAHOO.Bubbling.fire("deactivateDynamicControls"); + YAHOO.Bubbling.fire("deactivateSortControls"); + } + else + { + // Site or container not found (e.g. via the HTTP "410 Gone" response) or more serious - deactivate all controls + YAHOO.Bubbling.fire("deactivateAllControls"); + } + + var fnAfterFailedUpdate = function DL__uDL_failureHandler_fnAfterUpdate(responseMsg, responseStatus) + { + return function DL__uDL_failureHandler_afterUpdate() + { + this.widgets.paginator.setState( + { + totalRecords: 0 + }); + this.widgets.paginator.render(); + this.widgets.dataTable.set("MSG_ERROR", responseMsg); + if (responseStatus === 410) + { + this.widgets.dataTable.showTableMessage(responseMsg, YAHOO.widget.DataTable.CLASS_DISABLED); + } + else + { + this.widgets.dataTable.showTableMessage(responseMsg, YAHOO.widget.DataTable.CLASS_ERROR); + } + }; + }; + + this.afterDocListUpdate.push(fnAfterFailedUpdate(YAHOO.lang.JSON.parse(oResponse.responseText).message, oResponse.status)); + this.widgets.dataTable.initializeTable(); + this.widgets.dataTable.render(); + this.listUpdated = false; + } + catch(e) + { + Alfresco.logger.error(e); + this._setDefaultDataTableErrors(this.widgets.dataTable); + } + } + }; + + // Update the DataSource + if (params.filter && params.filter.filterId === "path") + { + params.path = params.filter.filterData; + + // ALF-17145 + if (this.currentFilter.filterData != params.path) + { + Alfresco.logger.debug("currentFilter.filterData was [" + this.currentFilter.filterData + "] now [" + params.path + "]"); + this.currentFilter.filterData = params.path; + } + } + var requestParams = this._buildDocListParams(params); + Alfresco.logger.debug("DataSource requestParams: ", requestParams); + this.widgets.dataSource.sendRequest(requestParams, + { + success: successHandler, + failure: failureHandler, + scope: this + }); + }, + + /** + * Build URI parameter string for doclist JSON data webscript + * + * @method _buildDocListParams + * @param p_obj.page {string} Page number + * @param p_obj.pageSize {string} Number of items per page + * @param p_obj.path {string} Path to query + * @param p_obj.type {string} Filetype to filter: "all", "documents", "folders" + * @param p_obj.site {string} Current site + * @param p_obj.container {string} Current container + * @param p_obj.filter {string} Current filter + */ + _buildDocListParams: function DL__buildDocListParams(p_obj) + { + // Essential defaults + var siteMode = $isValueSet(this.options.siteId), + obj = + { + path: this.currentPath, + type: this.options.showFolders ? "all" : "documents", + site: this.options.siteId, + container: this.options.containerId, + filter: this.currentFilter + }; + + // Pagination in use? + if (this.options.usePagination) + { + obj.page = this.widgets.paginator.getCurrentPage() || this.currentPage; + obj.pageSize = this.widgets.paginator.getRowsPerPage(); + } + + // Passed-in overrides + if (typeof p_obj === "object") + { + obj = YAHOO.lang.merge(obj, p_obj); + } + + // Build the URI stem + var isSharedFiles = ("alfresco://company/shared" == this.options.rootNode); + var uriPart = siteMode ? "site/{site}/{container}" : isSharedFiles ? "node/alfresco/company/shared" : "node/alfresco/user/home", + params = YAHOO.lang.substitute("{type}/" + uriPart + (obj.filter.filterId === "path" ? "{path}" : ""), + { + type: encodeURIComponent(obj.type), + site: encodeURIComponent(obj.site), + container: encodeURIComponent(obj.container), + path: $combine("/", Alfresco.util.encodeURIPath(obj.path)) + }); + + // Filter parameters + params += "?filter=" + encodeURIComponent(obj.filter.filterId); + if (obj.filter.filterData && obj.filter.filterId !== "path") + { + params += "&filterData=" + encodeURIComponent(obj.filter.filterData); + } + + // Paging parameters + if (this.options.usePagination) + { + params += "&size=" + obj.pageSize + "&pos=" + obj.page; + } + + // Sort parameters + params += "&sortAsc=" + this.options.sortAscending + "&sortField=" + encodeURIComponent(this.options.sortField); + + if (!siteMode) + { + // Repository mode (don't resolve Site-based folders) + params += "&libraryRoot=" + encodeURIComponent(this.options.rootNode.toString()); + } + + // View mode and No-cache + params += "&view=" + this.actionsView + "&noCache=" + new Date().getTime(); + + return params; + }, + + /** + * Searches the current recordSet for a record with the given parameter value + * + * @private + * @method _findRecordByParameter + * @param p_value {string} Value to find + * @param p_parameter {string} Parameter to look for the value in + * @return {YAHOO.widget.Record} Successful search result or null + */ + _findRecordByParameter: function DL__findRecordByParameter(p_value, p_parameter) + { + var oRecordSet = this.widgets.dataTable.getRecordSet(), + oRecord, record, i, j; + + for (i = 0, j = oRecordSet.getLength(); i < j; i++) + { + oRecord = oRecordSet.getRecord(i); + record = oRecord.getData(); + + if (record[p_parameter] === p_value || (record.node && record.node[p_parameter] === p_value)) + { + return oRecord; + } + } + return null; + } + }, true); +})(); diff --git a/share/src/main/webapp/components/documentlibrary/documentlist_v2.css b/share/src/main/webapp/components/documentlibrary/documentlist_v2.css new file mode 100644 index 0000000000..40f6288209 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/documentlist_v2.css @@ -0,0 +1,1608 @@ +.doclist +{ + clear: both; + /* visibility: hidden; */ +} + +.doclist a:hover +{ + text-decoration: none; +} + +.doclist .align-center +{ + text-align: center; +} + +.doclist .align-right +{ + text-align: right; +} + +/* DocList bar */ + +.doclist .doclist-bar +{ + border-bottom: 1px solid #d9d9d9; + margin: 0 -10px; + padding: 4px 0.5em 2px; + display: none; +} + +.doclist .doclist-bar-bottom +{ + border-top: 1px solid #d9d9d9; + display: none; +} + +.doclist span.separator +{ + border-right: 1px dotted #c7ccce; + border-top: medium none; + left: -2px; + margin: 0 4px; + padding: 2px 0; + position: relative; + top: -4px; + vertical-align: bottom; +} + +/* DocList bar Buttons and Paginator */ + +.doclist .doclist-bar .file-select +{ + float: left; + width: 15%; +} + +.doclist .doclist-bar .paginator +{ + float: left; + margin: 0; + padding: 4px 0; + text-align: center; + width: 80%; +} + +.doclist .doclist-bar .yui-pg-current +{ + margin-right: 0; +} + +.toolbar .options-select { + float: right; +} + +.toolbar .options-select .yuimenuitemlabel span +{ + background-position: 2px 50%; + background-repeat: no-repeat; + cursor: pointer; + display: block; + margin-left: -4px; + min-height: 16px; + padding: 2px 0px 1px 24px; +} + +.toolbar .options-select .removeDefaultView +{ + background-image: url(images/enabled-off-16.png); +} + +.toolbar .options-select .setDefaultView +{ + background-image: url(images/enabled-on-16.png); +} + +.toolbar .options-select .showFolders +{ + background-image: url(images/folders-show-16.png); +} + +.toolbar .options-select .hideFolders +{ + background-image: url(images/folders-hide-16.png); +} + +.toolbar .options-select .showPath +{ + background-image: url(images/navbar-show-16.png); +} + +.toolbar .options-select .hidePath +{ + background-image: url(images/navbar-hide-16.png); +} + +.toolbar .options-select .rss +{ + background-image: url(images/feed-icon-16.png); +} + +.toolbar .options-select .simple > a > span.view +{ + background-image: url(images/simple-view-off-16.png); +} + +.toolbar .options-select .detailed > a > span.view +{ + background-image: url(images/detailed-view-off-16.png); +} + +.toolbar .options-select .gallery > a > span.view +{ + background-image: url(images/gallery-view-off-16.png); +} + +.toolbar .options-select .filmstrip > a > span.view +{ + background-image: url(images/filmstrip-view-off-16.png); +} + +.toolbar .options-select .table > a > span.view +{ + background-image: url(images/table-view-off-16.png); +} + +/* DocList bar Select menu */ + +.toolbar .file-select .yuimenuitemlabel span +{ + background-position: 2px 50%; + background-repeat: no-repeat; + cursor: pointer; + display: block; + margin-left: -4px; + min-height: 16px; + padding: 2px 0px 1px 24px; +} + +.toolbar .file-select .selectAll +{ + background-image: url(images/select-all-16.png); +} + +.toolbar .file-select .selectNone +{ + background-image: url(images/select-none-16.png); +} + +.toolbar .file-select .selectInvert +{ + background-image: url(images/select-invert-16.png); +} + +.toolbar .file-select .selectFolders +{ + background-image: url(images/select-folders-16.png); +} + +.toolbar .file-select .selectDocuments +{ + background-image: url(images/select-documents-16.png); +} + +/* DocList bar right-hand section */ + +.toolbar .sort-direction, +.toolbar .sort-field, +.toolbar .show-folders, +.toolbar .simple-detailed +{ + float: right; +} + +.toolbar .show-folders span.first-child, +.toolbar .simple-detailed span.first-child +{ + background-position: 50% 50%; + background-repeat: no-repeat; + min-height: 16px; + padding: 0 2px; +} + +.toolbar .show-folders span.first-child button +{ + padding: 0 14px; +} + +.toolbar .sort-direction span.yui-button +{ + margin-right: 0; +} + +.toolbar .sort-direction span.first-child +{ + background-image: url(images/sort-ascending-16.png); + background-position: 50% 50%; + background-repeat: no-repeat; + min-height: 16px; + padding: 0 2px; +} + +.toolbar .sort-direction .sort-descending span.first-child +{ + background-image: url(images/sort-descending-16.png); +} + +.toolbar .sort-field span.yui-button +{ + margin-left: 4px; +} + +.toolbar .sort-field button +{ + padding-left: 4px; +} + +.toolbar .show-folders +{ + margin-right: 4px; +} + +.toolbar .show-folders span.first-child, +.toolbar .show-folders-image +{ + background-image: url(images/folders-hide-16.png); +} + +.toolbar .show-folders .yui-button-checked span.first-child +{ + background-image: url(images/folders-show-16.png); +} + +.toolbar .show-folders .separator +{ + margin-left: 0; +} + +.toolbar .simple-detailed .yui-button +{ + margin-left: 0; + margin-right: 0; +} + +.toolbar .simple-detailed .simple-view span.first-child +{ + background-image: url(images/simple-view-off-16.png); +} + +.toolbar .simple-detailed .simple-view.yui-button-checked span.first-child +{ + background-image: url(images/simple-view-on-16.png); +} + +.toolbar .simple-detailed .detailed-view span.first-child +{ + background-image: url(images/detailed-view-off-16.png); +} + +.toolbar .simple-detailed .detailed-view.yui-button-checked span.first-child +{ + background-image: url(images/detailed-view-on-16.png); +} + +/* Inline "Show Folders" action */ + +.doclist .show-folders-image +{ + background-position: 0px 3px; + cursor: pointer; + display: inline-block; + height: 16px; + width: 16px; +} + +/* Forms */ + +.form-container .form-fields +{ + border-bottom: medium none; + padding: 1em 1em 0em 1em; +} + +/* Details Form */ + +.form-container .edit-metadata a, +.form-container .edit-metadata a:visited +{ + background: transparent url(actions/document-edit-metadata-16.png) no-repeat 12px 4px; + padding-left: 32px; +} + +/* Data Table */ + +.doclist .documents table +{ + border: medium none; + width: 100%; +} + +.doclist .documents thead +{ + display: none; +} + +.doclist .documents tbody +{ + outline: none; +} + +.doclist .documents .yui-dt table +{ + border: none; +} + +body .doclist tr.yui-dt-highlighted +{ + cursor: auto; +} + +.doclist tr.yui-dt-odd +{ + background-color: #ffffff; +} + +.doclist tr.yui-dt-odd.yui-dt-highlighted td.yui-dt-last, +.doclist tr.yui-dt-even.yui-dt-highlighted td.yui-dt-last +{ + border-left: 1px solid #c5e6e9; +} + +.doclist .documents.yui-dt .yui-dt-data td +{ + border-bottom: 1px dashed #d9d9d9; + border-right: medium none; + vertical-align: top; +} + +.doclist .documents.yui-dt .yui-dt-data .yui-dt-last td +{ + border-bottom: medium none; +} + +.doclist .documents.yui-dt tr.yui-dt-first td +{ + border-top: medium none; +} + +.doclist .documents.yui-dt td.yui-dt-last +{ + border-left: 1px solid #fff; + vertical-align: middle; +} + +.doclist .yui-dt-liner +{ + padding: 4px; +} + +.doclist .yui-dt-col-thumbnail .yui-dt-liner +{ + text-align: center; +} + +.doclist .documents.yui-dt tr.yui-dt-first td.yui-dt-empty +{ + border-right: medium none; + cursor: default; +} + +.doclist .yui-dt-error +{ + margin: 1em auto; + padding: 1em; +} + +/* This rule is vital to workaround a Firefox mouseout bug */ + +.doclist .yui-dt-col-4 +{ + overflow: visible; +} + +/* Cell Renderers */ + +.doclist span.folder +{ + display: block; + position: relative; +} + +.doclist .documents .icon32 +{ + cursor: pointer; + display: block; + min-height: 32px; +} + +.doclist .documents .icon32 span.link, +.doclist .documents .folder-small span.link +{ + background: url(images/link-16.png) no-repeat; + height: 16px; + width: 16px; + position: absolute; +} + +.doclist .documents .folder-small span.droppable +{ + background: url(../images/drop-arrow-left-small.png) no-repeat; + display: none; + height: 14px; + position: absolute; + width: 34px; + z-index: 1; + margin-left: 20px; +} + +.doclist .documents .thumbnail, +.doclist .documents .folder +{ + cursor: pointer; + display: block; + height: 100px; + overflow: hidden; + padding-top: 2px; + position: relative; + width: 100px; +} + +.doclist .documents .thumbnail span.link, +.doclist .documents .folder span.link +{ + background: url(images/link-32.png) no-repeat; + height: 32px; + width: 32px; + position: absolute; +} + +.doclist .documents .folder span.droppable +{ + background: url(../images/drop-arrow-left-large.png) no-repeat; + display: none; + height: 25px; + position: absolute; + width: 60px; + z-index: 1; + margin-left: 40px; +} + +.doclist .documents .filename +{ + font-size: 131%; + font-weight: normal; + padding-bottom: 0.2em; + padding-left: 20px; + word-wrap: break-word; +} + +.doclist .documents .filename span.title +{ + color: #606060; + font-size: 82%; + padding-left: 0.7em; +} + +.doclist .documents .filename span.document-version +{ + margin-left: 0.8em; + padding: 1px; + position: relative; + top: -2px; + visibility: hidden; +} + +.doclist .documents .yui-dt-highlighted .filename span.document-version +{ + visibility: visible; +} + +.doclist .documents +{ + color: #333333; + margin: 0 -10px 0 -8px; +} + +.doclist .documents a +{ + color: #2B6EB5; + cursor: pointer; +} + +.doclist .documents a:active, +.doclist .documents a:hover +{ + text-decoration: underline; +} + +.doclist .documents .rename-file +{ + background-color: #e8e8e8; + border: 1px solid #808080; + cursor: pointer; + float: left; + margin-left: 2em; + position: relative; + top: -2px; +} + +.doclist .documents .detail +{ + clear: left; + line-height: 1.5em; + min-height: 1.5em; + padding-bottom: 0.2em; + padding-left: 20px; +} + +.doclist .documents .detail .faded +{ + color: #aaa; +} + +.doclist .documents .detail em +{ + color: #606060; + font-style: normal; + font-weight: normal +} + +.doclist .documents .detail span.item +{ + float: left; + margin-right: 1.6em; +} + +.doclist .documents .detail span.item-social +{ + line-height: 1.2em; + margin-right: 0.8em; + margin-top: 0.4em; +} + +.doclist .documents .detail span.item-simple +{ + padding-right: 0.5em; +} + +.doclist .documents .detail span.tag +{ + float: left; + margin: 1px 0; +} + +/* Categories */ + +.doclist .documents .detail span.category-item +{ + background-image: url(images/category-16.png); + background-position: 0px 2px; + background-repeat: no-repeat; + margin-right: 0; + padding-bottom: 2px; + padding-left: 18px; +} + +/* Social tagging customisations */ + +.doclist .documents .detail a.comment +{ + background-image: url(../images/comment-off-16.png); +} + +.doclist .documents .detail a.comment.hasComments +{ + background-image: url(../images/comment-16.png); +} + +/* Document Info Banner */ + +.doclist .info-banner +{ + background-color: #ffffe0; + background-image: url(images/warning-16.png); + background-position: 6px 4px; + background-repeat: no-repeat; + border: 1px solid #ffca7a; + clear: left; + font-weight: bold; + margin-bottom: 4px; + padding: 5px 0px 3px 28px; +} + +.doclist .banner-more-info-link +{ + color: #4F94C9; + cursor: pointer; + float: right; + font-size: 85%; + font-weight: normal; + padding-right: 10px; +} + +/* Tags */ + +.doclist .documents a.tag-link +{ + border-radius: 8px; + font-size: 93%; + margin-right: 0.5em; + padding: 2px 8px; + border-radius: 8px; +} + +/* Actions Rollover */ + +.doclist .documents .hidden +{ + visibility: hidden; +} + +/* Actions */ + +.doclist div.more-actions +{ + background-color: #fff; + border: 1px solid #2b6eb5; + clear: left; + margin-left: -22px; + margin-top: 1px; + position: absolute; + width: 220px; + z-index: 1; + overflow-y: auto; + max-height: 245px; +} + +.doclist .more-actions a.action-link, +.doclist .more-actions a.simple-link +{ + border: 1px solid transparent; +} + +.doclist .more-actions a:active, +.doclist .more-actions a:hover +{ + background-color: #2b6eb5; + border: 1px solid #2b6eb5; + color: #fff; +} + +/* Actions: Simple view */ + +.doclist div.simple div +{ + float: left; +} + +.doclist div.simple div.onActionShowMore +{ + clear: both; + float: none; +} + +.doclist div.simple a.action-link span, +.doclist div.simple a.simple-link span +{ + display: none; +} + +.doclist div.simple div.more-actions +{ + margin-left: -142px; +} + +.doclist div.simple div.more-actions div +{ + float: none; +} + +.doclist div.simple div.more-actions a.action-link span, +.doclist div.simple div.more-actions a.simple-link span +{ + display: block; +} + +/* Actions: Icons */ + +.doclist .action-set a +{ + background-image: url(actions/default-16.png); +} + +.doclist .internal-show-more a +{ + background-image: url(images/plus-sign-16.png); +} + +/* Drag and Drop */ + +.dndFolderHighlight span.droppable +{ + display: block !important; +} + +.dndFolderHighlight img +{ + background-color: #dceaf4; + outline: 2px solid #4F94C9; + padding: 2px; + position: relative; + top: -2px; +} + +.dndDocListHighlight +{ + outline: 2px solid #4F94C9; + outline-offset: -2px; +} + +.docListInstructions +{ + background-color: white; + color: #515D6B; + padding: 10px; +} + +.docListInstructionsWithDND +{ + background-color: white; + border: 1px dashed #73B4DA; + color: #515D6B; + padding: 10px; +} + +.docListInstructionColumn +{ + float: left; + width: 45%; +} + +.docListInstructionColumnRightBorder +{ + border-right: 1px solid #D9D9D9; + padding-right: 30px; + margin-right: 10px; +} + +.docListInstructions > div +{ + clear: both; +} + +.docListInstructionImage +{ + float: left; + padding: 0 10px; + vertical-align: middle; +} + +.docListLinkedInstruction +{ + cursor: pointer; +} + +.docListInstructionTitle +{ + display: block; + font-size: 167%; + margin-top: 10px; + margin-bottom: 10px; + padding-left: 10px; +} + +.docListInstructionText +{ + font-size: 123%; + margin-top: 10px; + display: block; +} + +.docListInstructionTextSmall +{ + margin-top: 15px; + display: block; +} + +.docListOtherOptions +{ + display: block; + font-size: 146.5%; + margin-top: 10px; + padding-left: 10px; + padding-top: 30px; +} + +.docListOtherOptionsImage +{ + padding: 10px 6px 0 10px; + vertical-align: middle; +} + +.docListOtherOptionsText +{ + font-size: 108%; + margin-top: 10px; +} + +.inlineTagReadOnly +{ + background-color: #DCEAF4; + color: #4F94C9; + padding: 0.1em, 0.3em; + margin-right: 0.5em; +} + +.inlineTagEdit +{ + border: 1px solid #C5D6E2; + font-weight: normal; + padding: 0.3em; + background-color: white; +} + +.inlineTagEditTag +{ + background-color: #EEE; + color: #333;; + padding: 0.1em 0.3em; + margin-right: 0.3em; + margin-bottom: 0.3em; + display: inline-block; + cursor: pointer; +} + +.inlineTagEditTagPrimed +{ + background-color: #DCEAF4; + color: #4F94C9; +} + +.inlineTagEditTag img +{ + vertical-align: bottom; + padding-bottom: 0.2em; + margin-left: 0.3em; +} + +.inlineTagEdit input[type="text"]:focus +{ + outline: none; +} + +.inlineTagEdit input[type="text"] +{ + width: inherit; + position: static; + border: none; +} + +.inlineTagEditTagSelection +{ + vertical-align: bottom; + padding-bottom: 0.2em; + margin-left: 0.3em; +} + +.inlineTagEditAutoCompleteWrapper +{ + padding-bottom:2em; + width: 12em; +} + +.inlineTagEditAutoComplete +{ + width: inherit !important; +} + +.inlineTagEditAutoComplete .yui-ac-content +{ + border: 1px solid #C5D6E2 !important; +} + +.inlineTagEditAutoComplete li.yui-ac-highlight +{ + background-color: #DCEAF4 !important; + color: #515D6B !important; +} + +.yuimenuitem.drop-down-list-break-below { + border-bottom: 1px solid #EEEEEE; + margin-bottom: 10px; + padding-bottom: 5px; +} + +.yuimenuitem.drop-down-list-break-above { + border-top: 1px solid #EEEEEE; + margin-top: 10px; + padding-top: 5px; +} + + +/* Gallery View */ + +.toolbar .simple-detailed .gallery-view span.first-child +{ + background-image: url(images/gallery-view-off-16.png); +} + +.toolbar .simple-detailed .gallery-view.yui-button-checked span.first-child +{ + background-image: url(images/gallery-view-on-16.png); +} + +.alf-gallery +{ + overflow: auto; + padding: 6px; +} + +.alf-gallery-item +{ + margin: 0.4%; + float: left; + width: 12.9%; + padding: 2px; +} + + +.alf-gallery.alf-selected .alf-gallery-item +{ + -moz-opacity: 0.40; + opacity: .40; + filter: alpha(opacity=40); +} +.alf-gallery.alf-selected .alf-gallery-item-thumbnail +{ + filter: alpha(opacity=40); +} + +.alf-gallery .alf-gallery-item.alf-hover +{ + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; +} +.alf-gallery .alf-gallery-item.alf-hover .alf-gallery-item-thumbnail +{ + filter: alpha(opacity=100) !important; +} + +.alf-gallery-item.alf-selected +{ + border: 2px solid #3D6FDB; + padding: 0; + -webkit-box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-box-shadow: 0px 0px 6px rgba(0,81,255,1); + box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; +} +.alf-gallery-item.alf-selected .alf-gallery-item-thumbnail +{ + filter: alpha(opacity=100) !important; +} + +.doclist .alf-gallery span.folder +{ + height: 100%; +} + +.alf-gallery-item .alf-gallery-item-thumbnail +{ + border: none; + overflow: hidden; + position: relative; +} + +.alf-gallery-item .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-img +{ + width: 100%; + min-height: 100%; +} +.alf-gallery-item .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-img.alf-landscape +{ + width: inherit; + min-height: inherit; + height: 100%; + min-width: 100%; +} +.alf-gallery-item .alf-gallery-item-thumbnail .folder .alf-gallery-item-thumbnail-img +{ + background: transparent; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)"; /* IE8 */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF); /* IE6 & 7 */ + zoom: 1; +} +.alf-gallery-item .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-folder-img +{ + height: 68%; + min-width: 68%; +} + +.alf-gallery-item .alf-header +{ + color: white; + padding: 0 4%; + position: absolute; + font-size: 1.2em; + width: 100%; + white-space: nowrap; + background: url("../images/black-50-transparency.png") repeat !important; + z-index: 1; + visibility: hidden; + margin: 0 !important; +} +.alf-gallery-item.alf-hover .alf-header, +.alf-selected .alf-gallery-item .alf-header +{ + visibility: visible !important; +} + +.alf-gallery-item .alf-select +{ + float: left; + position: absolute; + top: 50%; + margin-top: -10px; + height: 16px; + left: 4%; +} + +.alf-gallery-item .alf-show-detail +{ + float: right; + position: relative; + right: 2%; + top: 52%; + background-image: url(images/show-detail.png); + background-repeat: no-repeat; + padding: 0px 0px 0px 16px; + margin-top: -8px; + line-height: 16px; + text-decoration: none !important; +} + +.alf-gallery-item .alf-separator +{ + margin: 12px 18px; + height: 1px; + background-color: #595959; +} + +.alf-gallery-item .alf-status +{ + float: left; + margin-left: 20px; +} + +.alf-gallery-item .alf-actions +{ + padding: 0 14px; + float: right; +} +.alf-gallery-item .alf-actions a:focus +{ + outline: none; +} + +.alf-gallery-item .alf-description +{ +} +.alf-gallery-item .alf-description a:focus +{ + outline: none !important; +} + +.alf-gallery-item .alf-detail +{ + visibility: hidden; +} + +.alf-gallery .yui-panel .bd +{ + color: inherit !important; + padding: 20px 4px 16px 4px; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + border: 1px solid #444; +} +.alf-gallery .yui-panel-container +{ + left: 0; +} + +.alf-gallery-item .alf-detail .alf-detail-thumbnail +{ + padding: 0 20px; +} +.alf-gallery-item .alf-detail .alf-detail-thumbnail img +{ + max-width: 330px; + max-height: 240px; +} +.alf-gallery-item .alf-detail .detail span.item-social:last-child +{ + margin-right: 0; +} + +.doclist div.gallery a.action-link span, +.doclist div.gallery a.simple-link span +{ + display: none; +} +.doclist div.gallery div.more-actions div +{ + float: none; +} +.doclist div.gallery div.more-actions a.action-link span, +.doclist div.gallery div.more-actions a.simple-link span +{ + display: block; +} +.doclist .action-set.gallery div +{ + float: left; +} + +.alf-gallery-item .alf-label +{ + color: white; + padding: 12px; + position: absolute; + bottom: 0; + font-size: 1.2em; + background: url("../images/black-50-transparency.png") repeat; + width: 100%; + white-space: nowrap; + text-shadow: 1px 1px #333333; + z-index: 1; +} + +.alf-gallery-item .alf-label a, +.alf-gallery-item .alf-label a:visited +{ + color: white !important; + text-decoration: none !important; +} + +.alf-gallery-item .alf-label a:hover +{ + text-decoration: underline !important; + background: none !important; +} + +.alf-gallery-item .alf-label h3 +{ + font-weight: normal; +} +.alf-gallery-item .alf-label .detail +{ + display: none; +} +.alf-gallery-item .alf-label .document-version +{ + display: none; +} +.doclist .documents.alf-gallery .filename span.document-version +{ + visibility: inherit; +} + +.alf-gallery-columns-3 .alf-gallery-item +{ + width: 31.5%; + margin: 0.6%; +} +.alf-gallery-columns-3 .alf-gallery-item .alf-label +{ + font-size: 1.3em; + padding: 1.3em 0.8em; +} +.alf-gallery-columns-3 .alf-gallery-item .alf-header +{ + height: 3em; +} +#ygddfdiv.alf-gallery-columns-3 img +{ + max-width: 390px; + min-width: 270px +} +.alf-gallery-columns-4 .alf-gallery-item +{ + width: 23.5%; + margin: 0.5%; +} +.alf-gallery-columns-4 .alf-gallery-item .alf-label +{ + font-size: 1.2em; + padding: 1.2em 0.75em; +} +.alf-gallery-columns-4 .alf-gallery-item .alf-header +{ + height: 2.5em; +} +#ygddfdiv.alf-gallery-columns-4 img +{ + max-width: 290px; + min-width: 200px; +} +.alf-gallery-columns-7 .alf-gallery-item +{ + width: 12.9%; + margin: 0.4%; +} +.alf-gallery-columns-7 .alf-gallery-item .alf-label +{ + font-size: 0.85em; + padding: 0.95em 0.7em; +} +.alf-gallery-columns-7 .alf-gallery-item .alf-header +{ + height: 1.75em; +} +#ygddfdiv.alf-gallery-columns-7 img +{ + width: 160px; + min-width: 110px; +} +.alf-gallery-columns-10 .alf-gallery-item +{ + width: 8.9%; + margin: 0.3%; +} +.alf-gallery-columns-10 .alf-gallery-item .alf-label +{ + font-size: 0.75em; + padding: 0.8em 0.65em; +} +.alf-gallery-columns-10 .alf-gallery-item .alf-header +{ + height: 1.35em; +} +#ygddfdiv.alf-gallery-columns-10 img +{ + max-width: 100px; + min-width: 70px; +} + +.alf-gallery-slider +{ + float: right; + margin: 4px 4px 2px 0; +} +.alf-gallery-slider-bg +{ + position: relative; + width: 68px !important; + height: 16px !important; + float: left; + margin-right: 5px; + background-position: 3px !important; +} +.alf-gallery-slider-bg:focus +{ + outline: none; +} +.alf-gallery-slider-thumb +{ + position: absolute; + left: 0; + top: 0 !important; +} +.alf-gallery-slider-small +{ + float: left; + position: relative; + left: 1px; + height: 16px; +} +.alf-gallery-slider-large +{ + float: left; + height: 16px; + position: relative; + top: -1px; +} + +/* Filmstrip View */ + +.doclist .simple-detailed .filmstrip-view span.first-child +{ + background-image: url(images/filmstrip-view-off-16.png); +} + +.doclist .simple-detailed .filmstrip-view.yui-button-checked span.first-child +{ + background-image: url(images/filmstrip-view-on-16.png); +} + +.alf-gallery.alf-filmstrip { + padding: 0px; + position: relative; +} + +.alf-filmstrip .alf-gallery-item { + float: none; + margin: 0; + padding: 0; +} + +.alf-filmstrip .yui-carousel-element +{ + margin: 0; + width: 146880px; + z-index: auto; +} + +.alf-filmstrip .yui-carousel-element li { + margin: 0 !important; + border: none !important; + outline: none !important; +} +.alf-filmstrip .yui-carousel, .alf-filmstrip .yui-carousel-vertical { + border: none !important; +} +.alf-filmstrip .yui-carousel-nav { + display: none; +} +.alf-filmstrip-main-nav-button { + position: absolute; + top: 42%; +} +.alf-filmstrip-nav-buttons { + position: absolute; + top: 6px; + width: 100%; +} +.alf-filmstrip-nav-button { + z-index: 2; +} +.alf-filmstrip-nav-button.yui-carousel-first-button-disabled, .alf-filmstrip-nav-button.yui-carousel-button-disabled { + visibility: hidden !important; +} +.alf-filmstrip-nav-prev { + float: left; + margin-left: 10px; +} +.alf-filmstrip-nav-next { + float: right; + margin-right: 10px; +} +.alf-filmstrip-main-nav-button.alf-filmstrip-nav-prev { + margin-left: 25px; + +} +.alf-filmstrip-main-nav-button.alf-filmstrip-nav-next { + margin-right: 25px; + right: 0; +} + +.alf-filmstrip .alf-gallery-item-thumbnail { + position: relative; + height: 100%; + overflow: hidden; +} +.alf-filmstrip .alf-gallery-item-thumbnail .alf-gallery-item-thumbnail-img { + height: 100%; + min-width: inherit; + width: inherit; +} + +.alf-filmstrip .alf-gallery-item .alf-header +{ + color: white; + padding: 12px; + position: absolute; + top: 0; + font-size: 1.2em; + background: url("../images/black-50-transparency.png") repeat; + width: 100%; + text-shadow: 1px 1px #333333; + z-index: 1; + visibility: visible; +} + +.alf-filmstrip .alf-gallery-item .alf-select +{ + float: left; + margin-right: 15px; + position: relative; + margin-top: 2px; + left: 0; + top: 0%; +} + +.alf-filmstrip .alf-gallery-item .alf-label +{ + float: left; + z-index: auto; + position: relative; + width: auto; + bottom: inherit; + background: none; + padding: 0; +} + +.alf-filmstrip .alf-gallery-item .alf-show-detail +{ + right: 3%; + top: 0%; + margin-top: 2px; + margin-right: 0; +} + +.alf-filmstrip .alf-gallery-item .alf-detail.yui-panel +{ + z-index: 2; +} + +.alf-filmstrip .web-preview .Image img +{ + max-width: none; + height: 100%; +} + +.alf-filmstrip .alf-gallery-item-thumbnail .alf-header ~ div, +.alf-filmstrip .web-preview, +.alf-filmstrip .web-preview .previewer +{ + height: 100%; +} + +.alf-fullscreen .alf-filmstrip .alf-gallery-item-thumbnail .alf-header ~ div, +.alf-fullscreen .alf-filmstrip .web-preview, +.alf-fullscreen .alf-filmstrip .web-preview .previewer +{ + max-height: none; +} + +.alf-filmstrip .web-preview .previewer.WebPreviewer +{ + height: 90%; +} + +.web-preview.real +{ + margin-top: 46px; + z-index: 1; +} + +.doclist div.filmstrip a.action-link span, +.doclist div.filmstrip a.simple-link span +{ + display: none; +} +.doclist div.filmstrip div.more-actions div +{ + float: none; +} +.doclist div.filmstrip div.more-actions a.action-link span, +.doclist div.filmstrip div.more-actions a.simple-link span +{ + display: block; +} +.doclist .action-set.filmstrip div +{ + float: left; +} + +.alf-filmstrip-nav { + width: 100%; + position: absolute; + bottom: 0; + background: url("../images/black-50-transparency.png") repeat; + z-index: 2; + height: 112px; +} +.alf-filmstrip-nav .yui-carousel { + margin: 0 auto; + z-index: 2; +} +.alf-filmstrip-nav .alf-filmstrip-nav-handle { + z-index: 2; + position: absolute; + left: 47.5%; + top: -12px; + height: 12px; + width: 60px; + background: url("images/filmstrip-nav-handle-down.png"); +} + +.alf-filmstrip-nav-item { + padding: 4px; +} +.alf-filmstrip-nav-item:focus { + outline: none; +} +.alf-gallery.alf-filmstrip .alf-gallery-item +{ + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border: none; +} + +.alf-filmstrip-nav-item.alf-selected .alf-filmstrip-nav-item-thumbnail +{ + border: 2px solid #3D6FDB; + padding: 0; + -webkit-box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-box-shadow: 0px 0px 6px rgba(0,81,255,1); + box-shadow: 0px 0px 6px rgba(0,81,255,1); + -moz-opacity: 1 !important; + opacity: 1 !important; + filter: alpha(opacity=100) !important; + height: 100px; +} + +.alf-filmstrip-nav-item .alf-filmstrip-nav-item-thumbnail { + position: relative; + height: 98px; + overflow: hidden; + width: 100px; + padding: 2px; +} +.alf-filmstrip-nav-item .alf-filmstrip-nav-item-thumbnail .alf-gallery-item-thumbnail-img +{ + width: 102px; + min-height: 102px; +} +.alf-filmstrip-nav-item .alf-filmstrip-nav-item-thumbnail .alf-gallery-item-thumbnail-img.alf-landscape +{ + width: auto; + min-height: inherit; + height: 102px; + min-width: 102px; +} + +#ygddfdiv.alf-filmstrip-dragging img +{ + max-height: 100px; +} +.alf-filmstrip-nav-item .alf-label +{ + color: white; + padding: 0.7em; + font-size: 0.9em; + position: absolute; + bottom: 0; + background: url("../images/black-50-transparency.png") repeat; + width: 100%; + text-shadow: 1px 1px #333333; + text-align: left; + z-index: 2; + visibility: visible; +} +.alf-filmstrip-nav-item .alf-label a, +.alf-filmstrip-nav-item .alf-label a:visited +{ + color: white !important; + text-decoration: none !important; +} + +.alf-filmstrip-nav-item .alf-label a:hover +{ + text-decoration: underline !important; + background: none !important; +} + +.alf-filmstrip.alf-filmstrip-content-only .alf-filmstrip-nav { + bottom: -112px !important; +} +.alf-filmstrip.alf-filmstrip-content-only .alf-gallery-item .alf-header { + top: -50px !important; +} +.alf-filmstrip.alf-filmstrip-content-only .alf-filmstrip-nav .alf-filmstrip-nav-handle { + background: url("images/filmstrip-nav-handle-up.png"); +} + diff --git a/share/src/main/webapp/components/documentlibrary/images/category-16.png b/share/src/main/webapp/components/documentlibrary/images/category-16.png new file mode 100644 index 0000000000..f611987679 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/category-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/create-content-16.png b/share/src/main/webapp/components/documentlibrary/images/create-content-16.png new file mode 100644 index 0000000000..6522bdaed0 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/create-content-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/create-content-disabled-16.png b/share/src/main/webapp/components/documentlibrary/images/create-content-disabled-16.png new file mode 100644 index 0000000000..1a7ec0b331 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/create-content-disabled-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/customize-16.png b/share/src/main/webapp/components/documentlibrary/images/customize-16.png new file mode 100644 index 0000000000..18aa3a496e Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/customize-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/customize-disabled-16.png b/share/src/main/webapp/components/documentlibrary/images/customize-disabled-16.png new file mode 100644 index 0000000000..3934c84ace Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/customize-disabled-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/detailed-view-off-16.png b/share/src/main/webapp/components/documentlibrary/images/detailed-view-off-16.png new file mode 100644 index 0000000000..aa5e62ba45 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/detailed-view-off-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/detailed-view-on-16.png b/share/src/main/webapp/components/documentlibrary/images/detailed-view-on-16.png new file mode 100644 index 0000000000..a207885cf4 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/detailed-view-on-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/document-cloud-sync-16.png b/share/src/main/webapp/components/documentlibrary/images/document-cloud-sync-16.png new file mode 100644 index 0000000000..bff6f2bb9c Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/document-cloud-sync-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/document-cloud-unsync-16.png b/share/src/main/webapp/components/documentlibrary/images/document-cloud-unsync-16.png new file mode 100644 index 0000000000..9400654fdc Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/document-cloud-unsync-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/document-request-sync-16.png b/share/src/main/webapp/components/documentlibrary/images/document-request-sync-16.png new file mode 100644 index 0000000000..bff6f2bb9c Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/document-request-sync-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/enabled-off-16.png b/share/src/main/webapp/components/documentlibrary/images/enabled-off-16.png new file mode 100644 index 0000000000..aece9f6125 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/enabled-off-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/enabled-on-16.png b/share/src/main/webapp/components/documentlibrary/images/enabled-on-16.png new file mode 100644 index 0000000000..7d55ee995c Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/enabled-on-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/error-16.png b/share/src/main/webapp/components/documentlibrary/images/error-16.png new file mode 100644 index 0000000000..9cc8124bde Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/error-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/feed-icon-16.png b/share/src/main/webapp/components/documentlibrary/images/feed-icon-16.png new file mode 100644 index 0000000000..2eee38a459 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/feed-icon-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/feed-icon-disabled-16.png b/share/src/main/webapp/components/documentlibrary/images/feed-icon-disabled-16.png new file mode 100644 index 0000000000..65becef911 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/feed-icon-disabled-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-content-nav-next.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-content-nav-next.png new file mode 100644 index 0000000000..75b44c9b7f Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-content-nav-next.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-content-nav-prev.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-content-nav-prev.png new file mode 100644 index 0000000000..4861872de3 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-content-nav-prev.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-main-nav-next.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-main-nav-next.png new file mode 100644 index 0000000000..5e16dac3af Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-main-nav-next.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-main-nav-prev.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-main-nav-prev.png new file mode 100644 index 0000000000..afb104a17d Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-main-nav-prev.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-nav-handle-down.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-nav-handle-down.png new file mode 100644 index 0000000000..344fbaba9b Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-nav-handle-down.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-nav-handle-up.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-nav-handle-up.png new file mode 100644 index 0000000000..ae4996e245 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-nav-handle-up.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-view-off-16.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-view-off-16.png new file mode 100644 index 0000000000..c499119996 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-view-off-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/filmstrip-view-on-16.png b/share/src/main/webapp/components/documentlibrary/images/filmstrip-view-on-16.png new file mode 100644 index 0000000000..ea569893ba Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/filmstrip-view-on-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-256.png b/share/src/main/webapp/components/documentlibrary/images/folder-256.png new file mode 100644 index 0000000000..e9df43e0b0 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-256.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-32.png b/share/src/main/webapp/components/documentlibrary/images/folder-32.png new file mode 100644 index 0000000000..0a13b606ad Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-32.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-48.png b/share/src/main/webapp/components/documentlibrary/images/folder-48.png new file mode 100644 index 0000000000..59a8bfa6c8 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-48.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-64.png b/share/src/main/webapp/components/documentlibrary/images/folder-64.png new file mode 100644 index 0000000000..2e357f18b1 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-64.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-closed-16.png b/share/src/main/webapp/components/documentlibrary/images/folder-closed-16.png new file mode 100644 index 0000000000..97b2973ae1 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-closed-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-new-16.png b/share/src/main/webapp/components/documentlibrary/images/folder-new-16.png new file mode 100644 index 0000000000..8e3ee13908 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-new-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-new-disabled-16.png b/share/src/main/webapp/components/documentlibrary/images/folder-new-disabled-16.png new file mode 100644 index 0000000000..0af07a097a Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-new-disabled-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-open-16.png b/share/src/main/webapp/components/documentlibrary/images/folder-open-16.png new file mode 100644 index 0000000000..a8c70a4aa0 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-open-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-up-16.png b/share/src/main/webapp/components/documentlibrary/images/folder-up-16.png new file mode 100644 index 0000000000..6b9be8c765 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-up-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folder-up-disabled-16.png b/share/src/main/webapp/components/documentlibrary/images/folder-up-disabled-16.png new file mode 100644 index 0000000000..b5c4636a68 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folder-up-disabled-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folders-hide-16.png b/share/src/main/webapp/components/documentlibrary/images/folders-hide-16.png new file mode 100644 index 0000000000..b9e086ff05 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folders-hide-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/folders-show-16.png b/share/src/main/webapp/components/documentlibrary/images/folders-show-16.png new file mode 100644 index 0000000000..a8c70a4aa0 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/folders-show-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/gallery-size-large-16.png b/share/src/main/webapp/components/documentlibrary/images/gallery-size-large-16.png new file mode 100644 index 0000000000..8a760f5d93 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/gallery-size-large-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/gallery-size-small-16.png b/share/src/main/webapp/components/documentlibrary/images/gallery-size-small-16.png new file mode 100644 index 0000000000..661f5ce443 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/gallery-size-small-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/gallery-view-off-16.png b/share/src/main/webapp/components/documentlibrary/images/gallery-view-off-16.png new file mode 100644 index 0000000000..8f05984e5d Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/gallery-view-off-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/gallery-view-on-16.png b/share/src/main/webapp/components/documentlibrary/images/gallery-view-on-16.png new file mode 100644 index 0000000000..9f2587a61e Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/gallery-view-on-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/generic-16.png b/share/src/main/webapp/components/documentlibrary/images/generic-16.png new file mode 100644 index 0000000000..a582a1961b Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/generic-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/generic-file-32.png b/share/src/main/webapp/components/documentlibrary/images/generic-file-32.png new file mode 100644 index 0000000000..da8b26ea98 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/generic-file-32.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-arrow-small.png b/share/src/main/webapp/components/documentlibrary/images/help-arrow-small.png new file mode 100644 index 0000000000..20cb05139f Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-arrow-small.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-arrow.png b/share/src/main/webapp/components/documentlibrary/images/help-arrow.png new file mode 100644 index 0000000000..943bbb1b7b Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-arrow.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-drop-folder-target-96.png b/share/src/main/webapp/components/documentlibrary/images/help-drop-folder-target-96.png new file mode 100644 index 0000000000..845918d740 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-drop-folder-target-96.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-drop-list-target-96.png b/share/src/main/webapp/components/documentlibrary/images/help-drop-list-target-96.png new file mode 100644 index 0000000000..cea152e88b Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-drop-list-target-96.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-folder-48.png b/share/src/main/webapp/components/documentlibrary/images/help-folder-48.png new file mode 100644 index 0000000000..18eabe0ff8 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-folder-48.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-new-folder-48.png b/share/src/main/webapp/components/documentlibrary/images/help-new-folder-48.png new file mode 100644 index 0000000000..1321829417 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-new-folder-48.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-upload-48.png b/share/src/main/webapp/components/documentlibrary/images/help-upload-48.png new file mode 100644 index 0000000000..83383904c5 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-upload-48.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/help-upload-96.png b/share/src/main/webapp/components/documentlibrary/images/help-upload-96.png new file mode 100644 index 0000000000..dc79767955 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/help-upload-96.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/info-16.png b/share/src/main/webapp/components/documentlibrary/images/info-16.png new file mode 100644 index 0000000000..38aea2f7cc Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/info-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/link-16.png b/share/src/main/webapp/components/documentlibrary/images/link-16.png new file mode 100644 index 0000000000..49d3d2f775 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/link-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/link-32.png b/share/src/main/webapp/components/documentlibrary/images/link-32.png new file mode 100644 index 0000000000..4168252f75 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/link-32.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/navbar-hide-16.png b/share/src/main/webapp/components/documentlibrary/images/navbar-hide-16.png new file mode 100644 index 0000000000..649c92f175 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/navbar-hide-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/navbar-show-16.png b/share/src/main/webapp/components/documentlibrary/images/navbar-show-16.png new file mode 100644 index 0000000000..a8b218b0b6 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/navbar-show-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/plus-sign-16.png b/share/src/main/webapp/components/documentlibrary/images/plus-sign-16.png new file mode 100644 index 0000000000..88d79cf543 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/plus-sign-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/select-all-16.png b/share/src/main/webapp/components/documentlibrary/images/select-all-16.png new file mode 100644 index 0000000000..055b714c2c Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/select-all-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/select-documents-16.png b/share/src/main/webapp/components/documentlibrary/images/select-documents-16.png new file mode 100644 index 0000000000..fcd1b6b974 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/select-documents-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/select-folders-16.png b/share/src/main/webapp/components/documentlibrary/images/select-folders-16.png new file mode 100644 index 0000000000..65c68bf739 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/select-folders-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/select-invert-16.png b/share/src/main/webapp/components/documentlibrary/images/select-invert-16.png new file mode 100644 index 0000000000..5b5f818a88 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/select-invert-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/select-none-16.png b/share/src/main/webapp/components/documentlibrary/images/select-none-16.png new file mode 100644 index 0000000000..94e76ae0a5 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/select-none-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/show-detail.png b/share/src/main/webapp/components/documentlibrary/images/show-detail.png new file mode 100644 index 0000000000..ebbe6b3f69 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/show-detail.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/simple-view-off-16.png b/share/src/main/webapp/components/documentlibrary/images/simple-view-off-16.png new file mode 100644 index 0000000000..6a2289d33e Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/simple-view-off-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/simple-view-on-16.png b/share/src/main/webapp/components/documentlibrary/images/simple-view-on-16.png new file mode 100644 index 0000000000..93a4c082b0 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/simple-view-on-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-16.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-16.png new file mode 100644 index 0000000000..b296f02470 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-256.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-256.png new file mode 100644 index 0000000000..666a8b5ef1 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-256.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-32.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-32.png new file mode 100644 index 0000000000..3d8ba54170 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-32.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-48.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-48.png new file mode 100644 index 0000000000..fb07a659a9 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-48.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-64.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-64.png new file mode 100644 index 0000000000..dea048afc0 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-64.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-closed-16.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-closed-16.png new file mode 100644 index 0000000000..55283a31f4 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-closed-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-folder-open-16.png b/share/src/main/webapp/components/documentlibrary/images/smart-folder-open-16.png new file mode 100644 index 0000000000..b296f02470 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-folder-open-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/smart-treeview-sprite.gif b/share/src/main/webapp/components/documentlibrary/images/smart-treeview-sprite.gif new file mode 100644 index 0000000000..7699eb6ea6 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/smart-treeview-sprite.gif differ diff --git a/share/src/main/webapp/components/documentlibrary/images/sort-ascending-16.png b/share/src/main/webapp/components/documentlibrary/images/sort-ascending-16.png new file mode 100644 index 0000000000..73ec90c8d8 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/sort-ascending-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/sort-descending-16.png b/share/src/main/webapp/components/documentlibrary/images/sort-descending-16.png new file mode 100644 index 0000000000..f496ec3c17 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/sort-descending-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/table-config.png b/share/src/main/webapp/components/documentlibrary/images/table-config.png new file mode 100644 index 0000000000..18aa3a496e Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/table-config.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/table-view-off-16.png b/share/src/main/webapp/components/documentlibrary/images/table-view-off-16.png new file mode 100644 index 0000000000..81968f74a7 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/table-view-off-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/table-view-on-16.png b/share/src/main/webapp/components/documentlibrary/images/table-view-on-16.png new file mode 100644 index 0000000000..ecf37ad279 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/table-view-on-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/tag-16.png b/share/src/main/webapp/components/documentlibrary/images/tag-16.png new file mode 100644 index 0000000000..176e963815 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/tag-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/thumb-n.png b/share/src/main/webapp/components/documentlibrary/images/thumb-n.png new file mode 100644 index 0000000000..c00cce7dfe Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/thumb-n.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/upload-16.png b/share/src/main/webapp/components/documentlibrary/images/upload-16.png new file mode 100644 index 0000000000..c5eb2b34a1 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/upload-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/upload-disabled-16.png b/share/src/main/webapp/components/documentlibrary/images/upload-disabled-16.png new file mode 100644 index 0000000000..257e09b1a3 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/upload-disabled-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/images/warning-16.png b/share/src/main/webapp/components/documentlibrary/images/warning-16.png new file mode 100644 index 0000000000..7f365bb7c4 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/images/warning-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/active-workflows-16.png b/share/src/main/webapp/components/documentlibrary/indicators/active-workflows-16.png new file mode 100644 index 0000000000..1fc1a7a46f Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/active-workflows-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/cloud-indirect-sync-16.png b/share/src/main/webapp/components/documentlibrary/indicators/cloud-indirect-sync-16.png new file mode 100644 index 0000000000..5fa40ebb13 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/cloud-indirect-sync-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/cloud-indirect-sync-failed-16.png b/share/src/main/webapp/components/documentlibrary/indicators/cloud-indirect-sync-failed-16.png new file mode 100644 index 0000000000..4086016aac Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/cloud-indirect-sync-failed-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/cloud-sync-failed-16.png b/share/src/main/webapp/components/documentlibrary/indicators/cloud-sync-failed-16.png new file mode 100644 index 0000000000..4086016aac Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/cloud-sync-failed-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/cloud-synced-16.png b/share/src/main/webapp/components/documentlibrary/indicators/cloud-synced-16.png new file mode 100644 index 0000000000..1027bfe1d6 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/cloud-synced-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/editing-16.png b/share/src/main/webapp/components/documentlibrary/indicators/editing-16.png new file mode 100644 index 0000000000..6cca482d6c Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/editing-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/exif-16.png b/share/src/main/webapp/components/documentlibrary/indicators/exif-16.png new file mode 100755 index 0000000000..041705bcb5 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/exif-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/geographic-16.png b/share/src/main/webapp/components/documentlibrary/indicators/geographic-16.png new file mode 100644 index 0000000000..9e550668bc Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/geographic-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/lock-owner-16.png b/share/src/main/webapp/components/documentlibrary/indicators/lock-owner-16.png new file mode 100644 index 0000000000..34a88bba9d Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/lock-owner-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/locked-16.png b/share/src/main/webapp/components/documentlibrary/indicators/locked-16.png new file mode 100644 index 0000000000..45cbdf2889 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/locked-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/rules-16.png b/share/src/main/webapp/components/documentlibrary/indicators/rules-16.png new file mode 100755 index 0000000000..935eee83f7 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/rules-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/simple-workflow-16.png b/share/src/main/webapp/components/documentlibrary/indicators/simple-workflow-16.png new file mode 100644 index 0000000000..1fc1a7a46f Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/simple-workflow-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/indicators/transferred-node-16.png b/share/src/main/webapp/components/documentlibrary/indicators/transferred-node-16.png new file mode 100644 index 0000000000..bf2c5acd16 Binary files /dev/null and b/share/src/main/webapp/components/documentlibrary/indicators/transferred-node-16.png differ diff --git a/share/src/main/webapp/components/documentlibrary/repo-toolbar.js b/share/src/main/webapp/components/documentlibrary/repo-toolbar.js new file mode 100644 index 0000000000..a6ccee290a --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/repo-toolbar.js @@ -0,0 +1,132 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Repository DocumentList Toolbar component. + * + * @namespace Alfresco + * @class Alfresco.RepositoryDocListToolbar + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths; + + /** + * RepositoryDocListToolbar constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.RepositoryDocListToolbar} The new DocListToolbar instance + * @constructor + */ + Alfresco.RepositoryDocListToolbar = function(htmlId) + { + return Alfresco.RepositoryDocListToolbar.superclass.constructor.call(this, htmlId); + }; + + /** + * Extend Alfresco.DocListToolbar + */ + YAHOO.extend(Alfresco.RepositoryDocListToolbar, Alfresco.DocListToolbar); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.RepositoryDocListToolbar.prototype, + { + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * File Upload button click handler + * + * @method onFileUpload + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onFileUpload: function RDLTB_onFileUpload(e, p_obj) + { + if (this.fileUpload === null) + { + this.fileUpload = Alfresco.getFileUploadInstance(); + } + + // Show uploader for multiple files + var multiUploadConfig = + { + destination: this.modules.docList.doclistMetadata.parent.nodeRef, + filter: [], + mode: this.fileUpload.MODE_MULTI_UPLOAD, + thumbnails: "doclib", + onFileUploadComplete: + { + fn: this.onFileUploadComplete, + scope: this + } + }; + this.fileUpload.show(multiUploadConfig); + }, + + /** + * File Upload complete event handler + * + * @method onFileUploadComplete + * @param complete {object} Object literal containing details of successful and failed uploads + */ + onFileUploadComplete: function RDLTB_onFileUploadComplete(complete) + { + // Overridden so activity doesn't get posted + }, + + /** + * @method _getRssFeedUrl + * @private + */ + _getRssFeedUrl: function DLTB__getRssFeedUrl() + { + var params = YAHOO.lang.substitute("{type}/node/alfresco/company/home{path}", + { + type: this.modules.docList.options.showFolders ? "all" : "documents", + path: Alfresco.util.encodeURIPath(this.currentPath) + }); + + params += "?filter=" + encodeURIComponent(this.currentFilter.filterId); + if (this.currentFilter.filterData) + { + params += "&filterData=" + encodeURIComponent(this.currentFilter.filterData); + } + params += "&format=rss"; + params += "&libraryRoot=" + encodeURIComponent(this.options.rootNode); + + return Alfresco.constants.URL_FEEDSERVICECONTEXT + "components/documentlibrary/feed/" + params; + } + }, true); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/repo-tree.js b/share/src/main/webapp/components/documentlibrary/repo-tree.js new file mode 100644 index 0000000000..fd5b6efb96 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/repo-tree.js @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Repository DocumentList TreeView component. + * + * @namespace Alfresco + * @class Alfresco.RepositoryDocListTree + */ +(function() +{ + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths; + + /** + * Records DocumentList TreeView constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.RepositoryDocListTree} The new RepositoryDocListTree instance + * @constructor + */ + Alfresco.RepositoryDocListTree = function DLT_constructor(htmlId) + { + return Alfresco.RepositoryDocListTree.superclass.constructor.call(this, htmlId); + }; + + YAHOO.extend(Alfresco.RepositoryDocListTree, Alfresco.DocListTree, + { + /** + * PRIVATE FUNCTIONS + */ + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + */ + _buildTreeNodeUrl: function DLT__buildTreeNodeUrl(path) + { + var url = $combine("slingshot/doclib/treenode/node/alfresco/company/home", Alfresco.util.encodeURIPath(path)); + url += "?perms=false"; + url += "&children=" + this.options.evaluateChildFolders; + url += "&max=" + this.options.maximumFolderCount; + url += "&libraryRoot=" + this.options.rootNode; + + return Alfresco.constants.PROXY_URI + url; + } + }); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/toolbar.css b/share/src/main/webapp/components/documentlibrary/toolbar.css new file mode 100644 index 0000000000..046f90664f --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/toolbar.css @@ -0,0 +1,400 @@ +.toolbar +{ + margin: 0px -10px; + visibility: hidden; +} + +.toolbar .header-bar, +.toolbar .nav-bar +{ + clear: both; + min-height: 1.7em; + padding: 4px 0.5em 9px; +} + +.toolbar .left div, +.toolbar .nav-bar div +{ + float: left; +} + +.toolbar .toolbar-hidden +{ + display: none; +} + +.toolbar .left +{ + float: left; +} + +.toolbar .right +{ + float: right; +} + +.toolbar .right .separator +{ + float: left; +} + +.toolbar .hide-navbar, +.toolbar .rss-feed +{ + float: left; +} + +.toolbar .selected-items li +{ + width: auto; +} + +.toolbar .selected-items li.yuimenuitem-disabled +{ + display: none; +} + +.toolbar .selected-items .yuimenuitemlabel span, +.toolbar .create-content .yuimenuitemlabel span +{ + background-position: 2px 50%; + background-repeat: no-repeat; + cursor: pointer; + display: block; + margin-left: -4px; + min-height: 16px; + padding: 2px 0px 1px 24px; +} + +.toolbar-template-list +{ + max-height: 30em; + overflow-y: auto; +} + +.toolbar .create-content ul div .yuimenuitemlabel span +{ + padding: 2px 0px 1px 2px; +} + +.toolbar .selected-items hr +{ + padding: 0px; +} + +.toolbar .onActionCopyTo +{ + background-image: url(actions/document-copy-to-16.png); +} + +.toolbar .onActionMoveTo +{ + background-image: url(actions/document-move-to-16.png); +} + +.toolbar .onActionDelete +{ + background-image: url(actions/document-delete-16.png); +} + +.toolbar .onActionAssignWorkflow +{ + background-image: url(actions/document-assign-workflow-16.png); +} + +.toolbar .onActionManagePermissions +{ + background-image: url(actions/document-manage-permissions-16.png); +} + +.toolbar .onActionDeselectAll +{ + background-image: url(images/select-none-16.png); +} + +.toolbar .onActionCloudSync +{ + background-image: url(images/document-cloud-sync-16.png); +} + +.toolbar .onActionCloudSyncRequest +{ + background-image: url(images/document-request-sync-16.png); +} + +.toolbar .onActionDownload +{ + background-image: url(actions/document-download-16.png); +} + +/* Navigation Bar */ + +.toolbar .nav-bar +{ + border-top: 1px solid #d9d9d9; + overflow-y: hidden; + padding-bottom: 4px; +} + +.toolbar .nav-bar .breadcrumb +{ + float: none !important; + margin-left: 50px; + padding: 2px 6px 0; +} + +.toolbar .breadcrumb .crumb +{ + border: 1px solid transparent; + font-size: 100%; + line-height: 1.4em; + padding: 1px 2px 1px 0; +} + +.toolbar .breadcrumb a.icon +{ + border: 1px solid transparent; +} + +.xtoolbar .breadcrumb a.icon:active, +.xtoolbar .breadcrumb a.icon:hover, +.xtoolbar .breadcrumb div.highlighted +{ + background-color: #fff; + border: 1px solid #6ca5ce; + text-decoration: none; +} + +.toolbar .breadcrumb div.actions +{ + background-color: #fff; + border: 1px solid #6ca5ce; + clear: left; + margin-left: -22px; + margin-top: 1px; + position: absolute; + width: 200px; +} + +.toolbar .breadcrumb .icon +{ + background-position: 2px 50%; + background-repeat: no-repeat; + margin-left: -1px; + padding: 2px 0 3px 16px; +} + +.toolbar .breadcrumb .filter-path +{ + background-image: url(images/folder-open-16.png); +} + +.toolbar .breadcrumb .filter-category +{ + background-image: url(images/category-16.png); +} + +.toolbar .breadcrumb .label, +.toolbar .breadcrumb .folder +{ + font-weight: normal; + margin-left: 2px; +} + +.toolbar .breadcrumb .separator +{ + border: medium none; + margin: 2px 4px 0 0; + padding: 0.1em 0 0.3em 0.3em; +} + +.toolbar .description +{ + padding: 5px 0.5em; +} + +.toolbar .description div.message +{ + color: #000; + font-size: 108%; +} + +.toolbar .description span.more +{ + color: #515d6b; + margin-left: 0.3em; +} + +/* Header- and Navigation-Bar Buttons */ + +.toolbar .create-content span.first-child, +.toolbar .new-folder span.first-child, +.toolbar .file-upload span.first-child, +.toolbar .sync-to-cloud span.first-child, +.toolbar .unsync-from-cloud span.first-child +{ + background-color: transparent; + background-position: 6px 4px; + background-repeat: no-repeat; + padding-left: 16px; +} + +.toolbar .hide-navbar span.first-child, +.toolbar .rss-feed span.first-child, +.toolbar .folder-up span.first-child +{ + background-position: 50% 50%; + background-repeat: no-repeat; + min-height: 16px; + padding: 0 2px; +} + +.toolbar .rss-feed span.first-child a +{ + padding: 0px 14px; +} + +.toolbar .hide-navbar span.first-child button, +.toolbar .folder-up span.first-child button +{ + padding: 0px 14px; + width: 16px; +} + +.toolbar .create-content ul +{ + min-width: 12em; +} + +.toolbar .create-content span.first-child +{ + background-image: url(images/create-content-16.png); +} + +.toolbar .create-content .yui-button-disabled span.first-child +{ + background-image: url(images/create-content-disabled-16.png); +} + +.toolbar .new-folder span.first-child +{ + background-image: url(images/folder-new-16.png); +} + +.toolbar .new-folder .yui-button-disabled span.first-child +{ + background-image: url(images/folder-new-disabled-16.png); +} + +.toolbar .file-upload span.first-child +{ + background-image: url(images/upload-16.png); +} + +.toolbar .file-upload .yui-button-disabled span.first-child +{ + background-image: url(images/upload-disabled-16.png); +} + +.toolbar .sync-to-cloud ul +{ + min-width: 12em; +} + +.toolbar .unsync-from-cloud ul +{ + min-width: 12em; +} + +.toolbar .sync-to-cloud span.first-child +{ + background-image: url(images/document-cloud-sync-16.png); +} + +.toolbar .unsync-from-cloud span.first-child +{ + background-image: url(images/document-cloud-unsync-16.png); +} + +.toolbar .hide-navbar .yui-button-checked span.first-child +{ + background-image: url(images/navbar-show-16.png); +} + +.toolbar .hide-navbar span.first-child +{ + background-image: url(images/navbar-hide-16.png); +} + +.toolbar .rss-feed span.first-child +{ + background-image: url(images/feed-icon-16.png); +} + +.toolbar .rss-feed .yui-button-disabled span.first-child +{ + background-image: url(images/feed-icon-disabled-16.png); +} + +.toolbar .folder-up span.first-child +{ + background-image: url(images/folder-up-16.png); +} + +.toolbar .folder-up .yui-button-disabled span.first-child +{ + background-image: url(images/folder-up-disabled-16.png); +} + +/* Messages */ + +.toolbar-file-list +{ + max-height: 15em; + overflow-y: auto; + padding: 0.5em; + text-align: left; +} + +.toolbar-file-list span +{ + background-position: 1px 0px; + background-repeat: no-repeat; + display: block; + min-height: 18px; + padding-left: 20px; +} + +.toolbar-file-list span.folder +{ + background-image: url(images/folder-open-16.png); +} + +.toolbar-file-list span.document +{ + background-image: url(images/generic-16.png); +} + +.toolbar .documentDragOverHighlight +{ + outline: 1px solid #4f94c9; + outline-offset: -1px; + background-color: #cde8fa; +} + +.toolbar .documentDragOverArrow +{ + background: url(../images/drop-arrow-left-small.png) no-repeat; + z-index: 1; + height: 25px; + display: block; + position: absolute; + width: 25px; + margin-top: -10px; + margin-left: 10px; +} + +.toolbar .breadcrumb .filter-path.icon-smart { + display: inline; + background: transparent url(../documentlibrary/images/smart-folder-16.png) 0px 4px no-repeat; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/toolbar.js b/share/src/main/webapp/components/documentlibrary/toolbar.js new file mode 100644 index 0000000000..9610fd3087 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/toolbar.js @@ -0,0 +1,1991 @@ +/** + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentList Toolbar component. + * + * @namespace Alfresco + * @class Alfresco.DocListToolbar + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Element = YAHOO.util.Element; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML, + $combine = Alfresco.util.combinePaths, + $siteURL = Alfresco.util.siteURL; + + /** + * Preferences + */ + var PREFERENCES_ROOT = "org.alfresco.share.documentList", + PREF_HIDE_NAVBAR = PREFERENCES_ROOT + ".hideNavBar"; + + /** + * DocListToolbar constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @param {boolean} registerListeners Indicates whether or not to register the listeners + * @return {Alfresco.DocListToolbar} The new DocListToolbar instance + * @constructor + */ + Alfresco.DocListToolbar = function(htmlId, registerListeners) + { + Alfresco.DocListToolbar.superclass.constructor.call(this, "Alfresco.DocListToolbar", htmlId, ["button", "menu", "container"]); + + // Initialise prototype properties + this.selectedFiles = []; + this.currentFilter = {}; + this.dynamicControls = []; + this.doclistMetadata = {}; + this.actionsView = "browse"; + +// // This block allows us to not register listeners if told not to. It has been added +// // to support 4.2 Enterprise changes that require an instance of the toolbar that +// // does not respond to events (but does allow access to the action handling functions). +// if (registerListeners == true || registerListeners === undefined) +// { + // Decoupled event listeners + YAHOO.Bubbling.on("filterChanged", this.onFilterChanged, this); + YAHOO.Bubbling.on("deactivateAllControls", this.onDeactivateAllControls, this); + YAHOO.Bubbling.on("deactivateDynamicControls", this.onDeactivateDynamicControls, this); + YAHOO.Bubbling.on("selectedFilesChanged", this.onSelectedFilesChanged, this); + YAHOO.Bubbling.on("userAccess", this.onUserAccess, this); + YAHOO.Bubbling.on("doclistMetadata", this.onDoclistMetadata, this); + YAHOO.Bubbling.on("showFileUploadDialog", this.onFileUpload, this); + YAHOO.Bubbling.on("dropTargetOwnerRequest", this.onDropTargetOwnerRequest, this); + YAHOO.Bubbling.on("documentDragOver", this.onDocumentDragOver, this); + YAHOO.Bubbling.on("documentDragOut", this.onDocumentDragOut, this); + YAHOO.Bubbling.on("registerAction", this.onRegisterAction, this); + YAHOO.Bubbling.on("docLibTreeLoadComplete", this._generateBreadcrumb, this); +// } + + return this; + }; + + /** + * Extend from Alfresco.component.Base + */ + YAHOO.extend(Alfresco.DocListToolbar, Alfresco.component.Base); + + /** + * Augment prototype with Actions module + */ + YAHOO.lang.augmentProto(Alfresco.DocListToolbar, Alfresco.doclib.Actions); + + /** + * Augment prototype with main class implementation, ensuring overwrite is enabled + */ + YAHOO.lang.augmentObject(Alfresco.DocListToolbar.prototype, + { + /** + * Object container for initialization options + * + * @property options + * @type object + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: null, + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "documentLibrary" + */ + containerId: "documentLibrary", + + /** + * Number of multi-file uploads before grouping the Activity Post + * + * @property groupActivitiesAt + * @type int + * @default 5 + */ + groupActivitiesAt: 5, + + /** + * Flag indicating whether navigation bar is visible or not. + * + * @property hideNavBar + * @type boolean + */ + hideNavBar: false, + + /** + * Whether the Repo Browser is in use or not + * + * @property repositoryBrowsing + * @type boolean + */ + repositoryBrowsing: true, + + /** + * Decides it the title shall be displayed next to the name if it contains a value that is different from the name + * + * @property useTitle + * @type boolean + * @default true + */ + useTitle: true + }, + + /** + * Current path being browsed. + * + * @property currentPath + * @type string + */ + currentPath: "", + + /** + * Current filter to choose toolbar view and populate description. + * + * @property currentFilter + * @type string + */ + currentFilter: null, + + /** + * FileUpload module instance. + * + * @property fileUpload + * @type Alfresco.FileUpload + */ + fileUpload: null, + + /** + * Array of selected states for visible files. + * + * @property selectedFiles + * @type array + */ + selectedFiles: null, + + /** + * Folder Details Url for last breadcrumb + * + * @property folderDetailsUrl + * @type string + */ + folderDetailsUrl: null, + + /** + * Dynamic controls that take part in the deactivateDynamicControls event + * + * @property dynamicControls + * @type array + */ + dynamicControls: null, + + /** + * Metadata returned by doclist data webscript + * + * @property doclistMetadata + * @type object + * @default null + */ + doclistMetadata: null, + + /** + * Fired by YUI when parent element is available for scripting. + * Component initialisation, including instantiation of YUI widgets and event listener binding. + * + * @method onReady + */ + onReady: function DLTB_onReady() + { + if (Dom.get(this.id + "-tb-body") != null) + { + // Create Content menu button + if (Dom.get(this.id + "-createContent-button")) + { + // Create menu button that + this.widgets.createContent = Alfresco.util.createYUIButton(this, "createContent-button", this.onCreateContent, + { + type: "menu", + menu: "createContent-menu", + lazyloadmenu: false, + disabled: true, + value: "CreateChildren" + }); + + // Make sure we load sub menu lazily with data on each click + var createContentMenu = this.widgets.createContent.getMenu(), + groupIndex = 0; + + // MNT-11142 Create menu in the document library not disappearing when clicking outside the menu + createContentMenu.cfg.config.clicktohide.value = true; + // Create content actions + if (this.options.createContentActions.length !== 0) + { + var menuItems = [], menuItem, content, url, config, html, li, folderMenuItem, folderMenuItemIndex; + + for (var i = 0; i < this.options.createContentActions.length; i++) + { + // Create menu item from config + content = this.options.createContentActions[i]; + config = { parent: createContentMenu }; + url = null; + + // Check config type + if (content.type == "javascript") + { + config.onclick = + { + fn: function(eventName, eventArgs, obj) + { + // Copy node so we can safely pass it to an action + var node = Alfresco.util.deepCopy(this.doclistMetadata.parent); + + // Make it more similar to a usual doclib action callback object + var currentFolderItem = { + nodeRef: node.nodeRef, + node: node, + jsNode: new Alfresco.util.Node(node) + }; + this[obj.params["function"]].call(this, currentFolderItem); + }, + obj: content, + scope: this + }; + + url = '#'; + } + else if (content.type == "pagelink") + { + url = $siteURL(content.params.page); + } + else if (content.type == "link") + { + url = content.params.href; + } + + // Create menu item + html = '' + this.msg(content.label) + ''; + li = document.createElement("li"); + li.innerHTML = html; + menuItem = new YAHOO.widget.MenuItem(li, config); + + menuItems.push(menuItem); + + // Store reference to folder info so we can use it for filtering later: + if (content.id && content.id === "folder") + { + folderMenuItem = menuItem; + folderMenuItemIndex = i; + } + } + createContentMenu.addItems(menuItems, groupIndex); + groupIndex++; + } + + // Create content by template menu item + if (this.options.createContentByTemplateEnabled) + { + // Create menu item elements + var li = document.createElement("li"); + li.innerHTML = '' + this.msg("menu.create-content.by-template-node") + ''; + + // Make sure to stop clicks on the sub menu link to close the entire menu + YAHOO.util.Event.addListener(Selector.query("a", li, true), "click", function(e) + { + Event.preventDefault(e); + Event.stopEvent(e); + }); + + // Create placeholder menu + var div = document.createElement("div"); + div.innerHTML = '
      '; + + // + var li2 = document.createElement("li"); + li2.innerHTML = '' + this.msg("menu.create-content.by-template-folder") + ''; + + // Make sure to stop clicks on the sub menu link to close the entire menu + YAHOO.util.Event.addListener(Selector.query("a", li2, true), "click", function(e) + { + Event.preventDefault(e); + Event.stopEvent(e); + }); + + // Create placeholder menu + var div2 = document.createElement("div"); + div2.innerHTML = '
        '; + + // Add menu item + var createContentByTemplate = new YAHOO.widget.MenuItem(li, { + parent: createContentMenu, + submenu: div + }); + + // Add menu item + var createFolderByTemplate = new YAHOO.widget.MenuItem(li2, { + parent: createContentMenu, + submenu: div2 + }); + + createContentMenu.addItems([ createContentByTemplate, createFolderByTemplate], groupIndex); + groupIndex++; + + // Make sure that the available template are lazily loaded + var templateNodesMenus = this.widgets.createContent.getMenu().getSubmenus(), + templateNodesMenu = templateNodesMenus.length > 0 ? templateNodesMenus[0] : null; + if (templateNodesMenu) + { + templateNodesMenu.subscribe("beforeShow", this.onCreateByTemplateNodeBeforeShow, this, true); + templateNodesMenu.subscribe("click", this.onCreateByTemplateNodeClick, this, true); + } + + var templateFoldersMenu = templateNodesMenus.length > 1 ? templateNodesMenus[1] : null; + if (templateFoldersMenu) + { + templateFoldersMenu.subscribe("beforeShow", this.onCreateByTemplateFolderBeforeShow, this, true); + templateFoldersMenu.subscribe("click", this.onCreateByTemplateFolderClick, this, true); + } + } + + createContentMenu.subscribe("beforeShow", this.onCreateContentMenuBeforeShow, { + createContentMenu: createContentMenu, + folderMenuItem: folderMenuItem || null, + folderMenuItemIndex: folderMenuItemIndex || 0, + createFolderByTemplateItem: createFolderByTemplate || null, + createFolderByTemplateItemIndex: 1, + createFolderByTemplateGroupIndex: groupIndex-1, + context: this + }, true); + + // Render menu with all new menu items + createContentMenu.render(); + this.dynamicControls.push(this.widgets.createContent); + } + + // New Folder button: user needs "create" access + this.widgets.newFolder = Alfresco.util.createYUIButton(this, "newFolder-button", this.onNewFolder, + { + disabled: true, + value: "CreateChildren" + }); + this.dynamicControls.push(this.widgets.newFolder); + + // File Upload button: user needs "CreateChildren" access + this.widgets.fileUpload = Alfresco.util.createYUIButton(this, "fileUpload-button", this.onFileUpload, + { + disabled: true, + value: "CreateChildren" + }); + this.dynamicControls.push(this.widgets.fileUpload); + + // Selected Items menu button + this.widgets.selectedItems = Alfresco.util.createYUIButton(this, "selectedItems-button", this.onSelectedItems, + { + type: "menu", + menu: "selectedItems-menu", + lazyloadmenu: false, + disabled: true + }); + this.dynamicControls.push(this.widgets.selectedItems); + + if (Dom.get(this.id + "hideNavBar-button")) + { + // Hide/Show NavBar button + this.widgets.hideNavBar = Alfresco.util.createYUIButton(this, "hideNavBar-button", this.onHideNavBar, + { + type: "checkbox", + checked: !this.options.hideNavBar + }); + if (this.widgets.hideNavBar !== null) + { + this.widgets.hideNavBar.set("title", this.msg(this.options.hideNavBar ? "button.navbar.show" : "button.navbar.hide")); + this.dynamicControls.push(this.widgets.hideNavBar); + } + } + + // Hide or show the nav bar depending on the current settings... + Dom.setStyle(this.id + "-navBar", "display", this.options.hideNavBar ? "none" : "block"); + + // RSS Feed link button + this.widgets.rssFeed = Alfresco.util.createYUIButton(this, "rssFeed-button", null, + { + type: "link" + }); + this.dynamicControls.push(this.widgets.rssFeed); + + // Folder Up Navigation button + this.widgets.folderUp = Alfresco.util.createYUIButton(this, "folderUp-button", this.onFolderUp, + { + disabled: true, + title: this.msg("button.up") + }); + this.dynamicControls.push(this.widgets.folderUp); + + // Finally show the component body here to prevent UI artifacts on YUI button decoration + Dom.setStyle(this.id + "-tb-body", "visibility", "visible"); + } + + // DocLib Actions module + this.modules.actions = new Alfresco.module.DoclibActions(); + + // Reference to Document List component + this.modules.docList = Alfresco.util.ComponentManager.findFirst("Alfresco.DocumentList"); + + // Preferences service + this.services.preferences = new Alfresco.service.Preferences(); + }, + + /** + * YUI WIDGET EVENT HANDLERS + * Handlers for standard events fired from YUI widgets, e.g. "click" + */ + + /** + * Create Content menu click handler for create content menu items (not create by template node menu items) + * + * @method onCreateContent + * @param sType {string} Event type, e.g. "click" + * @param aArgs {array} Arguments array, [0] = DomEvent, [1] = EventTarget + * @param p_obj {object} Object passed back from subscribe method + */ + onCreateContent: function DLTB_onCreateContent(sType, aArgs, p_obj) + { + var eventTarget = aArgs[1], + anchor = eventTarget.element.getElementsByTagName("a")[0]; + + // Make sure a create content menu item was clicked (not a template node) + if (eventTarget.parent === this.widgets.createContent.getMenu() && anchor && anchor.nodeName == "A") + { + anchor.href = YAHOO.lang.substitute(anchor.href, + { + nodeRef: this.doclistMetadata.parent.nodeRef + }); + } + }, + + /** + * Create Content Template Node menu beforeShow handler + * + * @method onCreateByTemplateNodeBeforeShow + */ + onCreateByTemplateNodeBeforeShow: function DLTB_onCreateByTemplateNodeBeforeShow() + { + // Display loading message + var templateNodesMenu = this.widgets.createContent.getMenu().getSubmenus()[0]; + if (templateNodesMenu.getItems().length == 0) + { + templateNodesMenu.clearContent(); + templateNodesMenu.addItem(this.msg("label.loading")); + templateNodesMenu.render(); + + // Load template nodes + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI + "slingshot/doclib/node-templates", + successCallback: + { + fn: function(response, menu) + { + var nodes = response.json.data, + menuItems = [], + name; + for (var i = 0, il = nodes.length; i < il; i++) + { + node = nodes[i]; + name = $html(node.name); + if (node.title && node.title !== node.name && this.options.useTitle) + { + name += '(' + $html(node.title) + ')'; + } + menuItems.push( + { + text: '' + name +'', + value: node + }); + } + if (menuItems.length == 0) + { + menuItems.push(this.msg("label.empty")); + } + templateNodesMenu.clearContent(); + templateNodesMenu.addItems(menuItems); + templateNodesMenu.render(); + }, + scope: this + } + }); + } + }, + + + + /** + * Create Content Template Node sub menu click handler + * + * @method onCreateContentTemplateNode + * @param sType {string} Event type, e.g. "click" + * @param aArgs {array} Arguments array, [0] = DomEvent, [1] = EventTarget + * @param p_obj {object} Object passed back from subscribe method + */ + onCreateByTemplateNodeClick: function DLTB_onCreateContentTemplateNode(sType, aArgs, p_obj) + { + // Create content based on a template + var node = aArgs[1].value, + destination = this.doclistMetadata.parent.nodeRef, + siteId = this.options.siteId; + + // If node is undefined the loading or empty menu items were clicked + if (node) + { + Alfresco.util.Ajax.jsonPost( + { + url: Alfresco.constants.PROXY_URI + "slingshot/doclib/node-templates", + dataObj: + { + sourceNodeRef: node.nodeRef, + parentNodeRef: destination + }, + successCallback: + { + fn: function (response) + { + Alfresco.Share.postActivity(siteId, "org.alfresco.documentlibrary.file-created", "{cm:name}", "document-details?nodeRef=" + response.json.nodeRef, + { + appTool: "documentlibrary", + nodeRef: response.json.nodeRef + }); + // Make sure we get other components to update themselves to show the new content + YAHOO.Bubbling.fire("nodeCreated", + { + name: node.name, + parentNodeRef: destination, + highlightFile: response.json.name + }); + } + }, + successMessage: this.msg("message.create-content-by-template-node.success", node.name), + failureMessage: this.msg("message.create-content-by-template-node.failure", node.name) + }); + } + }, + + /** + * Create Content Template Node menu beforeShow handler + * + * @method onCreateByTemplateFolderBeforeShow + */ + onCreateByTemplateFolderBeforeShow: function DLTB_onCreateByTemplateFolderBeforeShow() + { + // Display loading message + var templateNodesMenu = this.widgets.createContent.getMenu().getSubmenus()[1]; + if (templateNodesMenu.getItems().length == 0) + { + templateNodesMenu.clearContent(); + templateNodesMenu.addItem(this.msg("label.loading")); + templateNodesMenu.render(); + + // Load template nodes + Alfresco.util.Ajax.jsonGet( + { + url: Alfresco.constants.PROXY_URI + "slingshot/doclib/folder-templates", + successCallback: + { + fn: function(response, menu) + { + var nodes = response.json.data, + menuItems = [], + name; + for (var i = 0, il = nodes.length; i < il; i++) + { + node = nodes[i]; + name = $html(node.name); + if (node.title && node.title !== node.name && this.options.useTitle) + { + name += '(' + $html(node.title) + ')'; + } + menuItems.push( + { + text: '' + name +'', + value: node + }); + } + if (menuItems.length == 0) + { + menuItems.push(this.msg("label.empty")); + } + templateNodesMenu.clearContent(); + templateNodesMenu.addItems(menuItems); + templateNodesMenu.render(); + }, + scope: this + } + }); + } + }, + + /** + * Create Content Template Folder sub menu click handler + * + * @method onCreateContentTemplateNode + * @param sType {string} Event type, e.g. "click" + * @param aArgs {array} Arguments array, [0] = DomEvent, [1] = EventTarget + * @param p_obj {object} Object passed back from subscribe method + */ + onCreateByTemplateFolderClick: function DLTB_onCreateContentTemplateFolder(sType, aArgs, p_obj) + { + // Generate the standard "New Folder" dialog but update the XHR configuration to redirect + // the request to the WebScript for copying space templates. The WebScript will update the + // copy with any name, title and description provided. + var dialog = this.onNewFolder(null, p_obj); + dialog.options.doBeforeDialogShow = { + fn: function DLTB_onNewFolderFromTemplate_doBeforeDialogShow(p_form, p_dialog) + { + Dom.get(p_dialog.id + "-dialogTitle").innerHTML = this.title; + Dom.get(p_dialog.id + "-dialogHeader").innerHTML = this.header; + Dom.get(p_dialog.id + "_prop_cm_name").value = this.node.name; + Dom.get(p_dialog.id + "_prop_cm_title").value = this.node.title; + Dom.get(p_dialog.id + "_prop_cm_description").value = this.node.description; + }, + scope: { + node: aArgs[1].value, + title: this.msg("label.new-folder-from-template.title"), + header: this.msg("label.new-folder-from-template.header") + } + }; + dialog.options.successCallback = + { + fn: function (response) + { + // Make sure we get other components to update themselves to show the new content + YAHOO.Bubbling.fire("nodeCreated", + { + name: node.name, + parentNodeRef: destination, + highlightFile: response.json.name + }); + } + }; + dialog.options.successMessage = this.msg("message.create-content-by-template-node.success", node.name); + dialog.options.failureMessage = this.msg("message.create-content-by-template-node.failure", node.name); + dialog.options.doBeforeFormSubmit = { + fn: function DLTB_onNewFolderFromTemplate_doBeforeFormSubmit(form, obj) + { + form.attributes.action.nodeValue = Alfresco.constants.PROXY_URI + "slingshot/doclib/folder-templates"; + }, + scope: this + }; + dialog.options.doBeforeAjaxRequest = { + fn: function DLTB_onNewFolderFromTemplate_doBeforeAjaxRequest(p_config, p_obj) + { + p_config.dataObj.sourceNodeRef = this.node.nodeRef; + p_config.dataObj.parentNodeRef = this.destination; + return true; + }, + scope: { + node: aArgs[1].value, + destination: this.doclistMetadata.parent.nodeRef + } + }; + }, + + /** + * Filter the content menu before we show it + * + * @constructor + */ + onCreateContentMenuBeforeShow: function DLTB_onCreateContentMenuBeforeShow() + { + if (this.createContentMenu && this.folderMenuItem) + { + // If the containing folder is smart, then hide the create folder option. + if (this.context.isVirtualFolder()){ + Dom.addClass(this.folderMenuItem.id, "hidden"); + Dom.addClass(this.createFolderByTemplateItem.id, "hidden"); + } else { + Dom.removeClass(this.folderMenuItem.id, "hidden"); + Dom.removeClass(this.createFolderByTemplateItem.id, "hidden"); + } + } + }, + + /** + * New Folder button click handler + * + * @method onNewFolder + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onNewFolder: function DLTB_onNewFolder(e, p_obj) + { + var destination = this.doclistMetadata.parent.nodeRef; + + // Intercept before dialog show + var doBeforeDialogShow = function DLTB_onNewFolder_doBeforeDialogShow(p_form, p_dialog) + { + Dom.get(p_dialog.id + "-dialogTitle").innerHTML = this.msg("label.new-folder.title"); + Dom.get(p_dialog.id + "-dialogHeader").innerHTML = this.msg("label.new-folder.header"); + }; + + var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&destination={destination}&mode={mode}&submitType={submitType}&formId={formId}&showCancelButton=true", + { + itemKind: "type", + itemId: "cm:folder", + destination: destination, + mode: "create", + submitType: "json", + formId: "doclib-common" + }); + + // Using Forms Service, so always create new instance + var createFolder = new Alfresco.module.SimpleDialog(this.id + "-createFolder"); + + createFolder.setOptions( + { + width: "33em", + templateUrl: templateUrl, + actionUrl: null, + destroyOnHide: true, + doBeforeDialogShow: + { + fn: doBeforeDialogShow, + scope: this + }, + onSuccess: + { + fn: function DLTB_onNewFolder_success(response) + { + var activityData; + var folderName = response.config.dataObj["prop_cm_name"]; + var folderNodeRef = response.json.persistedObject; + + activityData = + { + fileName: folderName, + nodeRef: folderNodeRef, + path: this.currentPath + (this.currentPath !== "/" ? "/" : "") + folderName + }; + this.modules.actions.postActivity(this.options.siteId, "folder-added", "documentlibrary", activityData); + + YAHOO.Bubbling.fire("folderCreated", + { + name: folderName, + parentNodeRef: destination + }); + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.new-folder.success", folderName) + }); + }, + scope: this + }, + onFailure: + { + fn: function DLTB_onNewFolder_failure(response) + { + if (response) + { + var folderName = response.config.dataObj["prop_cm_name"]; + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.new-folder.failure", folderName) + }); + } + else + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.failure") + }); + } + createFolder.widgets.cancelButton.set("disabled", false); + }, + scope: this + } + }); + createFolder.show(); + return createFolder; + }, + + /** + * File Upload button click handler + * + * @method onFileUpload + * @param e {object} DomEvent + * @param p_obj {object|array} Object passed back from addListener method or args from Bubbling event + */ + onFileUpload: function DLTB_onFileUpload(e, p_obj) + { + if (this.fileUpload === null) + { + this.fileUpload = Alfresco.getFileUploadInstance(); + } + + // Show uploader for multiple files + var multiUploadConfig = + { + siteId: this.options.siteId, + containerId: this.options.containerId, + uploadDirectory: this.currentPath, + filter: [], + mode: this.fileUpload.MODE_MULTI_UPLOAD, + thumbnails: "doclib", + onFileUploadComplete: + { + fn: this.onFileUploadComplete, + scope: this + } + }; + this.fileUpload.show(multiUploadConfig); + + if (YAHOO.lang.isArray(p_obj) && p_obj[1].tooltip) + { + var balloon = Alfresco.util.createBalloon(this.fileUpload.uploader.id + "-dialog", + { + html: p_obj[1].tooltip, + width: "30em" + }); + balloon.show(); + + this.fileUpload.uploader.widgets.panel.hideEvent.subscribe(function() + { + balloon.hide() + }); + } + }, + + /** + * Calls the file Upload button click handler but creates an additional tooltip + * with information on Drag-and-Drop as an alternative method for uploading content + * + * @method onFileUploadWithTooltip + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onFileUploadWithTooltip: function DLTB_onFileUploadWithTooltip(e, p_obj) + { + this.onFileUpload(e, p_obj); + }, + + /** + * File Upload complete event handler + * + * @method onFileUploadComplete + * @param complete {object} Object literal containing details of successful and failed uploads + */ + onFileUploadComplete: function DLTB_onFileUploadComplete(complete) + { + var success = complete.successful.length, activityData, file; + if (success > 0) + { + if (success < (this.options.groupActivitiesAt || 5)) + { + // Below cutoff for grouping Activities into one + for (var i = 0; i < success; i++) + { + file = complete.successful[i]; + activityData = + { + fileName: file.fileName, + nodeRef: file.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "file-added", "document-details", activityData); + } + } + else + { + // grouped into one message + activityData = + { + fileCount: success, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "files-added", "documentlibrary", activityData); + } + } + }, + + /** + * Selected Items button click handler + * + * @method onSelectedItems + * @param sType {string} Event type, e.g. "click" + * @param aArgs {array} Arguments array, [0] = DomEvent, [1] = EventTarget + * @param p_obj {object} Object passed back from subscribe method + */ + onSelectedItems: function DLTB_onSelectedItems(sType, aArgs, p_obj) + { + var domEvent = aArgs[0], + eventTarget = aArgs[1]; + + // Check mandatory docList module is present + if (this.modules.docList) + { + // Get the function related to the clicked item + var fn = Alfresco.util.findEventClass(eventTarget); + if (fn && (typeof this[fn] == "function")) + { + this[fn].call(this, this.modules.docList.getSelectedFiles()); + } + } + + Event.preventDefault(domEvent); + }, + + /** + * Delete Multiple Records. + * + * @method onActionDelete + * @param records {object} Object literal representing one or more file(s) or folder(s) to be actioned + */ + onActionDelete: function DLTB_onActionDelete(records) + { + var me = this, + fileNames = []; + + // Handle a single record being provided... + if (typeof records.length === "undefined") + { + records = [records]; + } + for (var i = 0, j = records.length; i < j; i++) + { + fileNames.push("" + $html(records[i].displayName) + ""); + } + + var confirmTitle = this.msg("title.multiple-delete.confirm"), + confirmMsg = this.msg("message.multiple-delete.confirm", records.length); + + confirmMsg += "
        " + fileNames.join("") + "
        "; + + Alfresco.util.PopupManager.displayPrompt( + { + title: confirmTitle, + text: confirmMsg, + noEscape: true, + modal: true, + buttons: [ + { + text: this.msg("button.delete"), + handler: function DLTB_onActionDelete_delete() + { + this.destroy(); + me._onActionDeleteConfirm.call(me, records); + } + }, + { + text: this.msg("button.cancel"), + handler: function DLTB_onActionDelete_cancel() + { + this.destroy(); + }, + isDefault: true + }] + }); + }, + + /** + * Delete Multiple Records confirmed. + * + * @method _onActionDeleteConfirm + * @param records {array} Array containing records to be deleted + * @private + */ + _onActionDeleteConfirm: function DLTB__onActionDeleteConfirm(records) + { + var multipleRecords = [], i, ii; + for (i = 0, ii = records.length; i < ii; i++) + { + multipleRecords.push(records[i].jsNode.nodeRef.nodeRef); + } + + // Success callback function + var fnSuccess = function DLTB__oADC_success(data, records) + { + var result; + var successFileCount = 0; + var successFolderCount = 0; + + // Did the operation succeed? + if (!data.json.overallSuccess) + { + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.multiple-delete.failure") + }); + return; + } + + this.modules.docList.totalRecords -= data.json.totalResults; + YAHOO.Bubbling.fire("filesDeleted"); + + for (i = 0, ii = data.json.totalResults; i < ii; i++) + { + result = data.json.results[i]; + + if (result.success) + { + if (result.type == "folder") + { + successFolderCount++; + } + else + { + successFileCount++; + } + + YAHOO.Bubbling.fire(result.type == "folder" ? "folderDeleted" : "fileDeleted", + { + multiple: true, + nodeRef: result.nodeRef + }); + } + } + + // Activities, in Site mode only + var successCount = successFolderCount + successFileCount; + if (Alfresco.util.isValueSet(this.options.siteId)) + { + var activityData; + + if (successCount > 0) + { + if (successCount < this.options.groupActivitiesAt) + { + // Below cutoff for grouping Activities into one + for (i = 0; i < successCount; i++) + { + activityData = + { + fileName: data.json.results[i].id, + nodeRef: data.json.results[i].nodeRef, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + + if (data.json.results[i].type == "folder") + { + this.modules.actions.postActivity(this.options.siteId, "folder-deleted", "documentlibrary", activityData); + } + else + { + this.modules.actions.postActivity(this.options.siteId, "file-deleted", "documentlibrary", activityData); + } + } + } + else + { + if (successFileCount > 0) + { + // grouped into one message + activityData = + { + fileCount: successFileCount, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "files-deleted", "documentlibrary", activityData); + } + if (successFolderCount > 0) + { + // grouped into one message + activityData = + { + fileCount: successFolderCount, + path: this.currentPath, + parentNodeRef : this.doclistMetadata.parent.nodeRef + }; + this.modules.actions.postActivity(this.options.siteId, "folders-deleted", "documentlibrary", activityData); + } + } + } + } + + Alfresco.util.PopupManager.displayMessage( + { + text: this.msg("message.multiple-delete.success", successCount) + }); + }; + + // Construct the data object for the genericAction call + this.modules.actions.genericAction( + { + success: + { + callback: + { + fn: fnSuccess, + scope: this, + obj: records + } + }, + failure: + { + message: this.msg("message.multiple-delete.failure") + }, + webscript: + { + method: Alfresco.util.Ajax.DELETE, + name: "files" + }, + wait: + { + message: this.msg("message.multiple-delete.please-wait") + }, + config: + { + requestContentType: Alfresco.util.Ajax.JSON, + dataObj: + { + nodeRefs: multipleRecords + } + } + }); + }, + + /** + * Deselect currectly selected records. + * + * @method onActionDeselectAll + */ + onActionDeselectAll: function DLTB_onActionDeselectAll() + { + if (this.modules.docList) + { + this.modules.docList.selectFiles("selectNone"); + } + }, + + /** + * Show/Hide navigation bar button click handler + * + * @method onHideNavBar + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onHideNavBar: function DLTB_onHideNavBar(e, p_obj) + { + this.options.hideNavBar = !this.widgets.hideNavBar.get("checked"); + this.widgets.hideNavBar.set("title", this.msg(this.options.hideNavBar ? "button.navbar.show" : "button.navbar.hide")); + Dom.setStyle(this.id + "-navBar", "display", this.options.hideNavBar ? "none" : "block"); + this.services.preferences.set(PREF_HIDE_NAVBAR, this.options.hideNavBar); + if (e) + { + Event.preventDefault(e); + } + }, + + /** + * Folder Up Navigate button click handler + * + * @method onFolderUp + * @param e {object} DomEvent + * @param p_obj {object} Object passed back from addListener method + */ + onFolderUp: function DLTB_onFolderUp(e, p_obj) + { + var newPath = this.currentPath.substring(0, this.currentPath.lastIndexOf("/")), + filter = this.currentFilter; + + filter.filterData = newPath; + + YAHOO.Bubbling.fire("changeFilter", filter); + Event.preventDefault(e); + }, + + + /** + * BUBBLING LIBRARY EVENT HANDLERS FOR PAGE EVENTS + * Disconnected event handlers for inter-component event notification + */ + + /** + * Filter Changed event handler + * + * @method onFilterChanged + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onFilterChanged: function DLTB_onFilterChanged(layer, args) + { + var obj = args[1]; + if (obj && (typeof obj.filterId !== "undefined")) + { + obj.filterOwner = obj.filterOwner || Alfresco.util.FilterManager.getOwner(obj.filterId); + + if (obj.filterOwner) + { + if (this.currentFilter.filterOwner != obj.filterOwner || this.currentFilter.filterId != obj.filterId) + { + var filterOwner = obj.filterOwner.split(".")[1], + ownerIdClass = filterOwner + "_" + obj.filterId; + + // Obtain array of DIVs we might want to hide + var divs = YAHOO.util.Selector.query('div.hideable', Dom.get(this.id)), div; + for (var i = 0, j = divs.length; i < j; i++) + { + div = divs[i]; + if (Dom.hasClass(div, filterOwner) || Dom.hasClass(div, ownerIdClass)) + { + Dom.removeClass(div, "toolbar-hidden"); + } + else + { + Dom.addClass(div, "toolbar-hidden"); + } + } + } + } + + Alfresco.logger.debug("DLTB_onFilterChanged", "Old Filter", this.currentFilter); + this.currentFilter = Alfresco.util.cleanBubblingObject(obj); + Alfresco.logger.debug("DLTB_onFilterChanged", "New Filter", this.currentFilter); + + if (this.currentFilter.filterId == "path" || this.currentFilter.filterId == "category") + { + this.currentPath = $combine("/", this.currentFilter.filterData); + this._generateBreadcrumb(); + + // Enable/disable the Folder Up button + var paths = this.currentPath.split("/"); + // Check for root path special case + if (this.currentPath === "/") + { + paths = ["/"]; + } + if (this.widgets.folderUp) + { + this.widgets.folderUp.set("disabled", paths.length < 2); + } + } + else + { + this._generateDescription(); + } + this._generateRSSFeedUrl(); + } + }, + + /** + * Deactivate All Controls event handler + * + * @method onDeactivateAllControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateAllControls: function DLTB_onDeactivateAllControls(layer, args) + { + var index, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.widgets) + { + if (this.widgets.hasOwnProperty(index)) + { + fnDisable(this.widgets[index]); + } + } + }, + + /** + * Deactivate Dynamic Controls event handler. + * Only deactivates those controls whose enabled state is evaluated on each update. + * + * @method onDeactivateDynamicControls + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDeactivateDynamicControls: function DLTB_onDeactivateDynamicControls(layer, args) + { + var index, fnDisable = Alfresco.util.disableYUIButton; + for (index in this.dynamicControls) + { + if (this.dynamicControls.hasOwnProperty(index)) + { + fnDisable(this.dynamicControls[index]); + } + } + }, + + /** + * User Access event handler + * + * @method onUserAccess + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onUserAccess: function DLTB_onUserAccess(layer, args) + { + var fnSetWidgetAccess = function DLTB_onUserAccess_fnSetWidgetAccess(p_widget, p_userAccess) + { + var perms, widgetPermissions, orPermissions, permissionTokens, permission, orMatch, isMenuItem = false, fnEnable, fnDisable, shallMatch; + if (p_widget instanceof YAHOO.widget.MenuItem && p_widget.element.firstChild) + { + isMenuItem = true; + // MenuItems have to store permission values in the tag's "rel" attribute + perms = p_widget.element.firstChild.rel; + fnEnable = Alfresco.util.bind(p_widget.cfg.setProperty, p_widget.cfg, "className", ""); + fnDisable = Alfresco.util.bind(p_widget.cfg.setProperty, p_widget.cfg, "className", "hidden"); + } + else + { + // Buttons store the permission value in the "value" config variable + perms = p_widget.get("value"); + fnEnable = Alfresco.util.bind(p_widget.set, p_widget, "disabled", false); + fnDisable = Alfresco.util.bind(p_widget.set, p_widget, "disabled", true); + } + // Default to enabled: disabled via missing permission + fnEnable(); + if (typeof perms == "string" && perms !== "") + { + // Comma-separation indicates "AND" + widgetPermissions = perms.split(","); + for (var i = 0, ii = widgetPermissions.length; i < ii; i++) + { + // Pipe-separation is a special case and indicates an "OR" match. The matched permission is stored in "activePermission" on the widget. + if (widgetPermissions[i].indexOf("|") !== -1) + { + orMatch = false; + orPermissions = widgetPermissions[i].split("|"); + for (var j = 0, jj = orPermissions.length; j < jj; j++) + { + permissionTokens = orPermissions[j].split(":"); + permission = permissionTokens[0]; + shallMatch = permissionTokens.length == 2 ? permissionTokens[1] == "true" : true; + if ((p_userAccess[permission] && shallMatch) || (!p_userAccess[permission] && !shallMatch)) + { + orMatch = true; + if (!isMenuItem) + { + p_widget.set("activePermission", orPermissions[j], true); + } + break; + } + } + if (!orMatch) + { + fnDisable(); + break; + } + } + else + { + permissionTokens = widgetPermissions[i].split(":"); + permission = permissionTokens[0]; + shallMatch = permissionTokens.length == 2 ? permissionTokens[1] == "true" : true; + if ((p_userAccess[permission] && !shallMatch) || (!p_userAccess[permission] && shallMatch)) + { + fnDisable(); + break; + } + } + } + } + }; + + var obj = args[1]; + if (obj && obj.userAccess) + { + var widget, index, menuItems; + for (index in this.widgets) + { + if (this.widgets.hasOwnProperty(index)) + { + widget = this.widgets[index]; + // Skip if this action specifies "no-access-check" + if (widget && widget.get("srcelement").className != "no-access-check" && (!(widget._button != null && widget._button.className == "no-access-check"))) + { + fnSetWidgetAccess(widget, obj.userAccess); + if (widget.getMenu() !== null) + { + menuItems = widget.getMenu().getItems(); + for (var j = 0, jj = menuItems.length; j < jj; j++) + { + fnSetWidgetAccess(menuItems[j], obj.userAccess); + } + } + } + } + } + } + }, + + /** + * Selected Files Changed event handler. + * Determines whether to enable or disable the multi-file action drop-down + * + * @method onSelectedFilesChanged + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onSelectedFilesChanged: function DLTB_onSelectedFilesChanged(layer, args) + { + if (this.modules.docList) + { + var files = this.modules.docList.getSelectedFiles(), fileTypes = [], file, + fileType, userAccess = {}, fileAccess, index, + menuItems = this.widgets.selectedItems == null ? null : this.widgets.selectedItems.getMenu().getItems(), menuItem, + actionPermissions, typeGroups, typesSupported, disabled, + commonAspects = [], allAspects = [], + i, ii, j, jj; + + var fnFileType = function fnFileType(file) + { + return (file.node.isContainer ? "folder" : "document"); + }; + + // Check each file for user permissions + for (i = 0, ii = files.length; i < ii; i++) + { + file = files[i]; + + // Required user access level - logical AND of each file's permissions + fileAccess = file.node.permissions.user; + for (index in fileAccess) + { + if (fileAccess.hasOwnProperty(index)) + { + userAccess[index] = (userAccess[index] === undefined ? fileAccess[index] : userAccess[index] && fileAccess[index]); + } + } + + // Make a note of all selected file types Using a hybrid array/object so we can use both array.length and "x in object" + fileType = fnFileType(file); + if (!(fileType in fileTypes)) + { + fileTypes[fileType] = true; + fileTypes.push(fileType); + } + + // Build a list of common aspects + + + if (i === 0) + { + // first time around fill with aspects from first node - + // NOTE copy so we don't remove aspects from file node. + commonAspects = Alfresco.util.deepCopy(file.node.aspects); + } else + { + // every time after that remove aspect if it isn't present on the current node. + for (j = 0, jj = commonAspects.length; j < jj; j++) + { + if (!Alfresco.util.arrayContains(file.node.aspects, commonAspects[j])) + { + Alfresco.util.arrayRemove(commonAspects, commonAspects[j]) + } + } + } + + // Build a list of all aspects + for (j = 0, jj = file.node.aspects.length; j < jj; j++) + { + if (!Alfresco.util.arrayContains(allAspects, file.node.aspects[j])) + { + allAspects.push(file.node.aspects[j]) + } + } + + } + + // Now go through the menu items, setting the disabled flag appropriately + for (index in menuItems) + { + if (menuItems.hasOwnProperty(index)) + { + // Defaulting to enabled + menuItem = menuItems[index]; + disabled = false; + + if (menuItem.element.firstChild) + { + // Check permissions required - stored in "rel" attribute in the DOM + if (menuItem.element.firstChild.rel && menuItem.element.firstChild.rel !== "") + { + // Comma-separated indicates and "AND" match + actionPermissions = menuItem.element.firstChild.rel.split(","); + for (i = 0, ii = actionPermissions.length; i < ii; i++) + { + // Disable if the user doesn't have ALL the permissions + if (!userAccess[actionPermissions[i]]) + { + disabled = true; + break; + } + } + } + + // Check required aspects. + // Disable if any node DOES NOT have ALL required aspects + var hasAspects = Dom.getAttribute(menuItem.element.firstChild, "data-has-aspects"); + if (hasAspects && hasAspects !== "") + { + hasAspects = hasAspects.split(","); + for (i = 0, ii = hasAspects.length; i < ii; i++) + { + if (!Alfresco.util.arrayContains(commonAspects, hasAspects[i])) + { + disabled = true; + break; + } + } + } + + // Check forbidden aspects. + // Disable if any node DOES have ANY forbidden aspect + var notAspects = Dom.getAttribute(menuItem.element.firstChild, "data-not-aspects"); + if (notAspects && notAspects !=="") + { + notAspects = notAspects.split(","); + for (i = 0, ii = notAspects.length; i < ii; i++) + { + if(Alfresco.util.arrayContains(allAspects, notAspects[i])) + { + disabled = true; + break; + } + } + } + + if (!disabled) + { + // Check filetypes supported + if (menuItem.element.firstChild.type && menuItem.element.firstChild.type !== "") + { + // Pipe-separation indicates grouping of allowed file types + typeGroups = menuItem.element.firstChild.type.split("|"); + + for (i = 0; i < typeGroups.length; i++) // Do not optimize - bounds updated within loop + { + typesSupported = Alfresco.util.arrayToObject(typeGroups[i].split(",")); + + for (j = 0, jj = fileTypes.length; j < jj; j++) + { + if (!(fileTypes[j] in typesSupported)) + { + typeGroups.splice(i, 1); + --i; + break; + } + } + } + disabled = (typeGroups.length === 0); + } + } + menuItem.cfg.setProperty("disabled", disabled); + } + } + } + if (this.widgets.selectedItems != null) + { + this.widgets.selectedItems.set("disabled", (files.length === 0)); + } + } + }, + + /** + * Document List Metadata event handler + * NOTE: This is a temporary fix to enable access to the View Details action from the breadcrumb. + * A more complete solution is to present the full list of parent folder actions. + * + * @method onDoclistMetadata + * @param layer {object} Event fired + * @param args {array} Event parameters (depends on event type) + */ + onDoclistMetadata: function DLTB_onDoclistMetadata(layer, args) + { + var obj = args[1]; + this.folderDetailsUrl = null; + if (obj && obj.metadata) + { + this.doclistMetadata = Alfresco.util.deepCopy(obj.metadata); + if (obj.metadata.parent && obj.metadata.parent.nodeRef) + { + this.folderDetailsUrl = $siteURL("folder-details?nodeRef=" + obj.metadata.parent.nodeRef); + } + } + }, + + /** + * Handles "dropTargetOwnerRequest" by determining whether or not the target belongs to the breacrumb + * trail, and if it does determines it's path and uses it with the container nodeRef on the callback + * function. + * + * @method onDropTargetOwnerRequest + * @property layer The name of the event + * @property args The event payload + */ + onDropTargetOwnerRequest: function DLTB_onDropTargetOwnerRequest(layer, args) + { + if (args && args[1] && args[1].elementId) + { + var crumb = Dom.get(args[1].elementId); + var trail = Dom.get(this.id + "-breadcrumb"); + if (Dom.isAncestor(trail, crumb)) + { + // The current element is part of the breadcrumb trail. + // Calculate the path by working out its index within the breadcrumb trail + // and then apply that to the path (remembering to compensate for the SPAN + // elements that just contain the ">" separators ! + var targetPath = ""; + var paths = this.currentPath.split("/"); + for (var i = 0, j = trail.children.length; i < j; i++) + { + if (i % 2 == 0) + { + // Only use the current index if it's even (odd indexes indicate + // the SPAN containing the ">" separator character... + targetPath = targetPath + "/" + paths[i/2]; + } + + // If we've reached the target element then break out of the loop... + if (crumb == trail.children[i]) + { + break; + } + } + + // Use the callback method with a nodeRef built from the the container nodeRef + // concatonated with the constructed path... + var nodeRef = this.doclistMetadata.container + targetPath; + args[1].callback.call(args[1].scope, nodeRef, targetPath); + } + } + }, + + /** + * Handles applying the styling and node creation required when a document is dragged + * over a tree node. + * + * @method onDocumentDragOver + * @property layer The name of the event + * @property args The event payload + */ + onDocumentDragOver: function DLTB_onDocumentDragOver(layer, args) + { + if (args && args[1] && args[1].elementId) + { + var crumb = Dom.get(args[1].elementId); + var trail = Dom.get(this.id + "-breadcrumb"); + if (Dom.isAncestor(trail, crumb)) + { + Dom.addClass(crumb, "documentDragOverHighlight"); + var firstCrumbChild = Dom.getFirstChild(crumb); + if (firstCrumbChild != null && firstCrumbChild.tagName != "SPAN") + { + var arrow = document.createElement("span"); + Dom.addClass(arrow, "documentDragOverArrow"); + Dom.insertBefore(arrow, firstCrumbChild); + } + } + } + }, + + /** + * Handles applying the styling and node deletion required when a document is dragged + * out of a tree node. + * + * @method onDocumentDragOut + * @property layer The name of the event + * @property args The event payload + */ + onDocumentDragOut: function DLTB_onDocumentDragOut(layer, args) + { + if (args && args[1] && args[1].elementId) + { + var crumb = Dom.get(args[1].elementId); + var trail = Dom.get(this.id + "-breadcrumb"); + if (Dom.isAncestor(trail, crumb)) + { + Dom.removeClass(crumb, "documentDragOverHighlight"); + var firstCrumbChild = Dom.getFirstChild(crumb); + if (firstCrumbChild != null && firstCrumbChild.tagName == "SPAN") + { + crumb.removeChild(firstCrumbChild); + } + } + } + }, + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Generates the HTML mark-up for the breadcrumb from the currentPath + * + * @method _generateBreadcrumb + * @private + */ + _generateBreadcrumb: function DLTB__generateBreadcrumb() + { + var divBC = Dom.get(this.id + "-breadcrumb"); + if (divBC === null) + { + return; + } + divBC.innerHTML = ""; + + var paths = this.currentPath.split("/"); + // Check for root path special case + if (this.currentPath === "/") + { + paths = ["/"]; + } + // Clone the array and re-use the root node name from the DocListTree + var me = this, + displayPaths = paths.concat(); + + displayPaths[0] = Alfresco.util.message("node.root", this.currentFilter.filterOwner); + + var fnCrumbIconClick = function DLTB__fnCrumbIconClick(e, path) + { + Dom.addClass(e.target.parentNode, "highlighted"); + Event.stopEvent(e); + }; + + var fnBreadcrumbClick = function DLTB__fnBreadcrumbClick(e, path) + { + var filter = me.currentFilter; + filter.filterData = path; + + YAHOO.Bubbling.fire("changeFilter", filter); + Event.stopEvent(e); + }; + + var eBreadcrumb = new Element(divBC), + newPath, + eCrumb, + eIcon, + eFolder, + DocListTree = Alfresco.util.ComponentManager.findFirst("Alfresco.DocListTree"), + selectedNode; + + // Fetch Selected Node from tree view if possible. + // This is used to annotate the breadcrumb with icons without having to do a recursive query for node metadata + if (DocListTree && DocListTree.selectedNode) + { + selectedNode = DocListTree.selectedNode; + } + + /** + * Fetch the class used in the DocListTree. + * @param levels + */ + var fnGetClass = function DLTB__fnGetClass(levels) + { + if (!selectedNode) + { + return; + } + + var queryNode = selectedNode; + if (levels) + { + for (var k = levels; k > 1;k--) + { + if (queryNode.parent) + { + queryNode = queryNode.parent; + } + } + } + + return queryNode.customCls; + }; + + for (var i = 0, j = paths.length; i < j; ++i) + { + newPath = paths.slice(0, i+1).join("/"); + eCrumb = new Element(document.createElement("div")); + eCrumb.addClass("crumb"); + eCrumb.addClass("documentDroppable"); // This class allows documents to be dropped onto the element + eCrumb.addClass("documentDroppableHighlights"); // This class allows drag over/out events to be processed + + // First crumb doesn't get an icon + if (i > 0) + { + eIcon = new Element(document.createElement("a"), + { + href: "#", + innerHTML: " " + }); + eIcon.on("click", fnBreadcrumbClick, newPath); + eIcon.addClass("icon"); + eIcon.addClass("filter-" + $html(this.currentFilter.filterId)); + eIcon.addClass(fnGetClass(j - i)); + eCrumb.appendChild(eIcon); + } + + // Last crumb is rendered as a link if folderDetailsUrl is available (via doclistMetadata) + if (j - i < 2) + { + eFolder = new Element(document.createElement("span"), + { + innerHTML: (this.folderDetailsUrl) ? '' + $html(displayPaths[i]) + '' : $html(displayPaths[i]) + }); + eFolder.addClass("label"); + eCrumb.appendChild(eFolder); + eBreadcrumb.appendChild(eCrumb); + } + else + { + eFolder = new Element(document.createElement("a"), + { + href: "", + innerHTML: $html(displayPaths[i]) + }); + eFolder.addClass("folder"); + eFolder.on("click", fnBreadcrumbClick, newPath); + eCrumb.appendChild(eFolder); + eBreadcrumb.appendChild(eCrumb); + eBreadcrumb.appendChild(new Element(document.createElement("div"), + { + innerHTML: ">", + className: "separator" + })); + } + } + + var rootEl = Dom.get(this.id + "-breadcrumb"); + var dndTargets = Dom.getElementsByClassName("crumb", "div", rootEl); + for (var i = 0, j = dndTargets.length; i < j; i++) + { + new YAHOO.util.DDTarget(dndTargets[i]); + } + }, + + /** + * Generates the HTML mark-up for the description from the currentFilter + * + * @method _generateDescription + * @private + */ + _generateDescription: function DLTB__generateDescription() + { + var divDesc, eDivDesc, eDescMsg, eDescMore, filterDisplay; + + divDesc = Dom.get(this.id + "-description"); + if (divDesc === null) + { + return; + } + + while (divDesc.hasChildNodes()) + { + divDesc.removeChild(divDesc.lastChild); + } + + // If filterDisplay is provided, then use that instead (e.g. for cases where filterData is a nodeRef) + filterDisplay = typeof this.currentFilter.filterDisplay !== "undefined" ? this.currentFilter.filterDisplay : (this.currentFilter.filterData || ""); + + eDescMsg = new Element(document.createElement("div"), + { + innerHTML: this.msg("description." + $html(this.currentFilter.filterId), filterDisplay) + }); + eDescMsg.addClass("message"); + + // If filterData is populated and a ".more.filterData" i18n message exists, then use that + var i18n = "description." + $html(this.currentFilter.filterId) + ".more", + i18nAlt = i18n + ".filterDisplay"; + + if (filterDisplay !== "" && this.msg(i18nAlt) !== i18nAlt) + { + i18n = i18nAlt; + } + + eDescMore = new Element(document.createElement("span"), + { + innerHTML: this.msg(i18n, $html(filterDisplay)) + }); + eDescMore.addClass("more"); + + eDescMsg.appendChild(eDescMore); + eDivDesc = new Element(divDesc); + eDivDesc.appendChild(eDescMsg); + }, + + /** + * @method _getRssFeedUrl + * @private + */ + _getRssFeedUrl: function DLTB__getRssFeedUrl() + { + var params = YAHOO.lang.substitute("{type}/site/{site}/{container}" + + (this.currentFilter.filterId === "path" ? (this.currentPath !== "/" ? "{path}" : "") : ""), + { + type: this.modules.docList.options.showFolders ? "all" : "documents", + site: encodeURIComponent(this.options.siteId), + container: encodeURIComponent(this.options.containerId), + path: Alfresco.util.encodeURIPath(this.currentPath) + }); + + params += "?filter=" + encodeURIComponent(this.currentFilter.filterId); + if (this.currentFilter.filterData) + { + params += "&filterData=" + encodeURIComponent(this.currentFilter.filterData); + } + params += "&format=rss"; + + return Alfresco.constants.URL_FEEDSERVICECONTEXT + "components/documentlibrary/feed/" + params; + }, + + /** + * Generates the HTML mark-up for the RSS feed link + * + * @method _generateRSSFeedUrl + * @private + */ + _generateRSSFeedUrl: function DLTB__generateRSSFeedUrl() + { + if (this.widgets.rssFeed && this.modules.docList) + { + var href = this._getRssFeedUrl(); + this.widgets.rssFeed.set("href", href); + Alfresco.util.enableYUIButton(this.widgets.rssFeed); + } + }, + + /** + * Is the currently displayed folder a smart one? + * + * @returns Boolean + */ + isVirtualFolder: function DLTB_isVirtualFolder() + { + var parentAspects = Alfresco.util.findValueByDotNotation(this, "doclistMetadata.parent.aspects"), + isVirtualFolder = Alfresco.util.arrayContains(parentAspects, "smf:smartFolder"); + + return isVirtualFolder; + + } + }, true); +})(); \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/tree.css b/share/src/main/webapp/components/documentlibrary/tree.css new file mode 100644 index 0000000000..327f23a777 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/tree.css @@ -0,0 +1,109 @@ +.treeview +{ + margin-right: 5px; +} + +.treeview .tree +{ + display: none; + padding: 0.5em 0 0; +} + +.treeview .ygtvspacer +{ + display: block; + width: 18px; +} + +.treeview .ygtvchildren +{ + width: 100%; +} + +.treeview .ygtvitem +{ + background-color: #ffffff; + overflow-x: hidden; +} + +.treeview .ygtvitem .folders-trimmed +{ + color: #f00; +} + +.treeview .ygtvlabel, +.treeview .ygtvlabel:link, +.treeview .ygtvlabel:visited, +.treeview .ygtvlabel:hover +{ + background: none; + color: #000; + white-space: nowrap; +} + +.treeview .selected +{ + background-color: #e1f0fa; +} + +.treeview .ygtvtable +{ + border: 1px solid transparent; +} + +.treeview .ygtvcontent +{ + padding-left: 2px; + padding-bottom: 0px; +} + +.treeview .documentDragOverHighlight +{ + border: 1px solid #4f94c9; + background-color: #cde8fa; + width: 100%; +} + +.treeview .documentDragOverArrow +{ + background: url(../images/drop-arrow-left-small.png) no-repeat; + z-index: 1; + height: 25px; + display: block; + position: absolute; + width: 25px; + margin-top: -30px; + margin-left: 10px; +} + +.icon-smart +{ + display: block; + height: 22px; + padding-left: 20px; + background: transparent + url(../documentlibrary/images/smart-folder-16.png) 0 0px no-repeat; +} + +.icon-smartn +{ + width: 18px; + height: 22px; + background: url(../documentlibrary/images/smart-treeview-sprite.gif) 0 -5600px no-repeat; + cursor: pointer; +} + +.icon-smartm +{ + width: 18px; + height: 22px; + cursor: pointer; + background: url(../documentlibrary/images/smart-treeview-sprite.gif) 0 -4000px no-repeat; +} + +.icon-smartp{ + width: 18px; + height: 22px; + cursor: pointer; + background: url(../documentlibrary/images/smart-treeview-sprite.gif) 0 -6400px no-repeat; +} \ No newline at end of file diff --git a/share/src/main/webapp/components/documentlibrary/tree.js b/share/src/main/webapp/components/documentlibrary/tree.js new file mode 100644 index 0000000000..2ca18678a6 --- /dev/null +++ b/share/src/main/webapp/components/documentlibrary/tree.js @@ -0,0 +1,1160 @@ +/** + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * DocumentList TreeView component. + * + * @namespace Alfresco + * @class Alfresco.DocListTree + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $combine = Alfresco.util.combinePaths; + + /** + * DocumentList TreeView constructor. + * + * @param {String} htmlId The HTML id of the parent element + * @return {Alfresco.DocListTree} The new DocListTree instance + * @constructor + */ + Alfresco.DocListTree = function DLT_constructor(htmlId) + { + Alfresco.DocListTree.superclass.constructor.call(this, "Alfresco.DocListTree", htmlId, ["treeview", "json"]); + + // Path filterId + this.filterId = "path"; + + // Register with Filter Manager + Alfresco.util.FilterManager.register(this.name, this.filterId); + + // Initialise prototype properties + this.currentFilter = {}; + this.pathsToExpand = []; + + // Decoupled event listeners + YAHOO.Bubbling.on("folderCopied", this.onFolderCopied, this); + YAHOO.Bubbling.on("folderCreated", this.onFolderCreated, this); + YAHOO.Bubbling.on("folderDeleted", this.onFolderDeleted, this); + YAHOO.Bubbling.on("folderMoved", this.onFolderMoved, this); + YAHOO.Bubbling.on("folderRenamed", this.onFolderRenamed, this); + YAHOO.Bubbling.on("filterChanged", this.onFilterChanged, this); + YAHOO.Bubbling.on("dropTargetOwnerRequest", this.onDropTargetOwnerRequest, this); + YAHOO.Bubbling.on("documentDragOver", this.onDocumentDragOver, this); + YAHOO.Bubbling.on("documentDragOut", this.onDocumentDragOut, this); + + return this; + }; + + YAHOO.extend(Alfresco.DocListTree, Alfresco.component.Base, + { + /** + * Object container for initialization options + */ + options: + { + /** + * Current siteId. + * + * @property siteId + * @type string + */ + siteId: "", + + /** + * ContainerId representing root container + * + * @property containerId + * @type string + * @default "documentLibrary" + */ + containerId: "documentLibrary", + + /** + * Evaluate child folders flag + * + * @property evaluateChildFolders + * @type boolean + * @default true + */ + evaluateChildFolders: true, + + /** + * Maximum folder count configuration setting + * + * @property maximumFolderCount + * @type int + * @default -1 + */ + maximumFolderCount: -1, + + /** + * Indicates whether or not to set each tree node as a YUI Drag and Drop + * target. + * + * @property setDropTargets + * @type boolean + * @default false + */ + setDropTargets: false, + + customFolderStyleConfig: null + }, + + /** + * Flag set after TreeView instantiated. + * + * @property isReady + * @type boolean + */ + isReady: false, + + /** + * Initial filter on page load. + * + * @property initialFilter + * @type string + */ + initialFilter: null, + + /** + * Current path being browsed. + * + * @property currentPath + * @type string + */ + currentPath: "", + + /** + * Currently active filter + * + * @property currentFilter + * @type object + */ + currentFilter: null, + + /** + * Tracks if this component is the active filter owner. + * + * @property isFilterOwner + * @type boolean + */ + isFilterOwner: false, + + /** + * Paths we have to expand as a result of a deep navigation event. + * + * @property pathsToExpand + * @type array + */ + pathsToExpand: null, + + /** + * Selected tree node. + * + * @property selectedNode + * @type {YAHOO.widget.Node} + */ + selectedNode: null, + + /** + * Fired by YUI when parent element is available for scripting + * @method onReady + */ + onReady: function DLT_onReady() + { + // Reference to self - used in inline functions + var me = this; + + // Create twister from our H2 tag + Alfresco.util.createTwister(this.id + "-h2", this.name.substring(this.name.lastIndexOf(".") + 1)); + + /** + * Dynamically loads TreeView nodes. + * This MUST be inline in order to have access to the Alfresco.DocListTree class. + * @method fnLoadNodeData + * @param node {object} Parent node + * @param fnLoadComplete {function} Expanding node's callback function + */ + this.fnLoadNodeData = function DLT_oR_fnLoadNodeData(node, fnLoadComplete) + { + // Get the path this node refers to + var nodePath = node.data.path; + + // Prepare URI for XHR data request + var uri = me._buildTreeNodeUrl.call(me, nodePath); + + // Prepare the XHR callback object + var callback = + { + success: function DLT_lND_success(oResponse) + { + var results = YAHOO.lang.JSON.parse(oResponse.responseText), item, treeNode; + + // Update parent node's nodeRef if we didn't have it before + if (results.parent && node.data.nodeRef.length === 0) + { + node.data.nodeRef = results.parent.nodeRef; + } + + if (results.items) + { + for (var i = 0, j = results.items.length; i < j; i++) + { + item = results.items[i]; + item.path = $combine(nodePath, item.name); + treeNode = this._buildTreeNode(item, node, false); + + if (!item.hasChildren) + { + treeNode.isLeaf = true; + } + } + } + + if (results.resultsTrimmed) + { + tempNode = new YAHOO.widget.TextNode( + { + label: "<" + this.msg("message.folders-trimmed", results.items.length) + ">", + hasIcon: false, + style: "folders-trimmed" + }, node, false); + } + + /** + * Execute the node's loadComplete callback method which comes in via the argument + * in the response object + */ + oResponse.argument.fnLoadComplete(); + + YAHOO.Bubbling.fire("docLibTreeLoadComplete"); + }, + + // If the XHR call is not successful, fire the TreeView callback anyway + failure: function DLT_lND_failure(oResponse) + { + if (oResponse.status == 401) + { + // Our session has likely timed-out, so refresh to offer the login page + window.location.reload(); + } + else + { + try + { + var response = YAHOO.lang.JSON.parse(oResponse.responseText); + + // Get the "Documents" node + var rootNode = this.widgets.treeview.getRoot(); + var docNode = rootNode.children[0]; + docNode.isLoading = false; + docNode.isLeaf = true; + if (oResponse.status == 403) + { + docNode.label = this.msg("message.refresh.failure.forbidden"); + } + else + { + docNode.label = response.message; + docNode.labelStyle = "ygtverror"; + } + rootNode.refresh(); + } + catch(e) + { + } + } + }, + + // Callback function scope + scope: me, + + // XHR response argument information + argument: + { + "node": node, + "fnLoadComplete": fnLoadComplete + } + }; + + // Make the XHR call using Connection Manager's asyncRequest method + YAHOO.util.Connect.asyncRequest('GET', uri, callback); + }; + + // Build the TreeView widget + this._buildTree(); + + this.isReady = true; + if (this.initialFilter !== null) + { + // We weren't ready for the first filterChanged event, so fake it here + this.onFilterChanged("filterChanged", + [ + null, + this.initialFilter + ]); + } + }, + + /** + * Handles "dropTargetOwnerRequest" by determining whether or not the target belongs to the TreeView + * widget, and if it does determines it's nodeRef and uses the callback function with it. + * + * @method onDropTargetOwnerRequest + * @property layer The name of the event + * @property args The event payload + */ + onDropTargetOwnerRequest: function DLT_onDropTargetOwnerRequest(layer, args) + { + if (args && args[1] && args[1].elementId) + { + var node = this.widgets.treeview.getNodeByElement(Dom.get(args[1].elementId)); + if (node != null) + { + // Perform the drag out to clear the highlight... + this.onDocumentDragOut(layer, args); + + var nodeRef = node.data.nodeRef; + var path = node.data.path; + args[1].callback.call(args[1].scope, nodeRef, path); + } + } + }, + + /** + * Handles applying the styling and node creation required when a document is dragged + * over a tree node. + * + * @method onDocumentDragOver + * @property layer The name of the event + * @property args The event payload + */ + onDocumentDragOver: function DLTB_onDocumentDragOver(layer, args) + { + if (args && args[1] && args[1].elementId) + { + var rootEl = this.widgets.treeview.getEl(); + if (args[1].event.clientX > rootEl.clientWidth) + { + // If the current x co-ordinate of the mouse pointer is greater than the width + // of the tree element then we shouldn't add a highlight. This is to address + // the issue where the overflow of wide tree nodes is hidden behind the + // document list. Without this test it is possible to show a highlight on + // a tree node when it appears as though the mouse is not over it. + } + else + { + // The current x co-ordinate of the mouse pointer is within the tree element so + // the node can be highlighted... + var dropTargetEl = Dom.get(args[1].elementId); + if (dropTargetEl != this.widgets.treeview.getEl()) + { + var node = this.widgets.treeview.getNodeByElement(dropTargetEl); + if (node != null) + { + var currEl = dropTargetEl; + while (currEl.tagName != "TABLE") + { + currEl = currEl.parentNode; + } + Dom.addClass(currEl, "documentDragOverHighlight"); + + var folderCell = dropTargetEl.children[dropTargetEl.children.length - 2]; + while (folderCell.children.length == 1) + { + var arrowSpan = document.createElement("span"); + Dom.addClass(arrowSpan, "documentDragOverArrow"); + folderCell.appendChild(arrowSpan); + } + } + } + } + } + }, + + /** + * Handles applying the styling and node deletion required when a document is dragged + * out of a tree node. + * + * @method onDocumentDragOut + * @property layer The name of the event + * @property args The event payload + */ + onDocumentDragOut: function DLTB_onDocumentDragOut(layer, args) + { + if (args && args[1] && args[1].elementId) + { + var dropTargetEl = Dom.get(args[1].elementId); + if (dropTargetEl == this.widgets.treeview.getEl()) + { + // If the document has been dragged out of the tree element then we need + // to remove any highlight and arrow from previously highlighted tree nodes. + // This would be the case if the highlighted tree node is wider than the + // tree element and the mouse has moved to the right of the splitter so is + // outside of the tree but still over the tree node... + var highlights = Dom.getElementsByClassName("documentDragOverHighlight", "table", dropTargetEl); // Should be only one + for (var i = 0, j = highlights.length; i < j ; i++) + { + Dom.removeClass(highlights[i], "documentDragOverHighlight"); + } + var arrows = Dom.getElementsByClassName("documentDragOverArrow", "span", dropTargetEl); + for (var i = 0, j = arrows.length; i < j ; i++) + { + arrows[i].parentNode.removeChild(arrows[i]); + } + } + else + { + // If the document has been dragged out of a tree node then we need to + // remove the highlight and arrow previously added when the document was + // dragged over it... + var node = this.widgets.treeview.getNodeByElement(dropTargetEl); + if (node != null) + { + var currEl = dropTargetEl; + while (currEl.tagName != "TABLE") + { + currEl = currEl.parentNode; + } + Dom.removeClass(currEl, "documentDragOverHighlight"); + var folderCell = dropTargetEl.children[dropTargetEl.children.length - 2]; + while (folderCell.children.length > 1) + { + folderCell.removeChild(Dom.getLastChild(folderCell)); + } + } + } + } + }, + + /** + * Fired by YUI TreeView when a node has finished expanding + * @method onExpandComplete + * @param oNode {YAHOO.widget.Node} the node recently expanded + */ + onExpandComplete: function DLT_onExpandComplete(oNode) + { + // Make sure the tree's Dom has been updated + this.widgets.treeview.render(); + + // Redrawing the tree will clear the highlight + if (this.isFilterOwner) + { + this._showHighlight(true); + } + + if (this.pathsToExpand && this.pathsToExpand.length > 0) + { + var node = this.widgets.treeview.getNodeByProperty("path", this.pathsToExpand.shift()); + if (node !== null) + { + if (node.data.path == this.currentPath) + { + this._updateSelectedNode(node); + } + Alfresco.logger.debug("node.expand: DLT_onExpandComplete"); + node.expand(); + } + } + else if (this.initialFilter !== null) + { + // We missed the filterChanged event, so fake it here + this.onFilterChanged("filterChanged", + [ + null, + { + filterId: this.initialFilter.filterId, + filterOwner: this.initialFilter.filterOwner, + filterData: this.initialFilter.filterData + } + ]); + this.initialFilter = null; + } + else + { + // Finished expanding, can now safely set DND targets... + this._applyDropTargets(); + } + }, + + /** + * Creates the drag and drop targets within the tree. The targets get removed + * each time that the tree is refreshed in anyway, so it is imperative that they + * get reset when required. + * + * @method _applyDropTargets + */ + _applyDropTargets: function DLT__applyDropTargets() + { + if (this.options.setDropTargets) + { + var rootEl = this.widgets.treeview.getEl(); + + // Set the root element of the tree as a drop target. This is necessary in order + // to handle the specific problem of the hidden overflow of tree nodes being at + // the same location of the screen as the main DocumentList drop targets. Drop events + // will be ignored for this element, but dragOut events will be used to ensure that + // all tree highlights are cleared. + new YAHOO.util.DDTarget(rootEl); + Dom.addClass(rootEl, "documentDroppableHighlights"); + + var dndTargets = Dom.getElementsByClassName("ygtvrow", "tr", rootEl); + for (var i = 0, j = dndTargets.length; i < j; i++) + { + new YAHOO.util.DDTarget(dndTargets[i]); + Dom.addClass(dndTargets[i], "documentDroppable"); + Dom.addClass(dndTargets[i], "documentDroppableHighlights"); + } + } + }, + + /** + * Fired by YUI TreeView when a node label is clicked + * @method onNodeClicked + * @param args.event {HTML Event} the event object + * @param args.node {YAHOO.widget.Node} the node clicked + * @return allowExpand {boolean} allow or disallow node expansion + */ + onNodeClicked: function DLT_onNodeClicked(args) + { + var node = args.node; + + if (this.isFilterOwner && node == this.selectedNode) + { + YAHOO.Bubbling.fire("metadataRefresh"); + } + else + { + this._updateSelectedNode(node); + + // Fire the change filter event + YAHOO.Bubbling.fire("changeFilter", + { + filterOwner: this.name, + filterId: this.filterId, + filterData: node.data.path + }); + } + + Event.stopEvent(args.event); + // Prevent the tree node from expanding (TODO: user preference?) + return false; + }, + + /** + * Path changed handler + * @method pathChanged + * @param path {string} New path + * @param flags {object} Logic control flags + */ + pathChanged: function DLT_pathChanged(path, flags) + { + // ensure path starts with leading slash + path = $combine("/", path); + this.currentPath = path; + + // Search the tree to see if this path's node is expanded + var node = this.widgets.treeview.getNodeByProperty("path", path); + if (node !== null) + { + // Node found + this._updateSelectedNode(node); + if (!node.expanded) + { + Alfresco.logger.debug("node.expand: DLT_pathChanged", path); + node.expand(); + } + while (node.parent !== null) + { + node = node.parent; + if (!node.expanded) + { + Alfresco.logger.debug("node.expand: DLT_onPathChanged (parent)", path); + node.expand(); + } + } + return; + } + + /** + * The path's node hasn't been loaded into the tree. Create a stack + * of parent paths that we need to expand one-by-one in order to + * eventually display the current path's node + */ + var paths = path.split("/"), + expandPath = "/"; + // Check for root path special case (split will have created 2 empty array members) + if (path === "/") + { + paths = [""]; + } + for (var i = 0; i < paths.length; i++) + { + // Push the path onto the list of paths to be expanded + expandPath = $combine(expandPath, paths[i]); + this.pathsToExpand.push(expandPath); + } + + // Kick off the expansion process by expanding the first unexpanded path + do + { + node = this.widgets.treeview.getNodeByProperty("path", this.pathsToExpand.shift()); + } while (this.pathsToExpand.length > 0 && node && node.expanded); + + if (node !== null) + { + Alfresco.logger.debug("node.expand: DLT_onPathChanged (pathsToExpand)", this.pathsToExpand); + node.expand(); + } + }, + + + /** + * BUBBLING LIBRARY EVENT HANDLERS FOR PAGE EVENTS + * Disconnected event handlers for inter-component event notification + */ + + /** + * Fired when a folder has been renamed + * @method onFolderRenamed + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFolderRenamed: function DLT_onFolderRenamed(layer, args) + { + var obj = args[1]; + if (obj && (obj.file !== null)) + { + var node = this.widgets.treeview.getNodeByProperty("nodeRef", obj.file.node.nodeRef); + if (node !== null) + { + var index = -1; + var replacePaths = function(node) + { + // rebuild path based on existing node path data - otherwise repointed root node may not be taken into account + var paths = node.data.path.split("/"); + + if (index < 0) + { + paths.pop(); + index = paths.length; + node.data.path = $combine(paths.join("/"), obj.file.location.file); + } + else + { + paths[index] = obj.file.displayName; + node.data.path = paths.join("/"); + } + + if (node.hasChildren) + { + for (var i = 0; i < node.children.length; i++) + { + replacePaths(node.children[i]); + } + } + }; + + // Node found, so rename it and replace the paths + replacePaths(node); + node.label = obj.file.displayName; + + this.widgets.treeview.render(); + this._showHighlight(true); + } + } + + // Make sure that the drag and drop targets are correctly set... + this._applyDropTargets(); + }, + + /** + * Fired when a folder has been copied + * + * Event data contains: + * nodeRef - the nodeRef of the newly copied object + * destination - new parent path + * @method onFolderCopied + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFolderCopied: function DLT_onFolderCopied(layer, args) + { + var obj = args[1]; + if (obj !== null) + { + if (obj.nodeRef && obj.destination) + { + // Do we have the parent of the node's copy loaded? + var nodeDest = this.widgets.treeview.getNodeByProperty("path", $combine("/", obj.destination)); + if (nodeDest) + { + if (nodeDest.expanded) + { + this._sortNodeChildren(nodeDest); + } + else + { + nodeDest.isLeaf = false; + } + } + + this.widgets.treeview.render(); + this._showHighlight(true); + } + } + + // Make sure that the drag and drop targets are correctly set... + this._applyDropTargets(); + }, + + /** + * Fired when a folder has been created + * @method onFolderCreated + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFolderCreated: function DLT_onFolderCreated(layer, args) + { + var obj = args[1]; + if (obj && (obj.parentNodeRef !== null)) + { + var parentNode = this.widgets.treeview.getNodeByProperty("nodeRef", obj.parentNodeRef); + if (parentNode !== null) + { + if (!parentNode.hasChildren() && parentNode.isLeaf === true) + { + // load children dynamically on render (ACE-2341, MNT-11763) + parentNode.dynamicLoadComplete = false; + } + this._sortNodeChildren(parentNode); + } + } + }, + + /** + * Fired when a folder has been deleted + * @method onFolderDeleted + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFolderDeleted: function DLT_onFolderDeleted(layer, args) + { + var obj = args[1]; + if (obj !== null) + { + var node = null; + + if (obj.path) + { + // ensure path starts with leading slash + node = this.widgets.treeview.getNodeByProperty("path", $combine("/", obj.path)); + } + else if (obj.nodeRef) + { + node = this.widgets.treeview.getNodeByProperty("nodeRef", obj.nodeRef); + } + + if (node !== null) + { + var parentNode = node.parent; + // Node found, so delete it + this.widgets.treeview.removeNode(node); + // Have all the parent child nodes been removed now? + if (parentNode !== null) + { + if (!parentNode.hasChildren()) + { + parentNode.isLeaf = true; + } + } + this.widgets.treeview.render(); + this._showHighlight(true); + } + } + + // Make sure that the drag and drop targets are correctly set... + this._applyDropTargets(); + }, + + /** + * Fired when a folder has been moved + * + * Event data contains: + * nodeRef - the nodeRef of the moved object + * destination - new parent path + * @method onFolderMoved + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFolderMoved: function DLT_onFolderMoved(layer, args) + { + var obj = args[1]; + if (obj !== null) + { + if (typeof obj.nodeRef !== "undefined" && typeof obj.destination !== "undefined") + { + var nodeSrc = null; + + // we should be able to find the original node + nodeSrc = this.widgets.treeview.getNodeByProperty("nodeRef", obj.nodeRef); + + if (nodeSrc !== null) + { + var parentNode = nodeSrc.parent; + // Node found, so delete it + this.widgets.treeview.removeNode(nodeSrc, true); + // Have all the parent's child nodes been removed now? + if (parentNode !== null) + { + if (!parentNode.hasChildren()) + { + parentNode.isLeaf = true; + } + } + // Do we have the node's new parent loaded? + var nodeDest = this.widgets.treeview.getNodeByProperty("path", $combine("/", obj.destination)); + if (nodeDest) + { + // The node may already be loading if this was a multiple-folder move + if (!nodeDest.isLoading) + { + if (nodeDest.isLeaf) + { + nodeDest.isLeaf = false; + } + else if (nodeDest.expanded) + { + this._sortNodeChildren(nodeDest); + } + this.widgets.treeview.render(); + this._showHighlight(true); + } + } + } + } + } + + // Make sure that the drag and drop targets are correctly set... + this._applyDropTargets(); + }, + + /** + * Fired when the currently active filter has changed + * @method onFilterChanged + * @param layer {string} the event source + * @param args {object} arguments object + */ + onFilterChanged: function DLT_onFilterChanged(layer, args) + { + var obj = args[1]; + if ((obj !== null) && (obj.filterId !== null)) + { + obj.filterOwner = obj.filterOwner || Alfresco.util.FilterManager.getOwner(obj.filterId); + + // Defer if event received before we're ready + if (!this.isReady) + { + this.initialFilter = Alfresco.util.cleanBubblingObject(obj); + Alfresco.logger.debug("DLT_onFilterChanged (deferring)", this.initialFilter); + return; + } + + Alfresco.logger.debug("DLT_onFilterChanged", obj); + this.initialFilter = null; + + this.currentFilter = Alfresco.util.cleanBubblingObject(obj); + this.isFilterOwner = (obj.filterOwner == this.name); + if (this.isFilterOwner) + { + this.pathChanged(this.currentFilter.filterData, obj); + } + this._showHighlight(this.isFilterOwner); + } + }, + + + /** + * PRIVATE FUNCTIONS + */ + + /** + * Creates the TreeView control and renders it to the parent element. + * @method _buildTree + * @private + */ + _buildTree: function DLT__buildTree() + { + // Create a new tree + var tree = new YAHOO.widget.TreeView(this.id + "-treeview"); + this.widgets.treeview = tree; + + // Having both focus and highlight are just confusing (YUI 2.7.0 addition) + YAHOO.widget.TreeView.FOCUS_CLASS_NAME = ""; + + // Turn dynamic loading on for entire tree + tree.setDynamicLoad(this.fnLoadNodeData); + + // Get root node for tree + var root = tree.getRoot(); + + // Add default top-level node + this._buildTreeNode( + { + name: Alfresco.util.message("node.root", this.name), + path: "/", + nodeRef: "" + }, root, false); + + // Register tree-level listeners + tree.subscribe("clickEvent", this.onNodeClicked, this, true); + tree.subscribe("expandComplete", this.onExpandComplete, this, true); + + // Render tree with this one top-level node + tree.render(); + }, + + /** + * @method _sortNodeChildren + * @param node {object} Parent node + * @param onSortComplete {object} Optional callback object literal + * @private + */ + _sortNodeChildren: function DLT__sortNodeChildren(node, onSortComplete) + { + // Is the node a leaf? + if (node.isLeaf) + { + // Yes, so clearing the leaf flag and redrawing will automatically query the child nodes + node.isLeaf = false; + this.widgets.treeview.render(); + this._showHighlight(true); + return; + } + + // Get the path this node refers to + var nodePath = node.data.path; + + // Prepare URI for XHR data request + var uri = this._buildTreeNodeUrl(nodePath); + + // Prepare the XHR callback object + var callback = + { + success: function DLT_sNC_success(oResponse) + { + var results = YAHOO.lang.JSON.parse(oResponse.responseText); + + if (results.items) + { + var kids = oResponse.argument.node.children; + var items = results.items; + for (var i = 0, j = items.length; i < j; i++) + { + if ((kids.length <= i) || (kids[i].data.nodeRef != items[i].nodeRef)) + { + // Node has moved - search for correct node for this position and swap if found + var kidFound = false; + for (var m = i, n = kids.length; m < n; m++) + { + if (kids[m].data.nodeRef == items[i].nodeRef) + { + var temp = kids[i]; + kids[i] = kids[m]; + kids[m] = temp; + kidFound = true; + break; + } + } + + // If we get here we couldn't find the node, so create one and insert it + if (!kidFound) + { + var item = items[i]; + item.path = $combine(oResponse.argument.node.data.path, item.name); + var tempNode = this._buildTreeNode(item); + + if (!item.hasChildren) + { + tempNode.isLeaf = true; + } + + if (kids.length === 0) + { + var parentNode = oResponse.argument.node; + parentNode.isLeaf = false; + tempNode.appendTo(parentNode); + } + else if (kids.length > i) + { + tempNode.insertBefore(kids[i]); + } + else + { + tempNode.insertAfter(kids[kids.length - 1]); + } + } + } + } + + // Update the tree + this.widgets.treeview.render(); + this._showHighlight(true); + + // Execute the onSortComplete callback + var callback = oResponse.argument.onSortComplete; + if (callback && typeof callback.fn == "function") + { + callback.fn.call(callback.scope ? callback.scope : this, callback.obj); + } + + // Make sure that the drag and drop targets are correctly set... + this._applyDropTargets(); + } + }, + + // If the XHR call is not successful, no further processing - tree may not be sorted correctly + failure: function DLT_sNC_failure(oResponse) + { + Alfresco.logger.error("DLT_sNC_failure", oResponse); + }, + + // XHR response argument information + argument: + { + node: node, + onSortComplete: onSortComplete + }, + + scope: this, + + // Timeout -- abort the transaction after 7 seconds + timeout: 7000 + }; + + // Make the XHR call using Connection Manager's asyncRequest method + YAHOO.util.Connect.asyncRequest('GET', uri, callback); + }, + + /** + * Highlights the currently selected node. + * @method _showHighlight + * @param isVisible {boolean} Whether the highlight is visible or not + * @private + */ + _showHighlight: function DLT__showHighlight(isVisible) + { + if (this.selectedNode !== null) + { + if (isVisible) + { + Dom.addClass(this.selectedNode.getEl(), "selected"); + } + else + { + Dom.removeClass(this.selectedNode.getEl(), "selected"); + } + } + }, + + /** + * Updates the currently selected node. + * @method _updateSelectedNode + * @param node {object} New node to set as currently selected one + * @private + */ + _updateSelectedNode: function DLT__updateSelectedNode(node) + { + if (this.isFilterOwner) + { + this._showHighlight(false); + this.selectedNode = node; + this._showHighlight(true); + } + else + { + this.selectedNode = node; + } + }, + + /** + * Build a tree node using passed-in data + * + * @method _buildTreeNode + * @param p_oData {object} Object literal containing required data for new node + * @param p_oParent {object} Optional parent node + * @param p_expanded {object} Optional expanded/collaped state flag + * @return {YAHOO.widget.TextNode} The new tree node + */ + _buildTreeNode : function DLT__buildTreeNode(p_oData, p_oParent, p_expanded) + { + var treeNode = new YAHOO.widget.TextNode( + { + label : p_oData.name, + path : p_oData.path, + nodeRef : p_oData.nodeRef, + description : p_oData.description + }, p_oParent, p_expanded); + var customStyleClass = this._buildCustomStyleClass(p_oData); + treeNode.customCls = customStyleClass; + return treeNode; + }, + /** + * Gets resource style specified in the {style} configuration that corresponds with matching filter + * from share-documentlibrary-config.xml [CommonComponentStyle][component-style], {browse.folder} component, or null if the filter does not match. + * + * The returned value is used to be set to the treeNode as customCls attribute, used for rendering custom icons in treeView. + * @param p_oData + */ + _buildCustomStyleClass : function DLT__buildCustomStyleClass(p_oData) + { + var customStyleClass = null; + if (this.options.customFolderStyleConfig) + { + var filterChain = new Alfresco.CommonComponentStyleFilterChain(p_oData, + this.options.customFolderStyleConfig.browse.folder); + customStyleClass = filterChain.createCustomStyle(); + } + return customStyleClass; + }, + + /** + * Build URI parameter string for treenode JSON data webscript + * + * @method _buildTreeNodeUrl + * @param path {string} Path to query + */ + _buildTreeNodeUrl: function DLT__buildTreeNodeUrl(path) + { + var uriTemplate ="slingshot/doclib/treenode/site/" + $combine(encodeURIComponent(this.options.siteId), encodeURIComponent(this.options.containerId), Alfresco.util.encodeURIPath(path)); + uriTemplate += "?perms=false&children=" + this.options.evaluateChildFolders + "&max=" + this.options.maximumFolderCount; + return Alfresco.constants.PROXY_URI + uriTemplate; + } + }); +})(); diff --git a/share/src/main/webapp/components/download/archive-and-download.css b/share/src/main/webapp/components/download/archive-and-download.css new file mode 100644 index 0000000000..a5676cc689 --- /dev/null +++ b/share/src/main/webapp/components/download/archive-and-download.css @@ -0,0 +1,368 @@ +/* Center text and buttons inside p elements */ + +.archive-and-download p +{ + text-align: center; +} + +.archive-and-download div.browse-wrapper +{ + text-align: center; +} + +.archive-and-download div.browse-wrapper div.center +{ + padding-top: 0.5em; + line-height: 2em; + margin-left: auto; + margin-right: auto; + width: 18em; +} + +.archive-and-download div.browse-wrapper div.browse, +.archive-and-download div.browse-wrapper div.label +{ + float: left; +} + +.archive-and-download div.tip-wrapper +{ + padding-top: 0.5em; + line-height: 2em; + text-align: center; + clear: both; +} + +.archive-and-download div.status-wrapper +{ + padding-bottom: 0.5em; + text-align: left; + margin-left: 1em; +} + +.archive-and-download .browse, +.archive-and-download .tip +{ + float: left; +} + +.archive-and-download .browse +{ + width: 38px; + height: 26px; + margin-left: 10px; + margin-right: 10px; +} + +/* Bug fix for ubuntu that requires flash move element to get resized to get displayed */ + +.archive-and-download .browse.button-fix +{ + width: 39px; +} + +/* Bug fix for mac gecko browsers where flash movie gets re-instantiated */ + +.reinstantiated-fix .archive-and-download span.yui-button +{ + overflow:visible; +} + +.archive-and-download .tip +{ + height: 40px; + line-height: 40px; +} + +.archive-and-download div.section span.status +{ + margin-left: 210px; +} + +/* Add some padding to the file list so it looks centered */ + +.archive-and-download .bd .fileUpload-filelist-table +{ + padding: 0.8em; +} + +/* Remove the padding inherited from the panel for divs in the file list */ + +.archive-and-download .fileUpload-filelist-table div.yui-dt-hd +{ + height: 1px; + padding: 0; +} + +.archive-and-download .fileUpload-filelist-table tbody.yui-dt-message td +{ + border: none; +} + +.archive-and-download .fileUpload-filelist-table tbody.yui-dt-message tr td div.yui-dt-empty +{ + border: none; + padding: 0.5em !important; +} + +/* Create a visible gray line beneath each row */ + +.archive-and-download .fileUpload-filelist-table tbody .yui-dt-liner +{ + border-bottom-style: solid; + border-bottom-color: #CBCBCB; + border-bottom-width: 1px; + margin: 0; + padding: 0; + white-space: nowrap; +} + +/* Width of the file list - needs to override YUI element style setting */ + +.archive-and-download .fileUpload-filelist-table .yui-dt table +{ + width: 300px !important; +} + +/* Hide the table header */ + +.archive-and-download .fileUpload-filelist-table .yui-dt table thead +{ + display: none; +} + +/** + * If an element with "position: relative;" is used inside + * another element with "overflow: scroll;" IE takes the inner element "out of + * the flow" which makes statically positioned on the screen ignoring to be + * hidden and following the scrollbar. + * + * In this component, position relative is used for the progress bars, but + * a YUI button is also used which causes the same problem. + * + * If the outer element also has "position: relative;" it works though. + */ + +.archive-and-download .fileUpload-filelist-table .yui-dt-bd +{ + position: relative; + width: 300px; + overflow-x: hidden; +} + +/* Style left column and its elements */ + +.archive-and-download .fileUpload-filelist-table tbody .col-left +{ + height: 40px; + width: 100px; +} + +.archive-and-download .fileupload-left-div +{ + text-align: center; + height: 40px; + background-color: #FAF9F9; +} + +.archive-and-download .fileupload-percentage-span +{ + font-weight: bold; + font-size: 123.1%; + line-height: 2.5em; +} + +.archive-and-download .fileupload-contentType-menu +{ + position: relative; + top: 10px; +} + +/* Style center column and its elements */ + +.archive-and-download .fileUpload-filelist-table tbody .col-center +{ + height: 40px; + width: 400px; +} + +.archive-and-download .fileupload-center-div +{ + background-color: #FFFFFF; + position: relative; + height: 40px; + padding: 0; + margin: 0; + overflow: hidden; +} + +.archive-and-download .fileupload-docImage-img +{ + position: absolute; + left: 5px; + top: 4px; +} + +.archive-and-download .fileupload-status-img +{ + position: relative; + top: 12px; +} + +.archive-and-download .fileupload-progressInfo-span +{ + position: absolute; + left: 40px; + top: 4px; + font-weight: bold; + font-size: 108%; +} + +.archive-and-download .fileupload-filesize-span +{ + position: absolute; + left: 41px; + top: 22px; + font-size: 85%; +} + +.archive-and-download .fileupload-center-div .fileupload-progressSuccess-span, +.archive-and-download .fileupload-center-div .fileupload-progressFailure-span, +.archive-and-download .fileupload-center-div .fileupload-progressFinished-span +{ + position: absolute; + top: 0px; + left: -400px; + height: 40px; + width: 400px; +} + +.archive-and-download .fileupload-center-div .fileupload-progressSuccess-span +{ + background-color: #9AC68C; +} + +.archive-and-download .fileupload-center-div .fileupload-progressFinished-span +{ + background-color: #DCECCC; +} + +.archive-and-download .fileupload-center-div .fileupload-progressFailure-span +{ + background-color: #E98B3C; +} + +.archive-and-download .aggregate-progress-div +{ + background-color: #FFFFFF; + border: 1px solid #7F7F7F; + height: 20px; + margin-bottom: 0.8em; + margin-left: 0.8em; + overflow: hidden; + padding: 0; + position: relative; + width: 300px; +} + +.archive-and-download .aggregate-progressSuccess-span +{ + background-color: #9AC68C; + position: absolute; + top: 0px; + left: -300px; + height: 20px; + width: 300px; +} + +/* Style right column and its elements */ + +.archive-and-download .fileUpload-filelist-table tbody .col-right, +.archive-and-download .fileUpload-filelist-table tbody .col-right div.fileupload-right-div +{ + height: 40px; + width: 130px; +} + +.archive-and-download .fileupload-right-div +{ + text-align: center; + height: 40px; +} + +.archive-and-download .fileUpload-filelist-table tbody .col-right +{ + background-color: #FAF9F9; + border-style: none; +} + +.archive-and-download .fileupload-fileButton-span +{ + position: relative; + top: 7px; +} + +.archive-and-download .fileupload-fileButton-span button +{ + padding-left: 2.5em; + background: url(../images/remove-16.png) 10% 50% no-repeat; +} + +.archive-and-download .fileupload-status-span +{ + background: url(../images/delete-16.png) 10% 50% no-repeat; + position: absolute; + left: 5px; + top: 4px; +} + +.archive-and-download .fileUpload-filelist-table.yui-dt.yui-dt-scrollable tbody.yui-dt-data tr.yui-dt-last td +{ + border-bottom: medium none; +} + +/* General styling */ + +.archive-and-download +{ + width: 320px; +} + +.archive-and-download .yui-gd div.first +{ + width: 10.5em; +} + +.archive-and-download textarea +{ + width: 30em; +} + +.archive-and-download .title-folder +{ + padding: 0 2px 0 4px; + vertical-align: text-bottom; +} + +.dnd-file-selection-control +{ + height: 25px; +} + +.dnd-file-selection-button +{ + opacity: 0; + top: 0; + left: 0; + position: absolute; +} + +.dnd-file-selection-button-overlay +{ + padding: 0 50px !important; +} + +.dnd-file-selection-button-overlay-wrapper +{ + position: relative; +} diff --git a/share/src/main/webapp/components/download/archive-and-download.js b/share/src/main/webapp/components/download/archive-and-download.js new file mode 100644 index 0000000000..b181d1a7a0 --- /dev/null +++ b/share/src/main/webapp/components/download/archive-and-download.js @@ -0,0 +1,467 @@ + +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +/** + * Archive and download component. + * + * Pops up a YUI panel and initiates the download archiving of one or more NodeRefs and monitors + * the progress of that archiving. Once the archiving is complete it initiates the download. + * + * @namespace Alfresco.module + * @class Alfresco.ArchiveAndDownload + * @extends Alfresco.component.Base + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Element = YAHOO.util.Element, + KeyListener = YAHOO.util.KeyListener, + Event = YAHOO.util.Event; + + /** + * Alfresco Slingshot aliases + */ + var $html = Alfresco.util.encodeHTML; + + /** + * Returns the first registered instance of the Alfresco.ArchiveAndDownload widget. + */ + Alfresco.getArchiveAndDownloadInstance = function() + { + var instanceId = "Alfresco.ArchiveAndDownload"; + var instance = Alfresco.util.ComponentManager.findFirst(instanceId); + return instance; + }; + + /** + * ArchiveAndDownload constructor. + * + * ArchiveAndDownload is considered a singleton so constructor should be treated as private, + * please use Alfresco.component.getArchiveAndDownloadInstance() instead. + * + * @param htmlId {String} The HTML id of the parent element + * @return {Alfresco.component.ArchiveAndDownload} The new ArchiveAndDownload instance + * @constructor + * @private + */ + Alfresco.ArchiveAndDownload = function(htmlId) + { + Alfresco.ArchiveAndDownload.superclass.constructor.call(this, "Alfresco.ArchiveAndDownload", htmlId, ["button", "container"]); + return this; + }; + + YAHOO.extend(Alfresco.ArchiveAndDownload, Alfresco.component.Base, + { + /** + * Contains the upload gui + * + * @property panel + * @type YAHOO.widget.Dialog + */ + panel: null, + + /** + * The node URL (a nodeRef in the form {store_type}/{store_id}/{nodepath}) of the archive that is currently being + * generated. This will be set when on the successful response from the "archiveInitReqSuccess" function and + * reset by the "_resetGUI" function. + */ + _currentArchiveNodeURL : "", + + /** + * The name to give to the archive currently being built. This will be set as the Folder filename when a single + * folder is selected for download otherwise will just be "Archive.zip" + */ + _currentArchiveName: "", + + /** + * Fired by YUI when parent element is available for scripting. + * Initial History Manager event registration + * + * @method onReady + */ + onReady: function ArchiveAndDownload_onReady() + { + Dom.removeClass(this.id + "-dialog", "hidden"); + + // Create the panel + this.panel = Alfresco.util.createYUIPanel(this.id + "-dialog"); + + // Hook close button + this.panel.hideEvent.subscribe(this.onCancelButtonClick, null, this); + + // Create and save a reference to the buttons so we can alter them later + this.widgets.cancelOkButton = Alfresco.util.createYUIButton(this, "cancelOk-button", this.onCancelButtonClick); + + // Register the ESC key to close the dialog + this.widgets.escapeListener = new KeyListener(document, + { + keys: KeyListener.KEY.ESCAPE + }, + { + fn: this.onCancelButtonClick, + scope: this, + correctScope: true + }); + }, + + /** + * Updates the progress bar to reflect the current progress. + * + * @method updateProgress + * @param done The current number of bytes archived + * @param total The total number of bytes required to be archived + */ + updateProgress: function ArchiveAndDownload_updateProgress(json) + { + // Remove any commas from the number to prevent NaN errors + var done = json.done.replace(/,/g, ""); + var total = json.total.replace(/,/g, ""); + var overallProgress = total != 0 ? (done / total) : 0; + var overallLeft = (-300 + (overallProgress * 300)); + Dom.setStyle(this.id + "-aggregate-progress-span", "left", overallLeft + "px"); + Dom.get(this.id + "-file-count-span").innerHTML = this.msg("file.status", json.filesAdded, json.totalFiles); + }, + + /** + * Called when an archiving progress update request succeeds. Determines the current status of the + * archiving progress and either calls the "getArchivingProgress" function again if progress is not + * complete or calls the "handleArchiveComplete" function when progress is returned as "DONE". + * + * @method archiveProgressSuccess + * @param response The response from XHR request. + */ + archiveProgressSuccess: function ArchiveAndDownload_archiveProgressSuccess(response) + { + // Check the response data... + if (response.json) + { + if (response.json.status == "PENDING") + { + // The archiving hasn't started yet... + var _this = this; + this._getProgressTimeout = window.setTimeout(function() { + _this.getArchivingProgress(); + }, 250); + } + else if (response.json.status == "IN_PROGRESS") + { + this.updateProgress(response.json); + var _this = this; + this._getProgressTimeout = window.setTimeout(function() { + _this.getArchivingProgress(); + }, 250); + + } + else if (response.json.status == "DONE") + { + // The archiving is complete and the archive can now be downloaded... + this.updateProgress(response.json); + this.handleArchiveComplete(); + } + else if (response.json.status == "MAX_CONTENT_SIZE_EXCEEDED") + { + // The file size is too large to be zipped up: + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.maxContentSizeExceeded", Alfresco.util.formatFileSize(response.json.done), Alfresco.util.formatFileSize(response.json.total, 2)) + }); + this.panel.hide(); + } + else if (response.json.status == "CANCELLED") + { + // Do nothing; the user has already cancelled it. + } + else + { + // Unknown or no status + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.unknown.progress") + }); + this.panel.hide(); + } + } + }, + + /** + * Called when the XHR call made by "getArchivingProgress" fails. + * + * @method archiveProgressFailure + * @param response The failure response returned by the XHR call. + */ + archiveProgressFailure: function ArchiveAndDownload_archiveProgressFailure(response) + { + var _this = this, + maxFailures = 6, // number of times a failure is retried. + failureRetry = 5000, // milliseconds before trying. + failures = response.config.failureCount || 0; + + if (failures < maxFailures) + { + // An error occurred getting the progress status.... + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.archive.progress.failed") + }); + + // Wait a few seconds and then try again... + this._getProgressTimeout = window.setTimeout(function() + { + _this.getArchivingProgress(++failures); + }, failureRetry); + } else + { + this.panel.hide(); + // Download Failed. + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.download.failed") + }); + } + }, + + /** + * Triggers a server side clean up of the download archive. + * + * + * @method deleteDownload + */ + deleteDownload: function ArchiveAndDownload_deleteDownload() + { + Alfresco.util.Ajax.jsonDelete( + { + url: Alfresco.constants.PROXY_URI + "api/internal/downloads/" + this._currentArchiveNodeURL + }); + }, + + /** + * Called recursively after the initial archive request returns successfully until the response + * indicates that the archiving process has completed. + * + * @method getArchivingProgress + */ + getArchivingProgress: function ArchiveAndDownload_getArchivingProgress(prevFailures) + { + if (this._currentArchiveNodeURL != null && this._currentArchiveNodeURL != "") + { + Alfresco.util.Ajax.jsonGet({ + url: Alfresco.constants.PROXY_URI + "api/internal/downloads/" + this._currentArchiveNodeURL + "/status", + responseContentType: "application/json", + successCallback: + { + fn: this.archiveProgressSuccess, + scope: this + }, + failureCallback: + { + fn: this.archiveProgressFailure, + scope: this + }, + failureCount: prevFailures + }); + } + }, + /** + * Called when the initial request to generate an archive returns successfully. The response + * will contain the new NodeRef of the archive being generated which should then be used + * to request progress updates. The function is not called when the archive has been created, + * but simply when the archiving process has begun. + * + * @method archiveInitReqSuccess + * @param response The success response from the XHR request. + */ + archiveInitReqSuccess: function ArchiveAndDownload_archiveInitReqSuccess(response) + { + // Check the response object... + if (response.json && response.json.nodeRef) + { + var nodeRef = Alfresco.util.NodeRef(response.json.nodeRef); + this._currentArchiveNodeURL = nodeRef.storeType + "/" + nodeRef.storeId + "/" + nodeRef.id; + this.getArchivingProgress(); + } + }, + + /** + * Called when the initial request to generate an archive fails. Failure may occur for a number + * of reasons including (but not limited to) the repository application not being available, + * invalid data in the request payload). + * + * @method archiveInitReqFailure + * @param response The failure response from the XHR request. + */ + archiveInitReqFailure: function ArchiveAndDownload_archiveInitReqFailure(response) + { + // An error occurred getting the progress status.... + Alfresco.util.PopupManager.displayPrompt( + { + text: this.msg("message.archive.request.failed") + }); + this.panel.hide(); + }, + + /** + * Makes and XHR request to initiate the archiving of one or more Nodes into a single downloadable + * Node. + * + * @method requestArchive + * @param nodes The list of nodes to archived. This should be in the form: + * [ { nodeRef:
        a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + /* + PATCH: Support: IE <=9 only + IE <=9 replaces "; + support.option = !!div.lastChild; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +/* +PATCH: Removed from wrapMap: + option: [ 1, "" ], +*/ +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + legend: [ 1, "
        ", "
        " ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
        " ], + tr: [ 2, "", "
        " ], + col: [ 2, "", "
        " ], + td: [ 3, "", "
        " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
        ", "
        " ] +}; + +/* +PATCH: Removed optgroup from wrapMap: + wrapMap.optgroup = wrapMap.option; +*/ + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +/* +PATCH: Added Support: IE <=9 only +*/ +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
        " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + +/* +PATCH: Removed + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, +*/ +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + /* + PATCH: Removed + return html.replace( rxhtmlTag, "<$1>" ); + */ + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( " + +--> \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/facebook/like.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/facebook/like.get.js new file mode 100644 index 0000000000..88122e681c --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/facebook/like.get.js @@ -0,0 +1 @@ +model.domain="http://www.yourdomain.com"; \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/html.status.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/html.status.ftl new file mode 100644 index 0000000000..c3c9a65319 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/html.status.ftl @@ -0,0 +1,63 @@ +"'> + + +<#if editorialSite!'false' == "true"> + + +
        +
        +
        ${msg('error.component')}: ${url.service?html}.
        +
        ${msg('error.status')} ${status.code} - ${status.codeName}.
        +
        +
        +
        ${msg('error.code')}: ${status.code} - ${status.codeDescription}
        +
        ${msg('error.message')}: <#if status.message??>${status.message?html}<#else><${msg('error.message.none')}>
        +
        ${msg('error.server')}: Alfresco ${server.edition?html} v${server.version?html} schema ${server.schema?html}
        +
        ${msg('error.time')}: ${date?datetime}
        + <#if status.exception?exists> +
        ${msg('error.expand')}
        + + +
        +
        + + <#macro recursestack exception> + <#if exception.cause?exists> + <@recursestack exception=exception.cause/> + + <#if exception.message?? && exception.message?is_string> +
        ${msg('error.exception')}: ${exception.class.name} - ${exception.message?html}
        + <#if exception.cause?exists == false> + <#list exception.stackTrace as element> +
        ${element?html}
        + + <#else> +
        ${exception.stackTrace[0]?html}
        + + + +<#else> +
        +
        + ${msg('error.friendly')} +
        +
        + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.desc.xml new file mode 100644 index 0000000000..72f8b74d9c --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.desc.xml @@ -0,0 +1,5 @@ + + Detailed list + Detailed list + /list/detailed + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.html.ftl new file mode 100644 index 0000000000..9f6889ac02 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.html.ftl @@ -0,0 +1,44 @@ +<#if articles??> + <#if articles.title??> +
        +

        ${articles.title?html}

        + <#if articles.description??>

        ${articles.description?html}

        +
        + + +
        + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> + <#list articles.assets as article> +
        +

        ${(article.title!article.name)?html}

        +
        + <#if article.properties['ws:publishedTime']??>${article.properties['ws:publishedTime']?string(msg('date.format'))}   •   + <#if article.properties['cm:author']??>${article.properties['cm:author']?html}   •   + ${article.properties['ws:derivedCommentCount']!0} + <#if (article.properties['ws:derivedCommentCount']!0) == 1> + comment + <#else> + comments + + +
        +

        ${(article.description!'')?html}

        + +
        + + + +
        + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.js new file mode 100644 index 0000000000..e794b0463d --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/detailed.get.js @@ -0,0 +1,14 @@ +var resultsToSkip = url.args.resultsToSkip == null ? 0 : url.args.resultsToSkip; +var maxResults = 10; + +var articles = collectionService.getCollection(context.properties.section.id, args.collection, resultsToSkip, maxResults); + +model.articles = articles; +model.pageNumber = articles.query.resultsToSkip / articles.query.maxResults + 1; +model.totalPages = Math.ceil(articles.totalSize / articles.query.maxResults); +model.prevSkip = articles.query.resultsToSkip - articles.query.maxResults; +model.nextSkip = articles.query.resultsToSkip + articles.query.maxResults; + + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.desc.xml new file mode 100644 index 0000000000..192b9b0681 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.desc.xml @@ -0,0 +1,5 @@ + + Full width list + Full width list + /list/full + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.html.ftl new file mode 100644 index 0000000000..0e3e65c769 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.html.ftl @@ -0,0 +1,40 @@ +<#if articles??> + <#if articles.title??> +
        +

        ${articles.title?html}

        + <#if articles.description??>

        ${articles.description?html}

        +
        + + +
        + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> +
          + <#list articles.assets as article> +
        • + ${article.title!''} +
          +

          ${(article.title!article.name)?html}

          + + <#if article.properties['cmis:lastModificationDate']??>${article.properties['cmis:lastModificationDate']?string(msg('date.format'))} + <#if article.properties['cm:author']??> by ${article.properties['cm:author']?html} + +

          ${(article.description!'no preview')?html}

          +

          ${msg('tags')}

          + <#if !article.tags?? || article.tags?size == 0> +

          ${msg('tags.none')}

          + <#else> + + +
          +
        • + +
        + +
        + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.js new file mode 100644 index 0000000000..972d5c693c --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/full.get.js @@ -0,0 +1,8 @@ +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + +//If a link page is specified in the component properties then pass this to the view +if (args.linkPage != null) +{ + model.linkParam = '?view='+args.linkPage; +} + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.desc.xml new file mode 100644 index 0000000000..96bd9b2930 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.desc.xml @@ -0,0 +1,5 @@ + + Links list + List of links to assets + /list/links + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.html.ftl new file mode 100644 index 0000000000..51aea49e70 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.html.ftl @@ -0,0 +1,20 @@ +<#if articles??> +
        + <#if articles.title??> +

        ${articles.title?html}

        + <#if articles.description??>

        ${articles.description?html}

        + + + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> + + +
        + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.js new file mode 100644 index 0000000000..7ce9d5dd74 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/links.get.js @@ -0,0 +1,4 @@ +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.desc.xml new file mode 100644 index 0000000000..238eca217f --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.desc.xml @@ -0,0 +1,5 @@ + + Narrow list + Narrow list + /list/narrow + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.html.ftl new file mode 100644 index 0000000000..06f6bef72f --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.html.ftl @@ -0,0 +1,24 @@ +<#if articles??> +
        + <#if articles.title??> +

        ${articles.title?html}

        + + + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> +
          + <#list articles.assets as article> +
        • +
          ${(article.title!article.name)?html}
          + <#if article.description??> +

          <@truncate value=article.description?html chars=100/>

          + +
          <#if article.properties['ws:publishedTime']??>${article.properties['ws:publishedTime']?string(msg('date.format'))}
          +
        • + +
        + +
        + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.js new file mode 100644 index 0000000000..bdefd5c976 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/narrow.get.js @@ -0,0 +1,5 @@ +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.desc.xml new file mode 100644 index 0000000000..e635d5e157 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.desc.xml @@ -0,0 +1,5 @@ + + List of thumbnails + List of thumbnails + /list/thumbnails + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.html.ftl new file mode 100644 index 0000000000..971a6d4257 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.html.ftl @@ -0,0 +1,25 @@ +<#if articles??> + <#if articles.title??> +
        +

        ${articles.title?html}

        + <#if articles.description??>

        ${articles.description?html}

        +
        + + +
        + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> + <#if subTitle??>

        ${msg(subTitle)}

        + + +
        + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.js new file mode 100644 index 0000000000..a44ce23048 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/thumbnails.get.js @@ -0,0 +1,14 @@ +// Get the collection of articles indicated in the component properties +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + +// If a link page is specified in the component properties then pass this to the view +if (args.linkPage != null) +{ + model.linkParam = '?view='+args.linkPage; +} + +//If a sub title is specified in the component properties then pass this to the view +if (args.subTitle != null) +{ + model.subTitle = args.subTitle; +} diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.desc.xml new file mode 100644 index 0000000000..8cf51ff156 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.desc.xml @@ -0,0 +1,5 @@ + + Two col list + Two column list + /list/twocolumn + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.html.ftl new file mode 100644 index 0000000000..f7657e7274 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.html.ftl @@ -0,0 +1,41 @@ +<#if articles??> +
        + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> + <#list articles.assets as article> + <#if article_index == 0> + + + +
        + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.js new file mode 100644 index 0000000000..7ce9d5dd74 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/twocolumn.get.js @@ -0,0 +1,4 @@ +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.desc.xml new file mode 100644 index 0000000000..38d0b6d06d --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.desc.xml @@ -0,0 +1,5 @@ + + Wide list + Wide list + /list/wide + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.html.ftl new file mode 100644 index 0000000000..07a6b20638 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.html.ftl @@ -0,0 +1,29 @@ +<#if articles??> + <#if articles.title??> +
        +

        ${articles.title?html}

        + <#if articles.description??>

        ${articles.description?html}

        +
        + + +
        + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> +
          + <#list articles.assets as article> +
        • + <#if article.relatedAssets['ws:primaryImage']??> + <#assign image=article.relatedAssets['ws:primaryImage'][0]> + ${image.title!article.title!article.name} + +

          ${(article.title!article.name)?html}

          + <#if article.properties['ws:publishedTime']??>${article.properties['ws:publishedTime']?string(msg('date.format'))} +

          ${(article.description!'')?html}

          +
        • + +
        + +
        + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.js new file mode 100644 index 0000000000..7ce9d5dd74 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide.get.js @@ -0,0 +1,4 @@ +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.desc.xml new file mode 100644 index 0000000000..9fc9066e86 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.desc.xml @@ -0,0 +1,5 @@ + + Wide list 2 + Wide list with large title area + /list/wide2 + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.html.ftl new file mode 100644 index 0000000000..1711085290 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.html.ftl @@ -0,0 +1,30 @@ +<#if articles??> + <#if articles.title??> +
        +

        ${articles.title?html}

        + <#if articles.description??>

        ${articles.description?html}

        + ${msg('list.wide2.rss')} +
        + + +
        + <#if articles.assets?size == 0> + ${msg('list.none')} + <#else> +
          + <#list articles.assets as article> +
        • + <#if article.relatedAssets['ws:primaryImage']??> + <#assign image=article.relatedAssets['ws:primaryImage'][0]> + ${image.title!article.title!article.name} + +

          ${(article.title!article.name)?html}

          + <#if article.properties['ws:publishedTime']??>${article.properties['ws:publishedTime']?string(msg('date.format'))} +

          ${(article.description!'')?html}

          +
        • + +
        + +
        + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.js new file mode 100644 index 0000000000..7ce9d5dd74 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/list/wide2.get.js @@ -0,0 +1,4 @@ +model.articles = collectionService.getCollection(context.properties.section.id, args.collection); + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.desc.xml new file mode 100644 index 0000000000..7dc6743ede --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.desc.xml @@ -0,0 +1,5 @@ + + Menu + Top Navigation Menu + /menu/top + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.html.ftl new file mode 100644 index 0000000000..037d96cdaf --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.html.ftl @@ -0,0 +1,24 @@ +<#macro outputMenu sections> + + + +
        + +
        \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/menu/top.get.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.desc.xml new file mode 100644 index 0000000000..287ee35406 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.desc.xml @@ -0,0 +1,5 @@ + + Web Preview + Displays a zoom, move and pageable preview of a content as long as its a .swf, .jpg, .png or .gif + /preview/web-preview + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.head.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.head.ftl new file mode 100644 index 0000000000..82f105ae5a --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.head.ftl @@ -0,0 +1,7 @@ + + + + + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.html.ftl new file mode 100644 index 0000000000..1053deaf7c --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.html.ftl @@ -0,0 +1,35 @@ +
        +

        ${(asset.title!'no title')?html}

        +
        + <#if asset.properties['cmis:lastModificationDate']??>${asset.properties['cmis:lastModificationDate']?string(msg('date.format'))} +
        + + <#if asset.mimeType?starts_with("image/")> + " alt="${(asset.title!'')?html}" class="web-preview-image"/> + <#else> +
        +
        <#if (asset?exists)>${msg("label.preparingPreviewer")}
        +
        + + <#if (asset?exists)> + + + + +

        ${msg('tags')}

        + <#if !asset.tags?? || asset.tags?size == 0> +

        ${msg('tags.none')}

        + <#else> + + +
        \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.properties b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.properties new file mode 100644 index 0000000000..6325cbc1c0 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/preview/web-preview.get.properties @@ -0,0 +1,21 @@ +# Information messages +label.preparingPreviewer=Preparing previewer... +label.noFlash=To view the preview please download the latest Flash Player from the
        Adobe Flash Player Download Center. +label.noPreview=This document can''t be previewed.
        Click here to download it. +label.noContent=This document has no content. + +# Errors thrown by Flash component +error.error=The content cannot be displayed due to an unknown error. +error.content=The content cannot be displayed because it is not of type png, jpg, gif or swf. +error.io=The preview could not be loaded from the server. + +# Labels for Flash component +preview.actualSize=Actual Size +preview.fitPage=Fit Page +preview.fitWidth=Fit Width +preview.fitHeight=Fit Height +preview.fullscreen=Fullscreen +preview.fullwindow=Maximize +preview.fullwindowEscape=Press Esc to exit full window mode +preview.page=Page +preview.pageOf=of \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/related/articles.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/related/articles.get.desc.xml new file mode 100644 index 0000000000..76d9e11224 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/related/articles.get.desc.xml @@ -0,0 +1,5 @@ + + Related Articles + Related Article List + /related/articles + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/related/articles.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/related/articles.get.html.ftl new file mode 100644 index 0000000000..3ac9632cf7 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/related/articles.get.html.ftl @@ -0,0 +1,12 @@ +<#if asset.relatedAssets['ws:relatedArticles']?? && (asset.relatedAssets['ws:relatedArticles']?size > 0)> +
        +

        ${msg('related.articles.title')}

        + +
        + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/rss/rss.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/rss/rss.get.desc.xml new file mode 100644 index 0000000000..731666f050 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/rss/rss.get.desc.xml @@ -0,0 +1,7 @@ + + rss + rss feed + /rss/rss + none + argument + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.desc.xml new file mode 100644 index 0000000000..6a8aa135b3 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.desc.xml @@ -0,0 +1,5 @@ + + Search + Search within the whole site + /search/box + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.html.ftl new file mode 100644 index 0000000000..e86b335e5e --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.html.ftl @@ -0,0 +1,7 @@ +
        +
        + + + +
        + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.js new file mode 100644 index 0000000000..9e741f7463 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/box.get.js @@ -0,0 +1,8 @@ +if (url.args['phrase'] != null) +{ + model.phrase = url.args['phrase']; +} +else +{ + model.phrase = null; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.desc.xml new file mode 100644 index 0000000000..b05716435f --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.desc.xml @@ -0,0 +1,5 @@ + + Search Results + Search results list + /search/results + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.html.ftl new file mode 100644 index 0000000000..a3abd0dc97 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.html.ftl @@ -0,0 +1,40 @@ +
        +

        ${msg("search.results.title")}

        + +<#if results.query.phrase??> + <#assign text=results.query.phrase/> + <#assign link="${url.context}${rootSection.path}search.html?sectionId=${results.query.sectionId?url}&phrase=${results.query.phrase?url}"/> +<#else> + <#assign text=results.query.tag/> + <#assign link="${url.context}${rootSection.path}search.html?sectionId=${results.query.sectionId?url}&tag=${results.query.tag?url}"/> + + +<#if results.size == 0> +

        ${msg('search.results.none', text, sectionTitle!'the website')}

        +
        +<#else> +

        ${msg('search.results.found', results.size, results.totalSize, text, sectionTitle!'the website')}

        + + +
        +
          + <#list results.results as result> +
        • +

          ${(result.title!result.name)?html}

          + <#if result.properties['ws:publishedTime']??>${result.properties['ws:publishedTime']?string(msg('date.format'))} +

          ${(result.description!'')?html}

          +
        • + +
        + +
        + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.js new file mode 100644 index 0000000000..5986e4e3e1 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/results.get.js @@ -0,0 +1,7 @@ +model.pageNumber = results.query.resultsToSkip / results.query.maxResults + 1; +model.totalPages = Math.ceil(results.totalSize / results.query.maxResults); +model.prevSkip = results.query.resultsToSkip - results.query.maxResults; +model.nextSkip = results.query.resultsToSkip + results.query.maxResults; + + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.desc.xml new file mode 100644 index 0000000000..adbc76cbfe --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.desc.xml @@ -0,0 +1,5 @@ + + Search Box + Search within a section and it's sub-sections + /search/sectionbox + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.html.ftl new file mode 100644 index 0000000000..fcb37bf3be --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.html.ftl @@ -0,0 +1,7 @@ +
        +
        + + + +
        + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.js new file mode 100644 index 0000000000..4ea30e6b1d --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/search/sectionbox.get.js @@ -0,0 +1,22 @@ +if (url.args['sectionId'] != null) +{ + // If a search has already been performed then the search id will be available as a url parameter. + // In this case we want to use this in preference to the section on the Surf RequestContext object. + // This is because the search should be done within the scope of the original section and not the + // search section. + model.sectionId = url.args['sectionId']; +} +else +{ + // Use the current page's section as the scope for the search. + model.sectionId = context.properties.section.id; +} + +if (url.args['phrase'] != null) +{ + model.phrase = url.args['phrase']; +} +else +{ + model.phrase = null; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/spring.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/spring.ftl new file mode 100644 index 0000000000..4bd0de23cb --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/spring.ftl @@ -0,0 +1,383 @@ +<#ftl strip_whitespace=true> +<#-- + * spring.ftl + * + * This file consists of a collection of FreeMarker macros aimed at easing + * some of the common requirements of web applications - in particular + * handling of forms. + * + * Spring's FreeMarker support will automatically make this file and therefore + * all macros within it available to any application using Spring's + * FreeMarkerConfigurer. + * + * To take advantage of these macros, the "exposeSpringMacroHelpers" property + * of the FreeMarker class needs to be set to "true". This will expose a + * RequestContext under the name "springMacroRequestContext", as needed by + * the macros in this library. + * + * @author Darren Davison + * @author Juergen Hoeller + * @since 1.1 + --> + +<#-- + * message + * + * Macro to translate a message code into a message. + --> +<#macro message code>${springMacroRequestContext.getMessage(code)} + +<#-- + * messageText + * + * Macro to translate a message code into a message, + * using the given default text if no message found. + --> +<#macro messageText code, text>${springMacroRequestContext.getMessage(code, text)} + +<#-- + * messageArgs + * + * Macro to translate a message code with arguments into a message. + --> +<#macro messageArgs code, args>${springMacroRequestContext.getMessage(code, args)} + +<#-- + * messageArgsText + * + * Macro to translate a message code with arguments into a message, + * using the given default text if no message found. + --> +<#macro messageArgsText code, args, text>${springMacroRequestContext.getMessage(code, args, text)} + +<#-- + * theme + * + * Macro to translate a theme message code into a message. + --> +<#macro theme code>${springMacroRequestContext.getThemeMessage(code)} + +<#-- + * themeText + * + * Macro to translate a theme message code into a message, + * using the given default text if no message found. + --> +<#macro themeText code, text>${springMacroRequestContext.getThemeMessage(code, text)} + +<#-- + * themeArgs + * + * Macro to translate a theme message code with arguments into a message. + --> +<#macro themeArgs code, args>${springMacroRequestContext.getThemeMessage(code, args)} + +<#-- + * themeArgsText + * + * Macro to translate a theme message code with arguments into a message, + * using the given default text if no message found. + --> +<#macro themeArgsText code, args, text>${springMacroRequestContext.getThemeMessage(code, args, text)} + +<#-- + * url + * + * Takes a relative URL and makes it absolute from the server root by + * adding the context root for the web application. + --> +<#macro url relativeUrl>${springMacroRequestContext.getContextUrl(relativeUrl)} + +<#-- + * bind + * + * Exposes a BindStatus object for the given bind path, which can be + * a bean (e.g. "person") to get global errors, or a bean property + * (e.g. "person.name") to get field errors. Can be called multiple times + * within a form to bind to multiple command objects and/or field names. + * + * This macro will participate in the default HTML escape setting for the given + * RequestContext. This can be customized by calling "setDefaultHtmlEscape" + * on the "springMacroRequestContext" context variable, or via the + * "defaultHtmlEscape" context-param in web.xml (same as for the JSP bind tag). + * Also regards a "htmlEscape" variable in the namespace of this library. + * + * Producing no output, the following context variable will be available + * each time this macro is referenced (assuming you import this library in + * your templates with the namespace 'spring'): + * + * spring.status : a BindStatus instance holding the command object name, + * expression, value, and error messages and codes for the path supplied + * + * @param path : the path (string value) of the value required to bind to. + * Spring defaults to a command name of "command" but this can be overridden + * by user config. + --> +<#macro bind path> + <#if htmlEscape?exists> + <#assign status = springMacroRequestContext.getBindStatus(path, htmlEscape)> + <#else> + <#assign status = springMacroRequestContext.getBindStatus(path)> + + <#-- assign a temporary value, forcing a string representation for any + kind of variable. This temp value is only used in this macro lib --> + <#if status.value?exists && status.value?is_boolean> + <#assign stringStatusValue=status.value?string> + <#else> + <#assign stringStatusValue=status.value?default("")> + + + +<#-- + * bindEscaped + * + * Similar to spring:bind, but takes an explicit HTML escape flag rather + * than relying on the default HTML escape setting. + --> +<#macro bindEscaped path, htmlEscape> + <#assign status = springMacroRequestContext.getBindStatus(path, htmlEscape)> + <#-- assign a temporary value, forcing a string representation for any + kind of variable. This temp value is only used in this macro lib --> + <#if status.value?exists && status.value?is_boolean> + <#assign stringStatusValue=status.value?string> + <#else> + <#assign stringStatusValue=status.value?default("")> + + + +<#-- + * formInput + * + * Display a form input field of type 'text' and bind it to an attribute + * of a command or bean. + * + * @param path the name of the field to bind to + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size + --> +<#macro formInput path attributes="" fieldType="text"> + <@bind path/> + ${stringStatusValue}" ${attributes}<@closeTag/> + + +<#-- + * formPasswordInput + * + * Display a form input field of type 'password' and bind it to an attribute + * of a command or bean. No value will ever be displayed. This functionality + * can also be obtained by calling the formInput macro with a 'type' parameter + * of 'password'. + * + * @param path the name of the field to bind to + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size + --> +<#macro formPasswordInput path attributes=""> + <@formInput path, attributes, "password"/> + + +<#-- + * formHiddenInput + * + * Generate a form input field of type 'hidden' and bind it to an attribute + * of a command or bean. This functionality can also be obtained by calling + * the formInput macro with a 'type' parameter of 'hidden'. + * + * @param path the name of the field to bind to + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size + --> +<#macro formHiddenInput path attributes=""> + <@formInput path, attributes, "hidden"/> + + +<#-- + * formTextarea + * + * Display a text area and bind it to an attribute of a command or bean. + * + * @param path the name of the field to bind to + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size + --> +<#macro formTextarea path attributes=""> + <@bind path/> + + + +<#-- + * formSingleSelect + * + * Show a selectbox (dropdown) input element allowing a single value to be chosen + * from a list of options. + * + * @param path the name of the field to bind to + * @param options a map (value=label) of all the available options + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size +--> +<#macro formSingleSelect path options attributes=""> + <@bind path/> + + + +<#-- + * formMultiSelect + * + * Show a listbox of options allowing the user to make 0 or more choices from + * the list of options. + * + * @param path the name of the field to bind to + * @param options a map (value=label) of all the available options + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size +--> +<#macro formMultiSelect path options attributes=""> + <@bind path/> + + + +<#-- + * formRadioButtons + * + * Show radio buttons. + * + * @param path the name of the field to bind to + * @param options a map (value=label) of all the available options + * @param separator the html tag or other character list that should be used to + * separate each option. Typically ' ' or '
        ' + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size +--> +<#macro formRadioButtons path options separator attributes=""> + <@bind path/> + <#list options?keys as value> + <#assign id="${status.expression}${value_index}"> + checked="checked" ${attributes}<@closeTag/> + ${separator} + + + +<#-- + * formCheckboxes + * + * Show checkboxes. + * + * @param path the name of the field to bind to + * @param options a map (value=label) of all the available options + * @param separator the html tag or other character list that should be used to + * separate each option. Typically ' ' or '
        ' + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size +--> +<#macro formCheckboxes path options separator attributes=""> + <@bind path/> + <#list options?keys as value> + <#assign id="${status.expression}${value_index}"> + <#assign isSelected = contains(status.value?default([""]), value)> + checked="checked" ${attributes}<@closeTag/> + ${separator} + + + + +<#-- + * formCheckbox + * + * Show a single checkbox. + * + * @param path the name of the field to bind to + * @param attributes any additional attributes for the element (such as class + * or CSS styles or size +--> +<#macro formCheckbox path attributes=""> + <@bind path /> + <#assign id="${status.expression}"> + <#assign isSelected = status.value?? && status.value?string=="true"> + + checked="checked" ${attributes}/> + + +<#-- + * showErrors + * + * Show validation errors for the currently bound field, with + * optional style attributes. + * + * @param separator the html tag or other character list that should be used to + * separate each option. Typically '
        '. + * @param classOrStyle either the name of a CSS class element (which is defined in + * the template or an external CSS file) or an inline style. If the value passed in here + * contains a colon (:) then a 'style=' attribute will be used, else a 'class=' attribute + * will be used. +--> +<#macro showErrors separator classOrStyle=""> + <#list status.errorMessages as error> + <#if classOrStyle == ""> + ${error} + <#else> + <#if classOrStyle?index_of(":") == -1><#assign attr="class"><#else><#assign attr="style"> + ${error} + + <#if error_has_next>${separator} + + + +<#-- + * checkSelected + * + * Check a value in a list to see if it is the currently selected value. + * If so, add the 'selected="selected"' text to the output. + * Handles values of numeric and string types. + * This function is used internally but can be accessed by user code if required. + * + * @param value the current value in a list iteration +--> +<#macro checkSelected value> + <#if stringStatusValue?is_number && stringStatusValue == value?number>selected="selected" + <#if stringStatusValue?is_string && stringStatusValue == value>selected="selected" + + +<#-- + * contains + * + * Macro to return true if the list contains the scalar, false if not. + * Surprisingly not a FreeMarker builtin. + * This function is used internally but can be accessed by user code if required. + * + * @param list the list to search for the item + * @param item the item to search for in the list + * @return true if item is found in the list, false otherwise +--> +<#function contains list item> + <#list list as nextInList> + <#if nextInList == item><#return true> + + <#return false> + + +<#-- + * closeTag + * + * Simple macro to close an HTML tag that has no body with '>' or '/>', + * depending on the value of a 'xhtmlCompliant' variable in the namespace + * of this library. +--> +<#macro closeTag> + <#if xhtmlCompliant?exists && xhtmlCompliant>/><#else>> + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/tags/list.get.desc.xml b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/tags/list.get.desc.xml new file mode 100644 index 0000000000..48b0fb7a95 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/tags/list.get.desc.xml @@ -0,0 +1,5 @@ + + Tag list + Vertical tag list suitable for right block + /tags/list + \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/tags/list.get.html.ftl b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/tags/list.get.html.ftl new file mode 100644 index 0000000000..597926b1e7 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/WEB-INF/webscripts/tags/list.get.html.ftl @@ -0,0 +1,12 @@ +
        +

        ${msg('section.tags')}

        + <#if !section.tags?? || section.tags?size == 0> +

        ${msg('tags.none')}

        + <#else> + + +
        \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/Thumbs.db new file mode 100644 index 0000000000..fd91598293 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/body_arrow.gif new file mode 100644 index 0000000000..634c350128 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/footer_decoration.gif new file mode 100644 index 0000000000..16b98fcf8a Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/header_bg.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/header_bg.gif new file mode 100644 index 0000000000..3cdb1a7b96 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/header_bg.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/input_arrow.gif new file mode 100644 index 0000000000..718d363dec Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/menu_decoration.gif new file mode 100644 index 0000000000..fa4e64fca9 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/reverse_arrow.gif new file mode 100644 index 0000000000..515484bab8 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/slide_arrow.gif new file mode 100644 index 0000000000..634c350128 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/styles.css new file mode 100644 index 0000000000..5a9683393d --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_brown/styles.css @@ -0,0 +1,297 @@ +/* this file contains styles for DARK BROWN THEME */ +body { + background:#221d16 url(header_bg.gif) repeat-x top; + color:#68665d; +} +h1, h2, h3 { + color:#b49e27; /* these headers have a dark pink/red colour */ +} +h4 { + color:#807b5c; +} +a { + color:#948968; /* links have a blue colour */ +} +a:hover { + color:#9c894e; +} +input, textarea { + background:#19140d; + border:1px solid #534d45; + color:#68665d; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#0e0b07; +} +blockquote { + background:#19140d; + color:#68665d; /* text colour in the blockqoutes */ +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#68665d; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #363636; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #363636; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #363636; + border-left:1px solid #363636; + border-right:1px solid #363636; + background:#221d16; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#0e0b07; + color:#c3b27e; +} +.jqueryslidemenu ul li a { + color:#948968; +} +.jqueryslidemenu ul li a:hover { + background:0 none; /* background of tabs */ + color:#c3b27e; +} +.jqueryslidemenu ul .selected a { + color:#c3b27e; +} +.slide-1-desc { + background:#19140d; +} +.slide-1-desc h1 { + color:#b49e27; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#737373; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#3c3429 url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#948968; +} +.slideshow-rm:hover { + background:#423c34 url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#948968; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} + +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left: 8px solid #423c34; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#b6a980; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#19140d; +} +.brochure:hover { + background:#19140d; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#5a5642; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#3c3429 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#948968; + text-decoration:none; +} +.body-rm a:hover { + color:#948968; +} +.body-rm:hover { /* read more button hover styles */ + background:#423c34 url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#3c3429 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#948968; + text-decoration:none; +} +.reverse-arrow:hover { + background:#423c34 url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#948968; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#9c894e; +} +/* END footer styles */ + +.interior-header { + background:#19140d; +} +.intheader-paragraph { + color:#68665d; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#19140d; + color:#948968; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #19140d; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#221d16; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#221d16; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#19140d; + color:#948968; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#3c3429; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#3c3429; + color:#948968; +} +/* END tabular data */ +.img-border { + border:6px solid #423c34; +} +.img-border:hover { + border:6px solid #534e47; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might/might not have same styles with blog/comments submit buttons */ +.input-arrow { + background:#534d45 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#5c554c url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { /* these applies for both comments and contact submit buttons */ + background:#3c3429 url(input_arrow.gif) no-repeat; +} +.bc-submit:hover, .contact-submit:hover { /* these applies for both comments and contact submit buttons */ + background:#423c34 url(input_arrow.gif) no-repeat; +} +.bc-submit, .contact-submit { + color:#948968; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #4c4642; + color:#948968; +} +.blog-categ ul li a:hover { + background:#19140d; + border-bottom:1px solid #4c4642; + color:#9c894e; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#b49e27; + text-decoration:none; +} +.pagination .page-number { + color:#68665d; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { /* text color attached to map on contact page */ + color:#5a5642; +} +.address-box address span { /* text color in address section on contact page */ + color:#68665d; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#807b5c; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + background:#19140d; + border:1px solid #534d45; + color:#bb2507; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + background:#19140d; + border:1px solid #534d45; + color:#0c8122; +} +.contact-jerror { + color:#bb2507; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/Thumbs.db new file mode 100644 index 0000000000..4d9e4b3413 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/body_arrow.gif new file mode 100644 index 0000000000..243ea44632 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/footer_decoration.gif new file mode 100644 index 0000000000..832babf517 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/header_bg.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/header_bg.gif new file mode 100644 index 0000000000..076d3f36c2 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/header_bg.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/input_arrow.gif new file mode 100644 index 0000000000..2379ca7506 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/menu_decoration.gif new file mode 100644 index 0000000000..0e187bfd51 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/reverse_arrow.gif new file mode 100644 index 0000000000..cfdbcb9eec Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/slide_arrow.gif new file mode 100644 index 0000000000..243ea44632 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/styles.css new file mode 100644 index 0000000000..7050b62e00 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_orange/styles.css @@ -0,0 +1,294 @@ +/* this file contains styles for DARK ORANGE THEME */ +body { + background:#252525 url(header_bg.gif) repeat-x top; + color:#737373; +} +h1, h2, h3 { + color:#d08d04; /* these headers have a dark pink/red colour */ +} +h4 { + color:#a5a5a5; +} +a { + color:#b6a980; /* links have a blue colour */ +} +a:hover { + color:#b7a058; +} +input, textarea { + background:#202020; + border:1px solid #414141; + color:#868686; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#2a2a2a; +} +blockquote { + background:#202020; + color:#a5a5a5; /* text colour in the blockqoutes */ +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#a5a5a5; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #363636; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #363636; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #363636; + border-left:1px solid #363636; + border-right:1px solid #363636; + background:#252525; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#2a2a2a; + color:#b7a058; +} +.jqueryslidemenu ul li a { + color:#a5a5a5; +} +.jqueryslidemenu ul li a:hover { + background:0 none; /* background of tabs */ + color:#b7a058; +} +.jqueryslidemenu ul .selected a { + color:#b7a058; +} +.slide-1-desc { + background:#202020; +} +.slide-1-desc h1 { + color:#d08d04; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#737373; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#292929 url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#868686; +} +.slideshow-rm:hover { + background:#383838 url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#868686; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} + +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #363636; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#b6a980; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#2a2a2a; +} +.brochure:hover { + background:#2a2a2a; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#565656; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#303030 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#868686; + text-decoration:none; +} +.body-rm a:hover { + color:#868686; +} +.body-rm:hover { /* read more button hover styles */ + background:#383838 url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#303030 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#868686; + text-decoration:none; +} +.reverse-arrow:hover { + background:#383838 url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#b6a980; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#b7a058; +} +/* END footer styles */ + +.interior-header { + background:#202020; +} +.intheader-paragraph { + color:#a5a5a5; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#3f3f3f; + color:#737373; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #3f3f3f; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#252525; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#252525; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#363636; + color:#737373; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#3f3f3f; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#3f3f3f; + color:#b7a058; +} +/* END tabular data */ +.img-border { + border:6px solid #363636; +} +.img-border:hover { + border:6px solid #494949; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might/might not have same styles with blog/comments submit buttons */ +.input-arrow { + background:#414141 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#4d4d4d url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { /* these applies for both comments and contact submit buttons */ + background:#303030 url(input_arrow.gif) no-repeat; +} +.bc-submit:hover, .contact-submit:hover { /* these applies for both comments and contact submit buttons */ + background:#383838 url(input_arrow.gif) no-repeat; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #303030; + color:#828282; +} +.blog-categ ul li a:hover { + background:#2a2a2a; + border-bottom:1px solid #494949; + color:#b6a980; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#d08d04; + text-decoration:none; +} +.pagination .page-number { + color:#737373; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { /* text color attached to map on contact page */ + color:#565656; +} +.address-box address span { /* text color in address section on contact page */ + color:#666666; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#a5a5a5; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + background:#202020; + border:1px solid #414141; + color:#bb2507; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + background:#202020; + border:1px solid #414141; + color:#0c8122; +} +.contact-jerror { + color:#bb2507; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/Thumbs.db new file mode 100644 index 0000000000..59d33a1252 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/body_arrow.gif new file mode 100644 index 0000000000..243ea44632 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/footer_decoration.gif new file mode 100644 index 0000000000..832babf517 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/header_bg.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/header_bg.gif new file mode 100644 index 0000000000..076d3f36c2 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/header_bg.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/input_arrow.gif new file mode 100644 index 0000000000..2379ca7506 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/menu_decoration.gif new file mode 100644 index 0000000000..0e187bfd51 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/reverse_arrow.gif new file mode 100644 index 0000000000..cfdbcb9eec Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/slide_arrow.gif new file mode 100644 index 0000000000..243ea44632 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/styles.css new file mode 100644 index 0000000000..da14669043 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/dark_redblue/styles.css @@ -0,0 +1,294 @@ +/* this file contains styles for DARK RED BLUE THEME */ +body { + background:#252525 url(header_bg.gif) repeat-x top; + color:#737373; +} +h1, h2, h3 { + color:#cc0a41; /* these headers have a dark pink/red colour */ +} +h4 { + color:#a5a5a5; +} +a { + color:#518796; /* links have a blue colour */ +} +a:hover { + color:#72afc0; +} +input, textarea { + background:#202020; + border:1px solid #414141; + color:#868686; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#2a2a2a; +} +blockquote { + background:#202020; + color:#a5a5a5; /* text colour in the blockqoutes */ +} + +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#a5a5a5; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #363636; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #363636; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #363636; + border-left:1px solid #363636; + border-right:1px solid #363636; + background:#252525; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#2a2a2a; + color:#72afc0; +} +.jqueryslidemenu ul li a { + color:#518796; +} +.jqueryslidemenu ul li a:hover { + background:0 none; /* background of tabs */ + color:#72afc0; +} +.jqueryslidemenu ul .selected a { + color:#72afc0; +} +.slide-1-desc { + background:#202020; +} +.slide-1-desc h1 { + color:#cc0a41; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#737373; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#292929 url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#868686; +} +.slideshow-rm:hover { + background:#383838 url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#868686; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #363636; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#518796; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#2a2a2a; +} +.brochure:hover { + background:#2a2a2a; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#565656; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#303030 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#868686; + text-decoration:none; +} +.body-rm a:hover { + color:#868686; +} +.body-rm:hover { /* read more button hover styles */ + background:#383838 url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#303030 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#868686; + text-decoration:none; +} +.reverse-arrow:hover { + background:#383838 url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#518796; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#72afc0; +} +/* END footer styles */ + +.interior-header { + background:#202020; +} +.intheader-paragraph { + color:#a5a5a5; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#3f3f3f; + color:#737373; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #3f3f3f; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#252525; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#252525; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#363636; + color:#737373; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#3f3f3f; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#3f3f3f; + color:#518796; +} +/* END tabular data */ +.img-border { + border:6px solid #363636; +} +.img-border:hover { + border:6px solid #494949; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might/might not have same styles with blog/comments submit buttons */ +.input-arrow { + background:#414141 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#4d4d4d url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { /* these applies for both comments and contact submit buttons */ + background:#303030 url(input_arrow.gif) no-repeat; +} +.bc-submit:hover, .contact-submit:hover { /* these applies for both comments and contact submit buttons */ + background:#383838 url(input_arrow.gif) no-repeat; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #303030; + color:#828282; +} +.blog-categ ul li a:hover { + background:#2a2a2a; + border-bottom:1px solid #494949; + color:#72afc0; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#cc0a41; + text-decoration:none; +} +.pagination .page-number { + color:#737373; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { /* text color attached to map on contact page */ + color:#565656; +} +.address-box address span { /* text color in address section on contact page */ + color:#666666; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#a5a5a5; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + background:#202020; + border:1px solid #414141; + color:#bb2507; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + background:#202020; + border:1px solid #414141; + color:#0c8122; +} +.contact-jerror { + color:#bb2507; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/general_styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/general_styles.css new file mode 100644 index 0000000000..e5ceb6ddfb --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/general_styles.css @@ -0,0 +1,1059 @@ +p { + text-align: justify; +} +input { + margin:0; + padding:0; +} +blockquote { + background:#f5f5f5; + padding:10px 18px 10px 18px; +} +#body-wrapper { + margin:20px auto; + width:960px; + position: relative; +} +#logo { + position:relative; + float:left; + width:300px; + margin:0 0 10px 0; +} +#logo p { + position:absolute; + top:46px; + left:76px; +} +#logo a { + display:block; + height:62px; + text-indent:-9000px; + width:285px; +} +.search-fieldset { + clear: right; + float:right; + width:192px; + margin: 4px 0 0 0; +} +.search-input { + float:left; + width:167px; + height:15px; + padding:1px 0 0 4px; +} +.input-arrow { + border:0 none; + float:left; + height:18px; + position:relative; + left:-1px; + width:18px; + text-indent:-9000px; /* this hides the default text that comes on a submit input */ +} + +/* link menu */ +.link-menu { + margin: 0 2px 0 0; + float: right; +} +.link-menu ul li { + display: inline; + margin: 0 0 0 9px; +} + +/* main menu */ +.main-menu-wrapper { + float:left; + width:100%; + height:40px; + margin:-20px 0 0 0; +} +.jqueryslidemenu { + display:block; + float:right; + position:relative; + left:18px; + z-index:1; +} +.jqueryslidemenu ul { + list-style-type:none; +} +.jqueryslidemenu .primary-menu { + margin:10px 0 10px 10px; +} + +/*Top level list items*/ +.jqueryslidemenu ul li { + display:inline; + position:relative; + float:left; +} + +/* Top level menu link items style */ +.jqueryslidemenu ul li a { + display:block; + padding:0 18px 10px 18px; /* distance between main menu and dropdowns */ +} + +* html .jqueryslidemenu ul li a { /*IE6 hack to get sub menu links to behave correctly*/ + display:inline-block; +} +.jqueryslidemenu ul li a:hover { + color:#f87b27; +} +/*1st sub level menu*/ +.jqueryslidemenu ul li ul { + display:block; + left:0; + position:absolute; + visibility:hidden; +} + +/* Sub level menu list items (undo style from Top level List Items) */ +.jqueryslidemenu ul li ul li { + display:list-item; + float:none; +} + +/* All subsequent sub menu levels vertical offset after 1st level sub menu */ +.jqueryslidemenu ul li ul li ul { + margin-top:-1px; +} +.jqueryslidemenu ul li ul li ul a { + top:0; +} +/* Sub level menu links style */ +.jqueryslidemenu ul li ul li a { + width:190px; /* width of sub menus */ + padding:6px 5px 6px 10px; + border-top-width:0; +} + +/* START slideshow wrapper */ +#slideshow-wrapper { + float:left; + width:100%; + margin-top:16px; +} +#slideshow { + height:281px; + position:relative; + width:960px; + z-index:0; +} +#slideshow li { + height:281px; + left:0; + opacity:0.0; + position:absolute; + top:0; + z-index:8; +} +#slideshow li.active { + opacity:1.0; + z-index:10; +} +#slideshow li.last-active { + z-index:9; +} +.slide-1-img { + float:left; + width:641px; +} +.slide-1-desc { + float:left; + height:281px; + position:relative; + width:319px; +} +.slide-1-desc h1, .slide-1-desc p { + float:left; + width:284px; + margin:10px 10px 0 16px; +} +.slide-1-desc h1 { + padding-bottom:5px; +} +.slideshow-rm { + bottom:16px; + height:18px; + left:16px; + position:absolute; + width:80px; +} +.slideshow-rm a, .body-rm a, .reverse-arrow a { + display:block; + float:left; + margin-left:22px; +} +.slide-txt { /* styles for semi-tranparent background in the slideshow */ + background:url(../img/slide_tr.png) no-repeat top; + bottom:0; + height:50px; + left:0; + position:absolute; + width:100%; +} +.slide-txt h3 { + margin:11px 0 0 12px; +} +/* END slideshow wrapper */ + +#left, #right { + float:left; + margin-top:21px; +} +#left { + width:627px; + margin-right:14px; +} +#right { + width:319px; +} +.latest-news { + float:left; + width:311px; +} +.latest-news h3 { + float:left; + margin:2px 10px 0 0; + width:291px; +} +.ln-list { + float:left; + width:311px; + padding-bottom:6px; +} +.ln-list li { + float:left; + margin:2px 0 2px 0; + padding:3px 0 3px 0; + width:311px; +} +.ln-list li:hover { /* please note: hover on pseudoclasses doesn't work on ie6, but the area will still be clickable, so you won't lose any functionality here */ + cursor:pointer; +} +.ln-list li h6 { + float:left; + margin:0 10px 0 0; + width: 291px; +} +.ln-list li p { + float:left; + margin:0 10px 0 0; +} +.ln-date { + float:left; + margin:0 0 0 0; + width: 100%; +} +#left p { + margin:10px 0 10px 0; +} +#left .header-desc, #right .header-desc { + float:left; + margin:0; + padding:0 0 6px 0; + width:100%; +} +/* START home services and featured case study styles */ +.h-box-1, .h-box-2 { + float:left; + margin-top:10px; +} +.h-box-1 { + margin-right:26px; + width:294px; +} +.h-box-2 { + width:307px; +} +.h-box-img { + float:left; + width:54px; + margin-right:4px; +} +.h-box-1 h3, .h-box-2 h3 { + float:left; + width:234px; + line-height:20px; + margin-top:6px; +} +#left .h-box-1 .h-box-title .header-desc { + float:left; + width:234px; +} +#left .h-box-2 .h-box-title .header-desc { + float:left; + width:249px; +} +.h-box-wrap { + float:left; + width:100%; +} +.h-services-list { + float:left; + width:100%; +} +.h-services-list li { + float:left; + margin:2px 0 2px 0; + width:100%; +} +.h-services-list li a { + display:block; + float:left; + margin-left:19px; +} +.body-rm, .reverse-arrow { + float:left; + height:18px; + padding-right:8px; +} +/* END home services and featured case study styles */ + +/* START newsletter styles */ +.newsletter { + float:left; + margin-top:14px; + width:311px; +} +.newsletter h3 { + float:left; + margin:2px 10px 0 10px; + width:291px; +} +.newsletter-fieldset { + display:inline; + float:left; + width:290px; + margin:10px 0 0 10px; +} +.newsletter-input { + float:left; + height:15px; + padding:1px 0 0 4px; + width:167px; +} +.newsletter p { + float:left; + margin:10px 0 10px 10px; + width:290px; +} +/* END newsletter styles */ + +/* START brochure styles */ +.brochure { + float:left; + margin-top:14px; + padding-bottom:4px; + width:311px; +} +.brochure img { + float:left; + margin:6px 10px 0 10px; + width:43px; +} +.brochure-title { + float:left; + margin-top:8px; +} +.brochure:hover { + cursor:pointer; +} +/* END brochure styles */ + +/* START footer styles */ +#footer { + float:left; + height:70px; + margin-top:15px; + width:960px; +} +#footer ul { + float:left; + width:520px; +} +#footer ul li { + float:left; + margin:10px 24px 0 0; +} +.copyright { + float:right; + width:300px; + text-align:right; + margin-top:10px; +} +/* END footer styles */ + +.interior-header { + float:left; + width:100%; + padding-bottom:8px; + margin-bottom:14px; +} +*:first-child+html .interior-header { /* this applies only to ie7 */ + padding-bottom:14px; +} +.interior-header h2 { + float:left; + margin:10px 14px 0 14px; + width:590px; +} +#left .intheader-paragraph { + float:left; + margin:4px 14px 6px 14px; + width:596px; +} +#left .interior-content h4 { + float:left; + line-height:24px; + margin:6px 0 2px 0; + width:100%; +} +#left .interior-content p { + margin:8px 0 8px 0; +} +#left .interior-content .interior-list { + float:left; + margin:6px 0 3px 0; + width:100%; +} +#left .interior-content .interior-list li { + float:left; + margin:2px 0 2px 0; + width:100%; +} +#left .interior-content .interior-list li span { + display:block; + margin-left:20px; +} +/* START table styles */ +.tbl { + float:left; + margin-top:10px; + width:627px; +} +*:first-child+html .tbl { /* this applies only to ie7 */ + margin-bottom:10px; +} +.tbl td { + float:left; +} +.tbl tr td { + padding:4px 0 4px 14px; +} +.tbl tr .td-1 { + width:116px; +} +.tbl tr .td-2 { + width:98px; +} +.tbl tr .td-3 { + width:98px; +} +.tbl tr .td-4 { + width:130px; +} +.tbl tr .td-5 { + width:115px; +} +/* END table styles */ + +/* START tabular data block */ +.tabular-block { + float:left; + margin-top:14px; + width:311px; +} +#tabs { + float:left; + margin-left:10px; + width:301px; +} +.tabular-block h3 { + margin:0 0 0 10px; +} +.tabular-block h4 { + margin-top:12px; +} +.ui-tabs .ui-tabs-nav { + margin:10px 0 0 0; +} +.ui-tabs .ui-tabs-nav li { + float:left; + margin:0 1px 0 1px; + width:98px; +} +.ui-tabs .ui-tabs-nav li a { + display:block; + height:20px; + padding-top:4px; + text-align:center; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + cursor:text; +} +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { + cursor: pointer; +} /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { + float:left; + margin:6px 0 0 1px; + width:298px; +} +.ui-tabs .ui-tabs-panel h6 { + margin:6px 0 0 0; +} +.ui-tabs .ui-tabs-panel p { + margin:4px 0 8px 0; +} +.ui-tabs .ui-tabs-hide { + display: none !important; +} +/* END tabular data block */ +.blog-list-misc { + display:block; + padding:4px 0 2px 0; +} +.blog-misc { + display:block; + padding:4px 0 2px 0; + float: left; +} +.blog-share { + float:left; + margin-top:14px; +} +#left .interior-content .blog-share ul li { + float:left; + margin:4px 23px 0 0; + width:16px; +} +.blog-comment-fieldset { + float:left; + width:100%; + margin:0 0 0 0; +} +.blog-comment-fieldset ul { + float:left; + width:100%; +} +.blog-comment-fieldset ul li { + float:left; + margin:4px 0 4px 0; + width:100%; +} +.blog-comment-fieldset ul li label { + float:left; + margin:0 0 0 12px; +} +.bc-input { + float:left; + width:210px; + padding:2px; +} +.bc-textarea { + height:124px; + float:left; + overflow:hidden; + padding:2px; + width:494px; +} +.bc-submit { + border:0 none; + float:left; + height:18px; + width:54px; + padding-left:8px; +} +/* START flickr */ +.flickr { + float:left; + margin-top:14px; + width:311px; +} +*:first-child+html .flickr { + padding-bottom:14px; +} +.flickr h3 { + float:left; + margin:2px 10px 0 10px; + width:291px; +} +.flickr ul { + float:left; + margin:10px 0 0 0; + width:311px; +} + +.flickr ul li { + float:left; + margin:0 0 10px 12px; + width:90px; +} +/* END flickr */ + +/* START blog styles */ +.blog-categ { + float:left; + width:311px; + margin-bottom:14px; + padding-bottom:7px; +} +.blog-categ h3 { + float:left; + margin:2px 10px 0 0; + width:291px; +} +.blog-categ ul { + float:left; + margin:10px 0 0 0; + width:311px; +} +.blog-categ ul li { + float:left; + margin-left: 0; +} +.blog-categ ul li a { + float:left; + display:block; + width:288px; + padding:5px 0 5px 8px; +} +.blog-entry { + float:left; + width:100%; + margin-bottom:32px; +} +/* END blog styles */ + +/* START pagination styles */ +.pagination { + float:left; + width:100%; +} +.pagination .reverse-arrow { + margin-right:10px; +} +.pagination .page-number { + display:block; + float:right; + width:150px; + text-align:right; +} +/* END pagination styles */ + +/* START services styles */ +.services-wrapper { + clear: left; + float: left; + width: 640px; + margin: 25px 0 0 0; + padding: 0 0 0 0; +} +.services-wrapper li { + float:left; + margin:2px 0 0 0; + padding-bottom:16px; +} +.services-wrapper li.odd { + clear: left; + float: left; + margin: 2px 14px 0 0; + padding-bottom: 16px; +} +.services-wrapper li img { + float:left; + margin:0 8px 0 0; + width:72px; +} +.services-wrapper li .service-txt { + float:left; + width: 300px; + margin-top:-8px; +} +#left .services-wrapper li .service-txt p { + margin-top: 4px; +} +.services-wrapper .newslist-date { + width: 300px; +} + +#left .interior-content .services-wrapper li .service-txt h4 { + margin-bottom:-3px; +} +/* END services styles */ + +.ih-date { + color:#a1a1a1; + display:block; + margin:0; + width: 540px; + float: left; +} +.left-img { + float:left; + margin:6px 14px 0 0; +} +.right-img { + float:right; + margin:6px 0 0 14px; +} +.bq-detailpage { + float:right; + width:236px; + margin-left:10px; +} +.bq-detailpage .bq-author { + text-align:right; +} +/* START right box services list styles */ +.services-box { + float:left; + margin-bottom:14px; + width:311px; +} +.services-box h3 { + float:left; + margin:2px 0 0 0; + width:291px; +} +.services-box p { + float:left; + margin:2px 0 0 1; + width:297px; +} +.services-box-list { + float:left; + margin: 0 0 3px 0; + width:291px; +} +.services-box-list li { + float:left; + margin:2px 0 2px 0; + width:100%; +} +.services-box-list li a { + display:block; + margin-left:20px; +} +/* END right box services list styles */ + +/* START about us box */ +.aboutus-box { + float:left; + margin-top:14px; + padding-bottom:14px; + width:311px; +} +.aboutus-box h3 { + float:left; + margin:2px 0 0 0; + width:291px; +} +.aboutus-box p { + float:left; + margin:2px 0 0 1px; + width:297px; +} +.aboutus-box .body-rm { + margin:3px 0 0 0; +} +/* END about us box */ + +/* START contact form styles */ +.contact-fieldset { + float:left; + width:100%; + margin:12px 0 0 0; +} +.contact-fieldset ul { + float:left; + margin-top:10px; + width:100%; +} +.contact-fieldset ul li { + float:left; + margin:4px 0 4px 0; + width:100%; +} +.contact-fieldset ul li label { + float:left; + width:100px; +} +.contact-input { + float:left; + width:210px; + padding:2px; +} +.contact-textarea { + height:116px; + float:left; + overflow:hidden; + padding:2px; + width:320px; +} +.contact-submit { + border:0 none; + float:left; + height:19px; + margin-left:100px; + padding-left:8px; + padding:0 0 1px 8px; + width:100px; +} +/* END contact form styles */ + +/* START map and address styles */ +.address-box { + float:left; + padding-bottom:14px; + width:311px; +} +.address-box h3 { + float:left; + margin:2px 0 0 0; + width: 100%; +} +.address-box .map-img { + margin:10px 0 0 1px; +} +.address-box .map-txt { + float:left; + padding-bottom:6px; + position:relative; + left:11px; + top:-2px; + width:297px; +} +.address-box address { + float:left; + margin:2px 0 0 1px; + width:297px; +} +.address-box address span { + display:block; + margin:6px 0 0 0; +} +/* END map and address styles */ + +/* START news list styles */ +.ih-rss { + display:block; + margin:0 0 0 16px; + padding-bottom:4px; +} +.ih-rss img { + margin-right:5px; + position:relative; + top:3px; +} +.newslist-wrapper { + float:left; + padding-bottom:10px; + width:100%; +} +*:first-child+html .newslist-wrapper { /* this applies only to ie7 */ + padding-bottom:20px; +} +.newslist-wrapper li { + float:left; + width:100%; + margin:12px 0 12px 0; +} +.newslist-wrapper li .news-img { + float:left; + margin:0 12px 0 0; + width:72px; +} + +#left .interior-content .newslist-wrapper li h4, .newslist-date, #left .interior-content .newslist-wrapper li p { + float:left; + width:540px; +} +#left .interior-content .newslist-wrapper li h4 { + margin:-3px 0 0 -1px; +} +.newslist-date { + display:block; + line-height:12px; +} +#left .interior-content .newslist-wrapper li p { + margin:6px 0 0 0; + padding:0; +} +/* END news list styles */ + +/* START portfolio page styles */ +#full {/* full content wrapper - use this class when you don't want to have body splitted into left and right standard containers */ + float:left; + margin-top:21px; + width:960px; +} +#full .full-h { + margin:10px 14px 0 14px; + width:932px; +} +#full .intheader-paragraph { + float:left; + margin:4px 14px 8px 14px; + width:932px; +} +.portfolio-wrapper { + float:left; + width:990px; + margin:0 0 0 -30px; +} +.portfolio-wrapper li { + float:left; + margin:16px 0 0px 30px; + width:215px; + min-height: 270px; +} +.portfolio-wrapper li h4 { + float:left; + margin:0 7px 8px 7px; + width:215px; +} +/* END portfolio page styles */ + +.contact-error { + float:left; +} +.contact-success { + float:left; + margin-bottom: 20px; +} +.contact-error p, .contact-success p { + padding:0 10px 0 10px; +} +.contact-error-value { + padding-left: 20px; +} +.contact-error-comment { + clear: both; + display: block; + padding-left: 0; +} + +/* featured news */ +.featured-news h2 { + margin-bottom: 2px; +} +.featured-news-body { + clear:left; +} + +/* editor button */ +.alfresco-content-marker { + float: right; +} + +/* article */ +.article-body { + clear: both; + float: left; + width: 100%; +} + +/* facebook-like */ +.facebook-like { + float:left; + margin-top:14px; + padding-top: 14px; +} + +/* article tag list */ +h3.tag-list { + clear: left; + width: 100% +} +ul.tag-list { + float: left; + width: 100%; +} + +ul.tag-list li { + display: inline; + float: left; + padding: 0 6px 0 15px; +} +.tag-list-footer { + clear: both; +} + +/* publications full width list */ +.publications-list { + float:left; + padding-bottom:10px; + width:100%; +} +*:first-child+html .publications-list { /* this applies only to ie7 */ + padding-bottom:20px; +} +.publications-list li.entry { + float:left; + width:100%; + margin:12px 0 12px 0; +} +.publications-list li.entry .img-border { + float:left; + margin:0 12px 0 0; +} +.publications-list-detail { + width: 820px; + float: left; +} +.publications-list-detail h3 { + width: 100%; + float:left; +} +.publications-list-detail .newslist-date { + width: 100%; + float: left; +} +.publications-list-detail p { + float:left; + margin:6px 0 0 0; + padding:0; + width: 100%; +} +.publications-list-detail ul.tag-list { + float: left; + width: 100%; +} +.publications-list-detail p.tag-list { + float: left; +} + +/* comments */ +.comments-wrapper { + clear: both; + padding-top: 6px; +} +.comments-wrapper li { + border: 6px solid #EFEFEF; + margin: 2px 0 10px 0; + padding: 5px; + width: 610px; +} +.comments-text { + float: left; + /*margin-bottom: 2px;*/ + width: 100%; +} +*:first-child+html .comments-text { /* this applies only to ie7 */ + padding-bottom:1px; +} +.comments-report { + float: right; +} + +/* error page */ +.error { + margin: 50px 0 300px 0; +} + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/ie6.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/ie6.css new file mode 100644 index 0000000000..5188d43232 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/ie6.css @@ -0,0 +1,64 @@ +/* double float bug */ +.slide-1-desc h1, +.slide-1-desc p, +.slideshow-rm, +.slideshow-rm a, +.latest-news h3, +.ln-list li h6, +.ln-list li p, +.ln-date, +.h-services-list li a, +.body-rm, +.body-rm a, +.reverse-arrow, +.reverse-arrow a, +.newsletter h3, +.newsletter p, +.interior-header h2, +.intheader-paragraph, +#tabs, +.ui-tabs .ui-tabs-nav li, +.flickr h3, +.flickr ul, +.flickr ul li, +.blog-categ h3, +.blog-categ ul li, +.services-wrapper li, +.services-box h3, +.services-box-list, +.services-box p, +.aboutus-box h3, +.aboutus-box p, +.address-box h3, +.address-box address, +.portfolio-wrapper li, +.portfolio-wrapper li h4 { + display:inline; +} + +#footer { + margin:5px -1px 0 0; + width:959px; +} +.tbl { + margin-bottom:12px; +} +.tabular-block h4 { + margin-top:5px; +} +.blog-misc .bm-square { + font-size:0; + line-height:0; +} +.flickr { + padding-bottom:14px; +} +.pagination { + padding-bottom:10px; +} +.slide-txt { + bottom:3px; +} +.interior-header { + padding-bottom:12px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/index.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/index.css new file mode 100644 index 0000000000..b353ce36e8 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/index.css @@ -0,0 +1,19 @@ +@import url("reset.css"); +@import url("typography.css"); +@import url("general_styles.css"); +@import url("slimbox2.css"); + +/* these are the available themes: uncomment the css for the theme you want to activate */ + +@import url("white_blue/styles.css"); +/* +@import url("white_orange/styles.css"); +@import url("white_green/styles.css"); +@import url("dark_brown/styles.css"); +@import url("dark_orange/styles.css"); +@import url("dark_redblue/styles.css"); +@import url("red_brown/styles.css"); +@import url("krem/styles.css"); +*/ + + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/Thumbs.db new file mode 100644 index 0000000000..df1f0566fa Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/body_arrow.gif new file mode 100644 index 0000000000..4f9db58e14 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/footer_decoration.gif new file mode 100644 index 0000000000..5c893fe2e8 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/input_arrow.gif new file mode 100644 index 0000000000..51bc7eb277 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/menu_decoration.gif new file mode 100644 index 0000000000..6afdba6e0a Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/reverse_arrow.gif new file mode 100644 index 0000000000..eb341886c3 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/slide_arrow.gif new file mode 100644 index 0000000000..21c3ddb994 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/styles.css new file mode 100644 index 0000000000..3da9f47e02 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/krem/styles.css @@ -0,0 +1,294 @@ +/* this file contains styles for KREM THEME */ +body { + background:#f2f1e6; + color:#575757; +} +h1, h2, h3 { + color:#3b6d09; /* these headers have a dark pink/red colour */ +} +h4 { + color:#a48e4c; +} +a { + color:#9f8843; /* links have a krem colour */ +} +a:hover { + color:#c2950e; +} +input, textarea { + background:#fff; + border:1px solid #c5c3ad; + color:#868686; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + border:1px solid #a5a390; +} +blockquote { + background:#e7e6da; + color:#aaa473; /* text colour in the blockqoutes */ +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#aaa473; +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #dcd9c3; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #dcd9c3; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #dcd9c3; + border-left:1px solid #dcd9c3; + border-right:1px solid #dcd9c3; + background:#f2f1e6; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#e7e5d5; + color:#c2950e; +} +.jqueryslidemenu ul li a { + color:#948968; +} +.jqueryslidemenu ul li a:hover { + background:0 none; /* background of tabs */ + color:#c2950e; +} +.jqueryslidemenu ul .selected a { + color:#c2950e; +} +.slide-1-desc { + background:#548525; +} +.slide-1-desc h1 { + color:#fff; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#fff; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#548525; +} +.slideshow-rm:hover { + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#548525; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #dcd9c3; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#9f8843; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#e7e6da; +} +.brochure:hover { + background:#e7e6da; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#a5a390; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#a5a390 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#fff; + text-decoration:none; +} +.body-rm a:hover { + color:#fff; +} +.body-rm:hover { /* read more button hover styles */ + background:#8b8979 url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#a5a390 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#fff; + text-decoration:none; +} +.reverse-arrow:hover { + background:#8b8979 url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#9f8843; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#c2950e; +} +/* END footer styles */ + +.interior-header { + background:#e7e6da; +} +.intheader-paragraph { + color:#b8b38a; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#a5a390; + color:#fff; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #c4c3bf; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#f2f1e6; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#e7e6da; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#dcd9c3; + color:#9f8843; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#a5a390; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#a5a390; + color:#fff; +} +/* END tabular data */ +.img-border { + border:6px solid #dcd9c3; +} +.img-border:hover { + border:6px solid #c1bea6; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might/might not have same styles with blog/comments submit buttons */ +.input-arrow { + background:#a5a390 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#8b8979 url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { /* these applies for both comments and contact submit buttons */ + background:#a5a390 url(input_arrow.gif) no-repeat; +} +.bc-submit:hover, .contact-submit:hover { /* these applies for both comments and contact submit buttons */ + background:#8b8979 url(input_arrow.gif) no-repeat; +} +.bc-submit, .contact-submit { + color:#fff; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #d2d2d2; + color:#9f8843; +} +.blog-categ ul li a:hover { + background:#e7e6da; + border-bottom:1px solid #d2cfb7; + color:#c2950e; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#3b6d09; + text-decoration:none; +} +.pagination .page-number { + color:#68665d; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { /* text color attached to map on contact page */ + color:#a5a390; +} +.address-box address span { /* text color in address section on contact page */ + color:#575757; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#a48e4c; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + border:1px solid #eda0a0; + background:#fde3e3; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + border:1px solid #bae5cb; + background:#daffe9; +} +.contact-jerror { + color:#ff502d; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/preview/web-preview.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/preview/web-preview.css new file mode 100644 index 0000000000..dc286ecfca --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/preview/web-preview.css @@ -0,0 +1,21 @@ +.web-preview-empty +{ + height: 80px; + padding-top: 60px; + text-align: center; + border: 1px solid #CCCCCC; +} + +.web-preview-content +{ + height: 670px; + border-left: 1px solid #000000; + border-right: 1px solid #000000; + border-bottom: 1px solid #000000; +} + +.web-preview-image +{ + width: 625px; + border: 1px solid #000000; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/Thumbs.db new file mode 100644 index 0000000000..de3411a315 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/body_arrow.gif new file mode 100644 index 0000000000..cd9c8d1751 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/footer_decoration.gif new file mode 100644 index 0000000000..f1a8c7346f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/input_arrow.gif new file mode 100644 index 0000000000..3a1d64a6be Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/menu_decoration.gif new file mode 100644 index 0000000000..c876af4382 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/reverse_arrow.gif new file mode 100644 index 0000000000..eb341886c3 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/slide_arrow.gif new file mode 100644 index 0000000000..df3d1b180d Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/styles.css new file mode 100644 index 0000000000..f3644bcb0f --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/red_brown/styles.css @@ -0,0 +1,292 @@ +/* this file contains styles for RED BROWN THEME */ +body { + background:#fff; + color:#575757; +} +h1, h2, h3 { + color:#ce470c; /* these headers have orange-red colour */ +} +h4 { + color:#575757; +} +a { + color:#ce470c; /* links have an orange-red colour */ +} +a:hover { + color:#ce470c; +} +input, textarea { + background:#fff; + border:1px solid #b9b9b9; + color:#767676; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#f5f5f5; +} +blockquote { + background:#f5f5f5; + color:#a1a1a1; /* text colour in the blockqoutes */ +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#cacaca; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #efefef; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #efefef; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #efefef; + border-left:1px solid #efefef; + border-right:1px solid #efefef; + background:#fff; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#fafafa; + color:#ce470c; +} +.jqueryslidemenu ul li a { + color:#7d7d7d; +} +.jqueryslidemenu ul li a:hover { + background:#fff; /* background of tabs */ + color:#ce470c; +} +.jqueryslidemenu ul .selected a { + color:#ce470c; +} +.slide-1-desc { + background:#ce470c; +} +.slide-1-desc h1 { + color:#fff; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#fff; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#ce470c; +} +.slideshow-rm:hover { + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#ce470c; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #efefef; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#828282; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#f5f5f5; +} +.brochure:hover { + background:#f5f5f5; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#a1a1a1; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#a3a3a3 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#fff; + text-decoration:none; +} +.body-rm a:hover { + color:#fff; +} +.body-rm:hover { /* read more button hover styles */ + background:#ce470c url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#a3a3a3 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#fff; + text-decoration:none; +} +.reverse-arrow:hover { + background:#ce470c url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#575757; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#ce470c; +} +/* END footer styles */ + +.interior-header { + background:#f5f5f5; +} +.intheader-paragraph { + color:#a1a1a1; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#a3a3a3; + color:#fff; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #dadada; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#fff; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#f5f5f5; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#efefef; + color:#828282; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#a3a3a3; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#a3a3a3; + color:#fff; +} +/* END tabular data */ +.img-border { + border:6px solid #efefef; +} +.img-border:hover { + border:6px solid #cacaca; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might have same styles with blog/comments submit buttons */ +.input-arrow { + background:#a3a3a3 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#ce470c url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { + background:#a3a3a3 url(input_arrow.gif) no-repeat; + color:#fff; +} +.bc-submit:hover, .contact-submit:hover { + background:#ce470c url(input_arrow.gif) no-repeat; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #efefef; + color:#828282; +} +.blog-categ ul li a:hover { + background:#f5f5f5; + border-bottom:1px solid #cacaca; + color:#ce470c; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#ce470c; + text-decoration:none; +} +.pagination .page-number { + color:#a1a1a1; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { + color:#a7a7a7; +} +.address-box address span { + color:#575757; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#ce470c; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + border:1px solid #eda0a0; + background:#fde3e3; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + border:1px solid #bae5cb; + background:#daffe9; +} +.contact-jerror { + color:#ff502d; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/reset.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/reset.css new file mode 100644 index 0000000000..ab1f9cf21f --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/reset.css @@ -0,0 +1,64 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; +} +/* remember to define focus styles! */ +:focus { + outline: 0; +} +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse:collapse; + border-spacing: 0; +} + +/* clearfix hack */ +.clearfix:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} +.clearfix { + display: inline-block; +} +html[xmlns] .clearfix { + display: block; +} +* html .clearfix { + height: 1%; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/slimbox2.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/slimbox2.css new file mode 100644 index 0000000000..bfab00fe57 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/slimbox2.css @@ -0,0 +1,83 @@ +/* SLIMBOX */ + +#lbOverlay { + position: fixed; + z-index: 9999; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #000; + cursor: pointer; +} + +#lbCenter, #lbBottomContainer { + position: absolute; + z-index: 9999; + overflow: hidden; + background-color: #fff; +} + +.lbLoading { + background: #fff url(../img/loading.gif) no-repeat center; +} + +#lbImage { + position: absolute; + left: 0; + top: 0; + border: 10px solid #fff; + background-repeat: no-repeat; +} + +#lbPrevLink, #lbNextLink { + display: block; + position: absolute; + top: 0; + width: 50%; + outline: none; +} + +#lbPrevLink { + left: 0; +} + +#lbPrevLink:hover { + background: transparent url(../img/prevlabel.gif) no-repeat 0 15%; +} + +#lbNextLink { + right: 0; +} + +#lbNextLink:hover { + background: transparent url(../img/nextlabel.gif) no-repeat 100% 15%; +} + +#lbBottom { + font-family: Verdana, Arial, Geneva, Helvetica, sans-serif; + font-size: 10px; + color: #666; + line-height: 1.4em; + text-align: left; + border: 10px solid #fff; + border-top-style: none; +} + +#lbCloseLink { + display: block; + float: right; + width: 66px; + height: 22px; + background: transparent url(../img/closelabel.gif) no-repeat center; + margin: 5px 0; + outline: none; +} + +#lbCaption, #lbNumber { + margin-right: 71px; +} + +#lbCaption { + font-weight: bold; +} diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/typography.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/typography.css new file mode 100644 index 0000000000..9b2f83e6a9 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/typography.css @@ -0,0 +1,99 @@ +/* START standard styles */ +body { + font-family:Arial, Helvetica, sans-serif; + font-size:12px; + line-height:18px; +} +h1, h2, h3, h4, h5, h6 { + font-weight:normal; +} +h1 { + font-size:28px; + line-height:34px; +} +h2 { + font-size:26px; + line-height:28px; +} +h3 { + font-size:18px; + line-height:26px; +} +h4 { + font-size:16px; /* please note: in 2 cases font size for h4 tag is 15px and not 16px: 1) on portfolio page and 2) on services list page */ + line-height:20px; +} +h5 { + font-size:14px; + font-weight:bold; + line-height:18px; +} +h6 { + font-size:13px; + font-weight:bold; +} +a { + text-decoration:none; +} +a:hover { + text-decoration:underline; +} +input { + font-size:11px; +} +blockquote { + font-style:italic; + font-weight:bold; + font-size:13px; +} +address { + font-style:italic; +} +textarea { + font-family:Arial, Helvetica, sans-serif; + font-size:11px; +} +/* END standard styles */ +.jqueryslidemenu { + font:normal 14px Arial, Helvetica, sans-serif; +} +.jqueryslidemenu ul li ul { + font-size:13px; + line-height:19px; +} +.main-menu-wrapper .jqueryslidemenu ul li a, .ln-list li h6 a { + text-decoration:none; +} +.logo-desc, .header-desc, .intheader-paragraph { + font-size:13px; + font-style:italic; + font-weight:bold; +} +.slideshow-rm a:hover, .body-rm a:hover, .reverse-arrow a:hover { + text-decoration:none; +} +.brochure-title h3 { + line-height:24px; +} +#footer { + font-size:11px; +} +#footer ul li a:hover { /* removes the underline on footer links on mouse over */ + text-decoration:none; +} +.blog-misc a:hover { + text-decoration:underline; +} +.ui-tabs .ui-tabs-nav li a:hover, .blog-misc a:hover { /* removes the underline on tab names on mouse over */ + text-decoration:none; +} +.blog-categ ul li a { + font-size:13px; +} +/* change the size of h4 header on portfolio and services pages */ +.portfolio-wrapper li h4 { + font-size:15px; +} +#left .interior-content .services-wrapper li .service-txt h4 { + font-size:15px; +} diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/Thumbs.db new file mode 100644 index 0000000000..417f046a0d Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/body_arrow.gif new file mode 100644 index 0000000000..cd9c8d1751 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/footer_decoration.gif new file mode 100644 index 0000000000..f1a8c7346f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/input_arrow.gif new file mode 100644 index 0000000000..3a1d64a6be Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/menu_decoration.gif new file mode 100644 index 0000000000..c876af4382 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/reverse_arrow.gif new file mode 100644 index 0000000000..eb341886c3 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/slide_arrow.gif new file mode 100644 index 0000000000..9eab0c7e6f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/styles.css new file mode 100644 index 0000000000..228e2bffbf --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_blue/styles.css @@ -0,0 +1,304 @@ +/* this file contains styles for WHITE BLUE THEME */ +body { + background:#fff; + color:#666666; +} +h1, h2, h3 { + color:#0875ba; /* these headers have blue colour */ +} +h4 { + color:#666666; +} +a { + color:#0875ba; /* links have a blue colour */ +} +a:hover { + color:#0875ba; +} +input, textarea { + background:#fff; + border:1px solid #b9b9b9; + color:#767676; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#f5f5f5; +} +blockquote { + background:#f5f5f5; + color:#a1a1a1; /* text colour in the blockqoutes */ +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#cacaca; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #efefef; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #efefef; +} + +/* Added for ALF-14758 */ +.jqueryslidemenu ul li ul li ul li ul { + border-color: #cfcfcf; +} + +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #efefef; + border-left:1px solid #efefef; + border-right:1px solid #efefef; + background:#fff; +} + +/* Added for ALF-14758 */ +.jqueryslidemenu ul li ul li ul li ul li a { + border-color: #cfcfcf; +} + +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#fafafa; + color:#0875ba; +} +.jqueryslidemenu ul li a { + color:#7d7d7d; +} +.jqueryslidemenu ul li a:hover { + background:#fff; /* background of tabs */ + color:#0875ba; +} +.jqueryslidemenu ul .selected a { + color:#0875ba; +} +.slide-1-desc { + background:#0875ba; +} +.slide-1-desc h1 { + color:#fff; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#fff; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#0875ba; +} +.slideshow-rm:hover { + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#0875ba; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #efefef; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#828282; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#f5f5f5; +} +.brochure:hover { + background:#f5f5f5; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#a1a1a1; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#a3a3a3 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#fff; + text-decoration:none; +} +.body-rm a:hover { + color:#fff; +} +.body-rm:hover { /* read more button hover styles */ + background:#0875ba url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#a3a3a3 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#fff; + text-decoration:none; +} +.reverse-arrow:hover { + background:#0875ba url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#666666; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#0875ba; +} +/* END footer styles */ + +.interior-header { + background:#f5f5f5; +} +.intheader-paragraph { + color:#a1a1a1; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#a3a3a3; + color:#fff; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #dadada; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#fff; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#f5f5f5; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#efefef; + color:#828282; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#a3a3a3; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#a3a3a3; + color:#fff; +} +/* END tabular data */ +.img-border { + border:6px solid #efefef; +} +.img-border:hover { + border:6px solid #cacaca; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might have same styles with blog/comments submit buttons */ +.input-arrow { + background:#a3a3a3 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#0875ba url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { + background:#a3a3a3 url(input_arrow.gif) no-repeat; + color:#fff; +} +.bc-submit:hover, .contact-submit:hover { + background:#0875ba url(input_arrow.gif) no-repeat; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #efefef; + color:#828282; +} +.blog-categ ul li a:hover { + background:#f5f5f5; + border-bottom:1px solid #cacaca; + color:#0875ba; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#0875ba; + text-decoration:none; +} +.pagination .page-number { + color:#a1a1a1; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { + color:#a7a7a7; +} +.address-box address span { + color:#666666; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#666666; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + border:1px solid #eda0a0; + background:#fde3e3; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + border:1px solid #bae5cb; + background:#daffe9; +} +.contact-jerror { + color:#ff502d; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/Thumbs.db new file mode 100644 index 0000000000..c52f4ecc93 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/body_arrow.gif new file mode 100644 index 0000000000..cd9c8d1751 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/footer_decoration.gif new file mode 100644 index 0000000000..f1a8c7346f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/input_arrow.gif new file mode 100644 index 0000000000..3a1d64a6be Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/menu_decoration.gif new file mode 100644 index 0000000000..c876af4382 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/reverse_arrow.gif new file mode 100644 index 0000000000..eb341886c3 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/slide_arrow.gif new file mode 100644 index 0000000000..b7e2c4d0ee Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/styles.css new file mode 100644 index 0000000000..e875aeb430 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_green/styles.css @@ -0,0 +1,292 @@ +/* this file contains styles for WHITE GREEN THEME */ +body { + background:#fff; + color:#666666; +} +h1, h2, h3 { + color:#7db20c; /* these headers have green colour */ +} +h4 { + color:#666666; +} +a { + color:#7db20c; /* links have a green colour */ +} +a:hover { + color:#7db20c; +} +input, textarea { + background:#fff; + border:1px solid #b9b9b9; + color:#767676; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#f5f5f5; +} +blockquote { + background:#f5f5f5; + color:#a1a1a1; /* text colour in the blockqoutes */ +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#cacaca; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #efefef; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #efefef; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #efefef; + border-left:1px solid #efefef; + border-right:1px solid #efefef; + background:#fff; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#fafafa; + color:#7db20c; +} +.jqueryslidemenu ul li a { + color:#7d7d7d; +} +.jqueryslidemenu ul li a:hover { + background:#fff; /* background of tabs */ + color:#7db20c; +} +.jqueryslidemenu ul .selected a { + color:#7db20c; +} +.slide-1-desc { + background:#7db20c; +} +.slide-1-desc h1 { + color:#fff; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#fff; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#7db20c; +} +.slideshow-rm:hover { + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#7db20c; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #efefef; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#828282; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#f5f5f5; +} +.brochure:hover { + background:#f5f5f5; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#a1a1a1; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#a3a3a3 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#fff; + text-decoration:none; +} +.body-rm a:hover { + color:#fff; +} +.body-rm:hover { /* read more button hover styles */ + background:#7db20c url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#a3a3a3 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#fff; + text-decoration:none; +} +.reverse-arrow:hover { + background:#7db20c url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#666666; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#7db20c; +} +/* END footer styles */ + +.interior-header { + background:#f5f5f5; +} +.intheader-paragraph { + color:#a1a1a1; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#a3a3a3; + color:#fff; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #dadada; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#fff; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#f5f5f5; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#efefef; + color:#828282; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#a3a3a3; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#a3a3a3; + color:#fff; +} +/* END tabular data */ +.img-border { + border:6px solid #efefef; +} +.img-border:hover { + border:6px solid #cacaca; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might have same styles with blog/comments submit buttons */ +.input-arrow { + background:#a3a3a3 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#7db20c url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { + background:#a3a3a3 url(input_arrow.gif) no-repeat; + color:#fff; +} +.bc-submit:hover, .contact-submit:hover { + background:#7db20c url(input_arrow.gif) no-repeat; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #efefef; + color:#828282; +} +.blog-categ ul li a:hover { + background:#f5f5f5; + border-bottom:1px solid #cacaca; + color:#7db20c; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#7db20c; + text-decoration:none; +} +.pagination .page-number { + color:#a1a1a1; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { + color:#a7a7a7; +} +.address-box address span { + color:#666666; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#666666; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + border:1px solid #eda0a0; + background:#fde3e3; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + border:1px solid #bae5cb; + background:#daffe9; +} +.contact-jerror { + color:#ff502d; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/Thumbs.db new file mode 100644 index 0000000000..84efe4d110 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/body_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/body_arrow.gif new file mode 100644 index 0000000000..cd9c8d1751 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/body_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/footer_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/footer_decoration.gif new file mode 100644 index 0000000000..f1a8c7346f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/footer_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/input_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/input_arrow.gif new file mode 100644 index 0000000000..3a1d64a6be Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/input_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/logo.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/logo.png new file mode 100644 index 0000000000..cb7ac6e3c1 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/logo.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/menu_decoration.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/menu_decoration.gif new file mode 100644 index 0000000000..c876af4382 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/menu_decoration.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/reverse_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/reverse_arrow.gif new file mode 100644 index 0000000000..eb341886c3 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/reverse_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/slide_arrow.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/slide_arrow.gif new file mode 100644 index 0000000000..2505bac165 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/slide_arrow.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/styles.css b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/styles.css new file mode 100644 index 0000000000..2fe97df823 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/css/white_orange/styles.css @@ -0,0 +1,293 @@ +/* this file contains styles for WHITE ORANGE THEME */ +body { + background:#fff; + color:#666666; +} +h1, h2, h3 { + color:#f87b27; /* these headers have orange colour */ +} +h4 { + color:#666666; +} +a { + color:#f87b27; /* links have an orange colour */ +} +a:hover { + color:#f87b27; +} +input, textarea { + background:#fff; + border:1px solid #b9b9b9; + color:#767676; /* this is the text in the input forms */ +} +input:focus, textarea:focus { + background:#f5f5f5; +} +blockquote { + background:#f5f5f5; + color:#a1a1a1; /* text colour in the blockqoutes */ +} +.article-body ol { + margin-left: 40px; + list-style-type: decimal; +} +.article-body ul { + margin-left: 40px; + list-style-type: disc; +} +.logo-desc, .header-desc { /* this is the italic text used an additional description for headers and detail pages */ + color:#cacaca; +} +#logo a {/* this is the actual logo */ + background:url(logo.png) no-repeat; +} +.main-menu-wrapper { + background:url(menu_decoration.gif) no-repeat bottom; /* this represents the line decoration for main menu */ +} +.jqueryslidemenu ul li ul { + border-top:1px solid #efefef; /* border top of first sub level menu */ +} +.jqueryslidemenu ul li ul li ul { + border-top:1px solid #efefef; +} +.jqueryslidemenu ul li ul li a { + border-bottom:1px solid #efefef; + border-left:1px solid #efefef; + border-right:1px solid #efefef; + background:#fff; +} +.jqueryslidemenu ul li ul li a:hover { /* sub menus hover style */ + background:#fafafa; + color:#f87b27; +} +.jqueryslidemenu ul li a { + color:#7d7d7d; +} +.jqueryslidemenu ul li a:hover { + background:#fff; /* background of tabs */ + color:#f87b27; +} +.jqueryslidemenu ul .selected a { + color:#f87b27; +} +.slide-1-desc { + background:#f87b27; +} +.slide-1-desc h1 { + color:#fff; +} +.slide-1-desc p { /* text colour in the right side of home slider */ + color:#fff; +} +.slideshow-rm { /* learn more styles in the home slideshow */ + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a { + color:#f87b27; +} +.slideshow-rm:hover { + background:#fff url(slide_arrow.gif) no-repeat 7px 5px; +} +.slideshow-rm a:hover { + color:#f87b27; +} +.slide-txt h3 a, .slide-txt h3 { /* color of text header(with link) with the semi-transparent black background */ + color:#fff; + text-decoration:none; +} +#right .latest-news, #right .newsletter, #right .brochure, #right .tabular-block, #right .flickr, + #right .blog-categ, #right .services-box, #right .aboutus-box, #right .address-box, #right .facebook-like { + border-left:8px solid #efefef; /* border colour that separates left from right container */ + padding-left: 10px; +} +.ln-list li h6 a, .ln-list li h6 a { /* colour for latest news headers box */ + color:#828282; +} +.ln-list li h6 a:hover { + text-decoration:none; +} +/* hover backgrounds for home news list and brochure, these 2 should be the same but I wrote them separately just in case */ +.ln-list li:hover { + background:#f5f5f5; +} +.brochure:hover { + background:#f5f5f5; +} +/* end hover backgrounds */ + +.ln-date, /* latest news date colour */ + /* next 2 classes are for article's date and comments in the blog section */ +.blog-misc, +.blog-misc a, +.blog-list-misc, +.blog-list-misc a, +.ih-rss a, /* rss text on news page */ +.newslist-date /* news date text on news page */ { + color:#a1a1a1; +} +.copyright a { + color:#666666; +} +.newslist-cat{ + color:#0875BA; +} +/* START: read more / reverse arrow button that is found in the normal body gets those properties */ +.body-rm { + background:#a3a3a3 url(input_arrow.gif) no-repeat 3px 1px; +} +.body-rm a { + color:#fff; + text-decoration:none; +} +.body-rm a:hover { + color:#fff; +} +.body-rm:hover { /* read more button hover styles */ + background:#f87b27 url(input_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow { /* button with reversed arrow style, used for pagination */ + background:#a3a3a3 url(reverse_arrow.gif) no-repeat 3px 1px; +} +.reverse-arrow a { + color:#fff; + text-decoration:none; +} +.reverse-arrow:hover { + background:#f87b27 url(reverse_arrow.gif) no-repeat 3px 1px; +} +/* END: read more body buttons styles */ + +/* START footer styles */ +#footer { + background:url(footer_decoration.gif) no-repeat top center; /* this represents the line decoration for footer */ +} +#footer ul li a { /* footer menu normal state colours */ + color:#666666; +} +#footer ul li a:hover { /* footer menu hover state colours */ + color:#f87b27; +} +/* END footer styles */ + +.interior-header { + background:#f5f5f5; +} +.intheader-paragraph { + color:#a1a1a1; +} +#left .interior-content .interior-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +/* START table styles */ +.tbl thead tr td { /* table header background */ + background:#a3a3a3; + color:#fff; +} +.tbl tbody tr td { /* table row line */ + border-bottom:1px solid #dadada; +} +.tbl .odd td { /* table background for odd rows 1, 3, 5... */ + background:#fff; +} +.tbl .even td { /* table background for even rows 2, 4, 6... */ + background:#f5f5f5; +} +/* END table styles */ + +/* START tabular data */ +.ui-tabs .ui-tabs-nav li a { + /* default tab */ + background:#efefef; + color:#828282; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background:#a3a3a3; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /* active or selected tab */ + background-color:#a3a3a3; + color:#fff; +} +/* END tabular data */ +.img-border { + border:6px solid #efefef; +} +.img-border:hover { + border:6px solid #cacaca; +} +.blog-misc a:hover { + text-decoration:underline; +} +/* general input buttons for search and newsletter forms, they might have same styles with blog/comments submit buttons */ +.input-arrow { + background:#a3a3a3 url(input_arrow.gif) no-repeat; +} +.input-arrow:hover { /* mouseover colour on submit arrow for forms */ + background:#f87b27 url(input_arrow.gif) no-repeat; +} +/* START blog comment form styles */ +.bc-submit, .contact-submit { + background:#a3a3a3 url(input_arrow.gif) no-repeat; + color:#fff; +} +.bc-submit:hover, .contact-submit:hover { + background:#f87b27 url(input_arrow.gif) no-repeat; +} +/* END blog comment form styles */ + +/* START blog right menu */ +.blog-categ ul li a { + border-bottom:1px solid #efefef; + color:#828282; +} +.blog-categ ul li a:hover { + background:#f5f5f5; + border-bottom:1px solid #cacaca; + color:#f87b27; + text-decoration:none; +} +/* END blog right menu */ +.blog-entry h2 a { + color:#f87b27; + text-decoration:none; +} +.pagination .page-number { + color:#a1a1a1; +} +.services-box-list li, .tag-list li { + background:url(body_arrow.gif) no-repeat 3px 6px; +} +.address-box span { + color:#a7a7a7; +} +.address-box address span { + color:#666666; +} +#left .interior-content .newslist-wrapper li h4 a, .portfolio-wrapper li h4 a { + color:#666666; + text-decoration:none; + /* these styles apply to header titles from list news and portfolio list */ +} +.h-services-list li { + background:url(body_arrow.gif) no-repeat 2px 5px; +} +/* error messages styles */ +.contact-error { + border:1px solid #eda0a0; + background:#fde3e3; +} +.contact-error-value { + color: #CC3333; +} +.contact-success { + border:1px solid #bae5cb; + background:#daffe9; +} +.contact-jerror { + color:#ff502d; + float:left; + line-height:16px; + margin:0 0 0 10px; + width:180px; +} + diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/AlfrescoLogo200.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/AlfrescoLogo200.jpg new file mode 100644 index 0000000000..053ca210ce Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/AlfrescoLogo200.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/AlfrescoLogo32.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/AlfrescoLogo32.jpg new file mode 100644 index 0000000000..9f88c4f350 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/AlfrescoLogo32.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/PoweredBySurf.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/PoweredBySurf.jpg new file mode 100644 index 0000000000..0836922bc8 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/PoweredBySurf.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/SurfLogo200.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/SurfLogo200.jpg new file mode 100644 index 0000000000..7a15d62791 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/SurfLogo200.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/alfresco3d.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/alfresco3d.jpg new file mode 100644 index 0000000000..3acae26579 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/alfresco3d.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/background1.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/background1.gif new file mode 100644 index 0000000000..2f6fa93a2a Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/background1.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/bg.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/bg.gif new file mode 100644 index 0000000000..ea9200df6e Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/bg.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/chrome/box/box_chrome_header_bg.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/chrome/box/box_chrome_header_bg.gif new file mode 100644 index 0000000000..e97a49df3f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/chrome/box/box_chrome_header_bg.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/cmis32.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/cmis32.jpg new file mode 100644 index 0000000000..8a23ac931b Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/cmis32.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/cmis_logo_100.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/cmis_logo_100.jpg new file mode 100644 index 0000000000..acdc4c26dd Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/cmis_logo_100.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/gifts-and-gadgets.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/gifts-and-gadgets.jpg new file mode 100644 index 0000000000..a049217390 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/gifts-and-gadgets.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/our-services.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/our-services.jpg new file mode 100644 index 0000000000..fd3789c7d0 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/our-services.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/powered-by-spring.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/powered-by-spring.jpg new file mode 100644 index 0000000000..334328c5cc Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/powered-by-spring.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/products-overview.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/products-overview.jpg new file mode 100644 index 0000000000..68f8831197 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/products-overview.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/surf32.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/surf32.jpg new file mode 100644 index 0000000000..85412fca64 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/images/surf32.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/Thumbs.db b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/Thumbs.db new file mode 100644 index 0000000000..cf59821935 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/Thumbs.db differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/blogbig_img.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/blogbig_img.jpg new file mode 100644 index 0000000000..05808a3988 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/blogbig_img.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/blogbig_lightbox.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/blogbig_lightbox.jpg new file mode 100644 index 0000000000..5296b9e2b7 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/blogbig_lightbox.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img1.jpg new file mode 100644 index 0000000000..28111d0196 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img2.jpg new file mode 100644 index 0000000000..d7e547bd1e Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img3.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img3.jpg new file mode 100644 index 0000000000..e0ae863344 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/bloglist_img3.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/closelabel.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/closelabel.gif new file mode 100644 index 0000000000..af0cab2d77 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/closelabel.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detail_img1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detail_img1.jpg new file mode 100644 index 0000000000..c8c7b9e367 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detail_img1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detail_img2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detail_img2.jpg new file mode 100644 index 0000000000..00342656b8 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detail_img2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detailbig_img1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detailbig_img1.jpg new file mode 100644 index 0000000000..6c954280dd Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detailbig_img1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detailbig_img2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detailbig_img2.jpg new file mode 100644 index 0000000000..aa5d154087 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/detailbig_img2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr1.jpg new file mode 100644 index 0000000000..e33d9693e6 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr2.jpg new file mode 100644 index 0000000000..6cfa15a83d Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr3.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr3.jpg new file mode 100644 index 0000000000..21d8696776 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr3.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr4.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr4.jpg new file mode 100644 index 0000000000..d0d3c3668f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr4.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr5.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr5.jpg new file mode 100644 index 0000000000..cf0dc4d855 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr5.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr6.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr6.jpg new file mode 100644 index 0000000000..e0986d3e81 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/flickr6.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/generic-file-32.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/generic-file-32.png new file mode 100644 index 0000000000..c8c430b4fd Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/generic-file-32.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/loading.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/loading.gif new file mode 100644 index 0000000000..6371884f86 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/loading.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/map_big.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/map_big.jpg new file mode 100644 index 0000000000..27a19e40ce Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/map_big.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/map_small.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/map_small.jpg new file mode 100644 index 0000000000..6007e64822 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/map_small.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/myspace_16.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/myspace_16.png new file mode 100644 index 0000000000..5e1b417bcd Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/myspace_16.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img1.jpg new file mode 100644 index 0000000000..6a628a49fa Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img2.jpg new file mode 100644 index 0000000000..fdde73c9f5 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img3.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img3.jpg new file mode 100644 index 0000000000..a551b2b4f6 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img3.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img4.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img4.jpg new file mode 100644 index 0000000000..cb86128f20 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img4.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img5.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img5.jpg new file mode 100644 index 0000000000..8ab5b83a40 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img5.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img6.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img6.jpg new file mode 100644 index 0000000000..bc9acbbed3 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/news_img6.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/nextlabel.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/nextlabel.gif new file mode 100644 index 0000000000..7c66121faf Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/nextlabel.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img1.jpg new file mode 100644 index 0000000000..570b98ed97 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img2.jpg new file mode 100644 index 0000000000..648f43e89e Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img3.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img3.jpg new file mode 100644 index 0000000000..a0340333a5 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img3.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img4.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img4.jpg new file mode 100644 index 0000000000..4fbcb7abdb Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img4.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img5.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img5.jpg new file mode 100644 index 0000000000..9aa1fe58d5 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img5.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img6.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img6.jpg new file mode 100644 index 0000000000..a72c4ab497 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img6.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img7.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img7.jpg new file mode 100644 index 0000000000..6d1b05d9f6 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img7.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img8.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img8.jpg new file mode 100644 index 0000000000..971ec4e41f Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img8.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img9.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img9.jpg new file mode 100644 index 0000000000..b94fd2308e Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/portfolio_img9.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/prevlabel.gif b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/prevlabel.gif new file mode 100644 index 0000000000..064187672c Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/prevlabel.gif differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/rss_16.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/rss_16.png new file mode 100644 index 0000000000..f921046f9c Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/rss_16.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img1.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img1.jpg new file mode 100644 index 0000000000..198adf32c4 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img1.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img2.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img2.jpg new file mode 100644 index 0000000000..8674d6f073 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img2.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img3.jpg b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img3.jpg new file mode 100644 index 0000000000..eb3bb2be43 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_img3.jpg differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_tr.png b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_tr.png new file mode 100644 index 0000000000..87e89b3cb0 Binary files /dev/null and b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/img/slide_tr.png differ diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/js/dd_belated_png.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/js/dd_belated_png.js new file mode 100644 index 0000000000..f5fa1dc004 --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/js/dd_belated_png.js @@ -0,0 +1,13 @@ +/** +* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML . +* Author: Drew Diller +* Email: drew.diller@gmail.com +* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/ +* Version: 0.0.8a +* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license +* +* Example usage: +* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector +* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement +**/ +var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;bn.H){i.B=n.H}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"}else{d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f=="X");switch(a){case"left":case"top":d[f]=0;break;case"center":d[f]=0.5;break;case"right":case"bottom":d[f]=1;break;default:if(a.search("%")!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior="none";var g,b,f,a,d;if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR"){return}c.isImg=false;if(c.nodeName=="IMG"){if(c.src.toLowerCase().search(/\.png$/)!=-1){c.isImg=true;c.style.visibility="hidden"}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+":"+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor="none";c.vml.image.fill.type="tile";c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet(); \ No newline at end of file diff --git a/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/js/jquery-1.12.4.js b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/js/jquery-1.12.4.js new file mode 100644 index 0000000000..546ac8eafd --- /dev/null +++ b/wcmquickstart-module/wcmquickstartwebsite/src/main/webapp/js/jquery-1.12.4.js @@ -0,0 +1,11039 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + * + * PATCH: Patched for CVE-2019-11358, CVE-2020-11022 and CVE-2020-11023 +*/ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + /* + PATCH: Prevent Object.prototype pollution + Before: + if ( target === copy ) { + */ + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
        a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + /* + PATCH: Support: IE <=9 only + IE <=9 replaces "; + support.option = !!div.lastChild; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + +/* +PATCH: Removed from wrapMap: + option: [ 1, "" ], +*/ +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + legend: [ 1, "
        ", "
        " ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
        " ], + tr: [ 2, "", "
        " ], + col: [ 2, "", "
        " ], + td: [ 3, "", "
        " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
        ", "
        " ] +}; + +/* +PATCH: Removed optgroup from wrapMap: + wrapMap.optgroup = wrapMap.option; +*/ + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +/* +PATCH: Added Support: IE <=9 only +*/ +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
        " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + +/* +PATCH: Removed + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, +*/ +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + /* + PATCH: Removed + return html.replace( rxhtmlTag, "<$1>" ); + */ + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "'; + } + if (!Dom.get("yui-history-field")) + { + historyMarkup +=''; + } + if (historyMarkup.length > 0) + { + var historyManagementEl = document.createElement("div"); + historyManagementEl.innerHTML = historyMarkup; + document.body.appendChild(historyManagementEl); + } + History.initialize("yui-history-field", "yui-history-iframe"); + } + catch(e) + { + Alfresco.logger.error(this.name + ": Couldn't initialize HistoryManager.", e); + onHistoryManagerReady(); + } + } + else + { + // No history manager being used - set default values for pagination + this.currentSkipCount = this.currentSkipCount || pc.recordOffset; + this.currentMaxItems = this.currentMaxItems || pc.rowsPerPage; + loadData(); + } + } + else + { + loadData(); + } + }, + + /** + * The default function to create url pagination parameters using "skipCount" and "maxItems". + * If these parameters doesn't mathc th url of the REST call override this method by passing in a + * similar function to the "dataSource.pagingResolver" config element to the YAHOO.util.DataTable constructor. + * + * @method _defaultPagingResolver + * @param currentSkipCount + * @param currentMaxItems + * @private + */ + _defaultPagingResolver: function DataTable__defaultPagingResolver(currentSkipCount, currentMaxItems) + { + return "skipCount=" + currentSkipCount + "&" + "maxItems=" + currentMaxItems; + }, + + + /** + * HELPER METHODS FOR ENCODING/DECODING BROWSER HISTORY STATE + */ + + /** + * Returns the current paging values encoded as a browser history bookmark state string. + * + * @method getPagingState + */ + getPagingState: function DataTable_getPagingState(skipCount, maxItems) + { + // TODO for sorting: + "|" + this.currentSortKey + "|" + this.currentDir; + return YAHOO.lang.isNumber(skipCount) ? (skipCount + (YAHOO.lang.isNumber(maxItems) ? "|" + maxItems : "")) : ""; + }, + + /** + * Takes a browser history bookmark state string and decodes it to set the current paging values. + * + * @method setPagingState + * @param pagingState + */ + setPagingState: function DataTable_setPagingState(pagingState) + { + // Check against, "|"-index of "0" and not "-1" since "-1" means filterId is empty + var paging = (pagingState && pagingState.indexOf("|") > 0) ? pagingState.split("|") : []; + this.currentSkipCount = paging.length > 0 ? parseInt(paging[0]) : this.config.paginator.config.recordOffset; + this.currentMaxItems = paging.length > 1 ? parseInt(paging[1]) : this.config.paginator.config.rowsPerPage; + // todo for sorting variables + }, + + /** + * Returns the current filter values encoded as a browser history bookmark state string. + * + * @method getFilterState + */ + getFilterState: function DataTable_getFilterState(filter) + { + if (filter) + { + return filter.filterId ? (filter.filterId + (filter.filterData ? ("|" + filter.filterData) : "")) : ""; + } + return ""; + }, + + /** + * Takes a browser history bookmark state string and decodes it to set the current filter values. + * + * @method setFilterState + * @param filterState + */ + setFilterState: function DataTable_setFilterState(filterState) + { + var filter = {}; + if (filterState.indexOf("|") > 0) + { + var filterTokens = filterState.split("|"); + filter.filterId = filterTokens[0]; + filter.filterData = filterTokens.slice(1).join("|"); // Make sure '|' characters in the data value remains + } + else + { + filter.filterId = filterState.length > 0 ? filterState : undefined; + } + this.currentFilter = filter || {}; + } + + }; +})(); + +/** + * Adds a class if it doesn't exist, and removes it if it does + * + * @method Alfresco.util.toggleClass + * @param element {HTML Element} The element to change the class of. + * @param className {String} Name of the class to look for and remove. + */ +Alfresco.util.toggleClass = function(element, className) +{ + if (YUIDom.hasClass(element, className)) + { + YUIDom.removeClass(element, className); + } + else + { + YUIDom.addClass(element, className); + } +}; + +/** + * Returns trimmed value. This method uses YAHOO.lang.trim + remove IDEOGRAPHIC SPACE (\u3000) + * + * @method Alfresco.util.trim + * @param value {string} String value which we trim + * @return {string} trimmed value + * @static + */ +Alfresco.util.trim = function(value) +{ + var s = YAHOO.lang.trim(value); + return s ? s.replace(/(^[\s\u3000]+|[\s\u3000]+$)/g, '') : s; +}; + +/** + * Generates a URL to retrieve a thumbnail based on the node and thumbnail name supplied. + * + * @method generateThumbnailUrl + */ +Alfresco.util.generateThumbnailUrl = function(jsNode, thumbnailName) +{ + var url, + nodeRef = jsNode.isLink ? jsNode.linkedNode.nodeRef : jsNode.nodeRef;; + if (jsNode.properties["cm:lastThumbnailModification"]) + { + var thumbnailModData = jsNode.properties["cm:lastThumbnailModification"]; + for (var i = 0; i < thumbnailModData.length; i++) + { + if (thumbnailModData[i].indexOf(thumbnailName) != -1) + { + url = Alfresco.constants.PROXY_URI + "api/node/" + nodeRef.uri + "/content/thumbnails/" + thumbnailName + "?c=queue&ph=true&lastModified=" + thumbnailModData[i]; + break; + } + } + } + if (YAHOO.lang.isUndefined(url) || YAHOO.lang.isNull(url)) + { + // This has been updated to include a lastModified request parameter to allow the thumbnail to be cached. Because thumbnails + // that are genuine previews are "taken care of" by updates to the "cm:lastThumbnailModification" property then there are more + // benefits to allowing non-preview types to be cached. File association thumbnails change infrequently and there is no + // major problem with them not updating if they do - the benefits of not revalidating them from performance are far greater... + url = Alfresco.constants.PROXY_URI + "api/node/" + nodeRef.uri + "/content/thumbnails/" + thumbnailName + "?c=queue&ph=true&lastModified=1"; + } + return url; +}; + +Alfresco.util.getCalendarControlConfiguration = function() +{ + var navConfig = + { + strings : + { + month : Alfresco.util.message("calendar.widget_control_config.label_month"), + year : Alfresco.util.message("calendar.widget_control_config.label_year"), + submit : Alfresco.util.message("button.ok"), + cancel : Alfresco.util.message("button.cancel"), + invalidYear : Alfresco.util.message("calendar.widget_control_config.label_invalid_year") + }, + monthFormat : YAHOO.widget.Calendar.SHORT, + initialFocus : "year" + }; + return navConfig; +}; + +/** + * Aspect filter implementation. Returns true if the node attribute has all the aspects enumerated in {filter.match}. + * For filters examples see ["CommonComponentStyle"]["component-style"] or ["SuppressComponent"]["component-config"] configurations from share-document-library-config.xml. + * + * @param node {object} + * @param filter {object} + * @returns {Boolean} - true if the node attribute has all the aspects enumerated in filter.match, false otherwise. + */ +Alfresco.util.matchAspect = function(node, filter) +{ + var match = true; + if (filter.match && filter.match.length != null) + { + for (var j = 0; j < filter.match.length; j++) + { + var aspect = filter.match[j]; + if (!node.aspects || node.aspects.indexOf(aspect) == -1) + { + match = false; + break; + } + } + } + else + { + match = false; + } + return match; +}; + +/** + * Type filter implementation. Returns true if the node type is in enumerated in {filter.match}. + * For filters examples see ["CommonComponentStyle"]["component-style"] or ["SuppressComponent"]["component-config"] configurations from share-document-library-config.xml. + * + * @param node {object} + * @param filter {object} + * @returns {Boolean} - true if the node type is in enumerated in filter.match, false otherwise. + */ +Alfresco.util.matchType = function(node, filter) +{ + var match = true; + if (filter.match && filter.match.length != null) + { + for (var j = 0; j < filter.match.length; j++) + { + var type = filter.match[j]; + if (!node.type || node.type !== type) + { + match = false; + break; + } + } + } + else + { + match = false; + } + return match; +}; + +/** + * Returns true if filterType is accepted, false otherwise. Currently only aspect filters accepted. + * @param filterType + * @returns {Boolean} - true if filterType is accepted, false otherwise. + */ +Alfresco.util.accepted = function(filterType) +{ + return (filterType == "aspect" || filterType == "type"); +}; + +/** + * Filter implementation. Currently only aspect filter supported implemented by function Alfresco.util.matchAspect, + * but other filter types can be added and implemented( e.g. filter by type, filter by one property name,....) and here we'll hook the implementations for each filter type. + * @param node {object} + * @param filter {object} + * @returns {Boolean} - true if filter matches, false otherwise. + */ +Alfresco.util.match = function(node, filter) +{ + if (filter.name == "aspect") + { + return Alfresco.util.matchAspect(node, filter); + } + if (filter.name == "type") + { + return Alfresco.util.matchType(node, filter); + } + return false; +}; + +/** + * Gets true if any of {supressConfig} filters are matching, or false otherwise. + * + * This function is used for suppressing Social components {favorites, likes and comments}. Currently only used for folders in Smart Folders context. + * + * @returns {Boolean} - true if any of {supressConfig} filters are matching, or false otherwise. + */ +Alfresco.util.isSuppressed = function(node, supressConfig) +{ + var suppress = false; + if (supressConfig && supressConfig.length != null) + { + for (var i = 0; i < supressConfig.length; i++) + { + var component = supressConfig[i]; + var filter = component.filter; + if (!Alfresco.util.accepted(filter.name)) + { + continue; + } + var match = Alfresco.util.match(node, filter); + if (match == true) + { + suppress = true; + break; + } + } + } + return suppress; +}; diff --git a/web-framework-commons/src/main/webapp/js/bubbling.v2.1.js b/web-framework-commons/src/main/webapp/js/bubbling.v2.1.js new file mode 100644 index 0000000000..9dd57ee8bf --- /dev/null +++ b/web-framework-commons/src/main/webapp/js/bubbling.v2.1.js @@ -0,0 +1,539 @@ +/* +Copyright (c) 2008, Bubbling Library Team. All rights reserved. +Portions Copyright (c) 2008, Yahoo!, Inc. All rights reserved. +Code licensed under the BSD License: +http://www.bubbling-library.com/eng/licence +version: 2.1 +*/ +YAHOO.namespace("plugin","behavior"); +(function() { + var $Y = YAHOO.util, + $E = YAHOO.util.Event, + $D = YAHOO.util.Dom, + $L = YAHOO.lang, + $ = YAHOO.util.Dom.get; + + /** + * @class Bubbling + */ + YAHOO.Bubbling = function () { + var obj = {}, + _config = { + classname: 'js' + }, + _handle = null; + // private stuff + var navRelExternal = function (layer, args) { + var el = args[1].anchor; + if (!(args[1].flagged || args[1].decrepitate) && el) { + var r = el.getAttribute("rel"), + t = el.getAttribute("target"); + if ((!t || (t === '')) && (r == 'external')) { + el.setAttribute("target", "blank"); + } + } + }; + var defaultActionsControl = function (layer, args) { + obj.processingAction (layer, args, obj.defaultActions); + }; + var _target = {newRef: null, oldRef: null, value: null}; // last target (this variable will be used by the onChange/onFocus/onBlur layer) + + function _onBlur() { + if (_target.oldRef) { + // firing the blur + obj.fire( 'blur', { + target: _target.oldRef + }); + } + } + + function _onFocus() { + if (_target.newRef) { + // firing the blur + obj.fire( 'focus', { + target: _target.newRef, + blur: _target.oldRef + }); + } + } + + function _onChange() { + if (_target.newRef) { + _target.newValue = (_target.tagName=="SELECT"?_target.newRef[_target.newRef.selectedIndex].value:_target.newRef.value); + if (_target.newValue != _target.oldValue) { + if (YAHOO.env.ua.webkit && (_target.tagName == "SELECT")) { + _target.newRef.setAttribute( 'default', _target.newValue ); + } + // firing the blur + obj.fire( 'change', { + target: _target.newRef, + value: _target.newValue, + newValue: _target.newValue, + oldValue: _target.oldValue, + rel: _target.newRef.getAttribute( 'rel' ) + }); + _target.oldValue = _target.newValue; + } + } + } + + function _setTarget (newRef, tn) { + _target = { + oldRef: _target.newRef, + newRef: newRef, + tagName: (newRef&&newRef.tagName?newRef.tagName.toUpperCase():null), + oldValue: (newRef?newRef.value:null) + }; + if (tn=='SELECT') { // select element (hack for safari: default attribute) + _target.oldValue = (YAHOO.env.ua.webkit?newRef.getAttribute('default'):newRef[newRef.selectedIndex].value); + } + } + + function _isFocusable (t) { + var tagName, tags = '[INPUT][TEXTAREA][SELECT][BUTTON][A][IMG]'; + if (t && (tagName = t.tagName.toUpperCase())) { + if (t.getAttribute('tabindex') || (tags.indexOf('['+tagName+']') !== -1)) { + return true; + } + } + return false; + } + + function _checkFocus (t, conf) { + /* checking the tagName */ + var tn = (t&&t.tagName?t.tagName.toUpperCase():null); + if (t && tn) { + if (tn == 'OPTION') { + return _checkFocus (t.parentNode, conf); + } else { + /* checking if the target is the document */ + if (document.body && (t === document.body)) { + // the document received the focus, trigger the onBlur and onChange + _onChange (); + _setTarget (null); + _onBlur (); + } else if ((t !== _target.newRef) && _isFocusable(t)) { + /* checking if the target element is focusable */ + /* - 1: setting the new target */ + _onChange (); + _setTarget (t, tn); + _onBlur (); + _onFocus (); + } + } + } + } + + // public vars + obj.ready = false; + obj.bubble = {}; // CustomEvent Handles + + // mapping external methods... + obj.getOwnerByClassName = function(node, className) { + return ($D.hasClass(node, className)?node:$D.getAncestorByClassName (node, className)); + }; + obj.getOwnerByTagName = function(node, tagName) { + node = $D.get(node); + if (!node) { + return null; + } + return (node.tagName && node.tagName.toUpperCase() == tagName.toUpperCase()?node:$D.getAncestorByTagName (node, tagName)); + }; + // Deprecated in favor of getOwnerByClassName and getOwnerByTagName + obj.getAncestorByClassName = obj.getOwnerByClassName; + obj.getAncestorByTagName = obj.getOwnerByTagName; + + // public methods + obj.onKeyPressedTrigger = function(args, e, m){ + var b = 'key'; + e = e || $E.getEvent(); + m = m || {}; + m.action = b; + // comparing the targets and the value of the targets + m.target = args.target || (e?$E.getTarget(e):null); + //_monitorChanges( m.target, m ); + _checkFocus (m.target, m); + m.flagged = false; m.decrepitate = false; + m.event = e; + m.stop = false; + m.type = args.type; + m.keyCode = args.keyCode; + m.charCode = args.charCode; + m.ctrlKey = args.ctrlKey; + m.shiftKey = args.shiftKey; + m.altKey = args.altKey; + this.bubble.key.fire(e, m); + if (m.stop) { + $E.stopEvent(e); + } + return m.stop; + }; + obj.onEventTrigger = function(b, e, m){ + e = e || $E.getEvent(); + var t = + m = m || {}; + m.action = b; + m.target = (e?$E.getTarget(e):null); + // comparing the target and the value of the target (if clicks) + if ((b == 'navigate') || (b == 'property')) { + //_checkChanges( m.target, m ); + _checkFocus(m.target, m); + } + m.flagged = false; m.decrepitate = false; + m.event = e; + m.stop = false; + this.bubble[b].fire(e, m); + if (m.stop) { + $E.stopEvent(e); + } + return m.stop; + }; + obj.onNavigate = function(e){ + var conf = { + anchor: this.getOwnerByTagName( $E.getTarget(e), 'A' ), + button: obj.getYUIButton($E.getTarget(e)) + }; + if (conf.button) { + conf.value = conf.button.get('value'); + conf.rel = conf.button._button.getAttribute('rel'); + } else if (conf.anchor) { + conf.rel = conf.anchor.getAttribute('rel'); + } else { + conf.input = this.getOwnerByTagName( $E.getTarget(e), 'INPUT' ); + conf.select = this.getOwnerByTagName( $E.getTarget(e), 'SELECT' ); + if (conf.input) { + conf.value = conf.input.getAttribute('value'); + conf.rel = conf.input.getAttribute('rel'); + } else if (conf.select) { + conf.value = conf.select[conf.select.selectedIndex].value; + conf.rel = conf.select.getAttribute('rel'); + } + } + if (!this.onEventTrigger ('navigate', e, conf)) { + this.onEventTrigger ('god', e, conf); // if nobody claim the event, god can handle it... + } + }; + obj.onProperty = function(e){ + this.onEventTrigger ('property', e, { + anchor: this.getOwnerByTagName( $E.getTarget(e), 'A' ), + button: obj.getYUIButton($E.getTarget(e)) + }); + }; + obj._timeoutId = 0; + obj.onRepaint = function(e){ + // Downshift Your Code (can't let something happen multiple times in a second) + // http://yuiblog.com/blog/2007/07/09/downshift-your-code/ + clearTimeout(obj._timeoutId); + obj._timeoutId = setTimeout(function(){ + var b = 'repaint', + e = {target:document.body}, + m = { + action: b, + target: null, + event: e, + flagged: false, + decrepitate: false, + stop: false + }; + obj.bubble[b].fire(e, m); + if (m.stop) { + $E.stopEvent(e); + } + }, 150 + ); + }; + obj.onRollOver = function(e){ + this.onEventTrigger ('rollover', e, { + anchor: this.getOwnerByTagName( $E.getTarget(e), 'A' ) + }); + }; + obj.onRollOut = function(e){ + this.onEventTrigger ('rollout', e, { + anchor: this.getOwnerByTagName( $E.getTarget(e), 'A' ) + }); + }; + obj.onKeyPressed = function(args){ + this.onKeyPressedTrigger(args); + }; + /** + * * This method will try to match the classname of the DOM element with the list of actions (literal object) + * @public + * @param {object} el element reference + * @param {object} actions object with the list of possibles actions + * @return void + */ + obj.getActionName = function (el, depot) { + depot = depot || {}; + var b = null, r = null, + f = (typeof el.hasClass === 'undefined'?function(b){return $D.hasClass(el, b)}:function(b){return el.hasClass(b);}); // f: check is certain object has a classname + if (el && ($L.isObject(el) || (el = $( el )))) { + try{ + r = el.getAttribute("rel"); // if rel is available... + } catch (e) {}; + for (b in depot) { // behaviors in the depot... + if ((depot.hasOwnProperty(b)) && (f(b) || (b === r))) { + return b; + } + } + } + return null; + }; + /** + * * This method will try to match the classnames of the DOM element with the list of actions (literal object) + * @public + * @param {object} el element reference + * @param {object} actions object with the list of possibles actions + * @return void + */ + obj.getAllActions = function (el, depot) { + depot = depot || {}; + var b = null, r = null, actions = [], + f = (typeof el.hasClass === 'undefined'?function(b){return $D.hasClass(el, b)}:function(b){return el.hasClass(b);}); // f: check is certain object has a classname + if (el && ($L.isObject(el) || (el = $( el )))) { + try{ + r = el.getAttribute("rel"); // if rel is available... + } catch (e) {}; + for (b in depot) { // behaviors in the depot... + if ((depot.hasOwnProperty(b)) && (f(b) || (b === r))) { + actions.push(b); + } + } + } + return actions; + }; + /** + * * Getting the first child element based on the tagName + * @public + * @param {object} el Child element reference + * @param {object} c ClassName of the Ancestor + * @return void + */ + obj.getFirstChildByTagName = function (el, t) { + if (el && ($L.isObject(el) || (el = $( el ))) && t) { + var l = el.getElementsByTagName(t); + if (l.length > 0) { + return l[0]; + } + } + return null; + }; + /** + * * Analyzing the target and the related target elements to see if the action was within a certain element + * @public + * @param {object} e event reference + * @param {object} el DOM element reference + * @return bool + */ + obj.virtualTarget = function (e, el) { + if (el && ($L.isObject(el) || (el = $( el ))) && $L.isObject(e)) { + var t = $E.getRelatedTarget ( e ); // target element + if ($L.isObject(t)) { + while((t.parentNode) && $L.isObject(t.parentNode) && (t.parentNode.tagName !== "BODY")) { + if (t.parentNode === el) { + return true; + } + t = t.parentNode; + } + } + } + return false; + }; + /** + * * getting the real YUI Button reference from a dom element, usually the target for a certain event + * @public + * @param {object} t dom element reference + * @return void + */ + obj.getYUIButton = function (t) { + var el = this.getOwnerByClassName( t, 'yui-button' ), bt = null, id = null; + if ($L.isObject(el) && YAHOO.widget.Button) { + bt = YAHOO.widget.Button.getButton(el.id); + } + return bt; + }; + /** + * * Creating a new behaviors layer... + * @public + * @param {string||array} layers Behaviors layers GUID + * @param {object} scope Custom Event default execution scope + * @return boolean if not exists... + */ + obj.addLayer = function (layers, scope) { + var result = false; + layers = ($L.isArray(layers)?layers:[layers]); + scope = scope || window; + for (var i = 0; i < layers.length; ++i) { + if (layers[i] && !this.bubble.hasOwnProperty(layers[i])) { + this.bubble[layers[i]] = new $Y.CustomEvent(layers[i], scope, true); + result = true; + } + } + return result; + }; + /** + * * Subscribing an behavior to certain behaviors layer... + * @public + * @param {string} layer Behavior layer GUID + * @param {object} bh The function that represent the behavior + * @return boolean if it is the first listener + */ + obj.subscribe = function (layer, bh, scope) { + var first = this.addLayer(layer); // return true if it's the first listener + if (layer) { + if ($L.isObject(scope)) { + this.bubble[layer].subscribe(bh, scope, true); // correcting the default scope + } else { + this.bubble[layer].subscribe(bh); // use the default scope + } + } + return first; + }; + obj.on = obj.subscribe; // defining an alias... + /** + * * Broadcasting the message in the corresponding behavior layer... + * @public + * @param {string} layer Behavior layer GUID + * @param {object} obj The function that represent the behavior + * @return boolean if someone has claim the event + */ + obj.fire = function (layer, obj) { + obj = obj || {}; + obj.action = layer; + obj.flagged = false; obj.decrepitate = false; + obj.stop = false; + if (this.bubble.hasOwnProperty(layer)) { + this.bubble[layer].fire(null, obj); + } + return obj.stop; + }; + /** + * * Processing an action based on the classname of the target element... + * @public + * @param {string} layer Behavior layer GUID + * @param {object} args Event object (extended) + * @param {object} actions List of available behaviors... + * @param {boolean} force Process the actions without worry about the flagged value... + * @return void + */ + obj.processingAction = function (layer, args, actions, force) { + var behavior = null, t; + if (!(args[1].flagged || args[1].decrepitate) || force) { + // checking for anchor, input or button + t = args[1].anchor || args[1].button || args[1].input || args[1].select; + if (t) { + behavior = this.getActionName ( t, actions ); + args[1].el = t; + } + if (behavior && (actions[behavior].apply(args[1], [layer, args]))) { + $E.stopEvent(args[0]); + args[1].flagged = true; + args[1].decrepitate = true; + args[1].stop = true; + } + } + }; + obj.defaultActions = {}; + obj.addDefaultAction = function (n, f, force) { + if (n && f && (!this.defaultActions.hasOwnProperty(n) || force)) { + this.defaultActions[n] = f; + } + }; + + // default Suscriptions + obj.on('navigate', navRelExternal); + obj.on('navigate', defaultActionsControl); + + // initialization of the font and scroll monitors + obj.initMonitors = function () { + var fMonitors = function () { + var oMonitors = new YAHOO.widget.Module('yui-cms-font-monitor', { + monitorresize:true, + visible:false + }); + oMonitors.render(document.body); + // monitoring font-size... + YAHOO.widget.Module.textResizeEvent.subscribe(obj.onRepaint, obj, true); + // monitoring scroll actions... + YAHOO.widget.Overlay.windowScrollEvent.subscribe(obj.onRepaint, obj, true); + }; + if ($L.isFunction(YAHOO.widget.Module)) { + $E.onDOMReady (fMonitors, obj, true); + } + }; + // initialization inside the selfconstructor + obj.init = function () { + var el = document.body; /* the top of the DOM */ + clearInterval(_handle); /* there is not need to keep waiting for the timer to execute this function */ + if (!this.ready) { + this.ready = true; + + // override the default configuration object with an external configuration object + YAHOO._Bubbling = YAHOO._Bubbling || {}; + $L.augmentObject(_config, YAHOO._Bubbling, true); + + // hack to add the class JS to the body + $D.addClass (el, _config.classname); + + // default behaviors + $E.addListener(window, "resize", obj.onRepaint, obj, true); + + $E.addListener(el, + "click", + obj.onNavigate, + obj, + true + ); + /* + Listen for the "mousedown" event in Opera b/c it does not + support the "contextmenu" event + */ + $E.addListener( + el, + (YAHOO.env.ua.opera ? "mousedown" : "contextmenu"), + obj.onProperty, + obj, + true + ); + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + if(YAHOO.env.ua.opera) { + $E.addListener( + el, + "click", + obj.onProperty, + obj, + true + ); + } + $E.addListener(el, "mouseover", obj.onRollOver, obj, true); + $E.addListener(el, "mouseout", obj.onRollOut, obj, true); + + // keys... + $E.addListener(document, "keyup", obj.onKeyPressed, obj, true); + $E.addListener(document, "keydown", obj.onKeyPressed, obj, true); + + obj.fire('ready', {module:'bubbling'}); + } + }; + // creating the default layers... + obj.addLayer (['navigate','god','property','key','repaint','rollover', 'rollout', 'blur', 'focus', 'change', 'ready']); // god layer - hack: the layer after the common navigate layer... + + // all the listeners will be added to the document.body, but we need to wait until the object become available to add the listeners. + _handle = setInterval(function() { + try { + // throws an error if document.body is not exist + if ($L.isObject(document.body)) { + obj.init (); + } + } catch (e) { + } + }, $E.POLL_INTERVAL); + // if something goes wrong, we just wait for the onDOMReady... + $E.onDOMReady(obj.init, obj, true); + + return obj; + }(); +})(); +YAHOO.register("bubbling", YAHOO.Bubbling, {version: "2.1", build: "234"}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/js/forms-runtime.js b/web-framework-commons/src/main/webapp/js/forms-runtime.js new file mode 100644 index 0000000000..f877f2da63 --- /dev/null +++ b/web-framework-commons/src/main/webapp/js/forms-runtime.js @@ -0,0 +1,2517 @@ +// Ensure Alfresco.forms and validation objects exist +Alfresco.forms = Alfresco.forms || {}; +Alfresco.forms.validation = Alfresco.forms.validation || {}; + +/** + * Class to represent the forms runtime. + * + * @namespace Alfresco.forms + * @class Alfresco.forms.Form + */ +(function() +{ + /** + * YUI Library aliases + */ + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Selector = YAHOO.util.Selector, + KeyListener = YAHOO.util.KeyListener; + + /** + * Constructor for a form. + * + * @param {String} formId The HTML id of the form to be managed + * @return {Alfresco.forms.Form} The new Form instance + * @constructor + */ + Alfresco.forms.Form = function(formId) + { + this.formId = formId; + this.showSubmitStateDynamically = false; + this.reusable = true; + this.submitAsJSON = false; + this.submitElements = []; + this.validations = []; + this.tooltips = {}; + this._valid = null; + this._fieldEvents = {}; + this._visitedFields = {}; + this.ajaxSubmit = false; + this.ajaxSubmitMethod = "POST"; + this.ajaxNoReloadOnAuthFailure = null; + this.errorContainer = "tooltip"; + this.showMultipleErrors = true; + + // Make sure to hide error containers (i.e. tooltips) when overlays and panels are closed + + YAHOO.Bubbling.on("showPanel", this.hideErrorContainer, this); + YAHOO.Bubbling.on("hidePanel", this.hideErrorContainer, this); + YAHOO.Bubbling.on("showOverlay", this.hideErrorContainer, this); + YAHOO.Bubbling.on("hideOverlay", this.hideErrorContainer, this); + + return this; + }; + + YAHOO.lang.augmentObject(Alfresco.forms.Form, + { + NOTIFICATION_LEVEL_NONE: 1, + + /** + * Applies css classes against the fields + */ + NOTIFICATION_LEVEL_FIELD: 2, + + /** + * Invokes the error containers + */ + NOTIFICATION_LEVEL_CONTAINER: 3 + }); + + Alfresco.forms.Form.prototype = + { + + /** + * HTML id of the form being represented. + * + * @property formId + * @type string + */ + formId: null, + + /** + * List of ids and/or elements being used to submit the form. + * + * @property submitElements + * @type object[] + */ + submitElements: null, + + /** + * Flag to determine whether the submit elements dynamically update + * their state depending on the current values in the form. + * + * @property showSubmitStateDynamically + * @type boolean + */ + showSubmitStateDynamically: null, + + /** + * Flag to determine whether the submit elements shall be enabled again after a successful form submission. + * + * @property reusable + * @type boolean + * @default false + */ + reusable: false, + + /** + * Flag to determine whether the form will be submitted using an AJAX request. + * + * @property ajaxSubmit + * @type boolean + */ + ajaxSubmit: null, + + /** + * String representing where errors should be displayed. + * If the value is not "alert" it's presumed the string is the id of an + * HTML object to be used as the error container. + * + * @property errorContainer + * @type string + */ + errorContainer: null, + + /** + * Boolean deciding if on eor many errors shall be displayed at a time. + * + * @property showMultipleErrors + * @type boolean + */ + showMultipleErrors: false, + + /** + * Object literal containing the abstract function for pre-submission form processing. + * fn: function, // The override function. + * obj: object, // An object to pass back to the function. + * scope: object // The object to use for the scope of the function. + * + * @property doBeforeFormSubmit + * @type object + */ + doBeforeFormSubmit: + { + fn: function(form, obj){}, + obj: null, + scope: this + }, + + /** + * Object literal containing the abstract function for intercepting AJAX form submission. + * Returning false from the override will prevent the Forms Runtime from submitting the data. + * fn: function, // The override function. + * obj: object, // An object to pass back to the function. + * scope: object // The object to use for the scope of the function. + * + * @property doBeforeAjaxRequest + * @type object + */ + doBeforeAjaxRequest: + { + fn: function(form, obj) + { + return true; + }, + obj: null, + scope: this + }, + + /** + * Object holding the callback handlers and messages for AJAX submissions. + * The callback handlers are themselves an object of the form: + * fn: function, // The handler to call when the event fires. + * obj: object, // An object to pass back to the handler. + * scope: object // The object to use for the scope of the handler. + * + * @property ajaxSubmitHandlers + * @type object + */ + ajaxSubmitHandlers: null, + + /** + * String representing the http method to be used for the + * ajax call. Default is POST. + * + * @property ajaxSubmitMethod + * @type String + */ + ajaxSubmitMethod: null, + + /** + * Decides if the browser shall try and reload the current page if a form submission fails due to auth failure. + * + * Possible values: + * true - browser will NOT reload current page + * false - browser will reload current page + * null - Will use the default value of noReloadOnAuthFailure in Alfresco.util.Ajax.request + * + * @property ajaxNoReloadOnAuthFailure + * @type String + * @default null + */ + ajaxNoReloadOnAuthFailure: null, + + /** + * Flag to determine whether the form data should be submitted + * represented by a JSON structure. + * + * @property submitAsJSON + * @type boolean + */ + submitAsJSON: null, + + /** + * List of validations to execute when the form is submitted. + * + * @property validations + * @type object[] + */ + validations: null, + + /** + * The tooltips used to display an error when errorContainer is set to "tooltip" + * + * @property tooltips + * @type object + */ + tooltips: null, + + /** + * The fields and events that already have a listener attached to them. + */ + _fieldEvents: {}, + + _FIELD_EVENT_UNDEFINED: undefined, + _FIELD_EVENT_LISTEN: 1, + _FIELD_EVENT_VALIDATE: 2, + + /** + * Name of the attribute to be applied to HTML elements where a HTML validation message must be stored + * temporarily + */ + _VALIDATION_MSG_ATTR: "alf-validation-msg", + + /** + * The fields that are considered to have been visited by the user. + * Meaning that they will display balloon and red color if users tabs out of them. + */ + _visitedFields: null, + + /** + * Indicates if the field is valid, will be updated by _runValidations + */ + _valid: null, + + /** + * Sets up the required event handlers and prepares the form for use. + * NOTE: This must be called after all other setup methods. + * + * @method init + */ + init: function() + { + var form = Dom.get(this.formId); + if (form !== null) + { + if (form.getAttribute("forms-runtime") != "listening") + { + // add the event to the form and make the scope of the handler this form. + Event.addListener(form, "submit", this._submitInvoked, this, true); + form.setAttribute("forms-runtime", "listening"); + if (this.ajaxSubmit) + { + form.setAttribute("onsubmit", "return false;"); + } + } + + // determine if the AJAX and JSON submission should be enabled + if (form.getAttribute("enctype") && form.getAttribute("enctype") == "application/json") + { + this.ajaxSubmit = true; + this.submitAsJSON = true; + } + + // find the default submit elements if there are no submitIds set + if (this.submitElements && this.submitElements.length == 0) + { + // use a selector to find any submit elements for the form + var nodes = Selector.query('#' + this.formId + ' > input[type="submit"]'); + for (var x = 0, xx = nodes.length; x < xx; x++) + { + var elem = nodes[x]; + this.submitElements.push(elem.id); + } + } + + // make sure the submit elements start in the correct state + this._runValidations(null, null, Alfresco.forms.Form.NOTIFICATION_LEVEL_FIELD); + + // Set up an escape listener so we can close 3rd party widgets such as ballons when escape is clicked + var escapeListener = new KeyListener(document, + { + keys: KeyListener.KEY.ESCAPE + }, + { + fn: function(id, keyEvent) + { + for (var id in this.tooltips) + { + if (this.tooltips.hasOwnProperty(id)) + { + this.tooltips[id].hide(); + } + } + }, + scope: this, + correctScope: true + }); + escapeListener.enable(); + } + else + { + this._showInternalError("form with id of '" + this.formId + + "' could not be located, ensure the form is created after the form element is available."); + } + }, + + /** + * If the form has been tested a boolean is returned to indicate if the form is valid. + * If it hasn't been tested null is returned, + * + * @return {null|Boolean} + */ + isValid: function() + { + return this._valid; + }, + + /** + * Deprecated! + * + * All forms are always validated before submit + * + * Enables or disables validation when the form is submitted. + * + * @method setValidateOnSubmit + * @param validate {boolean} true to validate on submission, false + * to avoid validation + */ + setValidateOnSubmit: function(validate) + { + }, + + /** + * Deprecated! + * + * All fields are now always validated. + * + * Sets whether all fields are validated when the form is submitted. + * + * @method setValidateAllOnSubmit + * @param validate {boolean} true to validate all fields on submission, false + * to stop after the first validation failure + */ + setValidateAllOnSubmit: function(validateAll) + { + }, + + /** + * Sets the list of ids and/or elements being used to submit the form. + * By default the forms runtime will look for and use the first + * input field of type submit found in the form being managed. + * + * @method setSubmitElements + * @param submitElements {object | object[]} Single object or array of objects + */ + setSubmitElements: function(submitElements) + { + if (!YAHOO.lang.isArray(submitElements)) + { + this.submitElements[0] = submitElements; + } + else + { + this.submitElements = submitElements; + } + }, + + /** + * Sets the container where errors will be displayed. + * + * @method setErrorContainer + * @param container {string} String representing where errors should + * be displayed. If the value is not "alert" it's presumed the + * string is the id of an HTML object to be used as the error + * container + */ + setErrorContainer: function(container) + { + this.errorContainer = container; + }, + + /** + * Dictates if the containers will display one or many errors at a time. + * + * @method setShowMultipleErrors + * @param showMultipleErrors {boolean} Set to true to display multiple errors + */ + setShowMultipleErrors: function(showMultipleErrors) + { + this.showMultipleErrors = showMultipleErrors; + }, + + /** + * Sets a field as being repeatable, this adds a 'plus' sign after the field + * thus allowing multiple values to be entered. + * + * @method setRepeatable + * @param fieldId {string} Id of the field the validation is for + * @param containerId {string} Id of the element representing the + * field 'prototype' i.e. the item that will get cloned. + */ + setRepeatable: function(fieldId, containerId) + { + alert("not implemented yet"); + }, + + /** + * Sets whether the submit elements dynamically update + * their state depending on the current values in the form. + * The visibility of errors can be controlled via the + * showErrors parameter. + * + * @method setShowSubmitStateDynamically + * @param showState {boolean} true to have the elements update dynamically + */ + setShowSubmitStateDynamically: function(showState) + { + this.showSubmitStateDynamically = showState; + }, + + /** + * The forms submit elements are automatically disabled during form submission (and enabled if the form submission fails). + * Sets this to true if submit elements shall be enabled after a successful form submission as well. + * Thus making the form "reusable". + * + * @param reusable {boolean} + */ + setAsReusable: function(reusable) + { + this.reusable = reusable; + }, + + /** + * Enables or disables whether the form submits via an AJAX call. + * + * @method enableAJAXSubmit + * @param ajaxSubmit {boolean} true to submit using AJAX, false to submit + * using the browser's default behaviour + * @param callbacks {object} Optional object representing callback handlers + * or messages to use, for example + * { + * successCallback: yourHandlerObject, + * failureCallback: yourHandlerObject, + * successMessage: yourMessage, + * failureMessage: yourMessage + * } + * Callback handler objects are of the form: + * { + * fn: function, // The handler to call when the event fires. + * obj: object, // An object to pass back to the handler. + * scope: object // The object to use for the scope of the handler. + * } + */ + setAJAXSubmit: function(ajaxSubmit, callbacks) + { + this.ajaxSubmit = ajaxSubmit; + this.ajaxSubmitHandlers = callbacks; + }, + + /** + * Enables or disables submitting the form data in JSON format. + * Setting the enctype attribute of the form to "application/json" + * in Firefox will achieve the same result. + * + * @method setSubmitAsJSON + * @param submitAsJSON {boolean} true to submit the form data as JSON, + * false to submit one of the standard types "multipart/form-data" + * or "application/x-www-form-urlencoded" depending on the enctype + * attribute on the form + */ + setSubmitAsJSON: function(submitAsJSON) + { + this.submitAsJSON = submitAsJSON; + }, + + /** + * Set the http method to use for the AJAX call. + * + * @method setAjaxSubmitMethod + * @param ajaxSubmitMethod {string} the http method to use for the AJAX call + */ + setAjaxSubmitMethod: function(ajaxSubmitMethod) + { + this.ajaxSubmitMethod = ajaxSubmitMethod; + }, + + /** + * Decides if the browser shall try and reload the current page if a form submission fails due to auth failure. + * + * Possible values: + * true - browser will NOT reload current page + * false - browser will reload current page + * null - Will use the default value of noReloadOnAuthFailure in Alfresco.util.Ajax.request + * + * @method setAjaxNoReloadOnAuthFailure + */ + setAjaxNoReloadOnAuthFailure: function(noReloadOnAuthFailure) + { + this.ajaxNoReloadOnAuthFailure = noReloadOnAuthFailure; + }, + + /** + * Adds validation for a specific field on the form. + * Use the when parameter to define when validation shall be triggered. + * ALL added validators will be called in the order they were added every time validation is triggered. + * Validation can also be manually triggered by calling validate(). + * + * @method addValidation + * @param fieldId {string} Id of the field the validation is for + * @param validationHandler {function} Function to call to handle the + * actual validation + * @param validationArgs {object} Optional object representing the + * arguments to pass to the validation handler function + * @param when {string} Name of the event when validation shall be triggered, i.e. "keyup", "blur" + * If null, the validation will + * @param message {string|object|function|null} Message to be displayed to the user when validation fails, + * if a function it will be invoked and shall return a string, which may contain HTML, + * if an object different values may be provided for rendering a HTML or text message as necessary + * in the 'html' and 'text' property values, which may themselves be strings, functions or null, + * if omitted or null the default message in the handler is used + * @param config {object|function} Contains advanced instructions for the form, i.e. tooltip behaviour when widgets are used + * @param config.validationType {string} Set to "mandatory" if a custom mandatory validator is used (rather than Alfresco.forms.mandatory) + * @param config.errorField {string|HTMLElement} The element that reflects the error (if not provided fieldId will be used) + */ + addValidation: function(fieldId, validationHandler, validationArgs, when, message, config) + { + var field = Dom.get(fieldId); + if (field == null) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Ignoring validation for field with id of '" + fieldId + "' as it could not be located."); + + return; + } + else + { + // Make sure every validated element has an id set. + if (!field.id) + { + Alfresco.util.generateDomId(field, "form-field-") + } + } + + if (validationHandler === undefined || validationHandler === null) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Ignoring validation for field with id of '" + fieldId + "' as a validationHandler was not provided."); + + return; + } + + if (message === undefined) + { + message = null; + } + + // create object representation of validation + var validation = + { + fieldId: field.id, + args: validationArgs, + handler: validationHandler, + message: message, + originalTitle: field.getAttribute("title") || "", + event: when, + config: config + }; + + // add to list of validations + this.validations.push(validation); + + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Added submit validation for field: " + fieldId + + ", using handler: " + + (validationHandler.name || YAHOO.lang.dump(validationHandler)) + + ", args: " + YAHOO.lang.dump(validationArgs)); + + // if an event has been specified attach an event handler + if (when && when.length > 0) + { + // Add blur listener so we can keep track of visited fields and know when to hide error containers + if (this._fieldEvents[field.id + ":" + "blur"] == this._FIELD_EVENT_UNDEFINED) + { + Event.addListener(field, "blur", this._validationEventFired, field.id, this); + this._fieldEvents[field.id + ":" + "blur"] = this._FIELD_EVENT_LISTEN; + } + + if (this._fieldEvents[field.id + ":" + when] == this._FIELD_EVENT_UNDEFINED) + { + // Add a listener to the field event (unless one already had been added for that event) + + // YAHOO doesn't seem to process the propertychange via the addListener so we need to take + // matters into our own hands. Listening for the "propertychange" event is required so that + // the forms runtime can validate when autocomplete is used in IE. + if (YAHOO.env.ua.ie && YAHOO.env.ua.ie < 11 && when == "propertychange") + { + var _this = this, _fieldId = field.id; + field.attachEvent("onpropertychange", function(e) { + _this._validationEventFired(e, _fieldId); + }); + } + else + { + Event.addListener(field, when, this._validationEventFired, field.id, this); + } + } + if (this._fieldEvents[field.id + ":" + when] != this._FIELD_EVENT_VALIDATE) + { + // Now we will validate on the event + this._fieldEvents[field.id + ":" + when] = this._FIELD_EVENT_VALIDATE; + } + + // Add focus listener so we can keep track of visited fields andknow when to show error containers + if (this._fieldEvents[field.id + ":" + "focus"] == this._FIELD_EVENT_UNDEFINED) + { + Event.addListener(field, "focus", this._validationEventFired, field.id, this); + this._fieldEvents[field.id + ":" + "focus"] = this._FIELD_EVENT_LISTEN; + } + + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Added field validation for field: " + fieldId + + ", using handler: " + + (validationHandler.name || YAHOO.lang.dump(validationHandler)) + + ", args: " + YAHOO.lang.dump(validationArgs) + + ", on event: " + when); + } + }, + + /** + * NOTE! Deprecated. The form runtime now handles error displays by itself. + * Kept to make sure custom validation handlers calling this method won't break. + * + * Adds an error to the form. + * + * @method addError + * @param msg {string} The error message to display + * @param field {object} The element representing the field the error occurred on + */ + addError: function(msg, field) + { + + }, + + /** + * Adds the given submitElement to the list of submit elements + * for the form. + * + * @method addSubmitElement + * @param submitElement Object or string representing the submit element + */ + addSubmitElement: function(submitElement) + { + if (submitElement !== null) + { + // add the new element to the list + this.submitElements.push(submitElement); + + if (this.showSubmitStateDynamically) + { + // force a refresh of the submit state + this.validate(); + } + } + }, + + /** + * Retrieves the label text for a field + * + * @method getFieldLabel + * @param fieldId {string} The id of the field to get the label for + * @return {string} The label for the field or the fieldId if a label could not be found + */ + getFieldLabel: function(fieldId) + { + var label = null; + + // lookup the label using the "for" attribute (use the first if multiple found) + var nodes = Selector.query('label'); + // NOTE: there seems to be a bug in getting label using 'for' or 'htmlFor' + // for now get all labels and find the one we want + if (nodes.length > 0) + { + for (var x = 0, xx = nodes.length; x < xx; x++) + { + var elem = nodes[x]; + if ((elem["htmlFor"] == fieldId) || (elem["htmlFor"] == fieldId+"-cntrl")) + { + // get the text for the label + label = elem.firstChild.nodeValue; + } + } + } + + // default to the field id if the label element was not found + if (label == null) + { + label = fieldId; + } + + return label; + }, + + /** + * Retrieves fields by type + * + * @method getFieldsByType + * @param type {string} The type + * @return {string} fields by type + */ + getFieldsByType: function(type) + { + var nodes = Selector.query(type); + return nodes; + }, + + /** + * Retrieves the data currently held by the form. + * + * @method getFormData + * @return An object representing the form data + */ + getFormData: function() + { + // get the form element + var form = Dom.get(this.formId); + + // build object representation of the form data + return this._buildAjaxForSubmit(form); + }, + + /** + * Applies a Key Listener to input fields to ensure tabbing only targets elements + * that specifically set a "tabindex" attribute. + * This has only been seen as an issue with the Firefox web browser, so shouldn't be applied otherwise. + * + * @method applyTabFix + */ + applyTabFix: function() + { + if (YAHOO.env.ua.gecko > 0) + { + /** + * Ensure the Tab key only focusses relevant fields + */ + var form = Dom.get(this.formId); + + var fnTabFix = function(id, keyEvent) + { + var event = keyEvent[1]; + var target = event.target; + if (!target.hasAttribute("tabindex")) + { + Event.stopEvent(event); + var el = Selector.query("[tabindex]", form)[0]; + if (Alfresco.util.isVisible(el)) + { + el.focus(); + } + } + }; + + var tabListener = new KeyListener(form, + { + keys: KeyListener.KEY.TAB + }, + fnTabFix, "keyup"); + tabListener.enable(); + } + }, + + /** + * Updates the state of all submit elements. + * + * @method updateSubmitElements + */ + updateSubmitElements: function() + { + // To support old forms updating the + return this.validate(Alfresco.forms.Form.NOTIFICATION_LEVEL_FIELD); + }, + + /** + * Validates all the fields in the form. + * Updates the state of all submit elements if the "showSubmitStateDynamically" option was set to true. + * + * @method validateField + * @param notificationLevel {Object|null} (Optional) The Event that triggered the validation, shall have a type attribute + */ + validate: function(notificationLevel) + { + notificationLevel = notificationLevel || Alfresco.forms.Form.NOTIFICATION_LEVEL_FIELD; + return this._runValidations({}, false, notificationLevel); + }, + + /** + * Validates all the fields in the form but indicates it was triggered from a specific event and field. + * Updates the state of all submit elements if the "showSubmitStateDynamically" option was set to true. + * + * @method validateField + * @param event {Object|null} (Optional) The Event that triggered the validation, shall have a type attribute + * @param fieldId {String|null} (Optional) The id + */ + validateField: function(event, fieldId) + { + this._validationEventFired(event, fieldId); + }, + + /** + * Toggles the state of all submit elements. + * + * @method _toggleSubmitElements + * @parameter enabled {boolean} true if the elements shall be enabled + */ + _toggleSubmitElements: function(enabled) + { + // make sure all submit elements show correct state + for (var x = 0, xx = this.submitElements.length; x < xx; x++) + { + var currentItem = this.submitElements[x]; + if (currentItem) + { + if (typeof currentItem == "string") + { + // get the element with the id and set the disabled attribute + Dom.get(currentItem).disabled = !enabled; + } + else + { + // TODO: for now if an object is passed presume it's a YUI button + currentItem.set("disabled", !enabled); + } + } + } + }, + + /** + * Event handler called when a validation event is fired by any registered field. + * + * @method _validationEventFired + * @param event {object} The event + * @param fieldId {String} + * @private + */ + _validationEventFired: function(event, fieldId) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Event has been fired for field: " + fieldId); + + if (event) + { + if (event.type == "blur") + { + // Mark field as visited when we leave it + if (!this._isFieldVisited(fieldId)) + { + this._setFieldAsVisited(fieldId); + this._runValidations(event, fieldId, Alfresco.forms.Form.NOTIFICATION_LEVEL_CONTAINER); + } + this._setFieldAsVisited(fieldId); + if (this.tooltips[fieldId]) + { + this.hideErrorContainer(); + } + } + else if (event.type == "focus") + { + if (!this.tooltips[fieldId]) + { + this.tooltips[fieldId] = Alfresco.util.createBalloon(this.getFieldValidationEl(fieldId), { + effectType: null, + effectDuration: 0 + }); + } + + if (YAHOO.util.Dom.hasClass(fieldId, "invalid")) + { + if (this._fieldEvents[fieldId + ":" + "focus"] != this._FIELD_EVENT_VALIDATE) + { + // Display error if "focus" event hadn't been added to trigger validation + var message = Dom.get(fieldId).getAttribute(this._VALIDATION_MSG_ATTR); + this.tooltips[fieldId].html(message); + this.tooltips[fieldId].show(); + } + } + } + else if (event.type == "propertychange" && !Alfresco.util.arrayContains(["value", "checked"], event.propertyName)) + { + // "propertychange" events are fired for any attribute change, i.e. "className" & "title", + // lets make sure we only validate when necessary + return; + } + } + + + // Ignore tab, shift, enter and escape clicks + if (!event || (event.keyCode != 9 && event.keyCode != 16 && event.keyCode != 13 && event.keyCode != 27)) + { + if (event && this._fieldEvents[fieldId + ":" + event.type] == this._FIELD_EVENT_VALIDATE) + { + // Make sure to run the validations anyhow so the tooltips and css error classes are updated & displayed + this._runValidations(event, fieldId, Alfresco.forms.Form.NOTIFICATION_LEVEL_CONTAINER); + } + } + }, + + /** + * Helper method that inspects the url and adds or refreshes the CSRF token parameter + * + * @param url + * @return {*} + * @private + */ + _setCSRFParameter: function(url) + { + // Make sure there is a CSRF parameter with the token present in submission + var pathAndParams = url.split("?"), + tokenParam = Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken()); + if (pathAndParams.length == 1) + { + url += "?" + tokenParam; + } + else + { + var params = pathAndParams[1].split("&"), + pi = 0, + nameAndValue, + newParams = "", + firstParam = true; + for (; pi < params.length; pi++) + { + nameAndValue = params[pi].split("="); + if (nameAndValue.length > 0 && nameAndValue[0] == Alfresco.util.CSRFPolicy.getParameter()) + { + // Don't use the old token param, add a new one after the loop instead + } + else + { + // Pass on parameter + newParams += firstParam ? "?" : "&"; + newParams += params[pi]; + firstParam = false; + } + } + if (pi == params.length) + { + newParams += firstParam ? "?" : "&"; + newParams += tokenParam; + } + url = pathAndParams[0] + newParams; + } + return url; + }, + + /** + * Event handler called when the form is submitted. + * + * @method _submitInvoked + * @param event {object} The event + * @private + */ + _submitInvoked: function(event) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Submit invoked on formId: ", this.formId); + + this._setAllFieldsAsVisited(); + + // Run all validators + if (this._runValidations(event, null, Alfresco.forms.Form.NOTIFICATION_LEVEL_CONTAINER)) + { + // validation was successful + + // get the form element + var form = Dom.get(this.formId); + + // call the pre-submit function, passing the form for last-chance processing + this.doBeforeFormSubmit.fn.call(this.doBeforeFormSubmit.scope, form, this.doBeforeFormSubmit.obj); + + // fire event to inform any listening components that the form will be submitted + YAHOO.Bubbling.fire("formBeforeSubmit", this); + + // should submission be done using AJAX, or let + // the browser do the submit? + if (this.ajaxSubmit) + { + // stop the browser from submitting the form + if (typeof event.cancelBubble !== 'unknown' && typeof event.returnValue !== 'unknown') + { + Event.stopEvent(event); + } + + // get the form's action URL + var submitUrl = form.attributes.action.nodeValue; + + if (Alfresco.logger.isDebugEnabled()) + { + Alfresco.logger.debug("Performing AJAX submission to url: ", submitUrl); + } + + // determine how to submit the form, if the enctype + // on the form is set to "application/json" then + // package the form data as an AJAX string and post + if (form.enctype && form.enctype == "multipart/form-data") + { + var d = form.ownerDocument; + var iframe = d.createElement("iframe"); + iframe.style.display = "none"; + Dom.generateId(iframe, "formAjaxSubmit"); + iframe.name = iframe.id; + document.body.appendChild(iframe); + + // makes it possible to target the frame properly in IE. + window.frames[iframe.name].name = iframe.name; + + // Pass the CSRF token if the CSRF token filter is enabled + if (Alfresco.util.CSRFPolicy.isFilterEnabled()) + { + form.attributes.action.nodeValue = this._setCSRFParameter(submitUrl); + } + + form.target = iframe.name; + form.submit(); + return; + } + else + { + // Only disable submit elements for XMLHttpRequests since we then have a chance of enabling them on failure + this._toggleSubmitElements(false); + } + + // create config object to pass to request helper + var config = + { + method: this.ajaxSubmitMethod, + url: submitUrl + }; + + if (this.ajaxSubmitHandlers) + { + this.ajaxSubmitHandlers = this.ajaxSubmitHandlers || {}; + config.successMessage = this.ajaxSubmitHandlers.successMessage; + config.successCallback = { + fn: function(response, successCallback) + { + if (Dom.get(this.formId)) + { + // The form still exists + this._resetAllVisitedFields(); + if (this.reusable) + { + if (this.showSubmitStateDynamically) + { + // Update using validation + this.updateSubmitElements(); + } + else + { + // Enable submit buttons + this._toggleSubmitElements(true); + } + } + } + if (successCallback.fn) + { + successCallback.fn.call(successCallback.scope || this, response, successCallback.obj); + } + }, + obj: this.ajaxSubmitHandlers.successCallback || {}, + scope: this + }; + config.failureMessage = this.ajaxSubmitHandlers.failureMessage; + config.failureCallback = { + fn: function(response, failureCallback) + { + if (Dom.get(this.formId)) + { + // The form still exists + this._resetAllVisitedFields(); + if (this.showSubmitStateDynamically) + { + // Update using validation + this.updateSubmitElements(); + } + else + { + // Enable submit buttons + this._toggleSubmitElements(true); + } + } + if (failureCallback.fn) + { + failureCallback.fn.call(failureCallback.scope || this, response, failureCallback.obj); + } + }, + obj: this.ajaxSubmitHandlers.failureCallback || {}, + scope: this + }; + } + if (this.submitAsJSON) + { + var jsonData = this._buildAjaxForSubmit(form); + + // set up specific config + config.dataObj = jsonData; + config.noReloadOnAuthFailure = this.ajaxNoReloadOnAuthFailure; + + // call the pre-request function, passing the config object for last-chance processing + if (this.doBeforeAjaxRequest.fn.call(this.doBeforeAjaxRequest.scope, config, this.doBeforeAjaxRequest.obj)) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Submitting JSON data: ", config.dataObj); + + Alfresco.util.Ajax.jsonRequest(config); + } + else + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("JSON data request cancelled in doBeforeAjaxRequest()"); + } + this._toggleSubmitElements(true); + } + else + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Submitting data in form: ", form.enctype); + + // set up specific config + config.dataForm = form; + Alfresco.util.Ajax.request(config); + } + } + else + { + if (form.enctype && form.enctype == "multipart/form-data" && Alfresco.util.CSRFPolicy.isFilterEnabled()) + { + // We are submitting the form as multipart/form-data and leaving the page, make sure the CSRF token is set + form.attributes.action.nodeValue = this._setCSRFParameter(form.attributes.action.nodeValue); + } + } + } + else + { + // stop the event from continuing and sending the form. + Event.stopEvent(event); + + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Submission prevented as validation failed"); + + // Enable submit buttons + this._toggleSubmitElements(true); + } + }, + + /** + * Builds a JSON representation of the current form + * + * @method _buildAjaxForSubmit + * @param form {object} The form object to build the JSON for + * @private + */ + _buildAjaxForSubmit: function(form) + { + if (form !== null) + { + var formData = {}, + length = form.elements.length; + + for (var i = 0; i < length; i++) + { + var element = form.elements[i], + name = element.name; + + if (name == "-" || element.disabled || element.type === "button") + { + continue; + } + if (name == undefined || name == "") + { + name = element.id; + } + var value = element.value; + if (name) + { + // check whether the input element is an array value + if ((name.length > 2) && (name.substring(name.length - 2) == '[]')) + { + name = name.substring(0, name.length - 2); + if (formData[name] === undefined) + { + formData[name] = new Array(); + } + formData[name].push(value); + } + // check whether the input element is an object literal value + else if (name.indexOf(".") > 0) + { + var names = name.split("."); + var obj = formData; + var index; + for (var j = 0, k = names.length - 1; j < k; j++) + { + index = names[j]; + if (obj[index] === undefined) + { + obj[index] = {}; + } + obj = obj[index]; + } + obj[names[j]] = value; + } + else if (!((element.type === "checkbox" || element.type === "radio") && !element.checked)) + { + if (element.type == "select-multiple") + { + for (var j = 0, jj = element.options.length; j < jj; j++) + { + if (element.options[j].selected) + { + if (formData[name] == undefined) + { + formData[name] = new Array(); + } + formData[name].push(element.options[j].value); + } + } + } + else + { + formData[name] = value; + } + } + } + } + + return formData; + } + }, + + /** + * Checks if a field has been visited + * + * @function _isFieldVisited + * @param fieldId THe fieldId to mark as edited + * @return {boolean} true of the field has been edited (or the user has tried to submit the form) + */ + _isFieldVisited: function(fieldId) + { + return (YAHOO.lang.isBoolean(this._visitedFields) && this._visitedFields) || + (YAHOO.lang.isObject(this._visitedFields) && this._visitedFields[fieldId]); + }, + + /** + * Marks a field as visited + * + * @function _setFieldAsVisited + * @param fieldId {string} + */ + _setFieldAsVisited: function(fieldId) + { + if (!YAHOO.lang.isBoolean(this._visitedFields) && YAHOO.lang.isObject(this._visitedFields)) + { + return this._visitedFields[fieldId] = true; + } + }, + + /** + * Marks all fields as visited + * + * @function _setAllFieldsEdited + */ + _setAllFieldsAsVisited: function() + { + this._visitedFields = true; + }, + + _resetAllVisitedFields: function() + { + this._visitedFields = {}; + }, + + + _getConfig: function(config, configName, defaultValue) + { + var c = config || {}; + if (YAHOO.lang.isFunction(config)) + { + c = config(); + } + var result = Alfresco.util.findValueByDotNotation(c, configName); + return (result != undefined || result != null) ? result : defaultValue; + }, + + _isMandatoryValidator: function(val) + { + return val.handler == Alfresco.forms.validation.mandatory || (this._getConfig(val.config, "validationType", "invalid") == "mandatory"); + }, + + /** + * Executes all registered validations and returns result. + * + * @method _runValidations + * @parameter event {Object|null} The event that triggered the validation OR null if validation was programmatically called + * @parameter fieldId {string|null|boolean} The current el that triggered the event OR null if validation was programmatically called + * @private + */ + _runValidations: function(event, fieldId, notificationLevel) + { + var allErrors = [], + errorsByField = {}, + errorsByFieldText = {}, + allWarnings = [], + warningsByField = {}, + fieldMsg, + message, + textMessage, + validationType, + MANDATORY = "mandatory", + INVALID = "invalid", + field, + valFieldId, + val, + suppressValidationNotification, + primaryErrorFieldId = null; + + // Iterate through all validations (for all enabled fields) so we can tell if the complete form is valid or not + for (var x = 0, xx = this.validations.length; x < xx; x++) + { + val = this.validations[x]; + + field = Dom.get(val.fieldId); + if (field !== null && !field.disabled) + { + textMessage = null; + valFieldId = field.getAttribute("id"); + errorsByField[valFieldId] = errorsByField[valFieldId] || []; + errorsByFieldText[valFieldId] = errorsByFieldText[valFieldId] || []; + warningsByField[valFieldId] = warningsByField[valFieldId] || []; + + // Make sure invalid fields are showed as mandatory until the user has had a chance of changing the value + validationType = this._isMandatoryValidator(val) && !this._isFieldVisited(valFieldId) ? MANDATORY : INVALID; + if (typeof val.message === "object" && val.message != null) + { + message = val.message.html || null; + textMessage = val.message.text || null; + } + else + { + message = val.message || null; + } + if (message) + { + if (YAHOO.lang.isFunction(message)) + { + // Validator wanted to create error message manually + message = message.call(this, val.args); + } + else + { + // Make sure message parameters based on validator args are resolved + message = YAHOO.lang.substitute(message, val.args); + } + } + else + { + // Message is missing, use these as a last resort + var key; + if (this._isMandatoryValidator(val)) + { + key = "Alfresco.forms.validation.mandatory.message"; + } + else + { + key = "Alfresco.forms.validation.invalid.message"; + } + message = Alfresco.util.message(key); + } + if (textMessage) + { + if (YAHOO.lang.isFunction(textMessage)) + { + // Validator wanted to create error message manually + textMessage = textMessage.call(this, val.args); + } + else + { + // Make sure message parameters based on validator args are resolved + textMessage = YAHOO.lang.substitute(textMessage, val.args); + } + } + else + { + // Last resort - strip HTML tags from the HTML message + textMessage = message.replace(/<\/?[^>]+(>|$)/g, ""); + } + + // Make sure that validation notifications aren't triggered by events from other validations for the same field + suppressValidationNotification = (validationType == INVALID) && + (event != null && event.type != "blur" && event.type != val.event && event.keyCode != 13) && + (fieldId == valFieldId); + + if (!val.handler(field, val.args, null, this, true, message)) + { + // The field is invalid + + // Lets see if the validator wants to use another Dom id as context for the error container. + var errorField = Dom.get(this._getConfig(val.config, "errorField", field)); + if (!errorField.id) + { + // All fields must have a dom id + Alfresco.util.generateDomId(errorField); + } + if (errorField.id != fieldId && validationType == INVALID) + { + // Make sure that error containers are created for custom fields as well + errorsByField[errorField.id] = errorsByField[errorField.id] || []; + errorsByFieldText[errorField.id] = errorsByFieldText[errorField.id] || []; + if (errorsByField[errorField.id].indexOf(message) == -1) + { + errorsByField[errorField.id].push(message); + } + if (errorsByFieldText[errorField.id].indexOf(textMessage) == -1) + { + errorsByFieldText[errorField.id].push(textMessage); + } + } + + // Mark the first field with an error as the primary field (will be used if user tried to submit form) + if (primaryErrorFieldId == null) + { + primaryErrorFieldId = errorField.id; + } + + if (suppressValidationNotification) + { + // There was a validation error for this field but it was configured to get displayed on another event + continue; + } + + // Prepare error message including field name (the label in the dom) + fieldMsg = YAHOO.lang.trim(this.getFieldLabel(valFieldId)) || ""; + if (fieldMsg.length > 0) + { + if (fieldMsg.indexOf(":") < 0) + { + fieldMsg += ":"; + } + fieldMsg += " "; + } + fieldMsg += message; + + // Update error indication css classes + if (validationType == INVALID) + { + + allErrors.push({ id: valFieldId, msg: fieldMsg }); + // we don't want to add the same text + if (errorsByField[valFieldId].indexOf(message) == -1) + { + errorsByField[valFieldId].push(message); + } + // we don't want to add the same text + if (errorsByFieldText[valFieldId].indexOf(textMessage) == -1) + { + errorsByFieldText[valFieldId].push(textMessage); + } + + // Remove the mandatory class since it now is invalid + if (notificationLevel >= Alfresco.forms.Form.NOTIFICATION_LEVEL_FIELD) + { + YAHOO.util.Dom.removeClass(field, MANDATORY); + if (field == errorField) + { + YAHOO.util.Dom.addClass(field, INVALID); + } + else + { + YAHOO.util.Dom.removeClass(field, INVALID); + } + + // Update message with the first validation failure (ALF-19012) + if (errorsByField[valFieldId].length == 0) + { + field.setAttribute("title", textMessage); + field.setAttribute(this._VALIDATION_MSG_ATTR, message); + } + else + { + field.setAttribute("title", errorsByFieldText[valFieldId][0]); + var validationMsgAttr = ''; + for (var mess = 0; mess < errorsByField[valFieldId].length; mess++) + { + if (mess > 0 && !this.showMultipleErrors) + { + break; + } + validationMsgAttr += '
        ' + errorsByField[valFieldId][mess] + '
        '; + } + field.setAttribute(this._VALIDATION_MSG_ATTR, validationMsgAttr); + } + } + + } + else + { + // Actual errors have higher priority than a "mandatory error" + if (errorsByField[valFieldId].length == 0) + { + if (notificationLevel >= Alfresco.forms.Form.NOTIFICATION_LEVEL_FIELD) + { + YAHOO.util.Dom.removeClass(field, INVALID); + if (field == errorField) + { + YAHOO.util.Dom.addClass(field, MANDATORY); + } + else + { + YAHOO.util.Dom.removeClass(field, INVALID); + } + field.setAttribute("title", message); + } + field.setAttribute(this._VALIDATION_MSG_ATTR, message); + } + warningsByField[valFieldId].push(message); + allWarnings.push({ id: valFieldId, msg: fieldMsg }); + } + + YAHOO.Bubbling.fire("formValidationError", { + msg: fieldMsg, + field: field, + type: validationType + }); + } + else + { + if (suppressValidationNotification) + { + // There was a validation error, but it was configured to be displayed on another event + continue; + } + + if (notificationLevel >= Alfresco.forms.Form.NOTIFICATION_LEVEL_FIELD) + { + + if (errorsByField[valFieldId].length == 0) + { + YAHOO.util.Dom.removeClass(field, INVALID); + } + if (warningsByField[valFieldId].length == 0) + { + YAHOO.util.Dom.removeClass(field, MANDATORY); + } + if (errorsByField[valFieldId].length == 0 && warningsByField[valFieldId].length == 0) + { + if (field.getAttribute("title") != val.originalTitle) + { + field.setAttribute("title", val.originalTitle); + } + field.setAttribute(this._VALIDATION_MSG_ATTR, ""); + if (this.tooltips[valFieldId]) + { + this.tooltips[valFieldId].html(""); + this.tooltips[valFieldId].hide(); + } + } + } + } + } + } + + // Use focused field as context for the error container ... + var errorFieldId = (document.activeElement && document.activeElement.id ? document.activeElement.id : null); + if (notificationLevel >= Alfresco.forms.Form.NOTIFICATION_LEVEL_CONTAINER) + { + if ((event == null || event.type == "submit") && primaryErrorFieldId && + (!warningsByField[errorFieldId] || warningsByField[errorFieldId].length == 0) && + (!errorsByField[errorFieldId] || errorsByField[errorFieldId].length == 0)) + { + // ... unless the user tried to submit the form, then use the forst field with an error + errorFieldId = primaryErrorFieldId; + var el = this.getFieldValidationEl(Dom.get(errorFieldId)); + if (Alfresco.util.isVisible(el)) + { + if (YAHOO.env.ua.ie > 0 && YAHOO.env.ua.ie < 9) + { + // No action - this causes a script error on IE8 and below. + } + else if (YAHOO.lang.isFunction(el.focus)) + { + el.focus(); + } + } + } + + if (this.errorContainer !== null && errorFieldId && errorsByField[errorFieldId]) + { + if (this.errorContainer === "tooltip") + { + /* + for (var key in this.tooltips) + { + if (this.tooltips.hasOwnProperty(key) && key != errorFieldId) + { + this.tooltips[key].hide(); + } + } + */ + if (errorsByField[errorFieldId].length > 0) + { + if (!this.tooltips[errorFieldId]) + { + this.tooltips[errorFieldId] = Alfresco.util.createBalloon(this.getFieldValidationEl(errorFieldId), { + effectType: null, + effectDuration: 0 + }); + } + + var html = ''; + for (var i = 0; i < errorsByField[errorFieldId].length; i++) + { + if (i > 0 && !this.showMultipleErrors) + { + break; + } + html += '
        ' + errorsByField[errorFieldId][i] + '
        '; + } + this.tooltips[errorFieldId].html(html); + this.tooltips[errorFieldId].show(); + } + else if (this.tooltips[errorFieldId]) + { + this.tooltips[errorFieldId].html(""); + this.tooltips[errorFieldId].hide(); + } + } + else if (this.errorContainer === "alert" && allErrors.length > 0) + { + var msg = ''; + for (var i = 0; i < allErrors.length; i++) + { + if (i > 0 && !this.showMultipleErrors) + { + break; + } + msg += allErrors[i] + '\n'; + } + alert(msg); + } + else if (YAHOO.lang.isString(this.errorContainer)) + { + var htmlNode = Dom.get(this.errorContainer); + if (htmlNode !== null) + { + var html = ''; + for (var i = 0; i < allErrors.length; i++) + { + if (i > 0 && !this.showMultipleErrors) + { + break; + } + html += '
        '; + } + htmlNode.style.display = "block"; + htmlNode.innerHTML = html; + } + } + } + } + + this._valid = primaryErrorFieldId == null; + + // update submit elements state, if required + if (this.showSubmitStateDynamically) + { + this._toggleSubmitElements(this._valid); + } + + return this._valid; + }, + + getFieldValidationEl: function(fieldId) + { + var el = Dom.get(fieldId); + if ((el.tagName.toLowerCase() == "input" && el.type == "hidden") || !Alfresco.util.isVisible(el)) + { + return el.parentNode; + } + return el; + }, + + hideErrorContainer: function() + { + if (this.errorContainer === "tooltip") + { + for (var key in this.tooltips) + { + if (this.tooltips.hasOwnProperty(key)) + { + this.tooltips[key].hide(); + } + } + } + else if (this.errorContainer === "alert") + { + // Not applicable + } + else if (YAHOO.lang.isString(this.errorContainer)) + { + // todo Filter out errors for the field + } + }, + + /** + * Displays an internal form error message. + * + * @method _showInternalError + * @param msg {string} The error message to display + * @param field {object} The element representing the field the error occurred on + * @private + */ + _showInternalError: function(msg, field) + { + this.addError("Internal Form Error: " + msg, field); + }, + + reset: function() + { + this._resetAllVisitedFields(); + Dom.get(this.formId).reset(); + this.validate(); + } + }; +})(); + +(function() +{ + + /** + * Mandatory validation handler, tests that the given field has a value. + * + * @method mandatory + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.mandatory = function mandatory(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating mandatory state of field '" + field.id + "'"); + + var valid = true; + + if (field.type && field.type == "radio") + { + // wouldn't a radio button normally have a default + // 'checked' option? + + var formElem = Dom.get(form.formId), + radios = formElem[field.name], + anyChecked = false; + for (var x = 0, xx = radios.length; x < xx; x++) + { + if (radios[x].checked) + { + anyChecked = true; + break; + } + + } + + valid = anyChecked; + } + else if (field.type && field.type == "checkbox") + { + valid = field.checked; + } + else + { + valid = YAHOO.lang.trim(field.value).length !== 0; + } + + return valid; + }; + + + /** + * Password match validation handler, tests that the given field's value matches another password field. + * + * @method passwordMatch + * @param field {object} The element representing the field the validation is for + * @param args {object} + * @param args.el {HTMLElement|String} The input element that contains the element to coimpare against. + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.passwordMatch = function passwordMatch(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating password match of field '" + field.id + "' using args: " + YAHOO.lang.dump(args)); + if (YAHOO.lang.trim(field.value).length == 0) + { + return true; + } + + var valid = false; + var myArgs = YAHOO.lang.merge( + { + el: null + }, args); + + if (myArgs.el) + { + var el = YAHOO.util.Dom.get(myArgs.el); + if (el.value == field.value) + { + valid = true; + } + } + + return valid; + }; + + /** + * Validate that the content of a password adheres to the policy provided in the supplied configuration + * + * @method passwordContent + * @param field {object} The element representing the field the validation is for + * @param args {object} Object providing the password content policy + * { + * minUpper: 1, // Minimum number of uppercase characters + * minLower: 1, // Minimum number of lowercase characters + * minNumeric: 1, // Minimum number of numeric characters + * minSymbols: 1 // Minimum number of special characters (!,@,#,$,%,^,&,*,?,_,~) + * } + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + * @returns {Boolean} True if the password adheres to policy, false otherwise + */ + Alfresco.forms.validation.passwordContent = function passwordContent(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating password content of field '" + field.id + + "' using args: " + YAHOO.lang.dump(args)); + // Empty input elements should not be marked as invalid, leave this to the mandatory check + if (YAHOO.lang.trim(field.value).length == 0) + { + return true; + } + var myArgs = YAHOO.lang.merge( + { + minUpper: 0, + minLower: 0, + minNumeric: 0, + minSymbols: 0 + }, args), + password = field.value, + DIGITS = /\d/g, + SPECIAL_CHARS = /([!,@,#,$,%,^,&,*,?,_,~])/g, + numeric = (password.match(DIGITS) || []).length, + symbols = (password.match(SPECIAL_CHARS) || []).length, + upper = 0, lower = 0, ch; + for (var i = 0; i < password.length; i++) + { + ch = password.charAt(i); + if (ch.toUpperCase() != ch.toLowerCase()) + { + // Ok now we now it is an actual character (can't use regexp since they dont handle foreign characters) + if (ch.toUpperCase() == ch) + { + upper++; + } + if (ch.toLowerCase() == ch) + { + lower++; + } + } + } + return myArgs.minUpper <= upper && myArgs.minLower <= lower && myArgs.minNumeric <= numeric && myArgs.minSymbols <= symbols; + }; + + /** + * Length validation handler, tests that the given field's value has either + * a minimum and/or maximum length. + * + * @method length + * @param field {object} The element representing the field the validation is for + * @param args {object} Object representing the minimum and maximum length, and whether to crop content + * { + * min: 3, + * max: 10, + * crop: true + * } + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.length = function length(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating length of field '" + field.id + + "' using args: " + YAHOO.lang.dump(args)); + var valid = true; + var myArgs = YAHOO.lang.merge( + { + min: -1, + max: -1, + crop: false, + includeWhitespace: true, + ignoreEmpty: false + }, args); + + if (YAHOO.lang.trim(field.value).length == 0 && myArgs.ignoreEmpty) + { + return true; + } + + if (myArgs.minLength) + { + myArgs.min = myArgs.minLength; + } + + if (myArgs.maxLength) + { + myArgs.max = myArgs.maxLength; + } + + var length = myArgs.includeWhitespace ? field.value.length : YAHOO.lang.trim(field.value).length; + + if (myArgs.min != -1 && length < myArgs.min) + { + valid = false; + } + + if (myArgs.max != -1 && length > myArgs.max) + { + valid = false; + if (myArgs.crop) + { + if (myArgs.includeWhitespace) + { + field.value = YAHOO.lang.trim(field.value); + } + if (field.value.length > myArgs.max) + { + field.value = field.value.substring(0, myArgs.max); + } + if (field.type && field.type == "textarea") + { + field.scrollTop = field.scrollHeight; + } + valid = true; + } + } + + return valid; + }; + + /** + * Number validation handler, tests that the given field's value is a number. + * + * @method number + * @param field {object} The element representing the field the validation is for + * @param args {object} Optional object containing a "repeating" flag + * { + * repeating: true + * } + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.number = function number(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a number"); + + var repeating = false; + + // determine if field has repeating values + if (args !== null && args.repeating) + { + repeating = true; + } + + var valid = true; + if (repeating) + { + // as it's repeating there could be multiple comma separated values + var values = field.value.split(","); + for (var i = 0; i < values.length; i++) + { + valid = (isNaN(values[i]) == false); + + if (!valid) + { + // stop as soon as we find an invalid value + break; + } + } + } + else + { + valid = (isNaN(field.value) == false); + } + + return valid; + }; + + /** + * Number range validation handler, tests that the given field's value has either + * a minimum and/or maximum value. + * + * @method numberRange + * @param field {object} The element representing the field the validation is for + * @param args {object} Object representing the minimum and maximum value, and optionally + * a "repeating" flag, for example + * { + * min: 18, + * max: 30, + * repeating: true + * } + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.numberRange = function numberRange(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) { + Alfresco.logger.debug("Validating number range of field '" + field.id + "' using args: " + YAHOO.lang.dump(args)); + } + + var valid = true; + var value = field.value.toString(); + + if (value.length > 0) + { + if (!Alfresco.forms.validation.number(field, args, null, null, true, null)) + { + valid = false; + } + else + { + // ACE-3690: NaN instead of -1 to indicate a non-present value + var min = NaN; + var max = NaN; + var repeating = false; + + if (args.min !== undefined) + { + min = parseInt(args.min); + } + + if (args.minValue !== undefined) + { + min = parseInt(args.minValue); + } + + if (args.max !== undefined) + { + max = parseInt(args.max); + } + + if (args.maxValue !== undefined) + { + max = parseInt(args.maxValue); + } + + // determine if field has repeating values + if (args !== null && args.repeating) + { + repeating = true; + } + + var valid = true; + if (repeating) + { + // as it's repeating there could be multiple comma separated values + var values = value.split(","); + for (var i = 0; i < values.length; i++) + { + if (min != -1 && values[i] < min) + { + valid = false; + } + + if (max != -1 && values[i] > max) + { + valid = false; + } + + if (!valid) + { + // stop as soon as we find an invalid value + break; + } + } + } + else + { + if (!isNaN(min) && value < min) + { + valid = false; + } + + if (!isNaN(max) && value > max) + { + valid = false; + } + } + } + } + + return valid; + }; + + /** + * Node name validation handler, tests that the given field's value is a valid + * name for a node in the repository. + * + * @method nodeName + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.nodeName = function nodeName(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid node name"); + + return Alfresco.forms.validation.name(field, args, event, form); + }; + + /** + * File name validation handler, tests that the given field's value is a valid + * name for a node in the repository. + * + * @method fileName + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @param silent {boolean} Determines whether the user should be informed upon failure + * @param message {string} Message to display when validation fails, maybe null + * @static + */ + Alfresco.forms.validation.fileName = function fileName(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid file name"); + + return Alfresco.forms.validation.name(field, args, event, form); + }; + + + /** + * Name validation handler, tests that the given field's value is a valid + * name for a node name or file name in the repository. + * + * @method nodeName + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.name = function name(field, args, event, form) + { + if (!args) + { + args = {}; + } + + /** + * Pattern for disallowing leading and trailing spaces. See CHK-6614 + * args.pattern = /([\"\*\\\>\<\?\/\:\|]+)|([\.]?[\.]+$)|(^[ \t]+|[ \t]+$)/; + */ + + args.pattern = /([\"\*\\\>\<\?\/\:\|]+)|([\.]?[\.]+$)|(^[ \t]+|[ \t]+$)/; + args.match = false; + + return Alfresco.forms.validation.regexMatch(field, args, event, form); + }; + + /** + * Wiki page title validation handler, tests that the given field's value is a valid + * name for a node in the repository. + * + * @method nodeName + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @param silent {boolean} Determines whether the user should be informed upon failure + * @param message {string} Message to display when validation fails, maybe null + * @static + */ + Alfresco.forms.validation.wikiTitle = function wikiTitle(field, args, event, form, silent, message) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid node name"); + + if (!args) + { + args = {}; + } + + args.pattern = /([#\\\?\/\|]+)|([\.]?[\.]+$)/; + args.match = false; + + return Alfresco.forms.validation.regexMatch(field, args, event, form, silent, message); + }; + + /** + * NodeRef validation handler, tests that the given field's value is a valid + * nodeRef identifier for a node in the repository. + * + * @method nodeRef + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.nodeRef = function nodeRef(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid noderef"); + + if (!args) + { + args = {}; + } + + args.pattern = /^[^\:^ ]+\:\/\/[^\:^ ]+\/[^ ]+$/; + + return Alfresco.forms.validation.regexMatch(field, args, event, form); + }; + + + /** + * Email validation handler, tests that the given field's value is a valid + * email address. + * + * @method email + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.email = function email(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid email address"); + + if (!args) + { + args = {}; + } + + var valid = true; + if (field.value && field.value.length > 0) + { + //Strip out the name and surrounding angle brackets, if present. + var start = field.value.indexOf("<"); + if (start >= 0) + { + start = start + 1; + var end = field.value.lastIndexOf(">"); + if (end > start) + { + field.value = field.value.substr(start, (end -start)); + } + } + + var emailFirstCharIndex = field.value.indexOf('"'); + + /* MNT-7031 fix. Added validation according RFC 2822. + If email local part starts with " (double quote) pattern for special characters space and + "(),:;<>@[\] (ASCII: 32, 34, 40, 41, 44, 58, 59, 60, 62, 64, 91–93) with restrictions is used. + Otherwise pattern for uppercase and lowercase English letters, digits, + characters !#$%&'*+-/=?^_`{|}~ ((ASCII: 33, 35–39, 42, 43, 45, 47, 61, 63, 94–96, 123–126)) , dot is used + */ + if (emailFirstCharIndex == 0) + { + args.pattern = /^("[-A-Za-z0-9\xc0-\xff\(\)<>\[\]\\:,;@\".\" *"!#$%&'*+\/=?^_`{}~|]*")+@([\.A-Za-z0-9_-])*[A-Za-z0-9_-]$/; + } + else + { + args.pattern = /^([-A-Za-z0-9\xc0-\xff!#$%&'*+\/=?^_`{}~|]+\.)*[-A-Za-z0-9\xc0-\xff!#$%&'*+\/=?^_`{}|~_]+@([\.A-Za-z0-9_-])*[A-Za-z0-9_-]$/; + } + + args.match = true; + + valid = Alfresco.forms.validation.regexMatch(field, args, event, form); + } + return valid; + }; + + /** + * Phone validation handler + * + * @method phone + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @param silent {boolean} Determines whether the user should be informed upon failure + * @param message {string} Message to display when validation fails, maybe null + * @static + */ + Alfresco.forms.validation.phone = function phone(field, args, event, form, silent, message) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid phone number"); + + if (!args) + { + args = {}; + } + + args.pattern = /^[0-9\(\)\[\]\-\+\*#\\:\/,; ]+$/; + args.match = true; + + return Alfresco.forms.validation.regexMatch(field, args, event, form, silent, message); + }; + + + /** + * Time validation handler, tests that the given field's value is a valid time value. + * + * @method time + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.time = function time(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid time value"); + + if (!args) + { + args = {}; + } + + args.pattern = /^([0-1]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/; + args.match = true; + + return Alfresco.forms.validation.regexMatch(field, args, event, form); + }; + + /** + * URL validation handler, tests that the given field's value is a valid URL + * + * @method url + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.url = function url(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' is a valid URL"); + + var expression = /(ftp|http|https):\/\/[\w\-_]+(\.[\w\-_]+)*([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/, + valid = true; + + if (field.value.length > 0) + { + // Check an empty string replacement returns an empty string + var pattern = new RegExp(expression); + valid = field.value.replace(pattern, "") === ""; + } + + return valid; + }; + + + /** + * Regular expression validation handler, tests that the given field's value matches + * the supplied regular expression. + * + * @method regexMatch + * @param field {object} The element representing the field the validation is for + * @param args {object} Object representing the expression. + * The args object should have the form of: + * { + * pattern: {regexp}, // A regular expression + * match: {boolean} // set to false if the regexp should NOT match the input, default is true + * } + * An example to validate a field represents an email address can look like: + * { + * pattern: /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/ + * } + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.regexMatch = function regexMatch(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating regular expression of field '" + field.id + + "' using args: " + YAHOO.lang.dump(args)); + var valid = true; + + if (field.value && field.value.length > 0) + { + // The pattern SHOULD match by default + if (args.match === undefined) + { + args.match = true; + } + + // Check if the patterns match + var pattern = new RegExp(args.pattern); + valid = pattern.test(field.value); + + // Adjust the result if the test wasn't intended to match + if (!args.match) + { + valid = !valid; + } + } + + return valid; + }; + + + /** + * Repository regular expression handler, simply used as a pass through to the + * standard regexMatch handler after converting the paramater names. + * + * @method repoRegexMatch + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.repoRegexMatch = function repoRegexMatch(field, args, event, form) + { + // convert parameters + args.pattern = args.expression; + args.match = args.requiresMatch; + + // call the standard regex handler + return Alfresco.forms.validation.regexMatch(field, args, event, form); + }; + + /** + * Validation handler for a valid date and time, currently this simply looks for the + * presence of the 'invalid' class applied to the relevant field. This implies that this + * validation handler must be added after any other handlers that determine validity. + * + * @method validDateTime + * @param field {object} The element representing the field the validation is for + * @param args {object} Not used + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.validDateTime = function validDateTime(field, args, event, form) + { + if (Alfresco.logger.isDebugEnabled()) + Alfresco.logger.debug("Validating field '" + field.id + "' has a valid date and time"); + + return !YAHOO.util.Dom.hasClass(field, "invalid"); + }; + + /** + * Validation handler for the repository 'list of values' constraint. As the UI + * handles this by displaying the list of allowable values this handler is a dummy + * placeholder. + * + * @method listOfValues + * @param field {object} The element representing the field the validation is for + * @param args {object} The list of allowable values + * @param event {object} The event that caused this handler to be called, maybe null + * @param form {object} The forms runtime class instance the field is being managed by + * @static + */ + Alfresco.forms.validation.inList = function inList(field, args, event, form) + { + return true; + }; + +})(); diff --git a/web-framework-commons/src/main/webapp/js/log4javascript.v1.4.1.js b/web-framework-commons/src/main/webapp/js/log4javascript.v1.4.1.js new file mode 100644 index 0000000000..7e49d7cb95 --- /dev/null +++ b/web-framework-commons/src/main/webapp/js/log4javascript.v1.4.1.js @@ -0,0 +1,271 @@ +/** + * Copyright 2009 Tim Down. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i0){var firstItem=this[0];for(var i=0,len=this.length-1;i2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();} +Timer.prototype.getElapsedTime=function(){return new Date().getTime()-this.start.getTime();};var anonymousLoggerName="[anonymous]";var defaultLoggerName="[default]";var nullLoggerName="[null]";var rootLoggerName="root";function Logger(name){this.name=name;this.parent=null;this.children=[];var appenders=[];var loggerLevel=null;var isRoot=(this.name===rootLoggerName);var isNull=(this.name===nullLoggerName);var appenderCache=null;var appenderCacheInvalidated=false;this.addChild=function(childLogger){this.children.push(childLogger);childLogger.parent=this;childLogger.invalidateAppenderCache();};var additive=true;this.getAdditivity=function(){return additive;};this.setAdditivity=function(additivity){var valueChanged=(additive!=additivity);additive=additivity;if(valueChanged){this.invalidateAppenderCache();}};this.addAppender=function(appender){if(isNull){handleError("Logger.addAppender: you may not add an appender to the null logger");}else{if(appender instanceof log4javascript.Appender){if(!array_contains(appenders,appender)){appenders.push(appender);appender.setAddedToLogger(this);this.invalidateAppenderCache();}}else{handleError("Logger.addAppender: appender supplied ('"+ +toStr(appender)+"') is not a subclass of Appender");}}};this.removeAppender=function(appender){array_remove(appenders,appender);appender.setRemovedFromLogger(this);this.invalidateAppenderCache();};this.removeAllAppenders=function(){var appenderCount=appenders.length;if(appenderCount>0){for(var i=0;i1&&isError(lastParam)){exception=lastParam;finalParamIndex--;} +var messages=[];for(var i=0;i<=finalParamIndex;i++){messages[i]=params[i];} +var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this.callAppenders(loggingEvent);}};this.callAppenders=function(loggingEvent){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};} +Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+ +toStr(loggerName)+" supplied, returning anonymous logger");} +if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");} +if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;} +parentLogger.addChild(logger);} +return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);} +return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);} +return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(loggingEvent){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);} +if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);} +if(this.hasCustomFields()){for(var i=0,len=this.customFields.length;i0);},toString:function(){handleError("Layout.toString: all layouts must override this method");}};log4javascript.Layout=Layout;var Appender=function(){};Appender.prototype=new EventSupport();Appender.prototype.layout=new PatternLayout();Appender.prototype.threshold=Level.ALL;Appender.prototype.loggers=[];Appender.prototype.doAppend=function(loggingEvent){if(enabled&&loggingEvent.level.level>=this.threshold.level){this.append(loggingEvent);}};Appender.prototype.append=function(loggingEvent){};Appender.prototype.setLayout=function(layout){if(layout instanceof Layout){this.layout=layout;}else{handleError("Appender.setLayout: layout supplied to "+ +this.toString()+" is not a subclass of Layout");}};Appender.prototype.getLayout=function(){return this.layout;};Appender.prototype.setThreshold=function(threshold){if(threshold instanceof Level){this.threshold=threshold;}else{handleError("Appender.setThreshold: threshold supplied to "+ +this.toString()+" is not a subclass of Level");}};Appender.prototype.getThreshold=function(){return this.threshold;};Appender.prototype.setAddedToLogger=function(logger){this.loggers.push(logger);};Appender.prototype.setRemovedFromLogger=function(logger){array_remove(this.loggers,logger);};Appender.prototype.group=emptyFunction;Appender.prototype.groupEnd=emptyFunction;Appender.prototype.toString=function(){handleError("Appender.toString: all appenders must override this method");};log4javascript.Appender=Appender;function SimpleLayout(){this.customFields=[];} +SimpleLayout.prototype=new Layout();SimpleLayout.prototype.format=function(loggingEvent){return loggingEvent.level.name+" - "+loggingEvent.getCombinedMessages();};SimpleLayout.prototype.ignoresThrowable=function(){return true;};SimpleLayout.prototype.toString=function(){return"SimpleLayout";};log4javascript.SimpleLayout=SimpleLayout;function NullLayout(){this.customFields=[];} +NullLayout.prototype=new Layout();NullLayout.prototype.format=function(loggingEvent){return loggingEvent.messages;};NullLayout.prototype.ignoresThrowable=function(){return true;};NullLayout.prototype.toString=function(){return"NullLayout";};log4javascript.NullLayout=NullLayout;function XmlLayout(combineMessages){this.combineMessages=extractBooleanFromParam(combineMessages,true);this.customFields=[];} +XmlLayout.prototype=new Layout();XmlLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};XmlLayout.prototype.getContentType=function(){return"text/xml";};XmlLayout.prototype.escapeCdata=function(str){return str.replace(/\]\]>/,"]]>]]>";} +var str=""+newLine;if(this.combineMessages){str+=formatMessage(loggingEvent.getCombinedMessages());}else{str+=""+newLine;for(i=0,len=loggingEvent.messages.length;i"+newLine;}} +if(loggingEvent.exception){str+=""+newLine;} +str+=""+newLine+newLine;return str;};XmlLayout.prototype.ignoresThrowable=function(){return false;};XmlLayout.prototype.toString=function(){return"XmlLayout";};log4javascript.XmlLayout=XmlLayout;function escapeNewLines(str){return str.replace(/\r\n|\r|\n/g,"\\r\\n");} +function JsonLayout(readable,combineMessages){this.readable=extractBooleanFromParam(readable,false);this.combineMessages=extractBooleanFromParam(combineMessages,true);this.batchHeader=this.readable?"["+newLine:"[";this.batchFooter=this.readable?"]"+newLine:"]";this.batchSeparator=this.readable?","+newLine:",";this.setKeys();this.colon=this.readable?": ":":";this.tab=this.readable?"\t":"";this.lineBreak=this.readable?newLine:"";this.customFields=[];} +JsonLayout.prototype=new Layout();JsonLayout.prototype.isReadable=function(){return this.readable;};JsonLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};JsonLayout.prototype.format=function(loggingEvent){var layout=this;var dataValues=this.getDataValues(loggingEvent,this.combineMessages);var str="{"+this.lineBreak;var i;function formatValue(val,prefix,expand){var formattedValue;var valType=typeof val;if(val instanceof Date){formattedValue=String(val.getTime());}else if(expand&&(val instanceof Array)){formattedValue="["+layout.lineBreak;for(i=0,len=val.length;i0){objectsExpanded.push(obj);expansion="["+newLine;childDepth=depth-1;childIndentation=indentation+" ";childLines=[];for(i=0,len=obj.length;i0){objectsExpanded.push(obj);expansion="{"+newLine;childDepth=depth-1;childIndentation=indentation+" ";childLines=[];for(i in obj){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+i+": "+childExpansion);}catch(ex){childLines.push(childIndentation+i+": Error formatting property. Details: "+ +getExceptionStringRep(ex));}} +expansion+=childLines.join(","+newLine)+newLine+indentation+"}";return expansion;}else{return formatString(toStr(obj));}} +return doFormat(obj,depth,indentation);} +var SimpleDateFormat;(function(){var regex=/('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;var monthNames=["January","February","March","April","May","June","July","August","September","October","November","December"];var dayNames=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var TEXT2=0,TEXT3=1,NUMBER=2,YEAR=3,MONTH=4,TIMEZONE=5;var types={G:TEXT2,y:YEAR,M:MONTH,w:NUMBER,W:NUMBER,D:NUMBER,d:NUMBER,F:NUMBER,E:TEXT3,a:TEXT2,H:NUMBER,k:NUMBER,K:NUMBER,h:NUMBER,m:NUMBER,s:NUMBER,S:NUMBER,Z:TIMEZONE};var ONE_DAY=24*60*60*1000;var ONE_WEEK=7*ONE_DAY;var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK=1;var newDateAtMidnight=function(year,month,day){var d=new Date(year,month,day,0,0,0);d.setMilliseconds(0);return d;};Date.prototype.getDifference=function(date){return this.getTime()-date.getTime();};Date.prototype.isBefore=function(d){return this.getTime()=minimalDaysInFirstWeek){weekInMonth++;} +return weekInMonth;};Date.prototype.getDayInYear=function(){var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);return 1+Math.floor(this.getTimeSince(startOfYear)/ONE_DAY);};SimpleDateFormat=function(formatString){this.formatString=formatString;};SimpleDateFormat.prototype.setMinimalDaysInFirstWeek=function(days){this.minimalDaysInFirstWeek=days;};SimpleDateFormat.prototype.getMinimalDaysInFirstWeek=function(){return isUndefined(this.minimalDaysInFirstWeek)?DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK:this.minimalDaysInFirstWeek;};var padWithZeroes=function(str,len){while(str.length=4)?data:data.substr(0,Math.max(minLength,numberOfLetters));};var formatNumber=function(data,numberOfLetters){var dataString=""+data;return padWithZeroes(dataString,numberOfLetters);};SimpleDateFormat.prototype.format=function(date){var formattedString="";var result;var searchString=this.formatString;while((result=regex.exec(searchString))){var quotedString=result[1];var patternLetters=result[2];var otherLetters=result[3];var otherCharacters=result[4];if(quotedString){if(quotedString=="''"){formattedString+="'";}else{formattedString+=quotedString.substring(1,quotedString.length-1);}}else if(otherLetters){}else if(otherCharacters){formattedString+=otherCharacters;}else if(patternLetters){var patternLetter=patternLetters.charAt(0);var numberOfLetters=patternLetters.length;var rawData="";switch(patternLetter){case"G":rawData="AD";break;case"y":rawData=date.getFullYear();break;case"M":rawData=date.getMonth();break;case"w":rawData=date.getWeekInYear(this.getMinimalDaysInFirstWeek());break;case"W":rawData=date.getWeekInMonth(this.getMinimalDaysInFirstWeek());break;case"D":rawData=date.getDayInYear();break;case"d":rawData=date.getDate();break;case"F":rawData=1+Math.floor((date.getDate()-1)/7);break;case"E":rawData=dayNames[date.getDay()];break;case"a":rawData=(date.getHours()>=12)?"PM":"AM";break;case"H":rawData=date.getHours();break;case"k":rawData=date.getHours()||24;break;case"K":rawData=date.getHours()%12;break;case"h":rawData=(date.getHours()%12)||12;break;case"m":rawData=date.getMinutes();break;case"s":rawData=date.getSeconds();break;case"S":rawData=date.getMilliseconds();break;case"Z":rawData=date.getTimezoneOffset();break;} +switch(types[patternLetter]){case TEXT2:formattedString+=formatText(rawData,numberOfLetters,2);break;case TEXT3:formattedString+=formatText(rawData,numberOfLetters,3);break;case NUMBER:formattedString+=formatNumber(rawData,numberOfLetters);break;case YEAR:if(numberOfLetters<=3){var dataString=""+rawData;formattedString+=dataString.substr(2,2);}else{formattedString+=formatNumber(rawData,numberOfLetters);} +break;case MONTH:if(numberOfLetters>=3){formattedString+=formatText(monthNames[rawData],numberOfLetters,numberOfLetters);}else{formattedString+=formatNumber(rawData+1,numberOfLetters);} +break;case TIMEZONE:var isPositive=(rawData>0);var prefix=isPositive?"-":"+";var absData=Math.abs(rawData);var hours=""+Math.floor(absData/60);hours=padWithZeroes(hours,2);var minutes=""+(absData%60);minutes=padWithZeroes(minutes,2);formattedString+=prefix+hours+minutes;break;}} +searchString=searchString.substr(result.index+result[0].length);} +return formattedString;};})();log4javascript.SimpleDateFormat=SimpleDateFormat;function PatternLayout(pattern){if(pattern){this.pattern=pattern;}else{this.pattern=PatternLayout.DEFAULT_CONVERSION_PATTERN;} +this.customFields=[];} +PatternLayout.TTCC_CONVERSION_PATTERN="%r %p %c - %m%n";PatternLayout.DEFAULT_CONVERSION_PATTERN="%m%n";PatternLayout.ISO8601_DATEFORMAT="yyyy-MM-dd HH:mm:ss,SSS";PatternLayout.DATETIME_DATEFORMAT="dd MMM yyyy HH:mm:ss,SSS";PatternLayout.ABSOLUTETIME_DATEFORMAT="HH:mm:ss,SSS";PatternLayout.prototype=new Layout();PatternLayout.prototype.format=function(loggingEvent){var regex=/%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;var formattedString="";var result;var searchString=this.pattern;while((result=regex.exec(searchString))){var matchedString=result[0];var padding=result[1];var truncation=result[2];var conversionCharacter=result[3];var specifier=result[5];var text=result[6];if(text){formattedString+=""+text;}else{var replacement="";switch(conversionCharacter){case"a":case"m":var depth=0;if(specifier){depth=parseInt(specifier,10);if(isNaN(depth)){handleError("PatternLayout.format: invalid specifier '"+ +specifier+"' for conversion character '"+conversionCharacter+"' - should be a number");depth=0;}} +var messages=(conversionCharacter==="a")?loggingEvent.messages[0]:loggingEvent.messages;for(var i=0,len=messages.length;i0&&(replacement.charAt(replacement.length-1)!==" ")){replacement+=" ";} +if(depth===0){replacement+=messages[i];}else{replacement+=formatObjectExpansion(messages[i],depth);}} +break;case"c":var loggerName=loggingEvent.logger.name;if(specifier){var precision=parseInt(specifier,10);var loggerNameBits=loggingEvent.logger.name.split(".");if(precision>=loggerNameBits.length){replacement=loggerName;}else{replacement=loggerNameBits.slice(loggerNameBits.length-precision).join(".");}}else{replacement=loggerName;} +break;case"d":var dateFormat=PatternLayout.ISO8601_DATEFORMAT;if(specifier){dateFormat=specifier;if(dateFormat=="ISO8601"){dateFormat=PatternLayout.ISO8601_DATEFORMAT;}else if(dateFormat=="ABSOLUTE"){dateFormat=PatternLayout.ABSOLUTETIME_DATEFORMAT;}else if(dateFormat=="DATE"){dateFormat=PatternLayout.DATETIME_DATEFORMAT;}} +replacement=(new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);break;case"f":if(this.hasCustomFields()){var fieldIndex=0;if(specifier){fieldIndex=parseInt(specifier,10);if(isNaN(fieldIndex)){handleError("PatternLayout.format: invalid specifier '"+ +specifier+"' for conversion character 'f' - should be a number");}else if(fieldIndex===0){handleError("PatternLayout.format: invalid specifier '"+ +specifier+"' for conversion character 'f' - must be greater than zero");}else if(fieldIndex>this.customFields.length){handleError("PatternLayout.format: invalid specifier '"+ +specifier+"' for conversion character 'f' - there aren't that many custom fields");}else{fieldIndex=fieldIndex-1;}} +replacement=this.customFields[fieldIndex].value;} +break;case"n":replacement=newLine;break;case"p":replacement=loggingEvent.level.name;break;case"r":replacement=""+loggingEvent.timeStamp.getDifference(applicationStartDate);break;case"%":replacement="%";break;default:replacement=matchedString;break;} +var l;if(truncation){l=parseInt(truncation.substr(1),10);var strLen=replacement.length;if(l=200&&xmlHttp.status<300));} +function AjaxAppender(url){var appender=this;var isSupported=true;if(!url){handleError("AjaxAppender: URL must be specified in constructor");isSupported=false;} +var timed=this.defaults.timed;var waitForResponse=this.defaults.waitForResponse;var batchSize=this.defaults.batchSize;var timerInterval=this.defaults.timerInterval;var requestSuccessCallback=this.defaults.requestSuccessCallback;var failCallback=this.defaults.failCallback;var postVarName=this.defaults.postVarName;var sendAllOnUnload=this.defaults.sendAllOnUnload;var sessionId=null;var queuedLoggingEvents=[];var queuedRequests=[];var sending=false;var initialized=false;function checkCanConfigure(configOptionName){if(initialized){handleError("AjaxAppender: configuration option '"+ +configOptionName+"' may not be set after the appender has been initialized");return false;} +return true;} +this.getSessionId=function(){return sessionId;};this.setSessionId=function(sessionIdParam){sessionId=extractStringFromParam(sessionIdParam,null);this.layout.setCustomField("sessionid",sessionId);};this.setLayout=function(layoutParam){if(checkCanConfigure("layout")){this.layout=layoutParam;if(sessionId!==null){this.setSessionId(sessionId);}}};this.isTimed=function(){return timed;};this.setTimed=function(timedParam){if(checkCanConfigure("timed")){timed=bool(timedParam);}};this.getTimerInterval=function(){return timerInterval;};this.setTimerInterval=function(timerIntervalParam){if(checkCanConfigure("timerInterval")){timerInterval=extractIntFromParam(timerIntervalParam,timerInterval);}};this.isWaitForResponse=function(){return waitForResponse;};this.setWaitForResponse=function(waitForResponseParam){if(checkCanConfigure("waitForResponse")){waitForResponse=bool(waitForResponseParam);}};this.getBatchSize=function(){return batchSize;};this.setBatchSize=function(batchSizeParam){if(checkCanConfigure("batchSize")){batchSize=extractIntFromParam(batchSizeParam,batchSize);}};this.isSendAllOnUnload=function(){return sendAllOnUnload;};this.setSendAllOnUnload=function(sendAllOnUnloadParam){if(checkCanConfigure("sendAllOnUnload")){sendAllOnUnload=extractIntFromParam(sendAllOnUnloadParam,sendAllOnUnload);}};this.setRequestSuccessCallback=function(requestSuccessCallbackParam){requestSuccessCallback=extractFunctionFromParam(requestSuccessCallbackParam,requestSuccessCallback);};this.setFailCallback=function(failCallbackParam){failCallback=extractFunctionFromParam(failCallbackParam,failCallback);};this.getPostVarName=function(){return postVarName;};this.setPostVarName=function(postVarNameParam){if(checkCanConfigure("postVarName")){postVarName=extractStringFromParam(postVarNameParam,postVarName);}};function sendAll(){if(isSupported&&enabled){sending=true;var currentRequestBatch;if(waitForResponse){if(queuedRequests.length>0){currentRequestBatch=queuedRequests.shift();sendRequest(preparePostData(currentRequestBatch),sendAll);}else{sending=false;if(timed){scheduleSending();}}}else{while((currentRequestBatch=queuedRequests.shift())){sendRequest(preparePostData(currentRequestBatch));} +sending=false;if(timed){scheduleSending();}}}} +this.sendAll=sendAll;function sendAllRemaining(){if(isSupported&&enabled){var actualBatchSize=appender.getLayout().allowBatching()?batchSize:1;var currentLoggingEvent;var postData="";var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);if(queuedLoggingEvents.length>=actualBatchSize){queuedRequests.push(batchedLoggingEvents);batchedLoggingEvents=[];}} +if(batchedLoggingEvents.length>0){queuedRequests.push(batchedLoggingEvents);} +waitForResponse=false;timed=false;sendAll();}} +function preparePostData(batchedLoggingEvents){var formattedMessages=[];var currentLoggingEvent;var postData="";while((currentLoggingEvent=batchedLoggingEvents.shift())){var currentFormattedMessage=appender.getLayout().format(currentLoggingEvent);if(appender.getLayout().ignoresThrowable()){currentFormattedMessage+=loggingEvent.getThrowableStrRep();} +formattedMessages.push(currentFormattedMessage);} +if(batchedLoggingEvents.length==1){postData=formattedMessages.join("");}else{postData=appender.getLayout().batchHeader+ +formattedMessages.join(appender.getLayout().batchSeparator)+ +appender.getLayout().batchFooter;} +postData=appender.getLayout().returnsPostData?postData:urlEncode(postVarName)+"="+urlEncode(postData);if(postData.length>0){postData+="&";} +return postData+"layout="+urlEncode(appender.getLayout().toString());} +function scheduleSending(){setTimeout(sendAll,timerInterval);} +function xmlHttpErrorHandler(){var msg="AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}} +function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){if(xmlHttp.overrideMimeType){xmlHttp.overrideMimeType(appender.getLayout().getContentType());} +xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);} +if(successCallback){successCallback(xmlHttp);}}else{var msg="AjaxAppender.append: XMLHttpRequest request to URL "+ +url+" returned status code "+xmlHttp.status;handleError(msg);if(failCallback){failCallback(msg);}} +xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);try{xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");}catch(headerEx){var msg="AjaxAppender.append: your browser's XMLHttpRequest implementation"+" does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);} +return;} +xmlHttp.send(postData);}}catch(ex){var errMsg="AjaxAppender.append: error sending log message to "+url;handleError(errMsg,ex);isSupported=false;if(failCallback){failCallback(errMsg+". Details: "+getExceptionStringRep(ex));}}} +this.append=function(loggingEvent){if(isSupported){if(!initialized){init();} +queuedLoggingEvents.push(loggingEvent);var actualBatchSize=this.getLayout().allowBatching()?batchSize:1;if(queuedLoggingEvents.length>=actualBatchSize){var currentLoggingEvent;var postData="";var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);} +queuedRequests.push(batchedLoggingEvents);if(!timed){if(!waitForResponse||(waitForResponse&&!sending)){sendAll();}}}}};function init(){initialized=true;if(sendAllOnUnload){addEvent(window,"unload",sendAllRemaining);} +if(timed){scheduleSending();}}} +AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:true,requestSuccessCallback:null,failCallback:null,postVarName:"data"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;function setCookie(name,value,days,path){var expires;path=path?"; path="+path:"";if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString();}else{expires="";} +document.cookie=escape(name)+"="+escape(value)+expires+path;} +function getCookie(name){var nameEquals=escape(name)+"=";var ca=document.cookie.split(";");for(var i=0,len=ca.length;i','','','log4javascript','','','','','','','','','','','
        ','
        ','
        ','Filters:','','','','','','','','
        ','','
        ','Options:','','','','','','','','
        ','
        ','
        ','
        ','
        ','
        ','','','
        ','
        ','','',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;var showLogEntryDeleteButtons=this.defaults.showLogEntryDeleteButtons;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;} +return true;};var consoleWindowExists=function(){return(consoleWindowLoaded&&isSupported&&!consoleClosed);};this.isNewestMessageAtTop=function(){return newestMessageAtTop;};this.setNewestMessageAtTop=function(newestMessageAtTopParam){newestMessageAtTop=bool(newestMessageAtTopParam);if(consoleWindowExists()){getConsoleWindow().setNewestAtTop(newestMessageAtTop);}};this.isScrollToLatestMessage=function(){return scrollToLatestMessage;};this.setScrollToLatestMessage=function(scrollToLatestMessageParam){scrollToLatestMessage=bool(scrollToLatestMessageParam);if(consoleWindowExists()){getConsoleWindow().setScrollToLatest(scrollToLatestMessage);}};this.getWidth=function(){return width;};this.setWidth=function(widthParam){if(checkCanConfigure("width")){width=extractStringFromParam(widthParam,width);}};this.getHeight=function(){return height;};this.setHeight=function(heightParam){if(checkCanConfigure("height")){height=extractStringFromParam(heightParam,height);}};this.getMaxMessages=function(){return maxMessages;};this.setMaxMessages=function(maxMessagesParam){maxMessages=extractIntFromParam(maxMessagesParam,maxMessages);if(consoleWindowExists()){getConsoleWindow().setMaxMessages(maxMessages);}};this.isShowCommandLine=function(){return showCommandLine;};this.setShowCommandLine=function(showCommandLineParam){showCommandLine=bool(showCommandLineParam);if(consoleWindowExists()){getConsoleWindow().setShowCommandLine(showCommandLine);}};this.isShowHideButton=function(){return showHideButton;};this.setShowHideButton=function(showHideButtonParam){showHideButton=bool(showHideButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowHideButton(showHideButton);}};this.isShowCloseButton=function(){return showCloseButton;};this.setShowCloseButton=function(showCloseButtonParam){showCloseButton=bool(showCloseButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowCloseButton(showCloseButton);}};this.getCommandLineObjectExpansionDepth=function(){return commandLineObjectExpansionDepth;};this.setCommandLineObjectExpansionDepth=function(commandLineObjectExpansionDepthParam){commandLineObjectExpansionDepth=extractIntFromParam(commandLineObjectExpansionDepthParam,commandLineObjectExpansionDepth);};var minimized=initiallyMinimized;this.isInitiallyMinimized=function(){return initiallyMinimized;};this.setInitiallyMinimized=function(initiallyMinimizedParam){if(checkCanConfigure("initiallyMinimized")){initiallyMinimized=bool(initiallyMinimizedParam);minimized=initiallyMinimized;}};this.isUseDocumentWrite=function(){return useDocumentWrite;};this.setUseDocumentWrite=function(useDocumentWriteParam){if(checkCanConfigure("useDocumentWrite")){useDocumentWrite=bool(useDocumentWriteParam);}};function QueuedLoggingEvent(loggingEvent,formattedMessage){this.loggingEvent=loggingEvent;this.levelName=loggingEvent.level.name;this.formattedMessage=formattedMessage;} +QueuedLoggingEvent.prototype.append=function(){getConsoleWindow().log(this.levelName,this.formattedMessage);};function QueuedGroup(name,initiallyExpanded){this.name=name;this.initiallyExpanded=initiallyExpanded;} +QueuedGroup.prototype.append=function(){getConsoleWindow().group(this.name,this.initiallyExpanded);};function QueuedGroupEnd(){} +QueuedGroupEnd.prototype.append=function(){getConsoleWindow().groupEnd();};var checkAndAppend=function(){safeToAppend();if(!initialized){init();}else if(consoleClosed&&reopenWhenClosed){createWindow();} +if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();} +queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){var currentLoggingEvent;while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();} +if(focusConsoleWindow){getConsoleWindow().focus();}};this.setAddedToLogger=function(logger){this.loggers.push(logger);if(enabled&&!lazyInit){init();}};this.clear=function(){if(consoleWindowExists()){getConsoleWindow().clearLog();} +queuedLoggingEvents.length=0;};this.focus=function(){if(consoleWindowExists()){getConsoleWindow().focus();}};this.focusCommandLine=function(){if(consoleWindowExists()){getConsoleWindow().focusCommandLine();}};this.focusSearch=function(){if(consoleWindowExists()){getConsoleWindow().focusSearch();}};var commandWindow=window;this.getCommandWindow=function(){return commandWindow;};this.setCommandWindow=function(commandWindowParam){commandWindow=commandWindowParam;};this.executeLastCommand=function(){if(consoleWindowExists()){getConsoleWindow().evalLastCommand();}};var commandLayout=new PatternLayout("%m");this.getCommandLayout=function(){return commandLayout;};this.setCommandLayout=function(commandLayoutParam){commandLayout=commandLayoutParam;};this.evalCommandAndAppend=function(expr){var commandReturnValue={appendResult:true,isError:false};var commandOutput="";try{var result,i;if(!commandWindow.eval&&commandWindow.execScript){commandWindow.execScript("null");} +var commandLineFunctionsHash={};for(i=0,len=commandLineFunctions.length;i";consoleClosed=false;var iframeDocumentExistsTest=function(win){try{return bool(win)&&bool(win.document);}catch(ex){return false;}};if(iframeDocumentExistsTest(getConsoleWindow())){writeToDocument();}else{pollConsoleWindow(iframeDocumentExistsTest,100,writeToDocument,initErrorMessage);} +consoleWindowCreated=true;};createWindow=function(show){if(show||!initiallyMinimized){var pageLoadHandler=function(){if(!container){containerElement=document.createElement("div");containerElement.style.position="fixed";containerElement.style.left="0";containerElement.style.right="0";containerElement.style.bottom="0";document.body.appendChild(containerElement);appender.addCssProperty("borderWidth","1px 0 0 0");appender.addCssProperty("zIndex",1000000);open();}else{try{var el=document.getElementById(container);if(el.nodeType==1){containerElement=el;} +open();}catch(ex){handleError("InPageAppender.init: invalid container element '"+container+"' supplied",ex);}}};if(pageLoaded&&container&&container.appendChild){containerElement=container;open();}else if(pageLoaded){pageLoadHandler();}else{log4javascript.addEventListener("load",pageLoadHandler);} +windowCreationStarted=true;}};init=function(){createWindow();initialized=true;};getConsoleWindow=function(){var iframe=window.frames[iframeId];if(iframe){return iframe;}};safeToAppend=function(){if(isSupported&&!consoleClosed){if(consoleWindowCreated&&!consoleWindowLoaded&&getConsoleWindow()&&isLoaded(getConsoleWindow())){consoleWindowLoaded=true;} +return consoleWindowLoaded;} +return false;};}else{var useOldPopUp=appender.defaults.useOldPopUp;var complainAboutPopUpBlocking=appender.defaults.complainAboutPopUpBlocking;var reopenWhenClosed=this.defaults.reopenWhenClosed;this.isUseOldPopUp=function(){return useOldPopUp;};this.setUseOldPopUp=function(useOldPopUpParam){if(checkCanConfigure("useOldPopUp")){useOldPopUp=bool(useOldPopUpParam);}};this.isComplainAboutPopUpBlocking=function(){return complainAboutPopUpBlocking;};this.setComplainAboutPopUpBlocking=function(complainAboutPopUpBlockingParam){if(checkCanConfigure("complainAboutPopUpBlocking")){complainAboutPopUpBlocking=bool(complainAboutPopUpBlockingParam);}};this.isFocusPopUp=function(){return focusConsoleWindow;};this.setFocusPopUp=function(focusPopUpParam){focusConsoleWindow=bool(focusPopUpParam);};this.isReopenWhenClosed=function(){return reopenWhenClosed;};this.setReopenWhenClosed=function(reopenWhenClosedParam){reopenWhenClosed=bool(reopenWhenClosedParam);};this.close=function(){logLog.debug("close "+this);try{popUp.close();this.unload();}catch(ex){}};this.hide=function(){logLog.debug("hide "+this);if(consoleWindowExists()){this.close();}};this.show=function(){logLog.debug("show "+this);if(!consoleWindowCreated){open();}};this.isVisible=function(){return safeToAppend();};var popUp;open=function(){var windowProperties="width="+width+",height="+height+",status,resizable";var windowName="PopUp_"+location.host.replace(/[^a-z0-9]/gi,"_")+"_"+consoleAppenderId;if(!useOldPopUp||!useDocumentWrite){windowName=windowName+"_"+uniqueId;} +var checkPopUpClosed=function(win){if(consoleClosed){return true;}else{try{return bool(win)&&win.closed;}catch(ex){}} +return false;};var popUpClosedCallback=function(){if(!consoleClosed){appender.unload();}};function finalInit(){getConsoleWindow().setCloseIfOpenerCloses(!useOldPopUp||!useDocumentWrite);consoleWindowLoadHandler();consoleWindowLoaded=true;appendQueuedLoggingEvents();pollConsoleWindow(checkPopUpClosed,500,popUpClosedCallback,"PopUpAppender.checkPopUpClosed: error checking pop-up window");} +try{popUp=window.open(getConsoleUrl(),windowName,windowProperties);consoleClosed=false;consoleWindowCreated=true;if(popUp){if(useDocumentWrite&&useOldPopUp&&isLoaded(popUp)){popUp.mainPageReloaded();finalInit();}else{if(useDocumentWrite){writeHtml(popUp.document);} +var popUpLoadedTest=function(win){return bool(win)&&isLoaded(win);};if(isLoaded(popUp)){finalInit();}else{pollConsoleWindow(popUpLoadedTest,100,finalInit,"PopUpAppender.init: unable to create console window");}}}else{isSupported=false;logLog.warn("PopUpAppender.init: pop-ups blocked, please unblock to use PopUpAppender");if(complainAboutPopUpBlocking){handleError("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");}}}catch(ex){handleError("PopUpAppender.init: error creating pop-up",ex);}};createWindow=function(){if(!initiallyMinimized){open();}};init=function(){createWindow();initialized=true;};getConsoleWindow=function(){return popUp;};safeToAppend=function(){if(isSupported&&!isUndefined(popUp)&&!consoleClosed){if(popUp.closed||(consoleWindowLoaded&&isUndefined(popUp.closed))){appender.unload();logLog.debug("PopUpAppender: pop-up closed");return false;} +if(!consoleWindowLoaded&&isLoaded(popUp)){consoleWindowLoaded=true;}} +return isSupported&&consoleWindowLoaded&&!consoleClosed;};} +this.getConsoleWindow=getConsoleWindow;};ConsoleAppender.addGlobalCommandLineFunction=function(functionName,commandLineFunction){defaultCommandLineFunctions.push([functionName,commandLineFunction]);};function PopUpAppender(lazyInit,initiallyMinimized,useDocumentWrite,width,height){this.create(false,null,lazyInit,initiallyMinimized,useDocumentWrite,width,height,this.defaults.focusPopUp);} +PopUpAppender.prototype=new ConsoleAppender();PopUpAppender.prototype.defaults={layout:new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),initiallyMinimized:false,focusPopUp:false,lazyInit:true,useOldPopUp:true,complainAboutPopUpBlocking:true,newestMessageAtTop:false,scrollToLatestMessage:true,width:"600",height:"400",reopenWhenClosed:false,maxMessages:null,showCommandLine:true,commandLineObjectExpansionDepth:1,showHideButton:false,showCloseButton:true,showLogEntryDeleteButtons:true,useDocumentWrite:true};PopUpAppender.prototype.toString=function(){return"PopUpAppender";};log4javascript.PopUpAppender=PopUpAppender;function InPageAppender(container,lazyInit,initiallyMinimized,useDocumentWrite,width,height){this.create(true,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,false);} +InPageAppender.prototype=new ConsoleAppender();InPageAppender.prototype.defaults={layout:new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),initiallyMinimized:false,lazyInit:true,newestMessageAtTop:false,scrollToLatestMessage:true,width:"100%",height:"220px",maxMessages:null,showCommandLine:true,commandLineObjectExpansionDepth:1,showHideButton:false,showCloseButton:false,showLogEntryDeleteButtons:true,useDocumentWrite:true};InPageAppender.prototype.toString=function(){return"InPageAppender";};log4javascript.InPageAppender=InPageAppender;log4javascript.InlineAppender=InPageAppender;})();function padWithSpaces(str,len){if(str.length]*>","i");if(regex.test(el.outerHTML)){return RegExp.$1.toLowerCase();}} +return"";} +var lt="<";var gt=">";if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=prefix?true:false;if(hasPrefix){xhtml+=prefix+":";} +xhtml+=tagName;for(i=0,len=rootNode.attributes.length;i"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(var i=0,len=rootNode.childNodes.length;i])*>/g,""):n.getContent({save:!0}):a.apply(p(t),r)}),i}}),p.each(["append","prepend"],function(e,t){var n=s[t]=p.fn[t],r="prepend"===t;p.fn[t]=function(i){var e=this;return u(e)?i!==f?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=l(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}),p.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=p.fn[t];p.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=p.fn.attr,p.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!u(n))return s.attr.apply(n,i);if(t!==f)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;var r=n[0],a=l(r);return a?a.getContent({save:!0}):s.attr.apply(p(r),i)}}}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/de.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/de.js new file mode 100644 index 0000000000..32a45747bc --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/de.js @@ -0,0 +1,261 @@ +tinymce.addI18n('de',{ +"Redo": "Wiederholen", +"Undo": "R\u00fcckg\u00e4ngig", +"Cut": "Ausschneiden", +"Copy": "Kopieren", +"Paste": "Einf\u00fcgen", +"Select all": "Alles ausw\u00e4hlen", +"New document": "Neues Dokument", +"Ok": "Ok", +"Cancel": "Abbrechen", +"Visual aids": "Visuelle Hilfen", +"Bold": "Fett", +"Italic": "Kursiv", +"Underline": "Unterstrichen", +"Strikethrough": "Durchgestrichen", +"Superscript": "Hochgestellt", +"Subscript": "Tiefgestellt", +"Clear formatting": "Formatierung entfernen", +"Align left": "Linksb\u00fcndig ausrichten", +"Align center": "Zentriert ausrichten", +"Align right": "Rechtsb\u00fcndig ausrichten", +"Justify": "Blocksatz", +"Bullet list": "Aufz\u00e4hlung", +"Numbered list": "Nummerierte Liste", +"Decrease indent": "Einzug verkleinern", +"Increase indent": "Einzug vergr\u00f6\u00dfern", +"Close": "Schlie\u00dfen", +"Formats": "Formate", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Ihr Browser unterst\u00fctzt leider keinen direkten Zugriff auf die Zwischenablage. Bitte benutzen Sie die Strg + X \/ C \/ V Tastenkombinationen.", +"Headers": "\u00dcberschriften", +"Header 1": "\u00dcberschrift 1", +"Header 2": "\u00dcberschrift 2", +"Header 3": "\u00dcberschrift 3", +"Header 4": "\u00dcberschrift 4", +"Header 5": "\u00dcberschrift 5", +"Header 6": "\u00dcberschrift 6", +"Headings": "\u00dcberschriften", +"Heading 1": "\u00dcberschrift 1", +"Heading 2": "\u00dcberschrift 2", +"Heading 3": "\u00dcberschrift 3", +"Heading 4": "\u00dcberschrift 4", +"Heading 5": "\u00dcberschrift 5", +"Heading 6": "\u00dcberschrift 6", +"Preformatted": "Preformatted", +"Div": "Textblock", +"Pre": "Vorformatierter Text", +"Code": "Quelltext", +"Paragraph": "Absatz", +"Blockquote": "Zitat", +"Inline": "Zeichenformate", +"Blocks": "Absatzformate", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Einf\u00fcgen ist nun im einfachen Textmodus. Inhalte werden ab jetzt als unformatierter Text eingef\u00fcgt, bis Sie diese Einstellung wieder ausschalten!", +"Font Family": "Schriftart", +"Font Sizes": "Schriftgr\u00f6\u00dfe", +"Class": "Klasse", +"Browse for an image": "Bild...", +"OR": "ODER", +"Drop an image here": "Bild hier ablegen", +"Upload": "Hochladen", +"Block": "Blocksatz", +"Align": "Ausrichtung", +"Default": "Standard", +"Circle": "Kreis", +"Disc": "Punkt", +"Square": "Quadrat", +"Lower Alpha": "Kleinbuchstaben", +"Lower Greek": "Griechische Kleinbuchstaben", +"Lower Roman": "R\u00f6mische Zahlen (Kleinbuchstaben)", +"Upper Alpha": "Gro\u00dfbuchstaben", +"Upper Roman": "R\u00f6mische Zahlen (Gro\u00dfbuchstaben)", +"Anchor": "Textmarke", +"Name": "Name", +"Id": "Kennung", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Die Kennung sollte mit einem Buchstaben anfangen. Nachfolgend nur Buchstaben, Zahlen, Striche (Minus), Punkte, Kommas und Unterstriche.", +"You have unsaved changes are you sure you want to navigate away?": "Die \u00c4nderungen wurden noch nicht gespeichert, sind Sie sicher, dass Sie diese Seite verlassen wollen?", +"Restore last draft": "Letzten Entwurf wiederherstellen", +"Special character": "Sonderzeichen", +"Source code": "Quelltext", +"Insert\/Edit code sample": "Codebeispiel einf\u00fcgen\/bearbeiten", +"Language": "Sprache", +"Code sample": "Codebeispiel", +"Color": "Farbe", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "Von links nach rechts", +"Right to left": "Von rechts nach links", +"Emoticons": "Emoticons", +"Document properties": "Dokumenteigenschaften", +"Title": "Titel", +"Keywords": "Sch\u00fcsselw\u00f6rter", +"Description": "Beschreibung", +"Robots": "Robots", +"Author": "Verfasser", +"Encoding": "Zeichenkodierung", +"Fullscreen": "Vollbild", +"Action": "Aktion", +"Shortcut": "Shortcut", +"Help": "Hilfe", +"Address": "Adresse", +"Focus to menubar": "Fokus auf Men\u00fcleiste", +"Focus to toolbar": "Fokus auf Werkzeugleiste", +"Focus to element path": "Fokus auf Elementpfad", +"Focus to contextual toolbar": "Fokus auf kontextbezogene Werkzeugleiste", +"Insert link (if link plugin activated)": "Link einf\u00fcgen (wenn Link-Plugin aktiviert ist)", +"Save (if save plugin activated)": "Speichern (wenn Save-Plugin aktiviert ist)", +"Find (if searchreplace plugin activated)": "Suchen einf\u00fcgen (wenn Suchen\/Ersetzen-Plugin aktiviert ist)", +"Plugins installed ({0}):": "installierte Plugins ({0}):", +"Premium plugins:": "Premium Plugins:", +"Learn more...": "Erfahren Sie mehr dazu...", +"You are using {0}": "Sie verwenden {0}", +"Plugins": "Plugins", +"Handy Shortcuts": "Praktische Tastenkombinationen", +"Horizontal line": "Horizontale Linie", +"Insert\/edit image": "Bild einf\u00fcgen\/bearbeiten", +"Image description": "Bildbeschreibung", +"Source": "Quelle", +"Dimensions": "Abmessungen", +"Constrain proportions": "Seitenverh\u00e4ltnis beibehalten", +"General": "Allgemein", +"Advanced": "Erweitert", +"Style": "Stil", +"Vertical space": "Vertikaler Abstand", +"Horizontal space": "Horizontaler Abstand", +"Border": "Rahmen", +"Insert image": "Bild einf\u00fcgen", +"Image": "Bild", +"Image list": "Bildliste", +"Rotate counterclockwise": "Gegen den Uhrzeigersinn drehen", +"Rotate clockwise": "Im Uhrzeigersinn drehen", +"Flip vertically": "Vertikal spiegeln", +"Flip horizontally": "Horizontal spiegeln", +"Edit image": "Bild bearbeiten", +"Image options": "Bildeigenschaften", +"Zoom in": "Ansicht vergr\u00f6\u00dfern", +"Zoom out": "Ansicht verkleinern", +"Crop": "Bescheiden", +"Resize": "Skalieren", +"Orientation": "Ausrichtung", +"Brightness": "Helligkeit", +"Sharpen": "Sch\u00e4rfen", +"Contrast": "Kontrast", +"Color levels": "Farbwerte", +"Gamma": "Gamma", +"Invert": "Invertieren", +"Apply": "Anwenden", +"Back": "Zur\u00fcck", +"Insert date\/time": "Datum\/Uhrzeit einf\u00fcgen ", +"Date\/time": "Datum\/Uhrzeit", +"Insert link": "Link einf\u00fcgen", +"Insert\/edit link": "Link einf\u00fcgen\/bearbeiten", +"Text to display": "Anzuzeigender Text", +"Url": "URL", +"Target": "Ziel", +"None": "Keine", +"New window": "Neues Fenster", +"Remove link": "Link entfernen", +"Anchors": "Textmarken", +"Link": "Link", +"Paste or type a link": "Link einf\u00fcgen oder eintippen", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http:\/\/\" voranstellen?", +"Link list": "Linkliste", +"Insert video": "Video einf\u00fcgen", +"Insert\/edit video": "Video einf\u00fcgen\/bearbeiten", +"Insert\/edit media": "Medien einf\u00fcgen\/bearbeiten", +"Alternative source": "Alternative Quelle", +"Poster": "Poster", +"Paste your embed code below:": "F\u00fcgen Sie Ihren Einbettungscode hier ein:", +"Embed": "Einbetten", +"Media": "Medium", +"Nonbreaking space": "Gesch\u00fctztes Leerzeichen", +"Page break": "Seitenumbruch", +"Paste as text": "Als Text einf\u00fcgen", +"Preview": "Vorschau", +"Print": "Drucken", +"Save": "Speichern", +"Find": "Suchen", +"Replace with": "Ersetzen durch", +"Replace": "Ersetzen", +"Replace all": "Alles ersetzen", +"Prev": "Zur\u00fcck", +"Next": "Weiter", +"Find and replace": "Suchen und ersetzen", +"Could not find the specified string.": "Die Zeichenfolge wurde nicht gefunden.", +"Match case": "Gro\u00df-\/Kleinschreibung beachten", +"Whole words": "Nur ganze W\u00f6rter", +"Spellcheck": "Rechtschreibpr\u00fcfung", +"Ignore": "Ignorieren", +"Ignore all": "Alles Ignorieren", +"Finish": "Ende", +"Add to Dictionary": "Zum W\u00f6rterbuch hinzuf\u00fcgen", +"Insert table": "Tabelle einf\u00fcgen", +"Table properties": "Tabelleneigenschaften", +"Delete table": "Tabelle l\u00f6schen", +"Cell": "Zelle", +"Row": "Zeile", +"Column": "Spalte", +"Cell properties": "Zelleneigenschaften", +"Merge cells": "Zellen verbinden", +"Split cell": "Zelle aufteilen", +"Insert row before": "Neue Zeile davor einf\u00fcgen ", +"Insert row after": "Neue Zeile danach einf\u00fcgen", +"Delete row": "Zeile l\u00f6schen", +"Row properties": "Zeileneigenschaften", +"Cut row": "Zeile ausschneiden", +"Copy row": "Zeile kopieren", +"Paste row before": "Zeile davor einf\u00fcgen", +"Paste row after": "Zeile danach einf\u00fcgen", +"Insert column before": "Neue Spalte davor einf\u00fcgen", +"Insert column after": "Neue Spalte danach einf\u00fcgen", +"Delete column": "Spalte l\u00f6schen", +"Cols": "Spalten", +"Rows": "Zeilen", +"Width": "Breite", +"Height": "H\u00f6he", +"Cell spacing": "Zellenabstand", +"Cell padding": "Zelleninnenabstand", +"Caption": "Beschriftung", +"Left": "Linksb\u00fcndig", +"Center": "Zentriert", +"Right": "Rechtsb\u00fcndig", +"Cell type": "Zellentyp", +"Scope": "G\u00fcltigkeitsbereich", +"Alignment": "Ausrichtung", +"H Align": "Horizontale Ausrichtung", +"V Align": "Vertikale Ausrichtung", +"Top": "Oben", +"Middle": "Mitte", +"Bottom": "Unten", +"Header cell": "Kopfzelle", +"Row group": "Zeilengruppe", +"Column group": "Spaltengruppe", +"Row type": "Zeilentyp", +"Header": "Kopfzeile", +"Body": "Inhalt", +"Footer": "Fu\u00dfzeile", +"Border color": "Rahmenfarbe", +"Insert template": "Vorlage einf\u00fcgen ", +"Templates": "Vorlagen", +"Template": "Vorlage", +"Text color": "Textfarbe", +"Background color": "Hintergrundfarbe", +"Custom...": "Benutzerdefiniert...", +"Custom color": "Benutzerdefinierte Farbe", +"No color": "Keine Farbe", +"Table of Contents": "Inhaltsverzeichnis", +"Show blocks": "Bl\u00f6cke anzeigen", +"Show invisible characters": "Unsichtbare Zeichen anzeigen", +"Words: {0}": "W\u00f6rter: {0}", +"{0} words": "{0} W\u00f6rter", +"File": "Datei", +"Edit": "Bearbeiten", +"Insert": "Einf\u00fcgen", +"View": "Ansicht", +"Format": "Format", +"Table": "Tabelle", +"Tools": "Werkzeuge", +"Powered by {0}": "Betrieben von {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich-Text- Area. Dr\u00fccken Sie ALT-F9 f\u00fcr das Men\u00fc. Dr\u00fccken Sie ALT-F10 f\u00fcr Symbolleiste. Dr\u00fccken Sie ALT-0 f\u00fcr Hilfe" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/es.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/es.js new file mode 100644 index 0000000000..9cb0e9d53a --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/es.js @@ -0,0 +1,261 @@ +tinymce.addI18n('es',{ +"Redo": "Rehacer", +"Undo": "Deshacer", +"Cut": "Cortar", +"Copy": "Copiar", +"Paste": "Pegar", +"Select all": "Seleccionar todo", +"New document": "Nuevo documento", +"Ok": "Ok", +"Cancel": "Cancelar", +"Visual aids": "Ayudas visuales", +"Bold": "Negrita", +"Italic": "It\u00e1lica", +"Underline": "Subrayado", +"Strikethrough": "Tachado", +"Superscript": "Super\u00edndice", +"Subscript": "Sub\u00edndice", +"Clear formatting": "Limpiar formato", +"Align left": "Alinear a la izquierda", +"Align center": "Alinear al centro", +"Align right": "Alinear a la derecha", +"Justify": "Justificar", +"Bullet list": "Lista de vi\u00f1etas", +"Numbered list": "Lista numerada", +"Decrease indent": "Disminuir sangr\u00eda", +"Increase indent": "Incrementar sangr\u00eda", +"Close": "Cerrar", +"Formats": "Formatos", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Tu navegador no soporta acceso directo al portapapeles. Por favor usa las teclas Crtl+X\/C\/V de tu teclado", +"Headers": "Encabezados", +"Header 1": "Encabezado 1", +"Header 2": "Encabezado 2 ", +"Header 3": "Encabezado 3", +"Header 4": "Encabezado 4", +"Header 5": "Encabezado 5 ", +"Header 6": "Encabezado 6", +"Headings": "Encabezados", +"Heading 1": "Encabezado 1", +"Heading 2": "Encabezado 2", +"Heading 3": "Encabezado 3", +"Heading 4": "Encabezado 4", +"Heading 5": "Encabezado 5", +"Heading 6": "Encabezado 6", +"Preformatted": "Preformateado", +"Div": "Capa", +"Pre": "Pre", +"Code": "C\u00f3digo", +"Paragraph": "P\u00e1rrafo", +"Blockquote": "Bloque de cita", +"Inline": "en l\u00ednea", +"Blocks": "Bloques", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.", +"Font Family": "Familia de fuentes", +"Font Sizes": "Tama\u00f1os de fuente", +"Class": "Clase", +"Browse for an image": "Exporador de imagenes", +"OR": "O", +"Drop an image here": "Arrastre una imagen aqu\u00ed", +"Upload": "Subir", +"Block": "Bloque", +"Align": "Alinear", +"Default": "Por defecto", +"Circle": "C\u00edrculo", +"Disc": "Disco", +"Square": "Cuadrado", +"Lower Alpha": "Inferior Alfa", +"Lower Greek": "Inferior Griega", +"Lower Roman": "Inferior Romana", +"Upper Alpha": "Superior Alfa", +"Upper Roman": "Superior Romana", +"Anchor": "Ancla", +"Name": "Nombre", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.", +"You have unsaved changes are you sure you want to navigate away?": "Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?", +"Restore last draft": "Restaurar el \u00faltimo borrador", +"Special character": "Car\u00e1cter especial", +"Source code": "C\u00f3digo fuente", +"Insert\/Edit code sample": "Insertar\/editar c\u00f3digo de prueba", +"Language": "Idioma", +"Code sample": "Ejemplo de c\u00f3digo", +"Color": "Color", +"R": "R", +"G": "V", +"B": "A", +"Left to right": "De izquierda a derecha", +"Right to left": "De derecha a izquierda", +"Emoticons": "Emoticonos", +"Document properties": "Propiedades del documento", +"Title": "T\u00edtulo", +"Keywords": "Palabras clave", +"Description": "Descripci\u00f3n", +"Robots": "Robots", +"Author": "Autor", +"Encoding": "Codificaci\u00f3n", +"Fullscreen": "Pantalla completa", +"Action": "Acci\u00f3n", +"Shortcut": "Atajo", +"Help": "Ayuda", +"Address": "Direcci\u00f3n", +"Focus to menubar": "Enfocar la barra del men\u00fa", +"Focus to toolbar": "Enfocar la barra de herramientas", +"Focus to element path": "Enfocar la ruta del elemento", +"Focus to contextual toolbar": "Enfocar la barra de herramientas contextual", +"Insert link (if link plugin activated)": "Insertar enlace (si el complemento de enlace est\u00e1 activado)", +"Save (if save plugin activated)": "Guardar (si el componente de salvar est\u00e1 activado)", +"Find (if searchreplace plugin activated)": "Buscar (si el complemento buscar-remplazar est\u00e1 activado)", +"Plugins installed ({0}):": "Plugins instalados ({0}):", +"Premium plugins:": "Complementos premium:", +"Learn more...": "Aprende m\u00e1s...", +"You are using {0}": "Estas usando {0}", +"Plugins": "Complementos", +"Handy Shortcuts": "Accesos directos", +"Horizontal line": "L\u00ednea horizontal", +"Insert\/edit image": "Insertar\/editar imagen", +"Image description": "Descripci\u00f3n de la imagen", +"Source": "Enlace", +"Dimensions": "Dimensiones", +"Constrain proportions": "Restringir proporciones", +"General": "General", +"Advanced": "Avanzado", +"Style": "Estilo", +"Vertical space": "Espacio vertical", +"Horizontal space": "Espacio horizontal", +"Border": "Borde", +"Insert image": "Insertar imagen", +"Image": "Imagen", +"Image list": "Lista de im\u00e1genes", +"Rotate counterclockwise": "Girar a la izquierda", +"Rotate clockwise": "Girar a la derecha", +"Flip vertically": "Invertir verticalmente", +"Flip horizontally": "Invertir horizontalmente", +"Edit image": "Editar imagen", +"Image options": "Opciones de imagen", +"Zoom in": "Acercar", +"Zoom out": "Alejar", +"Crop": "Recortar", +"Resize": "Redimensionar", +"Orientation": "Orientaci\u00f3n", +"Brightness": "Brillo", +"Sharpen": "Forma", +"Contrast": "Contraste", +"Color levels": "Niveles de color", +"Gamma": "Gamma", +"Invert": "Invertir", +"Apply": "Aplicar", +"Back": "Atr\u00e1s", +"Insert date\/time": "Insertar fecha\/hora", +"Date\/time": "Fecha\/hora", +"Insert link": "Insertar enlace", +"Insert\/edit link": "Insertar\/editar enlace", +"Text to display": "Texto para mostrar", +"Url": "URL", +"Target": "Destino", +"None": "Ninguno", +"New window": "Nueva ventana", +"Remove link": "Quitar enlace", +"Anchors": "Anclas", +"Link": "Enlace", +"Paste or type a link": "Pega o introduce un enlace", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?", +"Link list": "Lista de enlaces", +"Insert video": "Insertar video", +"Insert\/edit video": "Insertar\/editar video", +"Insert\/edit media": "Insertar\/editar medio", +"Alternative source": "Enlace alternativo", +"Poster": "Miniatura", +"Paste your embed code below:": "Pega tu c\u00f3digo embebido debajo", +"Embed": "Incrustado", +"Media": "Media", +"Nonbreaking space": "Espacio fijo", +"Page break": "Salto de p\u00e1gina", +"Paste as text": "Pegar como texto", +"Preview": "Previsualizar", +"Print": "Imprimir", +"Save": "Guardar", +"Find": "Buscar", +"Replace with": "Reemplazar con", +"Replace": "Reemplazar", +"Replace all": "Reemplazar todo", +"Prev": "Anterior", +"Next": "Siguiente", +"Find and replace": "Buscar y reemplazar", +"Could not find the specified string.": "No se encuentra la cadena de texto especificada", +"Match case": "Coincidencia exacta", +"Whole words": "Palabras completas", +"Spellcheck": "Corrector ortogr\u00e1fico", +"Ignore": "Ignorar", +"Ignore all": "Ignorar todos", +"Finish": "Finalizar", +"Add to Dictionary": "A\u00f1adir al Diccionario", +"Insert table": "Insertar tabla", +"Table properties": "Propiedades de la tabla", +"Delete table": "Eliminar tabla", +"Cell": "Celda", +"Row": "Fila", +"Column": "Columna", +"Cell properties": "Propiedades de la celda", +"Merge cells": "Combinar celdas", +"Split cell": "Dividir celdas", +"Insert row before": "Insertar fila antes", +"Insert row after": "Insertar fila despu\u00e9s ", +"Delete row": "Eliminar fila", +"Row properties": "Propiedades de la fila", +"Cut row": "Cortar fila", +"Copy row": "Copiar fila", +"Paste row before": "Pegar la fila antes", +"Paste row after": "Pegar la fila despu\u00e9s", +"Insert column before": "Insertar columna antes", +"Insert column after": "Insertar columna despu\u00e9s", +"Delete column": "Eliminar columna", +"Cols": "Columnas", +"Rows": "Filas", +"Width": "Ancho", +"Height": "Alto", +"Cell spacing": "Espacio entre celdas", +"Cell padding": "Relleno de celda", +"Caption": "Subt\u00edtulo", +"Left": "Izquierda", +"Center": "Centrado", +"Right": "Derecha", +"Cell type": "Tipo de celda", +"Scope": "\u00c1mbito", +"Alignment": "Alineaci\u00f3n", +"H Align": "Alineamiento Horizontal", +"V Align": "Alineamiento Vertical", +"Top": "Arriba", +"Middle": "Centro", +"Bottom": "Abajo", +"Header cell": "Celda de la cebecera", +"Row group": "Grupo de filas", +"Column group": "Grupo de columnas", +"Row type": "Tipo de fila", +"Header": "Cabecera", +"Body": "Cuerpo", +"Footer": "Pie de p\u00e1gina", +"Border color": "Color del borde", +"Insert template": "Insertar plantilla", +"Templates": "Plantillas", +"Template": "Plantilla", +"Text color": "Color del texto", +"Background color": "Color de fondo", +"Custom...": "Personalizar...", +"Custom color": "Color personalizado", +"No color": "Sin color", +"Table of Contents": "Tabla de contenidos", +"Show blocks": "Mostrar bloques", +"Show invisible characters": "Mostrar caracteres invisibles", +"Words: {0}": "Palabras: {0}", +"{0} words": "{0} palabras", +"File": "Archivo", +"Edit": "Editar", +"Insert": "Insertar", +"View": "Ver", +"Format": "Formato", +"Table": "Tabla", +"Tools": "Herramientas", +"Powered by {0}": "Desarrollado por {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/fr.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/fr.js new file mode 100644 index 0000000000..5c37164b2c --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/fr.js @@ -0,0 +1,261 @@ +tinymce.addI18n('fr_FR',{ +"Redo": "R\u00e9tablir", +"Undo": "Annuler", +"Cut": "Couper", +"Copy": "Copier", +"Paste": "Coller", +"Select all": "Tout s\u00e9lectionner", +"New document": "Nouveau document", +"Ok": "Ok", +"Cancel": "Annuler", +"Visual aids": "Aides visuelle", +"Bold": "Gras", +"Italic": "Italique", +"Underline": "Soulign\u00e9", +"Strikethrough": "Barr\u00e9", +"Superscript": "Exposant", +"Subscript": "Indice", +"Clear formatting": "Effacer la mise en forme", +"Align left": "Aligner \u00e0 gauche", +"Align center": "Centrer", +"Align right": "Aligner \u00e0 droite", +"Justify": "Justifier", +"Bullet list": "Puces", +"Numbered list": "Num\u00e9rotation", +"Decrease indent": "Diminuer le retrait", +"Increase indent": "Augmenter le retrait", +"Close": "Fermer", +"Formats": "Formats", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Votre navigateur ne supporte pas la copie directe. Merci d'utiliser les touches Ctrl+X\/C\/V.", +"Headers": "Titres", +"Header 1": "Titre 1", +"Header 2": "Titre 2", +"Header 3": "Titre 3", +"Header 4": "Titre 4", +"Header 5": "Titre 5", +"Header 6": "Titre 6", +"Headings": "En-t\u00eates", +"Heading 1": "En-t\u00eate 1", +"Heading 2": "En-t\u00eate 2", +"Heading 3": "En-t\u00eate 3", +"Heading 4": "En-t\u00eate 4", +"Heading 5": "En-t\u00eate 5", +"Heading 6": "En-t\u00eate 6", +"Preformatted": "Pr\u00e9-formatt\u00e9", +"Div": "Div", +"Pre": "Pre", +"Code": "Code", +"Paragraph": "Paragraphe", +"Blockquote": "Citation", +"Inline": "En ligne", +"Blocks": "Blocs", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Le presse-papiers est maintenant en mode \"texte plein\". Les contenus seront coll\u00e9s sans retenir les formatages jusqu'\u00e0 ce que vous d\u00e9sactiviez cette option.", +"Font Family": "Police", +"Font Sizes": "Taille de police", +"Class": "Classe", +"Browse for an image": "Parcourir pour s\u00e9lectionner une image", +"OR": "OU", +"Drop an image here": "Glisser une image ici", +"Upload": "D\u00e9poser", +"Block": "Bloquer", +"Align": "Aligner", +"Default": "Par d\u00e9faut", +"Circle": "Cercle", +"Disc": "Disque", +"Square": "Carr\u00e9", +"Lower Alpha": "Alpha minuscule", +"Lower Greek": "Grec minuscule", +"Lower Roman": "Romain minuscule", +"Upper Alpha": "Alpha majuscule", +"Upper Roman": "Romain majuscule", +"Anchor": "Ancre", +"Name": "Nom", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'Id doit commencer par une lettre suivi par des lettres, nombres, tirets, points, deux-points ou underscores", +"You have unsaved changes are you sure you want to navigate away?": "Vous avez des modifications non enregistr\u00e9es, \u00eates-vous s\u00fbr de quitter la page?", +"Restore last draft": "Restaurer le dernier brouillon", +"Special character": "Caract\u00e8res sp\u00e9ciaux", +"Source code": "Code source", +"Insert\/Edit code sample": "Ins\u00e9rer \/ modifier une exemple de code", +"Language": "Langue", +"Code sample": "Extrait de code", +"Color": "Couleur", +"R": "R", +"G": "V", +"B": "B", +"Left to right": "Gauche \u00e0 droite", +"Right to left": "Droite \u00e0 gauche", +"Emoticons": "Emotic\u00f4nes", +"Document properties": "Propri\u00e9t\u00e9 du document", +"Title": "Titre", +"Keywords": "Mots-cl\u00e9s", +"Description": "Description", +"Robots": "Robots", +"Author": "Auteur", +"Encoding": "Encodage", +"Fullscreen": "Plein \u00e9cran", +"Action": "Action", +"Shortcut": "Raccourci", +"Help": "Aide", +"Address": "Adresse", +"Focus to menubar": "Cibler la barre de menu", +"Focus to toolbar": "Cibler la barre d'outils", +"Focus to element path": "Cibler le chemin vers l'\u00e9l\u00e9ment", +"Focus to contextual toolbar": "Cibler la barre d'outils contextuelle", +"Insert link (if link plugin activated)": "Ins\u00e9rer un lien (si le module link est activ\u00e9)", +"Save (if save plugin activated)": "Enregistrer (si le module save est activ\u00e9)", +"Find (if searchreplace plugin activated)": "Rechercher (si le module searchreplace est activ\u00e9)", +"Plugins installed ({0}):": "Modules install\u00e9s ({0}) : ", +"Premium plugins:": "Modules premium :", +"Learn more...": "En savoir plus...", +"You are using {0}": "Vous utilisez {0}", +"Plugins": "Plugins", +"Handy Shortcuts": "Raccourcis utiles", +"Horizontal line": "Ligne horizontale", +"Insert\/edit image": "Ins\u00e9rer\/modifier une image", +"Image description": "Description de l'image", +"Source": "Source", +"Dimensions": "Dimensions", +"Constrain proportions": "Conserver les proportions", +"General": "G\u00e9n\u00e9ral", +"Advanced": "Avanc\u00e9", +"Style": "Style", +"Vertical space": "Espacement vertical", +"Horizontal space": "Espacement horizontal", +"Border": "Bordure", +"Insert image": "Ins\u00e9rer une image", +"Image": "Image", +"Image list": "Liste d'images", +"Rotate counterclockwise": "Rotation anti-horaire", +"Rotate clockwise": "Rotation horaire", +"Flip vertically": "Retournement vertical", +"Flip horizontally": "Retournement horizontal", +"Edit image": "Modifier l'image", +"Image options": "Options de l'image", +"Zoom in": "Zoomer", +"Zoom out": "D\u00e9zoomer", +"Crop": "Rogner", +"Resize": "Redimensionner", +"Orientation": "Orientation", +"Brightness": "Luminosit\u00e9", +"Sharpen": "Affiner", +"Contrast": "Contraste", +"Color levels": "Niveaux de couleur", +"Gamma": "Gamma", +"Invert": "Inverser", +"Apply": "Appliquer", +"Back": "Retour", +"Insert date\/time": "Ins\u00e9rer date\/heure", +"Date\/time": "Date\/heure", +"Insert link": "Ins\u00e9rer un lien", +"Insert\/edit link": "Ins\u00e9rer\/modifier un lien", +"Text to display": "Texte \u00e0 afficher", +"Url": "Url", +"Target": "Cible", +"None": "n\/a", +"New window": "Nouvelle fen\u00eatre", +"Remove link": "Enlever le lien", +"Anchors": "Ancres", +"Link": "Lien", +"Paste or type a link": "Coller ou taper un lien", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre une adresse e-mail. Voulez-vous ajouter le pr\u00e9fixe mailto: n\u00e9cessaire?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre un lien externe. Voulez-vous ajouter le pr\u00e9fixe http:\/\/ n\u00e9cessaire?", +"Link list": "Liste de liens", +"Insert video": "Ins\u00e9rer une vid\u00e9o", +"Insert\/edit video": "Ins\u00e9rer\/modifier une vid\u00e9o", +"Insert\/edit media": "Ins\u00e9rer\/modifier un m\u00e9dia", +"Alternative source": "Source alternative", +"Poster": "Publier", +"Paste your embed code below:": "Collez votre code d'int\u00e9gration ci-dessous :", +"Embed": "Int\u00e9grer", +"Media": "M\u00e9dia", +"Nonbreaking space": "Espace ins\u00e9cable", +"Page break": "Saut de page", +"Paste as text": "Coller comme texte", +"Preview": "Pr\u00e9visualiser", +"Print": "Imprimer", +"Save": "Enregistrer", +"Find": "Chercher", +"Replace with": "Remplacer par", +"Replace": "Remplacer", +"Replace all": "Tout remplacer", +"Prev": "Pr\u00e9c ", +"Next": "Suiv", +"Find and replace": "Trouver et remplacer", +"Could not find the specified string.": "Impossible de trouver la cha\u00eene sp\u00e9cifi\u00e9e.", +"Match case": "Respecter la casse", +"Whole words": "Mots entiers", +"Spellcheck": "V\u00e9rification orthographique", +"Ignore": "Ignorer", +"Ignore all": "Tout ignorer", +"Finish": "Finie", +"Add to Dictionary": "Ajouter au dictionnaire", +"Insert table": "Ins\u00e9rer un tableau", +"Table properties": "Propri\u00e9t\u00e9s du tableau", +"Delete table": "Supprimer le tableau", +"Cell": "Cellule", +"Row": "Ligne", +"Column": "Colonne", +"Cell properties": "Propri\u00e9t\u00e9s de la cellule", +"Merge cells": "Fusionner les cellules", +"Split cell": "Diviser la cellule", +"Insert row before": "Ins\u00e9rer une ligne avant", +"Insert row after": "Ins\u00e9rer une ligne apr\u00e8s", +"Delete row": "Effacer la ligne", +"Row properties": "Propri\u00e9t\u00e9s de la ligne", +"Cut row": "Couper la ligne", +"Copy row": "Copier la ligne", +"Paste row before": "Coller la ligne avant", +"Paste row after": "Coller la ligne apr\u00e8s", +"Insert column before": "Ins\u00e9rer une colonne avant", +"Insert column after": "Ins\u00e9rer une colonne apr\u00e8s", +"Delete column": "Effacer la colonne", +"Cols": "Colonnes", +"Rows": "Lignes", +"Width": "Largeur", +"Height": "Hauteur", +"Cell spacing": "Espacement inter-cellulles", +"Cell padding": "Espacement interne cellule", +"Caption": "Titre", +"Left": "Gauche", +"Center": "Centr\u00e9", +"Right": "Droite", +"Cell type": "Type de cellule", +"Scope": "Etendue", +"Alignment": "Alignement", +"H Align": "Alignement H", +"V Align": "Alignement V", +"Top": "Haut", +"Middle": "Milieu", +"Bottom": "Bas", +"Header cell": "Cellule d'en-t\u00eate", +"Row group": "Groupe de lignes", +"Column group": "Groupe de colonnes", +"Row type": "Type de ligne", +"Header": "En-t\u00eate", +"Body": "Corps", +"Footer": "Pied", +"Border color": "Couleur de la bordure", +"Insert template": "Ajouter un th\u00e8me", +"Templates": "Th\u00e8mes", +"Template": "Mod\u00e8le", +"Text color": "Couleur du texte", +"Background color": "Couleur d'arri\u00e8re-plan", +"Custom...": "Personnalis\u00e9...", +"Custom color": "Couleur personnalis\u00e9e", +"No color": "Aucune couleur", +"Table of Contents": "Table des mati\u00e8res", +"Show blocks": "Afficher les blocs", +"Show invisible characters": "Afficher les caract\u00e8res invisibles", +"Words: {0}": "Mots : {0}", +"{0} words": "{0} mots", +"File": "Fichier", +"Edit": "Editer", +"Insert": "Ins\u00e9rer", +"View": "Voir", +"Format": "Format", +"Table": "Tableau", +"Tools": "Outils", +"Powered by {0}": "Propuls\u00e9 par {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Zone Texte Riche. Appuyer sur ALT-F9 pour le menu. Appuyer sur ALT-F10 pour la barre d'outils. Appuyer sur ALT-0 pour de l'aide." +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/it.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/it.js new file mode 100644 index 0000000000..5ffc0c0f80 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/it.js @@ -0,0 +1,261 @@ +tinymce.addI18n('it',{ +"Redo": "Ripeti", +"Undo": "Indietro", +"Cut": "Taglia", +"Copy": "Copia", +"Paste": "Incolla", +"Select all": "Seleziona Tutto", +"New document": "Nuovo Documento", +"Ok": "Ok", +"Cancel": "Annulla", +"Visual aids": "Elementi Visivi", +"Bold": "Grassetto", +"Italic": "Corsivo", +"Underline": "Sottolineato", +"Strikethrough": "Barrato", +"Superscript": "Apice", +"Subscript": "Pedice", +"Clear formatting": "Cancella Formattazione", +"Align left": "Allinea a Sinistra", +"Align center": "Allinea al Cento", +"Align right": "Allinea a Destra", +"Justify": "Giustifica", +"Bullet list": "Elenchi Puntati", +"Numbered list": "Elenchi Numerati", +"Decrease indent": "Riduci Rientro", +"Increase indent": "Aumenta Rientro", +"Close": "Chiudi", +"Formats": "Formattazioni", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Il tuo browser non supporta l'accesso diretto negli Appunti. Per favore usa i tasti di scelta rapida Ctrl+X\/C\/V.", +"Headers": "Intestazioni", +"Header 1": "Intestazione 1", +"Header 2": "Header 2", +"Header 3": "Intestazione 3", +"Header 4": "Intestazione 4", +"Header 5": "Intestazione 5", +"Header 6": "Intestazione 6", +"Headings": "Intestazioni", +"Heading 1": "Intestazione 1", +"Heading 2": "Intestazione 2", +"Heading 3": "Intestazione 3", +"Heading 4": "Intestazione 4", +"Heading 5": "Intestazione 5", +"Heading 6": "Intestazione 6", +"Preformatted": "Preformattato", +"Div": "Div", +"Pre": "Pre", +"Code": "Codice", +"Paragraph": "Paragrafo", +"Blockquote": "Blockquote", +"Inline": "Inlinea", +"Blocks": "Blocchi", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Incolla \u00e8 in modalit\u00e0 testo normale. I contenuti sono incollati come testo normale se non disattivi l'opzione.", +"Font Family": "Famiglia font", +"Font Sizes": "Dimensioni font", +"Class": "Classe", +"Browse for an image": "Scegli un'immagine", +"OR": "o", +"Drop an image here": "Incolla un'immagine qui", +"Upload": "Carica", +"Block": "Blocco", +"Align": "Allinea", +"Default": "Default", +"Circle": "Cerchio", +"Disc": "Disco", +"Square": "Quadrato", +"Lower Alpha": "Alpha Minore", +"Lower Greek": "Greek Minore", +"Lower Roman": "Roman Minore", +"Upper Alpha": "Alpha Superiore", +"Upper Roman": "Roman Superiore", +"Anchor": "Fissa", +"Name": "Nome", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'id dovrebbe cominciare con una lettera, seguito solo da lettere, numeri, linee, punti, virgole.", +"You have unsaved changes are you sure you want to navigate away?": "Non hai salvato delle modifiche, sei sicuro di andartene?", +"Restore last draft": "Ripristina l'ultima bozza.", +"Special character": "Carattere Speciale", +"Source code": "Codice Sorgente", +"Insert\/Edit code sample": "Inserisci\/Modifica esempio di codice", +"Language": "Lingua", +"Code sample": "Esempio di codice", +"Color": "Colore", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "Da Sinistra a Destra", +"Right to left": "Da Destra a Sinistra", +"Emoticons": "Emoction", +"Document properties": "Propriet\u00e0 Documento", +"Title": "Titolo", +"Keywords": "Parola Chiave", +"Description": "Descrizione", +"Robots": "Robot", +"Author": "Autore", +"Encoding": "Codifica", +"Fullscreen": "Schermo Intero", +"Action": "Azione", +"Shortcut": "Scorciatoia", +"Help": "Aiuto", +"Address": "Indirizzo", +"Focus to menubar": "Focus sulla barra del menu", +"Focus to toolbar": "Focus sulla barra degli strumenti", +"Focus to element path": "Focus sul percorso dell'elemento", +"Focus to contextual toolbar": "Focus sulla barra degli strumenti contestuale", +"Insert link (if link plugin activated)": "Inserisci link (se il plugin link \u00e8 attivato)", +"Save (if save plugin activated)": "Salva (se il plugin save \u00e8 attivato)", +"Find (if searchreplace plugin activated)": "Trova (se il plugin searchreplace \u00e8 attivato)", +"Plugins installed ({0}):": "Plugin installati ({0}):", +"Premium plugins:": "Plugin Premium:", +"Learn more...": "Per saperne di pi\u00f9...", +"You are using {0}": "Stai usando {0}", +"Plugins": "Plugin", +"Handy Shortcuts": "Scorciatoia pratica", +"Horizontal line": "Linea Orizzontale", +"Insert\/edit image": "Aggiungi\/Modifica Immagine", +"Image description": "Descrizione Immagine", +"Source": "Fonte", +"Dimensions": "Dimenzioni", +"Constrain proportions": "Mantieni Proporzioni", +"General": "Generale", +"Advanced": "Avanzato", +"Style": "Stile", +"Vertical space": "Spazio Verticale", +"Horizontal space": "Spazio Orizzontale", +"Border": "Bordo", +"Insert image": "Inserisci immagine", +"Image": "Immagine", +"Image list": "Elenco immagini", +"Rotate counterclockwise": "Ruota in senso antiorario", +"Rotate clockwise": "Ruota in senso orario", +"Flip vertically": "Rifletti verticalmente", +"Flip horizontally": "Rifletti orizzontalmente", +"Edit image": "Modifica immagine", +"Image options": "Opzioni immagine", +"Zoom in": "Ingrandisci", +"Zoom out": "Rimpicciolisci", +"Crop": "Taglia", +"Resize": "Ridimensiona", +"Orientation": "Orientamento", +"Brightness": "Luminosit\u00e0", +"Sharpen": "Contrasta", +"Contrast": "Contrasto", +"Color levels": "Livelli colore", +"Gamma": "Gamma", +"Invert": "Inverti", +"Apply": "Applica", +"Back": "Indietro", +"Insert date\/time": "Inserisci Data\/Ora", +"Date\/time": "Data\/Ora", +"Insert link": "Inserisci il Link", +"Insert\/edit link": "Inserisci\/Modifica Link", +"Text to display": "Testo da Visualizzare", +"Url": "Url", +"Target": "Target", +"None": "No", +"New window": "Nuova Finestra", +"Remove link": "Rimuovi link", +"Anchors": "Anchors", +"Link": "Collegamento", +"Paste or type a link": "Incolla o digita un collegamento", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL inserito sembra essere un indirizzo email. Vuoi aggiungere il prefisso necessario mailto:?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL inserito sembra essere un collegamento esterno. Vuoi aggiungere il prefisso necessario http:\/\/?", +"Link list": "Elenco link", +"Insert video": "Inserisci Video", +"Insert\/edit video": "Inserisci\/Modifica Video", +"Insert\/edit media": "Inserisci\/Modifica Media", +"Alternative source": "Alternativo", +"Poster": "Anteprima", +"Paste your embed code below:": "Incolla il codice d'incorporamento qui:", +"Embed": "Incorporare", +"Media": "Media", +"Nonbreaking space": "Spazio unificatore", +"Page break": "Interruzione di pagina", +"Paste as text": "incolla come testo", +"Preview": "Anteprima", +"Print": "Stampa", +"Save": "Salva", +"Find": "Trova", +"Replace with": "Sostituisci Con", +"Replace": "Sostituisci", +"Replace all": "Sostituisci Tutto", +"Prev": "Precedente", +"Next": "Successivo", +"Find and replace": "Trova e Sostituisci", +"Could not find the specified string.": "Impossibile trovare la parola specifica.", +"Match case": "Maiuscole\/Minuscole ", +"Whole words": "Parole Sbagliate", +"Spellcheck": "Controllo ortografico", +"Ignore": "Ignora", +"Ignore all": "Ignora Tutto", +"Finish": "Termina", +"Add to Dictionary": "Aggiungi al Dizionario", +"Insert table": "Inserisci Tabella", +"Table properties": "Propiet\u00e0 della Tabella", +"Delete table": "Cancella Tabella", +"Cell": "Cella", +"Row": "Riga", +"Column": "Colonna", +"Cell properties": "Propiet\u00e0 della Cella", +"Merge cells": "Unisci Cella", +"Split cell": "Dividi Cella", +"Insert row before": "Inserisci una Riga Prima", +"Insert row after": "Inserisci una Riga Dopo", +"Delete row": "Cancella Riga", +"Row properties": "Propriet\u00e0 della Riga", +"Cut row": "Taglia Riga", +"Copy row": "Copia Riga", +"Paste row before": "Incolla una Riga Prima", +"Paste row after": "Incolla una Riga Dopo", +"Insert column before": "Inserisci una Colonna Prima", +"Insert column after": "Inserisci una Colonna Dopo", +"Delete column": "Cancella Colonna", +"Cols": "Colonne", +"Rows": "Righe", +"Width": "Larghezza", +"Height": "Altezza", +"Cell spacing": "Spaziatura della Cella", +"Cell padding": "Padding della Cella", +"Caption": "Didascalia", +"Left": "Sinistra", +"Center": "Centro", +"Right": "Destra", +"Cell type": "Tipo di Cella", +"Scope": "Campo", +"Alignment": "Allineamento", +"H Align": "Allineamento H", +"V Align": "Allineamento V", +"Top": "In alto", +"Middle": "In mezzo", +"Bottom": "In fondo", +"Header cell": "cella d'intestazione", +"Row group": "Gruppo di Righe", +"Column group": "Gruppo di Colonne", +"Row type": "Tipo di Riga", +"Header": "Header", +"Body": "Body", +"Footer": "Footer", +"Border color": "Colore bordo", +"Insert template": "Inserisci Template", +"Templates": "Template", +"Template": "Modello", +"Text color": "Colore Testo", +"Background color": "Colore Background", +"Custom...": "Personalizzato...", +"Custom color": "Colore personalizzato", +"No color": "Nessun colore", +"Table of Contents": "Tabella dei contenuti", +"Show blocks": "Mostra Blocchi", +"Show invisible characters": "Mostra Caratteri Invisibili", +"Words: {0}": "Parole: {0}", +"{0} words": "{0} parole", +"File": "File", +"Edit": "Modifica", +"Insert": "Inserisci", +"View": "Visualiza", +"Format": "Formato", +"Table": "Tabella", +"Tools": "Strumenti", +"Powered by {0}": "Fornito da {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Premi ALT-F9 per il men\u00f9. Premi ALT-F10 per la barra degli strumenti. Premi ALT-0 per l'aiuto." +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/ja.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/ja.js new file mode 100644 index 0000000000..61f0ba61a1 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/ja.js @@ -0,0 +1,261 @@ +tinymce.addI18n('ja',{ +"Redo": "\u3084\u308a\u76f4\u3059", +"Undo": "\u5143\u306b\u623b\u3059", +"Cut": "\u5207\u308a\u53d6\u308a", +"Copy": "\u30b3\u30d4\u30fc", +"Paste": "\u8cbc\u308a\u4ed8\u3051", +"Select all": "\u5168\u3066\u3092\u9078\u629e", +"New document": "\u65b0\u898f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8", +"Ok": "OK", +"Cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", +"Visual aids": "\u8868\u306e\u67a0\u7dda\u3092\u70b9\u7dda\u3067\u8868\u793a", +"Bold": "\u592a\u5b57", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u7dda", +"Strikethrough": "\u53d6\u308a\u6d88\u3057\u7dda", +"Superscript": "\u4e0a\u4ed8\u304d\u6587\u5b57", +"Subscript": "\u4e0b\u4ed8\u304d\u6587\u5b57", +"Clear formatting": "\u66f8\u5f0f\u3092\u30af\u30ea\u30a2", +"Align left": "\u5de6\u5bc4\u305b", +"Align center": "\u4e2d\u592e\u63c3\u3048", +"Align right": "\u53f3\u5bc4\u305b", +"Justify": "\u4e21\u7aef\u63c3\u3048", +"Bullet list": "\u7b87\u6761\u66f8\u304d", +"Numbered list": "\u756a\u53f7\u4ed8\u304d\u7b87\u6761\u66f8\u304d", +"Decrease indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u6e1b\u3089\u3059", +"Increase indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u5897\u3084\u3059", +"Close": "\u9589\u3058\u308b", +"Formats": "\u66f8\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306f\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u6a5f\u80fd\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\uff08Ctrl+X, Ctrl+C, Ctrl+V\uff09\u3092\u304a\u4f7f\u3044\u4e0b\u3055\u3044\u3002", +"Headers": "\u30d8\u30c3\u30c0\u30fc", +"Header 1": "\u30d8\u30c3\u30c0\u30fc 1", +"Header 2": "\u30d8\u30c3\u30c0\u30fc 2", +"Header 3": "\u30d8\u30c3\u30c0\u30fc 3", +"Header 4": "\u30d8\u30c3\u30c0\u30fc 4", +"Header 5": "\u30d8\u30c3\u30c0\u30fc 5", +"Header 6": "\u30d8\u30c3\u30c0\u30fc 6", +"Headings": "\u898b\u51fa\u3057", +"Heading 1": "\u898b\u51fa\u3057 1", +"Heading 2": "\u898b\u51fa\u3057 2", +"Heading 3": "\u898b\u51fa\u3057 3", +"Heading 4": "\u898b\u51fa\u3057 4", +"Heading 5": "\u898b\u51fa\u3057 5", +"Heading 6": "\u898b\u51fa\u3057 6", +"Preformatted": "Preformatted", +"Div": "Div", +"Pre": "Pre", +"Code": "\u30b3\u30fc\u30c9", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u7528", +"Inline": "\u30a4\u30f3\u30e9\u30a4\u30f3", +"Blocks": "\u30d6\u30ed\u30c3\u30af", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u8cbc\u308a\u4ed8\u3051\u306f\u73fe\u5728\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u30e2\u30fc\u30c9\u3067\u3059\u3002\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30d5\u306b\u3057\u306a\u3044\u9650\u308a\u5185\u5bb9\u306f\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051\u3089\u308c\u307e\u3059\u3002", +"Font Family": "\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30df\u30ea\u30fc", +"Font Sizes": "\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba", +"Class": "\u30af\u30e9\u30b9", +"Browse for an image": "\u30a4\u30e1\u30fc\u30b8\u3092\u53c2\u7167", +"OR": "\u307e\u305f\u306f", +"Drop an image here": "\u3053\u3053\u306b\u753b\u50cf\u3092\u30c9\u30ed\u30c3\u30d7", +"Upload": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9", +"Block": "\u30d6\u30ed\u30c3\u30af", +"Align": "\u914d\u7f6e", +"Default": "\u30c7\u30d5\u30a9\u30eb\u30c8", +"Circle": "\u5186", +"Disc": "\u70b9", +"Square": "\u56db\u89d2", +"Lower Alpha": "\u5c0f\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8", +"Lower Greek": "\u5c0f\u6587\u5b57\u306e\u30ae\u30ea\u30b7\u30e3\u6587\u5b57", +"Lower Roman": "\u5c0f\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57", +"Upper Alpha": "\u5927\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8", +"Upper Roman": "\u5927\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57", +"Anchor": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09", +"Name": "\u30a2\u30f3\u30ab\u30fc\u540d", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "ID\u306f\u6587\u5b57\u3067\u59cb\u307e\u308a\u3001\u6587\u5b57\u3001\u6570\u5b57\u3001\u30c0\u30c3\u30b7\u30e5\u3001\u30c9\u30c3\u30c8\u3001\u30b3\u30ed\u30f3\u307e\u305f\u306f\u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2\u3067\u59cb\u307e\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u307e\u3060\u4fdd\u5b58\u3057\u3066\u3044\u306a\u3044\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u672c\u5f53\u306b\u3053\u306e\u30da\u30fc\u30b8\u3092\u96e2\u308c\u307e\u3059\u304b\uff1f", +"Restore last draft": "\u524d\u56de\u306e\u4e0b\u66f8\u304d\u3092\u5fa9\u6d3b\u3055\u305b\u308b", +"Special character": "\u7279\u6b8a\u6587\u5b57", +"Source code": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9", +"Insert\/Edit code sample": "\u30b3\u30fc\u30c9\u30b5\u30f3\u30d7\u30eb\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Language": "\u8a00\u8a9e", +"Code sample": "\u30b3\u30fc\u30c9\u30b5\u30f3\u30d7\u30eb", +"Color": "\u30ab\u30e9\u30fc", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u5de6\u304b\u3089\u53f3", +"Right to left": "\u53f3\u304b\u3089\u5de6", +"Emoticons": "\u7d75\u6587\u5b57", +"Document properties": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3", +"Title": "\u30bf\u30a4\u30c8\u30eb", +"Keywords": "\u30ad\u30fc\u30ef\u30fc\u30c9", +"Description": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u5185\u5bb9", +"Robots": "\u30ed\u30dc\u30c3\u30c4", +"Author": "\u8457\u8005", +"Encoding": "\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0", +"Fullscreen": "\u5168\u753b\u9762\u8868\u793a", +"Action": "\u30a2\u30af\u30b7\u30e7\u30f3", +"Shortcut": "\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8", +"Help": "\u30d8\u30eb\u30d7", +"Address": "\u30a2\u30c9\u30ec\u30b9", +"Focus to menubar": "\u30e1\u30cb\u30e5\u30fc\u30d0\u30fc\u306b\u30d5\u30a9\u30fc\u30ab\u30b9", +"Focus to toolbar": "\u30c4\u30fc\u30eb\u30d0\u30fc\u306b\u30d5\u30a9\u30fc\u30ab\u30b9", +"Focus to element path": "\u8981\u7d20\u30d1\u30b9\u306b\u30d5\u30a9\u30fc\u30ab\u30b9", +"Focus to contextual toolbar": "\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30c4\u30fc\u30eb\u30d0\u30fc\u306b\u30d5\u30a9\u30fc\u30ab\u30b9", +"Insert link (if link plugin activated)": "\u30ea\u30f3\u30af\u3092\u633f\u5165 (\u30ea\u30f3\u30af\u30d7\u30e9\u30b0\u30a4\u30f3\u6709\u52b9\u6642)", +"Save (if save plugin activated)": "\u4fdd\u5b58 (\u4fdd\u5b58\u30d7\u30e9\u30b0\u30a4\u30f3\u6709\u52b9\u6642)", +"Find (if searchreplace plugin activated)": "\u691c\u7d22(\u7f6e\u63db\u30d7\u30e9\u30b0\u30a4\u30f3\u6709\u52b9\u6642)", +"Plugins installed ({0}):": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u30d7\u30e9\u30b0\u30a4\u30f3 ({0}):", +"Premium plugins:": "\u30d7\u30ec\u30df\u30a2\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3:", +"Learn more...": "\u8a73\u7d30...", +"You are using {0}": "\u3042\u306a\u305f\u306f {0} \u4f7f\u7528\u4e2d", +"Plugins": "\u30d7\u30e9\u30b0\u30a4\u30f3", +"Handy Shortcuts": "\u4fbf\u5229\u306a\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8", +"Horizontal line": "\u6c34\u5e73\u7f6b\u7dda", +"Insert\/edit image": "\u753b\u50cf\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Image description": "\u753b\u50cf\u306e\u8aac\u660e\u6587", +"Source": "\u753b\u50cf\u306e\u30bd\u30fc\u30b9", +"Dimensions": "\u753b\u50cf\u30b5\u30a4\u30ba\uff08\u6a2a\u30fb\u7e26\uff09", +"Constrain proportions": "\u7e26\u6a2a\u6bd4\u3092\u4fdd\u6301\u3059\u308b", +"General": "\u4e00\u822c", +"Advanced": "\u8a73\u7d30\u8a2d\u5b9a", +"Style": "\u30b9\u30bf\u30a4\u30eb", +"Vertical space": "\u7e26\u65b9\u5411\u306e\u4f59\u767d", +"Horizontal space": "\u6a2a\u65b9\u5411\u306e\u4f59\u767d", +"Border": "\u67a0\u7dda", +"Insert image": "\u753b\u50cf\u306e\u633f\u5165", +"Image": "\u753b\u50cf", +"Image list": "\u753b\u50cf\u4e00\u89a7", +"Rotate counterclockwise": "\u53cd\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2", +"Rotate clockwise": "\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2", +"Flip vertically": "\u4e0a\u4e0b\u306b\u53cd\u8ee2", +"Flip horizontally": "\u6c34\u5e73\u306b\u53cd\u8ee2", +"Edit image": "\u753b\u50cf\u306e\u7de8\u96c6", +"Image options": "\u753b\u50cf\u30aa\u30d7\u30b7\u30e7\u30f3", +"Zoom in": "\u30ba\u30fc\u30e0\u30a4\u30f3", +"Zoom out": "\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8", +"Crop": "\u30af\u30ed\u30c3\u30d7", +"Resize": "\u30ea\u30b5\u30a4\u30ba", +"Orientation": "\u5411\u304d", +"Brightness": "\u660e\u308b\u3055", +"Sharpen": "\u30b7\u30e3\u30fc\u30d7\u5316", +"Contrast": "\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8", +"Color levels": "\u30ab\u30e9\u30fc\u30ec\u30d9\u30eb", +"Gamma": "\u30ac\u30f3\u30de", +"Invert": "\u53cd\u8ee2", +"Apply": "\u9069\u7528", +"Back": "\u623b\u308b", +"Insert date\/time": "\u65e5\u4ed8\u30fb\u6642\u523b", +"Date\/time": "\u65e5\u4ed8\u30fb\u6642\u523b", +"Insert link": "\u30ea\u30f3\u30af", +"Insert\/edit link": "\u30ea\u30f3\u30af\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Text to display": "\u30ea\u30f3\u30af\u5143\u30c6\u30ad\u30b9\u30c8", +"Url": "\u30ea\u30f3\u30af\u5148URL", +"Target": "\u30bf\u30fc\u30b2\u30c3\u30c8\u5c5e\u6027", +"None": "\u306a\u3057", +"New window": "\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6", +"Remove link": "\u30ea\u30f3\u30af\u306e\u524a\u9664", +"Anchors": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09", +"Link": "\u30ea\u30f3\u30af", +"Paste or type a link": "\u30ea\u30f3\u30af\u3092\u30da\u30fc\u30b9\u30c8\u307e\u305f\u306f\u5165\u529b", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u3088\u3046\u3067\u3059\u3002\u300cmailto:\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u5916\u90e8\u30ea\u30f3\u30af\u306e\u3088\u3046\u3067\u3059\u3002\u300chttp:\/\/\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f", +"Link list": "\u30ea\u30f3\u30af\u4e00\u89a7", +"Insert video": "\u52d5\u753b", +"Insert\/edit video": "\u52d5\u753b\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Insert\/edit media": "\u30e1\u30c7\u30a3\u30a2\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Alternative source": "\u4ee3\u66ff\u52d5\u753b\u306e\u5834\u6240", +"Poster": "\u4ee3\u66ff\u753b\u50cf\u306e\u5834\u6240", +"Paste your embed code below:": "\u57cb\u3081\u8fbc\u307f\u7528\u30b3\u30fc\u30c9\u3092\u4e0b\u8a18\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002", +"Embed": "\u57cb\u3081\u8fbc\u307f", +"Media": "\u30e1\u30c7\u30a3\u30a2", +"Nonbreaking space": "\u56fa\u5b9a\u30b9\u30da\u30fc\u30b9\uff08 \uff09", +"Page break": "\u30da\u30fc\u30b8\u533a\u5207\u308a", +"Paste as text": "\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051", +"Preview": "\u30d7\u30ec\u30d3\u30e5\u30fc", +"Print": "\u5370\u5237", +"Save": "\u4fdd\u5b58", +"Find": "\u691c\u7d22", +"Replace with": "\u7f6e\u304d\u63db\u3048\u308b\u6587\u5b57", +"Replace": "\u7f6e\u304d\u63db\u3048", +"Replace all": "\u5168\u3066\u3092\u7f6e\u304d\u63db\u3048\u308b", +"Prev": "\u524d", +"Next": "\u6b21", +"Find and replace": "\u691c\u7d22\u3068\u7f6e\u304d\u63db\u3048", +"Could not find the specified string.": "\u304a\u63a2\u3057\u306e\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002", +"Match case": "\u5927\u6587\u5b57\u30fb\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3059\u308b", +"Whole words": "\u5358\u8a9e\u5358\u4f4d\u3067\u691c\u7d22\u3059\u308b", +"Spellcheck": "\u30b9\u30da\u30eb\u30c1\u30a7\u30c3\u30af", +"Ignore": "\u7121\u8996", +"Ignore all": "\u5168\u3066\u3092\u7121\u8996", +"Finish": "\u7d42\u4e86", +"Add to Dictionary": "\u8f9e\u66f8\u306b\u8ffd\u52a0", +"Insert table": "\u8868\u306e\u633f\u5165", +"Table properties": "\u8868\u306e\u8a73\u7d30\u8a2d\u5b9a", +"Delete table": "\u8868\u306e\u524a\u9664", +"Cell": "\u30bb\u30eb", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u30bb\u30eb\u306e\u8a73\u7d30\u8a2d\u5b9a", +"Merge cells": "\u30bb\u30eb\u306e\u7d50\u5408", +"Split cell": "\u30bb\u30eb\u306e\u5206\u5272", +"Insert row before": "\u4e0a\u5074\u306b\u884c\u3092\u633f\u5165", +"Insert row after": "\u4e0b\u5074\u306b\u884c\u3092\u633f\u5165", +"Delete row": "\u884c\u306e\u524a\u9664", +"Row properties": "\u884c\u306e\u8a73\u7d30\u8a2d\u5b9a", +"Cut row": "\u884c\u306e\u5207\u308a\u53d6\u308a", +"Copy row": "\u884c\u306e\u30b3\u30d4\u30fc", +"Paste row before": "\u4e0a\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051", +"Paste row after": "\u4e0b\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051", +"Insert column before": "\u5de6\u5074\u306b\u5217\u3092\u633f\u5165", +"Insert column after": "\u53f3\u5074\u306b\u5217\u3092\u633f\u5165", +"Delete column": "\u5217\u306e\u524a\u9664", +"Cols": "\u5217\u6570", +"Rows": "\u884c\u6570", +"Width": "\u5e45", +"Height": "\u9ad8\u3055", +"Cell spacing": "\u30bb\u30eb\u306e\u9593\u9694", +"Cell padding": "\u30bb\u30eb\u5185\u4f59\u767d\uff08\u30d1\u30c7\u30a3\u30f3\u30b0\uff09", +"Caption": "\u8868\u984c", +"Left": "\u5de6\u5bc4\u305b", +"Center": "\u4e2d\u592e\u63c3\u3048", +"Right": "\u53f3\u5bc4\u305b", +"Cell type": "\u30bb\u30eb\u30bf\u30a4\u30d7", +"Scope": "\u30b9\u30b3\u30fc\u30d7", +"Alignment": "\u914d\u7f6e", +"H Align": "\u6c34\u5e73\u65b9\u5411\u306e\u914d\u7f6e", +"V Align": "\u5782\u76f4\u65b9\u5411\u306e\u914d\u7f6e", +"Top": "\u4e0a", +"Middle": "\u4e2d\u592e", +"Bottom": "\u4e0b", +"Header cell": "\u30d8\u30c3\u30c0\u30fc\u30bb\u30eb", +"Row group": "\u884c\u30b0\u30eb\u30fc\u30d7", +"Column group": "\u5217\u30b0\u30eb\u30fc\u30d7", +"Row type": "\u884c\u30bf\u30a4\u30d7", +"Header": "\u30d8\u30c3\u30c0\u30fc", +"Body": "\u30dc\u30c7\u30a3\u30fc", +"Footer": "\u30d5\u30c3\u30bf\u30fc", +"Border color": "\u67a0\u7dda\u306e\u8272", +"Insert template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u633f\u5165", +"Templates": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u540d", +"Template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8", +"Text color": "\u30c6\u30ad\u30b9\u30c8\u306e\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u30ab\u30b9\u30bf\u30e0...", +"Custom color": "\u30ab\u30b9\u30bf\u30e0\u30ab\u30e9\u30fc", +"No color": "\u30ab\u30e9\u30fc\u306a\u3057", +"Table of Contents": "\u76ee\u6b21", +"Show blocks": "\u6587\u7ae0\u306e\u533a\u5207\u308a\u3092\u70b9\u7dda\u3067\u8868\u793a", +"Show invisible characters": "\u4e0d\u53ef\u8996\u6587\u5b57\u3092\u8868\u793a", +"Words: {0}": "\u5358\u8a9e\u6570: {0}", +"{0} words": "{0} \u30ef\u30fc\u30c9", +"File": "\u30d5\u30a1\u30a4\u30eb", +"Edit": "\u7de8\u96c6", +"Insert": "\u633f\u5165", +"View": "\u8868\u793a", +"Format": "\u66f8\u5f0f", +"Table": "\u8868", +"Tools": "\u30c4\u30fc\u30eb", +"Powered by {0}": "Powered by {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u66f8\u5f0f\u4ed8\u304d\u30c6\u30ad\u30b9\u30c8\u306e\u7de8\u96c6\u753b\u9762\u3002ALT-F9\u3067\u30e1\u30cb\u30e5\u30fc\u3001ALT-F10\u3067\u30c4\u30fc\u30eb\u30d0\u30fc\u3001ALT-0\u3067\u30d8\u30eb\u30d7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/nb.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/nb.js new file mode 100644 index 0000000000..59233450b0 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/nb.js @@ -0,0 +1,261 @@ +tinymce.addI18n('nb_NO',{ +"Redo": "Utf\u00f8r likevel", +"Undo": "Angre", +"Cut": "Klipp ut", +"Copy": "Kopier", +"Paste": "Lim inn", +"Select all": "Marker alt", +"New document": "Nytt dokument", +"Ok": "OK", +"Cancel": "Avbryt", +"Visual aids": "Visuelle hjelpemidler", +"Bold": "Halvfet", +"Italic": "Kursiv", +"Underline": "Understreket", +"Strikethrough": "Gjennomstreket", +"Superscript": "Hevet skrift", +"Subscript": "Senket skrift", +"Clear formatting": "Fjern formateringer", +"Align left": "Venstrejustert", +"Align center": "Midtstilt", +"Align right": "H\u00f8yrejustert", +"Justify": "Juster alle linjer", +"Bullet list": "Punktliste", +"Numbered list": "Nummerliste", +"Decrease indent": "Reduser innrykk", +"Increase indent": "\u00d8k innrykk", +"Close": "Lukk", +"Formats": "Stiler", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Nettleseren din st\u00f8tter ikke direkte tilgang til utklippsboken. Bruk istedet tastatur-snarveiene Ctrl+X\/C\/V, eller Cmd+X\/C\/V p\u00e5 Mac.", +"Headers": "Overskrifter", +"Header 1": "Overskrift 1", +"Header 2": "Overskrift 2", +"Header 3": "Overskrift 3", +"Header 4": "Overskrift 4", +"Header 5": "Overskrift 5", +"Header 6": "Overskrift 6", +"Headings": "Overskrifter", +"Heading 1": "Overskrift 1", +"Heading 2": "Overskrift 2", +"Heading 3": "Overskrift 3", +"Heading 4": "Overskrift 4", +"Heading 5": "Overskrift 5", +"Heading 6": "Overskrift 6", +"Preformatted": "Forh\u00e5ndsformatert", +"Div": "Delblokk
        ", +"Pre": "Definert
        ",
        +"Code": "Kode ",
        +"Paragraph": "Avsnitt 

        ", +"Blockquote": "Sitatblokk

        ", +"Inline": "Innkapslet ", +"Blocks": "Blokker", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Lim inn er n\u00e5 i ren-tekst modus. Kopiert innhold vil bli limt inn som ren tekst inntil du sl\u00e5r av dette valget.", +"Font Family": "Skriftsnitt", +"Font Sizes": "St\u00f8rrelse", +"Class": "Klasse", +"Browse for an image": "S\u00f8k etter bilde", +"OR": "ELLER", +"Drop an image here": "Slipp et bilde her", +"Upload": "Last opp", +"Block": "Blokk", +"Align": "Juster", +"Default": "Normal", +"Circle": "\u00c5pen sirkel", +"Disc": "Fylt sirkel", +"Square": "Fylt firkant", +"Lower Alpha": "Minuskler", +"Lower Greek": "Greske minuskler", +"Lower Roman": "Romerske minuskler", +"Upper Alpha": "Versaler", +"Upper Roman": "Romerske versaler", +"Anchor": "Anker", +"Name": "Navn", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id burde starte med en bokstav, bare fulgt av bokstaver, nummer, streker, punktum, koloner eller understreker.", +"You have unsaved changes are you sure you want to navigate away?": "Du har ikke arkivert endringene. Vil du fortsette uten \u00e5 arkivere?", +"Restore last draft": "Gjenopprett siste utkast", +"Special character": "Spesialtegn", +"Source code": "Kildekode", +"Insert\/Edit code sample": "Sett inn\/endre kodeeksempel", +"Language": "Spr\u00e5k", +"Code sample": "Kodeeksempel", +"Color": "Farge", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "Venstre til h\u00f8yre", +"Right to left": "H\u00f8yre til venstre", +"Emoticons": "Hum\u00f8rfjes", +"Document properties": "Dokumentegenskaper", +"Title": "Tittel", +"Keywords": "N\u00f8kkelord", +"Description": "Beskrivelse", +"Robots": "Roboter", +"Author": "Forfatter", +"Encoding": "Tegnkoding", +"Fullscreen": "Fullskjerm", +"Action": "Handling", +"Shortcut": "Snarvei", +"Help": "Hjelp", +"Address": "Adresse", +"Focus to menubar": "Fokus p\u00e5 menylinje", +"Focus to toolbar": "Fokus p\u00e5 verkt\u00f8ylinje", +"Focus to element path": "Fokus p\u00e5 elementsti", +"Focus to contextual toolbar": "Fokus p\u00e5 kontekstuell verkt\u00f8ylinje", +"Insert link (if link plugin activated)": "Sett inn lenke (dersom lenketillegg er aktivert)", +"Save (if save plugin activated)": "Lagre (dersom lagretillegg er aktivert)", +"Find (if searchreplace plugin activated)": "Finn (dersom tillegg for s\u00f8k og erstatt er aktivert)", +"Plugins installed ({0}):": "Installerte tillegg ({0}):", +"Premium plugins:": "Premiumtillegg:", +"Learn more...": "Les mer ...", +"You are using {0}": "Du bruker {0}", +"Plugins": "Tillegg", +"Handy Shortcuts": "Nyttige snarveier", +"Horizontal line": "Horisontal linje", +"Insert\/edit image": "Sett inn\/endre bilde", +"Image description": "Bildebeskrivelse", +"Source": "Bildelenke", +"Dimensions": "Dimensjoner", +"Constrain proportions": "Behold proporsjoner", +"General": "Generelt", +"Advanced": "Avansert", +"Style": "Stil", +"Vertical space": "Vertikal marg", +"Horizontal space": "Horisontal marg", +"Border": "Ramme", +"Insert image": "Sett inn bilde", +"Image": "Bilde", +"Image list": "Bildeliste", +"Rotate counterclockwise": "Roter mot venstre", +"Rotate clockwise": "Roter mot h\u00f8yre", +"Flip vertically": "Speilvend vertikalt", +"Flip horizontally": "Speilvend horisontalt", +"Edit image": "Rediger bilde", +"Image options": "Bilde innstillinger", +"Zoom in": "Zoom inn", +"Zoom out": "Zoom ut", +"Crop": "Beskj\u00e6r", +"Resize": "Skaler", +"Orientation": "Orientering", +"Brightness": "Lysstyrke", +"Sharpen": "Skarphet", +"Contrast": "Kontrast", +"Color levels": "Fargeniv\u00e5", +"Gamma": "Gamma", +"Invert": "Inverter", +"Apply": "Utf\u00f8r", +"Back": "Tilbake", +"Insert date\/time": "Sett inn dato\/tid", +"Date\/time": "Dato\/tid", +"Insert link": "Sett inn lenke", +"Insert\/edit link": "Sett inn\/endre lenke", +"Text to display": "Tekst som skal vises", +"Url": "Url", +"Target": "M\u00e5l", +"None": "Ingen", +"New window": "Nytt vindu", +"Remove link": "Fjern lenke", +"Anchors": "Anker", +"Link": "Lenke", +"Paste or type a link": "Lim inn eller skriv en lenke", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Oppgitte URL ser ut til \u00e5 v\u00e6re en epost-adresse. \u00d8nsker du \u00e5 sette inn p\u00e5krevet mailto: prefiks forran epost-adressen?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Oppgitt URL ser ut til \u00e5 v\u00e6re en e-postadresse. \u00d8nsker du \u00e5 sette inn p\u00e5krevd mailto:-prefiks foran e-postadressen?", +"Link list": "Lenkeliste", +"Insert video": "Sett inn video", +"Insert\/edit video": "Sett inn\/rediger video", +"Insert\/edit media": "Sett inn\/endre media", +"Alternative source": "Alternativ kilde", +"Poster": "Plakatbilde", +"Paste your embed code below:": "Lim inn inkluderings-koden nedenfor", +"Embed": "Inkluder", +"Media": "Media", +"Nonbreaking space": "Hardt mellomrom", +"Page break": "Sideskifte", +"Paste as text": "Lim inn som tekst", +"Preview": "Forh\u00e5ndsvisning", +"Print": "Skriv ut", +"Save": "Arkiver", +"Find": "Finn", +"Replace with": "Erstatt med", +"Replace": "Erstatt", +"Replace all": "Erstatt alle", +"Prev": "Forrige", +"Next": "Neste", +"Find and replace": "Finn og erstatt", +"Could not find the specified string.": "Kunne ikke finne den spesifiserte teksten", +"Match case": "Match store og sm\u00e5 bokstaver", +"Whole words": "Hele ord", +"Spellcheck": "Stavekontroll", +"Ignore": "Ignorer", +"Ignore all": "Ignorer alle", +"Finish": "Avslutt", +"Add to Dictionary": "Legg til i ordliste", +"Insert table": "Sett inn tabell", +"Table properties": "Tabell egenskaper", +"Delete table": "Slett tabell", +"Cell": "Celle", +"Row": "Rad", +"Column": "Kolonne", +"Cell properties": "Celle egenskaper", +"Merge cells": "Sl\u00e5 sammen celler", +"Split cell": "Splitt celle", +"Insert row before": "Sett inn rad f\u00f8r", +"Insert row after": "Sett in rad etter", +"Delete row": "Slett rad", +"Row properties": "Rad egenskaper", +"Cut row": "Klipp ut rad", +"Copy row": "Kopier rad", +"Paste row before": "Lim inn rad f\u00f8r", +"Paste row after": "Lim inn rad etter", +"Insert column before": "Sett inn kolonne f\u00f8r", +"Insert column after": "Sett inn kolonne etter", +"Delete column": "Slett kolonne", +"Cols": "Kolonner", +"Rows": "Rader", +"Width": "Bredde", +"Height": "H\u00f8yde", +"Cell spacing": "Celleavstand", +"Cell padding": "Cellemarg", +"Caption": "Tittel", +"Left": "Venstre", +"Center": "Midtstilt", +"Right": "H\u00f8yre", +"Cell type": "Celletype", +"Scope": "Omfang", +"Alignment": "Justering", +"H Align": "H Justering", +"V Align": "V Justering", +"Top": "Topp", +"Middle": "Midten", +"Bottom": "Bunn", +"Header cell": "Topptekst-celle", +"Row group": "Radgruppe", +"Column group": "Kolonnegruppe", +"Row type": "Rad-type", +"Header": "Topptekst", +"Body": "Br\u00f8dtekst", +"Footer": "Bunntekst", +"Border color": "Rammefarge", +"Insert template": "Sett inn mal", +"Templates": "Maler", +"Template": "Mal", +"Text color": "Tekstfarge", +"Background color": "Bakgrunnsfarge", +"Custom...": "Tilpass...", +"Custom color": "Tilpasset farge", +"No color": "Ingen farge", +"Table of Contents": "Innholdsfortegnelse", +"Show blocks": "Vis blokker", +"Show invisible characters": "Vis skjulte tegn", +"Words: {0}": "Antall ord: {0}", +"{0} words": "{0} ord", +"File": "Arkiv", +"Edit": "Rediger", +"Insert": "Sett inn", +"View": "Vis", +"Format": "Format", +"Table": "Tabell", +"Tools": "Verkt\u00f8y", +"Powered by {0}": "Redigert med {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Tekstredigering. Tast ALT-F9 for meny. Tast ALT-F10 for verkt\u00f8ys-rader. Tast ALT-0 for hjelp." +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/nl.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/nl.js new file mode 100644 index 0000000000..c80590b297 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/nl.js @@ -0,0 +1,261 @@ +tinymce.addI18n('nl',{ +"Redo": "Opnieuw", +"Undo": "Ongedaan maken", +"Cut": "Knippen", +"Copy": "Kopi\u00ebren", +"Paste": "Plakken", +"Select all": "Alles selecteren", +"New document": "Nieuw document", +"Ok": "Ok\u00e9", +"Cancel": "Annuleren", +"Visual aids": "Hulpmiddelen", +"Bold": "Vet", +"Italic": "Cursief", +"Underline": "Onderstreept", +"Strikethrough": "Doorhalen", +"Superscript": "Superscript", +"Subscript": "Subscript", +"Clear formatting": "Opmaak verwijderen", +"Align left": "Links uitlijnen", +"Align center": "Centreren", +"Align right": "Rechts uitlijnen", +"Justify": "Uitlijnen", +"Bullet list": "Opsommingsteken", +"Numbered list": "Nummering", +"Decrease indent": "Inspringen verkleinen", +"Increase indent": "Inspringen vergroten", +"Close": "Sluiten", +"Formats": "Opmaak", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Uw browser ondersteunt geen toegang tot het clipboard. Gelieve ctrl+X\/C\/V sneltoetsen te gebruiken.", +"Headers": "Kopteksten", +"Header 1": "Kop 1", +"Header 2": "Kop 2", +"Header 3": "Kop 3", +"Header 4": "Kop 4", +"Header 5": "Kop 5", +"Header 6": "Kop 6", +"Headings": "Koppen", +"Heading 1": "Kop 1", +"Heading 2": "Kop 2", +"Heading 3": "Kop 3", +"Heading 4": "Kop 4", +"Heading 5": "Kop 5", +"Heading 6": "Kop 6", +"Preformatted": "Voor-opgemaakt", +"Div": "Div", +"Pre": "Pre", +"Code": "Code", +"Paragraph": "Paragraaf", +"Blockquote": "Quote", +"Inline": "Inlijn", +"Blocks": "Blok", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Plakken gebeurt nu als platte tekst. Tekst wordt nu ingevoegd zonder opmaak tot deze optie uitgeschakeld wordt.", +"Font Family": "Lettertype", +"Font Sizes": "Tekengrootte", +"Class": "Class", +"Browse for an image": "Zoek naar een afbeelding", +"OR": "OF", +"Drop an image here": "Plaats hier een afbeelding", +"Upload": "Uploaden", +"Block": "Blok", +"Align": "Uitlijnen", +"Default": "Standaard", +"Circle": "Cirkel", +"Disc": "Bolletje", +"Square": "Vierkant", +"Lower Alpha": "Kleine letters", +"Lower Greek": "Griekse letters", +"Lower Roman": "Romeinse cijfers klein", +"Upper Alpha": "Hoofdletters", +"Upper Roman": "Romeinse cijfers groot", +"Anchor": "Anker", +"Name": "Naam", +"Id": "ID", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "ID moet beginnen met een letter, gevolgd door letters, nummers, streepjes, punten, dubbele punten of underscores.", +"You have unsaved changes are you sure you want to navigate away?": "U hebt niet alles opgeslagen bent u zeker dat u de pagina wenst te verlaten?", +"Restore last draft": "Herstel het laatste concept", +"Special character": "Speciale karakters", +"Source code": "Broncode", +"Insert\/Edit code sample": "Broncode invoegen\/bewerken", +"Language": "Programmeertaal", +"Code sample": "Broncode voorbeeld", +"Color": "Kleur", +"R": "Rood", +"G": "Groen", +"B": "Blauw", +"Left to right": "Links naar rechts", +"Right to left": "Rechts naar links", +"Emoticons": "Emoticons", +"Document properties": "Document eigenschappen", +"Title": "Titel", +"Keywords": "Sleutelwoorden", +"Description": "Omschrijving", +"Robots": "Robots", +"Author": "Auteur", +"Encoding": "Codering", +"Fullscreen": "Volledig scherm", +"Action": "Actie", +"Shortcut": "Snelkoppeling", +"Help": "Help", +"Address": "Adres", +"Focus to menubar": "Menubalk selecteren", +"Focus to toolbar": "Werkbalk selecteren", +"Focus to element path": "Element pad selecteren", +"Focus to contextual toolbar": "Contextuele werkbalk selecteren", +"Insert link (if link plugin activated)": "Link invoegen (als link plug-in geactiveerd is)", +"Save (if save plugin activated)": "Opslaan (als opslaan plug-in ingeschakeld is)", +"Find (if searchreplace plugin activated)": "Zoeken (als zoeken\/vervangen plug-in ingeschakeld is)", +"Plugins installed ({0}):": "Plug-ins ge\u00efnstalleerd ({0}):", +"Premium plugins:": "Premium plug-ins:", +"Learn more...": "Leer meer...", +"You are using {0}": "Je gebruikt {0}", +"Plugins": "Plug-ins", +"Handy Shortcuts": "Handige snelkoppelingen", +"Horizontal line": "Horizontale lijn", +"Insert\/edit image": "Afbeelding invoegen\/bewerken", +"Image description": "Afbeelding omschrijving", +"Source": "Bron", +"Dimensions": "Afmetingen", +"Constrain proportions": "Verhoudingen behouden", +"General": "Algemeen", +"Advanced": "Geavanceerd", +"Style": "Stijl", +"Vertical space": "Verticale ruimte", +"Horizontal space": "Horizontale ruimte", +"Border": "Rand", +"Insert image": "Afbeelding invoegen", +"Image": "Afbeelding", +"Image list": "Afbeeldingenlijst", +"Rotate counterclockwise": "Linksom draaien", +"Rotate clockwise": "Rechtsom draaien", +"Flip vertically": "Verticaal spiegelen", +"Flip horizontally": "Horizontaal spiegelen", +"Edit image": "Bewerk afbeelding", +"Image options": "Afbeelding opties", +"Zoom in": "Inzoomen", +"Zoom out": "Uitzoomen", +"Crop": "Uitsnijden", +"Resize": "Formaat aanpassen", +"Orientation": "Orientatie", +"Brightness": "Helderheid", +"Sharpen": "Scherpte", +"Contrast": "Contrast", +"Color levels": "Kleurniveau's", +"Gamma": "Gamma", +"Invert": "Omkeren", +"Apply": "Toepassen", +"Back": "Terug", +"Insert date\/time": "Voeg datum\/tijd in", +"Date\/time": "Datum\/tijd", +"Insert link": "Hyperlink invoegen", +"Insert\/edit link": "Hyperlink invoegen\/bewerken", +"Text to display": "Linktekst", +"Url": "Url", +"Target": "Doel", +"None": "Geen", +"New window": "Nieuw venster", +"Remove link": "Link verwijderen", +"Anchors": "Anker", +"Link": "Link", +"Paste or type a link": "Plak of typ een link", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "De ingegeven URL lijkt op een e-mailadres. Wil je er \"mailto:\" aan toevoegen?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "De ingegeven URL verwijst naar een extern adres. Wil je er \"http:\/\/\" aan toevoegen?", +"Link list": "Linklijst", +"Insert video": "Video invoegen", +"Insert\/edit video": "Video invoegen\/bewerken", +"Insert\/edit media": "Media invoegen\/bewerken", +"Alternative source": "Alternatieve bron", +"Poster": "Poster", +"Paste your embed code below:": "Plak u in te sluiten code hieronder:", +"Embed": "Insluiten", +"Media": "Media", +"Nonbreaking space": "Vaste spatie invoegen", +"Page break": "Pagina einde", +"Paste as text": "Plakken als tekst", +"Preview": "Voorbeeld", +"Print": "Print", +"Save": "Opslaan", +"Find": "Zoeken", +"Replace with": "Vervangen door", +"Replace": "Vervangen", +"Replace all": "Alles vervangen", +"Prev": "Vorige", +"Next": "Volgende", +"Find and replace": "Zoek en vervang", +"Could not find the specified string.": "Geen resultaten gevonden", +"Match case": "Identieke hoofd\/kleine letters", +"Whole words": "Alleen hele woorden", +"Spellcheck": "Spellingscontrole", +"Ignore": "Negeren", +"Ignore all": "Alles negeren", +"Finish": "Einde", +"Add to Dictionary": "Toevoegen aan woordenlijst", +"Insert table": "Tabel invoegen", +"Table properties": "Tabel eigenschappen", +"Delete table": "Verwijder tabel", +"Cell": "Cel", +"Row": "Rij", +"Column": "Kolom", +"Cell properties": "Cel eigenschappen", +"Merge cells": "Cellen samenvoegen", +"Split cell": "Cel splitsen", +"Insert row before": "Voeg rij boven toe", +"Insert row after": "Voeg rij onder toe", +"Delete row": "Verwijder rij", +"Row properties": "Rij eigenschappen", +"Cut row": "Knip rij", +"Copy row": "Kopieer rij", +"Paste row before": "Plak rij boven", +"Paste row after": "Plak rij onder", +"Insert column before": "Voeg kolom in voor", +"Insert column after": "Voeg kolom in na", +"Delete column": "Verwijder kolom", +"Cols": "Kolommen", +"Rows": "Rijen", +"Width": "Breedte", +"Height": "Hoogte", +"Cell spacing": "Celruimte", +"Cell padding": "Ruimte binnen cel", +"Caption": "Onderschrift", +"Left": "Links", +"Center": "Midden", +"Right": "Rechts", +"Cell type": "Celtype", +"Scope": "Bereik", +"Alignment": "Uitlijning", +"H Align": "Links uitlijnen", +"V Align": "Boven uitlijnen", +"Top": "Bovenaan", +"Middle": "Centreren", +"Bottom": "Onderaan", +"Header cell": "Kopcel", +"Row group": "Rijgroep", +"Column group": "Kolomgroep", +"Row type": "Rijtype", +"Header": "Koptekst", +"Body": "Body", +"Footer": "Voettekst", +"Border color": "Randkleur", +"Insert template": "Sjabloon invoegen", +"Templates": "Sjablonen", +"Template": "Sjabloon", +"Text color": "Tekstkleur", +"Background color": "Achtergrondkleur", +"Custom...": "Eigen...", +"Custom color": "Eigen kleur", +"No color": "Geen kleur", +"Table of Contents": "Inhoudsopgave", +"Show blocks": "Blokken tonen", +"Show invisible characters": "Onzichtbare karakters tonen", +"Words: {0}": "Woorden: {0}", +"{0} words": "{0} woorden", +"File": "Bestand", +"Edit": "Bewerken", +"Insert": "Invoegen", +"View": "Beeld", +"Format": "Opmaak", +"Table": "Tabel", +"Tools": "Gereedschap", +"Powered by {0}": "Gemaakt door {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Druk ALT-F9 voor het menu. Druk ALT-F10 voor de toolbar. Druk ALT-0 voor help." +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/pt.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/pt.js new file mode 100644 index 0000000000..0376e82429 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/pt.js @@ -0,0 +1,261 @@ +tinymce.addI18n('pt_PT',{ +"Redo": "Refazer", +"Undo": "Desfazer", +"Cut": "Cortar", +"Copy": "Copiar", +"Paste": "Colar", +"Select all": "Selecionar tudo", +"New document": "Novo documento", +"Ok": "Ok", +"Cancel": "Cancelar", +"Visual aids": "Ajuda visual", +"Bold": "Negrito", +"Italic": "It\u00e1lico", +"Underline": "Sublinhado", +"Strikethrough": "Rasurado", +"Superscript": "Superior \u00e0 linha", +"Subscript": "Inferior \u00e0 linha", +"Clear formatting": "Limpar formata\u00e7\u00e3o", +"Align left": "Alinhar \u00e0 esquerda", +"Align center": "Alinhar ao centro", +"Align right": "Alinhar \u00e0 direita", +"Justify": "Justificado", +"Bullet list": "Lista com marcadores", +"Numbered list": "Lista numerada", +"Decrease indent": "Diminuir avan\u00e7o", +"Increase indent": "Aumentar avan\u00e7o", +"Close": "Fechar", +"Formats": "Formatos", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "O seu navegador n\u00e3o suporta acesso direto \u00e0 \u00e1rea de transfer\u00eancia. Por favor use os atalhos Ctrl+X\/C\/V do seu teclado.", +"Headers": "Cabe\u00e7alhos", +"Header 1": "Cabe\u00e7alho 1", +"Header 2": "Cabe\u00e7alho 2", +"Header 3": "Cabe\u00e7alho 3", +"Header 4": "Cabe\u00e7alho 4", +"Header 5": "Cabe\u00e7alho 5", +"Header 6": "Cabe\u00e7alho 6", +"Headings": "T\u00edtulos", +"Heading 1": "T\u00edtulo 1", +"Heading 2": "T\u00edtulo 2", +"Heading 3": "T\u00edtulo 3", +"Heading 4": "T\u00edtulo 4", +"Heading 5": "T\u00edtulo 5", +"Heading 6": "T\u00edtulo 6", +"Preformatted": "Pr\u00e9-formatado", +"Div": "Div", +"Pre": "Pre", +"Code": "C\u00f3digo", +"Paragraph": "Par\u00e1grafo", +"Blockquote": "Cita\u00e7\u00e3o em bloco", +"Inline": "Na linha", +"Blocks": "Blocos", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "O comando colar est\u00e1 em modo de texto simples. O conte\u00fado ser\u00e1 colado como texto simples at\u00e9 desativar esta op\u00e7\u00e3o.", +"Font Family": "Fonte", +"Font Sizes": "Tamanhos", +"Class": "Classe", +"Browse for an image": "Procurar por uma imagem", +"OR": "Ou", +"Drop an image here": "Solte uma imagem aqui", +"Upload": "Carregar", +"Block": "Bloco", +"Align": "Alinhar", +"Default": "Padr\u00e3o", +"Circle": "C\u00edrculo", +"Disc": "Disco", +"Square": "Quadrado", +"Lower Alpha": "a. b. c. ...", +"Lower Greek": "\\u03b1. \\u03b2. \\u03b3. ...", +"Lower Roman": "i. ii. iii. ...", +"Upper Alpha": "A. B. C. ...", +"Upper Roman": "I. II. III. ...", +"Anchor": "\u00c2ncora", +"Name": "Nome", +"Id": "ID", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "O ID deve come\u00e7ar com uma letra, seguido apenas por letras, n\u00fameros, pontos, dois pontos, tra\u00e7os ou sobtra\u00e7os.", +"You have unsaved changes are you sure you want to navigate away?": "Existem altera\u00e7\u00f5es que ainda n\u00e3o foram guardadas. Tem a certeza que pretende sair?", +"Restore last draft": "Restaurar o \u00faltimo rascunho", +"Special character": "Car\u00e1cter especial", +"Source code": "C\u00f3digo fonte", +"Insert\/Edit code sample": "Inserir\/editar amostra de c\u00f3digo", +"Language": "Idioma", +"Code sample": "Amostra de c\u00f3digo", +"Color": "Cor", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "Da esquerda para a direita", +"Right to left": "Da direita para a esquerda", +"Emoticons": "Emo\u00e7\u00f5es", +"Document properties": "Propriedades do documento", +"Title": "T\u00edtulo", +"Keywords": "Palavras-chave", +"Description": "Descri\u00e7\u00e3o", +"Robots": "Rob\u00f4s", +"Author": "Autor", +"Encoding": "Codifica\u00e7\u00e3o", +"Fullscreen": "Ecr\u00e3 completo", +"Action": "A\u00e7\u00e3o", +"Shortcut": "Atalho", +"Help": "Ajuda", +"Address": "Endere\u00e7o", +"Focus to menubar": "Foco na barra de menu", +"Focus to toolbar": "Foco na barra de ferramentas", +"Focus to element path": "Foco no caminho do elemento", +"Focus to contextual toolbar": "Foco na barra de contexto", +"Insert link (if link plugin activated)": "Inserir hiperliga\u00e7\u00e3o (se o plugin de liga\u00e7\u00f5es estiver ativado)", +"Save (if save plugin activated)": "Guardar (se o plugin de guardar estiver ativado)", +"Find (if searchreplace plugin activated)": "Pesquisar (se o plugin pesquisar e substituir estiver ativado)", +"Plugins installed ({0}):": "Plugins instalados ({0}):", +"Premium plugins:": "Plugins comerciais:", +"Learn more...": "Saiba mais...", +"You are using {0}": "Est\u00e1 a usar {0}", +"Plugins": "Plugins", +"Handy Shortcuts": "Atalhos \u00fateis", +"Horizontal line": "Linha horizontal", +"Insert\/edit image": "Inserir\/editar imagem", +"Image description": "Descri\u00e7\u00e3o da imagem", +"Source": "Localiza\u00e7\u00e3o", +"Dimensions": "Dimens\u00f5es", +"Constrain proportions": "Manter propor\u00e7\u00f5es", +"General": "Geral", +"Advanced": "Avan\u00e7ado", +"Style": "Estilo", +"Vertical space": "Espa\u00e7amento vertical", +"Horizontal space": "Espa\u00e7amento horizontal", +"Border": "Contorno", +"Insert image": "Inserir imagem", +"Image": "Imagem", +"Image list": "Lista de imagens", +"Rotate counterclockwise": "Rota\u00e7\u00e3o anti-hor\u00e1ria", +"Rotate clockwise": "Rota\u00e7\u00e3o hor\u00e1ria", +"Flip vertically": "Inverter verticalmente", +"Flip horizontally": "Inverter horizontalmente", +"Edit image": "Editar imagem", +"Image options": "Op\u00e7\u00f5es de imagem", +"Zoom in": "Mais zoom", +"Zoom out": "Menos zoom", +"Crop": "Recortar", +"Resize": "Redimensionar", +"Orientation": "Orienta\u00e7\u00e3o", +"Brightness": "Brilho", +"Sharpen": "Mais nitidez", +"Contrast": "Contraste", +"Color levels": "N\u00edveis de cor", +"Gamma": "Gama", +"Invert": "Inverter", +"Apply": "Aplicar", +"Back": "Voltar", +"Insert date\/time": "Inserir data\/hora", +"Date\/time": "Data\/hora", +"Insert link": "Inserir liga\u00e7\u00e3o", +"Insert\/edit link": "Inserir\/editar liga\u00e7\u00e3o", +"Text to display": "Texto a exibir", +"Url": "URL", +"Target": "Alvo", +"None": "Nenhum", +"New window": "Nova janela", +"Remove link": "Remover liga\u00e7\u00e3o", +"Anchors": "\u00c2ncora", +"Link": "Liga\u00e7\u00e3o", +"Paste or type a link": "Copiar ou escrever uma hiperliga\u00e7\u00e3o", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "O URL que indicou parece ser um endere\u00e7o de email. Quer adicionar o prefixo mailto: tal como necess\u00e1rio?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "O URL que indicou parece ser um endere\u00e7o web. Quer adicionar o prefixo http:\/\/ tal como necess\u00e1rio?", +"Link list": "Lista de liga\u00e7\u00f5es", +"Insert video": "Inserir v\u00eddeo", +"Insert\/edit video": "Inserir\/editar v\u00eddeo", +"Insert\/edit media": "Inserir\/editar media", +"Alternative source": "Localiza\u00e7\u00e3o alternativa", +"Poster": "Autor", +"Paste your embed code below:": "Colar c\u00f3digo para embeber:", +"Embed": "Embeber", +"Media": "Media", +"Nonbreaking space": "Espa\u00e7o n\u00e3o quebr\u00e1vel", +"Page break": "Quebra de p\u00e1gina", +"Paste as text": "Colar como texto", +"Preview": "Pr\u00e9-visualizar", +"Print": "Imprimir", +"Save": "Guardar", +"Find": "Pesquisar", +"Replace with": "Substituir por", +"Replace": "Substituir", +"Replace all": "Substituir tudo", +"Prev": "Anterior", +"Next": "Pr\u00f3ximo", +"Find and replace": "Pesquisar e substituir", +"Could not find the specified string.": "N\u00e3o foi poss\u00edvel localizar o termo especificado.", +"Match case": "Diferenciar mai\u00fasculas e min\u00fasculas", +"Whole words": "Palavras completas", +"Spellcheck": "Corretor ortogr\u00e1fico", +"Ignore": "Ignorar", +"Ignore all": "Ignorar tudo", +"Finish": "Concluir", +"Add to Dictionary": "Adicionar ao dicion\u00e1rio", +"Insert table": "Inserir tabela", +"Table properties": "Propriedades da tabela", +"Delete table": "Eliminar tabela", +"Cell": "C\u00e9lula", +"Row": "Linha", +"Column": "Coluna", +"Cell properties": "Propriedades da c\u00e9lula", +"Merge cells": "Unir c\u00e9lulas", +"Split cell": "Dividir c\u00e9lula", +"Insert row before": "Inserir linha antes", +"Insert row after": "Inserir linha depois", +"Delete row": "Eliminar linha", +"Row properties": "Propriedades da linha", +"Cut row": "Cortar linha", +"Copy row": "Copiar linha", +"Paste row before": "Colar linha antes", +"Paste row after": "Colar linha depois", +"Insert column before": "Inserir coluna antes", +"Insert column after": "Inserir coluna depois", +"Delete column": "Eliminar coluna", +"Cols": "Colunas", +"Rows": "Linhas", +"Width": "Largura", +"Height": "Altura", +"Cell spacing": "Espa\u00e7amento entre c\u00e9lulas", +"Cell padding": "Espa\u00e7amento interno da c\u00e9lula", +"Caption": "Legenda", +"Left": "Esquerda", +"Center": "Centro", +"Right": "Direita", +"Cell type": "Tipo de c\u00e9lula", +"Scope": "Escopo", +"Alignment": "Alinhamento", +"H Align": "Alinhamento H", +"V Align": "Alinhamento V", +"Top": "Superior", +"Middle": "Meio", +"Bottom": "Inferior", +"Header cell": "C\u00e9lula de cabe\u00e7alho", +"Row group": "Agrupar linha", +"Column group": "Agrupar coluna", +"Row type": "Tipo de linha", +"Header": "Cabe\u00e7alho", +"Body": "Corpo", +"Footer": "Rodap\u00e9", +"Border color": "Cor de contorno", +"Insert template": "Inserir modelo", +"Templates": "Modelos", +"Template": "Tema", +"Text color": "Cor do texto", +"Background color": "Cor de fundo", +"Custom...": "Personalizada...", +"Custom color": "Cor personalizada", +"No color": "Sem cor", +"Table of Contents": "\u00cdndice", +"Show blocks": "Mostrar blocos", +"Show invisible characters": "Mostrar caracteres invis\u00edveis", +"Words: {0}": "Palavras: {0}", +"{0} words": "{0} palavras", +"File": "Ficheiro", +"Edit": "Editar", +"Insert": "Inserir", +"View": "Ver", +"Format": "Formatar", +"Table": "Tabela", +"Tools": "Ferramentas", +"Powered by {0}": "Criado em {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Caixa de texto formatado. Pressione ALT-F9 para exibir o menu. Pressione ALT-F10 para exibir a barra de ferramentas. Pressione ALT-0 para exibir a ajuda" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/pt_BR.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/pt_BR.js new file mode 100644 index 0000000000..497043a9d4 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/pt_BR.js @@ -0,0 +1,261 @@ +tinymce.addI18n('pt_BR',{ +"Redo": "Refazer", +"Undo": "Desfazer", +"Cut": "Recortar", +"Copy": "Copiar", +"Paste": "Colar", +"Select all": "Selecionar tudo", +"New document": "Novo documento", +"Ok": "Ok", +"Cancel": "Cancelar", +"Visual aids": "Ajuda visual", +"Bold": "Negrito", +"Italic": "It\u00e1lico", +"Underline": "Sublinhar", +"Strikethrough": "Riscar", +"Superscript": "Sobrescrito", +"Subscript": "Subscrever", +"Clear formatting": "Limpar formata\u00e7\u00e3o", +"Align left": "Alinhar \u00e0 esquerda", +"Align center": "Centralizar", +"Align right": "Alinhar \u00e0 direita", +"Justify": "Justificar", +"Bullet list": "Lista n\u00e3o ordenada", +"Numbered list": "Lista ordenada", +"Decrease indent": "Diminuir recuo", +"Increase indent": "Aumentar recuo", +"Close": "Fechar", +"Formats": "Formatos", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Seu navegador n\u00e3o suporta acesso direto \u00e0 \u00e1rea de transfer\u00eancia. Por favor use os atalhos Ctrl+X - C - V do teclado", +"Headers": "Cabe\u00e7alhos", +"Header 1": "Cabe\u00e7alho 1", +"Header 2": "Cabe\u00e7alho 2", +"Header 3": "Cabe\u00e7alho 3", +"Header 4": "Cabe\u00e7alho 4", +"Header 5": "Cabe\u00e7alho 5", +"Header 6": "Cabe\u00e7alho 6", +"Headings": "Cabe\u00e7alhos", +"Heading 1": "Cabe\u00e7alho 1", +"Heading 2": "Cabe\u00e7alho 2", +"Heading 3": "Cabe\u00e7alho 3", +"Heading 4": "Cabe\u00e7alho 4", +"Heading 5": "Cabe\u00e7alho 5", +"Heading 6": "Cabe\u00e7alho 6", +"Preformatted": "Preformatado", +"Div": "Div", +"Pre": "Pre", +"Code": "C\u00f3digo", +"Paragraph": "Par\u00e1grafo", +"Blockquote": "Aspas", +"Inline": "Em linha", +"Blocks": "Blocos", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "O comando colar est\u00e1 agora em modo texto plano. O conte\u00fado ser\u00e1 colado como texto plano at\u00e9 voc\u00ea desligar esta op\u00e7\u00e3o.", +"Font Family": "Fonte", +"Font Sizes": "Tamanho", +"Class": "Classe", +"Browse for an image": "Procure uma imagem", +"OR": "OU", +"Drop an image here": "Arraste uma imagem aqui", +"Upload": "Carregar", +"Block": "Bloco", +"Align": "Alinhamento", +"Default": "Padr\u00e3o", +"Circle": "C\u00edrculo", +"Disc": "Disco", +"Square": "Quadrado", +"Lower Alpha": "a. b. c. ...", +"Lower Greek": "\u03b1. \u03b2. \u03b3. ...", +"Lower Roman": "i. ii. iii. ...", +"Upper Alpha": "A. B. C. ...", +"Upper Roman": "I. II. III. ...", +"Anchor": "\u00c2ncora", +"Name": "Nome", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id deve come\u00e7ar com uma letra, seguido apenas por letras, n\u00fameros, tra\u00e7os, pontos, dois pontos ou sublinhados.", +"You have unsaved changes are you sure you want to navigate away?": "Voc\u00ea tem mudan\u00e7as n\u00e3o salvas. Voc\u00ea tem certeza que deseja sair?", +"Restore last draft": "Restaurar \u00faltimo rascunho", +"Special character": "Caracteres especiais", +"Source code": "C\u00f3digo fonte", +"Insert\/Edit code sample": "Inserir\/Editar c\u00f3digo de exemplo", +"Language": "Idioma", +"Code sample": "Exemplo de c\u00f3digo", +"Color": "Cor", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "Da esquerda para a direita", +"Right to left": "Da direita para a esquerda", +"Emoticons": "Emoticons", +"Document properties": "Propriedades do documento", +"Title": "T\u00edtulo", +"Keywords": "Palavras-chave", +"Description": "Descri\u00e7\u00e3o", +"Robots": "Rob\u00f4s", +"Author": "Autor", +"Encoding": "Codifica\u00e7\u00e3o", +"Fullscreen": "Tela cheia", +"Action": "A\u00e7\u00e3o", +"Shortcut": "Atalho", +"Help": "Ajuda", +"Address": "Endere\u00e7o", +"Focus to menubar": "Foco no menu", +"Focus to toolbar": "Foco na barra de ferramentas", +"Focus to element path": "Foco no caminho do elemento", +"Focus to contextual toolbar": "Foco na barra de ferramentas contextual", +"Insert link (if link plugin activated)": "Inserir link (se o plugin de link estiver ativado)", +"Save (if save plugin activated)": "Salvar (se o plugin de salvar estiver ativado)", +"Find (if searchreplace plugin activated)": "Procurar (se o plugin de procurar e substituir estiver ativado)", +"Plugins installed ({0}):": "Plugins instalados ({0}):", +"Premium plugins:": "Plugins premium:", +"Learn more...": "Saiba mais...", +"You are using {0}": "Voc\u00ea est\u00e1 usando {0}", +"Plugins": "Plugins", +"Handy Shortcuts": "Atalhos \u00fateis", +"Horizontal line": "Linha horizontal", +"Insert\/edit image": "Inserir\/editar imagem", +"Image description": "Inserir descri\u00e7\u00e3o", +"Source": "Endere\u00e7o da imagem", +"Dimensions": "Dimens\u00f5es", +"Constrain proportions": "Manter propor\u00e7\u00f5es", +"General": "Geral", +"Advanced": "Avan\u00e7ado", +"Style": "Estilo", +"Vertical space": "Espa\u00e7amento vertical", +"Horizontal space": "Espa\u00e7amento horizontal", +"Border": "Borda", +"Insert image": "Inserir imagem", +"Image": "Imagem", +"Image list": "Lista de Imagens", +"Rotate counterclockwise": "Girar em sentido hor\u00e1rio", +"Rotate clockwise": "Girar em sentido anti-hor\u00e1rio", +"Flip vertically": "Virar verticalmente", +"Flip horizontally": "Virar horizontalmente", +"Edit image": "Editar imagem", +"Image options": "Op\u00e7\u00f5es de Imagem", +"Zoom in": "Aumentar zoom", +"Zoom out": "Diminuir zoom", +"Crop": "Cortar", +"Resize": "Redimensionar", +"Orientation": "Orienta\u00e7\u00e3o", +"Brightness": "Brilho", +"Sharpen": "Aumentar nitidez", +"Contrast": "Contraste", +"Color levels": "N\u00edveis de cor", +"Gamma": "Gama", +"Invert": "Inverter", +"Apply": "Aplicar", +"Back": "Voltar", +"Insert date\/time": "Inserir data\/hora", +"Date\/time": "data\/hora", +"Insert link": "Inserir link", +"Insert\/edit link": "Inserir\/editar link", +"Text to display": "Texto para mostrar", +"Url": "Url", +"Target": "Alvo", +"None": "Nenhum", +"New window": "Nova janela", +"Remove link": "Remover link", +"Anchors": "\u00c2ncoras", +"Link": "Link", +"Paste or type a link": "Cole ou digite um Link", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "A URL que voc\u00ea informou parece ser um link externo. Deseja incluir o prefixo http:\/\/?", +"Link list": "Lista de Links", +"Insert video": "Inserir v\u00eddeo", +"Insert\/edit video": "Inserir\/editar v\u00eddeo", +"Insert\/edit media": "Inserir\/editar imagem", +"Alternative source": "Fonte alternativa", +"Poster": "Autor", +"Paste your embed code below:": "Insira o c\u00f3digo de incorpora\u00e7\u00e3o abaixo:", +"Embed": "Incorporar", +"Media": "imagem", +"Nonbreaking space": "Espa\u00e7o n\u00e3o separ\u00e1vel", +"Page break": "Quebra de p\u00e1gina", +"Paste as text": "Colar como texto", +"Preview": "Pr\u00e9-visualizar", +"Print": "Imprimir", +"Save": "Salvar", +"Find": "Localizar", +"Replace with": "Substituir por", +"Replace": "Substituir", +"Replace all": "Substituir tudo", +"Prev": "Anterior", +"Next": "Pr\u00f3ximo", +"Find and replace": "Localizar e substituir", +"Could not find the specified string.": "N\u00e3o foi poss\u00edvel encontrar o termo especificado", +"Match case": "Diferenciar mai\u00fasculas e min\u00fasculas", +"Whole words": "Palavras inteiras", +"Spellcheck": "Corretor ortogr\u00e1fico", +"Ignore": "Ignorar", +"Ignore all": "Ignorar tudo", +"Finish": "Finalizar", +"Add to Dictionary": "Adicionar ao Dicion\u00e1rio", +"Insert table": "Inserir tabela", +"Table properties": "Propriedades da tabela", +"Delete table": "Excluir tabela", +"Cell": "C\u00e9lula", +"Row": "Linha", +"Column": "Coluna", +"Cell properties": "Propriedades da c\u00e9lula", +"Merge cells": "Agrupar c\u00e9lulas", +"Split cell": "Dividir c\u00e9lula", +"Insert row before": "Inserir linha antes", +"Insert row after": "Inserir linha depois", +"Delete row": "Excluir linha", +"Row properties": "Propriedades da linha", +"Cut row": "Recortar linha", +"Copy row": "Copiar linha", +"Paste row before": "Colar linha antes", +"Paste row after": "Colar linha depois", +"Insert column before": "Inserir coluna antes", +"Insert column after": "Inserir coluna depois", +"Delete column": "Excluir coluna", +"Cols": "Colunas", +"Rows": "Linhas", +"Width": "Largura", +"Height": "Altura", +"Cell spacing": "Espa\u00e7amento da c\u00e9lula", +"Cell padding": "Espa\u00e7amento interno da c\u00e9lula", +"Caption": "Legenda", +"Left": "Esquerdo", +"Center": "Centro", +"Right": "Direita", +"Cell type": "Tipo de c\u00e9lula", +"Scope": "Escopo", +"Alignment": "Alinhamento", +"H Align": "Alinhamento H", +"V Align": "Alinhamento V", +"Top": "Superior", +"Middle": "Meio", +"Bottom": "Inferior", +"Header cell": "C\u00e9lula cabe\u00e7alho", +"Row group": "Agrupar linha", +"Column group": "Agrupar coluna", +"Row type": "Tipo de linha", +"Header": "Cabe\u00e7alho", +"Body": "Corpo", +"Footer": "Rodap\u00e9", +"Border color": "Cor da borda", +"Insert template": "Inserir modelo", +"Templates": "Modelos", +"Template": "Modelo", +"Text color": "Cor do texto", +"Background color": "Cor do fundo", +"Custom...": "Personalizado...", +"Custom color": "Cor personalizada", +"No color": "Nenhuma cor", +"Table of Contents": "\u00edndice de Conte\u00fado", +"Show blocks": "Mostrar blocos", +"Show invisible characters": "Exibir caracteres invis\u00edveis", +"Words: {0}": "Palavras: {0}", +"{0} words": "{0} palavras", +"File": "Arquivo", +"Edit": "Editar", +"Insert": "Inserir", +"View": "Visualizar", +"Format": "Formatar", +"Table": "Tabela", +"Tools": "Ferramentas", +"Powered by {0}": "Distribu\u00eddo por {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u00c1rea de texto formatado. Pressione ALT-F9 para exibir o menu, ALT-F10 para exibir a barra de ferramentas ou ALT-0 para exibir a ajuda" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/readme.md b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/readme.md new file mode 100644 index 0000000000..a52bf03f9a --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/ru.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/ru.js new file mode 100644 index 0000000000..dfae77d955 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/ru.js @@ -0,0 +1,261 @@ +tinymce.addI18n('ru',{ +"Redo": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", +"Undo": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c", +"Cut": "\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c", +"Copy": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c", +"Paste": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c", +"Select all": "\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435", +"New document": "\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", +"Ok": "\u041e\u043a", +"Cancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", +"Visual aids": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0443\u0440\u044b", +"Bold": "\u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439", +"Italic": "\u041a\u0443\u0440\u0441\u0438\u0432", +"Underline": "\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439", +"Strikethrough": "\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439", +"Superscript": "\u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441", +"Subscript": "\u041d\u0438\u0436\u043d\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441", +"Clear formatting": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442", +"Align left": "\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Align center": "\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443", +"Align right": "\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Justify": "\u041f\u043e \u0448\u0438\u0440\u0438\u043d\u0435", +"Bullet list": "\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", +"Numbered list": "\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", +"Decrease indent": "\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f", +"Increase indent": "\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f", +"Close": "\u0417\u0430\u043a\u0440\u044b\u0442\u044c", +"Formats": "\u0424\u043e\u0440\u043c\u0430\u0442", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448: Ctrl+X\/C\/V.", +"Headers": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438", +"Header 1": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1", +"Header 2": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2", +"Header 3": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3", +"Header 4": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4", +"Header 5": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5", +"Header 6": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6", +"Headings": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438", +"Heading 1": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1", +"Heading 2": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2", +"Heading 3": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3", +"Heading 4": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4", +"Heading 5": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5", +"Heading 6": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6", +"Preformatted": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", +"Div": "\u0411\u043b\u043e\u043a", +"Pre": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", +"Code": "\u041a\u043e\u0434", +"Paragraph": "\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444", +"Blockquote": "\u0426\u0438\u0442\u0430\u0442\u0430", +"Inline": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435", +"Blocks": "\u0411\u043b\u043e\u043a\u0438", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u043e\u043f\u0446\u0438\u044e.", +"Font Family": "\u0428\u0440\u0438\u0444\u0442", +"Font Sizes": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", +"Class": "\u041a\u043b\u0430\u0441\u0441", +"Browse for an image": "\u0412\u044b\u0431\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", +"OR": "\u0418\u041b\u0418", +"Drop an image here": "\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u044e\u0434\u0430", +"Upload": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c", +"Block": "\u0411\u043b\u043e\u043a", +"Align": "\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"Default": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439", +"Circle": "\u041e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438", +"Disc": "\u041a\u0440\u0443\u0433\u0438", +"Square": "\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b", +"Lower Alpha": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b", +"Lower Greek": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b", +"Lower Roman": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b", +"Upper Alpha": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b", +"Upper Roman": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b", +"Anchor": "\u042f\u043a\u043e\u0440\u044c", +"Name": "\u0418\u043c\u044f", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0431\u0443\u043a\u0432\u044b, \u0446\u0438\u0444\u0440\u044b, \u0442\u0438\u0440\u0435, \u0442\u043e\u0447\u043a\u0438, \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f \u0438\u043b\u0438 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f.", +"You have unsaved changes are you sure you want to navigate away?": "\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0439\u0442\u0438?", +"Restore last draft": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430", +"Special character": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b", +"Source code": "\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434", +"Insert\/Edit code sample": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430", +"Language": "\u042f\u0437\u044b\u043a", +"Code sample": "\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430", +"Color": "\u0426\u0432\u0435\u0442", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e", +"Right to left": "\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e", +"Emoticons": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0430\u0439\u043b", +"Document properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", +"Title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", +"Keywords": "\u041a\u043b\u044e\u0447\u0438\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430", +"Description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", +"Robots": "\u0420\u043e\u0431\u043e\u0442\u044b", +"Author": "\u0410\u0432\u0442\u043e\u0440", +"Encoding": "\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430", +"Fullscreen": "\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c", +"Action": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435", +"Shortcut": "\u042f\u0440\u043b\u044b\u043a", +"Help": "\u041f\u043e\u043c\u043e\u0449\u044c", +"Address": "\u0410\u0434\u0440\u0435\u0441", +"Focus to menubar": "\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u0435\u043d\u044e", +"Focus to toolbar": "\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432", +"Focus to element path": "\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u043f\u0443\u0442\u0438", +"Focus to contextual toolbar": "\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432", +"Insert link (if link plugin activated)": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 (\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d link \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d)", +"Save (if save plugin activated)": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c (\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d save \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d)", +"Find (if searchreplace plugin activated)": "\u041d\u0430\u0439\u0442\u0438 (\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d searchreplace \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d)", +"Plugins installed ({0}):": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b ({0}):", +"Premium plugins:": "\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b:", +"Learn more...": "\u0423\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435...", +"You are using {0}": "\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 {0}", +"Plugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b", +"Handy Shortcuts": "\u0413\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438", +"Horizontal line": "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f", +"Insert\/edit image": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Image description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", +"Source": "\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a", +"Dimensions": "\u0420\u0430\u0437\u043c\u0435\u0440", +"Constrain proportions": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438", +"General": "\u041e\u0431\u0449\u0435\u0435", +"Advanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435", +"Style": "\u0421\u0442\u0438\u043b\u044c", +"Vertical space": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b", +"Horizontal space": "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b", +"Border": "\u0420\u0430\u043c\u043a\u0430", +"Insert image": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Image": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", +"Image list": "\u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439", +"Rotate counterclockwise": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438", +"Rotate clockwise": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435", +"Flip vertically": "\u041e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438", +"Flip horizontally": "\u041e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438", +"Edit image": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Image options": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", +"Zoom in": "\u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c", +"Zoom out": "\u041e\u0442\u0434\u0430\u043b\u0438\u0442\u044c", +"Crop": "\u041e\u0431\u0440\u0435\u0437\u0430\u0442\u044c", +"Resize": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440", +"Orientation": "\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f", +"Brightness": "\u042f\u0440\u043a\u043e\u0441\u0442\u044c", +"Sharpen": "\u0427\u0435\u0442\u043a\u043e\u0441\u0442\u044c", +"Contrast": "\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442", +"Color levels": "\u0426\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438", +"Gamma": "\u0413\u0430\u043c\u043c\u0430", +"Invert": "\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f", +"Apply": "\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c", +"Back": "\u041d\u0430\u0437\u0430\u0434", +"Insert date\/time": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443\/\u0432\u0440\u0435\u043c\u044f", +"Date\/time": "\u0414\u0430\u0442\u0430\/\u0432\u0440\u0435\u043c\u044f", +"Insert link": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"Insert\/edit link": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"Text to display": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442", +"Url": "\u0410\u0434\u0440\u0435\u0441 \u0441\u0441\u044b\u043b\u043a\u0438", +"Target": "\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"None": "\u041d\u0435\u0442", +"New window": "\u0412 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435", +"Remove link": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"Anchors": "\u042f\u043a\u043e\u0440\u044f", +"Link": "\u0421\u0441\u044b\u043b\u043a\u0430", +"Paste or type a link": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0412\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 URL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b. \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u00abmailto:\u00bb?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0412\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 URL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439. \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u00abhttp:\/\/\u00bb?", +"Link list": "\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a", +"Insert video": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e", +"Insert\/edit video": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e", +"Insert\/edit media": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e", +"Alternative source": "\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a", +"Poster": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Paste your embed code below:": "\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043d\u0438\u0436\u0435:", +"Embed": "\u041a\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438", +"Media": "\u0412\u0438\u0434\u0435\u043e", +"Nonbreaking space": "\u041d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0435\u043b", +"Page break": "\u0420\u0430\u0437\u0440\u044b\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b", +"Paste as text": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442", +"Preview": "\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440", +"Print": "\u041f\u0435\u0447\u0430\u0442\u044c", +"Save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", +"Find": "\u041d\u0430\u0439\u0442\u0438", +"Replace with": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430", +"Replace": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c", +"Replace all": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435", +"Prev": "\u0412\u0432\u0435\u0440\u0445", +"Next": "\u0412\u043d\u0438\u0437", +"Find and replace": "\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430", +"Could not find the specified string.": "\u0417\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430", +"Match case": "\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440", +"Whole words": "\u0421\u043b\u043e\u0432\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c", +"Spellcheck": "\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", +"Ignore": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c", +"Ignore all": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435", +"Finish": "\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c", +"Add to Dictionary": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c", +"Insert table": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443", +"Table properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b", +"Delete table": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443", +"Cell": "\u042f\u0447\u0435\u0439\u043a\u0430", +"Row": "\u0421\u0442\u0440\u043e\u043a\u0430", +"Column": "\u0421\u0442\u043e\u043b\u0431\u0435\u0446", +"Cell properties": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438", +"Merge cells": "\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438", +"Split cell": "\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443", +"Insert row before": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443", +"Insert row after": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443", +"Delete row": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443", +"Row properties": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438", +"Cut row": "\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443", +"Copy row": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443", +"Paste row before": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443", +"Paste row after": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443", +"Insert column before": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043b\u0435\u0432\u0430", +"Insert column after": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043f\u0440\u0430\u0432\u0430", +"Delete column": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446", +"Cols": "\u0421\u0442\u043e\u043b\u0431\u0446\u044b", +"Rows": "\u0421\u0442\u0440\u043e\u043a\u0438", +"Width": "\u0428\u0438\u0440\u0438\u043d\u0430", +"Height": "\u0412\u044b\u0441\u043e\u0442\u0430", +"Cell spacing": "\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f", +"Cell padding": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f", +"Caption": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", +"Left": "\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Center": "\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443", +"Right": "\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Cell type": "\u0422\u0438\u043f \u044f\u0447\u0435\u0439\u043a\u0438", +"Scope": "Scope", +"Alignment": "\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"H Align": "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"V Align": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"Top": "\u041f\u043e \u0432\u0435\u0440\u0445\u0443", +"Middle": "\u041f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435", +"Bottom": "\u041f\u043e \u043d\u0438\u0437\u0443", +"Header cell": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", +"Row group": "\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u0440\u043e\u043a", +"Column group": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a", +"Row type": "\u0422\u0438\u043f \u0441\u0442\u0440\u043e\u043a\u0438", +"Header": "\u0428\u0430\u043f\u043a\u0430", +"Body": "\u0422\u0435\u043b\u043e", +"Footer": "\u041d\u0438\u0437", +"Border color": "\u0426\u0432\u0435\u0442 \u0440\u0430\u043c\u043a\u0438", +"Insert template": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d", +"Templates": "\u0428\u0430\u0431\u043b\u043e\u043d\u044b", +"Template": "\u0428\u0430\u0431\u043b\u043e\u043d", +"Text color": "\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430", +"Background color": "\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430", +"Custom...": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c\u2026", +"Custom color": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0446\u0432\u0435\u0442", +"No color": "\u0411\u0435\u0437 \u0446\u0432\u0435\u0442\u0430", +"Table of Contents": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", +"Show blocks": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438", +"Show invisible characters": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b", +"Words: {0}": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432: {0}", +"{0} words": "\u0441\u043b\u043e\u0432: {0}", +"File": "\u0424\u0430\u0439\u043b", +"Edit": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c", +"Insert": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c", +"View": "\u0412\u0438\u0434", +"Format": "\u0424\u043e\u0440\u043c\u0430\u0442", +"Table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430", +"Tools": "\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b", +"Powered by {0}": "\u041f\u0440\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ALT-F9 \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044e, ALT-F10 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, ALT-0 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u043c\u043e\u0449\u0438." +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/zh.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/zh.js new file mode 100644 index 0000000000..cc5f157949 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/zh.js @@ -0,0 +1,261 @@ +tinymce.addI18n('zh_TW',{ +"Redo": "\u53d6\u6d88\u5fa9\u539f", +"Undo": "\u5fa9\u539f", +"Cut": "\u526a\u4e0b", +"Copy": "\u8907\u88fd", +"Paste": "\u8cbc\u4e0a", +"Select all": "\u5168\u9078", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u78ba\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u5c0f\u5e6b\u624b", +"Bold": "\u7c97\u9ad4", +"Italic": "\u659c\u9ad4", +"Underline": "\u5e95\u7dda", +"Strikethrough": "\u522a\u9664\u7dda", +"Superscript": "\u4e0a\u6a19", +"Subscript": "\u4e0b\u6a19", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u7f6e\u5de6\u5c0d\u9f4a", +"Align center": "\u7f6e\u4e2d\u5c0d\u9f4a", +"Align right": "\u7f6e\u53f3\u5c0d\u9f4a", +"Justify": "\u5de6\u53f3\u5c0d\u9f4a", +"Bullet list": "\u9805\u76ee\u6e05\u55ae", +"Numbered list": "\u6578\u5b57\u6e05\u55ae", +"Decrease indent": "\u6e1b\u5c11\u7e2e\u6392", +"Increase indent": "\u589e\u52a0\u7e2e\u6392", +"Close": "\u95dc\u9589", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u60a8\u7684\u700f\u89bd\u5668\u4e0d\u652f\u63f4\u5b58\u53d6\u526a\u8cbc\u7c3f\uff0c\u53ef\u4ee5\u4f7f\u7528\u5feb\u901f\u9375 Ctrl + X\/C\/V \u4ee3\u66ff\u526a\u4e0b\u3001\u8907\u88fd\u8207\u8cbc\u4e0a\u3002", +"Headers": "\u6a19\u984c", +"Header 1": "\u6a19\u984c 1", +"Header 2": "\u6a19\u984c 2", +"Header 3": "\u6a19\u984c 3", +"Header 4": "\u6a19\u984c 4", +"Header 5": "\u6a19\u984c 5", +"Header 6": "\u6a19\u984c 6", +"Headings": "\u6a19\u984c", +"Heading 1": "\u6a19\u984c 1", +"Heading 2": "\u6a19\u984c 2", +"Heading 3": "\u6a19\u984c 3", +"Heading 4": "\u6a19\u984c 4", +"Heading 5": "\u6a19\u984c 5", +"Heading 6": "\u6a19\u984c 6", +"Preformatted": "\u9810\u5148\u6392\u7248", +"Div": "Div", +"Pre": "Pre", +"Code": "\u7a0b\u5f0f\u78bc", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u7528", +"Inline": "Inline", +"Blocks": "\u5340\u584a", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u76ee\u524d\u5c07\u4ee5\u7d14\u6587\u5b57\u7684\u6a21\u5f0f\u8cbc\u4e0a\uff0c\u60a8\u53ef\u4ee5\u518d\u9ede\u9078\u4e00\u6b21\u53d6\u6d88\u3002", +"Font Family": "\u5b57\u9ad4", +"Font Sizes": "\u5b57\u578b\u5927\u5c0f", +"Class": "\u985e\u5225", +"Browse for an image": "\u5f9e\u5716\u7247\u4e2d\u700f\u89bd", +"OR": "\u6216", +"Drop an image here": "\u62d6\u66f3\u5716\u7247\u81f3\u6b64", +"Upload": "\u4e0a\u50b3", +"Block": "\u5340\u584a", +"Align": "\u5c0d\u9f4a", +"Default": "\u9810\u8a2d", +"Circle": "\u7a7a\u5fc3\u5713", +"Disc": "\u5be6\u5fc3\u5713", +"Square": "\u6b63\u65b9\u5f62", +"Lower Alpha": "\u5c0f\u5beb\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5e0c\u81d8\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5beb\u7f85\u99ac\u6578\u5b57", +"Upper Alpha": "\u5927\u5beb\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5beb\u7f85\u99ac\u6578\u5b57", +"Anchor": "\u52a0\u5165\u9328\u9ede", +"Name": "\u540d\u7a31", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id\u61c9\u4ee5\u5b57\u6bcd\u958b\u982d\uff0c\u5f8c\u9762\u63a5\u8457\u5b57\u6bcd\uff0c\u6578\u5b57\uff0c\u7834\u6298\u865f\uff0c\u9ede\u6578\uff0c\u5192\u865f\u6216\u4e0b\u5283\u7dda\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u7de8\u8f2f\u5c1a\u672a\u88ab\u5132\u5b58\uff0c\u4f60\u78ba\u5b9a\u8981\u96e2\u958b\uff1f", +"Restore last draft": "\u8f09\u5165\u4e0a\u4e00\u6b21\u7de8\u8f2f\u7684\u8349\u7a3f", +"Special character": "\u7279\u6b8a\u5b57\u5143", +"Source code": "\u539f\u59cb\u78bc", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7de8\u8f2f \u7a0b\u5f0f\u78bc\u7bc4\u4f8b", +"Language": "\u8a9e\u8a00", +"Code sample": "\u7a0b\u5f0f\u78bc\u7bc4\u4f8b", +"Color": "\u984f\u8272", +"R": "\u7d05", +"G": "\u7da0", +"B": "\u85cd", +"Left to right": "\u5f9e\u5de6\u5230\u53f3", +"Right to left": "\u5f9e\u53f3\u5230\u5de6", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u4ef6\u7684\u5c6c\u6027", +"Title": "\u6a19\u984c", +"Keywords": "\u95dc\u9375\u5b57", +"Description": "\u63cf\u8ff0", +"Robots": "\u6a5f\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7de8\u78bc", +"Fullscreen": "\u5168\u87a2\u5e55", +"Action": "\u52d5\u4f5c", +"Shortcut": "\u5feb\u901f\u9375", +"Help": "\u5e6b\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u8df3\u81f3\u9078\u55ae\u5217", +"Focus to toolbar": "\u8df3\u81f3\u5de5\u5177\u5217", +"Focus to element path": "\u8df3\u81f3HTML\u5143\u7d20\u5217", +"Focus to contextual toolbar": "\u8df3\u81f3\u5feb\u6377\u9078\u55ae", +"Insert link (if link plugin activated)": "\u65b0\u589e\u6377\u5f91 (\u6377\u5f91\u5916\u639b\u555f\u7528\u6642)", +"Save (if save plugin activated)": "\u5132\u5b58 (\u5132\u5b58\u5916\u639b\u555f\u7528\u6642)", +"Find (if searchreplace plugin activated)": "\u5c0b\u627e (\u5c0b\u627e\u53d6\u4ee3\u5916\u639b\u555f\u7528\u6642)", +"Plugins installed ({0}):": "({0}) \u500b\u5916\u639b\u5df2\u5b89\u88dd\uff1a", +"Premium plugins:": "\u52a0\u503c\u5916\u639b\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u60a8\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u5916\u639b", +"Handy Shortcuts": "\u5feb\u901f\u9375", +"Horizontal line": "\u6c34\u5e73\u7dda", +"Insert\/edit image": "\u63d2\u5165\/\u7de8\u8f2f \u5716\u7247", +"Image description": "\u5716\u7247\u63cf\u8ff0", +"Source": "\u5716\u7247\u7db2\u5740", +"Dimensions": "\u5c3a\u5bf8", +"Constrain proportions": "\u7b49\u6bd4\u4f8b\u7e2e\u653e", +"General": "\u4e00\u822c", +"Advanced": "\u9032\u968e", +"Style": "\u6a23\u5f0f", +"Vertical space": "\u9ad8\u5ea6", +"Horizontal space": "\u5bec\u5ea6", +"Border": "\u908a\u6846", +"Insert image": "\u63d2\u5165\u5716\u7247", +"Image": "\u5716\u7247", +"Image list": "\u5716\u7247\u6e05\u55ae", +"Rotate counterclockwise": "\u9006\u6642\u91dd\u65cb\u8f49", +"Rotate clockwise": "\u9806\u6642\u91dd\u65cb\u8f49", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f49", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f49", +"Edit image": "\u7de8\u8f2f\u5716\u7247", +"Image options": "\u5716\u7247\u9078\u9805", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7e2e\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8abf\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u92b3\u5316", +"Contrast": "\u5c0d\u6bd4", +"Color levels": "\u984f\u8272\u5c64\u6b21", +"Gamma": "\u4f3d\u99ac\u503c", +"Invert": "\u53cd\u8f49", +"Apply": "\u61c9\u7528", +"Back": "\u5f8c\u9000", +"Insert date\/time": "\u63d2\u5165 \u65e5\u671f\/\u6642\u9593", +"Date\/time": "\u65e5\u671f\/\u6642\u9593", +"Insert link": "\u63d2\u5165\u9023\u7d50", +"Insert\/edit link": "\u63d2\u5165\/\u7de8\u8f2f\u9023\u7d50", +"Text to display": "\u986f\u793a\u6587\u5b57", +"Url": "\u7db2\u5740", +"Target": "\u958b\u555f\u65b9\u5f0f", +"None": "\u7121", +"New window": "\u53e6\u958b\u8996\u7a97", +"Remove link": "\u79fb\u9664\u9023\u7d50", +"Anchors": "\u52a0\u5165\u9328\u9ede", +"Link": "\u9023\u7d50", +"Paste or type a link": "\u8cbc\u4e0a\u6216\u8f38\u5165\u9023\u7d50", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5beb\u7684URL\u70ba\u96fb\u5b50\u90f5\u4ef6\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7db4\u55ce\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5beb\u7684URL\u5c6c\u65bc\u5916\u90e8\u93c8\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7db4\u55ce\uff1f", +"Link list": "\u9023\u7d50\u6e05\u55ae", +"Insert video": "\u63d2\u5165\u5f71\u97f3", +"Insert\/edit video": "\u63d2\u4ef6\/\u7de8\u8f2f \u5f71\u97f3", +"Insert\/edit media": "\u63d2\u5165\/\u7de8\u8f2f \u5a92\u9ad4", +"Alternative source": "\u66ff\u4ee3\u5f71\u97f3", +"Poster": "\u9810\u89bd\u5716\u7247", +"Paste your embed code below:": "\u8acb\u5c07\u60a8\u7684\u5d4c\u5165\u5f0f\u7a0b\u5f0f\u78bc\u8cbc\u5728\u4e0b\u9762:", +"Embed": "\u5d4c\u5165\u78bc", +"Media": "\u5a92\u9ad4", +"Nonbreaking space": "\u4e0d\u5206\u884c\u7684\u7a7a\u683c", +"Page break": "\u5206\u9801", +"Paste as text": "\u4ee5\u7d14\u6587\u5b57\u8cbc\u4e0a", +"Preview": "\u9810\u89bd", +"Print": "\u5217\u5370", +"Save": "\u5132\u5b58", +"Find": "\u641c\u5c0b", +"Replace with": "\u66f4\u63db", +"Replace": "\u66ff\u63db", +"Replace all": "\u66ff\u63db\u5168\u90e8", +"Prev": "\u4e0a\u4e00\u500b", +"Next": "\u4e0b\u4e00\u500b", +"Find and replace": "\u5c0b\u627e\u53ca\u53d6\u4ee3", +"Could not find the specified string.": "\u7121\u6cd5\u67e5\u8a62\u5230\u6b64\u7279\u5b9a\u5b57\u4e32", +"Match case": "\u76f8\u5339\u914d\u6848\u4ef6", +"Whole words": "\u6574\u500b\u55ae\u5b57", +"Spellcheck": "\u62fc\u5b57\u6aa2\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5ffd\u7565\u6240\u6709", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u52a0\u5165\u5b57\u5178\u4e2d", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c6c\u6027", +"Delete table": "\u522a\u9664\u8868\u683c", +"Cell": "\u5132\u5b58\u683c", +"Row": "\u5217", +"Column": "\u884c", +"Cell properties": "\u5132\u5b58\u683c\u5c6c\u6027", +"Merge cells": "\u5408\u4f75\u5132\u5b58\u683c", +"Split cell": "\u5206\u5272\u5132\u5b58\u683c", +"Insert row before": "\u63d2\u5165\u5217\u5728...\u4e4b\u524d", +"Insert row after": "\u63d2\u5165\u5217\u5728...\u4e4b\u5f8c", +"Delete row": "\u522a\u9664\u5217", +"Row properties": "\u5217\u5c6c\u6027", +"Cut row": "\u526a\u4e0b\u5217", +"Copy row": "\u8907\u88fd\u5217", +"Paste row before": "\u8cbc\u4e0a\u5217\u5728...\u4e4b\u524d", +"Paste row after": "\u8cbc\u4e0a\u5217\u5728...\u4e4b\u5f8c", +"Insert column before": "\u63d2\u5165\u6b04\u4f4d\u5728...\u4e4b\u524d", +"Insert column after": "\u63d2\u5165\u6b04\u4f4d\u5728...\u4e4b\u5f8c", +"Delete column": "\u522a\u9664\u884c", +"Cols": "\u6b04\u4f4d\u6bb5", +"Rows": "\u5217", +"Width": "\u5bec\u5ea6", +"Height": "\u9ad8\u5ea6", +"Cell spacing": "\u5132\u5b58\u683c\u5f97\u9593\u8ddd", +"Cell padding": "\u5132\u5b58\u683c\u7684\u908a\u8ddd", +"Caption": "\u8868\u683c\u6a19\u984c", +"Left": "\u5de6\u908a", +"Center": "\u4e2d\u9593", +"Right": "\u53f3\u908a", +"Cell type": "\u5132\u5b58\u683c\u7684\u985e\u578b", +"Scope": "\u7bc4\u570d", +"Alignment": "\u5c0d\u9f4a", +"H Align": "\u6c34\u5e73\u4f4d\u7f6e", +"V Align": "\u5782\u76f4\u4f4d\u7f6e", +"Top": "\u7f6e\u9802", +"Middle": "\u7f6e\u4e2d", +"Bottom": "\u7f6e\u5e95", +"Header cell": "\u6a19\u982d\u5132\u5b58\u683c", +"Row group": "\u5217\u7fa4\u7d44", +"Column group": "\u6b04\u4f4d\u7fa4\u7d44", +"Row type": "\u884c\u7684\u985e\u578b", +"Header": "\u6a19\u982d", +"Body": "\u4e3b\u9ad4", +"Footer": "\u9801\u5c3e", +"Border color": "\u908a\u6846\u984f\u8272", +"Insert template": "\u63d2\u5165\u6a23\u7248", +"Templates": "\u6a23\u7248", +"Template": "\u6a23\u677f", +"Text color": "\u6587\u5b57\u984f\u8272", +"Background color": "\u80cc\u666f\u984f\u8272", +"Custom...": "\u81ea\u8a02", +"Custom color": "\u81ea\u8a02\u984f\u8272", +"No color": "No color", +"Table of Contents": "\u76ee\u9304", +"Show blocks": "\u986f\u793a\u5340\u584a\u8cc7\u8a0a", +"Show invisible characters": "\u986f\u793a\u96b1\u85cf\u5b57\u5143", +"Words: {0}": "\u5b57\u6578\uff1a{0}", +"{0} words": "{0} \u5b57\u5143", +"File": "\u6a94\u6848", +"Edit": "\u7de8\u8f2f", +"Insert": "\u63d2\u5165", +"View": "\u6aa2\u8996", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531 {0} \u63d0\u4f9b", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u8c50\u5bcc\u7684\u6587\u672c\u5340\u57df\u3002\u6309ALT-F9\u524d\u5f80\u4e3b\u9078\u55ae\u3002\u6309ALT-F10\u547c\u53eb\u5de5\u5177\u6b04\u3002\u6309ALT-0\u5c0b\u6c42\u5e6b\u52a9" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/zh_CN.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/zh_CN.js new file mode 100644 index 0000000000..0f3cf923ef --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/langs/zh_CN.js @@ -0,0 +1,261 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u590d", +"Undo": "\u64a4\u6d88", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u6863", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u5bf9\u9f50", +"Align center": "\u5c45\u4e2d", +"Align right": "\u53f3\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u683c\u5f0f\u5316", +"Div": "Div\u533a\u5757", +"Pre": "\u9884\u683c\u5f0f\u6587\u672c", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u7528", +"Inline": "\u6587\u672c", +"Blocks": "\u533a\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Font Family": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "Class", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor": "\u951a\u70b9", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image": "\u56fe\u7247", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link": "\u94fe\u63a5", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Poster": "\u5c01\u9762", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media": "\u5a92\u4f53", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print": "\u6253\u5370", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Prev": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Caption": "\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template": "\u63d2\u5165\u6a21\u677f", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9" +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/license.txt b/web-framework-commons/src/main/webapp/modules/editors/tinymce/license.txt new file mode 100644 index 0000000000..b17fc90494 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/advlist/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/advlist/plugin.js new file mode 100644 index 0000000000..6dc32b66bb --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,160 @@ +(function () { +var advlist = (function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + var Actions = { applyListFormat: applyListFormat }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + var Commands = { register: register }; + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,disc,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + var Settings = { + getNumberStyles: getNumberStyles, + getBulletStyles: getBulletStyles + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + return editor.dom.getStyle(listElm, 'listStyleType') || ''; + }; + var ListUtils = { + isTableCellNode: isTableCellNode, + isListNode: isListNode, + getSelectedStyleType: getSelectedStyleType + }; + + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var toMenuItems = function (styles) { + return global$1.map(styles, function (styleValue) { + var text = styleValueToText(styleValue); + var data = styleValue === 'default' ? '' : styleValue; + return { + text: text, + data: data + }; + }); + }; + var ListStyles = { toMenuItems: toMenuItems }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var listState = function (editor, listName) { + return function (e) { + var ctrl = e.control; + editor.on('NodeChange', function (e) { + var tableCellIndex = findIndex(e.parents, ListUtils.isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, ListUtils.isListNode(editor)); + ctrl.active(lists.length > 0 && lists[0].nodeName === listName); + }); + }; + }; + var updateSelection = function (editor) { + return function (e) { + var listStyleType = ListUtils.getSelectedStyleType(editor); + e.control.items().each(function (ctrl) { + ctrl.active(ctrl.settings.data === listStyleType); + }); + }; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.addButton(id, { + active: false, + type: 'splitbutton', + tooltip: tooltip, + menu: ListStyles.toMenuItems(styles), + onPostRender: listState(editor, nodeName), + onshow: updateSelection(editor), + onselect: function (e) { + Actions.applyListFormat(editor, nodeName, e.control.settings.data); + }, + onclick: function () { + editor.execCommand(cmd); + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.addButton(id, { + active: false, + type: 'button', + tooltip: tooltip, + onPostRender: listState(editor, nodeName), + onclick: function () { + editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 0) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', Settings.getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', Settings.getBulletStyles(editor)); + }; + var Buttons = { register: register$1 }; + + global.add('advlist', function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$1.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + if (hasPlugin(editor, 'lists')) { + Buttons.register(editor); + Commands.register(editor); + } + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/advlist/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 0000000000..122cd8ff64 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=function(t,e,n){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===n?null:{"list-style-type":n})},o=function(n){n.addCommand("ApplyUnorderedListStyle",function(t,e){s(n,"UL",e["list-style-type"])}),n.addCommand("ApplyOrderedListStyle",function(t,e){s(n,"OL",e["list-style-type"])})},e=function(t){var e=t.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");return e?e.split(/[ ,]/):[]},n=function(t){var e=t.getParam("advlist_bullet_styles","default,circle,disc,square");return e?e.split(/[ ,]/):[]},u=function(t){return t&&/^(TH|TD)$/.test(t.nodeName)},c=function(r){return function(t){return t&&/^(OL|UL|DL)$/.test(t.nodeName)&&(n=t,(e=r).$.contains(e.getBody(),n));var e,n}},d=function(t){var e=t.dom.getParent(t.selection.getNode(),"ol,ul");return t.dom.getStyle(e,"listStyleType")||""},p=function(t){return a.map(t,function(t){return{text:t.replace(/\-/g," ").replace(/\b\w/g,function(t){return t.toUpperCase()}),data:"default"===t?"":t}})},f=function(i,l){return function(t){var o=t.control;i.on("NodeChange",function(t){var e=function(t,e){for(var n=0;n len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var rng, end, start, endContainer, bookmark, text, matches, prev, len, rngText; + var autoLinkPattern = Settings.getAutoLinkPattern(editor); + var defaultLinkTarget = Settings.getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + rng = editor.selection.getRng(true).cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + matches = text.match(autoLinkPattern); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = 'http://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.ie) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + var Keys = { setup: setup }; + + global.add('autolink', function (editor) { + Keys.setup(editor); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autolink/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 0000000000..1238a1d231 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.Env"),m=function(e){return e.getParam("autolink_pattern",/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i)},y=function(e){return e.getParam("default_link_target","")},o=function(e,t){if(t<0&&(t=0),3===e.nodeType){var n=e.data.length;n Settings.getAutoResizeMinHeight(editor)) { + resizeHeight = myHeight; + } + var maxHeight = Settings.getAutoResizeMaxHeight(editor); + if (maxHeight && myHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.iframeElement, 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding, bottomMargin; + var dom = editor.dom; + overflowPadding = Settings.getAutoResizeOverflowPadding(editor); + bottomMargin = Settings.getAutoResizeBottomMargin(editor); + if (overflowPadding !== false) { + dom.setStyles(editor.getBody(), { + paddingLeft: overflowPadding, + paddingRight: overflowPadding + }); + } + if (bottomMargin !== false) { + dom.setStyles(editor.getBody(), { paddingBottom: bottomMargin }); + } + }); + editor.on('nodechange setcontent keyup FullscreenStateChanged', function (e) { + resize(editor, oldSize); + }); + if (Settings.shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + var Resize = { + setup: setup, + resize: resize + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + Resize.resize(editor, oldSize); + }); + }; + var Commands = { register: register }; + + global.add('autoresize', function (editor) { + if (!editor.inline) { + var oldSize = Cell(0); + Commands.register(editor, oldSize); + Resize.setup(editor, oldSize); + } + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autoresize/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000000..f63945671a --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var i=function(t){var e=t,n=function(){return e};return{get:n,set:function(t){e=t},clone:function(){return i(n())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),y=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),h=function(t){return parseInt(t.getParam("autoresize_min_height",t.getElement().offsetHeight),10)},v=function(t){return parseInt(t.getParam("autoresize_max_height",0),10)},o=function(t){return t.getParam("autoresize_overflow_padding",1)},a=function(t){return t.getParam("autoresize_bottom_margin",50)},n=function(t){return t.getParam("autoresize_on_init",!0)},u=function(t,e,n,i,o){r.setEditorTimeout(t,function(){_(t,e),n--?u(t,e,n,i,o):o&&o()},i)},S=function(t,e){var n=t.getBody();n&&(n.style.overflowY=e?"":"hidden",e||(n.scrollTop=0))},_=function(t,e){var n,i,o,r,a,u,s,l,g,c,f,d=t.dom;if(i=t.getDoc())if((m=t).plugins.fullscreen&&m.plugins.fullscreen.isFullscreen())S(t,!0);else{var m;o=i.body,r=h(t),u=d.getStyle(o,"margin-top",!0),s=d.getStyle(o,"margin-bottom",!0),l=d.getStyle(o,"padding-top",!0),g=d.getStyle(o,"padding-bottom",!0),c=d.getStyle(o,"border-top-width",!0),f=d.getStyle(o,"border-bottom-width",!0),a=o.offsetHeight+parseInt(u,10)+parseInt(s,10)+parseInt(l,10)+parseInt(g,10)+parseInt(c,10)+parseInt(f,10),(isNaN(a)||a<=0)&&(a=y.ie?o.scrollHeight:y.webkit&&0===o.clientHeight?0:o.offsetHeight),a>h(t)&&(r=a);var p=v(t);p&&p]*>((\xA0| |[ \t]|]*>)+?|)|
        $', 'i').test(html); + }; + var hasDraft = function (editor) { + var time = parseInt(global$1.getItem(getAutoSavePrefix(editor) + 'time'), 10) || 0; + if (new Date().getTime() - time > getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$1.removeItem(prefix + 'draft'); + global$1.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$1.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$1.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$1.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor, started) { + var interval = getAutoSaveInterval(editor); + if (!started.get()) { + setInterval(function () { + if (!editor.removed) { + storeDraft(editor); + } + }, interval); + started.set(true); + } + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + + var get = function (editor) { + return { + hasDraft: curry(hasDraft, editor), + storeDraft: curry(storeDraft, editor), + restoreDraft: curry(restoreDraft, editor), + removeDraft: curry(removeDraft, editor), + isEmpty: curry(isEmpty, editor) + }; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + global$3._beforeUnloadHandler = function () { + var msg; + global$2.each(global$3.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + return msg; + }; + var setup = function (editor) { + domGlobals.window.onbeforeunload = global$3._beforeUnloadHandler; + }; + + var postRender = function (editor, started) { + return function (e) { + var ctrl = e.control; + ctrl.disabled(!hasDraft(editor)); + editor.on('StoreDraft RestoreDraft RemoveDraft', function () { + ctrl.disabled(!hasDraft(editor)); + }); + startStoreDraft(editor, started); + }; + }; + var register = function (editor, started) { + editor.addButton('restoredraft', { + title: 'Restore last draft', + onclick: function () { + restoreLastDraft(editor); + }, + onPostRender: postRender(editor, started) + }); + editor.addMenuItem('restoredraft', { + text: 'Restore last draft', + onclick: function () { + restoreLastDraft(editor); + }, + onPostRender: postRender(editor, started), + context: 'file' + }); + }; + + global.add('autosave', function (editor) { + var started = Cell(false); + setup(); + register(editor, started); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + function Plugin () { + } + + return Plugin; + +}(window)); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autosave/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 0000000000..1eab720138 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1 @@ +!function(a){"use strict";var i=function(t){var e=t,n=function(){return e};return{get:n,set:function(t){e=t},clone:function(){return i(n())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),o=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=function(t,e){var n=t||e,r=/^(\d+)([ms]?)$/.exec(""+n);return(r[2]?{s:1e3,m:6e4}[r[2]]:1)*parseInt(n,10)},s=function(t){var e=t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-");return e=(e=(e=(e=e.replace(/\{path\}/g,a.document.location.pathname)).replace(/\{query\}/g,a.document.location.search)).replace(/\{hash\}/g,a.document.location.hash)).replace(/\{id\}/g,t.id)},c=function(t,e){var n=t.settings.forced_root_block;return""===(e=o.trim(void 0===e?t.getBody().innerHTML:e))||new RegExp("^<"+n+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
        $","i").test(e)},f=function(t){var e=parseInt(r.getItem(s(t)+"time"),10)||0;return!((new Date).getTime()-e>u(t.settings.autosave_retention,"20m")&&(l(t,!1),1))},l=function(t,e){var n=s(t);r.removeItem(n+"draft"),r.removeItem(n+"time"),!1!==e&&t.fire("RemoveDraft")},m=function(t){var e=s(t);!c(t)&&t.isDirty()&&(r.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),r.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))},v=function(t){var e=s(t);f(t)&&(t.setContent(r.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))},d=function(t,e){var n=u(t.settings.autosave_interval,"30s");e.get()||(setInterval(function(){t.removed||m(t)},n),e.set(!0))},g=function(t){t.undoManager.transact(function(){v(t),l(t)}),t.focus()};function y(r){for(var o=[],t=1;t(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
        /gi, '\n'); + rep(//gi, '\n'); + rep(/
        /gi, '\n'); + rep(/

        /gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
        '); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '$2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + var Convert = { + html2bbcode: html2bbcode, + bbcode2html: bbcode2html + }; + + global.add('bbcode', function () { + return { + init: function (editor) { + editor.on('beforeSetContent', function (e) { + e.content = Convert.bbcode2html(e.content); + }); + editor.on('postProcess', function (e) { + if (e.set) { + e.content = Convert.bbcode2html(e.content); + } + if (e.get) { + e.content = Convert.html2bbcode(e.content); + } + }); + } + }; + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/bbcode/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 0000000000..b2b9d701c6 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(e){e=t.trim(e);var o=function(o,t){e=e.replace(o,t)};return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
        /gi,"\n"),o(//gi,"\n"),o(/
        /gi,"\n"),o(/

        /gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),e},i=function(e){e=t.trim(e);var o=function(o,t){e=e.replace(o,t)};return o(/\n/gi,"
        "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),e};o.add("bbcode",function(){return{init:function(o){o.on("beforeSetContent",function(o){o.content=i(o.content)}),o.on("postProcess",function(o){o.set&&(o.content=i(o.content)),o.get&&(o.content=e(o.content))})}}})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/charmap/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/charmap/plugin.js new file mode 100644 index 0000000000..48b26f1c56 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1275 @@ +(function () { +var charmap = (function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + var Events = { fireInsertCustomChar: fireInsertCustomChar }; + + var insertChar = function (editor, chr) { + var evtChr = Events.fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + var Actions = { insertChar: insertChar }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.settings.charmap; + }; + var getCharMapAppend = function (editor) { + return editor.settings.charmap_append; + }; + var Settings = { + getCharMap: getCharMap, + getCharMapAppend: getCharMapAppend + }; + + var isArray = global$1.isArray; + var getDefaultCharMap = function () { + return [ + [ + '160', + 'no-break space' + ], + [ + '173', + 'soft hyphen' + ], + [ + '34', + 'quotation mark' + ], + [ + '162', + 'cent sign' + ], + [ + '8364', + 'euro sign' + ], + [ + '163', + 'pound sign' + ], + [ + '165', + 'yen sign' + ], + [ + '169', + 'copyright sign' + ], + [ + '174', + 'registered sign' + ], + [ + '8482', + 'trade mark sign' + ], + [ + '8240', + 'per mille sign' + ], + [ + '181', + 'micro sign' + ], + [ + '183', + 'middle dot' + ], + [ + '8226', + 'bullet' + ], + [ + '8230', + 'three dot leader' + ], + [ + '8242', + 'minutes / feet' + ], + [ + '8243', + 'seconds / inches' + ], + [ + '167', + 'section sign' + ], + [ + '182', + 'paragraph sign' + ], + [ + '223', + 'sharp s / ess-zed' + ], + [ + '8249', + 'single left-pointing angle quotation mark' + ], + [ + '8250', + 'single right-pointing angle quotation mark' + ], + [ + '171', + 'left pointing guillemet' + ], + [ + '187', + 'right pointing guillemet' + ], + [ + '8216', + 'left single quotation mark' + ], + [ + '8217', + 'right single quotation mark' + ], + [ + '8220', + 'left double quotation mark' + ], + [ + '8221', + 'right double quotation mark' + ], + [ + '8218', + 'single low-9 quotation mark' + ], + [ + '8222', + 'double low-9 quotation mark' + ], + [ + '60', + 'less-than sign' + ], + [ + '62', + 'greater-than sign' + ], + [ + '8804', + 'less-than or equal to' + ], + [ + '8805', + 'greater-than or equal to' + ], + [ + '8211', + 'en dash' + ], + [ + '8212', + 'em dash' + ], + [ + '175', + 'macron' + ], + [ + '8254', + 'overline' + ], + [ + '164', + 'currency sign' + ], + [ + '166', + 'broken bar' + ], + [ + '168', + 'diaeresis' + ], + [ + '161', + 'inverted exclamation mark' + ], + [ + '191', + 'turned question mark' + ], + [ + '710', + 'circumflex accent' + ], + [ + '732', + 'small tilde' + ], + [ + '176', + 'degree sign' + ], + [ + '8722', + 'minus sign' + ], + [ + '177', + 'plus-minus sign' + ], + [ + '247', + 'division sign' + ], + [ + '8260', + 'fraction slash' + ], + [ + '215', + 'multiplication sign' + ], + [ + '185', + 'superscript one' + ], + [ + '178', + 'superscript two' + ], + [ + '179', + 'superscript three' + ], + [ + '188', + 'fraction one quarter' + ], + [ + '189', + 'fraction one half' + ], + [ + '190', + 'fraction three quarters' + ], + [ + '402', + 'function / florin' + ], + [ + '8747', + 'integral' + ], + [ + '8721', + 'n-ary sumation' + ], + [ + '8734', + 'infinity' + ], + [ + '8730', + 'square root' + ], + [ + '8764', + 'similar to' + ], + [ + '8773', + 'approximately equal to' + ], + [ + '8776', + 'almost equal to' + ], + [ + '8800', + 'not equal to' + ], + [ + '8801', + 'identical to' + ], + [ + '8712', + 'element of' + ], + [ + '8713', + 'not an element of' + ], + [ + '8715', + 'contains as member' + ], + [ + '8719', + 'n-ary product' + ], + [ + '8743', + 'logical and' + ], + [ + '8744', + 'logical or' + ], + [ + '172', + 'not sign' + ], + [ + '8745', + 'intersection' + ], + [ + '8746', + 'union' + ], + [ + '8706', + 'partial differential' + ], + [ + '8704', + 'for all' + ], + [ + '8707', + 'there exists' + ], + [ + '8709', + 'diameter' + ], + [ + '8711', + 'backward difference' + ], + [ + '8727', + 'asterisk operator' + ], + [ + '8733', + 'proportional to' + ], + [ + '8736', + 'angle' + ], + [ + '180', + 'acute accent' + ], + [ + '184', + 'cedilla' + ], + [ + '170', + 'feminine ordinal indicator' + ], + [ + '186', + 'masculine ordinal indicator' + ], + [ + '8224', + 'dagger' + ], + [ + '8225', + 'double dagger' + ], + [ + '192', + 'A - grave' + ], + [ + '193', + 'A - acute' + ], + [ + '194', + 'A - circumflex' + ], + [ + '195', + 'A - tilde' + ], + [ + '196', + 'A - diaeresis' + ], + [ + '197', + 'A - ring above' + ], + [ + '256', + 'A - macron' + ], + [ + '198', + 'ligature AE' + ], + [ + '199', + 'C - cedilla' + ], + [ + '200', + 'E - grave' + ], + [ + '201', + 'E - acute' + ], + [ + '202', + 'E - circumflex' + ], + [ + '203', + 'E - diaeresis' + ], + [ + '274', + 'E - macron' + ], + [ + '204', + 'I - grave' + ], + [ + '205', + 'I - acute' + ], + [ + '206', + 'I - circumflex' + ], + [ + '207', + 'I - diaeresis' + ], + [ + '298', + 'I - macron' + ], + [ + '208', + 'ETH' + ], + [ + '209', + 'N - tilde' + ], + [ + '210', + 'O - grave' + ], + [ + '211', + 'O - acute' + ], + [ + '212', + 'O - circumflex' + ], + [ + '213', + 'O - tilde' + ], + [ + '214', + 'O - diaeresis' + ], + [ + '216', + 'O - slash' + ], + [ + '332', + 'O - macron' + ], + [ + '338', + 'ligature OE' + ], + [ + '352', + 'S - caron' + ], + [ + '217', + 'U - grave' + ], + [ + '218', + 'U - acute' + ], + [ + '219', + 'U - circumflex' + ], + [ + '220', + 'U - diaeresis' + ], + [ + '362', + 'U - macron' + ], + [ + '221', + 'Y - acute' + ], + [ + '376', + 'Y - diaeresis' + ], + [ + '562', + 'Y - macron' + ], + [ + '222', + 'THORN' + ], + [ + '224', + 'a - grave' + ], + [ + '225', + 'a - acute' + ], + [ + '226', + 'a - circumflex' + ], + [ + '227', + 'a - tilde' + ], + [ + '228', + 'a - diaeresis' + ], + [ + '229', + 'a - ring above' + ], + [ + '257', + 'a - macron' + ], + [ + '230', + 'ligature ae' + ], + [ + '231', + 'c - cedilla' + ], + [ + '232', + 'e - grave' + ], + [ + '233', + 'e - acute' + ], + [ + '234', + 'e - circumflex' + ], + [ + '235', + 'e - diaeresis' + ], + [ + '275', + 'e - macron' + ], + [ + '236', + 'i - grave' + ], + [ + '237', + 'i - acute' + ], + [ + '238', + 'i - circumflex' + ], + [ + '239', + 'i - diaeresis' + ], + [ + '299', + 'i - macron' + ], + [ + '240', + 'eth' + ], + [ + '241', + 'n - tilde' + ], + [ + '242', + 'o - grave' + ], + [ + '243', + 'o - acute' + ], + [ + '244', + 'o - circumflex' + ], + [ + '245', + 'o - tilde' + ], + [ + '246', + 'o - diaeresis' + ], + [ + '248', + 'o slash' + ], + [ + '333', + 'o macron' + ], + [ + '339', + 'ligature oe' + ], + [ + '353', + 's - caron' + ], + [ + '249', + 'u - grave' + ], + [ + '250', + 'u - acute' + ], + [ + '251', + 'u - circumflex' + ], + [ + '252', + 'u - diaeresis' + ], + [ + '363', + 'u - macron' + ], + [ + '253', + 'y - acute' + ], + [ + '254', + 'thorn' + ], + [ + '255', + 'y - diaeresis' + ], + [ + '563', + 'y - macron' + ], + [ + '913', + 'Alpha' + ], + [ + '914', + 'Beta' + ], + [ + '915', + 'Gamma' + ], + [ + '916', + 'Delta' + ], + [ + '917', + 'Epsilon' + ], + [ + '918', + 'Zeta' + ], + [ + '919', + 'Eta' + ], + [ + '920', + 'Theta' + ], + [ + '921', + 'Iota' + ], + [ + '922', + 'Kappa' + ], + [ + '923', + 'Lambda' + ], + [ + '924', + 'Mu' + ], + [ + '925', + 'Nu' + ], + [ + '926', + 'Xi' + ], + [ + '927', + 'Omicron' + ], + [ + '928', + 'Pi' + ], + [ + '929', + 'Rho' + ], + [ + '931', + 'Sigma' + ], + [ + '932', + 'Tau' + ], + [ + '933', + 'Upsilon' + ], + [ + '934', + 'Phi' + ], + [ + '935', + 'Chi' + ], + [ + '936', + 'Psi' + ], + [ + '937', + 'Omega' + ], + [ + '945', + 'alpha' + ], + [ + '946', + 'beta' + ], + [ + '947', + 'gamma' + ], + [ + '948', + 'delta' + ], + [ + '949', + 'epsilon' + ], + [ + '950', + 'zeta' + ], + [ + '951', + 'eta' + ], + [ + '952', + 'theta' + ], + [ + '953', + 'iota' + ], + [ + '954', + 'kappa' + ], + [ + '955', + 'lambda' + ], + [ + '956', + 'mu' + ], + [ + '957', + 'nu' + ], + [ + '958', + 'xi' + ], + [ + '959', + 'omicron' + ], + [ + '960', + 'pi' + ], + [ + '961', + 'rho' + ], + [ + '962', + 'final sigma' + ], + [ + '963', + 'sigma' + ], + [ + '964', + 'tau' + ], + [ + '965', + 'upsilon' + ], + [ + '966', + 'phi' + ], + [ + '967', + 'chi' + ], + [ + '968', + 'psi' + ], + [ + '969', + 'omega' + ], + [ + '8501', + 'alef symbol' + ], + [ + '982', + 'pi symbol' + ], + [ + '8476', + 'real part symbol' + ], + [ + '978', + 'upsilon - hook symbol' + ], + [ + '8472', + 'Weierstrass p' + ], + [ + '8465', + 'imaginary part' + ], + [ + '8592', + 'leftwards arrow' + ], + [ + '8593', + 'upwards arrow' + ], + [ + '8594', + 'rightwards arrow' + ], + [ + '8595', + 'downwards arrow' + ], + [ + '8596', + 'left right arrow' + ], + [ + '8629', + 'carriage return' + ], + [ + '8656', + 'leftwards double arrow' + ], + [ + '8657', + 'upwards double arrow' + ], + [ + '8658', + 'rightwards double arrow' + ], + [ + '8659', + 'downwards double arrow' + ], + [ + '8660', + 'left right double arrow' + ], + [ + '8756', + 'therefore' + ], + [ + '8834', + 'subset of' + ], + [ + '8835', + 'superset of' + ], + [ + '8836', + 'not a subset of' + ], + [ + '8838', + 'subset of or equal to' + ], + [ + '8839', + 'superset of or equal to' + ], + [ + '8853', + 'circled plus' + ], + [ + '8855', + 'circled times' + ], + [ + '8869', + 'perpendicular' + ], + [ + '8901', + 'dot operator' + ], + [ + '8968', + 'left ceiling' + ], + [ + '8969', + 'right ceiling' + ], + [ + '8970', + 'left floor' + ], + [ + '8971', + 'right floor' + ], + [ + '9001', + 'left-pointing angle bracket' + ], + [ + '9002', + 'right-pointing angle bracket' + ], + [ + '9674', + 'lozenge' + ], + [ + '9824', + 'black spade suit' + ], + [ + '9827', + 'black club suit' + ], + [ + '9829', + 'black heart suit' + ], + [ + '9830', + 'black diamond suit' + ], + [ + '8194', + 'en space' + ], + [ + '8195', + 'em space' + ], + [ + '8201', + 'thin space' + ], + [ + '8204', + 'zero width non-joiner' + ], + [ + '8205', + 'zero width joiner' + ], + [ + '8206', + 'left-to-right mark' + ], + [ + '8207', + 'right-to-left mark' + ] + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = Settings.getCharMap(editor); + if (userCharMap) { + charmap = getCharsFromSetting(userCharMap); + } + var userCharMapAppend = Settings.getCharMapAppend(editor); + if (userCharMapAppend) { + return [].concat(charmap).concat(getCharsFromSetting(userCharMapAppend)); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + return extendCharMap(editor, getDefaultCharMap()); + }; + var CharMap = { getCharMap: getCharMap$1 }; + + var get = function (editor) { + var getCharMap = function () { + return CharMap.getCharMap(editor); + }; + var insertChar = function (chr) { + Actions.insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar + }; + }; + var Api = { get: get }; + + var getHtml = function (charmap) { + var gridHtml, x, y; + var width = Math.min(charmap.length, 25); + var height = Math.ceil(charmap.length / width); + gridHtml = '

        '; + for (y = 0; y < height; y++) { + gridHtml += ''; + for (x = 0; x < width; x++) { + var index = y * width + x; + if (index < charmap.length) { + var chr = charmap[index]; + var charCode = parseInt(chr[0], 10); + var chrText = chr ? String.fromCharCode(charCode) : ' '; + gridHtml += ''; + } else { + gridHtml += ''; + } + gridHtml += ''; + return gridHtml; + }; + var GridHtml = { getHtml: getHtml }; + + var getParentTd = function (elm) { + while (elm) { + if (elm.nodeName === 'TD') { + return elm; + } + elm = elm.parentNode; + } + }; + var open = function (editor) { + var win; + var charMapPanel = { + type: 'container', + html: GridHtml.getHtml(CharMap.getCharMap(editor)), + onclick: function (e) { + var target = e.target; + if (/^(TD|DIV)$/.test(target.nodeName)) { + var charDiv = getParentTd(target).firstChild; + if (charDiv && charDiv.hasAttribute('data-chr')) { + var charCodeString = charDiv.getAttribute('data-chr'); + var charCode = parseInt(charCodeString, 10); + if (!isNaN(charCode)) { + Actions.insertChar(editor, String.fromCharCode(charCode)); + } + if (!e.ctrlKey) { + win.close(); + } + } + } + }, + onmouseover: function (e) { + var td = getParentTd(e.target); + if (td && td.firstChild) { + win.find('#preview').text(td.firstChild.firstChild.data); + win.find('#previewTitle').text(td.title); + } else { + win.find('#preview').text(' '); + win.find('#previewTitle').text(' '); + } + } + }; + win = editor.windowManager.open({ + title: 'Special character', + spacing: 10, + padding: 10, + items: [ + charMapPanel, + { + type: 'container', + layout: 'flex', + direction: 'column', + align: 'center', + spacing: 5, + minWidth: 160, + minHeight: 160, + items: [ + { + type: 'label', + name: 'preview', + text: ' ', + style: 'font-size: 40px; text-align: center', + border: 1, + minWidth: 140, + minHeight: 80 + }, + { + type: 'spacer', + minHeight: 20 + }, + { + type: 'label', + name: 'previewTitle', + text: ' ', + style: 'white-space: pre-wrap;', + border: 1, + minWidth: 140 + } + ] + } + ], + buttons: [{ + text: 'Close', + onclick: function () { + win.close(); + } + }] + }); + }; + var Dialog = { open: open }; + + var register = function (editor) { + editor.addCommand('mceShowCharmap', function () { + Dialog.open(editor); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.addButton('charmap', { + icon: 'charmap', + tooltip: 'Special character', + cmd: 'mceShowCharmap' + }); + editor.addMenuItem('charmap', { + icon: 'charmap', + text: 'Special character', + cmd: 'mceShowCharmap', + context: 'insert' + }); + }; + var Buttons = { register: register$1 }; + + global.add('charmap', function (editor) { + Commands.register(editor); + Buttons.register(editor); + return Api.get(editor); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/charmap/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000000..9ea3f75751 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e,t){return e.fire("insertCustomChar",{chr:t})},l=function(e,t){var a=i(e,t).chr;e.execCommand("mceInsertContent",!1,a)},a=tinymce.util.Tools.resolve("tinymce.util.Tools"),r=function(e){return e.settings.charmap},n=function(e){return e.settings.charmap_append},o=a.isArray,c=function(e){return o(e)?[].concat((t=e,a.grep(t,function(e){return o(e)&&2===e.length}))):"function"==typeof e?e():[];var t},s=function(e){return function(e,t){var a=r(e);a&&(t=c(a));var i=n(e);return i?[].concat(t).concat(c(i)):t}(e,[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]])},t=function(t){return{getCharMap:function(){return s(t)},insertChar:function(e){l(t,e)}}},u=function(e){var t,a,i,r=Math.min(e.length,25),n=Math.ceil(e.length/r);for(t='',i=0;i",a=0;a
        '+s+"
        "}else t+="
        "}return t+=""},d=function(e){for(;e;){if("TD"===e.nodeName)return e;e=e.parentNode}},m=function(n){var o,e={type:"container",html:u(s(n)),onclick:function(e){var t=e.target;if(/^(TD|DIV)$/.test(t.nodeName)){var a=d(t).firstChild;if(a&&a.hasAttribute("data-chr")){var i=a.getAttribute("data-chr"),r=parseInt(i,10);isNaN(r)||l(n,String.fromCharCode(r)),e.ctrlKey||o.close()}}},onmouseover:function(e){var t=d(e.target);t&&t.firstChild?(o.find("#preview").text(t.firstChild.firstChild.data),o.find("#previewTitle").text(t.title)):(o.find("#preview").text(" "),o.find("#previewTitle").text(" "))}};o=n.windowManager.open({title:"Special character",spacing:10,padding:10,items:[e,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"spacer",minHeight:20},{type:"label",name:"previewTitle",text:" ",style:"white-space: pre-wrap;",border:1,minWidth:140}]}],buttons:[{text:"Close",onclick:function(){o.close()}}]})},g=function(e){e.addCommand("mceShowCharmap",function(){m(e)})},p=function(e){e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"})};e.add("charmap",function(e){return g(e),p(e),t(e)})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/code/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/code/plugin.js new file mode 100644 index 0000000000..e4cfd54500 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/code/plugin.js @@ -0,0 +1,94 @@ +(function () { +var code = (function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var getMinWidth = function (editor) { + return editor.getParam('code_dialog_width', 600); + }; + var getMinHeight = function (editor) { + return editor.getParam('code_dialog_height', Math.min(global$1.DOM.getViewPort().h - 200, 500)); + }; + var Settings = { + getMinWidth: getMinWidth, + getMinHeight: getMinHeight + }; + + var setContent = function (editor, html) { + editor.focus(); + editor.undoManager.transact(function () { + editor.setContent(html); + }); + editor.selection.setCursorLocation(); + editor.nodeChanged(); + }; + var getContent = function (editor) { + return editor.getContent({ source_view: true }); + }; + var Content = { + setContent: setContent, + getContent: getContent + }; + + var open = function (editor) { + var minWidth = Settings.getMinWidth(editor); + var minHeight = Settings.getMinHeight(editor); + var win = editor.windowManager.open({ + title: 'Source code', + body: { + type: 'textbox', + name: 'code', + multiline: true, + minWidth: minWidth, + minHeight: minHeight, + spellcheck: false, + style: 'direction: ltr; text-align: left' + }, + onSubmit: function (e) { + Content.setContent(editor, e.data.code); + } + }); + win.find('#code').value(Content.getContent(editor)); + }; + var Dialog = { open: open }; + + var register = function (editor) { + editor.addCommand('mceCodeEditor', function () { + Dialog.open(editor); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.addButton('code', { + icon: 'code', + tooltip: 'Source code', + onclick: function () { + Dialog.open(editor); + } + }); + editor.addMenuItem('code', { + icon: 'code', + text: 'Source code', + onclick: function () { + Dialog.open(editor); + } + }); + }; + var Buttons = { register: register$1 }; + + global.add('code', function (editor) { + Commands.register(editor); + Buttons.register(editor); + return {}; + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/code/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/code/plugin.min.js new file mode 100644 index 0000000000..7afcca644e --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/code/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),o=function(t){return t.getParam("code_dialog_width",600)},i=function(t){return t.getParam("code_dialog_height",Math.min(n.DOM.getViewPort().h-200,500))},c=function(t,n){t.focus(),t.undoManager.transact(function(){t.setContent(n)}),t.selection.setCursorLocation(),t.nodeChanged()},d=function(t){return t.getContent({source_view:!0})},e=function(n){var t=o(n),e=i(n);n.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:t,minHeight:e,spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(t){c(n,t.data.code)}}).find("#code").value(d(n))},u=function(t){t.addCommand("mceCodeEditor",function(){e(t)})},a=function(t){t.addButton("code",{icon:"code",tooltip:"Source code",onclick:function(){e(t)}}),t.addMenuItem("code",{icon:"code",text:"Source code",onclick:function(){e(t)}})};t.add("code",function(t){return u(t),a(t),{}})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/css/prism.css b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/css/prism.css new file mode 100644 index 0000000000..128237fba3 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/css/prism.css @@ -0,0 +1,138 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/plugin.js new file mode 100644 index 0000000000..b6e8818f80 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/plugin.js @@ -0,0 +1,967 @@ +(function () { +var codesample = (function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var getContentCss = function (editor) { + return editor.settings.codesample_content_css; + }; + var getLanguages = function (editor) { + return editor.settings.codesample_languages; + }; + var getDialogMinWidth = function (editor) { + return Math.min(global$1.DOM.getViewPort().w, editor.getParam('codesample_dialog_width', 800)); + }; + var getDialogMinHeight = function (editor) { + return Math.min(global$1.DOM.getViewPort().w, editor.getParam('codesample_dialog_height', 650)); + }; + var Settings = { + getContentCss: getContentCss, + getLanguages: getLanguages, + getDialogMinWidth: getDialogMinWidth, + getDialogMinHeight: getDialogMinHeight + }; + + var window = {}; + var global$2 = window; + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && domGlobals.self instanceof WorkerGlobalScope ? domGlobals.self : {}; + var Prism = function () { + var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i; + var _ = _self.Prism = { + util: { + encode: function (tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias); + } else if (_.util.type(tokens) === 'Array') { + return tokens.map(_.util.encode); + } else { + return tokens.replace(/&/g, '&').replace(/ text.length) { + break tokenloop; + } + if (str instanceof Token) { + continue; + } + pattern.lastIndex = 0; + var match = pattern.exec(str); + if (match) { + if (lookbehind) { + lookbehindLength = match[1].length; + } + var from = match.index - 1 + lookbehindLength; + match = match[0].slice(lookbehindLength); + var len = match.length, to = from + len, before = str.slice(0, from + 1), after = str.slice(to + 1); + var args = [ + i, + 1 + ]; + if (before) { + args.push(before); + } + var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias); + args.push(wrapped); + if (after) { + args.push(after); + } + Array.prototype.splice.apply(strarr, args); + } + } + } + } + return strarr; + }, + hooks: { + all: {}, + add: function (name, callback) { + var hooks = _.hooks.all; + hooks[name] = hooks[name] || []; + hooks[name].push(callback); + }, + run: function (name, env) { + var callbacks = _.hooks.all[name]; + if (!callbacks || !callbacks.length) { + return; + } + for (var i = 0, callback = void 0; callback = callbacks[i++];) { + callback(env); + } + } + } + }; + var Token = _.Token = function (type, content, alias) { + this.type = type; + this.content = content; + this.alias = alias; + }; + Token.stringify = function (o, language, parent) { + if (typeof o === 'string') { + return o; + } + if (_.util.type(o) === 'Array') { + return o.map(function (element) { + return Token.stringify(element, language, o); + }).join(''); + } + var env = { + type: o.type, + content: Token.stringify(o.content, language, parent), + tag: 'span', + classes: [ + 'token', + o.type + ], + attributes: {}, + language: language, + parent: parent + }; + if (env.type === 'comment') { + env.attributes.spellcheck = 'true'; + } + if (o.alias) { + var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + _.hooks.run('wrap', env); + var attributes = ''; + for (var name in env.attributes) { + attributes += (attributes ? ' ' : '') + name + '="' + (env.attributes[name] || '') + '"'; + } + return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + ''; + }; + if (!_self.document) { + if (!_self.addEventListener) { + return _self.Prism; + } + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + return _self.Prism; + } + }(); + if (typeof global$2 !== 'undefined') { + global$2.Prism = Prism; + } + Prism.languages.markup = { + comment: //, + prolog: /<\?[\w\W]+?\?>/, + doctype: //, + cdata: //i, + tag: { + pattern: /<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + punctuation: /^<\/?/, + namespace: /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i, + inside: { punctuation: /[=>"']/ } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { namespace: /^[^\s>\/:]+:/ } + } + } + }, + entity: /&#?[\da-z]{1,8};/i + }; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes.title = env.content.replace(/&/, '&'); + } + }); + Prism.languages.xml = Prism.languages.markup; + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + Prism.languages.css = { + comment: /\/\*[\w\W]*?\*\//, + atrule: { + pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i, + inside: { rule: /@[\w-]+/ } + }, + url: /url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i, + selector: /[^\{\}\s][^\{\};]*?(?=\s*\{)/, + string: /("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/, + property: /(\b|\B)[\w-]+(?=\s*:)/i, + important: /\B!important\b/i, + function: /[-a-z0-9]+(?=\()/i, + punctuation: /[(){};:]/ + }; + Prism.languages.css.atrule.inside.rest = Prism.util.clone(Prism.languages.css); + if (Prism.languages.markup) { + Prism.languages.insertBefore('markup', 'tag', { + style: { + pattern: /[\w\W]*?<\/style>/i, + inside: { + tag: { + pattern: /|<\/style>/i, + inside: Prism.languages.markup.tag.inside + }, + rest: Prism.languages.css + }, + alias: 'language-css' + } + }); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|').*?\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: Prism.languages.markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, Prism.languages.markup.tag); + } + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\w\W]*?\*\//, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true + } + ], + 'string': /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + 'class-name': { + pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i, + lookbehind: true, + inside: { punctuation: /(\.|\\)/ } + }, + 'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(true|false)\b/, + 'function': /[a-z0-9_]+(?=\()/i, + 'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i, + 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.javascript = Prism.languages.extend('clike', { + keyword: /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/, + number: /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/, + function: /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i + }); + Prism.languages.insertBefore('javascript', 'keyword', { + regex: { + pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/, + lookbehind: true + } + }); + Prism.languages.insertBefore('javascript', 'class-name', { + 'template-string': { + pattern: /`(?:\\`|\\?[^`])*`/, + inside: { + interpolation: { + pattern: /\$\{[^}]+\}/, + inside: { + 'interpolation-punctuation': { + pattern: /^\$\{|\}$/, + alias: 'punctuation' + }, + 'rest': Prism.languages.javascript + } + }, + string: /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.insertBefore('markup', 'tag', { + script: { + pattern: /[\w\W]*?<\/script>/i, + inside: { + tag: { + pattern: /|<\/script>/i, + inside: Prism.languages.markup.tag.inside + }, + rest: Prism.languages.javascript + }, + alias: 'language-javascript' + } + }); + } + Prism.languages.js = Prism.languages.javascript; + Prism.languages.c = Prism.languages.extend('clike', { + keyword: /\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/, + operator: /\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/, + number: /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i + }); + Prism.languages.insertBefore('c', 'string', { + macro: { + pattern: /(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im, + lookbehind: true, + alias: 'property', + inside: { + string: { + pattern: /(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/, + lookbehind: true + } + } + } + }); + delete Prism.languages.c['class-name']; + delete Prism.languages.c.boolean; + Prism.languages.csharp = Prism.languages.extend('clike', { + keyword: /\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/, + string: [ + /@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/, + /("|')(\\?.)*?\1/ + ], + number: /\b-?(0x[\da-f]+|\d*\.?\d+)\b/i + }); + Prism.languages.insertBefore('csharp', 'keyword', { + preprocessor: { + pattern: /(^\s*)#.*/m, + lookbehind: true + } + }); + Prism.languages.cpp = Prism.languages.extend('c', { + keyword: /\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/, + boolean: /\b(true|false)\b/, + operator: /[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/ + }); + Prism.languages.insertBefore('cpp', 'keyword', { + 'class-name': { + pattern: /(class\s+)[a-z0-9_]+/i, + lookbehind: true + } + }); + Prism.languages.java = Prism.languages.extend('clike', { + keyword: /\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/, + number: /\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i, + operator: { + pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m, + lookbehind: true + } + }); + Prism.languages.php = Prism.languages.extend('clike', { + keyword: /\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i, + constant: /\b[A-Z0-9_]{2,}\b/, + comment: { + pattern: /(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'class-name', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + delimiter: /\?>|<\?(?:php)?/i, + variable: /\$\w+\b/i, + package: { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + property: { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + if (Prism.languages.markup) { + Prism.hooks.add('before-highlight', function (env) { + if (env.language !== 'php') { + return; + } + env.tokenStack = []; + env.backupCode = env.code; + env.code = env.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/ig, function (match) { + env.tokenStack.push(match); + return '{{{PHP' + env.tokenStack.length + '}}}'; + }); + }); + Prism.hooks.add('before-insert', function (env) { + if (env.language === 'php') { + env.code = env.backupCode; + delete env.backupCode; + } + }); + Prism.hooks.add('after-highlight', function (env) { + if (env.language !== 'php') { + return; + } + for (var i = 0, t = void 0; t = env.tokenStack[i]; i++) { + env.highlightedCode = env.highlightedCode.replace('{{{PHP' + (i + 1) + '}}}', Prism.highlight(t, env.grammar, 'php').replace(/\$/g, '$$$$')); + } + env.element.innerHTML = env.highlightedCode; + }); + Prism.hooks.add('wrap', function (env) { + if (env.language === 'php' && env.type === 'markup') { + env.content = env.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g, '$1'); + } + }); + Prism.languages.insertBefore('php', 'comment', { + markup: { + pattern: /<[^?]\/?(.*?)>/, + inside: Prism.languages.markup + }, + php: /\{\{\{PHP[0-9]+\}\}\}/ + }); + } + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string': /"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)[a-z0-9_]+/i, + lookbehind: true + }, + 'keyword': /\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/, + 'boolean': /\b(?:True|False)\b/, + 'number': /\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/, + 'punctuation': /[{}[\];(),.:]/ + }; + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + comment: /#(?!\{[^\r\n]*?\}).*/, + keyword: /\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + delimiter: { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.util.clone(Prism.languages.ruby) + } + }; + Prism.languages.insertBefore('ruby', 'keyword', { + regex: [ + { + pattern: /%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/, + inside: { interpolation: interpolation } + }, + { + pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, + inside: { interpolation: interpolation } + }, + { + pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, + inside: { interpolation: interpolation } + }, + { + pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/, + inside: { interpolation: interpolation } + }, + { + pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, + inside: { interpolation: interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/, + lookbehind: true + } + ], + variable: /[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/, + symbol: /:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/ + }); + Prism.languages.insertBefore('ruby', 'number', { + builtin: /\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + constant: /\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/, + inside: { interpolation: interpolation } + }, + { + pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, + inside: { interpolation: interpolation } + }, + { + pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, + inside: { interpolation: interpolation } + }, + { + pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/, + inside: { interpolation: interpolation } + }, + { + pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, + inside: { interpolation: interpolation } + }, + { + pattern: /("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/, + inside: { interpolation: interpolation } + } + ]; + }(Prism)); + + function isCodeSample(elm) { + return elm && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1; + } + function trimArg(predicateFn) { + return function (arg1, arg2) { + return predicateFn(arg2); + }; + } + var Utils = { + isCodeSample: isCodeSample, + trimArg: trimArg + }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection.getNode(); + if (Utils.isCodeSample(node)) { + return node; + } + return null; + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + if (node) { + editor.dom.setAttrib(node, 'class', 'language-' + language); + node.innerHTML = code; + Prism.highlightElement(node); + editor.selection.select(node); + } else { + editor.insertContent('
        ' + code + '
        '); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + } + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + if (node) { + return node.textContent; + } + return ''; + }; + var CodeSample = { + getSelectedCodeSample: getSelectedCodeSample, + insertCodeSample: insertCodeSample, + getCurrentCode: getCurrentCode + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = Settings.getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor) { + var matches; + var node = CodeSample.getSelectedCodeSample(editor); + if (node) { + matches = node.className.match(/language-(\w+)/); + return matches ? matches[1] : ''; + } + return ''; + }; + var Languages = { + getLanguages: getLanguages$1, + getCurrentLanguage: getCurrentLanguage + }; + + var Dialog = { + open: function (editor) { + var minWidth = Settings.getDialogMinWidth(editor); + var minHeight = Settings.getDialogMinHeight(editor); + var currentLanguage = Languages.getCurrentLanguage(editor); + var currentLanguages = Languages.getLanguages(editor); + var currentCode = CodeSample.getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit code sample', + minWidth: minWidth, + minHeight: minHeight, + layout: 'flex', + direction: 'column', + align: 'stretch', + body: [ + { + type: 'listbox', + name: 'language', + label: 'Language', + maxWidth: 200, + value: currentLanguage, + values: currentLanguages + }, + { + type: 'textbox', + name: 'code', + multiline: true, + spellcheck: false, + ariaLabel: 'Code view', + flex: 1, + style: 'direction: ltr; text-align: left', + classes: 'monospace', + value: currentCode, + autofocus: true + } + ], + onSubmit: function (e) { + CodeSample.insertCodeSample(editor, e.data.language, e.data.code); + } + }); + } + }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || Utils.isCodeSample(node)) { + Dialog.open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + var Commands = { register: register }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(Utils.trimArg(Utils.isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(Utils.trimArg(Utils.isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = false; + elm.innerHTML = editor.dom.encode(elm.textContent); + Prism.highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + var FilterContent = { setup: setup }; + + var loadCss = function (editor, pluginUrl, addedInlineCss, addedCss) { + var linkElm; + var contentCss = Settings.getContentCss(editor); + if (editor.inline && addedInlineCss.get()) { + return; + } + if (!editor.inline && addedCss.get()) { + return; + } + if (editor.inline) { + addedInlineCss.set(true); + } else { + addedCss.set(true); + } + if (contentCss !== false) { + linkElm = editor.dom.create('link', { + rel: 'stylesheet', + href: contentCss ? contentCss : pluginUrl + '/css/prism.css' + }); + editor.getDoc().getElementsByTagName('head')[0].appendChild(linkElm); + } + }; + var LoadCss = { loadCss: loadCss }; + + var register$1 = function (editor) { + editor.addButton('codesample', { + cmd: 'codesample', + title: 'Insert/Edit code sample' + }); + editor.addMenuItem('codesample', { + cmd: 'codesample', + text: 'Code sample', + icon: 'codesample' + }); + }; + var Buttons = { register: register$1 }; + + var addedInlineCss = Cell(false); + global.add('codesample', function (editor, pluginUrl) { + var addedCss = Cell(false); + FilterContent.setup(editor); + Buttons.register(editor); + Commands.register(editor); + editor.on('init', function () { + LoadCss.loadCss(editor, pluginUrl, addedInlineCss, addedCss); + }); + editor.on('dblclick', function (ev) { + if (Utils.isCodeSample(ev.target)) { + Dialog.open(editor); + } + }); + }); + function Plugin () { + } + + return Plugin; + +}(window)); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000000..c50f3b25cb --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1 @@ +!function(u){"use strict";var n=function(e){var t=e,a=function(){return t};return{get:a,set:function(e){t=e},clone:function(){return n(a())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),s=function(e){return e.settings.codesample_content_css},a=function(e){return e.settings.codesample_languages},o=function(e){return Math.min(i.DOM.getViewPort().w,e.getParam("codesample_dialog_width",800))},l=function(e){return Math.min(i.DOM.getViewPort().w,e.getParam("codesample_dialog_height",650))},t={},r=t,g=void 0!==t?t:"undefined"!=typeof WorkerGlobalScope&&u.self instanceof WorkerGlobalScope?u.self:{},c=function(){var c=/\blang(?:uage)?-(?!\*)(\w+)\b/i,S=g.Prism={util:{encode:function(e){return e instanceof o?new o(e.type,S.util.encode(e.content),e.alias):"Array"===S.util.type(e)?e.map(S.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(h instanceof n)){c.lastIndex=0;var m=c.exec(h);if(m){g&&(d=m[1].length);var b=m.index-1+d,y=b+(m=m[0].slice(d)).length,v=h.slice(0,b+1),k=h.slice(y+1),w=[f,1];v&&w.push(v);var x=new n(s,u?S.tokenize(m,u):m,p);w.push(x),k&&w.push(k),Array.prototype.splice.apply(i,w)}}}}}return i},hooks:{all:{},add:function(e,t){var a=S.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=S.hooks.all[e];if(a&&a.length)for(var n=0,i=void 0;i=a[n++];)i(t)}}},o=S.Token=function(e,t,a){this.type=e,this.content=t,this.alias=a};if(o.stringify=function(t,a,e){if("string"==typeof t)return t;if("Array"===S.util.type(t))return t.map(function(e){return o.stringify(e,a,t)}).join("");var n={type:t.type,content:o.stringify(t.content,a,e),tag:"span",classes:["token",t.type],attributes:{},language:a,parent:e};if("comment"===n.type&&(n.attributes.spellcheck="true"),t.alias){var i="Array"===S.util.type(t.alias)?t.alias:[t.alias];Array.prototype.push.apply(n.classes,i)}S.hooks.run("wrap",n);var r="";for(var s in n.attributes)r+=(r?" ":"")+s+'="'+(n.attributes[s]||"")+'"';return"<"+n.tag+' class="'+n.classes.join(" ")+'" '+r+">"+n.content+""},!g.document)return g.addEventListener&&g.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,n=t.code,i=t.immediateClose;g.postMessage(S.highlight(n,S.languages[a],a)),i&&g.close()},!1),g.Prism}();void 0!==r&&(r.Prism=c),c.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},c.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),c.languages.xml=c.languages.markup,c.languages.html=c.languages.markup,c.languages.mathml=c.languages.markup,c.languages.svg=c.languages.markup,c.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},c.languages.css.atrule.inside.rest=c.util.clone(c.languages.css),c.languages.markup&&(c.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/i,inside:{tag:{pattern:/|<\/style>/i,inside:c.languages.markup.tag.inside},rest:c.languages.css},alias:"language-css"}}),c.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:c.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:c.languages.css}},alias:"language-css"}},c.languages.markup.tag)),c.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},c.languages.javascript=c.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),c.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),c.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:c.languages.javascript}},string:/[\s\S]+/}}}),c.languages.markup&&c.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/i,inside:{tag:{pattern:/|<\/script>/i,inside:c.languages.markup.tag.inside},rest:c.languages.javascript},alias:"language-javascript"}}),c.languages.js=c.languages.javascript,c.languages.c=c.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),c.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete c.languages.c["class-name"],delete c.languages.c["boolean"],c.languages.csharp=c.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),c.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),c.languages.cpp=c.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),c.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),c.languages.java=c.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),c.languages.php=c.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),c.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),c.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),c.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),c.languages.markup&&(c.hooks.add("before-highlight",function(t){"php"===t.language&&(t.tokenStack=[],t.backupCode=t.code,t.code=t.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(e){return t.tokenStack.push(e),"{{{PHP"+t.tokenStack.length+"}}}"}))}),c.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),c.hooks.add("after-highlight",function(e){if("php"===e.language){for(var t=0,a=void 0;a=e.tokenStack[t];t++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(t+1)+"}}}",c.highlight(a,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),c.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),c.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:c.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),c.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(e){e.languages.ruby=e.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var t={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:t}},{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:t}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:t}}]}(c);var d={isCodeSample:function(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")},trimArg:function(a){return function(e,t){return a(t)}}},p=function(e){var t=e.selection.getNode();return d.isCodeSample(t)?t:null},f=p,h=function(t,a,n){t.undoManager.transact(function(){var e=p(t);n=i.DOM.encode(n),e?(t.dom.setAttrib(e,"class","language-"+a),e.innerHTML=n,c.highlightElement(e),t.selection.select(e)):(t.insertContent('
        '+n+"
        "),t.selection.select(t.$("#__new").removeAttr("id")[0]))})},m=function(e){var t=p(e);return t?t.textContent:""},b=function(e){var t=a(e);return t||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}]},y=function(e){var t,a=f(e);return a&&(t=a.className.match(/language-(\w+)/))?t[1]:""},v=function(t){var e=o(t),a=l(t),n=y(t),i=b(t),r=m(t);t.windowManager.open({title:"Insert/Edit code sample",minWidth:e,minHeight:a,layout:"flex",direction:"column",align:"stretch",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:n,values:i},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:r,autofocus:!0}],onSubmit:function(e){h(t,e.data.language,e.data.code)}})},k=function(t){t.addCommand("codesample",function(){var e=t.selection.getNode();t.selection.isCollapsed()||d.isCodeSample(e)?v(t):t.formatter.toggle("code")})},w=function(a){var i=a.$;a.on("PreProcess",function(e){i("pre[contenteditable=false]",e.node).filter(d.trimArg(d.isCodeSample)).each(function(e,t){var a=i(t),n=t.textContent;a.attr("class",i.trim(a.attr("class"))),a.removeAttr("contentEditable"),a.empty().append(i("").each(function(){this.textContent=n}))})}),a.on("SetContent",function(){var e=i("pre").filter(d.trimArg(d.isCodeSample)).filter(function(e,t){return"false"!==t.contentEditable});e.length&&a.undoManager.transact(function(){e.each(function(e,t){i(t).find("br").each(function(e,t){t.parentNode.replaceChild(a.getDoc().createTextNode("\n"),t)}),t.contentEditable=!1,t.innerHTML=a.dom.encode(t.textContent),c.highlightElement(t),t.className=i.trim(t.className)})})})},x=function(e,t,a,n){var i,r=s(e);e.inline&&a.get()||!e.inline&&n.get()||(e.inline?a.set(!0):n.set(!0),!1!==r&&(i=e.dom.create("link",{rel:"stylesheet",href:r||t+"/css/prism.css"}),e.getDoc().getElementsByTagName("head")[0].appendChild(i)))},S=function(e){e.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),e.addMenuItem("codesample",{cmd:"codesample",text:"Code sample",icon:"codesample"})},C=n(!1);e.add("codesample",function(t,e){var a=n(!1);w(t),S(t),k(t),t.on("init",function(){x(t,e,C,a)}),t.on("dblclick",function(e){d.isCodeSample(e.target)&&v(t)})})}(window); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/colorpicker/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 0000000000..04872b3c7a --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,126 @@ +(function () { +var colorpicker = (function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Color'); + + var showPreview = function (win, hexColor) { + win.find('#preview')[0].getEl().style.background = hexColor; + }; + var setColor = function (win, value) { + var color = global$1(value), rgb = color.toRgb(); + win.fromJSON({ + r: rgb.r, + g: rgb.g, + b: rgb.b, + hex: color.toHex().substr(1) + }); + showPreview(win, color.toHex()); + }; + var open = function (editor, callback, value) { + var win = editor.windowManager.open({ + title: 'Color', + items: { + type: 'container', + layout: 'flex', + direction: 'row', + align: 'stretch', + padding: 5, + spacing: 10, + items: [ + { + type: 'colorpicker', + value: value, + onchange: function () { + var rgb = this.rgb(); + if (win) { + win.find('#r').value(rgb.r); + win.find('#g').value(rgb.g); + win.find('#b').value(rgb.b); + win.find('#hex').value(this.value().substr(1)); + showPreview(win, this.value()); + } + } + }, + { + type: 'form', + padding: 0, + labelGap: 5, + defaults: { + type: 'textbox', + size: 7, + value: '0', + flex: 1, + spellcheck: false, + onchange: function () { + var colorPickerCtrl = win.find('colorpicker')[0]; + var name, value; + name = this.name(); + value = this.value(); + if (name === 'hex') { + value = '#' + value; + setColor(win, value); + colorPickerCtrl.value(value); + return; + } + value = { + r: win.find('#r').value(), + g: win.find('#g').value(), + b: win.find('#b').value() + }; + colorPickerCtrl.value(value); + setColor(win, value); + } + }, + items: [ + { + name: 'r', + label: 'R', + autofocus: 1 + }, + { + name: 'g', + label: 'G' + }, + { + name: 'b', + label: 'B' + }, + { + name: 'hex', + label: '#', + value: '000000' + }, + { + name: 'preview', + type: 'container', + border: 1 + } + ] + } + ] + }, + onSubmit: function () { + callback('#' + win.toJSON().hex); + } + }); + setColor(win, value); + }; + var Dialog = { open: open }; + + global.add('colorpicker', function (editor) { + if (!editor.settings.color_picker_callback) { + editor.settings.color_picker_callback = function (callback, value) { + Dialog.open(editor, callback, value); + }; + } + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/colorpicker/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000000..10317a5f6f --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Color"),a=function(e,n){e.find("#preview")[0].getEl().style.background=n},o=function(e,n){var i=l(n),t=i.toRgb();e.fromJSON({r:t.r,g:t.g,b:t.b,hex:i.toHex().substr(1)}),a(e,i.toHex())},t=function(e,n,i){var t=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:i,onchange:function(){var e=this.rgb();t&&(t.find("#r").value(e.r),t.find("#g").value(e.g),t.find("#b").value(e.b),t.find("#hex").value(this.value().substr(1)),a(t,this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,n,i=t.find("colorpicker")[0];if(e=this.name(),n=this.value(),"hex"===e)return o(t,n="#"+n),void i.value(n);n={r:t.find("#r").value(),g:t.find("#g").value(),b:t.find("#b").value()},i.value(n),o(t,n)}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){n("#"+t.toJSON().hex)}});o(t,i)};e.add("colorpicker",function(i){i.settings.color_picker_callback||(i.settings.color_picker_callback=function(e,n){t(i,e,n)})})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/css/dialog.css b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/css/dialog.css new file mode 100644 index 0000000000..274743b2e1 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/css/dialog.css @@ -0,0 +1,118 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(../img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(../img/buttons.png) 0 -52px} +#cancel {background:url(../img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../img/icons.gif) -20px 0 no-repeat; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(../img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(../img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(../img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(../img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(../img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} +#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} +#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/buttons.png b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/buttons.png new file mode 100644 index 0000000000..1e53560e0a Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/buttons.png differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/icons.gif b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/icons.gif new file mode 100644 index 0000000000..ca22249018 Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/icons.gif differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/items.gif b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/items.gif new file mode 100644 index 0000000000..d2f93671ca Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/items.gif differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/menu_arrow.gif b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/menu_arrow.gif new file mode 100644 index 0000000000..85e31dfb2d Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/menu_arrow.gif differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/menu_check.gif b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/menu_check.gif new file mode 100644 index 0000000000..adfdddccd7 Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/menu_check.gif differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/progress.gif b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/progress.gif new file mode 100644 index 0000000000..5bb90fd6a4 Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/progress.gif differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/tabs.gif b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/tabs.gif new file mode 100644 index 0000000000..06812cb410 Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/img/tabs.gif differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/plugin.js new file mode 100644 index 0000000000..92d433edcd --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/plugin.js @@ -0,0 +1,322 @@ +/** + * plugin.js + * + * Released under LGPL License. + * Copyright (c) 1999-2017 Ephox Corp. All rights reserved + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +/*global tinymce:true, console:true */ +/*eslint no-console:0, new-cap:0 */ + +/** + * This plugin adds missing events form the 4.x API back. Not every event is + * properly supported but most things should work. + * + * Unsupported things: + * - No editor.onEvent + * - Can't cancel execCommands with beforeExecCommand + */ +(function (tinymce) { + var reported; + + function noop() { + } + + function log(apiCall) { + if (!reported && window && window.console) { + reported = true; + console.log("Deprecated TinyMCE API call: " + apiCall); + } + } + + function Dispatcher(target, newEventName, argsMap, defaultScope) { + target = target || this; + var cbs = []; + + if (!newEventName) { + this.add = this.addToTop = this.remove = this.dispatch = noop; + return; + } + + this.add = function (callback, scope, prepend) { + log('.on' + newEventName + ".add(..)"); + + // Convert callback({arg1:x, arg2:x}) -> callback(arg1, arg2) + function patchedEventCallback(e) { + var callbackArgs = []; + + if (typeof argsMap == "string") { + argsMap = argsMap.split(" "); + } + + if (argsMap && typeof argsMap !== "function") { + for (var i = 0; i < argsMap.length; i++) { + callbackArgs.push(e[argsMap[i]]); + } + } + + if (typeof argsMap == "function") { + callbackArgs = argsMap(newEventName, e, target); + if (!callbackArgs) { + return; + } + } + + if (!argsMap) { + callbackArgs = [e]; + } + + callbackArgs.unshift(defaultScope || target); + + if (callback.apply(scope || defaultScope || target, callbackArgs) === false) { + e.stopImmediatePropagation(); + } + } + + target.on(newEventName, patchedEventCallback, prepend); + + var handlers = { + original: callback, + patched: patchedEventCallback + }; + + cbs.push(handlers); + return patchedEventCallback; + }; + + this.addToTop = function (callback, scope) { + this.add(callback, scope, true); + }; + + this.remove = function (callback) { + cbs.forEach(function (item, i) { + if (item.original === callback) { + cbs.splice(i, 1); + return target.off(newEventName, item.patched); + } + }); + + return target.off(newEventName, callback); + }; + + this.dispatch = function () { + target.fire(newEventName); + return true; + }; + } + + tinymce.util.Dispatcher = Dispatcher; + tinymce.onBeforeUnload = new Dispatcher(tinymce, "BeforeUnload"); + tinymce.onAddEditor = new Dispatcher(tinymce, "AddEditor", "editor"); + tinymce.onRemoveEditor = new Dispatcher(tinymce, "RemoveEditor", "editor"); + + tinymce.util.Cookie = { + get: noop, getHash: noop, remove: noop, set: noop, setHash: noop + }; + + function patchEditor(editor) { + + function translate(str) { + var prefix = editor.settings.language || "en"; + var prefixedStr = [prefix, str].join('.'); + var translatedStr = tinymce.i18n.translate(prefixedStr); + + return prefixedStr !== translatedStr ? translatedStr : tinymce.i18n.translate(str); + } + + function patchEditorEvents(oldEventNames, argsMap) { + tinymce.each(oldEventNames.split(" "), function (oldName) { + editor["on" + oldName] = new Dispatcher(editor, oldName, argsMap); + }); + } + + function convertUndoEventArgs(type, event, target) { + return [ + event.level, + target + ]; + } + + function filterSelectionEvents(needsSelection) { + return function (type, e) { + if ((!e.selection && !needsSelection) || e.selection == needsSelection) { + return [e]; + } + }; + } + + if (editor.controlManager) { + return; + } + + function cmNoop() { + var obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' + + 'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' + + 'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' + + 'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update'; + + log('editor.controlManager.*'); + + function _noop() { + return cmNoop(); + } + + tinymce.each(methods.split(' '), function (method) { + obj[method] = _noop; + }); + + return obj; + } + + editor.controlManager = { + buttons: {}, + + setDisabled: function (name, state) { + log("controlManager.setDisabled(..)"); + + if (this.buttons[name]) { + this.buttons[name].disabled(state); + } + }, + + setActive: function (name, state) { + log("controlManager.setActive(..)"); + + if (this.buttons[name]) { + this.buttons[name].active(state); + } + }, + + onAdd: new Dispatcher(), + onPostRender: new Dispatcher(), + + add: function (obj) { + return obj; + }, + createButton: cmNoop, + createColorSplitButton: cmNoop, + createControl: cmNoop, + createDropMenu: cmNoop, + createListBox: cmNoop, + createMenuButton: cmNoop, + createSeparator: cmNoop, + createSplitButton: cmNoop, + createToolbar: cmNoop, + createToolbarGroup: cmNoop, + destroy: noop, + get: noop, + setControlType: cmNoop + }; + + patchEditorEvents("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate", "editor"); + patchEditorEvents("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"); + patchEditorEvents("BeforeExecCommand ExecCommand", "command ui value args"); // args.terminate not supported + patchEditorEvents("PreProcess PostProcess LoadContent SaveContent Change"); + patchEditorEvents("BeforeSetContent BeforeGetContent SetContent GetContent", filterSelectionEvents(false)); + patchEditorEvents("SetProgressState", "state time"); + patchEditorEvents("VisualAid", "element hasVisual"); + patchEditorEvents("Undo Redo", convertUndoEventArgs); + + patchEditorEvents("NodeChange", function (type, e) { + return [ + editor.controlManager, + e.element, + editor.selection.isCollapsed(), + e + ]; + }); + + var originalAddButton = editor.addButton; + editor.addButton = function (name, settings) { + var originalOnPostRender; + + function patchedPostRender() { + editor.controlManager.buttons[name] = this; + + if (originalOnPostRender) { + return originalOnPostRender.apply(this, arguments); + } + } + + for (var key in settings) { + if (key.toLowerCase() === "onpostrender") { + originalOnPostRender = settings[key]; + settings.onPostRender = patchedPostRender; + } + } + + if (!originalOnPostRender) { + settings.onPostRender = patchedPostRender; + } + + if (settings.title) { + settings.title = translate(settings.title); + } + + return originalAddButton.call(this, name, settings); + }; + + editor.on('init', function () { + var undoManager = editor.undoManager, selection = editor.selection; + + undoManager.onUndo = new Dispatcher(editor, "Undo", convertUndoEventArgs, null, undoManager); + undoManager.onRedo = new Dispatcher(editor, "Redo", convertUndoEventArgs, null, undoManager); + undoManager.onBeforeAdd = new Dispatcher(editor, "BeforeAddUndo", null, undoManager); + undoManager.onAdd = new Dispatcher(editor, "AddUndo", null, undoManager); + + selection.onBeforeGetContent = new Dispatcher(editor, "BeforeGetContent", filterSelectionEvents(true), selection); + selection.onGetContent = new Dispatcher(editor, "GetContent", filterSelectionEvents(true), selection); + selection.onBeforeSetContent = new Dispatcher(editor, "BeforeSetContent", filterSelectionEvents(true), selection); + selection.onSetContent = new Dispatcher(editor, "SetContent", filterSelectionEvents(true), selection); + }); + + editor.on('BeforeRenderUI', function () { + var windowManager = editor.windowManager; + + windowManager.onOpen = new Dispatcher(); + windowManager.onClose = new Dispatcher(); + windowManager.createInstance = function (className, a, b, c, d, e) { + log("windowManager.createInstance(..)"); + + var constr = tinymce.resolve(className); + return new constr(a, b, c, d, e); + }; + }); + } + + tinymce.on('SetupEditor', function (e) { + patchEditor(e.editor); + }); + + tinymce.PluginManager.add("compat3x", patchEditor); + + tinymce.addI18n = function (prefix, o) { + var I18n = tinymce.util.I18n, each = tinymce.each; + + if (typeof prefix == "string" && prefix.indexOf('.') === -1) { + I18n.add(prefix, o); + return; + } + + if (!tinymce.is(prefix, 'string')) { + each(prefix, function (o, lc) { + each(o, function (o, g) { + each(o, function (o, k) { + if (g === 'common') { + I18n.data[lc + '.' + k] = o; + } else { + I18n.data[lc + '.' + g + '.' + k] = o; + } + }); + }); + }); + } else { + each(o, function (o, k) { + I18n.data[prefix + '.' + k] = o; + }); + } + }; +})(tinymce); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/plugin.min.js new file mode 100644 index 0000000000..8562cb7c76 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/plugin.min.js @@ -0,0 +1 @@ +!function(u){var t;function l(){}function f(e){!t&&window&&window.console&&(t=!0,console.log("Deprecated TinyMCE API call: "+e))}function i(i,a,d,s){i=i||this;var c=[];a?(this.add=function(o,r,e){function t(e){var t=[];if("string"==typeof d&&(d=d.split(" ")),d&&"function"!=typeof d)for(var n=0;n.on"+a+".add(..)"),i.on(a,t,e);var n={original:o,patched:t};return c.push(n),t},this.addToTop=function(e,t){this.add(e,t,!0)},this.remove=function(n){return c.forEach(function(e,t){if(e.original===n)return c.splice(t,1),i.off(a,e.patched)}),i.off(a,n)},this.dispatch=function(){return i.fire(a),!0}):this.add=this.addToTop=this.remove=this.dispatch=l}function n(s){function e(e,t){u.each(e.split(" "),function(e){s["on"+e]=new i(s,e,t)})}function n(e,t,n){return[t.level,n]}function o(n){return function(e,t){if(!t.selection&&!n||t.selection==n)return[t]}}if(!s.controlManager){s.controlManager={buttons:{},setDisabled:function(e,t){f("controlManager.setDisabled(..)"),this.buttons[e]&&this.buttons[e].disabled(t)},setActive:function(e,t){f("controlManager.setActive(..)"),this.buttons[e]&&this.buttons[e].active(t)},onAdd:new i,onPostRender:new i,add:function(e){return e},createButton:r,createColorSplitButton:r,createControl:r,createDropMenu:r,createListBox:r,createMenuButton:r,createSeparator:r,createSplitButton:r,createToolbar:r,createToolbarGroup:r,destroy:l,get:l,setControlType:r},e("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate","editor"),e("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"),e("BeforeExecCommand ExecCommand","command ui value args"),e("PreProcess PostProcess LoadContent SaveContent Change"),e("BeforeSetContent BeforeGetContent SetContent GetContent",o(!1)),e("SetProgressState","state time"),e("VisualAid","element hasVisual"),e("Undo Redo",n),e("NodeChange",function(e,t){return[s.controlManager,t.element,s.selection.isCollapsed(),t]});var c=s.addButton;s.addButton=function(e,t){var n,o,r,i;function a(){if(s.controlManager.buttons[e]=this,n)return n.apply(this,arguments)}for(var d in t)"onpostrender"===d.toLowerCase()&&(n=t[d],t.onPostRender=a);return n||(t.onPostRender=a),t.title&&(t.title=(o=t.title,r=[s.settings.language||"en",o].join("."),i=u.i18n.translate(r),r!==i?i:u.i18n.translate(o))),c.call(this,e,t)},s.on("init",function(){var e=s.undoManager,t=s.selection;e.onUndo=new i(s,"Undo",n,null,e),e.onRedo=new i(s,"Redo",n,null,e),e.onBeforeAdd=new i(s,"BeforeAddUndo",null,e),e.onAdd=new i(s,"AddUndo",null,e),t.onBeforeGetContent=new i(s,"BeforeGetContent",o(!0),t),t.onGetContent=new i(s,"GetContent",o(!0),t),t.onBeforeSetContent=new i(s,"BeforeSetContent",o(!0),t),t.onSetContent=new i(s,"SetContent",o(!0),t)}),s.on("BeforeRenderUI",function(){var e=s.windowManager;e.onOpen=new i,e.onClose=new i,e.createInstance=function(e,t,n,o,r,i){return f("windowManager.createInstance(..)"),new(u.resolve(e))(t,n,o,r,i)}})}function r(){var t={};function n(){return r()}return f("editor.controlManager.*"),u.each("add addMenu addSeparator collapse createMenu destroy displayColor expand focus getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex setActive setAriaProperty setColor setDisabled setSelected setState showMenu update".split(" "),function(e){t[e]=n}),t}}u.util.Dispatcher=i,u.onBeforeUnload=new i(u,"BeforeUnload"),u.onAddEditor=new i(u,"AddEditor","editor"),u.onRemoveEditor=new i(u,"RemoveEditor","editor"),u.util.Cookie={get:l,getHash:l,remove:l,set:l,setHash:l},u.on("SetupEditor",function(e){n(e.editor)}),u.PluginManager.add("compat3x",n),u.addI18n=function(n,e){var r=u.util.I18n,t=u.each;"string"!=typeof n||-1!==n.indexOf(".")?u.is(n,"string")?t(e,function(e,t){r.data[n+"."+t]=e}):t(n,function(e,o){t(e,function(e,n){t(e,function(e,t){"common"===n?r.data[o+"."+t]=e:r.data[o+"."+n+"."+t]=e})})}):r.add(n,e)}}(tinymce); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/tiny_mce_popup.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/tiny_mce_popup.js new file mode 100644 index 0000000000..92e87effe3 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/tiny_mce_popup.js @@ -0,0 +1,542 @@ +/** + * tinymce_mce_popup.js + * + * Released under LGPL License. + * Copyright (c) 1999-2017 Ephox Corp. All rights reserved + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +var tinymce, tinyMCE; + +/** + * TinyMCE popup/dialog helper class. This gives you easy access to the + * parent editor instance and a bunch of other things. It's higly recommended + * that you load this script into your dialogs. + * + * @static + * @class tinyMCEPopup + */ +var tinyMCEPopup = { + /** + * Initializes the popup this will be called automatically. + * + * @method init + */ + init: function () { + var self = this, parentWin, settings, uiWindow; + + // Find window & API + parentWin = self.getWin(); + tinymce = tinyMCE = parentWin.tinymce; + self.editor = tinymce.EditorManager.activeEditor; + self.params = self.editor.windowManager.getParams(); + + uiWindow = self.editor.windowManager.windows[self.editor.windowManager.windows.length - 1]; + self.features = uiWindow.features; + self.uiWindow = uiWindow; + + settings = self.editor.settings; + + // Setup popup CSS path(s) + if (settings.popup_css !== false) { + if (settings.popup_css) { + settings.popup_css = self.editor.documentBaseURI.toAbsolute(settings.popup_css); + } else { + settings.popup_css = self.editor.baseURI.toAbsolute("plugins/compat3x/css/dialog.css"); + } + } + + if (settings.popup_css_add) { + settings.popup_css += ',' + self.editor.documentBaseURI.toAbsolute(settings.popup_css_add); + } + + // Setup local DOM + self.dom = self.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document, { + ownEvents: true, + proxy: tinyMCEPopup._eventProxy + }); + + self.dom.bind(window, 'ready', self._onDOMLoaded, self); + + // Enables you to skip loading the default css + if (self.features.popup_css !== false) { + self.dom.loadCSS(self.features.popup_css || self.editor.settings.popup_css); + } + + // Setup on init listeners + self.listeners = []; + + /** + * Fires when the popup is initialized. + * + * @event onInit + * @param {tinymce.Editor} editor Editor instance. + * @example + * // Alerts the selected contents when the dialog is loaded + * tinyMCEPopup.onInit.add(function(ed) { + * alert(ed.selection.getContent()); + * }); + * + * // Executes the init method on page load in some object using the SomeObject scope + * tinyMCEPopup.onInit.add(SomeObject.init, SomeObject); + */ + self.onInit = { + add: function (func, scope) { + self.listeners.push({ func: func, scope: scope }); + } + }; + + self.isWindow = !self.getWindowArg('mce_inline'); + self.id = self.getWindowArg('mce_window_id'); + }, + + /** + * Returns the reference to the parent window that opened the dialog. + * + * @method getWin + * @return {Window} Reference to the parent window that opened the dialog. + */ + getWin: function () { + // Added frameElement check to fix bug: #2817583 + return (!window.frameElement && window.dialogArguments) || opener || parent || top; + }, + + /** + * Returns a window argument/parameter by name. + * + * @method getWindowArg + * @param {String} name Name of the window argument to retrieve. + * @param {String} defaultValue Optional default value to return. + * @return {String} Argument value or default value if it wasn't found. + */ + getWindowArg: function (name, defaultValue) { + var value = this.params[name]; + + return tinymce.is(value) ? value : defaultValue; + }, + + /** + * Returns a editor parameter/config option value. + * + * @method getParam + * @param {String} name Name of the editor config option to retrieve. + * @param {String} defaultValue Optional default value to return. + * @return {String} Parameter value or default value if it wasn't found. + */ + getParam: function (name, defaultValue) { + return this.editor.getParam(name, defaultValue); + }, + + /** + * Returns a language item by key. + * + * @method getLang + * @param {String} name Language item like mydialog.something. + * @param {String} defaultValue Optional default value to return. + * @return {String} Language value for the item like "my string" or the default value if it wasn't found. + */ + getLang: function (name, defaultValue) { + return this.editor.getLang(name, defaultValue); + }, + + /** + * Executed a command on editor that opened the dialog/popup. + * + * @method execCommand + * @param {String} cmd Command to execute. + * @param {Boolean} ui Optional boolean value if the UI for the command should be presented or not. + * @param {Object} val Optional value to pass with the comman like an URL. + * @param {Object} a Optional arguments object. + */ + execCommand: function (cmd, ui, val, args) { + args = args || {}; + args.skip_focus = 1; + + this.restoreSelection(); + return this.editor.execCommand(cmd, ui, val, args); + }, + + /** + * Resizes the dialog to the inner size of the window. This is needed since various browsers + * have different border sizes on windows. + * + * @method resizeToInnerSize + */ + resizeToInnerSize: function () { + /*var self = this; + + // Detach it to workaround a Chrome specific bug + // https://sourceforge.net/tracker/?func=detail&atid=635682&aid=2926339&group_id=103281 + setTimeout(function() { + var vp = self.dom.getViewPort(window); + + self.editor.windowManager.resizeBy( + self.getWindowArg('mce_width') - vp.w, + self.getWindowArg('mce_height') - vp.h, + self.id || window + ); + }, 10);*/ + }, + + /** + * Will executed the specified string when the page has been loaded. This function + * was added for compatibility with the 2.x branch. + * + * @method executeOnLoad + * @param {String} evil String to evalutate on init. + */ + executeOnLoad: function (evil) { + this.onInit.add(function () { + eval(evil); + }); + }, + + /** + * Stores the current editor selection for later restoration. This can be useful since some browsers + * looses it's selection if a control element is selected/focused inside the dialogs. + * + * @method storeSelection + */ + storeSelection: function () { + this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark(1); + }, + + /** + * Restores any stored selection. This can be useful since some browsers + * looses it's selection if a control element is selected/focused inside the dialogs. + * + * @method restoreSelection + */ + restoreSelection: function () { + var self = tinyMCEPopup; + + if (!self.isWindow && tinymce.isIE) { + self.editor.selection.moveToBookmark(self.editor.windowManager.bookmark); + } + }, + + /** + * Loads a specific dialog language pack. If you pass in plugin_url as a argument + * when you open the window it will load the /langs/_dlg.js lang pack file. + * + * @method requireLangPack + */ + requireLangPack: function () { + var self = this, url = self.getWindowArg('plugin_url') || self.getWindowArg('theme_url'), settings = self.editor.settings, lang; + + if (settings.language !== false) { + lang = settings.language || "en"; + } + + if (url && lang && self.features.translate_i18n !== false && settings.language_load !== false) { + url += '/langs/' + lang + '_dlg.js'; + + if (!tinymce.ScriptLoader.isDone(url)) { + document.write(''); + tinymce.ScriptLoader.markDone(url); + } + } + }, + + /** + * Executes a color picker on the specified element id. When the user + * then selects a color it will be set as the value of the specified element. + * + * @method pickColor + * @param {DOMEvent} e DOM event object. + * @param {string} element_id Element id to be filled with the color value from the picker. + */ + pickColor: function (e, element_id) { + var el = document.getElementById(element_id), colorPickerCallback = this.editor.settings.color_picker_callback; + if (colorPickerCallback) { + colorPickerCallback.call( + this.editor, + function (value) { + el.value = value; + try { + el.onchange(); + } catch (ex) { + // Try fire event, ignore errors + } + }, + el.value + ); + } + }, + + /** + * Opens a filebrowser/imagebrowser this will set the output value from + * the browser as a value on the specified element. + * + * @method openBrowser + * @param {string} element_id Id of the element to set value in. + * @param {string} type Type of browser to open image/file/flash. + * @param {string} option Option name to get the file_broswer_callback function name from. + */ + openBrowser: function (element_id, type) { + tinyMCEPopup.restoreSelection(); + this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window); + }, + + /** + * Creates a confirm dialog. Please don't use the blocking behavior of this + * native version use the callback method instead then it can be extended. + * + * @method confirm + * @param {String} t Title for the new confirm dialog. + * @param {function} cb Callback function to be executed after the user has selected ok or cancel. + * @param {Object} s Optional scope to execute the callback in. + */ + confirm: function (t, cb, s) { + this.editor.windowManager.confirm(t, cb, s, window); + }, + + /** + * Creates a alert dialog. Please don't use the blocking behavior of this + * native version use the callback method instead then it can be extended. + * + * @method alert + * @param {String} tx Title for the new alert dialog. + * @param {function} cb Callback function to be executed after the user has selected ok. + * @param {Object} s Optional scope to execute the callback in. + */ + alert: function (tx, cb, s) { + this.editor.windowManager.alert(tx, cb, s, window); + }, + + /** + * Closes the current window. + * + * @method close + */ + close: function () { + var t = this; + + // To avoid domain relaxing issue in Opera + function close() { + t.editor.windowManager.close(window); + tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup + } + + if (tinymce.isOpera) { + t.getWin().setTimeout(close, 0); + } else { + close(); + } + }, + + // Internal functions + + _restoreSelection: function () { + var e = window.event.srcElement; + + if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) { + tinyMCEPopup.restoreSelection(); + } + }, + + /* _restoreSelection : function() { + var e = window.event.srcElement; + + // If user focus a non text input or textarea + if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text') + tinyMCEPopup.restoreSelection(); + },*/ + + _onDOMLoaded: function () { + var t = tinyMCEPopup, ti = document.title, h, nv; + + // Translate page + if (t.features.translate_i18n !== false) { + var map = { + "update": "Ok", + "insert": "Ok", + "cancel": "Cancel", + "not_set": "--", + "class_name": "Class name", + "browse": "Browse" + }; + + var langCode = (tinymce.settings ? tinymce.settings : t.editor.settings).language || 'en'; + for (var key in map) { + tinymce.i18n.data[langCode + "." + key] = tinymce.i18n.translate(map[key]); + } + + h = document.body.innerHTML; + + // Replace a=x with a="x" in IE + if (tinymce.isIE) { + h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"'); + } + + document.dir = t.editor.getParam('directionality', ''); + + if ((nv = t.editor.translate(h)) && nv != h) { + document.body.innerHTML = nv; + } + + if ((nv = t.editor.translate(ti)) && nv != ti) { + document.title = ti = nv; + } + } + + if (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) { + t.dom.addClass(document.body, 'forceColors'); + } + + document.body.style.display = ''; + + // Restore selection in IE when focus is placed on a non textarea or input element of the type text + if (tinymce.Env.ie) { + if (tinymce.Env.ie < 11) { + document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection); + + // Add base target element for it since it would fail with modal dialogs + t.dom.add(t.dom.select('head')[0], 'base', { target: '_self' }); + } else { + document.addEventListener('mouseup', tinyMCEPopup._restoreSelection, false); + } + } + + t.restoreSelection(); + t.resizeToInnerSize(); + + // Set inline title + if (!t.isWindow) { + t.editor.windowManager.setTitle(window, ti); + } else { + window.focus(); + } + + if (!tinymce.isIE && !t.isWindow) { + t.dom.bind(document, 'focus', function () { + t.editor.windowManager.focus(t.id); + }); + } + + // Patch for accessibility + tinymce.each(t.dom.select('select'), function (e) { + e.onkeydown = tinyMCEPopup._accessHandler; + }); + + // Call onInit + // Init must be called before focus so the selection won't get lost by the focus call + tinymce.each(t.listeners, function (o) { + o.func.call(o.scope, t.editor); + }); + + // Move focus to window + if (t.getWindowArg('mce_auto_focus', true)) { + window.focus(); + + // Focus element with mceFocus class + tinymce.each(document.forms, function (f) { + tinymce.each(f.elements, function (e) { + if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) { + e.focus(); + return false; // Break loop + } + }); + }); + } + + document.onkeyup = tinyMCEPopup._closeWinKeyHandler; + + if ('textContent' in document) { + t.uiWindow.getEl('head').firstChild.textContent = document.title; + } else { + t.uiWindow.getEl('head').firstChild.innerText = document.title; + } + }, + + _accessHandler: function (e) { + e = e || window.event; + + if (e.keyCode == 13 || e.keyCode == 32) { + var elm = e.target || e.srcElement; + + if (elm.onchange) { + elm.onchange(); + } + + return tinymce.dom.Event.cancel(e); + } + }, + + _closeWinKeyHandler: function (e) { + e = e || window.event; + + if (e.keyCode == 27) { + tinyMCEPopup.close(); + } + }, + + _eventProxy: function (id) { + return function (evt) { + tinyMCEPopup.dom.events.callNativeHandler(id, evt); + }; + } +}; + +tinyMCEPopup.init(); + +tinymce.util.Dispatcher = function (scope) { + this.scope = scope || this; + this.listeners = []; + + this.add = function (callback, scope) { + this.listeners.push({ cb: callback, scope: scope || this.scope }); + + return callback; + }; + + this.addToTop = function (callback, scope) { + var self = this, listener = { cb: callback, scope: scope || self.scope }; + + // Create new listeners if addToTop is executed in a dispatch loop + if (self.inDispatch) { + self.listeners = [listener].concat(self.listeners); + } else { + self.listeners.unshift(listener); + } + + return callback; + }; + + this.remove = function (callback) { + var listeners = this.listeners, output = null; + + tinymce.each(listeners, function (listener, i) { + if (callback == listener.cb) { + output = listener; + listeners.splice(i, 1); + return false; + } + }); + + return output; + }; + + this.dispatch = function () { + var self = this, returnValue, args = arguments, i, listeners = self.listeners, listener; + + self.inDispatch = true; + + // Needs to be a real loop since the listener count might change while looping + // And this is also more efficient + for (i = 0; i < listeners.length; i++) { + listener = listeners[i]; + returnValue = listener.cb.apply(listener.scope, args.length > 0 ? args : [listener.scope]); + + if (returnValue === false) { + break; + } + } + + self.inDispatch = false; + + return returnValue; + }; +}; diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/editable_selects.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/editable_selects.js new file mode 100644 index 0000000000..3dd44a8f11 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/editable_selects.js @@ -0,0 +1,72 @@ +/** + * editable_selects.js + * + * Released under LGPL License. + * Copyright (c) 1999-2017 Ephox Corp. All rights reserved + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +var TinyMCE_EditableSelects = { + editSelectElm : null, + + init : function () { + var nl = document.getElementsByTagName("select"), i, d = document, o; + + for (i = 0; i < nl.length; i++) { + if (nl[i].className.indexOf('mceEditableSelect') != -1) { + o = new Option(tinyMCEPopup.editor.translate('value'), '__mce_add_custom__'); + + o.className = 'mceAddSelectValue'; + + nl[i].options[nl[i].options.length] = o; + nl[i].onchange = TinyMCE_EditableSelects.onChangeEditableSelect; + } + } + }, + + onChangeEditableSelect : function (e) { + var d = document, ne, se = window.event ? window.event.srcElement : e.target; + + if (se.options[se.selectedIndex].value == '__mce_add_custom__') { + ne = d.createElement("input"); + ne.id = se.id + "_custom"; + ne.name = se.name + "_custom"; + ne.type = "text"; + + ne.style.width = se.offsetWidth + 'px'; + se.parentNode.insertBefore(ne, se); + se.style.display = 'none'; + ne.focus(); + ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput; + ne.onkeydown = TinyMCE_EditableSelects.onKeyDown; + TinyMCE_EditableSelects.editSelectElm = se; + } + }, + + onBlurEditableSelectInput : function () { + var se = TinyMCE_EditableSelects.editSelectElm; + + if (se) { + if (se.previousSibling.value != '') { + addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value); + selectByValue(document.forms[0], se.id, se.previousSibling.value); + } else { + selectByValue(document.forms[0], se.id, ''); + } + + se.style.display = 'inline'; + se.parentNode.removeChild(se.previousSibling); + TinyMCE_EditableSelects.editSelectElm = null; + } + }, + + onKeyDown : function (e) { + e = e || window.event; + + if (e.keyCode == 13) { + TinyMCE_EditableSelects.onBlurEditableSelectInput(); + } + } +}; diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/form_utils.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/form_utils.js new file mode 100644 index 0000000000..358ad60a9a --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/form_utils.js @@ -0,0 +1,222 @@ +/** + * form_utils.js + * + * Released under LGPL License. + * Copyright (c) 1999-2017 Ephox Corp. All rights reserved + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme")); + +function getColorPickerHTML(id, target_form_element) { + var h = "", dom = tinyMCEPopup.dom; + + if (label = dom.select('label[for=' + target_form_element + ']')[0]) { + label.id = label.id || dom.uniqueId(); + } + + h += ''; + h += ' '; + + return h; +} + +function updateColor(img_id, form_element_id) { + document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; +} + +function setBrowserDisabled(id, state) { + var img = document.getElementById(id); + var lnk = document.getElementById(id + "_link"); + + if (lnk) { + if (state) { + lnk.setAttribute("realhref", lnk.getAttribute("href")); + lnk.removeAttribute("href"); + tinyMCEPopup.dom.addClass(img, 'disabled'); + } else { + if (lnk.getAttribute("realhref")) { + lnk.setAttribute("href", lnk.getAttribute("realhref")); + } + + tinyMCEPopup.dom.removeClass(img, 'disabled'); + } + } +} + +function getBrowserHTML(id, target_form_element, type, prefix) { + var option = prefix + "_" + type + "_browser_callback", cb, html; + + cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); + + if (!cb) { + return ""; + } + + html = ""; + html += ''; + html += ' '; + + return html; +} + +function openBrowser(img_id, target_form_element, type, option) { + var img = document.getElementById(img_id); + + if (img.className != "mceButtonDisabled") { + tinyMCEPopup.openBrowser(target_form_element, type, option); + } +} + +function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { + if (!form_obj || !form_obj.elements[field_name]) { + return; + } + + if (!value) { + value = ""; + } + + var sel = form_obj.elements[field_name]; + + var found = false; + for (var i = 0; i < sel.options.length; i++) { + var option = sel.options[i]; + + if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { + option.selected = true; + found = true; + } else { + option.selected = false; + } + } + + if (!found && add_custom && value != '') { + var option = new Option(value, value); + option.selected = true; + sel.options[sel.options.length] = option; + sel.selectedIndex = sel.options.length - 1; + } + + return found; +} + +function getSelectValue(form_obj, field_name) { + var elm = form_obj.elements[field_name]; + + if (elm == null || elm.options == null || elm.selectedIndex === -1) { + return ""; + } + + return elm.options[elm.selectedIndex].value; +} + +function addSelectValue(form_obj, field_name, name, value) { + var s = form_obj.elements[field_name]; + var o = new Option(name, value); + s.options[s.options.length] = o; +} + +function addClassesToList(list_id, specific_option) { + // Setup class droplist + var styleSelectElm = document.getElementById(list_id); + var styles = tinyMCEPopup.getParam('theme_advanced_styles', false); + styles = tinyMCEPopup.getParam(specific_option, styles); + + if (styles) { + var stylesAr = styles.split(';'); + + for (var i = 0; i < stylesAr.length; i++) { + if (stylesAr != "") { + var key, value; + + key = stylesAr[i].split('=')[0]; + value = stylesAr[i].split('=')[1]; + + styleSelectElm.options[styleSelectElm.length] = new Option(key, value); + } + } + } else { + /*tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) { + styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']); + });*/ + } +} + +function isVisible(element_id) { + var elm = document.getElementById(element_id); + + return elm && elm.style.display != "none"; +} + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return "rgb(" + r + "," + g + "," + b + ")"; + } + + return col; +} + +function trimSize(size) { + return size.replace(/([0-9\.]+)(px|%|in|cm|mm|em|ex|pt|pc)/i, '$1$2'); +} + +function getCSSSize(size) { + size = trimSize(size); + + if (size == "") { + return ""; + } + + // Add px + if (/^[0-9]+$/.test(size)) { + size += 'px'; + } + // Sanity check, IE doesn't like broken values + else if (!(/^[0-9\.]+(px|%|in|cm|mm|em|ex|pt|pc)$/i.test(size))) { + return ""; + } + + return size; +} + +function getStyle(elm, attrib, style) { + var val = tinyMCEPopup.dom.getAttrib(elm, attrib); + + if (val != '') { + return '' + val; + } + + if (typeof (style) == 'undefined') { + style = attrib; + } + + return tinyMCEPopup.dom.getStyle(elm, style); +} diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/mctabs.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/mctabs.js new file mode 100644 index 0000000000..a04519be7c --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/mctabs.js @@ -0,0 +1,168 @@ +/** + * mctabs.js + * + * Released under LGPL License. + * Copyright (c) 1999-2017 Ephox Corp. All rights reserved + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +/*jshint globals: tinyMCEPopup */ + +function MCTabs() { + this.settings = []; + this.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher'); +} + +MCTabs.prototype.init = function (settings) { + this.settings = settings; +}; + +MCTabs.prototype.getParam = function (name, default_value) { + var value = null; + + value = (typeof (this.settings[name]) == "undefined") ? default_value : this.settings[name]; + + // Fix bool values + if (value == "true" || value == "false") { + return (value == "true"); + } + + return value; +}; + +MCTabs.prototype.showTab = function (tab) { + tab.className = 'current'; + tab.setAttribute("aria-selected", true); + tab.setAttribute("aria-expanded", true); + tab.tabIndex = 0; +}; + +MCTabs.prototype.hideTab = function (tab) { + var t = this; + + tab.className = ''; + tab.setAttribute("aria-selected", false); + tab.setAttribute("aria-expanded", false); + tab.tabIndex = -1; +}; + +MCTabs.prototype.showPanel = function (panel) { + panel.className = 'current'; + panel.setAttribute("aria-hidden", false); +}; + +MCTabs.prototype.hidePanel = function (panel) { + panel.className = 'panel'; + panel.setAttribute("aria-hidden", true); +}; + +MCTabs.prototype.getPanelForTab = function (tabElm) { + return tinyMCEPopup.dom.getAttrib(tabElm, "aria-controls"); +}; + +MCTabs.prototype.displayTab = function (tab_id, panel_id, avoid_focus) { + var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this; + + tabElm = document.getElementById(tab_id); + + if (panel_id === undefined) { + panel_id = t.getPanelForTab(tabElm); + } + + panelElm = document.getElementById(panel_id); + panelContainerElm = panelElm ? panelElm.parentNode : null; + tabContainerElm = tabElm ? tabElm.parentNode : null; + selectionClass = t.getParam('selection_class', 'current'); + + if (tabElm && tabContainerElm) { + nodes = tabContainerElm.childNodes; + + // Hide all other tabs + for (i = 0; i < nodes.length; i++) { + if (nodes[i].nodeName == "LI") { + t.hideTab(nodes[i]); + } + } + + // Show selected tab + t.showTab(tabElm); + } + + if (panelElm && panelContainerElm) { + nodes = panelContainerElm.childNodes; + + // Hide all other panels + for (i = 0; i < nodes.length; i++) { + if (nodes[i].nodeName == "DIV") { + t.hidePanel(nodes[i]); + } + } + + if (!avoid_focus) { + tabElm.focus(); + } + + // Show selected panel + t.showPanel(panelElm); + } +}; + +MCTabs.prototype.getAnchor = function () { + var pos, url = document.location.href; + + if ((pos = url.lastIndexOf('#')) != -1) { + return url.substring(pos + 1); + } + + return ""; +}; + + +//Global instance +var mcTabs = new MCTabs(); + +tinyMCEPopup.onInit.add(function () { + var tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each; + + each(dom.select('div.tabs'), function (tabContainerElm) { + //var keyNav; + + dom.setAttrib(tabContainerElm, "role", "tablist"); + + var items = tinyMCEPopup.dom.select('li', tabContainerElm); + var action = function (id) { + mcTabs.displayTab(id, mcTabs.getPanelForTab(id)); + mcTabs.onChange.dispatch(id); + }; + + each(items, function (item) { + dom.setAttrib(item, 'role', 'tab'); + dom.bind(item, 'click', function (evt) { + action(item.id); + }); + }); + + dom.bind(dom.getRoot(), 'keydown', function (evt) { + if (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab + //keyNav.moveFocus(evt.shiftKey ? -1 : 1); + tinymce.dom.Event.cancel(evt); + } + }); + + each(dom.select('a', tabContainerElm), function (a) { + dom.setAttrib(a, 'tabindex', '-1'); + }); + + /*keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: tabContainerElm, + items: items, + onAction: action, + actOnFocus: true, + enableLeftRight: true, + enableUpDown: true + }, tinyMCEPopup.dom);*/ + } +); +}); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/validate.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/validate.js new file mode 100644 index 0000000000..5600666d35 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/compat3x/utils/validate.js @@ -0,0 +1,267 @@ +/** + * validate.js + * + * Released under LGPL License. + * Copyright (c) 1999-2017 Ephox Corp. All rights reserved + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +/** + // String validation: + + if (!Validator.isEmail('myemail')) + alert('Invalid email.'); + + // Form validation: + + var f = document.forms['myform']; + + if (!Validator.isEmail(f.myemail)) + alert('Invalid email.'); +*/ + +var Validator = { + isEmail : function (s) { + return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$'); + }, + + isAbsUrl : function (s) { + return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$'); + }, + + isSize : function (s) { + return this.test(s, '^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)?$'); + }, + + isId : function (s) { + return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$'); + }, + + isEmpty : function (s) { + var nl, i; + + if (s.nodeName == 'SELECT' && s.selectedIndex < 1) { + return true; + } + + if (s.type == 'checkbox' && !s.checked) { + return true; + } + + if (s.type == 'radio') { + for (i = 0, nl = s.form.elements; i < nl.length; i++) { + if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked) { + return false; + } + } + + return true; + } + + return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s); + }, + + isNumber : function (s, d) { + return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$')); + }, + + test : function (s, p) { + s = s.nodeType == 1 ? s.value : s; + + return s == '' || new RegExp(p).test(s); + } +}; + +var AutoValidator = { + settings : { + id_cls : 'id', + int_cls : 'int', + url_cls : 'url', + number_cls : 'number', + email_cls : 'email', + size_cls : 'size', + required_cls : 'required', + invalid_cls : 'invalid', + min_cls : 'min', + max_cls : 'max' + }, + + init : function (s) { + var n; + + for (n in s) { + this.settings[n] = s[n]; + } + }, + + validate : function (f) { + var i, nl, s = this.settings, c = 0; + + nl = this.tags(f, 'label'); + for (i = 0; i < nl.length; i++) { + this.removeClass(nl[i], s.invalid_cls); + nl[i].setAttribute('aria-invalid', false); + } + + c += this.validateElms(f, 'input'); + c += this.validateElms(f, 'select'); + c += this.validateElms(f, 'textarea'); + + return c == 3; + }, + + invalidate : function (n) { + this.mark(n.form, n); + }, + + getErrorMessages : function (f) { + var nl, i, s = this.settings, field, msg, values, messages = [], ed = tinyMCEPopup.editor; + nl = this.tags(f, "label"); + for (i = 0; i < nl.length; i++) { + if (this.hasClass(nl[i], s.invalid_cls)) { + field = document.getElementById(nl[i].getAttribute("for")); + values = { field: nl[i].textContent }; + if (this.hasClass(field, s.min_cls, true)) { + message = ed.getLang('invalid_data_min'); + values.min = this.getNum(field, s.min_cls); + } else if (this.hasClass(field, s.number_cls)) { + message = ed.getLang('invalid_data_number'); + } else if (this.hasClass(field, s.size_cls)) { + message = ed.getLang('invalid_data_size'); + } else { + message = ed.getLang('invalid_data'); + } + + message = message.replace(/{\#([^}]+)\}/g, function (a, b) { + return values[b] || '{#' + b + '}'; + }); + messages.push(message); + } + } + return messages; + }, + + reset : function (e) { + var t = ['label', 'input', 'select', 'textarea']; + var i, j, nl, s = this.settings; + + if (e == null) { + return; + } + + for (i = 0; i < t.length; i++) { + nl = this.tags(e.form ? e.form : e, t[i]); + for (j = 0; j < nl.length; j++) { + this.removeClass(nl[j], s.invalid_cls); + nl[j].setAttribute('aria-invalid', false); + } + } + }, + + validateElms : function (f, e) { + var nl, i, n, s = this.settings, st = true, va = Validator, v; + + nl = this.tags(f, e); + for (i = 0; i < nl.length; i++) { + n = nl[i]; + + this.removeClass(n, s.invalid_cls); + + if (this.hasClass(n, s.required_cls) && va.isEmpty(n)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.number_cls) && !va.isNumber(n)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.email_cls) && !va.isEmail(n)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.size_cls) && !va.isSize(n)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.id_cls) && !va.isId(n)) { + st = this.mark(f, n); + } + + if (this.hasClass(n, s.min_cls, true)) { + v = this.getNum(n, s.min_cls); + + if (isNaN(v) || parseInt(n.value) < parseInt(v)) { + st = this.mark(f, n); + } + } + + if (this.hasClass(n, s.max_cls, true)) { + v = this.getNum(n, s.max_cls); + + if (isNaN(v) || parseInt(n.value) > parseInt(v)) { + st = this.mark(f, n); + } + } + } + + return st; + }, + + hasClass : function (n, c, d) { + return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); + }, + + getNum : function (n, c) { + c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; + c = c.replace(/[^0-9]/g, ''); + + return c; + }, + + addClass : function (n, c, b) { + var o = this.removeClass(n, c); + n.className = b ? c + (o !== '' ? (' ' + o) : '') : (o !== '' ? (o + ' ') : '') + c; + }, + + removeClass : function (n, c) { + c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); + return n.className = c !== ' ' ? c : ''; + }, + + tags : function (f, s) { + return f.getElementsByTagName(s); + }, + + mark : function (f, n) { + var s = this.settings; + + this.addClass(n, s.invalid_cls); + n.setAttribute('aria-invalid', 'true'); + this.markLabels(f, n, s.invalid_cls); + + return false; + }, + + markLabels : function (f, n, ic) { + var nl, i; + + nl = this.tags(f, "label"); + for (i = 0; i < nl.length; i++) { + if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id) { + this.addClass(nl[i], ic); + } + } + + return null; + } +}; diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/contextmenu/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 0000000000..5550f9f70b --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,168 @@ +(function () { +var contextmenu = (function () { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (visibleState) { + var isContextMenuVisible = function () { + return visibleState.get(); + }; + return { isContextMenuVisible: isContextMenuVisible }; + }; + var Api = { get: get }; + + var shouldNeverUseNative = function (editor) { + return editor.settings.contextmenu_never_use_native; + }; + var getContextMenu = function (editor) { + return editor.getParam('contextmenu', 'link openlink image inserttable | cell row column deletetable'); + }; + var Settings = { + shouldNeverUseNative: shouldNeverUseNative, + getContextMenu: getContextMenu + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var getUiContainer = function (editor) { + return global$1.DOM.select(editor.settings.ui_container)[0]; + }; + + var nu = function (x, y) { + return { + x: x, + y: y + }; + }; + var transpose = function (pos, dx, dy) { + return nu(pos.x + dx, pos.y + dy); + }; + var fromPageXY = function (e) { + return nu(e.pageX, e.pageY); + }; + var fromClientXY = function (e) { + return nu(e.clientX, e.clientY); + }; + var transposeUiContainer = function (element, pos) { + if (element && global$1.DOM.getStyle(element, 'position', true) !== 'static') { + var containerPos = global$1.DOM.getPos(element); + var dx = containerPos.x - element.scrollLeft; + var dy = containerPos.y - element.scrollTop; + return transpose(pos, -dx, -dy); + } else { + return transpose(pos, 0, 0); + } + }; + var transposeContentAreaContainer = function (element, pos) { + var containerPos = global$1.DOM.getPos(element); + return transpose(pos, containerPos.x, containerPos.y); + }; + var getPos = function (editor, e) { + if (editor.inline) { + return transposeUiContainer(getUiContainer(editor), fromPageXY(e)); + } else { + var iframePos = transposeContentAreaContainer(editor.getContentAreaContainer(), fromClientXY(e)); + return transposeUiContainer(getUiContainer(editor), iframePos); + } + }; + var Coords = { getPos: getPos }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.ui.Factory'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var renderMenu = function (editor, visibleState) { + var menu, contextmenu; + var items = []; + contextmenu = Settings.getContextMenu(editor); + global$3.each(contextmenu.split(/[ ,]/), function (name) { + var item = editor.menuItems[name]; + if (name === '|') { + item = { text: name }; + } + if (item) { + item.shortcut = ''; + items.push(item); + } + }); + for (var i = 0; i < items.length; i++) { + if (items[i].text === '|') { + if (i === 0 || i === items.length - 1) { + items.splice(i, 1); + } + } + } + menu = global$2.create('menu', { + items: items, + context: 'contextmenu', + classes: 'contextmenu' + }); + menu.uiContainer = getUiContainer(editor); + menu.renderTo(getUiContainer(editor)); + menu.on('hide', function (e) { + if (e.control === this) { + visibleState.set(false); + } + }); + editor.on('remove', function () { + menu.remove(); + menu = null; + }); + return menu; + }; + var show = function (editor, pos, visibleState, menu) { + if (menu.get() === null) { + menu.set(renderMenu(editor, visibleState)); + } else { + menu.get().show(); + } + menu.get().moveTo(pos.x, pos.y); + visibleState.set(true); + }; + var ContextMenu = { show: show }; + + var isNativeOverrideKeyEvent = function (editor, e) { + return e.ctrlKey && !Settings.shouldNeverUseNative(editor); + }; + var setup = function (editor, visibleState, menu) { + editor.on('contextmenu', function (e) { + if (isNativeOverrideKeyEvent(editor, e)) { + return; + } + e.preventDefault(); + ContextMenu.show(editor, Coords.getPos(editor, e), visibleState, menu); + }); + }; + var Bind = { setup: setup }; + + global.add('contextmenu', function (editor) { + var menu = Cell(null), visibleState = Cell(false); + Bind.setup(editor, visibleState, menu); + return Api.get(visibleState); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/contextmenu/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000000..a2e2c7547f --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var o=function(t){var n=t,e=function(){return n};return{get:e,set:function(t){n=t},clone:function(){return o(e())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(t){return{isContextMenuVisible:function(){return t.get()}}},r=function(t){return t.settings.contextmenu_never_use_native},u=function(t){return t.getParam("contextmenu","link openlink image inserttable | cell row column deletetable")},l=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),s=function(t){return l.DOM.select(t.settings.ui_container)[0]},a=function(t,n){return{x:t,y:n}},f=function(t,n,e){return a(t.x+n,t.y+e)},m=function(t,n){if(t&&"static"!==l.DOM.getStyle(t,"position",!0)){var e=l.DOM.getPos(t),o=e.x-t.scrollLeft,i=e.y-t.scrollTop;return f(n,-o,-i)}return f(n,0,0)},c=function(t,n){if(t.inline)return m(s(t),a((u=n).pageX,u.pageY));var e,o,i,r,u,c=(e=t.getContentAreaContainer(),o=a((r=n).clientX,r.clientY),i=l.DOM.getPos(e),f(o,i.x,i.y));return m(s(t),c)},g=tinymce.util.Tools.resolve("tinymce.ui.Factory"),v=tinymce.util.Tools.resolve("tinymce.util.Tools"),y=function(t,n,e,o){null===o.get()?o.set(function(e,n){var t,o,i=[];o=u(e),v.each(o.split(/[ ,]/),function(t){var n=e.menuItems[t];"|"===t&&(n={text:t}),n&&(n.shortcut="",i.push(n))});for(var r=0;r'; + }); + emoticonsHtml += ''; + }); + emoticonsHtml += ''; + return emoticonsHtml; + }; + var PanelHtml = { getHtml: getHtml }; + + var insertEmoticon = function (editor, src, alt) { + editor.insertContent(editor.dom.createHTML('img', { + src: src, + alt: alt + })); + }; + var register = function (editor, pluginUrl) { + var panelHtml = PanelHtml.getHtml(pluginUrl); + editor.addButton('emoticons', { + type: 'panelbutton', + panel: { + role: 'application', + autohide: true, + html: panelHtml, + onclick: function (e) { + var linkElm = editor.dom.getParent(e.target, 'a'); + if (linkElm) { + insertEmoticon(editor, linkElm.getAttribute('data-mce-url'), linkElm.getAttribute('data-mce-alt')); + this.hide(); + } + } + }, + tooltip: 'Emoticons' + }); + }; + var Buttons = { register: register }; + + global.add('emoticons', function (editor, pluginUrl) { + Buttons.register(editor, pluginUrl); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/emoticons/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000000..4e3cd251ab --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]],i=function(i){var o;return o='',e.each(n,function(t){o+="",e.each(t,function(t){var e=i+"/img/smiley-"+t+".gif";o+=''}),o+=""}),o+="
        "},o=function(a,t){var e=i(t);a.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:e,onclick:function(t){var e,i,o,n=a.dom.getParent(t.target,"a");n&&(e=a,i=n.getAttribute("data-mce-url"),o=n.getAttribute("data-mce-alt"),e.insertContent(e.dom.createHTML("img",{src:i,alt:o})),this.hide())}},tooltip:"Emoticons"})};t.add("emoticons",function(t,e){o(t,e)})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullpage/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullpage/plugin.js new file mode 100644 index 0000000000..0bd4a04fbd --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullpage/plugin.js @@ -0,0 +1,519 @@ +(function () { +var fullpage = (function () { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); + + var shouldHideInSourceView = function (editor) { + return editor.getParam('fullpage_hide_in_source_view'); + }; + var getDefaultXmlPi = function (editor) { + return editor.getParam('fullpage_default_xml_pi'); + }; + var getDefaultEncoding = function (editor) { + return editor.getParam('fullpage_default_encoding'); + }; + var getDefaultFontFamily = function (editor) { + return editor.getParam('fullpage_default_font_family'); + }; + var getDefaultFontSize = function (editor) { + return editor.getParam('fullpage_default_font_size'); + }; + var getDefaultTextColor = function (editor) { + return editor.getParam('fullpage_default_text_color'); + }; + var getDefaultTitle = function (editor) { + return editor.getParam('fullpage_default_title'); + }; + var getDefaultDocType = function (editor) { + return editor.getParam('fullpage_default_doctype', ''); + }; + var Settings = { + shouldHideInSourceView: shouldHideInSourceView, + getDefaultXmlPi: getDefaultXmlPi, + getDefaultEncoding: getDefaultEncoding, + getDefaultFontFamily: getDefaultFontFamily, + getDefaultFontSize: getDefaultFontSize, + getDefaultTextColor: getDefaultTextColor, + getDefaultTitle: getDefaultTitle, + getDefaultDocType: getDefaultDocType + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = Settings.getDefaultFontFamily(editor); + data.fontsize = Settings.getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headerFragment, headElement, html, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + html = global$4({ + validate: false, + indent: true, + apply_source_formatting: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + var Parser = { + parseHeader: parseHeader, + htmlToData: htmlToData, + dataToHtml: dataToHtml + }; + + var open = function (editor, headState) { + var data = Parser.htmlToData(editor, headState.get()); + editor.windowManager.open({ + title: 'Document properties', + data: data, + defaults: { + type: 'textbox', + size: 40 + }, + body: [ + { + name: 'title', + label: 'Title' + }, + { + name: 'keywords', + label: 'Keywords' + }, + { + name: 'description', + label: 'Description' + }, + { + name: 'robots', + label: 'Robots' + }, + { + name: 'author', + label: 'Author' + }, + { + name: 'docencoding', + label: 'Encoding' + } + ], + onSubmit: function (e) { + var headHtml = Parser.dataToHtml(editor, global$1.extend(data, e.data), headState.get()); + headState.set(headHtml); + } + }); + }; + var Dialog = { open: open }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + Dialog.open(editor, headState); + }); + }; + var Commands = { register: register }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + var Protect = { + protectHtml: protectHtml, + unprotectHtml: unprotectHtml + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, headerFragment, styles = ''; + var dom = editor.dom; + var elm; + if (evt.selection) { + return; + } + content = Protect.protectHtml(editor.settings.protect, evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && Settings.shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + headerFragment = Parser.parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + dom.setAttribs(editor.getBody(), { + style: elm.attr('style') || '', + dir: elm.attr('dir') || '', + vLink: elm.attr('vlink') || '', + link: elm.attr('link') || '', + aLink: elm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + dom.add(headElm, 'style', { id: 'fullpage_styles' }, styles); + elm = dom.get('fullpage_styles'); + if (elm.styleSheet) { + elm.styleSheet.cssText = styles; + } + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + 'href': href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (Settings.getDefaultXmlPi(editor)) { + var piEncoding = Settings.getDefaultEncoding(editor); + header += '\n'; + } + header += Settings.getDefaultDocType(editor); + header += '\n\n\n'; + if (value = Settings.getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = Settings.getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = Settings.getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = Settings.getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = Settings.getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (!evt.selection && (!evt.source_view || !Settings.shouldHideInSourceView(editor))) { + evt.content = Protect.unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + var FilterContent = { setup: setup }; + + var register$1 = function (editor) { + editor.addButton('fullpage', { + title: 'Document properties', + cmd: 'mceFullPageProperties' + }); + editor.addMenuItem('fullpage', { + text: 'Document properties', + cmd: 'mceFullPageProperties', + context: 'file' + }); + }; + var Buttons = { register: register$1 }; + + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + Commands.register(editor, headState); + Buttons.register(editor); + FilterContent.setup(editor, headState, footState); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullpage/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 0000000000..de5221a8e0 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var l=function(e){var t=e,n=function(){return t};return{get:n,set:function(e){t=e},clone:function(){return l(n())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=tinymce.util.Tools.resolve("tinymce.html.DomParser"),f=tinymce.util.Tools.resolve("tinymce.html.Node"),m=tinymce.util.Tools.resolve("tinymce.html.Serializer"),h=function(e){return e.getParam("fullpage_hide_in_source_view")},r=function(e){return e.getParam("fullpage_default_xml_pi")},o=function(e){return e.getParam("fullpage_default_encoding")},a=function(e){return e.getParam("fullpage_default_font_family")},c=function(e){return e.getParam("fullpage_default_font_size")},s=function(e){return e.getParam("fullpage_default_text_color")},u=function(e){return e.getParam("fullpage_default_title")},d=function(e){return e.getParam("fullpage_default_doctype","")},p=function(e){return t({validate:!1,root_name:"#document"}).parse(e)},y=p,v=function(e,t){var n,l,i=p(t),r={};function o(e,t){return e.attr(t)||""}return r.fontface=a(e),r.fontsize=c(e),7===(n=i.firstChild).type&&(r.xml_pi=!0,(l=/encoding="([^"]+)"/.exec(n.value))&&(r.docencoding=l[1])),(n=i.getAll("#doctype")[0])&&(r.doctype=""),(n=i.getAll("title")[0])&&n.firstChild&&(r.title=n.firstChild.value),g.each(i.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?r[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(r.docencoding=t[1])}),(n=i.getAll("html")[0])&&(r.langcode=o(n,"lang")||o(n,"xml:lang")),r.stylesheets=[],g.each(i.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&r.stylesheets.push(e.attr("href"))}),(n=i.getAll("body")[0])&&(r.langdir=o(n,"dir"),r.style=o(n,"style"),r.visited_color=o(n,"vlink"),r.link_color=o(n,"link"),r.active_color=o(n,"alink")),r},_=function(e,r,t){var o,n,l,a,i,c=e.dom;function s(e,t,n){e.attr(t,n||undefined)}function u(e){n.firstChild?n.insert(e,n.firstChild):n.append(e)}o=p(t),(n=o.getAll("head")[0])||(a=o.getAll("html")[0],n=new f("head",1),a.firstChild?a.insert(n,a.firstChild,!0):a.append(n)),a=o.firstChild,r.xml_pi?(i='version="1.0"',r.docencoding&&(i+=' encoding="'+r.docencoding+'"'),7!==a.type&&(a=new f("xml",7),o.insert(a,o.firstChild,!0)),a.value=i):a&&7===a.type&&a.remove(),a=o.getAll("#doctype")[0],r.doctype?(a||(a=new f("#doctype",10),r.xml_pi?o.insert(a,o.firstChild):u(a)),a.value=r.doctype.substring(9,r.doctype.length-1)):a&&a.remove(),a=null,g.each(o.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(a=e)}),r.docencoding?(a||((a=new f("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,u(a)),a.attr("content","text/html; charset="+r.docencoding)):a&&a.remove(),a=o.getAll("title")[0],r.title?(a?a.empty():u(a=new f("title",1)),a.append(new f("#text",3)).value=r.title):a&&a.remove(),g.each("keywords,description,author,copyright,robots".split(","),function(e){var t,n,l=o.getAll("meta"),i=r[e];for(t=0;t"))},n=function(n,l){var i=v(n,l.get());n.windowManager.open({title:"Document properties",data:i,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(e){var t=_(n,g.extend(i,e.data),l.get());l.set(t)}})},i=function(e,t){e.addCommand("mceFullPageProperties",function(){n(e,t)})},b=function(e,t){return g.each(e,function(e){t=t.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),t},x=function(e){return e.replace(//g,function(e,t){return unescape(t)})},k=g.each,C=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},A=function(e){var t,n="",l="";if(r(e)){var i=o(e);n+='\n'}return n+=d(e),n+="\n\n\n",(t=u(e))&&(n+=""+t+"\n"),(t=o(e))&&(n+='\n'),(t=a(e))&&(l+="font-family: "+t+";"),(t=c(e))&&(l+="font-size: "+t+";"),(t=s(e))&&(l+="color: "+t+";"),n+="\n\n"},w=function(r,o,a){r.on("BeforeSetContent",function(e){!function(e,t,n,l){var i,r,o,a,c,s="",u=e.dom;if(!(l.selection||(o=b(e.settings.protect,l.content),"raw"===l.format&&t.get()||l.source_view&&h(e)))){0!==o.length||l.source_view||(o=g.trim(t.get())+"\n"+g.trim(o)+"\n"+g.trim(n.get())),-1!==(i=(o=o.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(C(o.substring(0,i+1))),-1===(r=o.indexOf("\n")),a=y(t.get()),k(a.getAll("style"),function(e){e.firstChild&&(s+=e.firstChild.value)}),(c=a.getAll("body")[0])&&u.setAttribs(e.getBody(),{style:c.attr("style")||"",dir:c.attr("dir")||"",vLink:c.attr("vlink")||"",link:c.attr("link")||"",aLink:c.attr("alink")||""}),u.remove("fullpage_styles");var d=e.getDoc().getElementsByTagName("head")[0];s&&(u.add(d,"style",{id:"fullpage_styles"},s),(c=u.get("fullpage_styles")).styleSheet&&(c.styleSheet.cssText=s));var f={};g.each(d.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(f[e.href]=e)}),g.each(a.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;f[t]||"stylesheet"!==e.attr("rel")||u.add(d,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete f[t]}),g.each(f,function(e){e.parentNode.removeChild(e)})}}(r,o,a,e)}),r.on("GetContent",function(e){var t,n,l,i;t=r,n=o.get(),l=a.get(),(i=e).selection||i.source_view&&h(t)||(i.content=x(g.trim(n)+"\n"+g.trim(i.content)+"\n"+g.trim(l)))})},P=function(e){e.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),e.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"})};e.add("fullpage",function(e){var t=l(""),n=l("");i(e,t),P(e),w(e,t,n)})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullscreen/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 0000000000..1c5c00ea20 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,177 @@ +(function () { +var fullscreen = (function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + var Api = { get: get }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + var Events = { fireFullscreenStateChanged: fireFullscreenStateChanged }; + + var DOM = global$1.DOM; + var getWindowSize = function () { + var w; + var h; + var win = domGlobals.window; + var doc = domGlobals.document; + var body = doc.body; + if (body.offsetWidth) { + w = body.offsetWidth; + h = body.offsetHeight; + } + if (win.innerWidth && win.innerHeight) { + w = win.innerWidth; + h = win.innerHeight; + } + return { + w: w, + h: h + }; + }; + var getScrollPos = function () { + var vp = DOM.getViewPort(); + return { + x: vp.x, + y: vp.y + }; + }; + var setScrollPos = function (pos) { + domGlobals.window.scrollTo(pos.x, pos.y); + }; + var toggleFullscreen = function (editor, fullscreenState) { + var body = domGlobals.document.body; + var documentElement = domGlobals.document.documentElement; + var editorContainerStyle; + var editorContainer, iframe, iframeStyle; + var fullscreenInfo = fullscreenState.get(); + var resize = function () { + DOM.setStyle(iframe, 'height', getWindowSize().h - (editorContainer.clientHeight - iframe.clientHeight)); + }; + var removeResize = function () { + DOM.unbind(domGlobals.window, 'resize', resize); + }; + editorContainer = editor.getContainer(); + editorContainerStyle = editorContainer.style; + iframe = editor.getContentAreaContainer().firstChild; + iframeStyle = iframe.style; + if (!fullscreenInfo) { + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height, + resizeHandler: resize, + removeHandler: removeResize + }; + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + DOM.addClass(body, 'mce-fullscreen'); + DOM.addClass(documentElement, 'mce-fullscreen'); + DOM.addClass(editorContainer, 'mce-fullscreen'); + DOM.bind(domGlobals.window, 'resize', resize); + editor.on('remove', removeResize); + resize(); + fullscreenState.set(newFullScreenInfo); + Events.fireFullscreenStateChanged(editor, true); + } else { + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + if (fullscreenInfo.containerWidth) { + editorContainerStyle.width = fullscreenInfo.containerWidth; + } + if (fullscreenInfo.containerHeight) { + editorContainerStyle.height = fullscreenInfo.containerHeight; + } + DOM.removeClass(body, 'mce-fullscreen'); + DOM.removeClass(documentElement, 'mce-fullscreen'); + DOM.removeClass(editorContainer, 'mce-fullscreen'); + setScrollPos(fullscreenInfo.scrollPos); + DOM.unbind(domGlobals.window, 'resize', fullscreenInfo.resizeHandler); + editor.off('remove', fullscreenInfo.removeHandler); + fullscreenState.set(null); + Events.fireFullscreenStateChanged(editor, false); + } + }; + var Actions = { toggleFullscreen: toggleFullscreen }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + Actions.toggleFullscreen(editor, fullscreenState); + }); + }; + var Commands = { register: register }; + + var postRender = function (editor) { + return function (e) { + var ctrl = e.control; + editor.on('FullscreenStateChanged', function (e) { + ctrl.active(e.state); + }); + }; + }; + var register$1 = function (editor) { + editor.addMenuItem('fullscreen', { + text: 'Fullscreen', + shortcut: 'Ctrl+Shift+F', + selectable: true, + cmd: 'mceFullScreen', + onPostRender: postRender(editor), + context: 'view' + }); + editor.addButton('fullscreen', { + active: false, + tooltip: 'Fullscreen', + cmd: 'mceFullScreen', + onPostRender: postRender(editor) + }); + }; + var Buttons = { register: register$1 }; + + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.settings.inline) { + return Api.get(fullscreenState); + } + Commands.register(editor, fullscreenState); + Buttons.register(editor); + editor.addShortcut('Ctrl+Shift+F', '', 'mceFullScreen'); + return Api.get(fullscreenState); + }); + function Plugin () { + } + + return Plugin; + +}(window)); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullscreen/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000000..259afc9a5b --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1 @@ +!function(m){"use strict";var i=function(e){var n=e,t=function(){return n};return{get:t,set:function(e){n=e},clone:function(){return i(t())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e){return{isFullscreen:function(){return null!==e.get()}}},n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),g=function(e,n){e.fire("FullscreenStateChanged",{state:n})},w=n.DOM,r=function(e,n){var t,r,l,i,o,c,s=m.document.body,u=m.document.documentElement,d=n.get(),a=function(){var e,n,t,i;w.setStyle(l,"height",(t=m.window,i=m.document.body,i.offsetWidth&&(e=i.offsetWidth,n=i.offsetHeight),t.innerWidth&&t.innerHeight&&(e=t.innerWidth,n=t.innerHeight),{w:e,h:n}).h-(r.clientHeight-l.clientHeight))},h=function(){w.unbind(m.window,"resize",a)};if(t=(r=e.getContainer()).style,i=(l=e.getContentAreaContainer().firstChild).style,d)i.width=d.iframeWidth,i.height=d.iframeHeight,d.containerWidth&&(t.width=d.containerWidth),d.containerHeight&&(t.height=d.containerHeight),w.removeClass(s,"mce-fullscreen"),w.removeClass(u,"mce-fullscreen"),w.removeClass(r,"mce-fullscreen"),o=d.scrollPos,m.window.scrollTo(o.x,o.y),w.unbind(m.window,"resize",d.resizeHandler),e.off("remove",d.removeHandler),n.set(null),g(e,!1);else{var f={scrollPos:(c=w.getViewPort(),{x:c.x,y:c.y}),containerWidth:t.width,containerHeight:t.height,iframeWidth:i.width,iframeHeight:i.height,resizeHandler:a,removeHandler:h};i.width=i.height="100%",t.width=t.height="",w.addClass(s,"mce-fullscreen"),w.addClass(u,"mce-fullscreen"),w.addClass(r,"mce-fullscreen"),w.bind(m.window,"resize",a),e.on("remove",h),a(),n.set(f),g(e,!0)}},l=function(e,n){e.addCommand("mceFullScreen",function(){r(e,n)})},o=function(t){return function(e){var n=e.control;t.on("FullscreenStateChanged",function(e){n.active(e.state)})}},c=function(e){e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,cmd:"mceFullScreen",onPostRender:o(e),context:"view"}),e.addButton("fullscreen",{active:!1,tooltip:"Fullscreen",cmd:"mceFullScreen",onPostRender:o(e)})};e.add("fullscreen",function(e){var n=i(null);return e.settings.inline||(l(e,n),c(e),e.addShortcut("Ctrl+Shift+F","","mceFullScreen")),t(n)})}(window); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/img/logo.png b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/img/logo.png new file mode 100644 index 0000000000..ebd7eb1424 Binary files /dev/null and b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/img/logo.png differ diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/plugin.js new file mode 100644 index 0000000000..b26f217f8f --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/plugin.js @@ -0,0 +1,659 @@ +(function () { +var help = (function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + var not = function (f) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return !f.apply(null, args); + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var nativeIndexOf = Array.prototype.indexOf; + var rawIndexOf = function (ts, t) { + return nativeIndexOf.call(ts, t); + }; + var contains = function (xs, x) { + return rawIndexOf(xs, x) > -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var meta = global$2.mac ? '\u2318' : 'Ctrl'; + var access = global$2.mac ? 'Ctrl + Alt' : 'Shift + Alt'; + var shortcuts = [ + { + shortcut: meta + ' + B', + action: 'Bold' + }, + { + shortcut: meta + ' + I', + action: 'Italic' + }, + { + shortcut: meta + ' + U', + action: 'Underline' + }, + { + shortcut: meta + ' + A', + action: 'Select all' + }, + { + shortcut: meta + ' + Y or ' + meta + ' + Shift + Z', + action: 'Redo' + }, + { + shortcut: meta + ' + Z', + action: 'Undo' + }, + { + shortcut: access + ' + 1', + action: 'Header 1' + }, + { + shortcut: access + ' + 2', + action: 'Header 2' + }, + { + shortcut: access + ' + 3', + action: 'Header 3' + }, + { + shortcut: access + ' + 4', + action: 'Header 4' + }, + { + shortcut: access + ' + 5', + action: 'Header 5' + }, + { + shortcut: access + ' + 6', + action: 'Header 6' + }, + { + shortcut: access + ' + 7', + action: 'Paragraph' + }, + { + shortcut: access + ' + 8', + action: 'Div' + }, + { + shortcut: access + ' + 9', + action: 'Address' + }, + { + shortcut: 'Alt + F9', + action: 'Focus to menubar' + }, + { + shortcut: 'Alt + F10', + action: 'Focus to toolbar' + }, + { + shortcut: 'Alt + F11', + action: 'Focus to element path' + }, + { + shortcut: 'Ctrl + F9', + action: 'Focus to contextual toolbar' + }, + { + shortcut: meta + ' + K', + action: 'Insert link (if link plugin activated)' + }, + { + shortcut: meta + ' + S', + action: 'Save (if save plugin activated)' + }, + { + shortcut: meta + ' + F', + action: 'Find (if searchreplace plugin activated)' + } + ]; + var KeyboardShortcuts = { shortcuts: shortcuts }; + + var makeTab = function () { + var makeAriaLabel = function (shortcut) { + return 'aria-label="Action: ' + shortcut.action + ', Shortcut: ' + shortcut.shortcut.replace(/Ctrl/g, 'Control') + '"'; + }; + var shortcutLisString = map(KeyboardShortcuts.shortcuts, function (shortcut) { + return '' + '' + global$1.translate(shortcut.action) + '' + '' + shortcut.shortcut + '' + ''; + }).join(''); + return { + title: 'Handy Shortcuts', + type: 'container', + style: 'overflow-y: auto; overflow-x: hidden; max-height: 250px', + items: [{ + type: 'container', + html: '
        ' + '' + '' + '' + '' + '' + shortcutLisString + '
        ' + global$1.translate('Action') + '' + global$1.translate('Shortcut') + '
        ' + '
        ' + }] + }; + }; + var KeyboardShortcutsTab = { makeTab: makeTab }; + + var keys = Object.keys; + + var supplant = function (str, obj) { + var isStringOrNumber = function (a) { + var t = typeof a; + return t === 'string' || t === 'number'; + }; + return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) { + var value = obj[key]; + return isStringOrNumber(value) ? value.toString() : fullMatch; + }); + }; + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'compat3x', + name: '3.x Compatibility' + }, + { + key: 'contextmenu', + name: 'Context Menu' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + } + ]; + var PluginUrls = { urls: urls }; + + var makeLink = curry(supplant, '${name}'); + var maybeUrlize = function (editor, key) { + return find(PluginUrls.urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + return makeLink({ + name: x.name, + url: 'https://www.tinymce.com/docs/plugins/' + x.key + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + return editor.settings.forced_plugins === undefined ? keys$1 : filter(keys$1, not(curry(contains, editor.settings.forced_plugins))); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
      • ' + maybeUrlize(editor, key) + '
      • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + return '

        ' + global$1.translate([ + 'Plugins installed ({0}):', + count + ]) + '

        ' + '
          ' + pluginsString + '
        '; + }; + var installedPlugins = function (editor) { + return { + type: 'container', + html: '
        ' + pluginLister(editor) + '
        ', + flex: 1 + }; + }; + var availablePlugins = function () { + return { + type: 'container', + html: '
        ' + '

        ' + global$1.translate('Premium plugins:') + '

        ' + '
          ' + '
        • PowerPaste
        • ' + '
        • Spell Checker Pro
        • ' + '
        • Accessibility Checker
        • ' + '
        • Advanced Code Editor
        • ' + '
        • Enhanced Media Embed
        • ' + '
        • Link Checker
        • ' + '

        ' + '

        ' + global$1.translate('Learn more...') + '

        ' + '
        ', + flex: 1 + }; + }; + var makeTab$1 = function (editor) { + return { + title: 'Plugins', + type: 'container', + style: 'overflow-y: auto; overflow-x: hidden;', + layout: 'flex', + padding: 10, + spacing: 10, + items: [ + installedPlugins(editor), + availablePlugins() + ] + }; + }; + var PluginsTab = { makeTab: makeTab$1 }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var makeRow = function () { + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + return [ + { + type: 'label', + html: global$1.translate([ + 'You are using {0}', + changeLogLink + ]) + }, + { + type: 'spacer', + flex: 1 + }, + { + text: 'Close', + onclick: function () { + this.parent().parent().close(); + } + } + ]; + }; + var ButtonsRow = { makeRow: makeRow }; + + var open = function (editor, pluginUrl) { + return function () { + editor.windowManager.open({ + title: 'Help', + bodyType: 'tabpanel', + layout: 'flex', + body: [ + KeyboardShortcutsTab.makeTab(), + PluginsTab.makeTab(editor) + ], + buttons: ButtonsRow.makeRow(), + onPostRender: function () { + var title = this.getEl('title'); + title.innerHTML = 'TinyMCE Logo'; + } + }); + }; + }; + var Dialog = { open: open }; + + var register = function (editor, pluginUrl) { + editor.addCommand('mceHelp', Dialog.open(editor, pluginUrl)); + }; + var Commands = { register: register }; + + var register$1 = function (editor, pluginUrl) { + editor.addButton('help', { + icon: 'help', + onclick: Dialog.open(editor, pluginUrl) + }); + editor.addMenuItem('help', { + text: 'Help', + icon: 'help', + context: 'help', + onclick: Dialog.open(editor, pluginUrl) + }); + }; + var Buttons = { register: register$1 }; + + global.add('help', function (editor, pluginUrl) { + Buttons.register(editor, pluginUrl); + Commands.register(editor, pluginUrl); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/plugin.min.js new file mode 100644 index 0000000000..67cde482ab --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/help/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(){},a=function(e){return function(){return e}};function l(r){for(var o=[],e=1;e'+v.translate(e.action)+""+e.shortcut+"";var t}).join("");return{title:"Handy Shortcuts",type:"container",style:"overflow-y: auto; overflow-x: hidden; max-height: 250px",items:[{type:"container",html:'
        "+e+"
        '+v.translate("Action")+""+v.translate("Shortcut")+"
        "}]}},S=Object.keys,O=[{key:"advlist",name:"Advanced List"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"bbcode",name:"BBCode"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"compat3x",name:"3.x Compatibility"},{key:"contextmenu",name:"Context Menu"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullpage",name:"Full Page"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"hr",name:"Horizontal Rule"},{key:"image",name:"Image"},{key:"imagetools",name:"Image Tools"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"legacyoutput",name:"Legacy Output"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"noneditable",name:"Noneditable"},{key:"pagebreak",name:"Page Break"},{key:"paste",name:"Paste"},{key:"preview",name:"Preview"},{key:"print",name:"Print"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"spellchecker",name:"Spell Checker"},{key:"tabfocus",name:"Tab Focus"},{key:"table",name:"Table"},{key:"template",name:"Template"},{key:"textcolor",name:"Text Color"},{key:"textpattern",name:"Text Pattern"},{key:"toc",name:"Table of Contents"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"}],T=l(function(e,o){return e.replace(/\$\{([^{}]*)\}/g,function(e,t){var n,r=o[t];return"string"==(n=typeof r)||"number"===n?r.toString():e})},'${name}'),P=function(t,n){return function(e,t){for(var n=0,r=e.length;n"+P(t,e)+""}),i=a.length,c=a.join("");return"

        "+v.translate(["Plugins installed ({0}):",i])+"

          "+c+"
        "},H=function(e){return{title:"Plugins",type:"container",style:"overflow-y: auto; overflow-x: hidden;",layout:"flex",padding:10,spacing:10,items:[(t=e,{type:"container",html:'
        '+_(t)+"
        ",flex:1}),{type:"container",html:'

        '+v.translate("Premium plugins:")+'

        • PowerPaste
        • Spell Checker Pro
        • Accessibility Checker
        • Advanced Code Editor
        • Enhanced Media Embed
        • Link Checker

        '+v.translate("Learn more...")+"

        ",flex:1}]};var t},F=tinymce.util.Tools.resolve("tinymce.EditorManager"),M=function(){var e,t,n='TinyMCE '+(e=F.majorVersion,t=F.minorVersion,0===e.indexOf("@")?"X.X.X":e+"."+t)+"";return[{type:"label",html:v.translate(["You are using {0}",n])},{type:"spacer",flex:1},{text:"Close",onclick:function(){this.parent().parent().close()}}]},E=function(e,t){return function(){e.windowManager.open({title:"Help",bodyType:"tabpanel",layout:"flex",body:[w(),H(e)],buttons:M(),onPostRender:function(){this.getEl("title").innerHTML='TinyMCE Logo'}})}},I=function(e,t){e.addCommand("mceHelp",E(e,t))},j=function(e,t){e.addButton("help",{icon:"help",onclick:E(e,t)}),e.addMenuItem("help",{text:"Help",icon:"help",context:"help",onclick:E(e,t)})};e.add("help",function(e,t){j(e,t),I(e,t),e.shortcuts.add("Alt+0","Open help dialog","mceHelp")})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/hr/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/hr/plugin.js new file mode 100644 index 0000000000..56f9d08ca3 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/hr/plugin.js @@ -0,0 +1,39 @@ +(function () { +var hr = (function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var register = function (editor) { + editor.addCommand('InsertHorizontalRule', function () { + editor.execCommand('mceInsertContent', false, '
        '); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.addButton('hr', { + icon: 'hr', + tooltip: 'Horizontal line', + cmd: 'InsertHorizontalRule' + }); + editor.addMenuItem('hr', { + icon: 'hr', + text: 'Horizontal line', + cmd: 'InsertHorizontalRule', + context: 'insert' + }); + }; + var Buttons = { register: register$1 }; + + global.add('hr', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/hr/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 0000000000..72bc2cabd1 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"
        ")})},o=function(n){n.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),n.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})};n.add("hr",function(n){t(n),o(n)})}(); \ No newline at end of file diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/image/plugin.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/image/plugin.js new file mode 100644 index 0000000000..62ccc9da78 --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/image/plugin.js @@ -0,0 +1,1209 @@ +(function () { +var image = (function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var hasDimensions = function (editor) { + return editor.settings.image_dimensions === false ? false : true; + }; + var hasAdvTab = function (editor) { + return editor.settings.image_advtab === true ? true : false; + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', ''); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.settings.image_description === false ? false : true; + }; + var hasImageTitle = function (editor) { + return editor.settings.image_title === true ? true : false; + }; + var hasImageCaption = function (editor) { + return editor.settings.image_caption === true ? true : false; + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return editor.getParam('images_upload_url', false); + }; + var hasUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', false); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials'); + }; + var Settings = { + hasDimensions: hasDimensions, + hasAdvTab: hasAdvTab, + getPrependUrl: getPrependUrl, + getClassList: getClassList, + hasDescription: hasDescription, + hasImageTitle: hasImageTitle, + hasImageCaption: hasImageCaption, + getImageList: getImageList, + hasUploadUrl: hasUploadUrl, + hasUploadHandler: hasUploadHandler, + getUploadUrl: getUploadUrl, + getUploadHandler: getUploadHandler, + getUploadBasePath: getUploadBasePath, + getUploadCredentials: getUploadCredentials + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var path = function (parts, scope) { + var o = scope !== undefined && scope !== null ? scope : Global; + for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { + o = o[parts[i]]; + } + return o; + }; + var resolve = function (p, scope) { + var parts = p.split('.'); + return path(parts, scope); + }; + + var unsafe = function (name, scope) { + return resolve(name, scope); + }; + var getOrDie = function (name, scope) { + var actual = unsafe(name, scope); + if (actual === undefined || actual === null) { + throw new Error(name + ' not available on this browser'); + } + return actual; + }; + var Global$1 = { getOrDie: getOrDie }; + + function FileReader () { + var f = Global$1.getOrDie('FileReader'); + return new f(); + } + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url, callback) { + var img = domGlobals.document.createElement('img'); + function done(width, height) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback({ + width: width, + height: height + }); + } + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + done(width, height); + }; + img.onerror = function () { + done(0, 0); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + domGlobals.document.body.appendChild(img); + img.src = url; + }; + var buildListItems = function (inputList, itemCallback, startItems) { + function appendItems(values, output) { + output = output || []; + global$2.each(values, function (item) { + var menuItem = { text: item.text || item.title }; + if (item.menu) { + menuItem.menu = appendItems(item.menu); + } else { + menuItem.value = item.value; + itemCallback(menuItem); + } + output.push(menuItem); + }); + return output; + } + return appendItems(inputList, startItems || []); + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = css.margin.split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = Settings.getImageList(editor); + if (typeof imageList === 'string') { + global$3.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + function selectImage() { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + } + imgElm.onload = function () { + if (!data.width && !data.height && Settings.hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: imgElm.clientWidth, + height: imgElm.clientHeight + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$1(function (resolve, reject) { + var reader = FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var Utils = { + getImageSize: getImageSize, + buildListItems: buildListItems, + removePixelSuffix: removePixelSuffix, + addPixelSuffix: addPixelSuffix, + mergeMargins: mergeMargins, + createImageList: createImageList, + waitLoadImage: waitLoadImage, + blobToDataUri: blobToDataUri + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var DOM = global$4.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return Utils.removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return Utils.removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return Utils.removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var setAttrib = function (image, name, value) { + image.setAttribute(name, value); + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: true }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = Utils.addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + setAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return Utils.removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '' + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + setAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + write(normalizeCss, merge(data, { caption: false }), image); + setAttrib(image, 'alt', data.alt); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: true }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAttrib(image, 'alt'), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle') + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', setAttrib); + updateProp(image, oldData, newData, 'alt', setAttrib); + updateProp(image, oldData, newData, 'title', setAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', setAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return setAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = Utils.mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || imgElm.getAttribute('data-mce-object') || imgElm.getAttribute('data-mce-placeholder'))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + Utils.waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, data) { + var image = getSelectedImage(editor); + if (image) { + if (data.src) { + writeImageDataToSelection(editor, data); + } else { + deleteImage(editor, image); + } + } else if (data.src) { + insertImageAtCaret(editor, data); + } + }; + + var updateVSpaceHSpaceBorder = function (editor) { + return function (evt) { + var dom = editor.dom; + var rootControl = evt.control.rootControl; + if (!Settings.hasAdvTab(editor)) { + return; + } + var data = rootControl.toJSON(); + var css = dom.parseStyle(data.style); + rootControl.find('#vspace').value(''); + rootControl.find('#hspace').value(''); + css = Utils.mergeMargins(css); + if (css['margin-top'] && css['margin-bottom'] || css['margin-right'] && css['margin-left']) { + if (css['margin-top'] === css['margin-bottom']) { + rootControl.find('#vspace').value(Utils.removePixelSuffix(css['margin-top'])); + } else { + rootControl.find('#vspace').value(''); + } + if (css['margin-right'] === css['margin-left']) { + rootControl.find('#hspace').value(Utils.removePixelSuffix(css['margin-right'])); + } else { + rootControl.find('#hspace').value(''); + } + } + if (css['border-width']) { + rootControl.find('#border').value(Utils.removePixelSuffix(css['border-width'])); + } else { + rootControl.find('#border').value(''); + } + if (css['border-style']) { + rootControl.find('#borderStyle').value(css['border-style']); + } else { + rootControl.find('#borderStyle').value(''); + } + rootControl.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); + }; + }; + var updateStyle = function (editor, win) { + win.find('#style').each(function (ctrl) { + var value = getStyleValue(function (css) { + return normalizeCss(editor, css); + }, merge(defaultData(), win.toJSON())); + ctrl.value(value); + }); + }; + var makeTab = function (editor) { + return { + title: 'Advanced', + type: 'form', + pack: 'start', + items: [ + { + label: 'Style', + name: 'style', + type: 'textbox', + onchange: updateVSpaceHSpaceBorder(editor) + }, + { + type: 'form', + layout: 'grid', + packV: 'start', + columns: 2, + padding: 0, + defaults: { + type: 'textbox', + maxWidth: 50, + onchange: function (evt) { + updateStyle(editor, evt.control.rootControl); + } + }, + items: [ + { + label: 'Vertical space', + name: 'vspace' + }, + { + label: 'Border width', + name: 'border' + }, + { + label: 'Horizontal space', + name: 'hspace' + }, + { + label: 'Border style', + type: 'listbox', + name: 'borderStyle', + width: 90, + maxWidth: 90, + onselect: function (evt) { + updateStyle(editor, evt.control.rootControl); + }, + values: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var doSyncSize = function (widthCtrl, heightCtrl) { + widthCtrl.state.set('oldVal', widthCtrl.value()); + heightCtrl.state.set('oldVal', heightCtrl.value()); + }; + var doSizeControls = function (win, f) { + var widthCtrl = win.find('#width')[0]; + var heightCtrl = win.find('#height')[0]; + var constrained = win.find('#constrain')[0]; + if (widthCtrl && heightCtrl && constrained) { + f(widthCtrl, heightCtrl, constrained.checked()); + } + }; + var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) { + var oldWidth = widthCtrl.state.get('oldVal'); + var oldHeight = heightCtrl.state.get('oldVal'); + var newWidth = widthCtrl.value(); + var newHeight = heightCtrl.value(); + if (isContrained && oldWidth && oldHeight && newWidth && newHeight) { + if (newWidth !== oldWidth) { + newHeight = Math.round(newWidth / oldWidth * newHeight); + if (!isNaN(newHeight)) { + heightCtrl.value(newHeight); + } + } else { + newWidth = Math.round(newHeight / oldHeight * newWidth); + if (!isNaN(newWidth)) { + widthCtrl.value(newWidth); + } + } + } + doSyncSize(widthCtrl, heightCtrl); + }; + var syncSize = function (win) { + doSizeControls(win, doSyncSize); + }; + var updateSize = function (win) { + doSizeControls(win, doUpdateSize); + }; + var createUi = function () { + var recalcSize = function (evt) { + updateSize(evt.control.rootControl); + }; + return { + type: 'container', + label: 'Dimensions', + layout: 'flex', + align: 'center', + spacing: 5, + items: [ + { + name: 'width', + type: 'textbox', + maxLength: 5, + size: 5, + onchange: recalcSize, + ariaLabel: 'Width' + }, + { + type: 'label', + text: 'x' + }, + { + name: 'height', + type: 'textbox', + maxLength: 5, + size: 5, + onchange: recalcSize, + ariaLabel: 'Height' + }, + { + name: 'constrain', + type: 'checkbox', + checked: true, + text: 'Constrain proportions' + } + ] + }; + }; + var SizeManager = { + createUi: createUi, + syncSize: syncSize, + updateSize: updateSize + }; + + var onSrcChange = function (evt, editor) { + var srcURL, prependURL, absoluteURLPattern; + var meta = evt.meta || {}; + var control = evt.control; + var rootControl = control.rootControl; + var imageListCtrl = rootControl.find('#image-list')[0]; + if (imageListCtrl) { + imageListCtrl.value(editor.convertURL(control.value(), 'src')); + } + global$2.each(meta, function (value, key) { + rootControl.find('#' + key).value(value); + }); + if (!meta.width && !meta.height) { + srcURL = editor.convertURL(control.value(), 'src'); + prependURL = Settings.getPrependUrl(editor); + absoluteURLPattern = new RegExp('^(?:[a-z]+:)?//', 'i'); + if (prependURL && !absoluteURLPattern.test(srcURL) && srcURL.substring(0, prependURL.length) !== prependURL) { + srcURL = prependURL + srcURL; + } + control.value(srcURL); + Utils.getImageSize(editor.documentBaseURI.toAbsolute(control.value()), function (data) { + if (data.width && data.height && Settings.hasDimensions(editor)) { + rootControl.find('#width').value(data.width); + rootControl.find('#height').value(data.height); + SizeManager.syncSize(rootControl); + } + }); + } + }; + var onBeforeCall = function (evt) { + evt.meta = evt.control.rootControl.toJSON(); + }; + var getGeneralItems = function (editor, imageListCtrl) { + var generalFormItems = [ + { + name: 'src', + type: 'filepicker', + filetype: 'image', + label: 'Source', + autofocus: true, + onchange: function (evt) { + onSrcChange(evt, editor); + }, + onbeforecall: onBeforeCall + }, + imageListCtrl + ]; + if (Settings.hasDescription(editor)) { + generalFormItems.push({ + name: 'alt', + type: 'textbox', + label: 'Image description' + }); + } + if (Settings.hasImageTitle(editor)) { + generalFormItems.push({ + name: 'title', + type: 'textbox', + label: 'Image Title' + }); + } + if (Settings.hasDimensions(editor)) { + generalFormItems.push(SizeManager.createUi()); + } + if (Settings.getClassList(editor)) { + generalFormItems.push({ + name: 'class', + type: 'listbox', + label: 'Class', + values: Utils.buildListItems(Settings.getClassList(editor), function (item) { + if (item.value) { + item.textStyle = function () { + return editor.formatter.getCssText({ + inline: 'img', + classes: [item.value] + }); + }; + } + }) + }); + } + if (Settings.hasImageCaption(editor)) { + generalFormItems.push({ + name: 'caption', + type: 'checkbox', + label: 'Caption' + }); + } + return generalFormItems; + }; + var makeTab$1 = function (editor, imageListCtrl) { + return { + title: 'General', + type: 'form', + items: getGeneralItems(editor, imageListCtrl) + }; + }; + var MainTab = { + makeTab: makeTab$1, + getGeneralItems: getGeneralItems + }; + + var url = function () { + return Global$1.getOrDie('URL'); + }; + var createObjectURL = function (blob) { + return url().createObjectURL(blob); + }; + var revokeObjectURL = function (u) { + url().revokeObjectURL(u); + }; + var URL = { + createObjectURL: createObjectURL, + revokeObjectURL: revokeObjectURL + }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.ui.Factory'); + + function XMLHttpRequest () { + var f = Global$1.getOrDie('XMLHttpRequest'); + return new f(); + } + + var noop = function () { + }; + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr, formData; + xhr = XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + var json; + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + formData = new domGlobals.FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$1(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$1.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$2.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var onFileInput = function (editor) { + return function (evt) { + var Throbber = global$5.get('Throbber'); + var rootControl = evt.control.rootControl; + var throbber = new Throbber(rootControl.getEl()); + var file = evt.control.value(); + var blobUri = URL.createObjectURL(file); + var uploader = Uploader({ + url: Settings.getUploadUrl(editor), + basePath: Settings.getUploadBasePath(editor), + credentials: Settings.getUploadCredentials(editor), + handler: Settings.getUploadHandler(editor) + }); + var finalize = function () { + throbber.hide(); + URL.revokeObjectURL(blobUri); + }; + throbber.show(); + return Utils.blobToDataUri(file).then(function (dataUrl) { + var blobInfo = editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + base64: dataUrl.split(',')[1] + }); + return uploader.upload(blobInfo).then(function (url) { + var src = rootControl.find('#src'); + src.value(url); + rootControl.find('tabpanel')[0].activateTab(0); + src.fire('change'); + finalize(); + return url; + }); + }).catch(function (err) { + editor.windowManager.alert(err); + finalize(); + }); + }; + }; + var acceptExts = '.jpg,.jpeg,.png,.gif'; + var makeTab$2 = function (editor) { + return { + title: 'Upload', + type: 'form', + layout: 'flex', + direction: 'column', + align: 'stretch', + padding: '20 20 20 20', + items: [ + { + type: 'container', + layout: 'flex', + direction: 'column', + align: 'center', + spacing: 10, + items: [ + { + text: 'Browse for an image', + type: 'browsebutton', + accept: acceptExts, + onchange: onFileInput(editor) + }, + { + text: 'OR', + type: 'label' + } + ] + }, + { + text: 'Drop an image here', + type: 'dropzone', + accept: acceptExts, + height: 100, + onchange: onFileInput(editor) + } + ] + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + + var submitForm = function (editor, evt) { + var win = evt.control.getRoot(); + SizeManager.updateSize(win); + editor.undoManager.transact(function () { + var data = merge(readImageDataFromSelection(editor), win.toJSON()); + insertOrUpdateImage(editor, data); + }); + editor.editorUpload.uploadImagesAuto(); + }; + function Dialog (editor) { + function showDialog(imageList) { + var data = readImageDataFromSelection(editor); + var win, imageListCtrl; + if (imageList) { + imageListCtrl = { + type: 'listbox', + label: 'Image list', + name: 'image-list', + values: Utils.buildListItems(imageList, function (item) { + item.value = editor.convertURL(item.value || item.url, 'src'); + }, [{ + text: 'None', + value: '' + }]), + value: data.src && editor.convertURL(data.src, 'src'), + onselect: function (e) { + var altCtrl = win.find('#alt'); + if (!altCtrl.value() || e.lastControl && altCtrl.value() === e.lastControl.text()) { + altCtrl.value(e.control.text()); + } + win.find('#src').value(e.control.value()).fire('change'); + }, + onPostRender: function () { + imageListCtrl = this; + } + }; + } + if (Settings.hasAdvTab(editor) || Settings.hasUploadUrl(editor) || Settings.hasUploadHandler(editor)) { + var body = [MainTab.makeTab(editor, imageListCtrl)]; + if (Settings.hasAdvTab(editor)) { + body.push(AdvTab.makeTab(editor)); + } + if (Settings.hasUploadUrl(editor) || Settings.hasUploadHandler(editor)) { + body.push(UploadTab.makeTab(editor)); + } + win = editor.windowManager.open({ + title: 'Insert/edit image', + data: data, + bodyType: 'tabpanel', + body: body, + onSubmit: curry(submitForm, editor) + }); + } else { + win = editor.windowManager.open({ + title: 'Insert/edit image', + data: data, + body: MainTab.getGeneralItems(editor, imageListCtrl), + onSubmit: curry(submitForm, editor) + }); + } + SizeManager.syncSize(win); + } + function open() { + Utils.createImageList(editor, showDialog); + } + return { open: open }; + } + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).open); + }; + var Commands = { register: register }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length, node; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$2.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('preInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + var FilterContent = { setup: setup }; + + var register$1 = function (editor) { + editor.addButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onclick: Dialog(editor).open, + stateSelector: 'img:not([data-mce-object],[data-mce-placeholder]),figure.image' + }); + editor.addMenuItem('image', { + icon: 'image', + text: 'Image', + onclick: Dialog(editor).open, + context: 'insert', + prependToContext: true + }); + }; + var Buttons = { register: register$1 }; + + global.add('image', function (editor) { + FilterContent.setup(editor); + Buttons.register(editor); + Commands.register(editor); + }); + function Plugin () { + } + + return Plugin; + +}(window)); +})(); diff --git a/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/image/plugin.min.js b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000000..23473aa76d --- /dev/null +++ b/web-framework-commons/src/main/webapp/modules/editors/tinymce/plugins/image/plugin.min.js @@ -0,0 +1 @@ +!function(l){"use strict";var i,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=function(e){return!1!==e.settings.image_dimensions},u=function(e){return!0===e.settings.image_advtab},m=function(e){return e.getParam("image_prepend_url","")},n=function(e){return e.getParam("image_class_list")},r=function(e){return!1!==e.settings.image_description},a=function(e){return!0===e.settings.image_title},o=function(e){return!0===e.settings.image_caption},c=function(e){return e.getParam("image_list",!1)},s=function(e){return e.getParam("images_upload_url",!1)},g=function(e){return e.getParam("images_upload_handler",!1)},f=function(e){return e.getParam("images_upload_url")},p=function(e){return e.getParam("images_upload_handler")},h=function(e){return e.getParam("images_upload_base_path")},v=function(e){return e.getParam("images_upload_credentials")},b="undefined"!=typeof l.window?l.window:Function("return this;")(),y=function(e,t){return function(e,t){for(var n=t!==undefined&&null!==t?t:b,r=0;r max) { + parsedValue = max; + } else if (parsedValue < min) { + parsedValue = min; + } + return parsedValue; + } + function identity() { + return [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]; + } + var DELTA_INDEX = [ + 0, + 0.01, + 0.02, + 0.04, + 0.05, + 0.06, + 0.07, + 0.08, + 0.1, + 0.11, + 0.12, + 0.14, + 0.15, + 0.16, + 0.17, + 0.18, + 0.2, + 0.21, + 0.22, + 0.24, + 0.25, + 0.27, + 0.28, + 0.3, + 0.32, + 0.34, + 0.36, + 0.38, + 0.4, + 0.42, + 0.44, + 0.46, + 0.48, + 0.5, + 0.53, + 0.56, + 0.59, + 0.62, + 0.65, + 0.68, + 0.71, + 0.74, + 0.77, + 0.8, + 0.83, + 0.86, + 0.89, + 0.92, + 0.95, + 0.98, + 1, + 1.06, + 1.12, + 1.18, + 1.24, + 1.3, + 1.36, + 1.42, + 1.48, + 1.54, + 1.6, + 1.66, + 1.72, + 1.78, + 1.84, + 1.9, + 1.96, + 2, + 2.12, + 2.25, + 2.37, + 2.5, + 2.62, + 2.75, + 2.87, + 3, + 3.2, + 3.4, + 3.6, + 3.8, + 4, + 4.3, + 4.7, + 4.9, + 5, + 5.5, + 6, + 6.5, + 6.8, + 7, + 7.3, + 7.5, + 7.8, + 8, + 8.4, + 8.7, + 9, + 9.4, + 9.6, + 9.8, + 10 + ]; + function multiply(matrix1, matrix2) { + var col = []; + var out = new Array(25); + var val; + for (var i = 0; i < 5; i++) { + for (var j = 0; j < 5; j++) { + col[j] = matrix2[j + i * 5]; + } + for (var j = 0; j < 5; j++) { + val = 0; + for (var k = 0; k < 5; k++) { + val += matrix1[j + k * 5] * col[k]; + } + out[j + i * 5] = val; + } + } + return out; + } + function adjust(matrix, adjustValue) { + adjustValue = clamp(adjustValue, 0, 1); + return matrix.map(function (value, index) { + if (index % 6 === 0) { + value = 1 - (1 - value) * adjustValue; + } else { + value *= adjustValue; + } + return clamp(value, 0, 1); + }); + } + function adjustContrast(matrix, value) { + var x; + value = clamp(value, -1, 1); + value *= 100; + if (value < 0) { + x = 127 + value / 100 * 127; + } else { + x = value % 1; + if (x === 0) { + x = DELTA_INDEX[value]; + } else { + x = DELTA_INDEX[Math.floor(value)] * (1 - x) + DELTA_INDEX[Math.floor(value) + 1] * x; + } + x = x * 127 + 127; + } + return multiply(matrix, [ + x / 127, + 0, + 0, + 0, + 0.5 * (127 - x), + 0, + x / 127, + 0, + 0, + 0.5 * (127 - x), + 0, + 0, + x / 127, + 0, + 0.5 * (127 - x), + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + } + function adjustSaturation(matrix, value) { + value = clamp(value, -1, 1); + var x = 1 + (value > 0 ? 3 * value : value); + var lumR = 0.3086; + var lumG = 0.6094; + var lumB = 0.082; + return multiply(matrix, [ + lumR * (1 - x) + x, + lumG * (1 - x), + lumB * (1 - x), + 0, + 0, + lumR * (1 - x), + lumG * (1 - x) + x, + lumB * (1 - x), + 0, + 0, + lumR * (1 - x), + lumG * (1 - x), + lumB * (1 - x) + x, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + } + function adjustHue(matrix, angle) { + angle = clamp(angle, -180, 180) / 180 * Math.PI; + var cosVal = Math.cos(angle); + var sinVal = Math.sin(angle); + var lumR = 0.213; + var lumG = 0.715; + var lumB = 0.072; + return multiply(matrix, [ + lumR + cosVal * (1 - lumR) + sinVal * -lumR, + lumG + cosVal * -lumG + sinVal * -lumG, + lumB + cosVal * -lumB + sinVal * (1 - lumB), + 0, + 0, + lumR + cosVal * -lumR + sinVal * 0.143, + lumG + cosVal * (1 - lumG) + sinVal * 0.14, + lumB + cosVal * -lumB + sinVal * -0.283, + 0, + 0, + lumR + cosVal * -lumR + sinVal * -(1 - lumR), + lumG + cosVal * -lumG + sinVal * lumG, + lumB + cosVal * (1 - lumB) + sinVal * lumB, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + } + function adjustBrightness(matrix, value) { + value = clamp(255 * value, -255, 255); + return multiply(matrix, [ + 1, + 0, + 0, + 0, + value, + 0, + 1, + 0, + 0, + value, + 0, + 0, + 1, + 0, + value, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + } + function adjustColors(matrix, adjustR, adjustG, adjustB) { + adjustR = clamp(adjustR, 0, 2); + adjustG = clamp(adjustG, 0, 2); + adjustB = clamp(adjustB, 0, 2); + return multiply(matrix, [ + adjustR, + 0, + 0, + 0, + 0, + 0, + adjustG, + 0, + 0, + 0, + 0, + 0, + adjustB, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + } + function adjustSepia(matrix, value) { + value = clamp(value, 0, 1); + return multiply(matrix, adjust([ + 0.393, + 0.769, + 0.189, + 0, + 0, + 0.349, + 0.686, + 0.168, + 0, + 0, + 0.272, + 0.534, + 0.131, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], value)); + } + function adjustGrayscale(matrix, value) { + value = clamp(value, 0, 1); + return multiply(matrix, adjust([ + 0.33, + 0.34, + 0.33, + 0, + 0, + 0.33, + 0.34, + 0.33, + 0, + 0, + 0.33, + 0.34, + 0.33, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], value)); + } + + function colorFilter(ir, matrix) { + return ir.toCanvas().then(function (canvas) { + return applyColorFilter(canvas, ir.getType(), matrix); + }); + } + function applyColorFilter(canvas, type, matrix) { + var context = get2dContext(canvas); + function applyMatrix(pixelsData, m) { + var r, g, b, a; + var data = pixelsData.data, m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5], m6 = m[6], m7 = m[7], m8 = m[8], m9 = m[9], m10 = m[10], m11 = m[11], m12 = m[12], m13 = m[13], m14 = m[14], m15 = m[15], m16 = m[16], m17 = m[17], m18 = m[18], m19 = m[19]; + for (var i = 0; i < data.length; i += 4) { + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + a = data[i + 3]; + data[i] = r * m0 + g * m1 + b * m2 + a * m3 + m4; + data[i + 1] = r * m5 + g * m6 + b * m7 + a * m8 + m9; + data[i + 2] = r * m10 + g * m11 + b * m12 + a * m13 + m14; + data[i + 3] = r * m15 + g * m16 + b * m17 + a * m18 + m19; + } + return pixelsData; + } + var pixels = applyMatrix(context.getImageData(0, 0, canvas.width, canvas.height), matrix); + context.putImageData(pixels, 0, 0); + return fromCanvas(canvas, type); + } + function convoluteFilter(ir, matrix) { + return ir.toCanvas().then(function (canvas) { + return applyConvoluteFilter(canvas, ir.getType(), matrix); + }); + } + function applyConvoluteFilter(canvas, type, matrix) { + var context = get2dContext(canvas); + function applyMatrix(pIn, pOut, aMatrix) { + function clamp(value, min, max) { + if (value > max) { + value = max; + } else if (value < min) { + value = min; + } + return value; + } + var side = Math.round(Math.sqrt(aMatrix.length)); + var halfSide = Math.floor(side / 2); + var rgba = pIn.data; + var drgba = pOut.data; + var w = pIn.width; + var h = pIn.height; + for (var y = 0; y < h; y++) { + for (var x = 0; x < w; x++) { + var r = 0; + var g = 0; + var b = 0; + for (var cy = 0; cy < side; cy++) { + for (var cx = 0; cx < side; cx++) { + var scx = clamp(x + cx - halfSide, 0, w - 1); + var scy = clamp(y + cy - halfSide, 0, h - 1); + var innerOffset = (scy * w + scx) * 4; + var wt = aMatrix[cy * side + cx]; + r += rgba[innerOffset] * wt; + g += rgba[innerOffset + 1] * wt; + b += rgba[innerOffset + 2] * wt; + } + } + var offset = (y * w + x) * 4; + drgba[offset] = clamp(r, 0, 255); + drgba[offset + 1] = clamp(g, 0, 255); + drgba[offset + 2] = clamp(b, 0, 255); + } + } + return pOut; + } + var pixelsIn = context.getImageData(0, 0, canvas.width, canvas.height); + var pixelsOut = context.getImageData(0, 0, canvas.width, canvas.height); + pixelsOut = applyMatrix(pixelsIn, pixelsOut, matrix); + context.putImageData(pixelsOut, 0, 0); + return fromCanvas(canvas, type); + } + function functionColorFilter(colorFn) { + var filterImpl = function (canvas, type, value) { + var context = get2dContext(canvas); + var lookup = new Array(256); + function applyLookup(pixelsData, lookupData) { + var data = pixelsData.data; + for (var i = 0; i < data.length; i += 4) { + data[i] = lookupData[data[i]]; + data[i + 1] = lookupData[data[i + 1]]; + data[i + 2] = lookupData[data[i + 2]]; + } + return pixelsData; + } + for (var i = 0; i < lookup.length; i++) { + lookup[i] = colorFn(i, value); + } + var pixels = applyLookup(context.getImageData(0, 0, canvas.width, canvas.height), lookup); + context.putImageData(pixels, 0, 0); + return fromCanvas(canvas, type); + }; + return function (ir, value) { + return ir.toCanvas().then(function (canvas) { + return filterImpl(canvas, ir.getType(), value); + }); + }; + } + function complexAdjustableColorFilter(matrixAdjustFn) { + return function (ir, adjust) { + return colorFilter(ir, matrixAdjustFn(identity(), adjust)); + }; + } + function basicColorFilter(matrix) { + return function (ir) { + return colorFilter(ir, matrix); + }; + } + function basicConvolutionFilter(kernel) { + return function (ir) { + return convoluteFilter(ir, kernel); + }; + } + var invert = basicColorFilter([ + -1, + 0, + 0, + 0, + 255, + 0, + -1, + 0, + 0, + 255, + 0, + 0, + -1, + 0, + 255, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + var brightness = complexAdjustableColorFilter(adjustBrightness); + var hue = complexAdjustableColorFilter(adjustHue); + var saturate = complexAdjustableColorFilter(adjustSaturation); + var contrast = complexAdjustableColorFilter(adjustContrast); + var grayscale = complexAdjustableColorFilter(adjustGrayscale); + var sepia = complexAdjustableColorFilter(adjustSepia); + var colorize = function (ir, adjustR, adjustG, adjustB) { + return colorFilter(ir, adjustColors(identity(), adjustR, adjustG, adjustB)); + }; + var sharpen = basicConvolutionFilter([ + 0, + -1, + 0, + -1, + 5, + -1, + 0, + -1, + 0 + ]); + var emboss = basicConvolutionFilter([ + -2, + -1, + 0, + -1, + 1, + 1, + 0, + 1, + 2 + ]); + var gamma = functionColorFilter(function (color, value) { + return Math.pow(color / 255, 1 - value) * 255; + }); + var exposure = functionColorFilter(function (color, value) { + return 255 * (1 - Math.exp(-(color / 255) * value)); + }); + + function scale(image, dW, dH) { + var sW = getWidth(image); + var sH = getHeight(image); + var wRatio = dW / sW; + var hRatio = dH / sH; + var scaleCapped = false; + if (wRatio < 0.5 || wRatio > 2) { + wRatio = wRatio < 0.5 ? 0.5 : 2; + scaleCapped = true; + } + if (hRatio < 0.5 || hRatio > 2) { + hRatio = hRatio < 0.5 ? 0.5 : 2; + scaleCapped = true; + } + var scaled = _scale(image, wRatio, hRatio); + return !scaleCapped ? scaled : scaled.then(function (tCanvas) { + return scale(tCanvas, dW, dH); + }); + } + function _scale(image, wRatio, hRatio) { + return new Promise(function (resolve) { + var sW = getWidth(image); + var sH = getHeight(image); + var dW = Math.floor(sW * wRatio); + var dH = Math.floor(sH * hRatio); + var canvas = create(dW, dH); + var context = get2dContext(canvas); + context.drawImage(image, 0, 0, sW, sH, 0, 0, dW, dH); + resolve(canvas); + }); + } + + function rotate(ir, angle) { + return ir.toCanvas().then(function (canvas) { + return applyRotate(canvas, ir.getType(), angle); + }); + } + function applyRotate(image, type, angle) { + var canvas = create(image.width, image.height); + var context = get2dContext(canvas); + var translateX = 0; + var translateY = 0; + angle = angle < 0 ? 360 + angle : angle; + if (angle === 90 || angle === 270) { + resize(canvas, canvas.height, canvas.width); + } + if (angle === 90 || angle === 180) { + translateX = canvas.width; + } + if (angle === 270 || angle === 180) { + translateY = canvas.height; + } + context.translate(translateX, translateY); + context.rotate(angle * Math.PI / 180); + context.drawImage(image, 0, 0); + return fromCanvas(canvas, type); + } + function flip(ir, axis) { + return ir.toCanvas().then(function (canvas) { + return applyFlip(canvas, ir.getType(), axis); + }); + } + function applyFlip(image, type, axis) { + var canvas = create(image.width, image.height); + var context = get2dContext(canvas); + if (axis === 'v') { + context.scale(1, -1); + context.drawImage(image, 0, -canvas.height); + } else { + context.scale(-1, 1); + context.drawImage(image, -canvas.width, 0); + } + return fromCanvas(canvas, type); + } + function crop(ir, x, y, w, h) { + return ir.toCanvas().then(function (canvas) { + return applyCrop(canvas, ir.getType(), x, y, w, h); + }); + } + function applyCrop(image, type, x, y, w, h) { + var canvas = create(w, h); + var context = get2dContext(canvas); + context.drawImage(image, -x, -y); + return fromCanvas(canvas, type); + } + function resize$1(ir, w, h) { + return ir.toCanvas().then(function (canvas) { + return scale(canvas, w, h).then(function (newCanvas) { + return fromCanvas(newCanvas, ir.getType()); + }); + }); + } + + var invert$1 = function (ir) { + return invert(ir); + }; + var sharpen$1 = function (ir) { + return sharpen(ir); + }; + var emboss$1 = function (ir) { + return emboss(ir); + }; + var gamma$1 = function (ir, value) { + return gamma(ir, value); + }; + var exposure$1 = function (ir, value) { + return exposure(ir, value); + }; + var colorize$1 = function (ir, adjustR, adjustG, adjustB) { + return colorize(ir, adjustR, adjustG, adjustB); + }; + var brightness$1 = function (ir, adjust) { + return brightness(ir, adjust); + }; + var hue$1 = function (ir, adjust) { + return hue(ir, adjust); + }; + var saturate$1 = function (ir, adjust) { + return saturate(ir, adjust); + }; + var contrast$1 = function (ir, adjust) { + return contrast(ir, adjust); + }; + var grayscale$1 = function (ir, adjust) { + return grayscale(ir, adjust); + }; + var sepia$1 = function (ir, adjust) { + return sepia(ir, adjust); + }; + var flip$1 = function (ir, axis) { + return flip(ir, axis); + }; + var crop$1 = function (ir, x, y, w, h) { + return crop(ir, x, y, w, h); + }; + var resize$2 = function (ir, w, h) { + return resize$1(ir, w, h); + }; + var rotate$1 = function (ir, angle) { + return rotate(ir, angle); + }; + + var blobToImageResult = function (blob) { + return fromBlob(blob); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var path = function (parts, scope) { + var o = scope !== undefined && scope !== null ? scope : Global; + for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { + o = o[parts[i]]; + } + return o; + }; + var resolve = function (p, scope) { + var parts = p.split('.'); + return path(parts, scope); + }; + + var unsafe = function (name, scope) { + return resolve(name, scope); + }; + var getOrDie = function (name, scope) { + var actual = unsafe(name, scope); + if (actual === undefined || actual === null) { + throw new Error(name + ' not available on this browser'); + } + return actual; + }; + var Global$1 = { getOrDie: getOrDie }; + + var url = function () { + return Global$1.getOrDie('URL'); + }; + var createObjectURL = function (blob) { + return url().createObjectURL(blob); + }; + var revokeObjectURL = function (u) { + url().revokeObjectURL(u); + }; + var URL = { + createObjectURL: createObjectURL, + revokeObjectURL: revokeObjectURL + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI'); + + var getToolbarItems = function (editor) { + return editor.getParam('imagetools_toolbar', 'rotateleft rotateright | flipv fliph | crop editimage imageoptions'); + }; + var getProxyUrl = function (editor) { + return editor.getParam('imagetools_proxy'); + }; + var getCorsHosts = function (editor) { + return editor.getParam('imagetools_cors_hosts', [], 'string[]'); + }; + var getCredentialsHosts = function (editor) { + return editor.getParam('imagetools_credentials_hosts', [], 'string[]'); + }; + var getApiKey = function (editor) { + return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string'); + }; + var getUploadTimeout = function (editor) { + return editor.getParam('images_upload_timeout', 30000, 'number'); + }; + var shouldReuseFilename = function (editor) { + return editor.getParam('images_reuse_filename', false, 'boolean'); + }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$6 = tinymce.util.Tools.resolve('tinymce.ui.Factory'); + + function UndoStack () { + var data = []; + var index = -1; + function add(state) { + var removed; + removed = data.splice(++index); + data.push(state); + return { + state: state, + removed: removed + }; + } + function undo() { + if (canUndo()) { + return data[--index]; + } + } + function redo() { + if (canRedo()) { + return data[++index]; + } + } + function canUndo() { + return index > 0; + } + function canRedo() { + return index !== -1 && index < data.length - 1; + } + return { + data: data, + add: add, + undo: undo, + redo: redo, + canUndo: canUndo, + canRedo: canRedo + }; + } + + var global$7 = tinymce.util.Tools.resolve('tinymce.geom.Rect'); + + var loadImage = function (image) { + return new global$3(function (resolve) { + var loaded = function () { + image.removeEventListener('load', loaded); + resolve(image); + }; + if (image.complete) { + resolve(image); + } else { + image.addEventListener('load', loaded); + } + }); + }; + var LoadImage = { loadImage: loadImage }; + + var global$8 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var global$9 = tinymce.util.Tools.resolve('tinymce.util.Observable'); + + var global$a = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var count = 0; + function CropRect (currentRect, viewPortRect, clampRect, containerElm, action) { + var instance; + var handles; + var dragHelpers; + var blockers; + var prefix = 'mce-'; + var id = prefix + 'crid-' + count++; + handles = [ + { + name: 'move', + xMul: 0, + yMul: 0, + deltaX: 1, + deltaY: 1, + deltaW: 0, + deltaH: 0, + label: 'Crop Mask' + }, + { + name: 'nw', + xMul: 0, + yMul: 0, + deltaX: 1, + deltaY: 1, + deltaW: -1, + deltaH: -1, + label: 'Top Left Crop Handle' + }, + { + name: 'ne', + xMul: 1, + yMul: 0, + deltaX: 0, + deltaY: 1, + deltaW: 1, + deltaH: -1, + label: 'Top Right Crop Handle' + }, + { + name: 'sw', + xMul: 0, + yMul: 1, + deltaX: 1, + deltaY: 0, + deltaW: -1, + deltaH: 1, + label: 'Bottom Left Crop Handle' + }, + { + name: 'se', + xMul: 1, + yMul: 1, + deltaX: 0, + deltaY: 0, + deltaW: 1, + deltaH: 1, + label: 'Bottom Right Crop Handle' + } + ]; + blockers = [ + 'top', + 'right', + 'bottom', + 'left' + ]; + function getAbsoluteRect(outerRect, relativeRect) { + return { + x: relativeRect.x + outerRect.x, + y: relativeRect.y + outerRect.y, + w: relativeRect.w, + h: relativeRect.h + }; + } + function getRelativeRect(outerRect, innerRect) { + return { + x: innerRect.x - outerRect.x, + y: innerRect.y - outerRect.y, + w: innerRect.w, + h: innerRect.h + }; + } + function getInnerRect() { + return getRelativeRect(clampRect, currentRect); + } + function moveRect(handle, startRect, deltaX, deltaY) { + var x, y, w, h, rect; + x = startRect.x; + y = startRect.y; + w = startRect.w; + h = startRect.h; + x += deltaX * handle.deltaX; + y += deltaY * handle.deltaY; + w += deltaX * handle.deltaW; + h += deltaY * handle.deltaH; + if (w < 20) { + w = 20; + } + if (h < 20) { + h = 20; + } + rect = currentRect = global$7.clamp({ + x: x, + y: y, + w: w, + h: h + }, clampRect, handle.name === 'move'); + rect = getRelativeRect(clampRect, rect); + instance.fire('updateRect', { rect: rect }); + setInnerRect(rect); + } + function render() { + function createDragHelper(handle) { + var startRect; + var DragHelper = global$6.get('DragHelper'); + return new DragHelper(id, { + document: containerElm.ownerDocument, + handle: id + '-' + handle.name, + start: function () { + startRect = currentRect; + }, + drag: function (e) { + moveRect(handle, startRect, e.deltaX, e.deltaY); + } + }); + } + global$8('
        ').appendTo(containerElm); + global$1.each(blockers, function (blocker) { + global$8('#' + id, containerElm).append('